pax_global_header00006660000000000000000000000064133410224200014501gustar00rootroot0000000000000052 comment=c4284cc64d41171318e0eb1b391aabb266add184 python-grpc-tools-1.14.1/000077500000000000000000000000001334102242000151755ustar00rootroot00000000000000python-grpc-tools-1.14.1/MANIFEST.in000066400000000000000000000002201334102242000167250ustar00rootroot00000000000000include grpc_version.py include protoc_deps.py include protoc_lib_deps.py include README.rst graft grpc_tools graft grpc_root graft third_party python-grpc-tools-1.14.1/PKG-INFO000066400000000000000000000013131334102242000162700ustar00rootroot00000000000000Metadata-Version: 1.1 Name: grpcio-tools Version: 1.14.1 Summary: Protobuf code generator for gRPC Home-page: https://grpc.io Author: The gRPC Authors Author-email: grpc-io@googlegroups.com License: Apache License 2.0 Description: UNKNOWN Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: License :: OSI Approved :: Apache Software License python-grpc-tools-1.14.1/README.rst000066400000000000000000000123521334102242000166670ustar00rootroot00000000000000gRPC Python Tools ================= Package for gRPC Python tools. Installation ------------ The gRPC Python tools package is available for Linux, Mac OS X, and Windows running Python 2.7. From PyPI ~~~~~~~~~ If you are installing locally... :: $ pip install grpcio-tools Else system wide (on Ubuntu)... :: $ sudo pip install grpcio-tools If you're on Windows make sure that you installed the :code:`pip.exe` component when you installed Python (if not go back and install it!) then invoke: :: $ pip.exe install grpcio-tools Windows users may need to invoke :code:`pip.exe` from a command line ran as administrator. n.b. On Windows and on Mac OS X one *must* have a recent release of :code:`pip` to retrieve the proper wheel from PyPI. Be sure to upgrade to the latest version! You might also need to install Cython to handle installation via the source distribution if gRPC Python's system coverage with wheels does not happen to include your system. From Source ~~~~~~~~~~~ Building from source requires that you have the Python headers (usually a package named :code:`python-dev`) and Cython installed. It further requires a GCC-like compiler to go smoothly; you can probably get it to work without GCC-like stuff, but you may end up having a bad time. :: $ export REPO_ROOT=grpc # REPO_ROOT can be any directory of your choice $ git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc $REPO_ROOT $ cd $REPO_ROOT $ git submodule update --init $ cd tools/distrib/python/grpcio_tools $ python ../make_grpcio_tools.py # For the next command do `sudo pip install` if you get permission-denied errors $ GRPC_PYTHON_BUILD_WITH_CYTHON=1 pip install . You cannot currently install Python from source on Windows. Things might work out for you in MSYS2 (follow the Linux instructions), but it isn't officially supported at the moment. Troubleshooting ~~~~~~~~~~~~~~~ Help, I ... * **... see a** :code:`pkg_resources.VersionConflict` **when I try to install grpc** This is likely because :code:`pip` doesn't own the offending dependency, which in turn is likely because your operating system's package manager owns it. You'll need to force the installation of the dependency: :code:`pip install --ignore-installed $OFFENDING_DEPENDENCY` For example, if you get an error like the following: :: Traceback (most recent call last): File "", line 17, in ... File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 509, in find raise VersionConflict(dist, req) pkg_resources.VersionConflict: (six 1.8.0 (/usr/lib/python2.7/dist-packages), Requirement.parse('six>=1.10')) You can fix it by doing: :: sudo pip install --ignore-installed six * **... see compiler errors on some platforms when either installing from source or from the source distribution** If you see :: /tmp/pip-build-U8pSsr/cython/Cython/Plex/Scanners.c:4:20: fatal error: Python.h: No such file or directory #include "Python.h" ^ compilation terminated. You can fix it by installing `python-dev` package. i.e :: sudo apt-get install python-dev If you see something similar to: :: third_party/protobuf/src/google/protobuf/stubs/mathlimits.h:173:31: note: in expansion of macro 'SIGNED_INT_MAX' static const Type kPosMax = SIGNED_INT_MAX(Type); \\ ^ And your toolchain is GCC (at the time of this writing, up through at least GCC 6.0), this is probably a bug where GCC chokes on constant expressions when the :code:`-fwrapv` flag is specified. You should consider setting your environment with :code:`CFLAGS=-fno-wrapv` or using clang (:code:`CC=clang`). Usage ----- Given protobuf include directories :code:`$INCLUDE`, an output directory :code:`$OUTPUT`, and proto files :code:`$PROTO_FILES`, invoke as: :: $ python -m grpc.tools.protoc -I$INCLUDE --python_out=$OUTPUT --grpc_python_out=$OUTPUT $PROTO_FILES To use as a build step in distutils-based projects, you may use the provided command class in your :code:`setup.py`: :: setuptools.setup( # ... cmdclass={ 'build_proto_modules': grpc.tools.command.BuildPackageProtos, } # ... ) Invocation of the command will walk the project tree and transpile every :code:`.proto` file into a :code:`_pb2.py` file in the same directory. Note that this particular approach requires :code:`grpcio-tools` to be installed on the machine before the setup script is invoked (i.e. no combination of :code:`setup_requires` or :code:`install_requires` will provide access to :code:`grpc.tools.command.BuildPackageProtos` if it isn't already installed). One way to work around this can be found in our :code:`grpcio-health-checking` `package `_: :: class BuildPackageProtos(setuptools.Command): """Command to generate project *_pb2.py modules from proto files.""" # ... def run(self): from grpc.tools import command command.build_package_protos(self.distribution.package_dir['']) Now including :code:`grpcio-tools` in :code:`setup_requires` will provide the command on-setup as desired. For more information on command classes, consult :code:`distutils` and :code:`setuptools` documentation. python-grpc-tools-1.14.1/grpc_root/000077500000000000000000000000001334102242000171735ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/000077500000000000000000000000001334102242000206165ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc++/000077500000000000000000000000001334102242000216775ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc++/alarm.h000066400000000000000000000015571334102242000231540ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_ALARM_H #define GRPCXX_ALARM_H #include #endif // GRPCXX_ALARM_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/channel.h000066400000000000000000000015671334102242000234710ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_CHANNEL_H #define GRPCXX_CHANNEL_H #include #endif // GRPCXX_CHANNEL_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/client_context.h000066400000000000000000000016231334102242000250740ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_CLIENT_CONTEXT_H #define GRPCXX_CLIENT_CONTEXT_H #include #endif // GRPCXX_CLIENT_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/completion_queue.h000066400000000000000000000016331334102242000254300ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_COMPLETION_QUEUE_H #define GRPCXX_COMPLETION_QUEUE_H #include #endif // GRPCXX_COMPLETION_QUEUE_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/create_channel.h000066400000000000000000000016231334102242000250050ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_CREATE_CHANNEL_H #define GRPCXX_CREATE_CHANNEL_H #include #endif // GRPCXX_CREATE_CHANNEL_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/create_channel_posix.h000066400000000000000000000016531334102242000262320ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_CREATE_CHANNEL_POSIX_H #define GRPCXX_CREATE_CHANNEL_POSIX_H #include #endif // GRPCXX_CREATE_CHANNEL_POSIX_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/ext/000077500000000000000000000000001334102242000224775ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc++/ext/health_check_service_server_builder_option.h000066400000000000000000000020231334102242000334530ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H #define GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H #include #endif // GRPCXX_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/ext/proto_server_reflection_plugin.h000066400000000000000000000017431334102242000311760ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H #define GRPCXX_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H #include #endif // GRPCXX_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/generic/000077500000000000000000000000001334102242000233135ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc++/generic/async_generic_service.h000066400000000000000000000017171334102242000300230ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H #define GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H #include #endif // GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/generic/generic_stub.h000066400000000000000000000016531334102242000261420ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_GENERIC_GENERIC_STUB_H #define GRPCXX_GENERIC_GENERIC_STUB_H #include #endif // GRPCXX_GENERIC_GENERIC_STUB_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/grpc++.h000066400000000000000000000015631334102242000231360ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_GRPCXX_H #define GRPCXX_GRPCXX_H #include #endif // GRPCXX_GRPCXX_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/health_check_service_interface.h000066400000000000000000000017231334102242000302150ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H #define GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H #include #endif // GRPCXX_HEALTH_CHECK_SERVICE_INTERFACE_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/000077500000000000000000000000001334102242000226405ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/call.h000066400000000000000000000015771334102242000237360ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CALL_H #define GRPCXX_IMPL_CALL_H #include #endif // GRPCXX_IMPL_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/channel_argument_option.h000066400000000000000000000017131334102242000277150ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CHANNEL_ARGUMENT_OPTION_H #define GRPCXX_IMPL_CHANNEL_ARGUMENT_OPTION_H #include #endif // GRPCXX_IMPL_CHANNEL_ARGUMENT_OPTION_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/client_unary_call.h000066400000000000000000000016631334102242000265060ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CLIENT_UNARY_CALL_H #define GRPCXX_IMPL_CLIENT_UNARY_CALL_H #include #endif // GRPCXX_IMPL_CLIENT_UNARY_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/000077500000000000000000000000001334102242000242445ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/async_stream.h000066400000000000000000000016771334102242000271200ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H #define GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H #include #endif // GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/async_unary_call.h000066400000000000000000000017171334102242000277510ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_ASYNC_UNARY_CALL_H #define GRPCXX_IMPL_CODEGEN_ASYNC_UNARY_CALL_H #include #endif // GRPCXX_IMPL_CODEGEN_ASYNC_UNARY_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/byte_buffer.h000066400000000000000000000016731334102242000267200ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_BYTE_BUFFER_H #define GRPCXX_IMPL_CODEGEN_BYTE_BUFFER_H #include #endif // GRPCXX_IMPL_CODEGEN_BYTE_BUFFER_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/call.h000066400000000000000000000016371334102242000253370ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_CALL_H #define GRPCXX_IMPL_CODEGEN_CALL_H #include #endif // GRPCXX_IMPL_CODEGEN_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/call_hook.h000066400000000000000000000016631334102242000263560ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_CALL_HOOK_H #define GRPCXX_IMPL_CODEGEN_CALL_HOOK_H #include #endif // GRPCXX_IMPL_CODEGEN_CALL_HOOK_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/channel_interface.h000066400000000000000000000017231334102242000300500ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_CHANNEL_INTERFACE_H #define GRPCXX_IMPL_CODEGEN_CHANNEL_INTERFACE_H #include #endif // GRPCXX_IMPL_CODEGEN_CHANNEL_INTERFACE_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/client_context.h000066400000000000000000000017071334102242000274440ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_CLIENT_CONTEXT_H #define GRPCXX_IMPL_CODEGEN_CLIENT_CONTEXT_H #include #endif // GRPCXX_IMPL_CODEGEN_CLIENT_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/client_unary_call.h000066400000000000000000000017231334102242000301070ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_CLIENT_UNARY_CALL_H #define GRPCXX_IMPL_CODEGEN_CLIENT_UNARY_CALL_H #include #endif // GRPCXX_IMPL_CODEGEN_CLIENT_UNARY_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/completion_queue.h000066400000000000000000000017171334102242000300000ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_H #define GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_H #include #endif // GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/completion_queue_tag.h000066400000000000000000000017371334102242000306350ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H #define GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H #include #endif // GRPCXX_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/config.h000066400000000000000000000016471334102242000256720ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_CONFIG_H #define GRPCXX_IMPL_CODEGEN_CONFIG_H #include #endif // GRPCXX_IMPL_CODEGEN_CONFIG_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/config_protobuf.h000066400000000000000000000017131334102242000276040ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H #define GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H #include #endif // GRPCXX_IMPL_CODEGEN_CONFIG_PROTOBUF_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/core_codegen.h000066400000000000000000000016771334102242000270440ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_H #define GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_H #include #endif // GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/core_codegen_interface.h000066400000000000000000000017471334102242000310620ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H #define GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H #include #endif // GRPCXX_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/create_auth_context.h000066400000000000000000000017331334102242000304510ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H #define GRPCXX_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H #include #endif // GRPCXX_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/grpc_library.h000066400000000000000000000016771334102242000271070ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_GRPC_LIBRARY_H #define GRPCXX_IMPL_CODEGEN_GRPC_LIBRARY_H #include #endif // GRPCXX_IMPL_CODEGEN_GRPC_LIBRARY_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/metadata_map.h000066400000000000000000000016771334102242000270450ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_METADATA_MAP_H #define GRPCXX_IMPL_CODEGEN_METADATA_MAP_H #include #endif // GRPCXX_IMPL_CODEGEN_METADATA_MAP_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/method_handler_impl.h000066400000000000000000000017331334102242000304170ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H #define GRPCXX_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H #include #endif // GRPCXX_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/proto_utils.h000066400000000000000000000016731334102242000270070ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H #define GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H #include #endif // GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/rpc_method.h000066400000000000000000000016671334102242000265530ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_RPC_METHOD_H #define GRPCXX_IMPL_CODEGEN_RPC_METHOD_H #include #endif // GRPCXX_IMPL_CODEGEN_RPC_METHOD_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/rpc_service_method.h000066400000000000000000000017271334102242000302700ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_RPC_SERVICE_METHOD_H #define GRPCXX_IMPL_CODEGEN_RPC_SERVICE_METHOD_H #include #endif // GRPCXX_IMPL_CODEGEN_RPC_SERVICE_METHOD_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/security/000077500000000000000000000000001334102242000261135ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/security/auth_context.h000066400000000000000000000017431334102242000307760ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H #define GRPCXX_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H #include #endif // GRPCXX_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/serialization_traits.h000066400000000000000000000017371334102242000306700ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_SERIALIZATION_TRAITS_H #define GRPCXX_IMPL_CODEGEN_SERIALIZATION_TRAITS_H #include #endif // GRPCXX_IMPL_CODEGEN_SERIALIZATION_TRAITS_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/server_context.h000066400000000000000000000017071334102242000274740ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_SERVER_CONTEXT_H #define GRPCXX_IMPL_CODEGEN_SERVER_CONTEXT_H #include #endif // GRPCXX_IMPL_CODEGEN_SERVER_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/server_interface.h000066400000000000000000000017171334102242000277510ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_SERVER_INTERFACE_H #define GRPCXX_IMPL_CODEGEN_SERVER_INTERFACE_H #include #endif // GRPCXX_IMPL_CODEGEN_SERVER_INTERFACE_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/service_type.h000066400000000000000000000016771334102242000271310ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_SERVICE_TYPE_H #define GRPCXX_IMPL_CODEGEN_SERVICE_TYPE_H #include #endif // GRPCXX_IMPL_CODEGEN_SERVICE_TYPE_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/slice.h000066400000000000000000000016431334102242000255200ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_SLICE_H #define GRPCXX_IMPL_CODEGEN_SLICE_H #include #endif // GRPCXX_IMPL_CODEGEN_SLICE_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/status.h000066400000000000000000000016471334102242000257500ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_STATUS_H #define GRPCXX_IMPL_CODEGEN_STATUS_H #include #endif // GRPCXX_IMPL_CODEGEN_STATUS_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/status_code_enum.h000066400000000000000000000017171334102242000277640ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_STATUS_CODE_ENUM_H #define GRPCXX_IMPL_CODEGEN_STATUS_CODE_ENUM_H #include #endif // GRPCXX_IMPL_CODEGEN_STATUS_CODE_ENUM_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/string_ref.h000066400000000000000000000016671334102242000265710ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_STRING_REF_H #define GRPCXX_IMPL_CODEGEN_STRING_REF_H #include #endif // GRPCXX_IMPL_CODEGEN_STRING_REF_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/stub_options.h000066400000000000000000000016771334102242000271600ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_STUB_OPTIONS_H #define GRPCXX_IMPL_CODEGEN_STUB_OPTIONS_H #include #endif // GRPCXX_IMPL_CODEGEN_STUB_OPTIONS_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/sync_stream.h000066400000000000000000000016731334102242000267530ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_SYNC_STREAM_H #define GRPCXX_IMPL_CODEGEN_SYNC_STREAM_H #include #endif // GRPCXX_IMPL_CODEGEN_SYNC_STREAM_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/codegen/time.h000066400000000000000000000016371334102242000253620ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_CODEGEN_TIME_H #define GRPCXX_IMPL_CODEGEN_TIME_H #include #endif // GRPCXX_IMPL_CODEGEN_TIME_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/grpc_library.h000066400000000000000000000016371334102242000254770ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_GRPC_LIBRARY_H #define GRPCXX_IMPL_GRPC_LIBRARY_H #include #endif // GRPCXX_IMPL_GRPC_LIBRARY_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/method_handler_impl.h000066400000000000000000000016731334102242000270160ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_METHOD_HANDLER_IMPL_H #define GRPCXX_IMPL_METHOD_HANDLER_IMPL_H #include #endif // GRPCXX_IMPL_METHOD_HANDLER_IMPL_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/rpc_method.h000066400000000000000000000016271334102242000251430ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_RPC_METHOD_H #define GRPCXX_IMPL_RPC_METHOD_H #include #endif // GRPCXX_IMPL_RPC_METHOD_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/rpc_service_method.h000066400000000000000000000016671334102242000266670ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_RPC_SERVICE_METHOD_H #define GRPCXX_IMPL_RPC_SERVICE_METHOD_H #include #endif // GRPCXX_IMPL_RPC_SERVICE_METHOD_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/serialization_traits.h000066400000000000000000000016771334102242000272670ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_SERIALIZATION_TRAITS_H #define GRPCXX_IMPL_SERIALIZATION_TRAITS_H #include #endif // GRPCXX_IMPL_SERIALIZATION_TRAITS_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/server_builder_option.h000066400000000000000000000017031334102242000274160ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_SERVER_BUILDER_OPTION_H #define GRPCXX_IMPL_SERVER_BUILDER_OPTION_H #include #endif // GRPCXX_IMPL_SERVER_BUILDER_OPTION_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/server_builder_plugin.h000066400000000000000000000017031334102242000274040ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H #define GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H #include #endif // GRPCXX_IMPL_SERVER_BUILDER_PLUGIN_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/server_initializer.h000066400000000000000000000016671334102242000267340ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_SERVER_INITIALIZER_H #define GRPCXX_IMPL_SERVER_INITIALIZER_H #include #endif // GRPCXX_IMPL_SERVER_INITIALIZER_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/service_type.h000066400000000000000000000016371334102242000255210ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_SERVICE_TYPE_H #define GRPCXX_IMPL_SERVICE_TYPE_H #include #endif // GRPCXX_IMPL_SERVICE_TYPE_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/sync_cxx11.h000066400000000000000000000016271334102242000250170ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_SYNC_CXX11_H #define GRPCXX_IMPL_SYNC_CXX11_H #include #endif // GRPCXX_IMPL_SYNC_CXX11_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/impl/sync_no_cxx11.h000066400000000000000000000016431334102242000255110ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_IMPL_SYNC_NO_CXX11_H #define GRPCXX_IMPL_SYNC_NO_CXX11_H #include #endif // GRPCXX_IMPL_SYNC_NO_CXX11_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/resource_quota.h000066400000000000000000000016231334102242000251120ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_RESOURCE_QUOTA_H #define GRPCXX_RESOURCE_QUOTA_H #include #endif // GRPCXX_RESOURCE_QUOTA_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/security/000077500000000000000000000000001334102242000235465ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc++/security/auth_context.h000066400000000000000000000016571334102242000264350ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SECURITY_AUTH_CONTEXT_H #define GRPCXX_SECURITY_AUTH_CONTEXT_H #include #endif // GRPCXX_SECURITY_AUTH_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/security/auth_metadata_processor.h000066400000000000000000000017331334102242000306230ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SECURITY_AUTH_METADATA_PROCESSOR_H #define GRPCXX_SECURITY_AUTH_METADATA_PROCESSOR_H #include #endif // GRPCXX_SECURITY_AUTH_METADATA_PROCESSOR_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/security/credentials.h000066400000000000000000000016531334102242000262210ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SECURITY_CREDENTIALS_H #define GRPCXX_SECURITY_CREDENTIALS_H #include #endif // GRPCXX_SECURITY_CREDENTIALS_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/security/server_credentials.h000066400000000000000000000017071334102242000276070ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SECURITY_SERVER_CREDENTIALS_H #define GRPCXX_SECURITY_SERVER_CREDENTIALS_H #include #endif // GRPCXX_SECURITY_SERVER_CREDENTIALS_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/server.h000066400000000000000000000015631334102242000233630ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SERVER_H #define GRPCXX_SERVER_H #include #endif // GRPCXX_SERVER_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/server_builder.h000066400000000000000000000016231334102242000250660ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SERVER_BUILDER_H #define GRPCXX_SERVER_BUILDER_H #include #endif // GRPCXX_SERVER_BUILDER_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/server_context.h000066400000000000000000000016231334102242000251240ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SERVER_CONTEXT_H #define GRPCXX_SERVER_CONTEXT_H #include #endif // GRPCXX_SERVER_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/server_posix.h000066400000000000000000000016131334102242000246010ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SERVER_POSIX_H #define GRPCXX_SERVER_POSIX_H #include #endif // GRPCXX_SERVER_POSIX_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/000077500000000000000000000000001334102242000234135ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/async_stream.h000066400000000000000000000016531334102242000262610ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_ASYNC_STREAM_H #define GRPCXX_SUPPORT_ASYNC_STREAM_H #include #endif // GRPCXX_SUPPORT_ASYNC_STREAM_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/async_unary_call.h000066400000000000000000000016731334102242000271210ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H #define GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H #include #endif // GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/byte_buffer.h000066400000000000000000000016471334102242000260700ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_BYTE_BUFFER_H #define GRPCXX_SUPPORT_BYTE_BUFFER_H #include #endif // GRPCXX_SUPPORT_BYTE_BUFFER_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/channel_arguments.h000066400000000000000000000016771334102242000272740ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H #define GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H #include #endif // GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/config.h000066400000000000000000000016231334102242000250330ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_CONFIG_H #define GRPCXX_SUPPORT_CONFIG_H #include #endif // GRPCXX_SUPPORT_CONFIG_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/error_details.h000066400000000000000000000016571334102242000264330ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_ERROR_DETAILS_H #define GRPCXX_SUPPORT_ERROR_DETAILS_H #include #endif // GRPCXX_SUPPORT_ERROR_DETAILS_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/slice.h000066400000000000000000000016171334102242000246700ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_SLICE_H #define GRPCXX_SUPPORT_SLICE_H #include #endif // GRPCXX_SUPPORT_SLICE_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/status.h000066400000000000000000000016231334102242000251110ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_STATUS_H #define GRPCXX_SUPPORT_STATUS_H #include #endif // GRPCXX_SUPPORT_STATUS_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/status_code_enum.h000066400000000000000000000016731334102242000271340ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_STATUS_CODE_ENUM_H #define GRPCXX_SUPPORT_STATUS_CODE_ENUM_H #include #endif // GRPCXX_SUPPORT_STATUS_CODE_ENUM_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/string_ref.h000066400000000000000000000016431334102242000257320ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_STRING_REF_H #define GRPCXX_SUPPORT_STRING_REF_H #include #endif // GRPCXX_SUPPORT_STRING_REF_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/stub_options.h000066400000000000000000000016531334102242000263210ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_STUB_OPTIONS_H #define GRPCXX_SUPPORT_STUB_OPTIONS_H #include #endif // GRPCXX_SUPPORT_STUB_OPTIONS_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/sync_stream.h000066400000000000000000000016471334102242000261230ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_SYNC_STREAM_H #define GRPCXX_SUPPORT_SYNC_STREAM_H #include #endif // GRPCXX_SUPPORT_SYNC_STREAM_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/support/time.h000066400000000000000000000016131334102242000245230ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_SUPPORT_TIME_H #define GRPCXX_SUPPORT_TIME_H #include #endif // GRPCXX_SUPPORT_TIME_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/test/000077500000000000000000000000001334102242000226565ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc++/test/mock_stream.h000066400000000000000000000016331334102242000253360ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_TEST_MOCK_STREAM_H #define GRPCXX_TEST_MOCK_STREAM_H #include #endif // GRPCXX_TEST_MOCK_STREAM_H python-grpc-tools-1.14.1/grpc_root/include/grpc++/test/server_context_test_spouse.h000066400000000000000000000017271334102242000305450ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // DEPRECATED: The headers in include/grpc++ are deprecated. Please include the // headers in include/grpcpp instead. This header exists only for backwards // compatibility. #ifndef GRPCXX_TEST_SERVER_CONTEXT_TEST_SPOUSE_H #define GRPCXX_TEST_SERVER_CONTEXT_TEST_SPOUSE_H #include #endif // GRPCXX_TEST_SERVER_CONTEXT_TEST_SPOUSE_H python-grpc-tools-1.14.1/grpc_root/include/grpc/000077500000000000000000000000001334102242000215515ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc/byte_buffer.h000066400000000000000000000014471334102242000242240ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_BYTE_BUFFER_H #define GRPC_BYTE_BUFFER_H #include #include #include #endif /* GRPC_BYTE_BUFFER_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/byte_buffer_reader.h000066400000000000000000000014441334102242000255430ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_BYTE_BUFFER_READER_H #define GRPC_BYTE_BUFFER_READER_H #include #include #endif /* GRPC_BYTE_BUFFER_READER_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/census.h000066400000000000000000000020731334102242000232240ustar00rootroot00000000000000/* * * Copyright 2015-2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_CENSUS_H #define GRPC_CENSUS_H #include #include #ifdef __cplusplus extern "C" { #endif /** A Census Context is a handle used by Census to represent the current tracing and stats collection information. Contexts should be propagated across RPC's (this is the responsibility of the local RPC system). */ typedef struct census_context census_context; #ifdef __cplusplus } #endif #endif /* GRPC_CENSUS_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/compression.h000066400000000000000000000052101334102242000242610ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_COMPRESSION_H #define GRPC_COMPRESSION_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** Return if an algorithm is message compression algorithm. */ GRPCAPI int grpc_compression_algorithm_is_message( grpc_compression_algorithm algorithm); /** Return if an algorithm is stream compression algorithm. */ GRPCAPI int grpc_compression_algorithm_is_stream( grpc_compression_algorithm algorithm); /** Parses the \a slice as a grpc_compression_algorithm instance and updating \a * algorithm. Returns 1 upon success, 0 otherwise. */ GRPCAPI int grpc_compression_algorithm_parse( grpc_slice value, grpc_compression_algorithm* algorithm); /** Updates \a name with the encoding name corresponding to a valid \a * algorithm. Note that \a name is statically allocated and must *not* be freed. * Returns 1 upon success, 0 otherwise. */ GRPCAPI int grpc_compression_algorithm_name( grpc_compression_algorithm algorithm, const char** name); /** Returns the compression algorithm corresponding to \a level for the * compression algorithms encoded in the \a accepted_encodings bitset.*/ GRPCAPI grpc_compression_algorithm grpc_compression_algorithm_for_level( grpc_compression_level level, uint32_t accepted_encodings); GRPCAPI void grpc_compression_options_init(grpc_compression_options* opts); /** Mark \a algorithm as enabled in \a opts. */ GRPCAPI void grpc_compression_options_enable_algorithm( grpc_compression_options* opts, grpc_compression_algorithm algorithm); /** Mark \a algorithm as disabled in \a opts. */ GRPCAPI void grpc_compression_options_disable_algorithm( grpc_compression_options* opts, grpc_compression_algorithm algorithm); /** Returns true if \a algorithm is marked as enabled in \a opts. */ GRPCAPI int grpc_compression_options_is_algorithm_enabled( const grpc_compression_options* opts, grpc_compression_algorithm algorithm); #ifdef __cplusplus } #endif #endif /* GRPC_COMPRESSION_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/fork.h000066400000000000000000000013541334102242000226660ustar00rootroot00000000000000/* * * Copyright 2017 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_FORK_H #define GRPC_FORK_H #include #include #endif /* GRPC_FORK_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/grpc.h000066400000000000000000000507451334102242000226700ustar00rootroot00000000000000/* * * Copyright 2015-2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_GRPC_H #define GRPC_GRPC_H #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /*! \mainpage GRPC Core * * The GRPC Core library is a low-level library designed to be wrapped by higher * level libraries. The top-level API is provided in grpc.h. Security related * functionality lives in grpc_security.h. */ GRPCAPI void grpc_metadata_array_init(grpc_metadata_array* array); GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array* array); GRPCAPI void grpc_call_details_init(grpc_call_details* details); GRPCAPI void grpc_call_details_destroy(grpc_call_details* details); /** Registers a plugin to be initialized and destroyed with the library. The \a init and \a destroy functions will be invoked as part of \a grpc_init() and \a grpc_shutdown(), respectively. Note that these functions can be invoked an arbitrary number of times (and hence so will \a init and \a destroy). It is safe to pass NULL to either argument. Plugins are destroyed in the reverse order they were initialized. */ GRPCAPI void grpc_register_plugin(void (*init)(void), void (*destroy)(void)); /** Initialize the grpc library. It is not safe to call any other grpc functions before calling this. (To avoid overhead, little checking is done, and some things may work. We do not warrant that they will continue to do so in future revisions of this library). */ GRPCAPI void grpc_init(void); /** Shut down the grpc library. No memory is used by grpc after this call returns, nor are any instructions executing within the grpc library. Prior to calling, all application owned grpc objects must have been destroyed. */ GRPCAPI void grpc_shutdown(void); /** Return a string representing the current version of grpc */ GRPCAPI const char* grpc_version_string(void); /** Return a string specifying what the 'g' in gRPC stands for */ GRPCAPI const char* grpc_g_stands_for(void); /** Returns the completion queue factory based on the attributes. MAY return a NULL if no factory can be found */ GRPCAPI const grpc_completion_queue_factory* grpc_completion_queue_factory_lookup( const grpc_completion_queue_attributes* attributes); /** Helper function to create a completion queue with grpc_cq_completion_type of GRPC_CQ_NEXT and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */ GRPCAPI grpc_completion_queue* grpc_completion_queue_create_for_next( void* reserved); /** Helper function to create a completion queue with grpc_cq_completion_type of GRPC_CQ_PLUCK and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */ GRPCAPI grpc_completion_queue* grpc_completion_queue_create_for_pluck( void* reserved); /** Create a completion queue */ GRPCAPI grpc_completion_queue* grpc_completion_queue_create( const grpc_completion_queue_factory* factory, const grpc_completion_queue_attributes* attributes, void* reserved); /** Blocks until an event is available, the completion queue is being shut down, or deadline is reached. Returns a grpc_event with type GRPC_QUEUE_TIMEOUT on timeout, otherwise a grpc_event describing the event that occurred. Callers must not call grpc_completion_queue_next and grpc_completion_queue_pluck simultaneously on the same completion queue. */ GRPCAPI grpc_event grpc_completion_queue_next(grpc_completion_queue* cq, gpr_timespec deadline, void* reserved); /** Blocks until an event with tag 'tag' is available, the completion queue is being shutdown or deadline is reached. Returns a grpc_event with type GRPC_QUEUE_TIMEOUT on timeout, otherwise a grpc_event describing the event that occurred. Callers must not call grpc_completion_queue_next and grpc_completion_queue_pluck simultaneously on the same completion queue. Completion queues support a maximum of GRPC_MAX_COMPLETION_QUEUE_PLUCKERS concurrently executing plucks at any time. */ GRPCAPI grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, void* tag, gpr_timespec deadline, void* reserved); /** Maximum number of outstanding grpc_completion_queue_pluck executions per completion queue */ #define GRPC_MAX_COMPLETION_QUEUE_PLUCKERS 6 /** Begin destruction of a completion queue. Once all possible events are drained then grpc_completion_queue_next will start to produce GRPC_QUEUE_SHUTDOWN events only. At that point it's safe to call grpc_completion_queue_destroy. After calling this function applications should ensure that no NEW work is added to be published on this completion queue. */ GRPCAPI void grpc_completion_queue_shutdown(grpc_completion_queue* cq); /** Destroy a completion queue. The caller must ensure that the queue is drained and no threads are executing grpc_completion_queue_next */ GRPCAPI void grpc_completion_queue_destroy(grpc_completion_queue* cq); /*********** EXPERIMENTAL API ************/ /** Initializes a thread local cache for \a cq. * grpc_flush_cq_tls_cache() MUST be called on the same thread, * with the same cq. */ GRPCAPI void grpc_completion_queue_thread_local_cache_init( grpc_completion_queue* cq); /*********** EXPERIMENTAL API ************/ /** Flushes the thread local cache for \a cq. * Returns 1 if there was contents in the cache. If there was an event * in \a cq tls cache, its tag is placed in tag, and ok is set to the * event success. */ GRPCAPI int grpc_completion_queue_thread_local_cache_flush( grpc_completion_queue* cq, void** tag, int* ok); /** Check the connectivity state of a channel. */ GRPCAPI grpc_connectivity_state grpc_channel_check_connectivity_state( grpc_channel* channel, int try_to_connect); /** Number of active "external connectivity state watchers" attached to a * channel. * Useful for testing. **/ GRPCAPI int grpc_channel_num_external_connectivity_watchers( grpc_channel* channel); /** Watch for a change in connectivity state. Once the channel connectivity state is different from last_observed_state, tag will be enqueued on cq with success=1. If deadline expires BEFORE the state is changed, tag will be enqueued on cq with success=0. */ GRPCAPI void grpc_channel_watch_connectivity_state( grpc_channel* channel, grpc_connectivity_state last_observed_state, gpr_timespec deadline, grpc_completion_queue* cq, void* tag); /** Check whether a grpc channel supports connectivity watcher */ GRPCAPI int grpc_channel_support_connectivity_watcher(grpc_channel* channel); /** Create a call given a grpc_channel, in order to call 'method'. All completions are sent to 'completion_queue'. 'method' and 'host' need only live through the invocation of this function. If parent_call is non-NULL, it must be a server-side call. It will be used to propagate properties from the server call to this new client call, depending on the value of \a propagation_mask (see propagation_bits.h for possible values). */ GRPCAPI grpc_call* grpc_channel_create_call( grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask, grpc_completion_queue* completion_queue, grpc_slice method, const grpc_slice* host, gpr_timespec deadline, void* reserved); /** Ping the channels peer (load balanced channels will select one sub-channel to ping); if the channel is not connected, posts a failed. */ GRPCAPI void grpc_channel_ping(grpc_channel* channel, grpc_completion_queue* cq, void* tag, void* reserved); /** Pre-register a method/host pair on a channel. */ GRPCAPI void* grpc_channel_register_call(grpc_channel* channel, const char* method, const char* host, void* reserved); /** Create a call given a handle returned from grpc_channel_register_call. \sa grpc_channel_create_call. */ GRPCAPI grpc_call* grpc_channel_create_registered_call( grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask, grpc_completion_queue* completion_queue, void* registered_call_handle, gpr_timespec deadline, void* reserved); /** Allocate memory in the grpc_call arena: this memory is automatically discarded at call completion */ GRPCAPI void* grpc_call_arena_alloc(grpc_call* call, size_t size); /** Start a batch of operations defined in the array ops; when complete, post a completion of type 'tag' to the completion queue bound to the call. The order of ops specified in the batch has no significance. Only one operation of each type can be active at once in any given batch. If a call to grpc_call_start_batch returns GRPC_CALL_OK you must call grpc_completion_queue_next or grpc_completion_queue_pluck on the completion queue associated with 'call' for work to be performed. If a call to grpc_call_start_batch returns any value other than GRPC_CALL_OK it is guaranteed that no state associated with 'call' is changed and it is not appropriate to call grpc_completion_queue_next or grpc_completion_queue_pluck consequent to the failed grpc_call_start_batch call. THREAD SAFETY: access to grpc_call_start_batch in multi-threaded environment needs to be synchronized. As an optimization, you may synchronize batches containing just send operations independently from batches containing just receive operations. */ GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call* call, const grpc_op* ops, size_t nops, void* tag, void* reserved); /** Returns a newly allocated string representing the endpoint to which this call is communicating with. The string is in the uri format accepted by grpc_channel_create. The returned string should be disposed of with gpr_free(). WARNING: this value is never authenticated or subject to any security related code. It must not be used for any authentication related functionality. Instead, use grpc_auth_context. */ GRPCAPI char* grpc_call_get_peer(grpc_call* call); struct census_context; /** Set census context for a call; Must be called before first call to grpc_call_start_batch(). */ GRPCAPI void grpc_census_call_set_context(grpc_call* call, struct census_context* context); /** Retrieve the calls current census context. */ GRPCAPI struct census_context* grpc_census_call_get_context(grpc_call* call); /** Return a newly allocated string representing the target a channel was created for. */ GRPCAPI char* grpc_channel_get_target(grpc_channel* channel); /** Request info about the channel. \a channel_info indicates what information is being requested and how that information will be returned. \a channel_info is owned by the caller. */ GRPCAPI void grpc_channel_get_info(grpc_channel* channel, const grpc_channel_info* channel_info); /** Create a client channel to 'target'. Additional channel level configuration MAY be provided by grpc_channel_args, though the expectation is that most clients will want to simply pass NULL. The user data in 'args' need only live through the invocation of this function. However, if any args of the 'pointer' type are passed, then the referenced vtable must be maintained by the caller until grpc_channel_destroy terminates. See grpc_channel_args definition for more on this. */ GRPCAPI grpc_channel* grpc_insecure_channel_create( const char* target, const grpc_channel_args* args, void* reserved); /** Create a lame client: this client fails every operation attempted on it. */ GRPCAPI grpc_channel* grpc_lame_client_channel_create( const char* target, grpc_status_code error_code, const char* error_message); /** Close and destroy a grpc channel */ GRPCAPI void grpc_channel_destroy(grpc_channel* channel); /** Error handling for grpc_call Most grpc_call functions return a grpc_error. If the error is not GRPC_OK then the operation failed due to some unsatisfied precondition. If a grpc_call fails, it's guaranteed that no change to the call state has been made. */ /** Called by clients to cancel an RPC on the server. Can be called multiple times, from any thread. THREAD-SAFETY grpc_call_cancel and grpc_call_cancel_with_status are thread-safe, and can be called at any point before grpc_call_unref is called.*/ GRPCAPI grpc_call_error grpc_call_cancel(grpc_call* call, void* reserved); /** Called by clients to cancel an RPC on the server. Can be called multiple times, from any thread. If a status has not been received for the call, set it to the status code and description passed in. Importantly, this function does not send status nor description to the remote endpoint. Note that \a description doesn't need be a static string. It doesn't need to be alive after the call to grpc_call_cancel_with_status completes. */ GRPCAPI grpc_call_error grpc_call_cancel_with_status(grpc_call* call, grpc_status_code status, const char* description, void* reserved); /** Ref a call. THREAD SAFETY: grpc_call_ref is thread-compatible */ GRPCAPI void grpc_call_ref(grpc_call* call); /** Unref a call. THREAD SAFETY: grpc_call_unref is thread-compatible */ GRPCAPI void grpc_call_unref(grpc_call* call); /** Request notification of a new call. Once a call is received, a notification tagged with \a tag_new is added to \a cq_for_notification. \a call, \a details and \a request_metadata are updated with the appropriate call information. \a cq_bound_to_call is bound to \a call, and batch operation notifications for that call will be posted to \a cq_bound_to_call. Note that \a cq_for_notification must have been registered to the server via \a grpc_server_register_completion_queue. */ GRPCAPI grpc_call_error grpc_server_request_call( grpc_server* server, grpc_call** call, grpc_call_details* details, grpc_metadata_array* request_metadata, grpc_completion_queue* cq_bound_to_call, grpc_completion_queue* cq_for_notification, void* tag_new); /** How to handle payloads for a registered method */ typedef enum { /** Don't try to read the payload */ GRPC_SRM_PAYLOAD_NONE, /** Read the initial payload as a byte buffer */ GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER } grpc_server_register_method_payload_handling; /** Registers a method in the server. Methods to this (host, method) pair will not be reported by grpc_server_request_call, but instead be reported by grpc_server_request_registered_call when passed the appropriate registered_method (as returned by this function). Must be called before grpc_server_start. Returns NULL on failure. */ GRPCAPI void* grpc_server_register_method( grpc_server* server, const char* method, const char* host, grpc_server_register_method_payload_handling payload_handling, uint32_t flags); /** Request notification of a new pre-registered call. 'cq_for_notification' must have been registered to the server via grpc_server_register_completion_queue. */ GRPCAPI grpc_call_error grpc_server_request_registered_call( grpc_server* server, void* registered_method, grpc_call** call, gpr_timespec* deadline, grpc_metadata_array* request_metadata, grpc_byte_buffer** optional_payload, grpc_completion_queue* cq_bound_to_call, grpc_completion_queue* cq_for_notification, void* tag_new); /** Create a server. Additional configuration for each incoming channel can be specified with args. If no additional configuration is needed, args can be NULL. The user data in 'args' need only live through the invocation of this function. However, if any args of the 'pointer' type are passed, then the referenced vtable must be maintained by the caller until grpc_server_destroy terminates. See grpc_channel_args definition for more on this. */ GRPCAPI grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved); /** Register a completion queue with the server. Must be done for any notification completion queue that is passed to grpc_server_request_*_call and to grpc_server_shutdown_and_notify. Must be performed prior to grpc_server_start. */ GRPCAPI void grpc_server_register_completion_queue(grpc_server* server, grpc_completion_queue* cq, void* reserved); /** Add a HTTP2 over plaintext over tcp listener. Returns bound port number on success, 0 on failure. REQUIRES: server not started */ GRPCAPI int grpc_server_add_insecure_http2_port(grpc_server* server, const char* addr); /** Start a server - tells all listeners to start listening */ GRPCAPI void grpc_server_start(grpc_server* server); /** Begin shutting down a server. After completion, no new calls or connections will be admitted. Existing calls will be allowed to complete. Send a GRPC_OP_COMPLETE event when there are no more calls being serviced. Shutdown is idempotent, and all tags will be notified at once if multiple grpc_server_shutdown_and_notify calls are made. 'cq' must have been registered to this server via grpc_server_register_completion_queue. */ GRPCAPI void grpc_server_shutdown_and_notify(grpc_server* server, grpc_completion_queue* cq, void* tag); /** Cancel all in-progress calls. Only usable after shutdown. */ GRPCAPI void grpc_server_cancel_all_calls(grpc_server* server); /** Destroy a server. Shutdown must have completed beforehand (i.e. all tags generated by grpc_server_shutdown_and_notify must have been received, and at least one call to grpc_server_shutdown_and_notify must have been made). */ GRPCAPI void grpc_server_destroy(grpc_server* server); /** Enable or disable a tracer. Tracers (usually controlled by the environment variable GRPC_TRACE) allow printf-style debugging on GRPC internals, and are useful for tracking down problems in the field. Use of this function is not strictly thread-safe, but the thread-safety issues raised by it should not be of concern. */ GRPCAPI int grpc_tracer_set_enabled(const char* name, int enabled); /** Check whether a metadata key is legal (will be accepted by core) */ GRPCAPI int grpc_header_key_is_legal(grpc_slice slice); /** Check whether a non-binary metadata value is legal (will be accepted by core) */ GRPCAPI int grpc_header_nonbin_value_is_legal(grpc_slice slice); /** Check whether a metadata key corresponds to a binary value */ GRPCAPI int grpc_is_binary_header(grpc_slice slice); /** Convert grpc_call_error values to a string */ GRPCAPI const char* grpc_call_error_to_string(grpc_call_error error); /** Create a buffer pool */ GRPCAPI grpc_resource_quota* grpc_resource_quota_create(const char* trace_name); /** Add a reference to a buffer pool */ GRPCAPI void grpc_resource_quota_ref(grpc_resource_quota* resource_quota); /** Drop a reference to a buffer pool */ GRPCAPI void grpc_resource_quota_unref(grpc_resource_quota* resource_quota); /** Update the size of a buffer pool */ GRPCAPI void grpc_resource_quota_resize(grpc_resource_quota* resource_quota, size_t new_size); /** Fetch a vtable for a grpc_channel_arg that points to a grpc_resource_quota */ GRPCAPI const grpc_arg_pointer_vtable* grpc_resource_quota_arg_vtable(void); #ifdef __cplusplus } #endif #endif /* GRPC_GRPC_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/grpc_cronet.h000066400000000000000000000017151334102242000242330ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_GRPC_CRONET_H #define GRPC_GRPC_CRONET_H #include #include #ifdef __cplusplus extern "C" { #endif GRPCAPI grpc_channel* grpc_cronet_secure_channel_create( void* engine, const char* target, const grpc_channel_args* args, void* reserved); #ifdef __cplusplus } #endif #endif /* GRPC_GRPC_CRONET_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/grpc_posix.h000066400000000000000000000044621334102242000241050ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_GRPC_POSIX_H #define GRPC_GRPC_POSIX_H #include #include #include #ifdef __cplusplus extern "C" { #endif /*! \mainpage GRPC Core POSIX * * The GRPC Core POSIX library provides some POSIX-specific low-level * functionality on top of GRPC Core. */ /** Create a client channel to 'target' using file descriptor 'fd'. The 'target' argument will be used to indicate the name for this channel. See the comment for grpc_insecure_channel_create for description of 'args' argument. */ GRPCAPI grpc_channel* grpc_insecure_channel_create_from_fd( const char* target, int fd, const grpc_channel_args* args); /** Add the connected communication channel based on file descriptor 'fd' to the 'server'. The 'fd' must be an open file descriptor corresponding to a connected socket. Events from the file descriptor may come on any of the server completion queues (i.e completion queues registered via the grpc_server_register_completion_queue API). The 'reserved' pointer MUST be NULL. */ GRPCAPI void grpc_server_add_insecure_channel_from_fd(grpc_server* server, void* reserved, int fd); /** GRPC Core POSIX library may internally use signals to optimize some work. The library uses (SIGRTMIN + 6) signal by default. Use this API to instruct the library to use a different signal i.e 'signum' instead. Note: - To prevent GRPC library from using any signals, pass a 'signum' of -1 - This API is optional but if called, it MUST be called before grpc_init() */ GRPCAPI void grpc_use_signal(int signum); #ifdef __cplusplus } #endif #endif /* GRPC_GRPC_POSIX_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/grpc_security.h000066400000000000000000000661401334102242000246130ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_GRPC_SECURITY_H #define GRPC_GRPC_SECURITY_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** --- Authentication Context. --- */ typedef struct grpc_auth_context grpc_auth_context; typedef struct grpc_auth_property_iterator { const grpc_auth_context* ctx; size_t index; const char* name; } grpc_auth_property_iterator; /** value, if not NULL, is guaranteed to be NULL terminated. */ typedef struct grpc_auth_property { char* name; char* value; size_t value_length; } grpc_auth_property; /** Returns NULL when the iterator is at the end. */ GRPCAPI const grpc_auth_property* grpc_auth_property_iterator_next( grpc_auth_property_iterator* it); /** Iterates over the auth context. */ GRPCAPI grpc_auth_property_iterator grpc_auth_context_property_iterator(const grpc_auth_context* ctx); /** Gets the peer identity. Returns an empty iterator (first _next will return NULL) if the peer is not authenticated. */ GRPCAPI grpc_auth_property_iterator grpc_auth_context_peer_identity(const grpc_auth_context* ctx); /** Finds a property in the context. May return an empty iterator (first _next will return NULL) if no property with this name was found in the context. */ GRPCAPI grpc_auth_property_iterator grpc_auth_context_find_properties_by_name( const grpc_auth_context* ctx, const char* name); /** Gets the name of the property that indicates the peer identity. Will return NULL if the peer is not authenticated. */ GRPCAPI const char* grpc_auth_context_peer_identity_property_name( const grpc_auth_context* ctx); /** Returns 1 if the peer is authenticated, 0 otherwise. */ GRPCAPI int grpc_auth_context_peer_is_authenticated( const grpc_auth_context* ctx); /** Gets the auth context from the call. Caller needs to call grpc_auth_context_release on the returned context. */ GRPCAPI grpc_auth_context* grpc_call_auth_context(grpc_call* call); /** Releases the auth context returned from grpc_call_auth_context. */ GRPCAPI void grpc_auth_context_release(grpc_auth_context* context); /** -- The following auth context methods should only be called by a server metadata processor to set properties extracted from auth metadata. -- */ /** Add a property. */ GRPCAPI void grpc_auth_context_add_property(grpc_auth_context* ctx, const char* name, const char* value, size_t value_length); /** Add a C string property. */ GRPCAPI void grpc_auth_context_add_cstring_property(grpc_auth_context* ctx, const char* name, const char* value); /** Sets the property name. Returns 1 if successful or 0 in case of failure (which means that no property with this name exists). */ GRPCAPI int grpc_auth_context_set_peer_identity_property_name( grpc_auth_context* ctx, const char* name); /** --- SSL Session Cache. --- A SSL session cache object represents a way to cache client sessions between connections. Only ticket-based resumption is supported. */ typedef struct grpc_ssl_session_cache grpc_ssl_session_cache; /** Create LRU cache for client-side SSL sessions with the given capacity. If capacity is < 1, a default capacity is used instead. */ GRPCAPI grpc_ssl_session_cache* grpc_ssl_session_cache_create_lru( size_t capacity); /** Destroy SSL session cache. */ GRPCAPI void grpc_ssl_session_cache_destroy(grpc_ssl_session_cache* cache); /** Create a channel arg with the given cache object. */ GRPCAPI grpc_arg grpc_ssl_session_cache_create_channel_arg(grpc_ssl_session_cache* cache); /** --- grpc_channel_credentials object. --- A channel credentials object represents a way to authenticate a client on a channel. */ typedef struct grpc_channel_credentials grpc_channel_credentials; /** Releases a channel credentials object. The creator of the credentials object is responsible for its release. */ GRPCAPI void grpc_channel_credentials_release(grpc_channel_credentials* creds); /** Creates default credentials to connect to a google gRPC service. WARNING: Do NOT use this credentials to connect to a non-google service as this could result in an oauth2 token leak. */ GRPCAPI grpc_channel_credentials* grpc_google_default_credentials_create(void); /** Callback for getting the SSL roots override from the application. In case of success, *pem_roots_certs must be set to a NULL terminated string containing the list of PEM encoded root certificates. The ownership is passed to the core and freed (laster by the core) with gpr_free. If this function fails and GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is set to a valid path, it will override the roots specified this func */ typedef grpc_ssl_roots_override_result (*grpc_ssl_roots_override_callback)( char** pem_root_certs); /** Setup a callback to override the default TLS/SSL roots. This function is not thread-safe and must be called at initialization time before any ssl credentials are created to have the desired side effect. If GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment is set to a valid path, the callback will not be called. */ GRPCAPI void grpc_set_ssl_roots_override_callback( grpc_ssl_roots_override_callback cb); /** Object that holds a private key / certificate chain pair in PEM format. */ typedef struct { /** private_key is the NULL-terminated string containing the PEM encoding of the client's private key. */ const char* private_key; /** cert_chain is the NULL-terminated string containing the PEM encoding of the client's certificate chain. */ const char* cert_chain; } grpc_ssl_pem_key_cert_pair; /** Object that holds additional peer-verification options on a secure channel. */ typedef struct { /** If non-NULL this callback will be invoked with the expected target_name, the peer's certificate (in PEM format), and whatever userdata pointer is set below. If a non-zero value is returned by this callback then it is treated as a verification failure. Invocation of the callback is blocking, so any implementation should be light-weight. */ int (*verify_peer_callback)(const char* target_name, const char* peer_pem, void* userdata); /** Arbitrary userdata that will be passed as the last argument to verify_peer_callback. */ void* verify_peer_callback_userdata; /** A destruct callback that will be invoked when the channel is being cleaned up. The userdata argument will be passed to it. The intent is to perform any cleanup associated with that userdata. */ void (*verify_peer_destruct)(void* userdata); } verify_peer_options; /** Creates an SSL credentials object. - pem_root_certs is the NULL-terminated string containing the PEM encoding of the server root certificates. If this parameter is NULL, the implementation will first try to dereference the file pointed by the GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable, and if that fails, try to get the roots set by grpc_override_ssl_default_roots. Eventually, if all these fail, it will try to get the roots from a well-known place on disk (in the grpc install directory). - pem_key_cert_pair is a pointer on the object containing client's private key and certificate chain. This parameter can be NULL if the client does not have such a key/cert pair. - verify_options is an optional verify_peer_options object which holds additional options controlling how peer certificates are verified. For example, you can supply a callback which receives the peer's certificate with which you can do additional verification. Can be NULL, in which case verification will retain default behavior. Any settings in verify_options are copied during this call, so the verify_options object can be released afterwards. */ GRPCAPI grpc_channel_credentials* grpc_ssl_credentials_create( const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pair, const verify_peer_options* verify_options, void* reserved); /** --- grpc_call_credentials object. A call credentials object represents a way to authenticate on a particular call. These credentials can be composed with a channel credentials object so that they are sent with every call on this channel. */ typedef struct grpc_call_credentials grpc_call_credentials; /** Releases a call credentials object. The creator of the credentials object is responsible for its release. */ GRPCAPI void grpc_call_credentials_release(grpc_call_credentials* creds); /** Creates a composite channel credentials object. */ GRPCAPI grpc_channel_credentials* grpc_composite_channel_credentials_create( grpc_channel_credentials* channel_creds, grpc_call_credentials* call_creds, void* reserved); /** Creates a composite call credentials object. */ GRPCAPI grpc_call_credentials* grpc_composite_call_credentials_create( grpc_call_credentials* creds1, grpc_call_credentials* creds2, void* reserved); /** Creates a compute engine credentials object for connecting to Google. WARNING: Do NOT use this credentials to connect to a non-google service as this could result in an oauth2 token leak. */ GRPCAPI grpc_call_credentials* grpc_google_compute_engine_credentials_create( void* reserved); GRPCAPI gpr_timespec grpc_max_auth_token_lifetime(void); /** Creates a JWT credentials object. May return NULL if the input is invalid. - json_key is the JSON key string containing the client's private key. - token_lifetime is the lifetime of each Json Web Token (JWT) created with this credentials. It should not exceed grpc_max_auth_token_lifetime or will be cropped to this value. */ GRPCAPI grpc_call_credentials* grpc_service_account_jwt_access_credentials_create(const char* json_key, gpr_timespec token_lifetime, void* reserved); /** Creates an Oauth2 Refresh Token credentials object for connecting to Google. May return NULL if the input is invalid. WARNING: Do NOT use this credentials to connect to a non-google service as this could result in an oauth2 token leak. - json_refresh_token is the JSON string containing the refresh token itself along with a client_id and client_secret. */ GRPCAPI grpc_call_credentials* grpc_google_refresh_token_credentials_create( const char* json_refresh_token, void* reserved); /** Creates an Oauth2 Access Token credentials with an access token that was aquired by an out of band mechanism. */ GRPCAPI grpc_call_credentials* grpc_access_token_credentials_create( const char* access_token, void* reserved); /** Creates an IAM credentials object for connecting to Google. */ GRPCAPI grpc_call_credentials* grpc_google_iam_credentials_create( const char* authorization_token, const char* authority_selector, void* reserved); /** Callback function to be called by the metadata credentials plugin implementation when the metadata is ready. - user_data is the opaque pointer that was passed in the get_metadata method of the grpc_metadata_credentials_plugin (see below). - creds_md is an array of credentials metadata produced by the plugin. It may be set to NULL in case of an error. - num_creds_md is the number of items in the creds_md array. - status must be GRPC_STATUS_OK in case of success or another specific error code otherwise. - error_details contains details about the error if any. In case of success it should be NULL and will be otherwise ignored. */ typedef void (*grpc_credentials_plugin_metadata_cb)( void* user_data, const grpc_metadata* creds_md, size_t num_creds_md, grpc_status_code status, const char* error_details); /** Context that can be used by metadata credentials plugin in order to create auth related metadata. */ typedef struct { /** The fully qualifed service url. */ const char* service_url; /** The method name of the RPC being called (not fully qualified). The fully qualified method name can be built from the service_url: full_qualified_method_name = ctx->service_url + '/' + ctx->method_name. */ const char* method_name; /** The auth_context of the channel which gives the server's identity. */ const grpc_auth_context* channel_auth_context; /** Reserved for future use. */ void* reserved; } grpc_auth_metadata_context; /** Maximum number of metadata entries returnable by a credentials plugin via a synchronous return. */ #define GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX 4 /** grpc_metadata_credentials plugin is an API user provided structure used to create grpc_credentials objects that can be set on a channel (composed) or a call. See grpc_credentials_metadata_create_from_plugin below. The grpc client stack will call the get_metadata method of the plugin for every call in scope for the credentials created from it. */ typedef struct { /** The implementation of this method has to be non-blocking, but can be performed synchronously or asynchronously. If processing occurs synchronously, returns non-zero and populates creds_md, num_creds_md, status, and error_details. In this case, the caller takes ownership of the entries in creds_md and of error_details. Note that if the plugin needs to return more than GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX entries in creds_md, it must return asynchronously. If processing occurs asynchronously, returns zero and invokes \a cb when processing is completed. \a user_data will be passed as the first parameter of the callback. NOTE: \a cb MUST be invoked in a different thread, not from the thread in which \a get_metadata() is invoked. \a context is the information that can be used by the plugin to create auth metadata. */ int (*get_metadata)( void* state, grpc_auth_metadata_context context, grpc_credentials_plugin_metadata_cb cb, void* user_data, grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX], size_t* num_creds_md, grpc_status_code* status, const char** error_details); /** Destroys the plugin state. */ void (*destroy)(void* state); /** State that will be set as the first parameter of the methods above. */ void* state; /** Type of credentials that this plugin is implementing. */ const char* type; } grpc_metadata_credentials_plugin; /** Creates a credentials object from a plugin. */ GRPCAPI grpc_call_credentials* grpc_metadata_credentials_create_from_plugin( grpc_metadata_credentials_plugin plugin, void* reserved); /** --- Secure channel creation. --- */ /** Creates a secure channel using the passed-in credentials. Additional channel level configuration MAY be provided by grpc_channel_args, though the expectation is that most clients will want to simply pass NULL. The user data in 'args' need only live through the invocation of this function. However, if any args of the 'pointer' type are passed, then the referenced vtable must be maintained by the caller until grpc_channel_destroy terminates. See grpc_channel_args definition for more on this. */ GRPCAPI grpc_channel* grpc_secure_channel_create( grpc_channel_credentials* creds, const char* target, const grpc_channel_args* args, void* reserved); /** --- grpc_server_credentials object. --- A server credentials object represents a way to authenticate a server. */ typedef struct grpc_server_credentials grpc_server_credentials; /** Releases a server_credentials object. The creator of the server_credentials object is responsible for its release. */ GRPCAPI void grpc_server_credentials_release(grpc_server_credentials* creds); /** Server certificate config object holds the server's public certificates and associated private keys, as well as any CA certificates needed for client certificate validation (if applicable). Create using grpc_ssl_server_certificate_config_create(). */ typedef struct grpc_ssl_server_certificate_config grpc_ssl_server_certificate_config; /** Creates a grpc_ssl_server_certificate_config object. - pem_roots_cert is the NULL-terminated string containing the PEM encoding of the client root certificates. This parameter may be NULL if the server does not want the client to be authenticated with SSL. - pem_key_cert_pairs is an array private key / certificate chains of the server. This parameter cannot be NULL. - num_key_cert_pairs indicates the number of items in the private_key_files and cert_chain_files parameters. It must be at least 1. - It is the caller's responsibility to free this object via grpc_ssl_server_certificate_config_destroy(). */ GRPCAPI grpc_ssl_server_certificate_config* grpc_ssl_server_certificate_config_create( const char* pem_root_certs, const grpc_ssl_pem_key_cert_pair* pem_key_cert_pairs, size_t num_key_cert_pairs); /** Destroys a grpc_ssl_server_certificate_config object. */ GRPCAPI void grpc_ssl_server_certificate_config_destroy( grpc_ssl_server_certificate_config* config); /** Callback to retrieve updated SSL server certificates, private keys, and trusted CAs (for client authentication). - user_data parameter, if not NULL, contains opaque data to be used by the callback. - Use grpc_ssl_server_certificate_config_create to create the config. - The caller assumes ownership of the config. */ typedef grpc_ssl_certificate_config_reload_status ( *grpc_ssl_server_certificate_config_callback)( void* user_data, grpc_ssl_server_certificate_config** config); /** Deprecated in favor of grpc_ssl_server_credentials_create_ex. Creates an SSL server_credentials object. - pem_roots_cert is the NULL-terminated string containing the PEM encoding of the client root certificates. This parameter may be NULL if the server does not want the client to be authenticated with SSL. - pem_key_cert_pairs is an array private key / certificate chains of the server. This parameter cannot be NULL. - num_key_cert_pairs indicates the number of items in the private_key_files and cert_chain_files parameters. It should be at least 1. - force_client_auth, if set to non-zero will force the client to authenticate with an SSL cert. Note that this option is ignored if pem_root_certs is NULL. */ GRPCAPI grpc_server_credentials* grpc_ssl_server_credentials_create( const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pairs, size_t num_key_cert_pairs, int force_client_auth, void* reserved); /** Deprecated in favor of grpc_ssl_server_credentials_create_with_options. Same as grpc_ssl_server_credentials_create method except uses grpc_ssl_client_certificate_request_type enum to support more ways to authenticate client cerificates.*/ GRPCAPI grpc_server_credentials* grpc_ssl_server_credentials_create_ex( const char* pem_root_certs, grpc_ssl_pem_key_cert_pair* pem_key_cert_pairs, size_t num_key_cert_pairs, grpc_ssl_client_certificate_request_type client_certificate_request, void* reserved); typedef struct grpc_ssl_server_credentials_options grpc_ssl_server_credentials_options; /** Creates an options object using a certificate config. Use this method when the certificates and keys of the SSL server will not change during the server's lifetime. - Takes ownership of the certificate_config parameter. */ GRPCAPI grpc_ssl_server_credentials_options* grpc_ssl_server_credentials_create_options_using_config( grpc_ssl_client_certificate_request_type client_certificate_request, grpc_ssl_server_certificate_config* certificate_config); /** Creates an options object using a certificate config fetcher. Use this method to reload the certificates and keys of the SSL server without interrupting the operation of the server. Initial certificate config will be fetched during server initialization. - user_data parameter, if not NULL, contains opaque data which will be passed to the fetcher (see definition of grpc_ssl_server_certificate_config_callback). */ GRPCAPI grpc_ssl_server_credentials_options* grpc_ssl_server_credentials_create_options_using_config_fetcher( grpc_ssl_client_certificate_request_type client_certificate_request, grpc_ssl_server_certificate_config_callback cb, void* user_data); /** Destroys a grpc_ssl_server_credentials_options object. */ GRPCAPI void grpc_ssl_server_credentials_options_destroy( grpc_ssl_server_credentials_options* options); /** Creates an SSL server_credentials object using the provided options struct. - Takes ownership of the options parameter. */ GRPCAPI grpc_server_credentials* grpc_ssl_server_credentials_create_with_options( grpc_ssl_server_credentials_options* options); /** --- Server-side secure ports. --- */ /** Add a HTTP2 over an encrypted link over tcp listener. Returns bound port number on success, 0 on failure. REQUIRES: server not started */ GRPCAPI int grpc_server_add_secure_http2_port(grpc_server* server, const char* addr, grpc_server_credentials* creds); /** --- Call specific credentials. --- */ /** Sets a credentials to a call. Can only be called on the client side before grpc_call_start_batch. */ GRPCAPI grpc_call_error grpc_call_set_credentials(grpc_call* call, grpc_call_credentials* creds); /** --- Auth Metadata Processing --- */ /** Callback function that is called when the metadata processing is done. - Consumed metadata will be removed from the set of metadata available on the call. consumed_md may be NULL if no metadata has been consumed. - Response metadata will be set on the response. response_md may be NULL. - status is GRPC_STATUS_OK for success or a specific status for an error. Common error status for auth metadata processing is either GRPC_STATUS_UNAUTHENTICATED in case of an authentication failure or GRPC_STATUS PERMISSION_DENIED in case of an authorization failure. - error_details gives details about the error. May be NULL. */ typedef void (*grpc_process_auth_metadata_done_cb)( void* user_data, const grpc_metadata* consumed_md, size_t num_consumed_md, const grpc_metadata* response_md, size_t num_response_md, grpc_status_code status, const char* error_details); /** Pluggable server-side metadata processor object. */ typedef struct { /** The context object is read/write: it contains the properties of the channel peer and it is the job of the process function to augment it with properties derived from the passed-in metadata. The lifetime of these objects is guaranteed until cb is invoked. */ void (*process)(void* state, grpc_auth_context* context, const grpc_metadata* md, size_t num_md, grpc_process_auth_metadata_done_cb cb, void* user_data); void (*destroy)(void* state); void* state; } grpc_auth_metadata_processor; GRPCAPI void grpc_server_credentials_set_auth_metadata_processor( grpc_server_credentials* creds, grpc_auth_metadata_processor processor); /** --- ALTS channel/server credentials --- **/ /** * Main interface for ALTS credentials options. The options will contain * information that will be passed from grpc to TSI layer such as RPC protocol * versions. ALTS client (channel) and server credentials will have their own * implementation of this interface. The APIs listed in this header are * thread-compatible. It is used for experimental purpose for now and subject * to change. */ typedef struct grpc_alts_credentials_options grpc_alts_credentials_options; /** * This method creates a grpc ALTS credentials client options instance. * It is used for experimental purpose for now and subject to change. */ GRPCAPI grpc_alts_credentials_options* grpc_alts_credentials_client_options_create(); /** * This method creates a grpc ALTS credentials server options instance. * It is used for experimental purpose for now and subject to change. */ GRPCAPI grpc_alts_credentials_options* grpc_alts_credentials_server_options_create(); /** * This method adds a target service account to grpc client's ALTS credentials * options instance. It is used for experimental purpose for now and subject * to change. * * - options: grpc ALTS credentials options instance. * - service_account: service account of target endpoint. */ GRPCAPI void grpc_alts_credentials_client_options_add_target_service_account( grpc_alts_credentials_options* options, const char* service_account); /** * This method destroys a grpc_alts_credentials_options instance by * de-allocating all of its occupied memory. It is used for experimental purpose * for now and subject to change. * * - options: a grpc_alts_credentials_options instance that needs to be * destroyed. */ GRPCAPI void grpc_alts_credentials_options_destroy( grpc_alts_credentials_options* options); /** * This method creates an ALTS channel credential object. It is used for * experimental purpose for now and subject to change. * * - options: grpc ALTS credentials options instance for client. * * It returns the created ALTS channel credential object. */ GRPCAPI grpc_channel_credentials* grpc_alts_credentials_create( const grpc_alts_credentials_options* options); /** * This method creates an ALTS server credential object. It is used for * experimental purpose for now and subject to change. * * - options: grpc ALTS credentials options instance for server. * * It returns the created ALTS server credential object. */ GRPCAPI grpc_server_credentials* grpc_alts_server_credentials_create( const grpc_alts_credentials_options* options); /** --- Local channel/server credentials --- **/ /** * Type of local connection for which local channel/server credentials will be * applied. It only supports UDS for now. */ typedef enum { UDS = 0 } grpc_local_connect_type; /** * This method creates a local channel credential object. It is used for * experimental purpose for now and subject to change. * * - type: local connection type * * It returns the created local channel credential object. */ GRPCAPI grpc_channel_credentials* grpc_local_credentials_create( grpc_local_connect_type type); /** * This method creates a local server credential object. It is used for * experimental purpose for now and subject to change. * * - type: local connection type * * It returns the created local server credential object. */ GRPCAPI grpc_server_credentials* grpc_local_server_credentials_create( grpc_local_connect_type type); #ifdef __cplusplus } #endif #endif /* GRPC_GRPC_SECURITY_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/grpc_security_constants.h000066400000000000000000000101311334102242000266740ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_GRPC_SECURITY_CONSTANTS_H #define GRPC_GRPC_SECURITY_CONSTANTS_H #ifdef __cplusplus extern "C" { #endif #define GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME "transport_security_type" #define GRPC_SSL_TRANSPORT_SECURITY_TYPE "ssl" #define GRPC_X509_CN_PROPERTY_NAME "x509_common_name" #define GRPC_X509_SAN_PROPERTY_NAME "x509_subject_alternative_name" #define GRPC_X509_PEM_CERT_PROPERTY_NAME "x509_pem_cert" #define GRPC_SSL_SESSION_REUSED_PROPERTY "ssl_session_reused" /** Environment variable that points to the default SSL roots file. This file must be a PEM encoded file with all the roots such as the one that can be downloaded from https://pki.google.com/roots.pem. */ #define GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR \ "GRPC_DEFAULT_SSL_ROOTS_FILE_PATH" /** Environment variable that points to the google default application credentials json key or refresh token. Used in the grpc_google_default_credentials_create function. */ #define GRPC_GOOGLE_CREDENTIALS_ENV_VAR "GOOGLE_APPLICATION_CREDENTIALS" /** Results for the SSL roots override callback. */ typedef enum { GRPC_SSL_ROOTS_OVERRIDE_OK, GRPC_SSL_ROOTS_OVERRIDE_FAIL_PERMANENTLY, /** Do not try fallback options. */ GRPC_SSL_ROOTS_OVERRIDE_FAIL } grpc_ssl_roots_override_result; /** Callback results for dynamically loading a SSL certificate config. */ typedef enum { GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL } grpc_ssl_certificate_config_reload_status; typedef enum { /** Server does not request client certificate. A client can present a self signed or signed certificates if it wishes to do so and they would be accepted. */ GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE, /** Server requests client certificate but does not enforce that the client presents a certificate. If the client presents a certificate, the client authentication is left to the application based on the metadata like certificate etc. The key cert pair should still be valid for the SSL connection to be established. */ GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_BUT_DONT_VERIFY, /** Server requests client certificate but does not enforce that the client presents a certificate. If the client presents a certificate, the client authentication is done by grpc framework (The client needs to either present a signed cert or skip no certificate for a successful connection). The key cert pair should still be valid for the SSL connection to be established. */ GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, /** Server requests client certificate but enforces that the client presents a certificate. If the client presents a certificate, the client authentication is left to the application based on the metadata like certificate etc. The key cert pair should still be valid for the SSL connection to be established. */ GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_BUT_DONT_VERIFY, /** Server requests client certificate but enforces that the client presents a certificate. The cerificate presented by the client is verified by grpc framework (The client needs to present signed certs for a successful connection). The key cert pair should still be valid for the SSL connection to be established. */ GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY } grpc_ssl_client_certificate_request_type; #ifdef __cplusplus } #endif #endif /* GRPC_GRPC_SECURITY_CONSTANTS_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/000077500000000000000000000000001334102242000225125ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/000077500000000000000000000000001334102242000241165ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/atm.h000066400000000000000000000064761334102242000250650ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_ATM_H #define GRPC_IMPL_CODEGEN_ATM_H /** This interface provides atomic operations and barriers. It is internal to gpr support code and should not be used outside it. If an operation with acquire semantics precedes another memory access by the same thread, the operation will precede that other access as seen by other threads. If an operation with release semantics follows another memory access by the same thread, the operation will follow that other access as seen by other threads. Routines with "acq" or "full" in the name have acquire semantics. Routines with "rel" or "full" in the name have release semantics. Routines with "no_barrier" in the name have neither acquire not release semantics. The routines may be implemented as macros. // Atomic operations act on an intergral_type gpr_atm that is guaranteed to // be the same size as a pointer. typedef intptr_t gpr_atm; // A memory barrier, providing both acquire and release semantics, but not // otherwise acting on memory. void gpr_atm_full_barrier(void); // Atomically return *p, with acquire semantics. gpr_atm gpr_atm_acq_load(gpr_atm *p); gpr_atm gpr_atm_no_barrier_load(gpr_atm *p); // Atomically set *p = value, with release semantics. void gpr_atm_rel_store(gpr_atm *p, gpr_atm value); // Atomically add delta to *p, and return the old value of *p, with // the barriers specified. gpr_atm gpr_atm_no_barrier_fetch_add(gpr_atm *p, gpr_atm delta); gpr_atm gpr_atm_full_fetch_add(gpr_atm *p, gpr_atm delta); // Atomically, if *p==o, set *p=n and return non-zero otherwise return 0, // with the barriers specified if the operation succeeds. int gpr_atm_no_barrier_cas(gpr_atm *p, gpr_atm o, gpr_atm n); int gpr_atm_acq_cas(gpr_atm *p, gpr_atm o, gpr_atm n); int gpr_atm_rel_cas(gpr_atm *p, gpr_atm o, gpr_atm n); int gpr_atm_full_cas(gpr_atm *p, gpr_atm o, gpr_atm n); // Atomically, set *p=n and return the old value of *p gpr_atm gpr_atm_full_xchg(gpr_atm *p, gpr_atm n); */ #include #if defined(GPR_GCC_ATOMIC) #include #elif defined(GPR_GCC_SYNC) #include #elif defined(GPR_WINDOWS_ATOMIC) #include #else #error could not determine platform for atm #endif #ifdef __cplusplus extern "C" { #endif /** Adds \a delta to \a *value, clamping the result to the range specified by \a min and \a max. Returns the new value. */ gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm* value, gpr_atm delta, gpr_atm min, gpr_atm max); #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_ATM_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/atm_gcc_atomic.h000066400000000000000000000060621334102242000272240ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H #define GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H /* atm_platform.h for gcc and gcc-like compilers with the __atomic_* interface. */ #include #ifdef __cplusplus extern "C" { #endif typedef intptr_t gpr_atm; #define GPR_ATM_MAX INTPTR_MAX #define GPR_ATM_MIN INTPTR_MIN #ifdef GPR_LOW_LEVEL_COUNTERS extern gpr_atm gpr_counter_atm_cas; extern gpr_atm gpr_counter_atm_add; #define GPR_ATM_INC_COUNTER(counter) \ __atomic_fetch_add(&counter, 1, __ATOMIC_RELAXED) #define GPR_ATM_INC_CAS_THEN(blah) \ (GPR_ATM_INC_COUNTER(gpr_counter_atm_cas), blah) #define GPR_ATM_INC_ADD_THEN(blah) \ (GPR_ATM_INC_COUNTER(gpr_counter_atm_add), blah) #else #define GPR_ATM_INC_CAS_THEN(blah) blah #define GPR_ATM_INC_ADD_THEN(blah) blah #endif #define gpr_atm_full_barrier() (__atomic_thread_fence(__ATOMIC_SEQ_CST)) #define gpr_atm_acq_load(p) (__atomic_load_n((p), __ATOMIC_ACQUIRE)) #define gpr_atm_no_barrier_load(p) (__atomic_load_n((p), __ATOMIC_RELAXED)) #define gpr_atm_rel_store(p, value) \ (__atomic_store_n((p), (intptr_t)(value), __ATOMIC_RELEASE)) #define gpr_atm_no_barrier_store(p, value) \ (__atomic_store_n((p), (intptr_t)(value), __ATOMIC_RELAXED)) #define gpr_atm_no_barrier_fetch_add(p, delta) \ GPR_ATM_INC_ADD_THEN( \ __atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_RELAXED)) #define gpr_atm_full_fetch_add(p, delta) \ GPR_ATM_INC_ADD_THEN( \ __atomic_fetch_add((p), (intptr_t)(delta), __ATOMIC_ACQ_REL)) static __inline int gpr_atm_no_barrier_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( p, &o, n, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED)); } static __inline int gpr_atm_acq_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( p, &o, n, 0, __ATOMIC_ACQUIRE, __ATOMIC_RELAXED)); } static __inline int gpr_atm_rel_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( p, &o, n, 0, __ATOMIC_RELEASE, __ATOMIC_RELAXED)); } static __inline int gpr_atm_full_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { return GPR_ATM_INC_CAS_THEN(__atomic_compare_exchange_n( p, &o, n, 0, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED)); } #define gpr_atm_full_xchg(p, n) \ GPR_ATM_INC_CAS_THEN(__atomic_exchange_n((p), (n), __ATOMIC_ACQ_REL)) #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_ATM_GCC_ATOMIC_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/atm_gcc_sync.h000066400000000000000000000047141334102242000267260ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_ATM_GCC_SYNC_H #define GRPC_IMPL_CODEGEN_ATM_GCC_SYNC_H /* variant of atm_platform.h for gcc and gcc-like compiers with __sync_* interface */ #include typedef intptr_t gpr_atm; #define GPR_ATM_MAX INTPTR_MAX #define GPR_ATM_MIN INTPTR_MIN #define GPR_ATM_COMPILE_BARRIER_() __asm__ __volatile__("" : : : "memory") #if defined(__i386) || defined(__x86_64__) /* All loads are acquire loads and all stores are release stores. */ #define GPR_ATM_LS_BARRIER_() GPR_ATM_COMPILE_BARRIER_() #else #define GPR_ATM_LS_BARRIER_() gpr_atm_full_barrier() #endif #define gpr_atm_full_barrier() (__sync_synchronize()) static __inline gpr_atm gpr_atm_acq_load(const gpr_atm* p) { gpr_atm value = *p; GPR_ATM_LS_BARRIER_(); return value; } static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm* p) { gpr_atm value = *p; GPR_ATM_COMPILE_BARRIER_(); return value; } static __inline void gpr_atm_rel_store(gpr_atm* p, gpr_atm value) { GPR_ATM_LS_BARRIER_(); *p = value; } static __inline void gpr_atm_no_barrier_store(gpr_atm* p, gpr_atm value) { GPR_ATM_COMPILE_BARRIER_(); *p = value; } #undef GPR_ATM_LS_BARRIER_ #undef GPR_ATM_COMPILE_BARRIER_ #define gpr_atm_no_barrier_fetch_add(p, delta) \ gpr_atm_full_fetch_add((p), (delta)) #define gpr_atm_full_fetch_add(p, delta) (__sync_fetch_and_add((p), (delta))) #define gpr_atm_no_barrier_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n)) #define gpr_atm_acq_cas(p, o, n) (__sync_bool_compare_and_swap((p), (o), (n))) #define gpr_atm_rel_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n)) #define gpr_atm_full_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n)) static __inline gpr_atm gpr_atm_full_xchg(gpr_atm* p, gpr_atm n) { gpr_atm cur; do { cur = gpr_atm_acq_load(p); } while (!gpr_atm_rel_cas(p, cur, n)); return cur; } #endif /* GRPC_IMPL_CODEGEN_ATM_GCC_SYNC_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/atm_windows.h000066400000000000000000000102151334102242000266210ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_ATM_WINDOWS_H #define GRPC_IMPL_CODEGEN_ATM_WINDOWS_H /** Win32 variant of atm_platform.h */ #include typedef intptr_t gpr_atm; #define GPR_ATM_MAX INTPTR_MAX #define GPR_ATM_MIN INTPTR_MIN #define gpr_atm_full_barrier MemoryBarrier static __inline gpr_atm gpr_atm_acq_load(const gpr_atm* p) { gpr_atm result = *p; gpr_atm_full_barrier(); return result; } static __inline gpr_atm gpr_atm_no_barrier_load(const gpr_atm* p) { /* TODO(dklempner): Can we implement something better here? */ return gpr_atm_acq_load(p); } static __inline void gpr_atm_rel_store(gpr_atm* p, gpr_atm value) { gpr_atm_full_barrier(); *p = value; } static __inline void gpr_atm_no_barrier_store(gpr_atm* p, gpr_atm value) { /* TODO(ctiller): Can we implement something better here? */ gpr_atm_rel_store(p, value); } static __inline int gpr_atm_no_barrier_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { /** InterlockedCompareExchangePointerNoFence() not available on vista or windows7 */ #ifdef GPR_ARCH_64 return o == (gpr_atm)InterlockedCompareExchangeAcquire64( (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o); #else return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG*)p, (LONG)n, (LONG)o); #endif } static __inline int gpr_atm_acq_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { #ifdef GPR_ARCH_64 return o == (gpr_atm)InterlockedCompareExchangeAcquire64( (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o); #else return o == (gpr_atm)InterlockedCompareExchangeAcquire((volatile LONG*)p, (LONG)n, (LONG)o); #endif } static __inline int gpr_atm_rel_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { #ifdef GPR_ARCH_64 return o == (gpr_atm)InterlockedCompareExchangeRelease64( (volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o); #else return o == (gpr_atm)InterlockedCompareExchangeRelease((volatile LONG*)p, (LONG)n, (LONG)o); #endif } static __inline int gpr_atm_full_cas(gpr_atm* p, gpr_atm o, gpr_atm n) { #ifdef GPR_ARCH_64 return o == (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG*)p, (LONGLONG)n, (LONGLONG)o); #else return o == (gpr_atm)InterlockedCompareExchange((volatile LONG*)p, (LONG)n, (LONG)o); #endif } static __inline gpr_atm gpr_atm_no_barrier_fetch_add(gpr_atm* p, gpr_atm delta) { /** Use the CAS operation to get pointer-sized fetch and add */ gpr_atm old; do { old = *p; } while (!gpr_atm_no_barrier_cas(p, old, old + delta)); return old; } static __inline gpr_atm gpr_atm_full_fetch_add(gpr_atm* p, gpr_atm delta) { /** Use a CAS operation to get pointer-sized fetch and add */ gpr_atm old; #ifdef GPR_ARCH_64 do { old = *p; } while (old != (gpr_atm)InterlockedCompareExchange64((volatile LONGLONG*)p, (LONGLONG)old + delta, (LONGLONG)old)); #else do { old = *p; } while (old != (gpr_atm)InterlockedCompareExchange( (volatile LONG*)p, (LONG)old + delta, (LONG)old)); #endif return old; } static __inline gpr_atm gpr_atm_full_xchg(gpr_atm* p, gpr_atm n) { return (gpr_atm)InterlockedExchangePointer((PVOID*)p, (PVOID)n); } #endif /* GRPC_IMPL_CODEGEN_ATM_WINDOWS_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/byte_buffer.h000066400000000000000000000066041334102242000265710ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_BYTE_BUFFER_H #define GRPC_IMPL_CODEGEN_BYTE_BUFFER_H #include #include #ifdef __cplusplus extern "C" { #endif /** Returns a RAW byte buffer instance over the given slices (up to \a nslices). * * Increases the reference count for all \a slices processed. The user is * responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/ GRPCAPI grpc_byte_buffer* grpc_raw_byte_buffer_create(grpc_slice* slices, size_t nslices); /** Returns a *compressed* RAW byte buffer instance over the given slices (up to * \a nslices). The \a compression argument defines the compression algorithm * used to generate the data in \a slices. * * Increases the reference count for all \a slices processed. The user is * responsible for invoking grpc_byte_buffer_destroy on the returned instance.*/ GRPCAPI grpc_byte_buffer* grpc_raw_compressed_byte_buffer_create( grpc_slice* slices, size_t nslices, grpc_compression_algorithm compression); /** Copies input byte buffer \a bb. * * Increases the reference count of all the source slices. The user is * responsible for calling grpc_byte_buffer_destroy over the returned copy. */ GRPCAPI grpc_byte_buffer* grpc_byte_buffer_copy(grpc_byte_buffer* bb); /** Returns the size of the given byte buffer, in bytes. */ GRPCAPI size_t grpc_byte_buffer_length(grpc_byte_buffer* bb); /** Destroys \a byte_buffer deallocating all its memory. */ GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer* byte_buffer); /** Reader for byte buffers. Iterates over slices in the byte buffer */ struct grpc_byte_buffer_reader; typedef struct grpc_byte_buffer_reader grpc_byte_buffer_reader; /** Initialize \a reader to read over \a buffer. * Returns 1 upon success, 0 otherwise. */ GRPCAPI int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader, grpc_byte_buffer* buffer); /** Cleanup and destroy \a reader */ GRPCAPI void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader* reader); /** Updates \a slice with the next piece of data from from \a reader and returns * 1. Returns 0 at the end of the stream. Caller is responsible for calling * grpc_slice_unref on the result. */ GRPCAPI int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, grpc_slice* slice); /** Merge all data from \a reader into single slice */ GRPCAPI grpc_slice grpc_byte_buffer_reader_readall(grpc_byte_buffer_reader* reader); /** Returns a RAW byte buffer instance from the output of \a reader. */ GRPCAPI grpc_byte_buffer* grpc_raw_byte_buffer_from_reader( grpc_byte_buffer_reader* reader); #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_BYTE_BUFFER_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/byte_buffer_reader.h000066400000000000000000000022231334102242000301040ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H #define GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H #ifdef __cplusplus extern "C" { #endif struct grpc_byte_buffer; struct grpc_byte_buffer_reader { struct grpc_byte_buffer* buffer_in; struct grpc_byte_buffer* buffer_out; /** Different current objects correspond to different types of byte buffers */ union grpc_byte_buffer_reader_current { /** Index into a slice buffer's array of slices */ unsigned index; } current; }; #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_BYTE_BUFFER_READER_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/compression_types.h000066400000000000000000000075531334102242000300660ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_COMPRESSION_TYPES_H #define GRPC_IMPL_CODEGEN_COMPRESSION_TYPES_H #include #ifdef __cplusplus extern "C" { #endif /** To be used as initial metadata key for the request of a concrete compression * algorithm */ #define GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY \ "grpc-internal-encoding-request" /** To be used in channel arguments. * * \addtogroup grpc_arg_keys * \{ */ /** Default compression algorithm for the channel. * Its value is an int from the \a grpc_compression_algorithm enum. */ #define GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM \ "grpc.default_compression_algorithm" /** Default compression level for the channel. * Its value is an int from the \a grpc_compression_level enum. */ #define GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL "grpc.default_compression_level" /** Compression algorithms supported by the channel. * Its value is a bitset (an int). Bits correspond to algorithms in \a * grpc_compression_algorithm. For example, its LSB corresponds to * GRPC_COMPRESS_NONE, the next bit to GRPC_COMPRESS_DEFLATE, etc. * Unset bits disable support for the algorithm. By default all algorithms are * supported. It's not possible to disable GRPC_COMPRESS_NONE (the attempt will * be ignored). */ #define GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET \ "grpc.compression_enabled_algorithms_bitset" /** \} */ /** The various compression algorithms supported by gRPC */ typedef enum { GRPC_COMPRESS_NONE = 0, GRPC_COMPRESS_DEFLATE, GRPC_COMPRESS_GZIP, /* EXPERIMENTAL: Stream compression is currently experimental. */ GRPC_COMPRESS_STREAM_GZIP, /* TODO(ctiller): snappy */ GRPC_COMPRESS_ALGORITHMS_COUNT } grpc_compression_algorithm; /** Compression levels allow a party with knowledge of its peer's accepted * encodings to request compression in an abstract way. The level-algorithm * mapping is performed internally and depends on the peer's supported * compression algorithms. */ typedef enum { GRPC_COMPRESS_LEVEL_NONE = 0, GRPC_COMPRESS_LEVEL_LOW, GRPC_COMPRESS_LEVEL_MED, GRPC_COMPRESS_LEVEL_HIGH, GRPC_COMPRESS_LEVEL_COUNT } grpc_compression_level; typedef struct grpc_compression_options { /** All algs are enabled by default. This option corresponds to the channel * argument key behind \a GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET */ uint32_t enabled_algorithms_bitset; /** The default compression level. It'll be used in the absence of call * specific settings. This option corresponds to the channel * argument key behind \a GRPC_COMPRESSION_CHANNEL_DEFAULT_LEVEL. If present, * takes precedence over \a default_algorithm. * TODO(dgq): currently only available for server channels. */ struct grpc_compression_options_default_level { int is_set; grpc_compression_level level; } default_level; /** The default message compression algorithm. It'll be used in the absence of * call specific settings. This option corresponds to the channel argument key * behind \a GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM. */ struct grpc_compression_options_default_algorithm { int is_set; grpc_compression_algorithm algorithm; } default_algorithm; } grpc_compression_options; #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_COMPRESSION_TYPES_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/connectivity_state.h000066400000000000000000000023351334102242000302100ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_CONNECTIVITY_STATE_H #define GRPC_IMPL_CODEGEN_CONNECTIVITY_STATE_H #ifdef __cplusplus extern "C" { #endif /** Connectivity state of a channel. */ typedef enum { /** channel is idle */ GRPC_CHANNEL_IDLE, /** channel is connecting */ GRPC_CHANNEL_CONNECTING, /** channel is ready for work */ GRPC_CHANNEL_READY, /** channel has seen a failure but expects to recover */ GRPC_CHANNEL_TRANSIENT_FAILURE, /** channel has seen a failure that it cannot recover from */ GRPC_CHANNEL_SHUTDOWN } grpc_connectivity_state; #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_CONNECTIVITY_STATE_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/fork.h000066400000000000000000000023401334102242000252270ustar00rootroot00000000000000/* * * Copyright 2017 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_FORK_H #define GRPC_IMPL_CODEGEN_FORK_H /** * gRPC applications should call this before calling fork(). There should be no * active gRPC function calls between calling grpc_prefork() and * grpc_postfork_parent()/grpc_postfork_child(). * * * Typical use: * grpc_prefork(); * int pid = fork(); * if (pid) { * grpc_postfork_parent(); * // Parent process.. * } else { * grpc_postfork_child(); * // Child process... * } */ void grpc_prefork(void); void grpc_postfork_parent(void); void grpc_postfork_child(void); void grpc_fork_handlers_auto_register(void); #endif /* GRPC_IMPL_CODEGEN_FORK_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/gpr_slice.h000066400000000000000000000055311334102242000262420ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_GPR_SLICE_H #define GRPC_IMPL_CODEGEN_GPR_SLICE_H /** WARNING: Please do not use this header. This was added as a temporary * measure to not break some of the external projects that depend on * gpr_slice_* functions. We are actively working on moving all the * gpr_slice_* references to grpc_slice_* and this file will be removed */ /* TODO (sreek) - Allowed by default but will be very soon turned off */ #define GRPC_ALLOW_GPR_SLICE_FUNCTIONS 1 #ifdef GRPC_ALLOW_GPR_SLICE_FUNCTIONS #define gpr_slice_refcount grpc_slice_refcount #define gpr_slice grpc_slice #define gpr_slice_buffer grpc_slice_buffer #define gpr_slice_ref grpc_slice_ref #define gpr_slice_unref grpc_slice_unref #define gpr_slice_new grpc_slice_new #define gpr_slice_new_with_user_data grpc_slice_new_with_user_data #define gpr_slice_new_with_len grpc_slice_new_with_len #define gpr_slice_malloc grpc_slice_malloc #define gpr_slice_from_copied_string grpc_slice_from_copied_string #define gpr_slice_from_copied_buffer grpc_slice_from_copied_buffer #define gpr_slice_from_static_string grpc_slice_from_static_string #define gpr_slice_sub grpc_slice_sub #define gpr_slice_sub_no_ref grpc_slice_sub_no_ref #define gpr_slice_split_tail grpc_slice_split_tail #define gpr_slice_split_head grpc_slice_split_head #define gpr_slice_cmp grpc_slice_cmp #define gpr_slice_str_cmp grpc_slice_str_cmp #define gpr_slice_buffer grpc_slice_buffer #define gpr_slice_buffer_init grpc_slice_buffer_init #define gpr_slice_buffer_destroy grpc_slice_buffer_destroy #define gpr_slice_buffer_add grpc_slice_buffer_add #define gpr_slice_buffer_add_indexed grpc_slice_buffer_add_indexed #define gpr_slice_buffer_addn grpc_slice_buffer_addn #define gpr_slice_buffer_tiny_add grpc_slice_buffer_tiny_add #define gpr_slice_buffer_pop grpc_slice_buffer_pop #define gpr_slice_buffer_reset_and_unref grpc_slice_buffer_reset_and_unref #define gpr_slice_buffer_swap grpc_slice_buffer_swap #define gpr_slice_buffer_move_into grpc_slice_buffer_move_into #define gpr_slice_buffer_trim_end grpc_slice_buffer_trim_end #define gpr_slice_buffer_move_first grpc_slice_buffer_move_first #define gpr_slice_buffer_take_first grpc_slice_buffer_take_first #endif /* GRPC_ALLOW_GPR_SLICE_FUNCTIONS */ #endif /* GRPC_IMPL_CODEGEN_GPR_SLICE_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/gpr_types.h000066400000000000000000000033631334102242000263100ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_GPR_TYPES_H #define GRPC_IMPL_CODEGEN_GPR_TYPES_H #include #include #ifdef __cplusplus extern "C" { #endif /** The clocks we support. */ typedef enum { /** Monotonic clock. Epoch undefined. Always moves forwards. */ GPR_CLOCK_MONOTONIC = 0, /** Realtime clock. May jump forwards or backwards. Settable by the system administrator. Has its epoch at 0:00:00 UTC 1 Jan 1970. */ GPR_CLOCK_REALTIME, /** CPU cycle time obtained by rdtsc instruction on x86 platforms. Epoch undefined. Degrades to GPR_CLOCK_REALTIME on other platforms. */ GPR_CLOCK_PRECISE, /** Unmeasurable clock type: no base, created by taking the difference between two times */ GPR_TIMESPAN } gpr_clock_type; /** Analogous to struct timespec. On some machines, absolute times may be in * local time. */ typedef struct gpr_timespec { int64_t tv_sec; int32_t tv_nsec; /** Against which clock was this time measured? (or GPR_TIMESPAN if this is a relative time meaure) */ gpr_clock_type clock_type; } gpr_timespec; #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_GPR_TYPES_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/grpc_types.h000066400000000000000000000741241334102242000264560ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_GRPC_TYPES_H #define GRPC_IMPL_CODEGEN_GRPC_TYPES_H #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef enum { GRPC_BB_RAW /** Future types may include GRPC_BB_PROTOBUF, etc. */ } grpc_byte_buffer_type; typedef struct grpc_byte_buffer { void* reserved; grpc_byte_buffer_type type; union grpc_byte_buffer_data { struct /* internal */ { void* reserved[8]; } reserved; struct grpc_compressed_buffer { grpc_compression_algorithm compression; grpc_slice_buffer slice_buffer; } raw; } data; } grpc_byte_buffer; /** Completion Queues enable notification of the completion of * asynchronous actions. */ typedef struct grpc_completion_queue grpc_completion_queue; /** An alarm associated with a completion queue. */ typedef struct grpc_alarm grpc_alarm; /** The Channel interface allows creation of Call objects. */ typedef struct grpc_channel grpc_channel; /** A server listens to some port and responds to request calls */ typedef struct grpc_server grpc_server; /** A Call represents an RPC. When created, it is in a configuration state allowing properties to be set until it is invoked. After invoke, the Call can have messages written to it and read from it. */ typedef struct grpc_call grpc_call; /** The Socket Mutator interface allows changes on socket options */ typedef struct grpc_socket_mutator grpc_socket_mutator; /** The Socket Factory interface creates and binds sockets */ typedef struct grpc_socket_factory grpc_socket_factory; /** Type specifier for grpc_arg */ typedef enum { GRPC_ARG_STRING, GRPC_ARG_INTEGER, GRPC_ARG_POINTER } grpc_arg_type; typedef struct grpc_arg_pointer_vtable { void* (*copy)(void* p); void (*destroy)(void* p); int (*cmp)(void* p, void* q); } grpc_arg_pointer_vtable; /** A single argument... each argument has a key and a value A note on naming keys: Keys are namespaced into groups, usually grouped by library, and are keys for module XYZ are named XYZ.key1, XYZ.key2, etc. Module names must be restricted to the regex [A-Za-z][_A-Za-z0-9]{,15}. Key names must be restricted to the regex [A-Za-z][_A-Za-z0-9]{,47}. GRPC core library keys are prefixed by grpc. Library authors are strongly encouraged to \#define symbolic constants for their keys so that it's possible to change them in the future. */ typedef struct { grpc_arg_type type; char* key; union grpc_arg_value { char* string; int integer; struct grpc_arg_pointer { void* p; const grpc_arg_pointer_vtable* vtable; } pointer; } value; } grpc_arg; /** An array of arguments that can be passed around. Used to set optional channel-level configuration. These configuration options are modelled as key-value pairs as defined by grpc_arg; keys are strings to allow easy backwards-compatible extension by arbitrary parties. All evaluation is performed at channel creation time (i.e. the keys and values in this structure need only live through the creation invocation). However, if one of the args has grpc_arg_type==GRPC_ARG_POINTER, then the grpc_arg_pointer_vtable must live until the channel args are done being used by core (i.e. when the object for use with which they were passed is destroyed). See the description of the \ref grpc_arg_keys "available args" for more details. */ typedef struct { size_t num_args; grpc_arg* args; } grpc_channel_args; /** \defgroup grpc_arg_keys * Channel argument keys. * \{ */ /** If non-zero, enable census for tracing and stats collection. */ #define GRPC_ARG_ENABLE_CENSUS "grpc.census" /** If non-zero, enable load reporting. */ #define GRPC_ARG_ENABLE_LOAD_REPORTING "grpc.loadreporting" /** Request that optional features default to off (regardless of what they usually default to) - to enable tight control over what gets enabled */ #define GRPC_ARG_MINIMAL_STACK "grpc.minimal_stack" /** Maximum number of concurrent incoming streams to allow on a http2 connection. Int valued. */ #define GRPC_ARG_MAX_CONCURRENT_STREAMS "grpc.max_concurrent_streams" /** Maximum message length that the channel can receive. Int valued, bytes. -1 means unlimited. */ #define GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH "grpc.max_receive_message_length" /** \deprecated For backward compatibility. * Use GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH instead. */ #define GRPC_ARG_MAX_MESSAGE_LENGTH GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH /** Maximum message length that the channel can send. Int valued, bytes. -1 means unlimited. */ #define GRPC_ARG_MAX_SEND_MESSAGE_LENGTH "grpc.max_send_message_length" /** Maximum time that a channel may have no outstanding rpcs. Int valued, milliseconds. INT_MAX means unlimited. */ #define GRPC_ARG_MAX_CONNECTION_IDLE_MS "grpc.max_connection_idle_ms" /** Maximum time that a channel may exist. Int valued, milliseconds. * INT_MAX means unlimited. */ #define GRPC_ARG_MAX_CONNECTION_AGE_MS "grpc.max_connection_age_ms" /** Grace period after the chennel reaches its max age. Int valued, milliseconds. INT_MAX means unlimited. */ #define GRPC_ARG_MAX_CONNECTION_AGE_GRACE_MS "grpc.max_connection_age_grace_ms" /** Enable/disable support for per-message compression. Defaults to 1, unless GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0. */ #define GRPC_ARG_ENABLE_PER_MESSAGE_COMPRESSION "grpc.per_message_compression" /** Enable/disable support for deadline checking. Defaults to 1, unless GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0 */ #define GRPC_ARG_ENABLE_DEADLINE_CHECKS "grpc.enable_deadline_checking" /** Initial stream ID for http2 transports. Int valued. */ #define GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER \ "grpc.http2.initial_sequence_number" /** Amount to read ahead on individual streams. Defaults to 64kb, larger values can help throughput on high-latency connections. NOTE: at some point we'd like to auto-tune this, and this parameter will become a no-op. Int valued, bytes. */ #define GRPC_ARG_HTTP2_STREAM_LOOKAHEAD_BYTES "grpc.http2.lookahead_bytes" /** How much memory to use for hpack decoding. Int valued, bytes. */ #define GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_DECODER \ "grpc.http2.hpack_table_size.decoder" /** How much memory to use for hpack encoding. Int valued, bytes. */ #define GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_ENCODER \ "grpc.http2.hpack_table_size.encoder" /** How big a frame are we willing to receive via HTTP2. Min 16384, max 16777215. Larger values give lower CPU usage for large messages, but more head of line blocking for small messages. */ #define GRPC_ARG_HTTP2_MAX_FRAME_SIZE "grpc.http2.max_frame_size" /** Should BDP probing be performed? */ #define GRPC_ARG_HTTP2_BDP_PROBE "grpc.http2.bdp_probe" /** Minimum time between sending successive ping frames without receiving any data frame, Int valued, milliseconds. */ #define GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS \ "grpc.http2.min_time_between_pings_ms" /** Minimum allowed time between a server receiving successive ping frames without sending any data frame. Int valued, milliseconds */ #define GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS \ "grpc.http2.min_ping_interval_without_data_ms" /** Channel arg to override the http2 :scheme header */ #define GRPC_ARG_HTTP2_SCHEME "grpc.http2_scheme" /** How many pings can we send before needing to send a data frame or header frame? (0 indicates that an infinite number of pings can be sent without sending a data frame or header frame) */ #define GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA \ "grpc.http2.max_pings_without_data" /** How many misbehaving pings the server can bear before sending goaway and closing the transport? (0 indicates that the server can bear an infinite number of misbehaving pings) */ #define GRPC_ARG_HTTP2_MAX_PING_STRIKES "grpc.http2.max_ping_strikes" /** How much data are we willing to queue up per stream if GRPC_WRITE_BUFFER_HINT is set? This is an upper bound */ #define GRPC_ARG_HTTP2_WRITE_BUFFER_SIZE "grpc.http2.write_buffer_size" /** Should we allow receipt of true-binary data on http2 connections? Defaults to on (1) */ #define GRPC_ARG_HTTP2_ENABLE_TRUE_BINARY "grpc.http2.true_binary" /** After a duration of this time the client/server pings its peer to see if the transport is still alive. Int valued, milliseconds. */ #define GRPC_ARG_KEEPALIVE_TIME_MS "grpc.keepalive_time_ms" /** After waiting for a duration of this time, if the keepalive ping sender does not receive the ping ack, it will close the transport. Int valued, milliseconds. */ #define GRPC_ARG_KEEPALIVE_TIMEOUT_MS "grpc.keepalive_timeout_ms" /** Is it permissible to send keepalive pings without any outstanding streams. Int valued, 0(false)/1(true). */ #define GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS \ "grpc.keepalive_permit_without_calls" /** Default authority to pass if none specified on call construction. A string. * */ #define GRPC_ARG_DEFAULT_AUTHORITY "grpc.default_authority" /** Primary user agent: goes at the start of the user-agent metadata sent on each request. A string. */ #define GRPC_ARG_PRIMARY_USER_AGENT_STRING "grpc.primary_user_agent" /** Secondary user agent: goes at the end of the user-agent metadata sent on each request. A string. */ #define GRPC_ARG_SECONDARY_USER_AGENT_STRING "grpc.secondary_user_agent" /** The minimum time between subsequent connection attempts, in ms */ #define GRPC_ARG_MIN_RECONNECT_BACKOFF_MS "grpc.min_reconnect_backoff_ms" /** The maximum time between subsequent connection attempts, in ms */ #define GRPC_ARG_MAX_RECONNECT_BACKOFF_MS "grpc.max_reconnect_backoff_ms" /** The time between the first and second connection attempts, in ms */ #define GRPC_ARG_INITIAL_RECONNECT_BACKOFF_MS \ "grpc.initial_reconnect_backoff_ms" /** Minimum amount of time between DNS resolutions, in ms */ #define GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS \ "grpc.dns_min_time_between_resolutions_ms" /** The timeout used on servers for finishing handshaking on an incoming connection. Defaults to 120 seconds. */ #define GRPC_ARG_SERVER_HANDSHAKE_TIMEOUT_MS "grpc.server_handshake_timeout_ms" /** This *should* be used for testing only. The caller of the secure_channel_create functions may override the target name used for SSL host name checking using this channel argument which is of type \a GRPC_ARG_STRING. If this argument is not specified, the name used for SSL host name checking will be the target parameter (assuming that the secure channel is an SSL channel). If this parameter is specified and the underlying is not an SSL channel, it will just be ignored. */ #define GRPC_SSL_TARGET_NAME_OVERRIDE_ARG "grpc.ssl_target_name_override" /** If non-zero, a pointer to a session cache (a pointer of type grpc_ssl_session_cache*). (use grpc_ssl_session_cache_arg_vtable() to fetch an appropriate pointer arg vtable) */ #define GRPC_SSL_SESSION_CACHE_ARG "grpc.ssl_session_cache" /** Maximum metadata size, in bytes. Note this limit applies to the max sum of all metadata key-value entries in a batch of headers. */ #define GRPC_ARG_MAX_METADATA_SIZE "grpc.max_metadata_size" /** If non-zero, allow the use of SO_REUSEPORT if it's available (default 1) */ #define GRPC_ARG_ALLOW_REUSEPORT "grpc.so_reuseport" /** If non-zero, a pointer to a buffer pool (a pointer of type * grpc_resource_quota*). (use grpc_resource_quota_arg_vtable() to fetch an * appropriate pointer arg vtable) */ #define GRPC_ARG_RESOURCE_QUOTA "grpc.resource_quota" /** If non-zero, expand wildcard addresses to a list of local addresses. */ #define GRPC_ARG_EXPAND_WILDCARD_ADDRS "grpc.expand_wildcard_addrs" /** Service config data in JSON form. This value will be ignored if the name resolver returns a service config. */ #define GRPC_ARG_SERVICE_CONFIG "grpc.service_config" /** Disable looking up the service config via the name resolver. */ #define GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION \ "grpc.service_config_disable_resolution" /** LB policy name. */ #define GRPC_ARG_LB_POLICY_NAME "grpc.lb_policy_name" /** The grpc_socket_mutator instance that set the socket options. A pointer. */ #define GRPC_ARG_SOCKET_MUTATOR "grpc.socket_mutator" /** The grpc_socket_factory instance to create and bind sockets. A pointer. */ #define GRPC_ARG_SOCKET_FACTORY "grpc.socket_factory" /** The maximum number of trace events to keep in the tracer for each channel or * subchannel. The default is 10. If set to 0, channel tracing is disabled. */ #define GRPC_ARG_MAX_CHANNEL_TRACE_EVENTS_PER_NODE \ "grpc.max_channel_trace_events_per_node" /** If non-zero, gRPC library will track stats and information at at per channel * level. Disabling channelz naturally disables channel tracing. The default * is for channelz to be disabled. */ #define GRPC_ARG_ENABLE_CHANNELZ "grpc.enable_channelz" /** If non-zero, Cronet transport will coalesce packets to fewer frames * when possible. */ #define GRPC_ARG_USE_CRONET_PACKET_COALESCING \ "grpc.use_cronet_packet_coalescing" /** Channel arg (integer) setting how large a slice to try and read from the wire each time recvmsg (or equivalent) is called **/ #define GRPC_ARG_TCP_READ_CHUNK_SIZE "grpc.experimental.tcp_read_chunk_size" /** Note this is not a "channel arg" key. This is the default slice size to use * when trying to read from the wire if the GRPC_ARG_TCP_READ_CHUNK_SIZE * channel arg is unspecified. */ #define GRPC_TCP_DEFAULT_READ_SLICE_SIZE 8192 #define GRPC_ARG_TCP_MIN_READ_CHUNK_SIZE \ "grpc.experimental.tcp_min_read_chunk_size" #define GRPC_ARG_TCP_MAX_READ_CHUNK_SIZE \ "grpc.experimental.tcp_max_read_chunk_size" /* Timeout in milliseconds to use for calls to the grpclb load balancer. If 0 or unset, the balancer calls will have no deadline. */ #define GRPC_ARG_GRPCLB_CALL_TIMEOUT_MS "grpc.grpclb_call_timeout_ms" /* Timeout in milliseconds to wait for the serverlist from the grpclb load balancer before using fallback backend addresses from the resolver. If 0, fallback will never be used. Default value is 10000. */ #define GRPC_ARG_GRPCLB_FALLBACK_TIMEOUT_MS "grpc.grpclb_fallback_timeout_ms" /** If non-zero, grpc server's cronet compression workaround will be enabled */ #define GRPC_ARG_WORKAROUND_CRONET_COMPRESSION \ "grpc.workaround.cronet_compression" /** String defining the optimization target for a channel. Can be: "latency" - attempt to minimize latency at the cost of throughput "blend" - try to balance latency and throughput "throughput" - attempt to maximize throughput at the expense of latency Defaults to "blend". In the current implementation "blend" is equivalent to "latency". */ #define GRPC_ARG_OPTIMIZATION_TARGET "grpc.optimization_target" /** If set to zero, disables retry behavior. Otherwise, transparent retries are enabled for all RPCs, and configurable retries are enabled when they are configured via the service config. For details, see: https://github.com/grpc/proposal/blob/master/A6-client-retries.md */ #define GRPC_ARG_ENABLE_RETRIES "grpc.enable_retries" /** Per-RPC retry buffer size, in bytes. Default is 256 KiB. */ #define GRPC_ARG_PER_RPC_RETRY_BUFFER_SIZE "grpc.per_rpc_retry_buffer_size" /** Channel arg that carries the bridged objective c object for custom metrics * logging filter. */ #define GRPC_ARG_MOBILE_LOG_CONTEXT "grpc.mobile_log_context" /** If non-zero, client authority filter is disabled for the channel */ #define GRPC_ARG_DISABLE_CLIENT_AUTHORITY_FILTER \ "grpc.disable_client_authority_filter" /** If set to zero, disables use of http proxies. Enabled by default. */ #define GRPC_ARG_ENABLE_HTTP_PROXY "grpc.enable_http_proxy" /** \} */ /** Result of a grpc call. If the caller satisfies the prerequisites of a particular operation, the grpc_call_error returned will be GRPC_CALL_OK. Receiving any other value listed here is an indication of a bug in the caller. */ typedef enum grpc_call_error { /** everything went ok */ GRPC_CALL_OK = 0, /** something failed, we don't know what */ GRPC_CALL_ERROR, /** this method is not available on the server */ GRPC_CALL_ERROR_NOT_ON_SERVER, /** this method is not available on the client */ GRPC_CALL_ERROR_NOT_ON_CLIENT, /** this method must be called before server_accept */ GRPC_CALL_ERROR_ALREADY_ACCEPTED, /** this method must be called before invoke */ GRPC_CALL_ERROR_ALREADY_INVOKED, /** this method must be called after invoke */ GRPC_CALL_ERROR_NOT_INVOKED, /** this call is already finished (writes_done or write_status has already been called) */ GRPC_CALL_ERROR_ALREADY_FINISHED, /** there is already an outstanding read/write operation on the call */ GRPC_CALL_ERROR_TOO_MANY_OPERATIONS, /** the flags value was illegal for this call */ GRPC_CALL_ERROR_INVALID_FLAGS, /** invalid metadata was passed to this call */ GRPC_CALL_ERROR_INVALID_METADATA, /** invalid message was passed to this call */ GRPC_CALL_ERROR_INVALID_MESSAGE, /** completion queue for notification has not been registered * with the server */ GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE, /** this batch of operations leads to more operations than allowed */ GRPC_CALL_ERROR_BATCH_TOO_BIG, /** payload type requested is not the type registered */ GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH, /** completion queue has been shutdown */ GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN } grpc_call_error; /** Default send/receive message size limits in bytes. -1 for unlimited. */ /** TODO(roth) Make this match the default receive limit after next release */ #define GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH -1 #define GRPC_DEFAULT_MAX_RECV_MESSAGE_LENGTH (4 * 1024 * 1024) /** Write Flags: */ /** Hint that the write may be buffered and need not go out on the wire immediately. GRPC is free to buffer the message until the next non-buffered write, or until writes_done, but it need not buffer completely or at all. */ #define GRPC_WRITE_BUFFER_HINT (0x00000001u) /** Force compression to be disabled for a particular write (start_write/add_metadata). Illegal on invoke/accept. */ #define GRPC_WRITE_NO_COMPRESS (0x00000002u) /** Force this message to be written to the socket before completing it */ #define GRPC_WRITE_THROUGH (0x00000004u) /** Mask of all valid flags. */ #define GRPC_WRITE_USED_MASK \ (GRPC_WRITE_BUFFER_HINT | GRPC_WRITE_NO_COMPRESS | GRPC_WRITE_THROUGH) /** Initial metadata flags */ /** Signal that the call is idempotent */ #define GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST (0x00000010u) /** Signal that the call should not return UNAVAILABLE before it has started */ #define GRPC_INITIAL_METADATA_WAIT_FOR_READY (0x00000020u) /** Signal that the call is cacheable. GRPC is free to use GET verb */ #define GRPC_INITIAL_METADATA_CACHEABLE_REQUEST (0x00000040u) /** Signal that GRPC_INITIAL_METADATA_WAIT_FOR_READY was explicitly set by the calling application. */ #define GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET (0x00000080u) /** Signal that the initial metadata should be corked */ #define GRPC_INITIAL_METADATA_CORKED (0x00000100u) /** Mask of all valid flags */ #define GRPC_INITIAL_METADATA_USED_MASK \ (GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST | \ GRPC_INITIAL_METADATA_WAIT_FOR_READY | \ GRPC_INITIAL_METADATA_CACHEABLE_REQUEST | \ GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET | \ GRPC_INITIAL_METADATA_CORKED | GRPC_WRITE_THROUGH) /** A single metadata element */ typedef struct grpc_metadata { /** the key, value values are expected to line up with grpc_mdelem: if changing them, update metadata.h at the same time. */ grpc_slice key; grpc_slice value; uint32_t flags; /** The following fields are reserved for grpc internal use. There is no need to initialize them, and they will be set to garbage during calls to grpc. */ struct /* internal */ { void* obfuscated[4]; } internal_data; } grpc_metadata; /** The type of completion (for grpc_event) */ typedef enum grpc_completion_type { /** Shutting down */ GRPC_QUEUE_SHUTDOWN, /** No event before timeout */ GRPC_QUEUE_TIMEOUT, /** Operation completion */ GRPC_OP_COMPLETE } grpc_completion_type; /** The result of an operation. Returned by a completion queue when the operation started with tag. */ typedef struct grpc_event { /** The type of the completion. */ grpc_completion_type type; /** If the grpc_completion_type is GRPC_OP_COMPLETE, this field indicates whether the operation was successful or not; 0 in case of failure and non-zero in case of success. If grpc_completion_type is GRPC_QUEUE_SHUTDOWN or GRPC_QUEUE_TIMEOUT, this field is guaranteed to be 0 */ int success; /** The tag passed to grpc_call_start_batch etc to start this operation. Only GRPC_OP_COMPLETE has a tag. */ void* tag; } grpc_event; typedef struct { size_t count; size_t capacity; grpc_metadata* metadata; } grpc_metadata_array; typedef struct { grpc_slice method; grpc_slice host; gpr_timespec deadline; uint32_t flags; void* reserved; } grpc_call_details; typedef enum { /** Send initial metadata: one and only one instance MUST be sent for each call, unless the call was cancelled - in which case this can be skipped. This op completes after all bytes of metadata have been accepted by outgoing flow control. */ GRPC_OP_SEND_INITIAL_METADATA = 0, /** Send a message: 0 or more of these operations can occur for each call. This op completes after all bytes for the message have been accepted by outgoing flow control. */ GRPC_OP_SEND_MESSAGE, /** Send a close from the client: one and only one instance MUST be sent from the client, unless the call was cancelled - in which case this can be skipped. This op completes after all bytes for the call (including the close) have passed outgoing flow control. */ GRPC_OP_SEND_CLOSE_FROM_CLIENT, /** Send status from the server: one and only one instance MUST be sent from the server unless the call was cancelled - in which case this can be skipped. This op completes after all bytes for the call (including the status) have passed outgoing flow control. */ GRPC_OP_SEND_STATUS_FROM_SERVER, /** Receive initial metadata: one and only one MUST be made on the client, must not be made on the server. This op completes after all initial metadata has been read from the peer. */ GRPC_OP_RECV_INITIAL_METADATA, /** Receive a message: 0 or more of these operations can occur for each call. This op completes after all bytes of the received message have been read, or after a half-close has been received on this call. */ GRPC_OP_RECV_MESSAGE, /** Receive status on the client: one and only one must be made on the client. This operation always succeeds, meaning ops paired with this operation will also appear to succeed, even though they may not have. In that case the status will indicate some failure. This op completes after all activity on the call has completed. */ GRPC_OP_RECV_STATUS_ON_CLIENT, /** Receive close on the server: one and only one must be made on the server. This op completes after the close has been received by the server. This operation always succeeds, meaning ops paired with this operation will also appear to succeed, even though they may not have. */ GRPC_OP_RECV_CLOSE_ON_SERVER } grpc_op_type; struct grpc_byte_buffer; /** Operation data: one field for each op type (except SEND_CLOSE_FROM_CLIENT which has no arguments) */ typedef struct grpc_op { /** Operation type, as defined by grpc_op_type */ grpc_op_type op; /** Write flags bitset for grpc_begin_messages */ uint32_t flags; /** Reserved for future usage */ void* reserved; union grpc_op_data { /** Reserved for future usage */ struct /* internal */ { void* reserved[8]; } reserved; struct grpc_op_send_initial_metadata { size_t count; grpc_metadata* metadata; /** If \a is_set, \a compression_level will be used for the call. * Otherwise, \a compression_level won't be considered */ struct grpc_op_send_initial_metadata_maybe_compression_level { uint8_t is_set; grpc_compression_level level; } maybe_compression_level; } send_initial_metadata; struct grpc_op_send_message { /** This op takes ownership of the slices in send_message. After * a call completes, the contents of send_message are not guaranteed * and likely empty. The original owner should still call * grpc_byte_buffer_destroy() on this object however. */ struct grpc_byte_buffer* send_message; } send_message; struct grpc_op_send_status_from_server { size_t trailing_metadata_count; grpc_metadata* trailing_metadata; grpc_status_code status; /** optional: set to NULL if no details need sending, non-NULL if they do * pointer will not be retained past the start_batch call */ grpc_slice* status_details; } send_status_from_server; /** ownership of the array is with the caller, but ownership of the elements stays with the call object (ie key, value members are owned by the call object, recv_initial_metadata->array is owned by the caller). After the operation completes, call grpc_metadata_array_destroy on this value, or reuse it in a future op. */ struct grpc_op_recv_initial_metadata { grpc_metadata_array* recv_initial_metadata; } recv_initial_metadata; /** ownership of the byte buffer is moved to the caller; the caller must call grpc_byte_buffer_destroy on this value, or reuse it in a future op. The returned byte buffer will be NULL if trailing metadata was received instead of a message. */ struct grpc_op_recv_message { struct grpc_byte_buffer** recv_message; } recv_message; struct grpc_op_recv_status_on_client { /** ownership of the array is with the caller, but ownership of the elements stays with the call object (ie key, value members are owned by the call object, trailing_metadata->array is owned by the caller). After the operation completes, call grpc_metadata_array_destroy on this value, or reuse it in a future op. */ grpc_metadata_array* trailing_metadata; grpc_status_code* status; grpc_slice* status_details; /** If this is not nullptr, it will be populated with the full fidelity * error string for debugging purposes. The application is responsible * for freeing the data by using gpr_free(). */ const char** error_string; } recv_status_on_client; struct grpc_op_recv_close_on_server { /** out argument, set to 1 if the call failed in any way (seen as a cancellation on the server), or 0 if the call succeeded */ int* cancelled; } recv_close_on_server; } data; } grpc_op; /** Information requested from the channel. */ typedef struct { /** If non-NULL, will be set to point to a string indicating the LB * policy name. Caller takes ownership. */ char** lb_policy_name; /** If non-NULL, will be set to point to a string containing the * service config used by the channel in JSON form. */ char** service_config_json; } grpc_channel_info; typedef struct grpc_resource_quota grpc_resource_quota; /** Completion queues internally MAY maintain a set of file descriptors in a structure called 'pollset'. This enum specifies if a completion queue has an associated pollset and any restrictions on the type of file descriptors that can be present in the pollset. I/O progress can only be made when grpc_completion_queue_next() or grpc_completion_queue_pluck() are called on the completion queue (unless the grpc_cq_polling_type is GRPC_CQ_NON_POLLING) and hence it is very important to actively call these APIs */ typedef enum { /** The completion queue will have an associated pollset and there is no restriction on the type of file descriptors the pollset may contain */ GRPC_CQ_DEFAULT_POLLING, /** Similar to GRPC_CQ_DEFAULT_POLLING except that the completion queues will not contain any 'listening file descriptors' (i.e file descriptors used to listen to incoming channels) */ GRPC_CQ_NON_LISTENING, /** The completion queue will not have an associated pollset. Note that grpc_completion_queue_next() or grpc_completion_queue_pluck() MUST still be called to pop events from the completion queue; it is not required to call them actively to make I/O progress */ GRPC_CQ_NON_POLLING } grpc_cq_polling_type; /** Specifies the type of APIs to use to pop events from the completion queue */ typedef enum { /** Events are popped out by calling grpc_completion_queue_next() API ONLY */ GRPC_CQ_NEXT, /** Events are popped out by calling grpc_completion_queue_pluck() API ONLY*/ GRPC_CQ_PLUCK } grpc_cq_completion_type; #define GRPC_CQ_CURRENT_VERSION 1 typedef struct grpc_completion_queue_attributes { /** The version number of this structure. More fields might be added to this structure in future. */ int version; /** Set to GRPC_CQ_CURRENT_VERSION */ grpc_cq_completion_type cq_completion_type; grpc_cq_polling_type cq_polling_type; } grpc_completion_queue_attributes; /** The completion queue factory structure is opaque to the callers of grpc */ typedef struct grpc_completion_queue_factory grpc_completion_queue_factory; #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_GRPC_TYPES_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/log.h000066400000000000000000000067161334102242000250620ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_LOG_H #define GRPC_IMPL_CODEGEN_LOG_H #include #include #include /* for abort() */ #ifdef __cplusplus extern "C" { #endif /** GPR log API. Usage (within grpc): int argument1 = 3; char* argument2 = "hello"; gpr_log(GPR_DEBUG, "format string %d", argument1); gpr_log(GPR_INFO, "hello world"); gpr_log(GPR_ERROR, "%d %s!!", argument1, argument2); */ /** The severity of a log message - use the #defines below when calling into gpr_log to additionally supply file and line data */ typedef enum gpr_log_severity { GPR_LOG_SEVERITY_DEBUG, GPR_LOG_SEVERITY_INFO, GPR_LOG_SEVERITY_ERROR } gpr_log_severity; #define GPR_LOG_VERBOSITY_UNSET -1 /** Returns a string representation of the log severity */ GPRAPI const char* gpr_log_severity_string(gpr_log_severity severity); /** Macros to build log contexts at various severity levels */ #define GPR_DEBUG __FILE__, __LINE__, GPR_LOG_SEVERITY_DEBUG #define GPR_INFO __FILE__, __LINE__, GPR_LOG_SEVERITY_INFO #define GPR_ERROR __FILE__, __LINE__, GPR_LOG_SEVERITY_ERROR /** Log a message. It's advised to use GPR_xxx above to generate the context * for each message */ GPRAPI void gpr_log(const char* file, int line, gpr_log_severity severity, const char* format, ...) GPR_PRINT_FORMAT_CHECK(4, 5); GPRAPI int gpr_should_log(gpr_log_severity severity); GPRAPI void gpr_log_message(const char* file, int line, gpr_log_severity severity, const char* message); /** Set global log verbosity */ GPRAPI void gpr_set_log_verbosity(gpr_log_severity min_severity_to_print); GPRAPI void gpr_log_verbosity_init(void); /** Log overrides: applications can use this API to intercept logging calls and use their own implementations */ struct gpr_log_func_args { const char* file; int line; gpr_log_severity severity; const char* message; }; typedef struct gpr_log_func_args gpr_log_func_args; typedef void (*gpr_log_func)(gpr_log_func_args* args); GPRAPI void gpr_set_log_function(gpr_log_func func); /** abort() the process if x is zero, having written a line to the log. Intended for internal invariants. If the error can be recovered from, without the possibility of corruption, or might best be reflected via an exception in a higher-level language, consider returning error code. */ #define GPR_ASSERT(x) \ do { \ if (GPR_UNLIKELY(!(x))) { \ gpr_log(GPR_ERROR, "assertion failed: %s", #x); \ abort(); \ } \ } while (0) #ifndef NDEBUG #define GPR_DEBUG_ASSERT(x) GPR_ASSERT(x) #else #define GPR_DEBUG_ASSERT(x) #endif #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_LOG_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/port_platform.h000066400000000000000000000352311334102242000271630ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_PORT_PLATFORM_H #define GRPC_IMPL_CODEGEN_PORT_PLATFORM_H /* * Define GPR_BACKWARDS_COMPATIBILITY_MODE to try harder to be ABI * compatible with older platforms (currently only on Linux) * Causes: * - some libc calls to be gotten via dlsym * - some syscalls to be made directly */ /* Get windows.h included everywhere (we need it) */ #if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32) #ifndef WIN32_LEAN_AND_MEAN #define GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED #define WIN32_LEAN_AND_MEAN #endif /* WIN32_LEAN_AND_MEAN */ #ifndef NOMINMAX #define GRPC_NOMINMX_WAS_NOT_DEFINED #define NOMINMAX #endif /* NOMINMAX */ #ifndef _WIN32_WINNT #error \ "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)" #else /* !defined(_WIN32_WINNT) */ #if (_WIN32_WINNT < 0x0600) #error \ "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)" #endif /* _WIN32_WINNT < 0x0600 */ #endif /* defined(_WIN32_WINNT) */ #include #ifdef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED #undef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED #undef WIN32_LEAN_AND_MEAN #endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */ #ifdef GRPC_NOMINMAX_WAS_NOT_DEFINED #undef GRPC_NOMINMAX_WAS_NOT_DEFINED #undef NOMINMAX #endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */ #endif /* defined(_WIN64) || defined(WIN64) || defined(_WIN32) || \ defined(WIN32) */ /* Override this file with one for your platform if you need to redefine things. */ #if !defined(GPR_NO_AUTODETECT_PLATFORM) #if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32) #if defined(_WIN64) || defined(WIN64) #define GPR_ARCH_64 1 #else #define GPR_ARCH_32 1 #endif #define GPR_PLATFORM_STRING "windows" #define GPR_WINDOWS 1 #define GPR_WINDOWS_SUBPROCESS 1 #define GPR_WINDOWS_ENV #ifdef __MSYS__ #define GPR_GETPID_IN_UNISTD_H 1 #define GPR_MSYS_TMPFILE #define GPR_POSIX_LOG #define GPR_POSIX_STRING #define GPR_POSIX_TIME #else #define GPR_GETPID_IN_PROCESS_H 1 #define GPR_WINDOWS_TMPFILE #define GPR_WINDOWS_LOG #define GPR_WINDOWS_CRASH_HANDLER 1 #define GPR_WINDOWS_STRING #define GPR_WINDOWS_TIME #endif #ifdef __GNUC__ #define GPR_GCC_ATOMIC 1 #define GPR_GCC_TLS 1 #else #define GPR_WINDOWS_ATOMIC 1 #define GPR_MSVC_TLS 1 #endif #elif defined(GPR_MANYLINUX1) // TODO(atash): manylinux1 is just another __linux__ but with ancient // libraries; it should be integrated with the `__linux__` definitions below. #define GPR_PLATFORM_STRING "manylinux" #define GPR_POSIX_CRASH_HANDLER 1 #define GPR_CPU_POSIX 1 #define GPR_GCC_ATOMIC 1 #define GPR_GCC_TLS 1 #define GPR_LINUX 1 #define GPR_LINUX_LOG 1 #define GPR_SUPPORT_CHANNELS_FROM_FD 1 #define GPR_LINUX_ENV 1 #define GPR_POSIX_TMPFILE 1 #define GPR_POSIX_STRING 1 #define GPR_POSIX_SUBPROCESS 1 #define GPR_POSIX_SYNC 1 #define GPR_POSIX_TIME 1 #define GPR_GETPID_IN_UNISTD_H 1 #ifdef _LP64 #define GPR_ARCH_64 1 #else /* _LP64 */ #define GPR_ARCH_32 1 #endif /* _LP64 */ #elif defined(ANDROID) || defined(__ANDROID__) #define GPR_PLATFORM_STRING "android" #define GPR_ANDROID 1 #ifdef _LP64 #define GPR_ARCH_64 1 #else /* _LP64 */ #define GPR_ARCH_32 1 #endif /* _LP64 */ #define GPR_CPU_POSIX 1 #define GPR_GCC_SYNC 1 #define GPR_GCC_TLS 1 #define GPR_POSIX_ENV 1 #define GPR_POSIX_TMPFILE 1 #define GPR_ANDROID_LOG 1 #define GPR_POSIX_STRING 1 #define GPR_POSIX_SUBPROCESS 1 #define GPR_POSIX_SYNC 1 #define GPR_POSIX_TIME 1 #define GPR_GETPID_IN_UNISTD_H 1 #define GPR_SUPPORT_CHANNELS_FROM_FD 1 #elif defined(__linux__) #define GPR_PLATFORM_STRING "linux" #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #ifndef _DEFAULT_SOURCE #define _DEFAULT_SOURCE #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #define GPR_CPU_LINUX 1 #define GPR_GCC_ATOMIC 1 #define GPR_GCC_TLS 1 #define GPR_LINUX 1 #define GPR_LINUX_LOG #define GPR_SUPPORT_CHANNELS_FROM_FD 1 #define GPR_LINUX_ENV 1 #define GPR_POSIX_TMPFILE 1 #define GPR_POSIX_STRING 1 #define GPR_POSIX_SUBPROCESS 1 #define GPR_POSIX_SYNC 1 #define GPR_POSIX_TIME 1 #define GPR_GETPID_IN_UNISTD_H 1 #ifdef _LP64 #define GPR_ARCH_64 1 #else /* _LP64 */ #define GPR_ARCH_32 1 #endif /* _LP64 */ #ifdef __GLIBC__ #define GPR_POSIX_CRASH_HANDLER 1 #define GPR_LINUX_PTHREAD_NAME 1 #else /* musl libc */ #define GPR_MUSL_LIBC_COMPAT 1 #endif #elif defined(__APPLE__) #include #include #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #if TARGET_OS_IPHONE #define GPR_PLATFORM_STRING "ios" #define GPR_CPU_IPHONE 1 #define GPR_PTHREAD_TLS 1 #else /* TARGET_OS_IPHONE */ #define GPR_PLATFORM_STRING "osx" #ifdef __MAC_OS_X_VERSION_MIN_REQUIRED #if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7 #define GPR_CPU_IPHONE 1 #define GPR_PTHREAD_TLS 1 #else /* __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7 */ #define GPR_CPU_POSIX 1 /* TODO(vjpai): there is a reported issue in bazel build for Mac where __thread in a header is currently not working (bazelbuild/bazel#4341). Remove the following conditional and use GPR_GCC_TLS when that is fixed */ #ifndef GRPC_BAZEL_BUILD #define GPR_GCC_TLS 1 #else /* GRPC_BAZEL_BUILD */ #define GPR_PTHREAD_TLS 1 #endif /* GRPC_BAZEL_BUILD */ #define GPR_APPLE_PTHREAD_NAME 1 #endif #else /* __MAC_OS_X_VERSION_MIN_REQUIRED */ #define GPR_CPU_POSIX 1 /* TODO(vjpai): Remove the following conditional and use only GPR_GCC_TLS when bazelbuild/bazel#4341 is fixed */ #ifndef GRPC_BAZEL_BUILD #define GPR_GCC_TLS 1 #else /* GRPC_BAZEL_BUILD */ #define GPR_PTHREAD_TLS 1 #endif /* GRPC_BAZEL_BUILD */ #endif #define GPR_POSIX_CRASH_HANDLER 1 #endif #define GPR_APPLE 1 #define GPR_GCC_ATOMIC 1 #define GPR_POSIX_LOG 1 #define GPR_POSIX_ENV 1 #define GPR_POSIX_TMPFILE 1 #define GPR_POSIX_STRING 1 #define GPR_POSIX_SUBPROCESS 1 #define GPR_POSIX_SYNC 1 #define GPR_POSIX_TIME 1 #define GPR_GETPID_IN_UNISTD_H 1 /* TODO(mxyan): Remove when CFStream becomes default */ #ifndef GRPC_CFSTREAM #define GPR_SUPPORT_CHANNELS_FROM_FD 1 #endif #ifdef _LP64 #define GPR_ARCH_64 1 #else /* _LP64 */ #define GPR_ARCH_32 1 #endif /* _LP64 */ #elif defined(__FreeBSD__) #define GPR_PLATFORM_STRING "freebsd" #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #define GPR_FREEBSD 1 #define GPR_CPU_POSIX 1 #define GPR_GCC_ATOMIC 1 #define GPR_GCC_TLS 1 #define GPR_POSIX_LOG 1 #define GPR_POSIX_ENV 1 #define GPR_POSIX_TMPFILE 1 #define GPR_POSIX_STRING 1 #define GPR_POSIX_SUBPROCESS 1 #define GPR_POSIX_SYNC 1 #define GPR_POSIX_TIME 1 #define GPR_GETPID_IN_UNISTD_H 1 #define GPR_SUPPORT_CHANNELS_FROM_FD 1 #ifdef _LP64 #define GPR_ARCH_64 1 #else /* _LP64 */ #define GPR_ARCH_32 1 #endif /* _LP64 */ #elif defined(__OpenBSD__) #define GPR_PLATFORM_STRING "openbsd" #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #define GPR_OPENBSD 1 #define GPR_CPU_POSIX 1 #define GPR_GCC_ATOMIC 1 #define GPR_GCC_TLS 1 #define GPR_POSIX_LOG 1 #define GPR_POSIX_ENV 1 #define GPR_POSIX_TMPFILE 1 #define GPR_POSIX_STRING 1 #define GPR_POSIX_SUBPROCESS 1 #define GPR_POSIX_SYNC 1 #define GPR_POSIX_TIME 1 #define GPR_GETPID_IN_UNISTD_H 1 #define GPR_SUPPORT_CHANNELS_FROM_FD 1 #ifdef _LP64 #define GPR_ARCH_64 1 #else /* _LP64 */ #define GPR_ARCH_32 1 #endif /* _LP64 */ #elif defined(__native_client__) #define GPR_PLATFORM_STRING "nacl" #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #ifndef _DEFAULT_SOURCE #define _DEFAULT_SOURCE #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #define GPR_NACL 1 #define GPR_CPU_POSIX 1 #define GPR_GCC_ATOMIC 1 #define GPR_GCC_TLS 1 #define GPR_POSIX_LOG 1 #define GPR_POSIX_ENV 1 #define GPR_POSIX_TMPFILE 1 #define GPR_POSIX_STRING 1 #define GPR_POSIX_SUBPROCESS 1 #define GPR_POSIX_SYNC 1 #define GPR_POSIX_TIME 1 #define GPR_GETPID_IN_UNISTD_H 1 #ifdef _LP64 #define GPR_ARCH_64 1 #else /* _LP64 */ #define GPR_ARCH_32 1 #endif /* _LP64 */ #else #error "Could not auto-detect platform" #endif #endif /* GPR_NO_AUTODETECT_PLATFORM */ /* * There are platforms for which TLS should not be used even though the * compiler makes it seem like it's supported (Android NDK < r12b for example). * This is primarily because of linker problems and toolchain misconfiguration: * TLS isn't supported until NDK r12b per * https://developer.android.com/ndk/downloads/revision_history.html * TLS also does not work with Android NDK if GCC is being used as the compiler * instead of Clang. * Since NDK r16, `__NDK_MAJOR__` and `__NDK_MINOR__` are defined in * . For NDK < r16, users should define these macros, * e.g. `-D__NDK_MAJOR__=11 -D__NKD_MINOR__=0` for NDK r11. */ #if defined(__ANDROID__) && defined(GPR_GCC_TLS) #if __has_include() #include #endif /* __has_include() */ #if (defined(__clang__) && defined(__NDK_MAJOR__) && defined(__NDK_MINOR__) && \ ((__NDK_MAJOR__ < 12) || \ ((__NDK_MAJOR__ == 12) && (__NDK_MINOR__ < 1)))) || \ (defined(__GNUC__) && !defined(__clang__)) #undef GPR_GCC_TLS #define GPR_PTHREAD_TLS 1 #endif #endif /*defined(__ANDROID__) && defined(GPR_GCC_TLS) */ #if defined(__has_include) #if __has_include() #define GRPC_HAS_CXX11_ATOMIC #endif /* __has_include() */ #endif /* defined(__has_include) */ #ifndef GPR_PLATFORM_STRING #warning "GPR_PLATFORM_STRING not auto-detected" #define GPR_PLATFORM_STRING "unknown" #endif #ifdef GPR_GCOV #undef GPR_FORBID_UNREACHABLE_CODE #define GPR_FORBID_UNREACHABLE_CODE 1 #endif #ifdef _MSC_VER #if _MSC_VER < 1700 typedef __int8 int8_t; typedef __int16 int16_t; typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else #include #endif /* _MSC_VER < 1700 */ #else #include #endif /* _MSC_VER */ /* Cache line alignment */ #ifndef GPR_CACHELINE_SIZE_LOG #if defined(__i386__) || defined(__x86_64__) #define GPR_CACHELINE_SIZE_LOG 6 #endif #ifndef GPR_CACHELINE_SIZE_LOG /* A reasonable default guess. Note that overestimates tend to waste more space, while underestimates tend to waste more time. */ #define GPR_CACHELINE_SIZE_LOG 6 #endif /* GPR_CACHELINE_SIZE_LOG */ #endif /* GPR_CACHELINE_SIZE_LOG */ #define GPR_CACHELINE_SIZE (1 << GPR_CACHELINE_SIZE_LOG) /* scrub GCC_ATOMIC if it's not available on this compiler */ #if defined(GPR_GCC_ATOMIC) && !defined(__ATOMIC_RELAXED) #undef GPR_GCC_ATOMIC #define GPR_GCC_SYNC 1 #endif /* Validate platform combinations */ #if defined(GPR_GCC_ATOMIC) + defined(GPR_GCC_SYNC) + \ defined(GPR_WINDOWS_ATOMIC) != \ 1 #error Must define exactly one of GPR_GCC_ATOMIC, GPR_GCC_SYNC, GPR_WINDOWS_ATOMIC #endif #if defined(GPR_ARCH_32) + defined(GPR_ARCH_64) != 1 #error Must define exactly one of GPR_ARCH_32, GPR_ARCH_64 #endif #if defined(GPR_CPU_LINUX) + defined(GPR_CPU_POSIX) + defined(GPR_WINDOWS) + \ defined(GPR_CPU_IPHONE) + defined(GPR_CPU_CUSTOM) != \ 1 #error Must define exactly one of GPR_CPU_LINUX, GPR_CPU_POSIX, GPR_WINDOWS, GPR_CPU_IPHONE, GPR_CPU_CUSTOM #endif #if defined(GPR_MSVC_TLS) + defined(GPR_GCC_TLS) + defined(GPR_PTHREAD_TLS) + \ defined(GPR_CUSTOM_TLS) != \ 1 #error Must define exactly one of GPR_MSVC_TLS, GPR_GCC_TLS, GPR_PTHREAD_TLS, GPR_CUSTOM_TLS #endif /* maximum alignment needed for any type on this platform, rounded up to a power of two */ #define GPR_MAX_ALIGNMENT 16 #ifndef GRPC_ARES #ifdef GPR_WINDOWS #define GRPC_ARES 0 #else #define GRPC_ARES 1 #endif #endif #ifndef GRPC_MUST_USE_RESULT #if defined(__GNUC__) && !defined(__MINGW32__) #define GRPC_MUST_USE_RESULT __attribute__((warn_unused_result)) #define GPR_ALIGN_STRUCT(n) __attribute__((aligned(n))) #else #define GRPC_MUST_USE_RESULT #define GPR_ALIGN_STRUCT(n) #endif #endif #ifndef GRPC_UNUSED #if defined(__GNUC__) && !defined(__MINGW32__) #define GRPC_UNUSED __attribute__((unused)) #else #define GRPC_UNUSED #endif #endif #ifndef GPR_PRINT_FORMAT_CHECK #ifdef __GNUC__ #define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS) \ __attribute__((format(printf, FORMAT_STR, ARGS))) #else #define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS) #endif #endif /* GPR_PRINT_FORMAT_CHECK */ #if GPR_FORBID_UNREACHABLE_CODE #define GPR_UNREACHABLE_CODE(STATEMENT) #else #define GPR_UNREACHABLE_CODE(STATEMENT) \ do { \ gpr_log(GPR_ERROR, "Should never reach here."); \ abort(); \ STATEMENT; \ } while (0) #endif /* GPR_FORBID_UNREACHABLE_CODE */ #ifndef GPRAPI #define GPRAPI #endif #ifndef GRPCAPI #define GRPCAPI GPRAPI #endif #ifndef CENSUSAPI #define CENSUSAPI GRPCAPI #endif #ifndef GPR_ATTRIBUTE_NO_TSAN /* (1) */ #if defined(__has_feature) #if __has_feature(thread_sanitizer) #define GPR_ATTRIBUTE_NO_TSAN __attribute__((no_sanitize("thread"))) #endif /* __has_feature(thread_sanitizer) */ #endif /* defined(__has_feature) */ #ifndef GPR_ATTRIBUTE_NO_TSAN /* (2) */ #define GPR_ATTRIBUTE_NO_TSAN #endif /* GPR_ATTRIBUTE_NO_TSAN (2) */ #endif /* GPR_ATTRIBUTE_NO_TSAN (1) */ /* GRPC_ALLOW_EXCEPTIONS should be 0 or 1 if exceptions are allowed or not */ #ifndef GRPC_ALLOW_EXCEPTIONS /* If not already set, set to 1 on Windows (style guide standard) but to * 0 on non-Windows platforms unless the compiler defines __EXCEPTIONS */ #ifdef GPR_WINDOWS #define GRPC_ALLOW_EXCEPTIONS 1 #else /* GPR_WINDOWS */ #ifdef __EXCEPTIONS #define GRPC_ALLOW_EXCEPTIONS 1 #else /* __EXCEPTIONS */ #define GRPC_ALLOW_EXCEPTIONS 0 #endif /* __EXCEPTIONS */ #endif /* __GPR_WINDOWS */ #endif /* GRPC_ALLOW_EXCEPTIONS */ /* Use GPR_LIKELY only in cases where you are sure that a certain outcome is the * most likely. Ideally, also collect performance numbers to justify the claim. */ #ifdef __GNUC__ #define GPR_LIKELY(x) __builtin_expect((x), 1) #define GPR_UNLIKELY(x) __builtin_expect((x), 0) #else /* __GNUC__ */ #define GPR_LIKELY(x) (x) #define GPR_UNLIKELY(x) (x) #endif /* __GNUC__ */ #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif #endif /* GRPC_IMPL_CODEGEN_PORT_PLATFORM_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/propagation_bits.h000066400000000000000000000035761334102242000276460ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_PROPAGATION_BITS_H #define GRPC_IMPL_CODEGEN_PROPAGATION_BITS_H #include #ifdef __cplusplus extern "C" { #endif /** Propagation bits: this can be bitwise or-ed to form propagation_mask for * grpc_call */ /** Propagate deadline */ #define GRPC_PROPAGATE_DEADLINE ((uint32_t)1) /** Propagate census context */ #define GRPC_PROPAGATE_CENSUS_STATS_CONTEXT ((uint32_t)2) #define GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT ((uint32_t)4) /** Propagate cancellation */ #define GRPC_PROPAGATE_CANCELLATION ((uint32_t)8) /** Default propagation mask: clients of the core API are encouraged to encode deltas from this in their implementations... ie write: GRPC_PROPAGATE_DEFAULTS & ~GRPC_PROPAGATE_DEADLINE to disable deadline propagation. Doing so gives flexibility in the future to define new propagation types that are default inherited or not. */ #define GRPC_PROPAGATE_DEFAULTS \ ((uint32_t)(( \ 0xffff | GRPC_PROPAGATE_DEADLINE | GRPC_PROPAGATE_CENSUS_STATS_CONTEXT | \ GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT | GRPC_PROPAGATE_CANCELLATION))) #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_PROPAGATION_BITS_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/slice.h000066400000000000000000000130701334102242000253670ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_SLICE_H #define GRPC_IMPL_CODEGEN_SLICE_H #include #include #include typedef struct grpc_slice grpc_slice; /** Slice API A slice represents a contiguous reference counted array of bytes. It is cheap to take references to a slice, and it is cheap to create a slice pointing to a subset of another slice. The data-structure for slices is exposed here to allow non-gpr code to build slices from whatever data they have available. When defining interfaces that handle slices, care should be taken to define reference ownership semantics (who should call unref?) and mutability constraints (is the callee allowed to modify the slice?) */ typedef struct grpc_slice_refcount_vtable { void (*ref)(void*); void (*unref)(void*); int (*eq)(grpc_slice a, grpc_slice b); uint32_t (*hash)(grpc_slice slice); } grpc_slice_refcount_vtable; /** Reference count container for grpc_slice. Contains function pointers to increment and decrement reference counts. Implementations should cleanup when the reference count drops to zero. Typically client code should not touch this, and use grpc_slice_malloc, grpc_slice_new, or grpc_slice_new_with_len instead. */ typedef struct grpc_slice_refcount { const grpc_slice_refcount_vtable* vtable; /** If a subset of this slice is taken, use this pointer for the refcount. Typically points back to the refcount itself, however iterning implementations can use this to avoid a verification step on each hash or equality check */ struct grpc_slice_refcount* sub_refcount; } grpc_slice_refcount; /* Inlined half of grpc_slice is allowed to expand the size of the overall type by this many bytes */ #define GRPC_SLICE_INLINE_EXTRA_SIZE sizeof(void*) #define GRPC_SLICE_INLINED_SIZE \ (sizeof(size_t) + sizeof(uint8_t*) - 1 + GRPC_SLICE_INLINE_EXTRA_SIZE) /** A grpc_slice s, if initialized, represents the byte range s.bytes[0..s.length-1]. It can have an associated ref count which has a destruction routine to be run when the ref count reaches zero (see grpc_slice_new() and grp_slice_unref()). Multiple grpc_slice values may share a ref count. If the slice does not have a refcount, it represents an inlined small piece of data that is copied by value. */ struct grpc_slice { struct grpc_slice_refcount* refcount; union grpc_slice_data { struct grpc_slice_refcounted { uint8_t* bytes; size_t length; } refcounted; struct grpc_slice_inlined { uint8_t length; uint8_t bytes[GRPC_SLICE_INLINED_SIZE]; } inlined; } data; }; #define GRPC_SLICE_BUFFER_INLINE_ELEMENTS 8 /** Represents an expandable array of slices, to be interpreted as a single item. */ typedef struct grpc_slice_buffer { /** This is for internal use only. External users (i.e any code outside grpc * core) MUST NOT use this field */ grpc_slice* base_slices; /** slices in the array (Points to the first valid grpc_slice in the array) */ grpc_slice* slices; /** the number of slices in the array */ size_t count; /** the number of slices allocated in the array. External users (i.e any code * outside grpc core) MUST NOT use this field */ size_t capacity; /** the combined length of all slices in the array */ size_t length; /** inlined elements to avoid allocations */ grpc_slice inlined[GRPC_SLICE_BUFFER_INLINE_ELEMENTS]; } grpc_slice_buffer; #define GRPC_SLICE_START_PTR(slice) \ ((slice).refcount ? (slice).data.refcounted.bytes \ : (slice).data.inlined.bytes) #define GRPC_SLICE_LENGTH(slice) \ ((slice).refcount ? (slice).data.refcounted.length \ : (slice).data.inlined.length) #define GRPC_SLICE_SET_LENGTH(slice, newlen) \ ((slice).refcount ? ((slice).data.refcounted.length = (size_t)(newlen)) \ : ((slice).data.inlined.length = (uint8_t)(newlen))) #define GRPC_SLICE_END_PTR(slice) \ GRPC_SLICE_START_PTR(slice) + GRPC_SLICE_LENGTH(slice) #define GRPC_SLICE_IS_EMPTY(slice) (GRPC_SLICE_LENGTH(slice) == 0) #ifdef GRPC_ALLOW_GPR_SLICE_FUNCTIONS /* Duplicate GPR_* definitions */ #define GPR_SLICE_START_PTR(slice) \ ((slice).refcount ? (slice).data.refcounted.bytes \ : (slice).data.inlined.bytes) #define GPR_SLICE_LENGTH(slice) \ ((slice).refcount ? (slice).data.refcounted.length \ : (slice).data.inlined.length) #define GPR_SLICE_SET_LENGTH(slice, newlen) \ ((slice).refcount ? ((slice).data.refcounted.length = (size_t)(newlen)) \ : ((slice).data.inlined.length = (uint8_t)(newlen))) #define GPR_SLICE_END_PTR(slice) \ GRPC_SLICE_START_PTR(slice) + GRPC_SLICE_LENGTH(slice) #define GPR_SLICE_IS_EMPTY(slice) (GRPC_SLICE_LENGTH(slice) == 0) #endif /* GRPC_ALLOW_GPR_SLICE_FUNCTIONS */ #endif /* GRPC_IMPL_CODEGEN_SLICE_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/status.h000066400000000000000000000140471334102242000256200ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_STATUS_H #define GRPC_IMPL_CODEGEN_STATUS_H #ifdef __cplusplus extern "C" { #endif typedef enum { /** Not an error; returned on success */ GRPC_STATUS_OK = 0, /** The operation was cancelled (typically by the caller). */ GRPC_STATUS_CANCELLED = 1, /** Unknown error. An example of where this error may be returned is if a Status value received from another address space belongs to an error-space that is not known in this address space. Also errors raised by APIs that do not return enough error information may be converted to this error. */ GRPC_STATUS_UNKNOWN = 2, /** Client specified an invalid argument. Note that this differs from FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are problematic regardless of the state of the system (e.g., a malformed file name). */ GRPC_STATUS_INVALID_ARGUMENT = 3, /** Deadline expired before operation could complete. For operations that change the state of the system, this error may be returned even if the operation has completed successfully. For example, a successful response from a server could have been delayed long enough for the deadline to expire. */ GRPC_STATUS_DEADLINE_EXCEEDED = 4, /** Some requested entity (e.g., file or directory) was not found. */ GRPC_STATUS_NOT_FOUND = 5, /** Some entity that we attempted to create (e.g., file or directory) already exists. */ GRPC_STATUS_ALREADY_EXISTS = 6, /** The caller does not have permission to execute the specified operation. PERMISSION_DENIED must not be used for rejections caused by exhausting some resource (use RESOURCE_EXHAUSTED instead for those errors). PERMISSION_DENIED must not be used if the caller can not be identified (use UNAUTHENTICATED instead for those errors). */ GRPC_STATUS_PERMISSION_DENIED = 7, /** The request does not have valid authentication credentials for the operation. */ GRPC_STATUS_UNAUTHENTICATED = 16, /** Some resource has been exhausted, perhaps a per-user quota, or perhaps the entire file system is out of space. */ GRPC_STATUS_RESOURCE_EXHAUSTED = 8, /** Operation was rejected because the system is not in a state required for the operation's execution. For example, directory to be deleted may be non-empty, an rmdir operation is applied to a non-directory, etc. A litmus test that may help a service implementor in deciding between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE: (a) Use UNAVAILABLE if the client can retry just the failing call. (b) Use ABORTED if the client should retry at a higher-level (e.g., restarting a read-modify-write sequence). (c) Use FAILED_PRECONDITION if the client should not retry until the system state has been explicitly fixed. E.g., if an "rmdir" fails because the directory is non-empty, FAILED_PRECONDITION should be returned since the client should not retry unless they have first fixed up the directory by deleting files from it. (d) Use FAILED_PRECONDITION if the client performs conditional REST Get/Update/Delete on a resource and the resource on the server does not match the condition. E.g., conflicting read-modify-write on the same resource. */ GRPC_STATUS_FAILED_PRECONDITION = 9, /** The operation was aborted, typically due to a concurrency issue like sequencer check failures, transaction aborts, etc. See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE. */ GRPC_STATUS_ABORTED = 10, /** Operation was attempted past the valid range. E.g., seeking or reading past end of file. Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed if the system state changes. For example, a 32-bit file system will generate INVALID_ARGUMENT if asked to read at an offset that is not in the range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from an offset past the current file size. There is a fair bit of overlap between FAILED_PRECONDITION and OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error) when it applies so that callers who are iterating through a space can easily look for an OUT_OF_RANGE error to detect when they are done. */ GRPC_STATUS_OUT_OF_RANGE = 11, /** Operation is not implemented or not supported/enabled in this service. */ GRPC_STATUS_UNIMPLEMENTED = 12, /** Internal errors. Means some invariants expected by underlying system has been broken. If you see one of these errors, something is very broken. */ GRPC_STATUS_INTERNAL = 13, /** The service is currently unavailable. This is a most likely a transient condition and may be corrected by retrying with a backoff. WARNING: Although data MIGHT not have been transmitted when this status occurs, there is NOT A GUARANTEE that the server has not seen anything. So in general it is unsafe to retry on this status code if the call is non-idempotent. See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE. */ GRPC_STATUS_UNAVAILABLE = 14, /** Unrecoverable data loss or corruption. */ GRPC_STATUS_DATA_LOSS = 15, /** Force users to include a default branch: */ GRPC_STATUS__DO_NOT_USE = -1 } grpc_status_code; #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_STATUS_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/sync.h000066400000000000000000000036331334102242000252500ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_SYNC_H #define GRPC_IMPL_CODEGEN_SYNC_H /** Synchronization primitives for GPR. The type gpr_mu provides a non-reentrant mutex (lock). The type gpr_cv provides a condition variable. The type gpr_once provides for one-time initialization. The type gpr_event provides one-time-setting, reading, and waiting of a void*, with memory barriers. The type gpr_refcount provides an object reference counter, with memory barriers suitable to control object lifetimes. The type gpr_stats_counter provides an atomic statistics counter. It provides no memory barriers. */ #ifdef __cplusplus extern "C" { #endif /* Platform-specific type declarations of gpr_mu and gpr_cv. */ #include #include #if defined(GPR_POSIX_SYNC) #include #elif defined(GPR_WINDOWS) #include #elif defined(GPR_CUSTOM_SYNC) #include #else #error Unable to determine platform for sync #endif #ifdef __cplusplus } #endif #endif /* GRPC_IMPL_CODEGEN_SYNC_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/sync_custom.h000066400000000000000000000020721334102242000266360ustar00rootroot00000000000000/* * * Copyright 2017 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_SYNC_CUSTOM_H #define GRPC_IMPL_CODEGEN_SYNC_CUSTOM_H #include #include /* Users defining GPR_CUSTOM_SYNC need to define the following macros. */ #ifdef GPR_CUSTOM_SYNC typedef GPR_CUSTOM_MU_TYPE gpr_mu; typedef GPR_CUSTOM_CV_TYPE gpr_cv; typedef GPR_CUSTOM_ONCE_TYPE gpr_once; #define GPR_ONCE_INIT GPR_CUSTOM_ONCE_INIT #endif #endif /* GRPC_IMPL_CODEGEN_SYNC_CUSTOM_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/sync_generic.h000066400000000000000000000021651334102242000267430ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_SYNC_GENERIC_H #define GRPC_IMPL_CODEGEN_SYNC_GENERIC_H /* Generic type defintions for gpr_sync. */ #include #include /* gpr_event */ typedef struct { gpr_atm state; } gpr_event; #define GPR_EVENT_INIT \ { 0 } /* gpr_refcount */ typedef struct { gpr_atm count; } gpr_refcount; /* gpr_stats_counter */ typedef struct { gpr_atm value; } gpr_stats_counter; #define GPR_STATS_INIT \ { 0 } #endif /* GRPC_IMPL_CODEGEN_SYNC_GENERIC_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/sync_posix.h000066400000000000000000000017221334102242000264670ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_SYNC_POSIX_H #define GRPC_IMPL_CODEGEN_SYNC_POSIX_H #include #include #include typedef pthread_mutex_t gpr_mu; typedef pthread_cond_t gpr_cv; typedef pthread_once_t gpr_once; #define GPR_ONCE_INIT PTHREAD_ONCE_INIT #endif /* GRPC_IMPL_CODEGEN_SYNC_POSIX_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/impl/codegen/sync_windows.h000066400000000000000000000020261334102242000270150ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_IMPL_CODEGEN_SYNC_WINDOWS_H #define GRPC_IMPL_CODEGEN_SYNC_WINDOWS_H #include #include typedef struct { CRITICAL_SECTION cs; /* Not an SRWLock until Vista is unsupported */ int locked; } gpr_mu; typedef CONDITION_VARIABLE gpr_cv; typedef INIT_ONCE gpr_once; #define GPR_ONCE_INIT INIT_ONCE_STATIC_INIT #endif /* GRPC_IMPL_CODEGEN_SYNC_WINDOWS_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/load_reporting.h000066400000000000000000000027471334102242000247440ustar00rootroot00000000000000/* * * Copyright 2017 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_LOAD_REPORTING_H #define GRPC_LOAD_REPORTING_H #include #ifdef __cplusplus extern "C" { #endif /** Metadata key for the gRPC LB load balancer token. * * The value corresponding to this key is an opaque token that is given to the * frontend as part of each pick; the frontend sends this token to the backend * in each request it sends when using that pick. The token is used by the * backend to verify the request and to allow the backend to report load to the * gRPC LB system. */ #define GRPC_LB_TOKEN_MD_KEY "lb-token" /** Metadata key for gRPC LB cost reporting. * * The value corresponding to this key is an opaque binary blob reported by the * backend as part of its trailing metadata containing cost information for the * call. */ #define GRPC_LB_COST_MD_KEY "lb-cost-bin" #ifdef __cplusplus } #endif #endif /* GRPC_LOAD_REPORTING_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/module.modulemap000066400000000000000000000046061334102242000247510ustar00rootroot00000000000000 framework module grpc { umbrella header "grpc.h" header "support/alloc.h" header "support/atm.h" header "support/cpu.h" header "support/log.h" header "support/log_windows.h" header "support/port_platform.h" header "support/string_util.h" header "support/sync.h" header "support/sync_generic.h" header "support/thd_id.h" header "support/time.h" header "impl/codegen/atm.h" header "impl/codegen/fork.h" header "impl/codegen/gpr_slice.h" header "impl/codegen/gpr_types.h" header "impl/codegen/log.h" header "impl/codegen/port_platform.h" header "impl/codegen/sync.h" header "impl/codegen/sync_generic.h" header "impl/codegen/byte_buffer.h" header "impl/codegen/byte_buffer_reader.h" header "impl/codegen/compression_types.h" header "impl/codegen/connectivity_state.h" header "impl/codegen/grpc_types.h" header "impl/codegen/propagation_bits.h" header "impl/codegen/slice.h" header "impl/codegen/status.h" header "impl/codegen/atm.h" header "impl/codegen/fork.h" header "impl/codegen/gpr_slice.h" header "impl/codegen/gpr_types.h" header "impl/codegen/log.h" header "impl/codegen/port_platform.h" header "impl/codegen/sync.h" header "impl/codegen/sync_generic.h" header "grpc_security.h" header "byte_buffer.h" header "byte_buffer_reader.h" header "compression.h" header "fork.h" header "grpc.h" header "grpc_posix.h" header "grpc_security_constants.h" header "load_reporting.h" header "slice.h" header "slice_buffer.h" header "status.h" header "support/workaround_list.h" header "census.h" textual header "support/atm_gcc_atomic.h" textual header "support/atm_gcc_sync.h" textual header "support/atm_windows.h" textual header "support/sync_custom.h" textual header "support/sync_posix.h" textual header "support/sync_windows.h" textual header "impl/codegen/atm_gcc_atomic.h" textual header "impl/codegen/atm_gcc_sync.h" textual header "impl/codegen/atm_windows.h" textual header "impl/codegen/sync_custom.h" textual header "impl/codegen/sync_posix.h" textual header "impl/codegen/sync_windows.h" textual header "impl/codegen/atm_gcc_atomic.h" textual header "impl/codegen/atm_gcc_sync.h" textual header "impl/codegen/atm_windows.h" textual header "impl/codegen/sync_custom.h" textual header "impl/codegen/sync_posix.h" textual header "impl/codegen/sync_windows.h" export * module * { export * } } python-grpc-tools-1.14.1/grpc_root/include/grpc/slice.h000066400000000000000000000154531334102242000230310ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SLICE_H #define GRPC_SLICE_H #include #include #include #ifdef __cplusplus extern "C" { #endif /** Increment the refcount of s. Requires slice is initialized. Returns s. */ GPRAPI grpc_slice grpc_slice_ref(grpc_slice s); /** Decrement the ref count of s. If the ref count of s reaches zero, all slices sharing the ref count are destroyed, and considered no longer initialized. If s is ultimately derived from a call to grpc_slice_new(start, len, dest) where dest!=NULL , then (*dest)(start) is called, else if s is ultimately derived from a call to grpc_slice_new_with_len(start, len, dest) where dest!=NULL , then (*dest)(start, len). Requires s initialized. */ GPRAPI void grpc_slice_unref(grpc_slice s); /** Copy slice - create a new slice that contains the same data as s */ GPRAPI grpc_slice grpc_slice_copy(grpc_slice s); /** Create a slice pointing at some data. Calls malloc to allocate a refcount for the object, and arranges that destroy will be called with the pointer passed in at destruction. */ GPRAPI grpc_slice grpc_slice_new(void* p, size_t len, void (*destroy)(void*)); /** Equivalent to grpc_slice_new, but with a separate pointer that is passed to the destroy function. This function can be useful when the data is part of a larger structure that must be destroyed when the data is no longer needed. */ GPRAPI grpc_slice grpc_slice_new_with_user_data(void* p, size_t len, void (*destroy)(void*), void* user_data); /** Equivalent to grpc_slice_new, but with a two argument destroy function that also takes the slice length. */ GPRAPI grpc_slice grpc_slice_new_with_len(void* p, size_t len, void (*destroy)(void*, size_t)); /** Equivalent to grpc_slice_new(malloc(len), len, free), but saves one malloc() call. Aborts if malloc() fails. */ GPRAPI grpc_slice grpc_slice_malloc(size_t length); GPRAPI grpc_slice grpc_slice_malloc_large(size_t length); #define GRPC_SLICE_MALLOC(len) grpc_slice_malloc(len) /** Intern a slice: The return value for two invocations of this function with the same sequence of bytes is a slice which points to the same memory. */ GPRAPI grpc_slice grpc_slice_intern(grpc_slice slice); /** Create a slice by copying a string. Does not preserve null terminators. Equivalent to: size_t len = strlen(source); grpc_slice slice = grpc_slice_malloc(len); memcpy(slice->data, source, len); */ GPRAPI grpc_slice grpc_slice_from_copied_string(const char* source); /** Create a slice by copying a buffer. Equivalent to: grpc_slice slice = grpc_slice_malloc(len); memcpy(slice->data, source, len); */ GPRAPI grpc_slice grpc_slice_from_copied_buffer(const char* source, size_t len); /** Create a slice pointing to constant memory */ GPRAPI grpc_slice grpc_slice_from_static_string(const char* source); /** Create a slice pointing to constant memory */ GPRAPI grpc_slice grpc_slice_from_static_buffer(const void* source, size_t len); /** Return a result slice derived from s, which shares a ref count with \a s, where result.data==s.data+begin, and result.length==end-begin. The ref count of \a s is increased by one. Do not assign result back to \a s. Requires s initialized, begin <= end, begin <= s.length, and end <= source->length. */ GPRAPI grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end); /** The same as grpc_slice_sub, but without altering the ref count */ GPRAPI grpc_slice grpc_slice_sub_no_ref(grpc_slice s, size_t begin, size_t end); /** Splits s into two: modifies s to be s[0:split], and returns a new slice, sharing a refcount with s, that contains s[split:s.length]. Requires s intialized, split <= s.length */ GPRAPI grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split); typedef enum { GRPC_SLICE_REF_TAIL = 1, GRPC_SLICE_REF_HEAD = 2, GRPC_SLICE_REF_BOTH = 1 + 2 } grpc_slice_ref_whom; /** The same as grpc_slice_split_tail, but with an option to skip altering * refcounts (grpc_slice_split_tail_maybe_ref(..., true) is equivalent to * grpc_slice_split_tail(...)) */ GPRAPI grpc_slice grpc_slice_split_tail_maybe_ref(grpc_slice* s, size_t split, grpc_slice_ref_whom ref_whom); /** Splits s into two: modifies s to be s[split:s.length], and returns a new slice, sharing a refcount with s, that contains s[0:split]. Requires s intialized, split <= s.length */ GPRAPI grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split); GPRAPI grpc_slice grpc_empty_slice(void); GPRAPI uint32_t grpc_slice_default_hash_impl(grpc_slice s); GPRAPI int grpc_slice_default_eq_impl(grpc_slice a, grpc_slice b); GPRAPI int grpc_slice_eq(grpc_slice a, grpc_slice b); /** Returns <0 if a < b, ==0 if a == b, >0 if a > b The order is arbitrary, and is not guaranteed to be stable across different versions of the API. */ GPRAPI int grpc_slice_cmp(grpc_slice a, grpc_slice b); GPRAPI int grpc_slice_str_cmp(grpc_slice a, const char* b); /** return non-zero if the first blen bytes of a are equal to b */ GPRAPI int grpc_slice_buf_start_eq(grpc_slice a, const void* b, size_t blen); /** return the index of the last instance of \a c in \a s, or -1 if not found */ GPRAPI int grpc_slice_rchr(grpc_slice s, char c); GPRAPI int grpc_slice_chr(grpc_slice s, char c); /** return the index of the first occurance of \a needle in \a haystack, or -1 if it's not found */ GPRAPI int grpc_slice_slice(grpc_slice haystack, grpc_slice needle); GPRAPI uint32_t grpc_slice_hash(grpc_slice s); /** Do two slices point at the same memory, with the same length If a or b is inlined, actually compares data */ GPRAPI int grpc_slice_is_equivalent(grpc_slice a, grpc_slice b); /** Return a slice pointing to newly allocated memory that has the same contents * as \a s */ GPRAPI grpc_slice grpc_slice_dup(grpc_slice a); /** Return a copy of slice as a C string. Offers no protection against embedded NULL's. Returned string must be freed with gpr_free. */ GPRAPI char* grpc_slice_to_c_string(grpc_slice s); #ifdef __cplusplus } #endif #endif /* GRPC_SLICE_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/slice_buffer.h000066400000000000000000000075071334102242000243630ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SLICE_BUFFER_H #define GRPC_SLICE_BUFFER_H #include #include #ifdef __cplusplus extern "C" { #endif /** initialize a slice buffer */ GPRAPI void grpc_slice_buffer_init(grpc_slice_buffer* sb); /** destroy a slice buffer - unrefs any held elements */ GPRAPI void grpc_slice_buffer_destroy(grpc_slice_buffer* sb); /** Add an element to a slice buffer - takes ownership of the slice. This function is allowed to concatenate the passed in slice to the end of some other slice if desired by the slice buffer. */ GPRAPI void grpc_slice_buffer_add(grpc_slice_buffer* sb, grpc_slice slice); /** add an element to a slice buffer - takes ownership of the slice and returns the index of the slice. Guarantees that the slice will not be concatenated at the end of another slice (i.e. the data for this slice will begin at the first byte of the slice at the returned index in sb->slices) The implementation MAY decide to concatenate data at the end of a small slice added in this fashion. */ GPRAPI size_t grpc_slice_buffer_add_indexed(grpc_slice_buffer* sb, grpc_slice slice); GPRAPI void grpc_slice_buffer_addn(grpc_slice_buffer* sb, grpc_slice* slices, size_t n); /** add a very small (less than 8 bytes) amount of data to the end of a slice buffer: returns a pointer into which to add the data */ GPRAPI uint8_t* grpc_slice_buffer_tiny_add(grpc_slice_buffer* sb, size_t len); /** pop the last buffer, but don't unref it */ GPRAPI void grpc_slice_buffer_pop(grpc_slice_buffer* sb); /** clear a slice buffer, unref all elements */ GPRAPI void grpc_slice_buffer_reset_and_unref(grpc_slice_buffer* sb); /** swap the contents of two slice buffers */ GPRAPI void grpc_slice_buffer_swap(grpc_slice_buffer* a, grpc_slice_buffer* b); /** move all of the elements of src into dst */ GPRAPI void grpc_slice_buffer_move_into(grpc_slice_buffer* src, grpc_slice_buffer* dst); /** remove n bytes from the end of a slice buffer */ GPRAPI void grpc_slice_buffer_trim_end(grpc_slice_buffer* src, size_t n, grpc_slice_buffer* garbage); /** move the first n bytes of src into dst */ GPRAPI void grpc_slice_buffer_move_first(grpc_slice_buffer* src, size_t n, grpc_slice_buffer* dst); /** move the first n bytes of src into dst without adding references */ GPRAPI void grpc_slice_buffer_move_first_no_ref(grpc_slice_buffer* src, size_t n, grpc_slice_buffer* dst); /** move the first n bytes of src into dst (copying them) */ GPRAPI void grpc_slice_buffer_move_first_into_buffer(grpc_slice_buffer* src, size_t n, void* dst); /** take the first slice in the slice buffer */ GPRAPI grpc_slice grpc_slice_buffer_take_first(grpc_slice_buffer* src); /** undo the above with (a possibly different) \a slice */ GPRAPI void grpc_slice_buffer_undo_take_first(grpc_slice_buffer* src, grpc_slice slice); #ifdef __cplusplus } #endif #endif /* GRPC_SLICE_BUFFER_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/status.h000066400000000000000000000013641334102242000232510ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_STATUS_H #define GRPC_STATUS_H #include #include #endif /* GRPC_STATUS_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/000077500000000000000000000000001334102242000232655ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpc/support/alloc.h000066400000000000000000000044161334102242000245350ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_ALLOC_H #define GRPC_SUPPORT_ALLOC_H #include #include #ifdef __cplusplus extern "C" { #endif typedef struct gpr_allocation_functions { void* (*malloc_fn)(size_t size); void* (*zalloc_fn)(size_t size); /** if NULL, uses malloc_fn then memset */ void* (*realloc_fn)(void* ptr, size_t size); void (*free_fn)(void* ptr); } gpr_allocation_functions; /** malloc. * If size==0, always returns NULL. Otherwise this function never returns NULL. * The pointer returned is suitably aligned for any kind of variable it could * contain. */ GPRAPI void* gpr_malloc(size_t size); /** like malloc, but zero all bytes before returning them */ GPRAPI void* gpr_zalloc(size_t size); /** free */ GPRAPI void gpr_free(void* ptr); /** realloc, never returns NULL */ GPRAPI void* gpr_realloc(void* p, size_t size); /** aligned malloc, never returns NULL, will align to alignment, which * must be a power of 2. */ GPRAPI void* gpr_malloc_aligned(size_t size, size_t alignment); /** free memory allocated by gpr_malloc_aligned */ GPRAPI void gpr_free_aligned(void* ptr); /** Request the family of allocation functions in \a functions be used. NOTE * that this request will be honored in a *best effort* basis and that no * guarantees are made about the default functions (eg, malloc) being called. * The functions.free_fn implementation must be a no-op for NULL input. */ GPRAPI void gpr_set_allocation_functions(gpr_allocation_functions functions); /** Return the family of allocation functions currently in effect. */ GPRAPI gpr_allocation_functions gpr_get_allocation_functions(void); #ifdef __cplusplus } #endif #endif /* GRPC_SUPPORT_ALLOC_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/atm.h000066400000000000000000000014001334102242000242120ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_ATM_H #define GRPC_SUPPORT_ATM_H #include #include #endif /* GRPC_SUPPORT_ATM_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/atm_gcc_atomic.h000066400000000000000000000014541334102242000263730ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_ATM_GCC_ATOMIC_H #define GRPC_SUPPORT_ATM_GCC_ATOMIC_H #include #include #endif /* GRPC_SUPPORT_ATM_GCC_ATOMIC_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/atm_gcc_sync.h000066400000000000000000000014441334102242000260720ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_ATM_GCC_SYNC_H #define GRPC_SUPPORT_ATM_GCC_SYNC_H #include #include #endif /* GRPC_SUPPORT_ATM_GCC_SYNC_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/atm_windows.h000066400000000000000000000014401334102242000257700ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_ATM_WINDOWS_H #define GRPC_SUPPORT_ATM_WINDOWS_H #include #include #endif /* GRPC_SUPPORT_ATM_WINDOWS_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/cpu.h000066400000000000000000000024731334102242000242330ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_CPU_H #define GRPC_SUPPORT_CPU_H #include #ifdef __cplusplus extern "C" { #endif /** Interface providing CPU information for currently running system */ /** Return the number of CPU cores on the current system. Will return 0 if the information is not available. */ GPRAPI unsigned gpr_cpu_num_cores(void); /** Return the CPU on which the current thread is executing; N.B. This should be considered advisory only - it is possible that the thread is switched to a different CPU at any time. Returns a value in range [0, gpr_cpu_num_cores() - 1] */ GPRAPI unsigned gpr_cpu_current_cpu(void); #ifdef __cplusplus } // extern "C" #endif #endif /* GRPC_SUPPORT_CPU_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/log.h000066400000000000000000000014001334102242000242120ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_LOG_H #define GRPC_SUPPORT_LOG_H #include #include #endif /* GRPC_SUPPORT_LOG_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/log_windows.h000066400000000000000000000020531334102242000257710ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_LOG_WINDOWS_H #define GRPC_SUPPORT_LOG_WINDOWS_H #include #ifdef __cplusplus extern "C" { #endif /** Returns a string allocated with gpr_malloc that contains a UTF-8 * formatted error message, corresponding to the error messageid. * Use in conjunction with GetLastError() et al. */ GPRAPI char* gpr_format_message(int messageid); #ifdef __cplusplus } #endif #endif /* GRPC_SUPPORT_LOG_WINDOWS_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/port_platform.h000066400000000000000000000013771334102242000263360ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_PORT_PLATFORM_H #define GRPC_SUPPORT_PORT_PLATFORM_H #include #endif /* GRPC_SUPPORT_PORT_PLATFORM_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/string_util.h000066400000000000000000000027701334102242000260070ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_STRING_UTIL_H #define GRPC_SUPPORT_STRING_UTIL_H #include #include #ifdef __cplusplus extern "C" { #endif /** String utility functions */ /** Returns a copy of src that can be passed to gpr_free(). If allocation fails or if src is NULL, returns NULL. */ GPRAPI char* gpr_strdup(const char* src); /** printf to a newly-allocated string. The set of supported formats may vary between platforms. On success, returns the number of bytes printed (excluding the final '\0'), and *strp points to a string which must later be destroyed with gpr_free(). On error, returns -1 and sets *strp to NULL. If the format string is bad, the result is undefined. */ GPRAPI int gpr_asprintf(char** strp, const char* format, ...) GPR_PRINT_FORMAT_CHECK(2, 3); #ifdef __cplusplus } #endif #endif /* GRPC_SUPPORT_STRING_UTIL_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/sync.h000066400000000000000000000260261334102242000244200ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_SYNC_H #define GRPC_SUPPORT_SYNC_H #include #include /* for gpr_timespec */ #include #ifdef __cplusplus extern "C" { #endif /** --- Mutex interface --- At most one thread may hold an exclusive lock on a mutex at any given time. Actions taken by a thread that holds a mutex exclusively happen after actions taken by all previous holders of the mutex. Variables of type gpr_mu are uninitialized when first declared. */ /** Initialize *mu. Requires: *mu uninitialized. */ GPRAPI void gpr_mu_init(gpr_mu* mu); /** Cause *mu no longer to be initialized, freeing any memory in use. Requires: *mu initialized; no other concurrent operation on *mu. */ GPRAPI void gpr_mu_destroy(gpr_mu* mu); /** Wait until no thread has a lock on *mu, cause the calling thread to own an exclusive lock on *mu, then return. May block indefinitely or crash if the calling thread has a lock on *mu. Requires: *mu initialized. */ GPRAPI void gpr_mu_lock(gpr_mu* mu); /** Release an exclusive lock on *mu held by the calling thread. Requires: *mu initialized; the calling thread holds an exclusive lock on *mu. */ GPRAPI void gpr_mu_unlock(gpr_mu* mu); /** Without blocking, attempt to acquire an exclusive lock on *mu for the calling thread, then return non-zero iff success. Fail, if any thread holds the lock; succeeds with high probability if no thread holds the lock. Requires: *mu initialized. */ GPRAPI int gpr_mu_trylock(gpr_mu* mu); /** --- Condition variable interface --- A while-loop should be used with gpr_cv_wait() when waiting for conditions to become true. See the example below. Variables of type gpr_cv are uninitialized when first declared. */ /** Initialize *cv. Requires: *cv uninitialized. */ GPRAPI void gpr_cv_init(gpr_cv* cv); /** Cause *cv no longer to be initialized, freeing any memory in use. Requires: *cv initialized; no other concurrent operation on *cv.*/ GPRAPI void gpr_cv_destroy(gpr_cv* cv); /** Atomically release *mu and wait on *cv. When the calling thread is woken from *cv or the deadline abs_deadline is exceeded, execute gpr_mu_lock(mu) and return whether the deadline was exceeded. Use abs_deadline==gpr_inf_future for no deadline. abs_deadline can be either an absolute deadline, or a GPR_TIMESPAN. May return even when not woken explicitly. Requires: *mu and *cv initialized; the calling thread holds an exclusive lock on *mu. */ GPRAPI int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline); /** If any threads are waiting on *cv, wake at least one. Clients may treat this as an optimization of gpr_cv_broadcast() for use in the case where waking more than one waiter is not useful. Requires: *cv initialized. */ GPRAPI void gpr_cv_signal(gpr_cv* cv); /** Wake all threads waiting on *cv. Requires: *cv initialized. */ GPRAPI void gpr_cv_broadcast(gpr_cv* cv); /** --- One-time initialization --- gpr_once must be declared with static storage class, and initialized with GPR_ONCE_INIT. e.g., static gpr_once once_var = GPR_ONCE_INIT; */ /** Ensure that (*init_routine)() has been called exactly once (for the specified gpr_once instance) and then return. If multiple threads call gpr_once() on the same gpr_once instance, one of them will call (*init_routine)(), and the others will block until that call finishes.*/ GPRAPI void gpr_once_init(gpr_once* once, void (*init_routine)(void)); /** --- One-time event notification --- These operations act on a gpr_event, which should be initialized with gpr_ev_init(), or with GPR_EVENT_INIT if static, e.g., static gpr_event event_var = GPR_EVENT_INIT; It requires no destruction. */ /** Initialize *ev. */ GPRAPI void gpr_event_init(gpr_event* ev); /** Set *ev so that gpr_event_get() and gpr_event_wait() will return value. Requires: *ev initialized; value != NULL; no prior or concurrent calls to gpr_event_set(ev, ...) since initialization. */ GPRAPI void gpr_event_set(gpr_event* ev, void* value); /** Return the value set by gpr_event_set(ev, ...), or NULL if no such call has completed. If the result is non-NULL, all operations that occurred prior to the gpr_event_set(ev, ...) set will be visible after this call returns. Requires: *ev initialized. This operation is faster than acquiring a mutex on most platforms. */ GPRAPI void* gpr_event_get(gpr_event* ev); /** Wait until *ev is set by gpr_event_set(ev, ...), or abs_deadline is exceeded, then return gpr_event_get(ev). Requires: *ev initialized. Use abs_deadline==gpr_inf_future for no deadline. When the event has been signalled before the call, this operation is faster than acquiring a mutex on most platforms. */ GPRAPI void* gpr_event_wait(gpr_event* ev, gpr_timespec abs_deadline); /** --- Reference counting --- These calls act on the type gpr_refcount. It requires no destruction. */ /** Initialize *r to value n. */ GPRAPI void gpr_ref_init(gpr_refcount* r, int n); /** Increment the reference count *r. Requires *r initialized. */ GPRAPI void gpr_ref(gpr_refcount* r); /** Increment the reference count *r. Requires *r initialized. Crashes if refcount is zero */ GPRAPI void gpr_ref_non_zero(gpr_refcount* r); /** Increment the reference count *r by n. Requires *r initialized, n > 0. */ GPRAPI void gpr_refn(gpr_refcount* r, int n); /** Decrement the reference count *r and return non-zero iff it has reached zero. . Requires *r initialized. */ GPRAPI int gpr_unref(gpr_refcount* r); /** Return non-zero iff the reference count of *r is one, and thus is owned by exactly one object. */ GPRAPI int gpr_ref_is_unique(gpr_refcount* r); /** --- Stats counters --- These calls act on the integral type gpr_stats_counter. It requires no destruction. Static instances may be initialized with gpr_stats_counter c = GPR_STATS_INIT; Beware: These operations do not imply memory barriers. Do not use them to synchronize other events. */ /** Initialize *c to the value n. */ GPRAPI void gpr_stats_init(gpr_stats_counter* c, intptr_t n); /** *c += inc. Requires: *c initialized. */ GPRAPI void gpr_stats_inc(gpr_stats_counter* c, intptr_t inc); /** Return *c. Requires: *c initialized. */ GPRAPI intptr_t gpr_stats_read(const gpr_stats_counter* c); /** ==================Example use of interface=================== A producer-consumer queue of up to N integers, illustrating the use of the calls in this interface. */ #if 0 #define N 4 typedef struct queue { gpr_cv non_empty; /* Signalled when length becomes non-zero. */ gpr_cv non_full; /* Signalled when length becomes non-N. */ gpr_mu mu; /* Protects all fields below. (That is, except during initialization or destruction, the fields below should be accessed only by a thread that holds mu.) */ int head; /* Index of head of queue 0..N-1. */ int length; /* Number of valid elements in queue 0..N. */ int elem[N]; /* elem[head .. head+length-1] are queue elements. */ } queue; /* Initialize *q. */ void queue_init(queue *q) { gpr_mu_init(&q->mu); gpr_cv_init(&q->non_empty); gpr_cv_init(&q->non_full); q->head = 0; q->length = 0; } /* Free storage associated with *q. */ void queue_destroy(queue *q) { gpr_mu_destroy(&q->mu); gpr_cv_destroy(&q->non_empty); gpr_cv_destroy(&q->non_full); } /* Wait until there is room in *q, then append x to *q. */ void queue_append(queue *q, int x) { gpr_mu_lock(&q->mu); /* To wait for a predicate without a deadline, loop on the negation of the predicate, and use gpr_cv_wait(..., gpr_inf_future) inside the loop to release the lock, wait, and reacquire on each iteration. Code that makes the condition true should use gpr_cv_broadcast() on the corresponding condition variable. The predicate must be on state protected by the lock. */ while (q->length == N) { gpr_cv_wait(&q->non_full, &q->mu, gpr_inf_future); } if (q->length == 0) { /* Wake threads blocked in queue_remove(). */ /* It's normal to use gpr_cv_broadcast() or gpr_signal() while holding the lock. */ gpr_cv_broadcast(&q->non_empty); } q->elem[(q->head + q->length) % N] = x; q->length++; gpr_mu_unlock(&q->mu); } /* If it can be done without blocking, append x to *q and return non-zero. Otherwise return 0. */ int queue_try_append(queue *q, int x) { int result = 0; if (gpr_mu_trylock(&q->mu)) { if (q->length != N) { if (q->length == 0) { /* Wake threads blocked in queue_remove(). */ gpr_cv_broadcast(&q->non_empty); } q->elem[(q->head + q->length) % N] = x; q->length++; result = 1; } gpr_mu_unlock(&q->mu); } return result; } /* Wait until the *q is non-empty or deadline abs_deadline passes. If the queue is non-empty, remove its head entry, place it in *head, and return non-zero. Otherwise return 0. */ int queue_remove(queue *q, int *head, gpr_timespec abs_deadline) { int result = 0; gpr_mu_lock(&q->mu); /* To wait for a predicate with a deadline, loop on the negation of the predicate or until gpr_cv_wait() returns true. Code that makes the condition true should use gpr_cv_broadcast() on the corresponding condition variable. The predicate must be on state protected by the lock. */ while (q->length == 0 && !gpr_cv_wait(&q->non_empty, &q->mu, abs_deadline)) { } if (q->length != 0) { /* Queue is non-empty. */ result = 1; if (q->length == N) { /* Wake threads blocked in queue_append(). */ gpr_cv_broadcast(&q->non_full); } *head = q->elem[q->head]; q->head = (q->head + 1) % N; q->length--; } /* else deadline exceeded */ gpr_mu_unlock(&q->mu); return result; } #endif /* 0 */ #ifdef __cplusplus } // extern "C" namespace grpc_core { class mu_guard { public: mu_guard(gpr_mu* mu) : mu_(mu) { gpr_mu_lock(mu); } ~mu_guard() { gpr_mu_unlock(mu_); } mu_guard(const mu_guard&) = delete; mu_guard& operator=(const mu_guard&) = delete; private: gpr_mu* const mu_; }; } // namespace grpc_core #endif #endif /* GRPC_SUPPORT_SYNC_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/sync_custom.h000066400000000000000000000014401334102242000260030ustar00rootroot00000000000000/* * * Copyright 2017 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_SYNC_CUSTOM_H #define GRPC_SUPPORT_SYNC_CUSTOM_H #include #include #endif /* GRPC_SUPPORT_SYNC_CUSTOM_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/sync_generic.h000066400000000000000000000014441334102242000261110ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_SYNC_GENERIC_H #define GRPC_SUPPORT_SYNC_GENERIC_H #include #include #endif /* GRPC_SUPPORT_SYNC_GENERIC_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/sync_posix.h000066400000000000000000000014341334102242000256360ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_SYNC_POSIX_H #define GRPC_SUPPORT_SYNC_POSIX_H #include #include #endif /* GRPC_SUPPORT_SYNC_POSIX_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/sync_windows.h000066400000000000000000000014441334102242000261670ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_SYNC_WINDOWS_H #define GRPC_SUPPORT_SYNC_WINDOWS_H #include #include #endif /* GRPC_SUPPORT_SYNC_WINDOWS_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/thd_id.h000066400000000000000000000021251334102242000246710ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_THD_ID_H #define GRPC_SUPPORT_THD_ID_H /** Thread ID interface for GPR. Used by some wrapped languages for logging purposes. Types gpr_thd_id a unique opaque identifier for a thread. */ #include #ifdef __cplusplus extern "C" { #endif typedef uintptr_t gpr_thd_id; /** Returns the identifier of the current thread. */ GPRAPI gpr_thd_id gpr_thd_currentid(void); #ifdef __cplusplus } #endif #endif /* GRPC_SUPPORT_THD_ID_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/time.h000066400000000000000000000062471334102242000244050ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_TIME_H #define GRPC_SUPPORT_TIME_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** Time constants. */ GPRAPI gpr_timespec gpr_time_0(gpr_clock_type type); /** The zero time interval. */ GPRAPI gpr_timespec gpr_inf_future(gpr_clock_type type); /** The far future */ GPRAPI gpr_timespec gpr_inf_past(gpr_clock_type type); /** The far past. */ #define GPR_MS_PER_SEC 1000 #define GPR_US_PER_SEC 1000000 #define GPR_NS_PER_SEC 1000000000 #define GPR_NS_PER_MS 1000000 #define GPR_NS_PER_US 1000 #define GPR_US_PER_MS 1000 /** initialize time subsystem */ GPRAPI void gpr_time_init(void); /** Return the current time measured from the given clocks epoch. */ GPRAPI gpr_timespec gpr_now(gpr_clock_type clock); /** Convert a timespec from one clock to another */ GPRAPI gpr_timespec gpr_convert_clock_type(gpr_timespec t, gpr_clock_type target_clock); /** Return -ve, 0, or +ve according to whether a < b, a == b, or a > b respectively. */ GPRAPI int gpr_time_cmp(gpr_timespec a, gpr_timespec b); GPRAPI gpr_timespec gpr_time_max(gpr_timespec a, gpr_timespec b); GPRAPI gpr_timespec gpr_time_min(gpr_timespec a, gpr_timespec b); /** Add and subtract times. Calculations saturate at infinities. */ GPRAPI gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b); GPRAPI gpr_timespec gpr_time_sub(gpr_timespec a, gpr_timespec b); /** Return a timespec representing a given number of time units. INT64_MIN is interpreted as gpr_inf_past, and INT64_MAX as gpr_inf_future. */ GPRAPI gpr_timespec gpr_time_from_micros(int64_t x, gpr_clock_type clock_type); GPRAPI gpr_timespec gpr_time_from_nanos(int64_t x, gpr_clock_type clock_type); GPRAPI gpr_timespec gpr_time_from_millis(int64_t x, gpr_clock_type clock_type); GPRAPI gpr_timespec gpr_time_from_seconds(int64_t x, gpr_clock_type clock_type); GPRAPI gpr_timespec gpr_time_from_minutes(int64_t x, gpr_clock_type clock_type); GPRAPI gpr_timespec gpr_time_from_hours(int64_t x, gpr_clock_type clock_type); GPRAPI int32_t gpr_time_to_millis(gpr_timespec timespec); /** Return 1 if two times are equal or within threshold of each other, 0 otherwise */ GPRAPI int gpr_time_similar(gpr_timespec a, gpr_timespec b, gpr_timespec threshold); /** Sleep until at least 'until' - an absolute timeout */ GPRAPI void gpr_sleep_until(gpr_timespec until); GPRAPI double gpr_timespec_to_micros(gpr_timespec t); #ifdef __cplusplus } #endif #endif /* GRPC_SUPPORT_TIME_H */ python-grpc-tools-1.14.1/grpc_root/include/grpc/support/workaround_list.h000066400000000000000000000017501334102242000266670ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_SUPPORT_WORKAROUND_LIST_H #define GRPC_SUPPORT_WORKAROUND_LIST_H /* The list of IDs of server workarounds currently maintained by gRPC. For * explanation and detailed descriptions of workarounds, see * /doc/workarounds.md */ typedef enum { GRPC_WORKAROUND_ID_CRONET_COMPRESSION = 0, GRPC_MAX_WORKAROUND_ID } grpc_workaround_list; #endif /* GRPC_SUPPORT_WORKAROUND_LIST_H */ python-grpc-tools-1.14.1/grpc_root/include/grpcpp/000077500000000000000000000000001334102242000221115ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpcpp/alarm.h000066400000000000000000000056241334102242000233650ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /// An Alarm posts the user provided tag to its associated completion queue upon /// expiry or cancellation. #ifndef GRPCPP_ALARM_H #define GRPCPP_ALARM_H #include #include #include #include #include #include namespace grpc { /// A thin wrapper around \a grpc_alarm (see / \a / src/core/surface/alarm.h). class Alarm : private GrpcLibraryCodegen { public: /// Create an unset completion queue alarm Alarm(); /// Destroy the given completion queue alarm, cancelling it in the process. ~Alarm(); /// DEPRECATED: Create and set a completion queue alarm instance associated to /// \a cq. /// This form is deprecated because it is inherently racy. /// \internal We rely on the presence of \a cq for grpc initialization. If \a /// cq were ever to be removed, a reference to a static /// internal::GrpcLibraryInitializer instance would need to be introduced /// here. \endinternal. template Alarm(CompletionQueue* cq, const T& deadline, void* tag) : Alarm() { SetInternal(cq, TimePoint(deadline).raw_time(), tag); } /// Trigger an alarm instance on completion queue \a cq at the specified time. /// Once the alarm expires (at \a deadline) or it's cancelled (see \a Cancel), /// an event with tag \a tag will be added to \a cq. If the alarm expired, the /// event's success bit will be true, false otherwise (ie, upon cancellation). template void Set(CompletionQueue* cq, const T& deadline, void* tag) { SetInternal(cq, TimePoint(deadline).raw_time(), tag); } /// Alarms aren't copyable. Alarm(const Alarm&) = delete; Alarm& operator=(const Alarm&) = delete; /// Alarms are movable. Alarm(Alarm&& rhs) : alarm_(rhs.alarm_) { rhs.alarm_ = nullptr; } Alarm& operator=(Alarm&& rhs) { alarm_ = rhs.alarm_; rhs.alarm_ = nullptr; return *this; } /// Cancel a completion queue alarm. Calling this function over an alarm that /// has already fired has no effect. void Cancel(); private: void SetInternal(CompletionQueue* cq, gpr_timespec deadline, void* tag); internal::CompletionQueueTag* alarm_; }; } // namespace grpc #endif // GRPCPP_ALARM_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/channel.h000066400000000000000000000053171334102242000237000ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_CHANNEL_H #define GRPCPP_CHANNEL_H #include #include #include #include #include #include struct grpc_channel; namespace grpc { /// Channels represent a connection to an endpoint. Created by \a CreateChannel. class Channel final : public ChannelInterface, public internal::CallHook, public std::enable_shared_from_this, private GrpcLibraryCodegen { public: ~Channel(); /// Get the current channel state. If the channel is in IDLE and /// \a try_to_connect is set to true, try to connect. grpc_connectivity_state GetState(bool try_to_connect) override; /// Returns the LB policy name, or the empty string if not yet available. grpc::string GetLoadBalancingPolicyName() const; /// Returns the service config in JSON form, or the empty string if /// not available. grpc::string GetServiceConfigJSON() const; private: template friend class internal::BlockingUnaryCallImpl; friend std::shared_ptr CreateChannelInternal( const grpc::string& host, grpc_channel* c_channel); Channel(const grpc::string& host, grpc_channel* c_channel); internal::Call CreateCall(const internal::RpcMethod& method, ClientContext* context, CompletionQueue* cq) override; void PerformOpsOnCall(internal::CallOpSetInterface* ops, internal::Call* call) override; void* RegisterMethod(const char* method) override; void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, gpr_timespec deadline, CompletionQueue* cq, void* tag) override; bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, gpr_timespec deadline) override; const grpc::string host_; grpc_channel* const c_channel_; // owned }; } // namespace grpc #endif // GRPCPP_CHANNEL_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/client_context.h000066400000000000000000000026371334102242000253140ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /// A ClientContext allows the person implementing a service client to: /// /// - Add custom metadata key-value pairs that will propagated to the server /// side. /// - Control call settings such as compression and authentication. /// - Initial and trailing metadata coming from the server. /// - Get performance metrics (ie, census). /// /// Context settings are only relevant to the call they are invoked with, that /// is to say, they aren't sticky. Some of these settings, such as the /// compression options, can be made persistent at channel construction time /// (see \a grpc::CreateCustomChannel). /// /// \warning ClientContext instances should \em not be reused across rpcs. #ifndef GRPCPP_CLIENT_CONTEXT_H #define GRPCPP_CLIENT_CONTEXT_H #include #endif // GRPCPP_CLIENT_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/completion_queue.h000066400000000000000000000013711334102242000256410ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_COMPLETION_QUEUE_H #define GRPCPP_COMPLETION_QUEUE_H #include #endif // GRPCPP_COMPLETION_QUEUE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/create_channel.h000066400000000000000000000036431334102242000252230ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_CREATE_CHANNEL_H #define GRPCPP_CREATE_CHANNEL_H #include #include #include #include #include namespace grpc { /// Create a new \a Channel pointing to \a target. /// /// \param target The URI of the endpoint to connect to. /// \param creds Credentials to use for the created channel. If it does not /// hold an object or is invalid, a lame channel (one on which all operations /// fail) is returned. std::shared_ptr CreateChannel( const grpc::string& target, const std::shared_ptr& creds); /// Create a new \em custom \a Channel pointing to \a target. /// /// \warning For advanced use and testing ONLY. Override default channel /// arguments only if necessary. /// /// \param target The URI of the endpoint to connect to. /// \param creds Credentials to use for the created channel. If it does not /// hold an object or is invalid, a lame channel (one on which all operations /// fail) is returned. /// \param args Options for channel creation. std::shared_ptr CreateCustomChannel( const grpc::string& target, const std::shared_ptr& creds, const ChannelArguments& args); } // namespace grpc #endif // GRPCPP_CREATE_CHANNEL_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/create_channel_posix.h000066400000000000000000000032201334102242000264340ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_CREATE_CHANNEL_POSIX_H #define GRPCPP_CREATE_CHANNEL_POSIX_H #include #include #include #include namespace grpc { #ifdef GPR_SUPPORT_CHANNELS_FROM_FD /// Create a new \a Channel communicating over the given file descriptor. /// /// \param target The name of the target. /// \param fd The file descriptor representing a socket. std::shared_ptr CreateInsecureChannelFromFd(const grpc::string& target, int fd); /// Create a new \a Channel communicating over given file descriptor with custom /// channel arguments. /// /// \param target The name of the target. /// \param fd The file descriptor representing a socket. /// \param args Options for channel creation. std::shared_ptr CreateCustomInsecureChannelFromFd( const grpc::string& target, int fd, const ChannelArguments& args); #endif // GPR_SUPPORT_CHANNELS_FROM_FD } // namespace grpc #endif // GRPCPP_CREATE_CHANNEL_POSIX_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/ext/000077500000000000000000000000001334102242000227115ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpcpp/ext/health_check_service_server_builder_option.h000066400000000000000000000031031334102242000336650ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H #define GRPCPP_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H #include #include #include #include namespace grpc { class HealthCheckServiceServerBuilderOption : public ServerBuilderOption { public: /// The ownership of \a hc will be taken and transferred to the grpc server. /// To explicitly disable default service, pass in a nullptr. explicit HealthCheckServiceServerBuilderOption( std::unique_ptr hc); ~HealthCheckServiceServerBuilderOption() override {} void UpdateArguments(ChannelArguments* args) override; void UpdatePlugins( std::vector>* plugins) override; private: std::unique_ptr hc_; }; } // namespace grpc #endif // GRPCPP_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/ext/proto_server_reflection_plugin.h000066400000000000000000000032521334102242000314050ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H #define GRPCPP_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H #include #include namespace grpc { class ServerInitializer; class ProtoServerReflection; } // namespace grpc namespace grpc { namespace reflection { class ProtoServerReflectionPlugin : public ::grpc::ServerBuilderPlugin { public: ProtoServerReflectionPlugin(); ::grpc::string name() override; void InitServer(::grpc::ServerInitializer* si) override; void Finish(::grpc::ServerInitializer* si) override; void ChangeArguments(const ::grpc::string& name, void* value) override; bool has_async_methods() const override; bool has_sync_methods() const override; private: std::shared_ptr reflection_service_; }; /// Add proto reflection plugin to \a ServerBuilder. /// This function should be called at the static initialization time. void InitProtoReflectionServerBuilderPlugin(); } // namespace reflection } // namespace grpc #endif // GRPCPP_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/ext/server_load_reporting.h000066400000000000000000000034751334102242000274710ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_EXT_SERVER_LOAD_REPORTING_H #define GRPCPP_EXT_SERVER_LOAD_REPORTING_H #include #include #include #include #include namespace grpc { namespace load_reporter { namespace experimental { // The ServerBuilderOption to enable server-side load reporting feature. To // enable the feature, please make sure the binary builds with the // grpcpp_server_load_reporting library and set this option in the // ServerBuilder. class LoadReportingServiceServerBuilderOption : public ServerBuilderOption { public: void UpdateArguments(::grpc::ChannelArguments* args) override; void UpdatePlugins(std::vector>* plugins) override; }; // Adds the load reporting cost with \a cost_name and \a cost_value in the // trailing metadata of the server context. void AddLoadReportingCost(grpc::ServerContext* ctx, const grpc::string& cost_name, double cost_value); } // namespace experimental } // namespace load_reporter } // namespace grpc #endif // GRPCPP_EXT_SERVER_LOAD_REPORTING_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/generic/000077500000000000000000000000001334102242000235255ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpcpp/generic/async_generic_service.h000066400000000000000000000014451334102242000302330ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H #define GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H #include #endif // GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/generic/generic_stub.h000066400000000000000000000054111334102242000263500ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_GENERIC_GENERIC_STUB_H #define GRPCPP_GENERIC_GENERIC_STUB_H #include #include #include namespace grpc { class CompletionQueue; typedef ClientAsyncReaderWriter GenericClientAsyncReaderWriter; typedef ClientAsyncResponseReader GenericClientAsyncResponseReader; /// Generic stubs provide a type-unsafe interface to call gRPC methods /// by name. class GenericStub final { public: explicit GenericStub(std::shared_ptr channel) : channel_(channel) {} /// Setup a call to a named method \a method using \a context, but don't /// start it. Let it be started explicitly with StartCall and a tag. /// The return value only indicates whether or not registration of the call /// succeeded (i.e. the call won't proceed if the return value is nullptr). std::unique_ptr PrepareCall( ClientContext* context, const grpc::string& method, CompletionQueue* cq); /// Setup a unary call to a named method \a method using \a context, and don't /// start it. Let it be started explicitly with StartCall. /// The return value only indicates whether or not registration of the call /// succeeded (i.e. the call won't proceed if the return value is nullptr). std::unique_ptr PrepareUnaryCall( ClientContext* context, const grpc::string& method, const ByteBuffer& request, CompletionQueue* cq); /// DEPRECATED for multi-threaded use /// Begin a call to a named method \a method using \a context. /// A tag \a tag will be delivered to \a cq when the call has been started /// (i.e, initial metadata has been sent). /// The return value only indicates whether or not registration of the call /// succeeded (i.e. the call won't proceed if the return value is nullptr). std::unique_ptr Call( ClientContext* context, const grpc::string& method, CompletionQueue* cq, void* tag); private: std::shared_ptr channel_; }; } // namespace grpc #endif // GRPCPP_GENERIC_GENERIC_STUB_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/grpcpp.h000066400000000000000000000044331334102242000235610ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /// \mainpage gRPC C++ API /// /// The gRPC C++ API mainly consists of the following classes: ///
/// - grpc::Channel, which represents the connection to an endpoint. See [the /// gRPC Concepts page](https://grpc.io/docs/guides/concepts.html) for more /// details. Channels are created by the factory function grpc::CreateChannel. /// /// - grpc::CompletionQueue, the producer-consumer queue used for all /// asynchronous communication with the gRPC runtime. /// /// - grpc::ClientContext and grpc::ServerContext, where optional configuration /// for an RPC can be set, such as setting custom metadata to be conveyed to the /// peer, compression settings, authentication, etc. /// /// - grpc::Server, representing a gRPC server, created by grpc::ServerBuilder. /// /// Streaming calls are handled with the streaming classes in /// \ref sync_stream.h and /// \ref async_stream.h. /// /// Refer to the /// [examples](https://github.com/grpc/grpc/blob/master/examples/cpp) /// for code putting these pieces into play. #ifndef GRPCPP_GRPCPP_H #define GRPCPP_GRPCPP_H // Pragma for http://include-what-you-use.org/ tool, tells that following // headers are not private for grpcpp.h and are part of its interface. // IWYU pragma: begin_exports #include #include #include #include #include #include #include #include #include #include // IWYU pragma: end_exports namespace grpc { /// Return gRPC library version. grpc::string Version(); } // namespace grpc #endif // GRPCPP_GRPCPP_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/health_check_service_interface.h000066400000000000000000000034351334102242000304310ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_HEALTH_CHECK_SERVICE_INTERFACE_H #define GRPCPP_HEALTH_CHECK_SERVICE_INTERFACE_H #include namespace grpc { const char kHealthCheckServiceInterfaceArg[] = "grpc.health_check_service_interface"; /// The gRPC server uses this interface to expose the health checking service /// without depending on protobuf. class HealthCheckServiceInterface { public: virtual ~HealthCheckServiceInterface() {} /// Set or change the serving status of the given \a service_name. virtual void SetServingStatus(const grpc::string& service_name, bool serving) = 0; /// Apply to all registered service names. virtual void SetServingStatus(bool serving) = 0; }; /// Enable/disable the default health checking service. This applies to all C++ /// servers created afterwards. For each server, user can override the default /// with a HealthCheckServiceServerBuilderOption. /// NOT thread safe. void EnableDefaultHealthCheckService(bool enable); /// Returns whether the default health checking service is enabled. /// NOT thread safe. bool DefaultHealthCheckServiceEnabled(); } // namespace grpc #endif // GRPCPP_HEALTH_CHECK_SERVICE_INTERFACE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/000077500000000000000000000000001334102242000230525ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/README.md000066400000000000000000000003001334102242000243220ustar00rootroot00000000000000**The APIs in this directory are not stable!** This directory contains header files that need to be installed but are not part of the public API. Users should not use these headers directly. python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/call.h000066400000000000000000000013301334102242000241330ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CALL_H #define GRPCPP_IMPL_CALL_H #include #endif // GRPCPP_IMPL_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/channel_argument_option.h000066400000000000000000000021671334102242000301330ustar00rootroot00000000000000/* * * Copyright 2017 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CHANNEL_ARGUMENT_OPTION_H #define GRPCPP_IMPL_CHANNEL_ARGUMENT_OPTION_H #include #include #include #include namespace grpc { std::unique_ptr MakeChannelArgumentOption( const grpc::string& name, const grpc::string& value); std::unique_ptr MakeChannelArgumentOption( const grpc::string& name, int value); } // namespace grpc #endif // GRPCPP_IMPL_CHANNEL_ARGUMENT_OPTION_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/client_unary_call.h000066400000000000000000000014141334102242000267120ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CLIENT_UNARY_CALL_H #define GRPCPP_IMPL_CLIENT_UNARY_CALL_H #include #endif // GRPCPP_IMPL_CLIENT_UNARY_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/000077500000000000000000000000001334102242000244565ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/async_generic_service.h000066400000000000000000000051311334102242000311600ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_ASYNC_GENERIC_SERVICE_H #define GRPCPP_IMPL_CODEGEN_ASYNC_GENERIC_SERVICE_H #include #include struct grpc_server; namespace grpc { typedef ServerAsyncReaderWriter GenericServerAsyncReaderWriter; typedef ServerAsyncResponseWriter GenericServerAsyncResponseWriter; typedef ServerAsyncReader GenericServerAsyncReader; typedef ServerAsyncWriter GenericServerAsyncWriter; class GenericServerContext final : public ServerContext { public: const grpc::string& method() const { return method_; } const grpc::string& host() const { return host_; } private: friend class Server; friend class ServerInterface; grpc::string method_; grpc::string host_; }; // A generic service at the server side accepts all RPC methods and hosts. It is // typically used in proxies. The generic service can be registered to a server // which also has other services. // Sample usage: // ServerBuilder builder; // auto cq = builder.AddCompletionQueue(); // AsyncGenericService generic_service; // builder.RegisterAsyncGeneicService(&generic_service); // auto server = builder.BuildAndStart(); // // // request a new call // GenericServerContext context; // GenericAsyncReaderWriter stream; // generic_service.RequestCall(&context, &stream, cq.get(), cq.get(), tag); // // When tag is retrieved from cq->Next(), context.method() can be used to look // at the method and the RPC can be handled accordingly. class AsyncGenericService final { public: AsyncGenericService() : server_(nullptr) {} void RequestCall(GenericServerContext* ctx, GenericServerAsyncReaderWriter* reader_writer, CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag); private: friend class Server; Server* server_; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_ASYNC_GENERIC_SERVICE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/async_stream.h000066400000000000000000001225301334102242000273220ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_ASYNC_STREAM_H #define GRPCPP_IMPL_CODEGEN_ASYNC_STREAM_H #include #include #include #include #include #include namespace grpc { class CompletionQueue; namespace internal { /// Common interface for all client side asynchronous streaming. class ClientAsyncStreamingInterface { public: virtual ~ClientAsyncStreamingInterface() {} /// Start the call that was set up by the constructor, but only if the /// constructor was invoked through the "Prepare" API which doesn't actually /// start the call virtual void StartCall(void* tag) = 0; /// Request notification of the reading of the initial metadata. Completion /// will be notified by \a tag on the associated completion queue. /// This call is optional, but if it is used, it cannot be used concurrently /// with or after the \a AsyncReaderInterface::Read method. /// /// \param[in] tag Tag identifying this request. virtual void ReadInitialMetadata(void* tag) = 0; /// Indicate that the stream is to be finished and request notification for /// when the call has been ended. /// Should not be used concurrently with other operations. /// /// It is appropriate to call this method when both: /// * the client side has no more message to send /// (this can be declared implicitly by calling this method, or /// explicitly through an earlier call to the WritesDone method /// of the class in use, e.g. \a ClientAsyncWriterInterface::WritesDone or /// \a ClientAsyncReaderWriterInterface::WritesDone). /// * there are no more messages to be received from the server (this can /// be known implicitly by the calling code, or explicitly from an /// earlier call to \a AsyncReaderInterface::Read that yielded a failed /// result, e.g. cq->Next(&read_tag, &ok) filled in 'ok' with 'false'). /// /// This function will return when either: /// - all incoming messages have been read and the server has returned /// a status. /// - the server has returned a non-OK status. /// - the call failed for some reason and the library generated a /// status. /// /// Note that implementations of this method attempt to receive initial /// metadata from the server if initial metadata hasn't yet been received. /// /// \param[in] tag Tag identifying this request. /// \param[out] status To be updated with the operation status. virtual void Finish(Status* status, void* tag) = 0; }; /// An interface that yields a sequence of messages of type \a R. template class AsyncReaderInterface { public: virtual ~AsyncReaderInterface() {} /// Read a message of type \a R into \a msg. Completion will be notified by \a /// tag on the associated completion queue. /// This is thread-safe with respect to \a Write or \a WritesDone methods. It /// should not be called concurrently with other streaming APIs /// on the same stream. It is not meaningful to call it concurrently /// with another \a AsyncReaderInterface::Read on the same stream since reads /// on the same stream are delivered in order. /// /// \param[out] msg Where to eventually store the read message. /// \param[in] tag The tag identifying the operation. /// /// Side effect: note that this method attempt to receive initial metadata for /// a stream if it hasn't yet been received. virtual void Read(R* msg, void* tag) = 0; }; /// An interface that can be fed a sequence of messages of type \a W. template class AsyncWriterInterface { public: virtual ~AsyncWriterInterface() {} /// Request the writing of \a msg with identifying tag \a tag. /// /// Only one write may be outstanding at any given time. This means that /// after calling Write, one must wait to receive \a tag from the completion /// queue BEFORE calling Write again. /// This is thread-safe with respect to \a AsyncReaderInterface::Read /// /// \param[in] msg The message to be written. /// \param[in] tag The tag identifying the operation. virtual void Write(const W& msg, void* tag) = 0; /// Request the writing of \a msg using WriteOptions \a options with /// identifying tag \a tag. /// /// Only one write may be outstanding at any given time. This means that /// after calling Write, one must wait to receive \a tag from the completion /// queue BEFORE calling Write again. /// WriteOptions \a options is used to set the write options of this message. /// This is thread-safe with respect to \a AsyncReaderInterface::Read /// /// \param[in] msg The message to be written. /// \param[in] options The WriteOptions to be used to write this message. /// \param[in] tag The tag identifying the operation. virtual void Write(const W& msg, WriteOptions options, void* tag) = 0; /// Request the writing of \a msg and coalesce it with the writing /// of trailing metadata, using WriteOptions \a options with /// identifying tag \a tag. /// /// For client, WriteLast is equivalent of performing Write and /// WritesDone in a single step. /// For server, WriteLast buffers the \a msg. The writing of \a msg is held /// until Finish is called, where \a msg and trailing metadata are coalesced /// and write is initiated. Note that WriteLast can only buffer \a msg up to /// the flow control window size. If \a msg size is larger than the window /// size, it will be sent on wire without buffering. /// /// \param[in] msg The message to be written. /// \param[in] options The WriteOptions to be used to write this message. /// \param[in] tag The tag identifying the operation. void WriteLast(const W& msg, WriteOptions options, void* tag) { Write(msg, options.set_last_message(), tag); } }; } // namespace internal template class ClientAsyncReaderInterface : public internal::ClientAsyncStreamingInterface, public internal::AsyncReaderInterface {}; namespace internal { template class ClientAsyncReaderFactory { public: /// Create a stream object. /// Write the first request out if \a start is set. /// \a tag will be notified on \a cq when the call has been started and /// \a request has been written out. If \a start is not set, \a tag must be /// nullptr and the actual call must be initiated by StartCall /// Note that \a context will be used to fill in custom initial metadata /// used to send to the server when starting the call. template static ClientAsyncReader* Create(ChannelInterface* channel, CompletionQueue* cq, const ::grpc::internal::RpcMethod& method, ClientContext* context, const W& request, bool start, void* tag) { ::grpc::internal::Call call = channel->CreateCall(method, context, cq); return new (g_core_codegen_interface->grpc_call_arena_alloc( call.call(), sizeof(ClientAsyncReader))) ClientAsyncReader(call, context, request, start, tag); } }; } // namespace internal /// Async client-side API for doing server-streaming RPCs, /// where the incoming message stream coming from the server has /// messages of type \a R. template class ClientAsyncReader final : public ClientAsyncReaderInterface { public: // always allocated against a call arena, no memory free required static void operator delete(void* ptr, std::size_t size) { assert(size == sizeof(ClientAsyncReader)); } void StartCall(void* tag) override { assert(!started_); started_ = true; StartCallInternal(tag); } /// See the \a ClientAsyncStreamingInterface.ReadInitialMetadata /// method for semantics. /// /// Side effect: /// - upon receiving initial metadata from the server, /// the \a ClientContext associated with this call is updated, and the /// calling code can access the received metadata through the /// \a ClientContext. void ReadInitialMetadata(void* tag) override { assert(started_); GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); meta_ops_.set_output_tag(tag); meta_ops_.RecvInitialMetadata(context_); call_.PerformOps(&meta_ops_); } void Read(R* msg, void* tag) override { assert(started_); read_ops_.set_output_tag(tag); if (!context_->initial_metadata_received_) { read_ops_.RecvInitialMetadata(context_); } read_ops_.RecvMessage(msg); call_.PerformOps(&read_ops_); } /// See the \a ClientAsyncStreamingInterface.Finish method for semantics. /// /// Side effect: /// - the \a ClientContext associated with this call is updated with /// possible initial and trailing metadata received from the server. void Finish(Status* status, void* tag) override { assert(started_); finish_ops_.set_output_tag(tag); if (!context_->initial_metadata_received_) { finish_ops_.RecvInitialMetadata(context_); } finish_ops_.ClientRecvStatus(context_, status); call_.PerformOps(&finish_ops_); } private: friend class internal::ClientAsyncReaderFactory; template ClientAsyncReader(::grpc::internal::Call call, ClientContext* context, const W& request, bool start, void* tag) : context_(context), call_(call), started_(start) { // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(init_ops_.SendMessage(request).ok()); init_ops_.ClientSendClose(); if (start) { StartCallInternal(tag); } else { assert(tag == nullptr); } } void StartCallInternal(void* tag) { init_ops_.SendInitialMetadata(context_->send_initial_metadata_, context_->initial_metadata_flags()); init_ops_.set_output_tag(tag); call_.PerformOps(&init_ops_); } ClientContext* context_; ::grpc::internal::Call call_; bool started_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpSendMessage, ::grpc::internal::CallOpClientSendClose> init_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, ::grpc::internal::CallOpRecvMessage> read_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, ::grpc::internal::CallOpClientRecvStatus> finish_ops_; }; /// Common interface for client side asynchronous writing. template class ClientAsyncWriterInterface : public internal::ClientAsyncStreamingInterface, public internal::AsyncWriterInterface { public: /// Signal the client is done with the writes (half-close the client stream). /// Thread-safe with respect to \a AsyncReaderInterface::Read /// /// \param[in] tag The tag identifying the operation. virtual void WritesDone(void* tag) = 0; }; namespace internal { template class ClientAsyncWriterFactory { public: /// Create a stream object. /// Start the RPC if \a start is set /// \a tag will be notified on \a cq when the call has been started (i.e. /// intitial metadata sent) and \a request has been written out. /// If \a start is not set, \a tag must be nullptr and the actual call /// must be initiated by StartCall /// Note that \a context will be used to fill in custom initial metadata /// used to send to the server when starting the call. /// \a response will be filled in with the single expected response /// message from the server upon a successful call to the \a Finish /// method of this instance. template static ClientAsyncWriter* Create(ChannelInterface* channel, CompletionQueue* cq, const ::grpc::internal::RpcMethod& method, ClientContext* context, R* response, bool start, void* tag) { ::grpc::internal::Call call = channel->CreateCall(method, context, cq); return new (g_core_codegen_interface->grpc_call_arena_alloc( call.call(), sizeof(ClientAsyncWriter))) ClientAsyncWriter(call, context, response, start, tag); } }; } // namespace internal /// Async API on the client side for doing client-streaming RPCs, /// where the outgoing message stream going to the server contains /// messages of type \a W. template class ClientAsyncWriter final : public ClientAsyncWriterInterface { public: // always allocated against a call arena, no memory free required static void operator delete(void* ptr, std::size_t size) { assert(size == sizeof(ClientAsyncWriter)); } void StartCall(void* tag) override { assert(!started_); started_ = true; StartCallInternal(tag); } /// See the \a ClientAsyncStreamingInterface.ReadInitialMetadata method for /// semantics. /// /// Side effect: /// - upon receiving initial metadata from the server, the \a ClientContext /// associated with this call is updated, and the calling code can access /// the received metadata through the \a ClientContext. void ReadInitialMetadata(void* tag) override { assert(started_); GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); meta_ops_.set_output_tag(tag); meta_ops_.RecvInitialMetadata(context_); call_.PerformOps(&meta_ops_); } void Write(const W& msg, void* tag) override { assert(started_); write_ops_.set_output_tag(tag); // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); call_.PerformOps(&write_ops_); } void Write(const W& msg, WriteOptions options, void* tag) override { assert(started_); write_ops_.set_output_tag(tag); if (options.is_last_message()) { options.set_buffer_hint(); write_ops_.ClientSendClose(); } // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); call_.PerformOps(&write_ops_); } void WritesDone(void* tag) override { assert(started_); write_ops_.set_output_tag(tag); write_ops_.ClientSendClose(); call_.PerformOps(&write_ops_); } /// See the \a ClientAsyncStreamingInterface.Finish method for semantics. /// /// Side effect: /// - the \a ClientContext associated with this call is updated with /// possible initial and trailing metadata received from the server. /// - attempts to fill in the \a response parameter passed to this class's /// constructor with the server's response message. void Finish(Status* status, void* tag) override { assert(started_); finish_ops_.set_output_tag(tag); if (!context_->initial_metadata_received_) { finish_ops_.RecvInitialMetadata(context_); } finish_ops_.ClientRecvStatus(context_, status); call_.PerformOps(&finish_ops_); } private: friend class internal::ClientAsyncWriterFactory; template ClientAsyncWriter(::grpc::internal::Call call, ClientContext* context, R* response, bool start, void* tag) : context_(context), call_(call), started_(start) { finish_ops_.RecvMessage(response); finish_ops_.AllowNoMessage(); if (start) { StartCallInternal(tag); } else { assert(tag == nullptr); } } void StartCallInternal(void* tag) { write_ops_.SendInitialMetadata(context_->send_initial_metadata_, context_->initial_metadata_flags()); // if corked bit is set in context, we just keep the initial metadata // buffered up to coalesce with later message send. No op is performed. if (!context_->initial_metadata_corked_) { write_ops_.set_output_tag(tag); call_.PerformOps(&write_ops_); } } ClientContext* context_; ::grpc::internal::Call call_; bool started_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpSendMessage, ::grpc::internal::CallOpClientSendClose> write_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, ::grpc::internal::CallOpGenericRecvMessage, ::grpc::internal::CallOpClientRecvStatus> finish_ops_; }; /// Async client-side interface for bi-directional streaming, /// where the client-to-server message stream has messages of type \a W, /// and the server-to-client message stream has messages of type \a R. template class ClientAsyncReaderWriterInterface : public internal::ClientAsyncStreamingInterface, public internal::AsyncWriterInterface, public internal::AsyncReaderInterface { public: /// Signal the client is done with the writes (half-close the client stream). /// Thread-safe with respect to \a AsyncReaderInterface::Read /// /// \param[in] tag The tag identifying the operation. virtual void WritesDone(void* tag) = 0; }; namespace internal { template class ClientAsyncReaderWriterFactory { public: /// Create a stream object. /// Start the RPC request if \a start is set. /// \a tag will be notified on \a cq when the call has been started (i.e. /// intitial metadata sent). If \a start is not set, \a tag must be /// nullptr and the actual call must be initiated by StartCall /// Note that \a context will be used to fill in custom initial metadata /// used to send to the server when starting the call. static ClientAsyncReaderWriter* Create( ChannelInterface* channel, CompletionQueue* cq, const ::grpc::internal::RpcMethod& method, ClientContext* context, bool start, void* tag) { ::grpc::internal::Call call = channel->CreateCall(method, context, cq); return new (g_core_codegen_interface->grpc_call_arena_alloc( call.call(), sizeof(ClientAsyncReaderWriter))) ClientAsyncReaderWriter(call, context, start, tag); } }; } // namespace internal /// Async client-side interface for bi-directional streaming, /// where the outgoing message stream going to the server /// has messages of type \a W, and the incoming message stream coming /// from the server has messages of type \a R. template class ClientAsyncReaderWriter final : public ClientAsyncReaderWriterInterface { public: // always allocated against a call arena, no memory free required static void operator delete(void* ptr, std::size_t size) { assert(size == sizeof(ClientAsyncReaderWriter)); } void StartCall(void* tag) override { assert(!started_); started_ = true; StartCallInternal(tag); } /// See the \a ClientAsyncStreamingInterface.ReadInitialMetadata method /// for semantics of this method. /// /// Side effect: /// - upon receiving initial metadata from the server, the \a ClientContext /// is updated with it, and then the receiving initial metadata can /// be accessed through this \a ClientContext. void ReadInitialMetadata(void* tag) override { assert(started_); GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); meta_ops_.set_output_tag(tag); meta_ops_.RecvInitialMetadata(context_); call_.PerformOps(&meta_ops_); } void Read(R* msg, void* tag) override { assert(started_); read_ops_.set_output_tag(tag); if (!context_->initial_metadata_received_) { read_ops_.RecvInitialMetadata(context_); } read_ops_.RecvMessage(msg); call_.PerformOps(&read_ops_); } void Write(const W& msg, void* tag) override { assert(started_); write_ops_.set_output_tag(tag); // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); call_.PerformOps(&write_ops_); } void Write(const W& msg, WriteOptions options, void* tag) override { assert(started_); write_ops_.set_output_tag(tag); if (options.is_last_message()) { options.set_buffer_hint(); write_ops_.ClientSendClose(); } // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); call_.PerformOps(&write_ops_); } void WritesDone(void* tag) override { assert(started_); write_ops_.set_output_tag(tag); write_ops_.ClientSendClose(); call_.PerformOps(&write_ops_); } /// See the \a ClientAsyncStreamingInterface.Finish method for semantics. /// Side effect /// - the \a ClientContext associated with this call is updated with /// possible initial and trailing metadata sent from the server. void Finish(Status* status, void* tag) override { assert(started_); finish_ops_.set_output_tag(tag); if (!context_->initial_metadata_received_) { finish_ops_.RecvInitialMetadata(context_); } finish_ops_.ClientRecvStatus(context_, status); call_.PerformOps(&finish_ops_); } private: friend class internal::ClientAsyncReaderWriterFactory; ClientAsyncReaderWriter(::grpc::internal::Call call, ClientContext* context, bool start, void* tag) : context_(context), call_(call), started_(start) { if (start) { StartCallInternal(tag); } else { assert(tag == nullptr); } } void StartCallInternal(void* tag) { write_ops_.SendInitialMetadata(context_->send_initial_metadata_, context_->initial_metadata_flags()); // if corked bit is set in context, we just keep the initial metadata // buffered up to coalesce with later message send. No op is performed. if (!context_->initial_metadata_corked_) { write_ops_.set_output_tag(tag); call_.PerformOps(&write_ops_); } } ClientContext* context_; ::grpc::internal::Call call_; bool started_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, ::grpc::internal::CallOpRecvMessage> read_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpSendMessage, ::grpc::internal::CallOpClientSendClose> write_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, ::grpc::internal::CallOpClientRecvStatus> finish_ops_; }; template class ServerAsyncReaderInterface : public internal::ServerAsyncStreamingInterface, public internal::AsyncReaderInterface { public: /// Indicate that the stream is to be finished with a certain status code /// and also send out \a msg response to the client. /// Request notification for when the server has sent the response and the /// appropriate signals to the client to end the call. /// Should not be used concurrently with other operations. /// /// It is appropriate to call this method when: /// * all messages from the client have been received (either known /// implictly, or explicitly because a previous /// \a AsyncReaderInterface::Read operation with a non-ok result, /// e.g., cq->Next(&read_tag, &ok) filled in 'ok' with 'false'). /// /// This operation will end when the server has finished sending out initial /// metadata (if not sent already), response message, and status, or if /// some failure occurred when trying to do so. /// /// \param[in] tag Tag identifying this request. /// \param[in] status To be sent to the client as the result of this call. /// \param[in] msg To be sent to the client as the response for this call. virtual void Finish(const W& msg, const Status& status, void* tag) = 0; /// Indicate that the stream is to be finished with a certain /// non-OK status code. /// Request notification for when the server has sent the appropriate /// signals to the client to end the call. /// Should not be used concurrently with other operations. /// /// This call is meant to end the call with some error, and can be called at /// any point that the server would like to "fail" the call (though note /// this shouldn't be called concurrently with any other "sending" call, like /// \a AsyncWriterInterface::Write). /// /// This operation will end when the server has finished sending out initial /// metadata (if not sent already), and status, or if some failure occurred /// when trying to do so. /// /// \param[in] tag Tag identifying this request. /// \param[in] status To be sent to the client as the result of this call. /// - Note: \a status must have a non-OK code. virtual void FinishWithError(const Status& status, void* tag) = 0; }; /// Async server-side API for doing client-streaming RPCs, /// where the incoming message stream from the client has messages of type \a R, /// and the single response message sent from the server is type \a W. template class ServerAsyncReader final : public ServerAsyncReaderInterface { public: explicit ServerAsyncReader(ServerContext* ctx) : call_(nullptr, nullptr, nullptr), ctx_(ctx) {} /// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics. /// /// Implicit input parameter: /// - The initial metadata that will be sent to the client from this op will /// be taken from the \a ServerContext associated with the call. void SendInitialMetadata(void* tag) override { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); meta_ops_.set_output_tag(tag); meta_ops_.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { meta_ops_.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; call_.PerformOps(&meta_ops_); } void Read(R* msg, void* tag) override { read_ops_.set_output_tag(tag); read_ops_.RecvMessage(msg); call_.PerformOps(&read_ops_); } /// See the \a ServerAsyncReaderInterface.Read method for semantics /// /// Side effect: /// - also sends initial metadata if not alreay sent. /// - uses the \a ServerContext associated with this call to send possible /// initial and trailing metadata. /// /// Note: \a msg is not sent if \a status has a non-OK code. void Finish(const W& msg, const Status& status, void* tag) override { finish_ops_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { finish_ops_.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { finish_ops_.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; } // The response is dropped if the status is not OK. if (status.ok()) { finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, finish_ops_.SendMessage(msg)); } else { finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status); } call_.PerformOps(&finish_ops_); } /// See the \a ServerAsyncReaderInterface.Read method for semantics /// /// Side effect: /// - also sends initial metadata if not alreay sent. /// - uses the \a ServerContext associated with this call to send possible /// initial and trailing metadata. void FinishWithError(const Status& status, void* tag) override { GPR_CODEGEN_ASSERT(!status.ok()); finish_ops_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { finish_ops_.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { finish_ops_.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; } finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status); call_.PerformOps(&finish_ops_); } private: void BindCall(::grpc::internal::Call* call) override { call_ = *call; } ::grpc::internal::Call call_; ServerContext* ctx_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvMessage> read_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpSendMessage, ::grpc::internal::CallOpServerSendStatus> finish_ops_; }; template class ServerAsyncWriterInterface : public internal::ServerAsyncStreamingInterface, public internal::AsyncWriterInterface { public: /// Indicate that the stream is to be finished with a certain status code. /// Request notification for when the server has sent the appropriate /// signals to the client to end the call. /// Should not be used concurrently with other operations. /// /// It is appropriate to call this method when either: /// * all messages from the client have been received (either known /// implictly, or explicitly because a previous \a /// AsyncReaderInterface::Read operation with a non-ok /// result (e.g., cq->Next(&read_tag, &ok) filled in 'ok' with 'false'. /// * it is desired to end the call early with some non-OK status code. /// /// This operation will end when the server has finished sending out initial /// metadata (if not sent already), response message, and status, or if /// some failure occurred when trying to do so. /// /// \param[in] tag Tag identifying this request. /// \param[in] status To be sent to the client as the result of this call. virtual void Finish(const Status& status, void* tag) = 0; /// Request the writing of \a msg and coalesce it with trailing metadata which /// contains \a status, using WriteOptions options with /// identifying tag \a tag. /// /// WriteAndFinish is equivalent of performing WriteLast and Finish /// in a single step. /// /// \param[in] msg The message to be written. /// \param[in] options The WriteOptions to be used to write this message. /// \param[in] status The Status that server returns to client. /// \param[in] tag The tag identifying the operation. virtual void WriteAndFinish(const W& msg, WriteOptions options, const Status& status, void* tag) = 0; }; /// Async server-side API for doing server streaming RPCs, /// where the outgoing message stream from the server has messages of type \a W. template class ServerAsyncWriter final : public ServerAsyncWriterInterface { public: explicit ServerAsyncWriter(ServerContext* ctx) : call_(nullptr, nullptr, nullptr), ctx_(ctx) {} /// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics. /// /// Implicit input parameter: /// - The initial metadata that will be sent to the client from this op will /// be taken from the \a ServerContext associated with the call. /// /// \param[in] tag Tag identifying this request. void SendInitialMetadata(void* tag) override { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); meta_ops_.set_output_tag(tag); meta_ops_.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { meta_ops_.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; call_.PerformOps(&meta_ops_); } void Write(const W& msg, void* tag) override { write_ops_.set_output_tag(tag); EnsureInitialMetadataSent(&write_ops_); // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); call_.PerformOps(&write_ops_); } void Write(const W& msg, WriteOptions options, void* tag) override { write_ops_.set_output_tag(tag); if (options.is_last_message()) { options.set_buffer_hint(); } EnsureInitialMetadataSent(&write_ops_); // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); call_.PerformOps(&write_ops_); } /// See the \a ServerAsyncWriterInterface.WriteAndFinish method for semantics. /// /// Implicit input parameter: /// - the \a ServerContext associated with this call is used /// for sending trailing (and initial) metadata to the client. /// /// Note: \a status must have an OK code. void WriteAndFinish(const W& msg, WriteOptions options, const Status& status, void* tag) override { write_ops_.set_output_tag(tag); EnsureInitialMetadataSent(&write_ops_); options.set_buffer_hint(); GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); write_ops_.ServerSendStatus(ctx_->trailing_metadata_, status); call_.PerformOps(&write_ops_); } /// See the \a ServerAsyncWriterInterface.Finish method for semantics. /// /// Implicit input parameter: /// - the \a ServerContext associated with this call is used for sending /// trailing (and initial if not already sent) metadata to the client. /// /// Note: there are no restrictions are the code of /// \a status,it may be non-OK void Finish(const Status& status, void* tag) override { finish_ops_.set_output_tag(tag); EnsureInitialMetadataSent(&finish_ops_); finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status); call_.PerformOps(&finish_ops_); } private: void BindCall(::grpc::internal::Call* call) override { call_ = *call; } template void EnsureInitialMetadataSent(T* ops) { if (!ctx_->sent_initial_metadata_) { ops->SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { ops->set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; } } ::grpc::internal::Call call_; ServerContext* ctx_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpSendMessage, ::grpc::internal::CallOpServerSendStatus> write_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpServerSendStatus> finish_ops_; }; /// Server-side interface for asynchronous bi-directional streaming. template class ServerAsyncReaderWriterInterface : public internal::ServerAsyncStreamingInterface, public internal::AsyncWriterInterface, public internal::AsyncReaderInterface { public: /// Indicate that the stream is to be finished with a certain status code. /// Request notification for when the server has sent the appropriate /// signals to the client to end the call. /// Should not be used concurrently with other operations. /// /// It is appropriate to call this method when either: /// * all messages from the client have been received (either known /// implictly, or explicitly because a previous \a /// AsyncReaderInterface::Read operation /// with a non-ok result (e.g., cq->Next(&read_tag, &ok) filled in 'ok' /// with 'false'. /// * it is desired to end the call early with some non-OK status code. /// /// This operation will end when the server has finished sending out initial /// metadata (if not sent already), response message, and status, or if some /// failure occurred when trying to do so. /// /// \param[in] tag Tag identifying this request. /// \param[in] status To be sent to the client as the result of this call. virtual void Finish(const Status& status, void* tag) = 0; /// Request the writing of \a msg and coalesce it with trailing metadata which /// contains \a status, using WriteOptions options with /// identifying tag \a tag. /// /// WriteAndFinish is equivalent of performing WriteLast and Finish in a /// single step. /// /// \param[in] msg The message to be written. /// \param[in] options The WriteOptions to be used to write this message. /// \param[in] status The Status that server returns to client. /// \param[in] tag The tag identifying the operation. virtual void WriteAndFinish(const W& msg, WriteOptions options, const Status& status, void* tag) = 0; }; /// Async server-side API for doing bidirectional streaming RPCs, /// where the incoming message stream coming from the client has messages of /// type \a R, and the outgoing message stream coming from the server has /// messages of type \a W. template class ServerAsyncReaderWriter final : public ServerAsyncReaderWriterInterface { public: explicit ServerAsyncReaderWriter(ServerContext* ctx) : call_(nullptr, nullptr, nullptr), ctx_(ctx) {} /// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics. /// /// Implicit input parameter: /// - The initial metadata that will be sent to the client from this op will /// be taken from the \a ServerContext associated with the call. /// /// \param[in] tag Tag identifying this request. void SendInitialMetadata(void* tag) override { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); meta_ops_.set_output_tag(tag); meta_ops_.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { meta_ops_.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; call_.PerformOps(&meta_ops_); } void Read(R* msg, void* tag) override { read_ops_.set_output_tag(tag); read_ops_.RecvMessage(msg); call_.PerformOps(&read_ops_); } void Write(const W& msg, void* tag) override { write_ops_.set_output_tag(tag); EnsureInitialMetadataSent(&write_ops_); // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); call_.PerformOps(&write_ops_); } void Write(const W& msg, WriteOptions options, void* tag) override { write_ops_.set_output_tag(tag); if (options.is_last_message()) { options.set_buffer_hint(); } EnsureInitialMetadataSent(&write_ops_); GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); call_.PerformOps(&write_ops_); } /// See the \a ServerAsyncReaderWriterInterface.WriteAndFinish /// method for semantics. /// /// Implicit input parameter: /// - the \a ServerContext associated with this call is used /// for sending trailing (and initial) metadata to the client. /// /// Note: \a status must have an OK code. void WriteAndFinish(const W& msg, WriteOptions options, const Status& status, void* tag) override { write_ops_.set_output_tag(tag); EnsureInitialMetadataSent(&write_ops_); options.set_buffer_hint(); GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); write_ops_.ServerSendStatus(ctx_->trailing_metadata_, status); call_.PerformOps(&write_ops_); } /// See the \a ServerAsyncReaderWriterInterface.Finish method for semantics. /// /// Implicit input parameter: /// - the \a ServerContext associated with this call is used for sending /// trailing (and initial if not already sent) metadata to the client. /// /// Note: there are no restrictions are the code of \a status, /// it may be non-OK void Finish(const Status& status, void* tag) override { finish_ops_.set_output_tag(tag); EnsureInitialMetadataSent(&finish_ops_); finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status); call_.PerformOps(&finish_ops_); } private: friend class ::grpc::Server; void BindCall(::grpc::internal::Call* call) override { call_ = *call; } template void EnsureInitialMetadataSent(T* ops) { if (!ctx_->sent_initial_metadata_) { ops->SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { ops->set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; } } ::grpc::internal::Call call_; ServerContext* ctx_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> meta_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvMessage> read_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpSendMessage, ::grpc::internal::CallOpServerSendStatus> write_ops_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpServerSendStatus> finish_ops_; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_ASYNC_STREAM_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/async_unary_call.h000066400000000000000000000300111334102242000301500ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_H #define GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_H #include #include #include #include #include #include #include namespace grpc { class CompletionQueue; extern CoreCodegenInterface* g_core_codegen_interface; /// An interface relevant for async client side unary RPCs (which send /// one request message to a server and receive one response message). template class ClientAsyncResponseReaderInterface { public: virtual ~ClientAsyncResponseReaderInterface() {} /// Start the call that was set up by the constructor, but only if the /// constructor was invoked through the "Prepare" API which doesn't actually /// start the call virtual void StartCall() = 0; /// Request notification of the reading of initial metadata. Completion /// will be notified by \a tag on the associated completion queue. /// This call is optional, but if it is used, it cannot be used concurrently /// with or after the \a Finish method. /// /// \param[in] tag Tag identifying this request. virtual void ReadInitialMetadata(void* tag) = 0; /// Request to receive the server's response \a msg and final \a status for /// the call, and to notify \a tag on this call's completion queue when /// finished. /// /// This function will return when either: /// - when the server's response message and status have been received. /// - when the server has returned a non-OK status (no message expected in /// this case). /// - when the call failed for some reason and the library generated a /// non-OK status. /// /// \param[in] tag Tag identifying this request. /// \param[out] status To be updated with the operation status. /// \param[out] msg To be filled in with the server's response message. virtual void Finish(R* msg, Status* status, void* tag) = 0; }; namespace internal { template class ClientAsyncResponseReaderFactory { public: /// Start a call and write the request out if \a start is set. /// \a tag will be notified on \a cq when the call has been started (i.e. /// intitial metadata sent) and \a request has been written out. /// If \a start is not set, the actual call must be initiated by StartCall /// Note that \a context will be used to fill in custom initial metadata /// used to send to the server when starting the call. template static ClientAsyncResponseReader* Create( ChannelInterface* channel, CompletionQueue* cq, const ::grpc::internal::RpcMethod& method, ClientContext* context, const W& request, bool start) { ::grpc::internal::Call call = channel->CreateCall(method, context, cq); return new (g_core_codegen_interface->grpc_call_arena_alloc( call.call(), sizeof(ClientAsyncResponseReader))) ClientAsyncResponseReader(call, context, request, start); } }; } // namespace internal /// Async API for client-side unary RPCs, where the message response /// received from the server is of type \a R. template class ClientAsyncResponseReader final : public ClientAsyncResponseReaderInterface { public: // always allocated against a call arena, no memory free required static void operator delete(void* ptr, std::size_t size) { assert(size == sizeof(ClientAsyncResponseReader)); } // This operator should never be called as the memory should be freed as part // of the arena destruction. It only exists to provide a matching operator // delete to the operator new so that some compilers will not complain (see // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this // there are no tests catching the compiler warning. static void operator delete(void*, void*) { assert(0); } void StartCall() override { assert(!started_); started_ = true; StartCallInternal(); } /// See \a ClientAsyncResponseReaderInterface::ReadInitialMetadata for /// semantics. /// /// Side effect: /// - the \a ClientContext associated with this call is updated with /// possible initial and trailing metadata sent from the server. void ReadInitialMetadata(void* tag) override { assert(started_); GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); single_buf.set_output_tag(tag); single_buf.RecvInitialMetadata(context_); call_.PerformOps(&single_buf); initial_metadata_read_ = true; } /// See \a ClientAysncResponseReaderInterface::Finish for semantics. /// /// Side effect: /// - the \a ClientContext associated with this call is updated with /// possible initial and trailing metadata sent from the server. void Finish(R* msg, Status* status, void* tag) override { assert(started_); if (initial_metadata_read_) { finish_buf.set_output_tag(tag); finish_buf.RecvMessage(msg); finish_buf.AllowNoMessage(); finish_buf.ClientRecvStatus(context_, status); call_.PerformOps(&finish_buf); } else { single_buf.set_output_tag(tag); single_buf.RecvInitialMetadata(context_); single_buf.RecvMessage(msg); single_buf.AllowNoMessage(); single_buf.ClientRecvStatus(context_, status); call_.PerformOps(&single_buf); } } private: friend class internal::ClientAsyncResponseReaderFactory; ClientContext* const context_; ::grpc::internal::Call call_; bool started_; bool initial_metadata_read_ = false; template ClientAsyncResponseReader(::grpc::internal::Call call, ClientContext* context, const W& request, bool start) : context_(context), call_(call), started_(start) { // Bind the metadata at time of StartCallInternal but set up the rest here // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(single_buf.SendMessage(request).ok()); single_buf.ClientSendClose(); if (start) StartCallInternal(); } void StartCallInternal() { single_buf.SendInitialMetadata(context_->send_initial_metadata_, context_->initial_metadata_flags()); } // disable operator new static void* operator new(std::size_t size); static void* operator new(std::size_t size, void* p) { return p; } ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpSendMessage, ::grpc::internal::CallOpClientSendClose, ::grpc::internal::CallOpRecvInitialMetadata, ::grpc::internal::CallOpRecvMessage, ::grpc::internal::CallOpClientRecvStatus> single_buf; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvMessage, ::grpc::internal::CallOpClientRecvStatus> finish_buf; }; /// Async server-side API for handling unary calls, where the single /// response message sent to the client is of type \a W. template class ServerAsyncResponseWriter final : public internal::ServerAsyncStreamingInterface { public: explicit ServerAsyncResponseWriter(ServerContext* ctx) : call_(nullptr, nullptr, nullptr), ctx_(ctx) {} /// See \a ServerAsyncStreamingInterface::SendInitialMetadata for semantics. /// /// Side effect: /// The initial metadata that will be sent to the client from this op will /// be taken from the \a ServerContext associated with the call. /// /// \param[in] tag Tag identifying this request. void SendInitialMetadata(void* tag) override { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); meta_buf_.set_output_tag(tag); meta_buf_.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { meta_buf_.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; call_.PerformOps(&meta_buf_); } /// Indicate that the stream is to be finished and request notification /// when the server has sent the appropriate signals to the client to /// end the call. Should not be used concurrently with other operations. /// /// \param[in] tag Tag identifying this request. /// \param[in] status To be sent to the client as the result of the call. /// \param[in] msg Message to be sent to the client. /// /// Side effect: /// - also sends initial metadata if not already sent (using the /// \a ServerContext associated with this call). /// /// Note: if \a status has a non-OK code, then \a msg will not be sent, /// and the client will receive only the status with possible trailing /// metadata. void Finish(const W& msg, const Status& status, void* tag) { finish_buf_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { finish_buf_.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { finish_buf_.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; } // The response is dropped if the status is not OK. if (status.ok()) { finish_buf_.ServerSendStatus(ctx_->trailing_metadata_, finish_buf_.SendMessage(msg)); } else { finish_buf_.ServerSendStatus(ctx_->trailing_metadata_, status); } call_.PerformOps(&finish_buf_); } /// Indicate that the stream is to be finished with a non-OK status, /// and request notification for when the server has finished sending the /// appropriate signals to the client to end the call. /// Should not be used concurrently with other operations. /// /// \param[in] tag Tag identifying this request. /// \param[in] status To be sent to the client as the result of the call. /// - Note: \a status must have a non-OK code. /// /// Side effect: /// - also sends initial metadata if not already sent (using the /// \a ServerContext associated with this call). void FinishWithError(const Status& status, void* tag) { GPR_CODEGEN_ASSERT(!status.ok()); finish_buf_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { finish_buf_.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { finish_buf_.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; } finish_buf_.ServerSendStatus(ctx_->trailing_metadata_, status); call_.PerformOps(&finish_buf_); } private: void BindCall(::grpc::internal::Call* call) override { call_ = *call; } ::grpc::internal::Call call_; ServerContext* ctx_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> meta_buf_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpSendMessage, ::grpc::internal::CallOpServerSendStatus> finish_buf_; }; } // namespace grpc namespace std { template class default_delete> { public: void operator()(void* p) {} }; template class default_delete> { public: void operator()(void* p) {} }; } // namespace std #endif // GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/byte_buffer.h000066400000000000000000000145531334102242000271330ustar00rootroot00000000000000/* * * Copyright 2017 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_BYTE_BUFFER_H #define GRPCPP_IMPL_CODEGEN_BYTE_BUFFER_H #include #include #include #include #include #include #include namespace grpc { class ServerInterface; class ByteBuffer; class ServerInterface; namespace internal { class CallOpSendMessage; template class CallOpRecvMessage; class CallOpGenericRecvMessage; class MethodHandler; template class RpcMethodHandler; template class ServerStreamingHandler; template class DeserializeFuncType; class GrpcByteBufferPeer; } // namespace internal /// A sequence of bytes. class ByteBuffer final { public: /// Constuct an empty buffer. ByteBuffer() : buffer_(nullptr) {} /// Construct buffer from \a slices, of which there are \a nslices. ByteBuffer(const Slice* slices, size_t nslices) { // The following assertions check that the representation of a grpc::Slice // is identical to that of a grpc_slice: it has a grpc_slice field, and // nothing else. static_assert(std::is_same::value, "Slice must have same representation as grpc_slice"); static_assert(sizeof(Slice) == sizeof(grpc_slice), "Slice must have same representation as grpc_slice"); // The following assertions check that the representation of a ByteBuffer is // identical to grpc_byte_buffer*: it has a grpc_byte_buffer* field, // and nothing else. static_assert(std::is_same::value, "ByteBuffer must have same representation as " "grpc_byte_buffer*"); static_assert(sizeof(ByteBuffer) == sizeof(grpc_byte_buffer*), "ByteBuffer must have same representation as " "grpc_byte_buffer*"); // The const_cast is legal if grpc_raw_byte_buffer_create() does no more // than its advertised side effect of increasing the reference count of the // slices it processes, and such an increase does not affect the semantics // seen by the caller of this constructor. buffer_ = g_core_codegen_interface->grpc_raw_byte_buffer_create( reinterpret_cast(const_cast(slices)), nslices); } /// Constuct a byte buffer by referencing elements of existing buffer /// \a buf. Wrapper of core function grpc_byte_buffer_copy ByteBuffer(const ByteBuffer& buf); ~ByteBuffer() { if (buffer_) { g_core_codegen_interface->grpc_byte_buffer_destroy(buffer_); } } ByteBuffer& operator=(const ByteBuffer&); /// Dump (read) the buffer contents into \a slices. Status Dump(std::vector* slices) const; /// Remove all data. void Clear() { if (buffer_) { g_core_codegen_interface->grpc_byte_buffer_destroy(buffer_); buffer_ = nullptr; } } /// Make a duplicate copy of the internals of this byte /// buffer so that we have our own owned version of it. /// bbuf.Duplicate(); is equivalent to bbuf=bbuf; but is actually readable void Duplicate() { buffer_ = g_core_codegen_interface->grpc_byte_buffer_copy(buffer_); } /// Forget underlying byte buffer without destroying /// Use this only for un-owned byte buffers void Release() { buffer_ = nullptr; } /// Buffer size in bytes. size_t Length() const { return buffer_ == nullptr ? 0 : g_core_codegen_interface->grpc_byte_buffer_length(buffer_); } /// Swap the state of *this and *other. void Swap(ByteBuffer* other) { grpc_byte_buffer* tmp = other->buffer_; other->buffer_ = buffer_; buffer_ = tmp; } /// Is this ByteBuffer valid? bool Valid() const { return (buffer_ != nullptr); } private: friend class SerializationTraits; friend class ServerInterface; friend class internal::CallOpSendMessage; template friend class internal::CallOpRecvMessage; friend class internal::CallOpGenericRecvMessage; friend class internal::MethodHandler; template friend class internal::RpcMethodHandler; template friend class internal::ServerStreamingHandler; template friend class internal::DeserializeFuncType; friend class ProtoBufferReader; friend class ProtoBufferWriter; friend class internal::GrpcByteBufferPeer; grpc_byte_buffer* buffer_; // takes ownership void set_buffer(grpc_byte_buffer* buf) { if (buffer_) { Clear(); } buffer_ = buf; } grpc_byte_buffer* c_buffer() { return buffer_; } grpc_byte_buffer** c_buffer_ptr() { return &buffer_; } class ByteBufferPointer { public: ByteBufferPointer(const ByteBuffer* b) : bbuf_(const_cast(b)) {} operator ByteBuffer*() { return bbuf_; } operator grpc_byte_buffer*() { return bbuf_->buffer_; } operator grpc_byte_buffer**() { return &bbuf_->buffer_; } private: ByteBuffer* bbuf_; }; ByteBufferPointer bbuf_ptr() const { return ByteBufferPointer(this); } }; template <> class SerializationTraits { public: static Status Deserialize(ByteBuffer* byte_buffer, ByteBuffer* dest) { dest->set_buffer(byte_buffer->buffer_); return Status::OK; } static Status Serialize(const ByteBuffer& source, ByteBuffer* buffer, bool* own_buffer) { *buffer = source; *own_buffer = true; return Status::OK; } }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_BYTE_BUFFER_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/call.h000066400000000000000000000512501334102242000255450ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_CALL_H #define GRPCPP_IMPL_CODEGEN_CALL_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace grpc { class ByteBuffer; class CompletionQueue; extern CoreCodegenInterface* g_core_codegen_interface; namespace internal { class Call; class CallHook; const char kBinaryErrorDetailsKey[] = "grpc-status-details-bin"; // TODO(yangg) if the map is changed before we send, the pointers will be a // mess. Make sure it does not happen. inline grpc_metadata* FillMetadataArray( const std::multimap& metadata, size_t* metadata_count, const grpc::string& optional_error_details) { *metadata_count = metadata.size() + (optional_error_details.empty() ? 0 : 1); if (*metadata_count == 0) { return nullptr; } grpc_metadata* metadata_array = (grpc_metadata*)(g_core_codegen_interface->gpr_malloc( (*metadata_count) * sizeof(grpc_metadata))); size_t i = 0; for (auto iter = metadata.cbegin(); iter != metadata.cend(); ++iter, ++i) { metadata_array[i].key = SliceReferencingString(iter->first); metadata_array[i].value = SliceReferencingString(iter->second); } if (!optional_error_details.empty()) { metadata_array[i].key = g_core_codegen_interface->grpc_slice_from_static_buffer( kBinaryErrorDetailsKey, sizeof(kBinaryErrorDetailsKey) - 1); metadata_array[i].value = SliceReferencingString(optional_error_details); } return metadata_array; } } // namespace internal /// Per-message write options. class WriteOptions { public: WriteOptions() : flags_(0), last_message_(false) {} WriteOptions(const WriteOptions& other) : flags_(other.flags_), last_message_(other.last_message_) {} /// Clear all flags. inline void Clear() { flags_ = 0; } /// Returns raw flags bitset. inline uint32_t flags() const { return flags_; } /// Sets flag for the disabling of compression for the next message write. /// /// \sa GRPC_WRITE_NO_COMPRESS inline WriteOptions& set_no_compression() { SetBit(GRPC_WRITE_NO_COMPRESS); return *this; } /// Clears flag for the disabling of compression for the next message write. /// /// \sa GRPC_WRITE_NO_COMPRESS inline WriteOptions& clear_no_compression() { ClearBit(GRPC_WRITE_NO_COMPRESS); return *this; } /// Get value for the flag indicating whether compression for the next /// message write is forcefully disabled. /// /// \sa GRPC_WRITE_NO_COMPRESS inline bool get_no_compression() const { return GetBit(GRPC_WRITE_NO_COMPRESS); } /// Sets flag indicating that the write may be buffered and need not go out on /// the wire immediately. /// /// \sa GRPC_WRITE_BUFFER_HINT inline WriteOptions& set_buffer_hint() { SetBit(GRPC_WRITE_BUFFER_HINT); return *this; } /// Clears flag indicating that the write may be buffered and need not go out /// on the wire immediately. /// /// \sa GRPC_WRITE_BUFFER_HINT inline WriteOptions& clear_buffer_hint() { ClearBit(GRPC_WRITE_BUFFER_HINT); return *this; } /// Get value for the flag indicating that the write may be buffered and need /// not go out on the wire immediately. /// /// \sa GRPC_WRITE_BUFFER_HINT inline bool get_buffer_hint() const { return GetBit(GRPC_WRITE_BUFFER_HINT); } /// corked bit: aliases set_buffer_hint currently, with the intent that /// set_buffer_hint will be removed in the future inline WriteOptions& set_corked() { SetBit(GRPC_WRITE_BUFFER_HINT); return *this; } inline WriteOptions& clear_corked() { ClearBit(GRPC_WRITE_BUFFER_HINT); return *this; } inline bool is_corked() const { return GetBit(GRPC_WRITE_BUFFER_HINT); } /// last-message bit: indicates this is the last message in a stream /// client-side: makes Write the equivalent of performing Write, WritesDone /// in a single step /// server-side: hold the Write until the service handler returns (sync api) /// or until Finish is called (async api) inline WriteOptions& set_last_message() { last_message_ = true; return *this; } /// Clears flag indicating that this is the last message in a stream, /// disabling coalescing. inline WriteOptions& clear_last_message() { last_message_ = false; return *this; } /// Guarantee that all bytes have been written to the socket before completing /// this write (usually writes are completed when they pass flow control). inline WriteOptions& set_write_through() { SetBit(GRPC_WRITE_THROUGH); return *this; } inline bool is_write_through() const { return GetBit(GRPC_WRITE_THROUGH); } /// Get value for the flag indicating that this is the last message, and /// should be coalesced with trailing metadata. /// /// \sa GRPC_WRITE_LAST_MESSAGE bool is_last_message() const { return last_message_; } WriteOptions& operator=(const WriteOptions& rhs) { flags_ = rhs.flags_; return *this; } private: void SetBit(const uint32_t mask) { flags_ |= mask; } void ClearBit(const uint32_t mask) { flags_ &= ~mask; } bool GetBit(const uint32_t mask) const { return (flags_ & mask) != 0; } uint32_t flags_; bool last_message_; }; namespace internal { /// Default argument for CallOpSet. I is unused by the class, but can be /// used for generating multiple names for the same thing. template class CallNoOp { protected: void AddOp(grpc_op* ops, size_t* nops) {} void FinishOp(bool* status) {} }; class CallOpSendInitialMetadata { public: CallOpSendInitialMetadata() : send_(false) { maybe_compression_level_.is_set = false; } void SendInitialMetadata( const std::multimap& metadata, uint32_t flags) { maybe_compression_level_.is_set = false; send_ = true; flags_ = flags; initial_metadata_ = FillMetadataArray(metadata, &initial_metadata_count_, ""); } void set_compression_level(grpc_compression_level level) { maybe_compression_level_.is_set = true; maybe_compression_level_.level = level; } protected: void AddOp(grpc_op* ops, size_t* nops) { if (!send_) return; grpc_op* op = &ops[(*nops)++]; op->op = GRPC_OP_SEND_INITIAL_METADATA; op->flags = flags_; op->reserved = NULL; op->data.send_initial_metadata.count = initial_metadata_count_; op->data.send_initial_metadata.metadata = initial_metadata_; op->data.send_initial_metadata.maybe_compression_level.is_set = maybe_compression_level_.is_set; if (maybe_compression_level_.is_set) { op->data.send_initial_metadata.maybe_compression_level.level = maybe_compression_level_.level; } } void FinishOp(bool* status) { if (!send_) return; g_core_codegen_interface->gpr_free(initial_metadata_); send_ = false; } bool send_; uint32_t flags_; size_t initial_metadata_count_; grpc_metadata* initial_metadata_; struct { bool is_set; grpc_compression_level level; } maybe_compression_level_; }; class CallOpSendMessage { public: CallOpSendMessage() : send_buf_() {} /// Send \a message using \a options for the write. The \a options are cleared /// after use. template Status SendMessage(const M& message, WriteOptions options) GRPC_MUST_USE_RESULT; template Status SendMessage(const M& message) GRPC_MUST_USE_RESULT; protected: void AddOp(grpc_op* ops, size_t* nops) { if (!send_buf_.Valid()) return; grpc_op* op = &ops[(*nops)++]; op->op = GRPC_OP_SEND_MESSAGE; op->flags = write_options_.flags(); op->reserved = NULL; op->data.send_message.send_message = send_buf_.c_buffer(); // Flags are per-message: clear them after use. write_options_.Clear(); } void FinishOp(bool* status) { send_buf_.Clear(); } private: ByteBuffer send_buf_; WriteOptions write_options_; }; template Status CallOpSendMessage::SendMessage(const M& message, WriteOptions options) { write_options_ = options; bool own_buf; // TODO(vjpai): Remove the void below when possible // The void in the template parameter below should not be needed // (since it should be implicit) but is needed due to an observed // difference in behavior between clang and gcc for certain internal users Status result = SerializationTraits::Serialize( message, send_buf_.bbuf_ptr(), &own_buf); if (!own_buf) { send_buf_.Duplicate(); } return result; } template Status CallOpSendMessage::SendMessage(const M& message) { return SendMessage(message, WriteOptions()); } template class CallOpRecvMessage { public: CallOpRecvMessage() : got_message(false), message_(nullptr), allow_not_getting_message_(false) {} void RecvMessage(R* message) { message_ = message; } // Do not change status if no message is received. void AllowNoMessage() { allow_not_getting_message_ = true; } bool got_message; protected: void AddOp(grpc_op* ops, size_t* nops) { if (message_ == nullptr) return; grpc_op* op = &ops[(*nops)++]; op->op = GRPC_OP_RECV_MESSAGE; op->flags = 0; op->reserved = NULL; op->data.recv_message.recv_message = recv_buf_.c_buffer_ptr(); } void FinishOp(bool* status) { if (message_ == nullptr) return; if (recv_buf_.Valid()) { if (*status) { got_message = *status = SerializationTraits::Deserialize(recv_buf_.bbuf_ptr(), message_) .ok(); recv_buf_.Release(); } else { got_message = false; recv_buf_.Clear(); } } else { got_message = false; if (!allow_not_getting_message_) { *status = false; } } message_ = nullptr; } private: R* message_; ByteBuffer recv_buf_; bool allow_not_getting_message_; }; class DeserializeFunc { public: virtual Status Deserialize(ByteBuffer* buf) = 0; virtual ~DeserializeFunc() {} }; template class DeserializeFuncType final : public DeserializeFunc { public: DeserializeFuncType(R* message) : message_(message) {} Status Deserialize(ByteBuffer* buf) override { return SerializationTraits::Deserialize(buf->bbuf_ptr(), message_); } ~DeserializeFuncType() override {} private: R* message_; // Not a managed pointer because management is external to this }; class CallOpGenericRecvMessage { public: CallOpGenericRecvMessage() : got_message(false), allow_not_getting_message_(false) {} template void RecvMessage(R* message) { // Use an explicit base class pointer to avoid resolution error in the // following unique_ptr::reset for some old implementations. DeserializeFunc* func = new DeserializeFuncType(message); deserialize_.reset(func); } // Do not change status if no message is received. void AllowNoMessage() { allow_not_getting_message_ = true; } bool got_message; protected: void AddOp(grpc_op* ops, size_t* nops) { if (!deserialize_) return; grpc_op* op = &ops[(*nops)++]; op->op = GRPC_OP_RECV_MESSAGE; op->flags = 0; op->reserved = NULL; op->data.recv_message.recv_message = recv_buf_.c_buffer_ptr(); } void FinishOp(bool* status) { if (!deserialize_) return; if (recv_buf_.Valid()) { if (*status) { got_message = true; *status = deserialize_->Deserialize(&recv_buf_).ok(); recv_buf_.Release(); } else { got_message = false; recv_buf_.Clear(); } } else { got_message = false; if (!allow_not_getting_message_) { *status = false; } } deserialize_.reset(); } private: std::unique_ptr deserialize_; ByteBuffer recv_buf_; bool allow_not_getting_message_; }; class CallOpClientSendClose { public: CallOpClientSendClose() : send_(false) {} void ClientSendClose() { send_ = true; } protected: void AddOp(grpc_op* ops, size_t* nops) { if (!send_) return; grpc_op* op = &ops[(*nops)++]; op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; op->flags = 0; op->reserved = NULL; } void FinishOp(bool* status) { send_ = false; } private: bool send_; }; class CallOpServerSendStatus { public: CallOpServerSendStatus() : send_status_available_(false) {} void ServerSendStatus( const std::multimap& trailing_metadata, const Status& status) { send_error_details_ = status.error_details(); trailing_metadata_ = FillMetadataArray( trailing_metadata, &trailing_metadata_count_, send_error_details_); send_status_available_ = true; send_status_code_ = static_cast(status.error_code()); send_error_message_ = status.error_message(); } protected: void AddOp(grpc_op* ops, size_t* nops) { if (!send_status_available_) return; grpc_op* op = &ops[(*nops)++]; op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; op->data.send_status_from_server.trailing_metadata_count = trailing_metadata_count_; op->data.send_status_from_server.trailing_metadata = trailing_metadata_; op->data.send_status_from_server.status = send_status_code_; error_message_slice_ = SliceReferencingString(send_error_message_); op->data.send_status_from_server.status_details = send_error_message_.empty() ? nullptr : &error_message_slice_; op->flags = 0; op->reserved = NULL; } void FinishOp(bool* status) { if (!send_status_available_) return; g_core_codegen_interface->gpr_free(trailing_metadata_); send_status_available_ = false; } private: bool send_status_available_; grpc_status_code send_status_code_; grpc::string send_error_details_; grpc::string send_error_message_; size_t trailing_metadata_count_; grpc_metadata* trailing_metadata_; grpc_slice error_message_slice_; }; class CallOpRecvInitialMetadata { public: CallOpRecvInitialMetadata() : metadata_map_(nullptr) {} void RecvInitialMetadata(ClientContext* context) { context->initial_metadata_received_ = true; metadata_map_ = &context->recv_initial_metadata_; } protected: void AddOp(grpc_op* ops, size_t* nops) { if (metadata_map_ == nullptr) return; grpc_op* op = &ops[(*nops)++]; op->op = GRPC_OP_RECV_INITIAL_METADATA; op->data.recv_initial_metadata.recv_initial_metadata = metadata_map_->arr(); op->flags = 0; op->reserved = NULL; } void FinishOp(bool* status) { if (metadata_map_ == nullptr) return; metadata_map_->FillMap(); metadata_map_ = nullptr; } private: MetadataMap* metadata_map_; }; class CallOpClientRecvStatus { public: CallOpClientRecvStatus() : recv_status_(nullptr), debug_error_string_(nullptr) {} void ClientRecvStatus(ClientContext* context, Status* status) { client_context_ = context; metadata_map_ = &client_context_->trailing_metadata_; recv_status_ = status; error_message_ = g_core_codegen_interface->grpc_empty_slice(); } protected: void AddOp(grpc_op* ops, size_t* nops) { if (recv_status_ == nullptr) return; grpc_op* op = &ops[(*nops)++]; op->op = GRPC_OP_RECV_STATUS_ON_CLIENT; op->data.recv_status_on_client.trailing_metadata = metadata_map_->arr(); op->data.recv_status_on_client.status = &status_code_; op->data.recv_status_on_client.status_details = &error_message_; op->data.recv_status_on_client.error_string = &debug_error_string_; op->flags = 0; op->reserved = NULL; } void FinishOp(bool* status) { if (recv_status_ == nullptr) return; metadata_map_->FillMap(); grpc::string binary_error_details; auto iter = metadata_map_->map()->find(kBinaryErrorDetailsKey); if (iter != metadata_map_->map()->end()) { binary_error_details = grpc::string(iter->second.begin(), iter->second.length()); } *recv_status_ = Status(static_cast(status_code_), GRPC_SLICE_IS_EMPTY(error_message_) ? grpc::string() : grpc::string(GRPC_SLICE_START_PTR(error_message_), GRPC_SLICE_END_PTR(error_message_)), binary_error_details); client_context_->set_debug_error_string( debug_error_string_ != nullptr ? debug_error_string_ : ""); g_core_codegen_interface->grpc_slice_unref(error_message_); if (debug_error_string_ != nullptr) { g_core_codegen_interface->gpr_free((void*)debug_error_string_); } recv_status_ = nullptr; } private: ClientContext* client_context_; MetadataMap* metadata_map_; Status* recv_status_; const char* debug_error_string_; grpc_status_code status_code_; grpc_slice error_message_; }; /// An abstract collection of call ops, used to generate the /// grpc_call_op structure to pass down to the lower layers, /// and as it is-a CompletionQueueTag, also massages the final /// completion into the correct form for consumption in the C++ /// API. class CallOpSetInterface : public CompletionQueueTag { public: /// Fills in grpc_op, starting from ops[*nops] and moving /// upwards. virtual void FillOps(grpc_call* call, grpc_op* ops, size_t* nops) = 0; }; /// Primary implementation of CallOpSetInterface. /// Since we cannot use variadic templates, we declare slots up to /// the maximum count of ops we'll need in a set. We leverage the /// empty base class optimization to slim this class (especially /// when there are many unused slots used). To avoid duplicate base classes, /// the template parmeter for CallNoOp is varied by argument position. template , class Op2 = CallNoOp<2>, class Op3 = CallNoOp<3>, class Op4 = CallNoOp<4>, class Op5 = CallNoOp<5>, class Op6 = CallNoOp<6>> class CallOpSet : public CallOpSetInterface, public Op1, public Op2, public Op3, public Op4, public Op5, public Op6 { public: CallOpSet() : return_tag_(this), call_(nullptr) {} void FillOps(grpc_call* call, grpc_op* ops, size_t* nops) override { this->Op1::AddOp(ops, nops); this->Op2::AddOp(ops, nops); this->Op3::AddOp(ops, nops); this->Op4::AddOp(ops, nops); this->Op5::AddOp(ops, nops); this->Op6::AddOp(ops, nops); g_core_codegen_interface->grpc_call_ref(call); call_ = call; } bool FinalizeResult(void** tag, bool* status) override { this->Op1::FinishOp(status); this->Op2::FinishOp(status); this->Op3::FinishOp(status); this->Op4::FinishOp(status); this->Op5::FinishOp(status); this->Op6::FinishOp(status); *tag = return_tag_; g_core_codegen_interface->grpc_call_unref(call_); return true; } void set_output_tag(void* return_tag) { return_tag_ = return_tag; } private: void* return_tag_; grpc_call* call_; }; /// Straightforward wrapping of the C call object class Call final { public: /** call is owned by the caller */ Call(grpc_call* call, CallHook* call_hook, CompletionQueue* cq) : call_hook_(call_hook), cq_(cq), call_(call), max_receive_message_size_(-1) {} Call(grpc_call* call, CallHook* call_hook, CompletionQueue* cq, int max_receive_message_size) : call_hook_(call_hook), cq_(cq), call_(call), max_receive_message_size_(max_receive_message_size) {} void PerformOps(CallOpSetInterface* ops) { call_hook_->PerformOpsOnCall(ops, this); } grpc_call* call() const { return call_; } CompletionQueue* cq() const { return cq_; } int max_receive_message_size() const { return max_receive_message_size_; } private: CallHook* call_hook_; CompletionQueue* cq_; grpc_call* call_; int max_receive_message_size_; }; } // namespace internal } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/call_hook.h000066400000000000000000000020731334102242000265640ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_CALL_HOOK_H #define GRPCPP_IMPL_CODEGEN_CALL_HOOK_H namespace grpc { namespace internal { class CallOpSetInterface; class Call; /// This is an interface that Channel and Server implement to allow them to hook /// performing ops. class CallHook { public: virtual ~CallHook() {} virtual void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) = 0; }; } // namespace internal } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_CALL_HOOK_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/channel_interface.h000066400000000000000000000103751334102242000302650ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_CHANNEL_INTERFACE_H #define GRPCPP_IMPL_CODEGEN_CHANNEL_INTERFACE_H #include #include #include namespace grpc { class ChannelInterface; class ClientContext; class CompletionQueue; template class ClientReader; template class ClientWriter; template class ClientReaderWriter; namespace internal { class Call; class CallOpSetInterface; class RpcMethod; template class BlockingUnaryCallImpl; template class ClientAsyncReaderFactory; template class ClientAsyncWriterFactory; template class ClientAsyncReaderWriterFactory; template class ClientAsyncResponseReaderFactory; } // namespace internal /// Codegen interface for \a grpc::Channel. class ChannelInterface { public: virtual ~ChannelInterface() {} /// Get the current channel state. If the channel is in IDLE and /// \a try_to_connect is set to true, try to connect. virtual grpc_connectivity_state GetState(bool try_to_connect) = 0; /// Return the \a tag on \a cq when the channel state is changed or \a /// deadline expires. \a GetState needs to called to get the current state. template void NotifyOnStateChange(grpc_connectivity_state last_observed, T deadline, CompletionQueue* cq, void* tag) { TimePoint deadline_tp(deadline); NotifyOnStateChangeImpl(last_observed, deadline_tp.raw_time(), cq, tag); } /// Blocking wait for channel state change or \a deadline expiration. /// \a GetState needs to called to get the current state. template bool WaitForStateChange(grpc_connectivity_state last_observed, T deadline) { TimePoint deadline_tp(deadline); return WaitForStateChangeImpl(last_observed, deadline_tp.raw_time()); } /// Wait for this channel to be connected template bool WaitForConnected(T deadline) { grpc_connectivity_state state; while ((state = GetState(true)) != GRPC_CHANNEL_READY) { if (!WaitForStateChange(state, deadline)) return false; } return true; } private: template friend class ::grpc::ClientReader; template friend class ::grpc::ClientWriter; template friend class ::grpc::ClientReaderWriter; template friend class ::grpc::internal::ClientAsyncReaderFactory; template friend class ::grpc::internal::ClientAsyncWriterFactory; template friend class ::grpc::internal::ClientAsyncReaderWriterFactory; template friend class ::grpc::internal::ClientAsyncResponseReaderFactory; template friend class ::grpc::internal::BlockingUnaryCallImpl; friend class ::grpc::internal::RpcMethod; virtual internal::Call CreateCall(const internal::RpcMethod& method, ClientContext* context, CompletionQueue* cq) = 0; virtual void PerformOpsOnCall(internal::CallOpSetInterface* ops, internal::Call* call) = 0; virtual void* RegisterMethod(const char* method) = 0; virtual void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, gpr_timespec deadline, CompletionQueue* cq, void* tag) = 0; virtual bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, gpr_timespec deadline) = 0; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_CHANNEL_INTERFACE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/client_context.h000066400000000000000000000366531334102242000276660ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /// A ClientContext allows the person implementing a service client to: /// /// - Add custom metadata key-value pairs that will propagated to the server /// side. /// - Control call settings such as compression and authentication. /// - Initial and trailing metadata coming from the server. /// - Get performance metrics (ie, census). /// /// Context settings are only relevant to the call they are invoked with, that /// is to say, they aren't sticky. Some of these settings, such as the /// compression options, can be made persistent at channel construction time /// (see \a grpc::CreateCustomChannel). /// /// \warning ClientContext instances should \em not be reused across rpcs. #ifndef GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_H #define GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct census_context; struct grpc_call; namespace grpc { class Channel; class ChannelInterface; class CompletionQueue; class CallCredentials; class ClientContext; namespace internal { class RpcMethod; class CallOpClientRecvStatus; class CallOpRecvInitialMetadata; template class BlockingUnaryCallImpl; } // namespace internal template class ClientReader; template class ClientWriter; template class ClientReaderWriter; template class ClientAsyncReader; template class ClientAsyncWriter; template class ClientAsyncReaderWriter; template class ClientAsyncResponseReader; class ServerContext; /// Options for \a ClientContext::FromServerContext specifying which traits from /// the \a ServerContext to propagate (copy) from it into a new \a /// ClientContext. /// /// \see ClientContext::FromServerContext class PropagationOptions { public: PropagationOptions() : propagate_(GRPC_PROPAGATE_DEFAULTS) {} PropagationOptions& enable_deadline_propagation() { propagate_ |= GRPC_PROPAGATE_DEADLINE; return *this; } PropagationOptions& disable_deadline_propagation() { propagate_ &= ~GRPC_PROPAGATE_DEADLINE; return *this; } PropagationOptions& enable_census_stats_propagation() { propagate_ |= GRPC_PROPAGATE_CENSUS_STATS_CONTEXT; return *this; } PropagationOptions& disable_census_stats_propagation() { propagate_ &= ~GRPC_PROPAGATE_CENSUS_STATS_CONTEXT; return *this; } PropagationOptions& enable_census_tracing_propagation() { propagate_ |= GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT; return *this; } PropagationOptions& disable_census_tracing_propagation() { propagate_ &= ~GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT; return *this; } PropagationOptions& enable_cancellation_propagation() { propagate_ |= GRPC_PROPAGATE_CANCELLATION; return *this; } PropagationOptions& disable_cancellation_propagation() { propagate_ &= ~GRPC_PROPAGATE_CANCELLATION; return *this; } uint32_t c_bitmask() const { return propagate_; } private: uint32_t propagate_; }; namespace testing { class InteropClientContextInspector; } // namespace testing /// A ClientContext allows the person implementing a service client to: /// /// - Add custom metadata key-value pairs that will propagated to the server /// side. /// - Control call settings such as compression and authentication. /// - Initial and trailing metadata coming from the server. /// - Get performance metrics (ie, census). /// /// Context settings are only relevant to the call they are invoked with, that /// is to say, they aren't sticky. Some of these settings, such as the /// compression options, can be made persistent at channel construction time /// (see \a grpc::CreateCustomChannel). /// /// \warning ClientContext instances should \em not be reused across rpcs. class ClientContext { public: ClientContext(); ~ClientContext(); /// Create a new \a ClientContext as a child of an incoming server call, /// according to \a options (\see PropagationOptions). /// /// \param server_context The source server context to use as the basis for /// constructing the client context. /// \param options The options controlling what to copy from the \a /// server_context. /// /// \return A newly constructed \a ClientContext instance based on \a /// server_context, with traits propagated (copied) according to \a options. static std::unique_ptr FromServerContext( const ServerContext& server_context, PropagationOptions options = PropagationOptions()); /// Add the (\a meta_key, \a meta_value) pair to the metadata associated with /// a client call. These are made available at the server side by the \a /// grpc::ServerContext::client_metadata() method. /// /// \warning This method should only be called before invoking the rpc. /// /// \param meta_key The metadata key. If \a meta_value is binary data, it must /// end in "-bin". /// \param meta_value The metadata value. If its value is binary, the key name /// must end in "-bin". void AddMetadata(const grpc::string& meta_key, const grpc::string& meta_value); /// Return a collection of initial metadata key-value pairs. Note that keys /// may happen more than once (ie, a \a std::multimap is returned). /// /// \warning This method should only be called after initial metadata has been /// received. For streaming calls, see \a /// ClientReaderInterface::WaitForInitialMetadata(). /// /// \return A multimap of initial metadata key-value pairs from the server. const std::multimap& GetServerInitialMetadata() const { GPR_CODEGEN_ASSERT(initial_metadata_received_); return *recv_initial_metadata_.map(); } /// Return a collection of trailing metadata key-value pairs. Note that keys /// may happen more than once (ie, a \a std::multimap is returned). /// /// \warning This method is only callable once the stream has finished. /// /// \return A multimap of metadata trailing key-value pairs from the server. const std::multimap& GetServerTrailingMetadata() const { // TODO(yangg) check finished return *trailing_metadata_.map(); } /// Set the deadline for the client call. /// /// \warning This method should only be called before invoking the rpc. /// /// \param deadline the deadline for the client call. Units are determined by /// the type used. template void set_deadline(const T& deadline) { TimePoint deadline_tp(deadline); deadline_ = deadline_tp.raw_time(); } /// EXPERIMENTAL: Indicate that this request is idempotent. /// By default, RPCs are assumed to not be idempotent. /// /// If true, the gRPC library assumes that it's safe to initiate /// this RPC multiple times. void set_idempotent(bool idempotent) { idempotent_ = idempotent; } /// EXPERIMENTAL: Set this request to be cacheable. /// If set, grpc is free to use the HTTP GET verb for sending the request, /// with the possibility of receiving a cached response. void set_cacheable(bool cacheable) { cacheable_ = cacheable; } /// EXPERIMENTAL: Trigger wait-for-ready or not on this request. /// See https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md. /// If set, if an RPC is made when a channel's connectivity state is /// TRANSIENT_FAILURE or CONNECTING, the call will not "fail fast", /// and the channel will wait until the channel is READY before making the /// call. void set_wait_for_ready(bool wait_for_ready) { wait_for_ready_ = wait_for_ready; wait_for_ready_explicitly_set_ = true; } /// DEPRECATED: Use set_wait_for_ready() instead. void set_fail_fast(bool fail_fast) { set_wait_for_ready(!fail_fast); } /// Return the deadline for the client call. std::chrono::system_clock::time_point deadline() const { return Timespec2Timepoint(deadline_); } /// Return a \a gpr_timespec representation of the client call's deadline. gpr_timespec raw_deadline() const { return deadline_; } /// Set the per call authority header (see /// https://tools.ietf.org/html/rfc7540#section-8.1.2.3). void set_authority(const grpc::string& authority) { authority_ = authority; } /// Return the authentication context for this client call. /// /// \see grpc::AuthContext. std::shared_ptr auth_context() const { if (auth_context_.get() == nullptr) { auth_context_ = CreateAuthContext(call_); } return auth_context_; } /// Set credentials for the client call. /// /// A credentials object encapsulates all the state needed by a client to /// authenticate with a server and make various assertions, e.g., about the /// client’s identity, role, or whether it is authorized to make a particular /// call. /// /// \see https://grpc.io/docs/guides/auth.html void set_credentials(const std::shared_ptr& creds) { creds_ = creds; } /// Return the compression algorithm the client call will request be used. /// Note that the gRPC runtime may decide to ignore this request, for example, /// due to resource constraints. grpc_compression_algorithm compression_algorithm() const { return compression_algorithm_; } /// Set \a algorithm to be the compression algorithm used for the client call. /// /// \param algorithm The compression algorithm used for the client call. void set_compression_algorithm(grpc_compression_algorithm algorithm); /// Flag whether the initial metadata should be \a corked /// /// If \a corked is true, then the initial metadata will be coalesced with the /// write of first message in the stream. As a result, any tag set for the /// initial metadata operation (starting a client-streaming or bidi-streaming /// RPC) will not actually be sent to the completion queue or delivered /// via Next. /// /// \param corked The flag indicating whether the initial metadata is to be /// corked or not. void set_initial_metadata_corked(bool corked) { initial_metadata_corked_ = corked; } /// Return the peer uri in a string. /// /// \warning This value is never authenticated or subject to any security /// related code. It must not be used for any authentication related /// functionality. Instead, use auth_context. /// /// \return The call's peer URI. grpc::string peer() const; /// Get and set census context. void set_census_context(struct census_context* ccp) { census_context_ = ccp; } struct census_context* census_context() const { return census_context_; } /// Send a best-effort out-of-band cancel on the call associated with /// this client context. The call could be in any stage; e.g., if it is /// already finished, it may still return success. /// /// There is no guarantee the call will be cancelled. /// /// Note that TryCancel() does not change any of the tags that are pending /// on the completion queue. All pending tags will still be delivered /// (though their ok result may reflect the effect of cancellation). void TryCancel(); /// Global Callbacks /// /// Can be set exactly once per application to install hooks whenever /// a client context is constructed and destructed. class GlobalCallbacks { public: virtual ~GlobalCallbacks() {} virtual void DefaultConstructor(ClientContext* context) = 0; virtual void Destructor(ClientContext* context) = 0; }; static void SetGlobalCallbacks(GlobalCallbacks* callbacks); /// Should be used for framework-level extensions only. /// Applications never need to call this method. grpc_call* c_call() { return call_; } /// EXPERIMENTAL debugging API /// /// if status is not ok() for an RPC, this will return a detailed string /// of the gRPC Core error that led to the failure. It should not be relied /// upon for anything other than gaining more debug data in failure cases. grpc::string debug_error_string() const { return debug_error_string_; } private: // Disallow copy and assign. ClientContext(const ClientContext&); ClientContext& operator=(const ClientContext&); friend class ::grpc::testing::InteropClientContextInspector; friend class ::grpc::internal::CallOpClientRecvStatus; friend class ::grpc::internal::CallOpRecvInitialMetadata; friend class Channel; template friend class ::grpc::ClientReader; template friend class ::grpc::ClientWriter; template friend class ::grpc::ClientReaderWriter; template friend class ::grpc::ClientAsyncReader; template friend class ::grpc::ClientAsyncWriter; template friend class ::grpc::ClientAsyncReaderWriter; template friend class ::grpc::ClientAsyncResponseReader; template friend class ::grpc::internal::BlockingUnaryCallImpl; // Used by friend class CallOpClientRecvStatus void set_debug_error_string(const grpc::string& debug_error_string) { debug_error_string_ = debug_error_string; } grpc_call* call() const { return call_; } void set_call(grpc_call* call, const std::shared_ptr& channel); uint32_t initial_metadata_flags() const { return (idempotent_ ? GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST : 0) | (wait_for_ready_ ? GRPC_INITIAL_METADATA_WAIT_FOR_READY : 0) | (cacheable_ ? GRPC_INITIAL_METADATA_CACHEABLE_REQUEST : 0) | (wait_for_ready_explicitly_set_ ? GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET : 0) | (initial_metadata_corked_ ? GRPC_INITIAL_METADATA_CORKED : 0); } grpc::string authority() { return authority_; } bool initial_metadata_received_; bool wait_for_ready_; bool wait_for_ready_explicitly_set_; bool idempotent_; bool cacheable_; std::shared_ptr channel_; std::mutex mu_; grpc_call* call_; bool call_canceled_; gpr_timespec deadline_; grpc::string authority_; std::shared_ptr creds_; mutable std::shared_ptr auth_context_; struct census_context* census_context_; std::multimap send_initial_metadata_; internal::MetadataMap recv_initial_metadata_; internal::MetadataMap trailing_metadata_; grpc_call* propagate_from_call_; PropagationOptions propagation_options_; grpc_compression_algorithm compression_algorithm_; bool initial_metadata_corked_; grpc::string debug_error_string_; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/client_unary_call.h000066400000000000000000000057501334102242000303250ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_CLIENT_UNARY_CALL_H #define GRPCPP_IMPL_CODEGEN_CLIENT_UNARY_CALL_H #include #include #include #include #include namespace grpc { class Channel; class ClientContext; class CompletionQueue; namespace internal { class RpcMethod; /// Wrapper that performs a blocking unary call template Status BlockingUnaryCall(ChannelInterface* channel, const RpcMethod& method, ClientContext* context, const InputMessage& request, OutputMessage* result) { return BlockingUnaryCallImpl( channel, method, context, request, result) .status(); } template class BlockingUnaryCallImpl { public: BlockingUnaryCallImpl(ChannelInterface* channel, const RpcMethod& method, ClientContext* context, const InputMessage& request, OutputMessage* result) { CompletionQueue cq(grpc_completion_queue_attributes{ GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING}); // Pluckable completion queue Call call(channel->CreateCall(method, context, &cq)); CallOpSet, CallOpClientSendClose, CallOpClientRecvStatus> ops; status_ = ops.SendMessage(request); if (!status_.ok()) { return; } ops.SendInitialMetadata(context->send_initial_metadata_, context->initial_metadata_flags()); ops.RecvInitialMetadata(context); ops.RecvMessage(result); ops.AllowNoMessage(); ops.ClientSendClose(); ops.ClientRecvStatus(context, &status_); call.PerformOps(&ops); if (cq.Pluck(&ops)) { if (!ops.got_message && status_.ok()) { status_ = Status(StatusCode::UNIMPLEMENTED, "No message returned for unary request"); } } else { GPR_CODEGEN_ASSERT(!status_.ok()); } } Status status() { return status_; } private: Status status_; }; } // namespace internal } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_CLIENT_UNARY_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/completion_queue.h000066400000000000000000000371521334102242000302140ustar00rootroot00000000000000/* * * Copyright 2015-2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /// A completion queue implements a concurrent producer-consumer queue, with /// two main API-exposed methods: \a Next and \a AsyncNext. These /// methods are the essential component of the gRPC C++ asynchronous API. /// There is also a \a Shutdown method to indicate that a given completion queue /// will no longer have regular events. This must be called before the /// completion queue is destroyed. /// All completion queue APIs are thread-safe and may be used concurrently with /// any other completion queue API invocation; it is acceptable to have /// multiple threads calling \a Next or \a AsyncNext on the same or different /// completion queues, or to call these methods concurrently with a \a Shutdown /// elsewhere. /// \remark{All other API calls on completion queue should be completed before /// a completion queue destructor is called.} #ifndef GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_H #define GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_H #include #include #include #include #include #include struct grpc_completion_queue; namespace grpc { template class ClientReader; template class ClientWriter; template class ClientReaderWriter; template class ServerReader; template class ServerWriter; namespace internal { template class ServerReaderWriterBody; } // namespace internal class Channel; class ChannelInterface; class ClientContext; class CompletionQueue; class Server; class ServerBuilder; class ServerContext; class ServerInterface; namespace internal { class CompletionQueueTag; class RpcMethod; template class RpcMethodHandler; template class ClientStreamingHandler; template class ServerStreamingHandler; template class BidiStreamingHandler; class UnknownMethodHandler; template class TemplatedBidiStreamingHandler; template class BlockingUnaryCallImpl; } // namespace internal extern CoreCodegenInterface* g_core_codegen_interface; /// A thin wrapper around \ref grpc_completion_queue (see \ref /// src/core/lib/surface/completion_queue.h). /// See \ref doc/cpp/perf_notes.md for notes on best practices for high /// performance servers. class CompletionQueue : private GrpcLibraryCodegen { public: /// Default constructor. Implicitly creates a \a grpc_completion_queue /// instance. CompletionQueue() : CompletionQueue(grpc_completion_queue_attributes{ GRPC_CQ_CURRENT_VERSION, GRPC_CQ_NEXT, GRPC_CQ_DEFAULT_POLLING}) {} /// Wrap \a take, taking ownership of the instance. /// /// \param take The completion queue instance to wrap. Ownership is taken. explicit CompletionQueue(grpc_completion_queue* take); /// Destructor. Destroys the owned wrapped completion queue / instance. ~CompletionQueue() { g_core_codegen_interface->grpc_completion_queue_destroy(cq_); } /// Tri-state return for AsyncNext: SHUTDOWN, GOT_EVENT, TIMEOUT. enum NextStatus { SHUTDOWN, ///< The completion queue has been shutdown and fully-drained GOT_EVENT, ///< Got a new event; \a tag will be filled in with its ///< associated value; \a ok indicating its success. TIMEOUT ///< deadline was reached. }; /// Read from the queue, blocking until an event is available or the queue is /// shutting down. /// /// \param tag[out] Updated to point to the read event's tag. /// \param ok[out] true if read a successful event, false otherwise. /// /// Note that each tag sent to the completion queue (through RPC operations /// or alarms) will be delivered out of the completion queue by a call to /// Next (or a related method), regardless of whether the operation succeeded /// or not. Success here means that this operation completed in the normal /// valid manner. /// /// Server-side RPC request: \a ok indicates that the RPC has indeed /// been started. If it is false, the server has been Shutdown /// before this particular call got matched to an incoming RPC. /// /// Client-side StartCall/RPC invocation: \a ok indicates that the RPC is /// going to go to the wire. If it is false, it not going to the wire. This /// would happen if the channel is either permanently broken or /// transiently broken but with the fail-fast option. (Note that async unary /// RPCs don't post a CQ tag at this point, nor do client-streaming /// or bidi-streaming RPCs that have the initial metadata corked option set.) /// /// Client-side Write, Client-side WritesDone, Server-side Write, /// Server-side Finish, Server-side SendInitialMetadata (which is /// typically included in Write or Finish when not done explicitly): /// \a ok means that the data/metadata/status/etc is going to go to the /// wire. If it is false, it not going to the wire because the call /// is already dead (i.e., canceled, deadline expired, other side /// dropped the channel, etc). /// /// Client-side Read, Server-side Read, Client-side /// RecvInitialMetadata (which is typically included in Read if not /// done explicitly): \a ok indicates whether there is a valid message /// that got read. If not, you know that there are certainly no more /// messages that can ever be read from this stream. For the client-side /// operations, this only happens because the call is dead. For the /// server-sider operation, though, this could happen because the client /// has done a WritesDone already. /// /// Client-side Finish: \a ok should always be true /// /// Server-side AsyncNotifyWhenDone: \a ok should always be true /// /// Alarm: \a ok is true if it expired, false if it was canceled /// /// \return true if got an event, false if the queue is fully drained and /// shut down. bool Next(void** tag, bool* ok) { return (AsyncNextInternal(tag, ok, g_core_codegen_interface->gpr_inf_future( GPR_CLOCK_REALTIME)) != SHUTDOWN); } /// Read from the queue, blocking up to \a deadline (or the queue's shutdown). /// Both \a tag and \a ok are updated upon success (if an event is available /// within the \a deadline). A \a tag points to an arbitrary location usually /// employed to uniquely identify an event. /// /// \param tag[out] Upon sucess, updated to point to the event's tag. /// \param ok[out] Upon sucess, true if a successful event, false otherwise /// See documentation for CompletionQueue::Next for explanation of ok /// \param deadline[in] How long to block in wait for an event. /// /// \return The type of event read. template NextStatus AsyncNext(void** tag, bool* ok, const T& deadline) { TimePoint deadline_tp(deadline); return AsyncNextInternal(tag, ok, deadline_tp.raw_time()); } /// EXPERIMENTAL /// First executes \a F, then reads from the queue, blocking up to /// \a deadline (or the queue's shutdown). /// Both \a tag and \a ok are updated upon success (if an event is available /// within the \a deadline). A \a tag points to an arbitrary location usually /// employed to uniquely identify an event. /// /// \param F[in] Function to execute before calling AsyncNext on this queue. /// \param tag[out] Upon sucess, updated to point to the event's tag. /// \param ok[out] Upon sucess, true if read a regular event, false otherwise. /// \param deadline[in] How long to block in wait for an event. /// /// \return The type of event read. template NextStatus DoThenAsyncNext(F&& f, void** tag, bool* ok, const T& deadline) { CompletionQueueTLSCache cache = CompletionQueueTLSCache(this); f(); if (cache.Flush(tag, ok)) { return GOT_EVENT; } else { return AsyncNext(tag, ok, deadline); } } /// Request the shutdown of the queue. /// /// \warning This method must be called at some point if this completion queue /// is accessed with Next or AsyncNext. \a Next will not return false /// until this method has been called and all pending tags have been drained. /// (Likewise for \a AsyncNext returning \a NextStatus::SHUTDOWN .) /// Only once either one of these methods does that (that is, once the queue /// has been \em drained) can an instance of this class be destroyed. /// Also note that applications must ensure that no work is enqueued on this /// completion queue after this method is called. void Shutdown(); /// Returns a \em raw pointer to the underlying \a grpc_completion_queue /// instance. /// /// \warning Remember that the returned instance is owned. No transfer of /// owership is performed. grpc_completion_queue* cq() { return cq_; } protected: /// Private constructor of CompletionQueue only visible to friend classes CompletionQueue(const grpc_completion_queue_attributes& attributes) { cq_ = g_core_codegen_interface->grpc_completion_queue_create( g_core_codegen_interface->grpc_completion_queue_factory_lookup( &attributes), &attributes, NULL); InitialAvalanching(); // reserve this for the future shutdown } private: // Friend synchronous wrappers so that they can access Pluck(), which is // a semi-private API geared towards the synchronous implementation. template friend class ::grpc::ClientReader; template friend class ::grpc::ClientWriter; template friend class ::grpc::ClientReaderWriter; template friend class ::grpc::ServerReader; template friend class ::grpc::ServerWriter; template friend class ::grpc::internal::ServerReaderWriterBody; template friend class ::grpc::internal::RpcMethodHandler; template friend class ::grpc::internal::ClientStreamingHandler; template friend class ::grpc::internal::ServerStreamingHandler; template friend class ::grpc::internal::TemplatedBidiStreamingHandler; friend class ::grpc::internal::UnknownMethodHandler; friend class ::grpc::Server; friend class ::grpc::ServerContext; friend class ::grpc::ServerInterface; template friend class ::grpc::internal::BlockingUnaryCallImpl; /// EXPERIMENTAL /// Creates a Thread Local cache to store the first event /// On this completion queue queued from this thread. Once /// initialized, it must be flushed on the same thread. class CompletionQueueTLSCache { public: CompletionQueueTLSCache(CompletionQueue* cq); ~CompletionQueueTLSCache(); bool Flush(void** tag, bool* ok); private: CompletionQueue* cq_; bool flushed_; }; NextStatus AsyncNextInternal(void** tag, bool* ok, gpr_timespec deadline); /// Wraps \a grpc_completion_queue_pluck. /// \warning Must not be mixed with calls to \a Next. bool Pluck(internal::CompletionQueueTag* tag) { auto deadline = g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_REALTIME); auto ev = g_core_codegen_interface->grpc_completion_queue_pluck( cq_, tag, deadline, nullptr); bool ok = ev.success != 0; void* ignored = tag; GPR_CODEGEN_ASSERT(tag->FinalizeResult(&ignored, &ok)); GPR_CODEGEN_ASSERT(ignored == tag); // Ignore mutations by FinalizeResult: Pluck returns the C API status return ev.success != 0; } /// Performs a single polling pluck on \a tag. /// \warning Must not be mixed with calls to \a Next. /// /// TODO: sreek - This calls tag->FinalizeResult() even if the cq_ is already /// shutdown. This is most likely a bug and if it is a bug, then change this /// implementation to simple call the other TryPluck function with a zero /// timeout. i.e: /// TryPluck(tag, gpr_time_0(GPR_CLOCK_REALTIME)) void TryPluck(internal::CompletionQueueTag* tag) { auto deadline = g_core_codegen_interface->gpr_time_0(GPR_CLOCK_REALTIME); auto ev = g_core_codegen_interface->grpc_completion_queue_pluck( cq_, tag, deadline, nullptr); if (ev.type == GRPC_QUEUE_TIMEOUT) return; bool ok = ev.success != 0; void* ignored = tag; // the tag must be swallowed if using TryPluck GPR_CODEGEN_ASSERT(!tag->FinalizeResult(&ignored, &ok)); } /// Performs a single polling pluck on \a tag. Calls tag->FinalizeResult if /// the pluck() was successful and returned the tag. /// /// This exects tag->FinalizeResult (if called) to return 'false' i.e expects /// that the tag is internal not something that is returned to the user. void TryPluck(internal::CompletionQueueTag* tag, gpr_timespec deadline) { auto ev = g_core_codegen_interface->grpc_completion_queue_pluck( cq_, tag, deadline, nullptr); if (ev.type == GRPC_QUEUE_TIMEOUT || ev.type == GRPC_QUEUE_SHUTDOWN) { return; } bool ok = ev.success != 0; void* ignored = tag; GPR_CODEGEN_ASSERT(!tag->FinalizeResult(&ignored, &ok)); } /// Manage state of avalanching operations : completion queue tags that /// trigger other completion queue operations. The underlying core completion /// queue should not really shutdown until all avalanching operations have /// been finalized. Note that we maintain the requirement that an avalanche /// registration must take place before CQ shutdown (which must be maintained /// elsehwere) void InitialAvalanching() { gpr_atm_rel_store(&avalanches_in_flight_, static_cast(1)); } void RegisterAvalanching() { gpr_atm_no_barrier_fetch_add(&avalanches_in_flight_, static_cast(1)); } void CompleteAvalanching(); grpc_completion_queue* cq_; // owned gpr_atm avalanches_in_flight_; }; /// A specific type of completion queue used by the processing of notifications /// by servers. Instantiated by \a ServerBuilder. class ServerCompletionQueue : public CompletionQueue { public: bool IsFrequentlyPolled() { return polling_type_ != GRPC_CQ_NON_LISTENING; } protected: /// Default constructor ServerCompletionQueue() {} private: /// \param is_frequently_polled Informs the GRPC library about whether the /// server completion queue would be actively polled (by calling Next() or /// AsyncNext()). By default all server completion queues are assumed to be /// frequently polled. ServerCompletionQueue(grpc_cq_polling_type polling_type) : CompletionQueue(grpc_completion_queue_attributes{ GRPC_CQ_CURRENT_VERSION, GRPC_CQ_NEXT, polling_type}), polling_type_(polling_type) {} grpc_cq_polling_type polling_type_; friend class ServerBuilder; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/completion_queue_tag.h000066400000000000000000000024251334102242000310420ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H #define GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H namespace grpc { namespace internal { /// An interface allowing implementors to process and filter event tags. class CompletionQueueTag { public: virtual ~CompletionQueueTag() {} /// Called prior to returning from Next(), return value is the status of the /// operation (return status is the default thing to do). If this function /// returns false, the tag is dropped and not returned from the completion /// queue virtual bool FinalizeResult(void** tag, bool* status) = 0; }; } // namespace internal } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/config.h000066400000000000000000000022131334102242000260720ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_CONFIG_H #define GRPCPP_IMPL_CODEGEN_CONFIG_H #ifndef GRPC_CUSTOM_STRING #include #define GRPC_CUSTOM_STRING std::string #endif /// The following macros are deprecated and appear only for users /// with PB files generated using gRPC 1.0.x plugins. They should /// not be used in new code #define GRPC_OVERRIDE override // deprecated #define GRPC_FINAL final // deprecated namespace grpc { typedef GRPC_CUSTOM_STRING string; using std::to_string; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_CONFIG_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/config_protobuf.h000066400000000000000000000066431334102242000300250ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_CONFIG_PROTOBUF_H #define GRPCPP_IMPL_CODEGEN_CONFIG_PROTOBUF_H #define GRPC_OPEN_SOURCE_PROTO #ifndef GRPC_CUSTOM_PROTOBUF_INT64 #include #define GRPC_CUSTOM_PROTOBUF_INT64 ::google::protobuf::int64 #endif #ifndef GRPC_CUSTOM_MESSAGE #ifdef GRPC_USE_PROTO_LITE #include #define GRPC_CUSTOM_MESSAGE ::google::protobuf::MessageLite #else #include #define GRPC_CUSTOM_MESSAGE ::google::protobuf::Message #endif #endif #ifndef GRPC_CUSTOM_DESCRIPTOR #include #include #define GRPC_CUSTOM_DESCRIPTOR ::google::protobuf::Descriptor #define GRPC_CUSTOM_DESCRIPTORPOOL ::google::protobuf::DescriptorPool #define GRPC_CUSTOM_FIELDDESCRIPTOR ::google::protobuf::FieldDescriptor #define GRPC_CUSTOM_FILEDESCRIPTOR ::google::protobuf::FileDescriptor #define GRPC_CUSTOM_FILEDESCRIPTORPROTO ::google::protobuf::FileDescriptorProto #define GRPC_CUSTOM_METHODDESCRIPTOR ::google::protobuf::MethodDescriptor #define GRPC_CUSTOM_SERVICEDESCRIPTOR ::google::protobuf::ServiceDescriptor #define GRPC_CUSTOM_SOURCELOCATION ::google::protobuf::SourceLocation #endif #ifndef GRPC_CUSTOM_DESCRIPTORDATABASE #include #define GRPC_CUSTOM_DESCRIPTORDATABASE ::google::protobuf::DescriptorDatabase #define GRPC_CUSTOM_SIMPLEDESCRIPTORDATABASE \ ::google::protobuf::SimpleDescriptorDatabase #endif #ifndef GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM #include #include #define GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM \ ::google::protobuf::io::ZeroCopyOutputStream #define GRPC_CUSTOM_ZEROCOPYINPUTSTREAM \ ::google::protobuf::io::ZeroCopyInputStream #define GRPC_CUSTOM_CODEDINPUTSTREAM ::google::protobuf::io::CodedInputStream #endif namespace grpc { namespace protobuf { typedef GRPC_CUSTOM_MESSAGE Message; typedef GRPC_CUSTOM_PROTOBUF_INT64 int64; typedef GRPC_CUSTOM_DESCRIPTOR Descriptor; typedef GRPC_CUSTOM_DESCRIPTORPOOL DescriptorPool; typedef GRPC_CUSTOM_DESCRIPTORDATABASE DescriptorDatabase; typedef GRPC_CUSTOM_FIELDDESCRIPTOR FieldDescriptor; typedef GRPC_CUSTOM_FILEDESCRIPTOR FileDescriptor; typedef GRPC_CUSTOM_FILEDESCRIPTORPROTO FileDescriptorProto; typedef GRPC_CUSTOM_METHODDESCRIPTOR MethodDescriptor; typedef GRPC_CUSTOM_SERVICEDESCRIPTOR ServiceDescriptor; typedef GRPC_CUSTOM_SIMPLEDESCRIPTORDATABASE SimpleDescriptorDatabase; typedef GRPC_CUSTOM_SOURCELOCATION SourceLocation; namespace io { typedef GRPC_CUSTOM_ZEROCOPYOUTPUTSTREAM ZeroCopyOutputStream; typedef GRPC_CUSTOM_ZEROCOPYINPUTSTREAM ZeroCopyInputStream; typedef GRPC_CUSTOM_CODEDINPUTSTREAM CodedInputStream; } // namespace io } // namespace protobuf } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_CONFIG_PROTOBUF_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/core_codegen.h000066400000000000000000000122621334102242000272460ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_H #define GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_H // This file should be compiled as part of grpcpp. #include #include #include #include namespace grpc { /// Implementation of the core codegen interface. class CoreCodegen final : public CoreCodegenInterface { private: virtual const grpc_completion_queue_factory* grpc_completion_queue_factory_lookup( const grpc_completion_queue_attributes* attributes) override; virtual grpc_completion_queue* grpc_completion_queue_create( const grpc_completion_queue_factory* factory, const grpc_completion_queue_attributes* attributes, void* reserved) override; grpc_completion_queue* grpc_completion_queue_create_for_next( void* reserved) override; grpc_completion_queue* grpc_completion_queue_create_for_pluck( void* reserved) override; void grpc_completion_queue_destroy(grpc_completion_queue* cq) override; grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, void* tag, gpr_timespec deadline, void* reserved) override; void* gpr_malloc(size_t size) override; void gpr_free(void* p) override; void grpc_init() override; void grpc_shutdown() override; void gpr_mu_init(gpr_mu* mu) override; void gpr_mu_destroy(gpr_mu* mu) override; void gpr_mu_lock(gpr_mu* mu) override; void gpr_mu_unlock(gpr_mu* mu) override; void gpr_cv_init(gpr_cv* cv) override; void gpr_cv_destroy(gpr_cv* cv) override; int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) override; void gpr_cv_signal(gpr_cv* cv) override; void gpr_cv_broadcast(gpr_cv* cv) override; grpc_call_error grpc_call_cancel_with_status(grpc_call* call, grpc_status_code status, const char* description, void* reserved) override; void grpc_call_ref(grpc_call* call) override; void grpc_call_unref(grpc_call* call) override; virtual void* grpc_call_arena_alloc(grpc_call* call, size_t length) override; grpc_byte_buffer* grpc_byte_buffer_copy(grpc_byte_buffer* bb) override; void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) override; size_t grpc_byte_buffer_length(grpc_byte_buffer* bb) override; int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader, grpc_byte_buffer* buffer) override; void grpc_byte_buffer_reader_destroy( grpc_byte_buffer_reader* reader) override; int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, grpc_slice* slice) override; grpc_byte_buffer* grpc_raw_byte_buffer_create(grpc_slice* slice, size_t nslices) override; grpc_slice grpc_slice_new_with_user_data(void* p, size_t len, void (*destroy)(void*), void* user_data) override; grpc_slice grpc_slice_new_with_len(void* p, size_t len, void (*destroy)(void*, size_t)) override; grpc_slice grpc_empty_slice() override; grpc_slice grpc_slice_malloc(size_t length) override; void grpc_slice_unref(grpc_slice slice) override; grpc_slice grpc_slice_ref(grpc_slice slice) override; grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) override; grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) override; grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end) override; void grpc_slice_buffer_add(grpc_slice_buffer* sb, grpc_slice slice) override; void grpc_slice_buffer_pop(grpc_slice_buffer* sb) override; grpc_slice grpc_slice_from_static_buffer(const void* buffer, size_t length) override; grpc_slice grpc_slice_from_copied_buffer(const void* buffer, size_t length) override; void grpc_metadata_array_init(grpc_metadata_array* array) override; void grpc_metadata_array_destroy(grpc_metadata_array* array) override; gpr_timespec gpr_inf_future(gpr_clock_type type) override; gpr_timespec gpr_time_0(gpr_clock_type type) override; virtual const Status& ok() override; virtual const Status& cancelled() override; void assert_fail(const char* failed_assertion, const char* file, int line) override; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/core_codegen_interface.h000066400000000000000000000154111334102242000312650ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H #define GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H #include #include #include #include #include namespace grpc { /// Interface between the codegen library and the minimal subset of core /// features required by the generated code. /// /// All undocumented methods are simply forwarding the call to their namesakes. /// Please refer to their corresponding documentation for details. /// /// \warning This interface should be considered internal and private. class CoreCodegenInterface { public: virtual ~CoreCodegenInterface() = default; /// Upon a failed assertion, log the error. virtual void assert_fail(const char* failed_assertion, const char* file, int line) = 0; virtual const grpc_completion_queue_factory* grpc_completion_queue_factory_lookup( const grpc_completion_queue_attributes* attributes) = 0; virtual grpc_completion_queue* grpc_completion_queue_create( const grpc_completion_queue_factory* factory, const grpc_completion_queue_attributes* attributes, void* reserved) = 0; virtual grpc_completion_queue* grpc_completion_queue_create_for_next( void* reserved) = 0; virtual grpc_completion_queue* grpc_completion_queue_create_for_pluck( void* reserved) = 0; virtual void grpc_completion_queue_destroy(grpc_completion_queue* cq) = 0; virtual grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, void* tag, gpr_timespec deadline, void* reserved) = 0; virtual void* gpr_malloc(size_t size) = 0; virtual void gpr_free(void* p) = 0; // These are only to be used to fix edge cases involving grpc_init and // grpc_shutdown. Calling grpc_init from the codegen interface before // the real grpc_init is called will cause a crash, so if you use this // function, ensure that it is not the first call to grpc_init. virtual void grpc_init() = 0; virtual void grpc_shutdown() = 0; virtual void gpr_mu_init(gpr_mu* mu) = 0; virtual void gpr_mu_destroy(gpr_mu* mu) = 0; virtual void gpr_mu_lock(gpr_mu* mu) = 0; virtual void gpr_mu_unlock(gpr_mu* mu) = 0; virtual void gpr_cv_init(gpr_cv* cv) = 0; virtual void gpr_cv_destroy(gpr_cv* cv) = 0; virtual int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) = 0; virtual void gpr_cv_signal(gpr_cv* cv) = 0; virtual void gpr_cv_broadcast(gpr_cv* cv) = 0; virtual grpc_byte_buffer* grpc_byte_buffer_copy(grpc_byte_buffer* bb) = 0; virtual void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) = 0; virtual size_t grpc_byte_buffer_length(grpc_byte_buffer* bb) GRPC_MUST_USE_RESULT = 0; virtual int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader, grpc_byte_buffer* buffer) GRPC_MUST_USE_RESULT = 0; virtual void grpc_byte_buffer_reader_destroy( grpc_byte_buffer_reader* reader) = 0; virtual int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, grpc_slice* slice) = 0; virtual grpc_byte_buffer* grpc_raw_byte_buffer_create(grpc_slice* slice, size_t nslices) = 0; virtual grpc_slice grpc_slice_new_with_user_data(void* p, size_t len, void (*destroy)(void*), void* user_data) = 0; virtual grpc_slice grpc_slice_new_with_len(void* p, size_t len, void (*destroy)(void*, size_t)) = 0; virtual grpc_call_error grpc_call_cancel_with_status(grpc_call* call, grpc_status_code status, const char* description, void* reserved) = 0; virtual void grpc_call_ref(grpc_call* call) = 0; virtual void grpc_call_unref(grpc_call* call) = 0; virtual void* grpc_call_arena_alloc(grpc_call* call, size_t length) = 0; virtual grpc_slice grpc_empty_slice() = 0; virtual grpc_slice grpc_slice_malloc(size_t length) = 0; virtual void grpc_slice_unref(grpc_slice slice) = 0; virtual grpc_slice grpc_slice_ref(grpc_slice slice) = 0; virtual grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) = 0; virtual grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) = 0; virtual grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end) = 0; virtual void grpc_slice_buffer_add(grpc_slice_buffer* sb, grpc_slice slice) = 0; virtual void grpc_slice_buffer_pop(grpc_slice_buffer* sb) = 0; virtual grpc_slice grpc_slice_from_static_buffer(const void* buffer, size_t length) = 0; virtual grpc_slice grpc_slice_from_copied_buffer(const void* buffer, size_t length) = 0; virtual void grpc_metadata_array_init(grpc_metadata_array* array) = 0; virtual void grpc_metadata_array_destroy(grpc_metadata_array* array) = 0; virtual const Status& ok() = 0; virtual const Status& cancelled() = 0; virtual gpr_timespec gpr_inf_future(gpr_clock_type type) = 0; virtual gpr_timespec gpr_time_0(gpr_clock_type type) = 0; }; extern CoreCodegenInterface* g_core_codegen_interface; /// Codegen specific version of \a GPR_ASSERT. #define GPR_CODEGEN_ASSERT(x) \ do { \ if (!(x)) { \ grpc::g_core_codegen_interface->assert_fail(#x, __FILE__, __LINE__); \ } \ } while (0) } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/create_auth_context.h000066400000000000000000000017331334102242000306630ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H #define GRPCPP_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H #include #include #include namespace grpc { std::shared_ptr CreateAuthContext(grpc_call* call); } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/grpc_library.h000066400000000000000000000035061334102242000273120ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_GRPC_LIBRARY_H #define GRPCPP_IMPL_CODEGEN_GRPC_LIBRARY_H #include namespace grpc { class GrpcLibraryInterface { public: virtual ~GrpcLibraryInterface() = default; virtual void init() = 0; virtual void shutdown() = 0; }; /// Initialized by \a grpc::GrpcLibraryInitializer from /// extern GrpcLibraryInterface* g_glip; /// Classes that require gRPC to be initialized should inherit from this class. class GrpcLibraryCodegen { public: GrpcLibraryCodegen(bool call_grpc_init = true) : grpc_init_called_(false) { if (call_grpc_init) { GPR_CODEGEN_ASSERT(g_glip && "gRPC library not initialized. See " "grpc::internal::GrpcLibraryInitializer."); g_glip->init(); grpc_init_called_ = true; } } virtual ~GrpcLibraryCodegen() { if (grpc_init_called_) { GPR_CODEGEN_ASSERT(g_glip && "gRPC library not initialized. See " "grpc::internal::GrpcLibraryInitializer."); g_glip->shutdown(); } } private: bool grpc_init_called_; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_GRPC_LIBRARY_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/metadata_map.h000066400000000000000000000031561334102242000272510ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_METADATA_MAP_H #define GRPCPP_IMPL_CODEGEN_METADATA_MAP_H #include namespace grpc { namespace internal { class MetadataMap { public: MetadataMap() { memset(&arr_, 0, sizeof(arr_)); } ~MetadataMap() { g_core_codegen_interface->grpc_metadata_array_destroy(&arr_); } void FillMap() { for (size_t i = 0; i < arr_.count; i++) { // TODO(yangg) handle duplicates? map_.insert(std::pair( StringRefFromSlice(&arr_.metadata[i].key), StringRefFromSlice(&arr_.metadata[i].value))); } } std::multimap* map() { return &map_; } const std::multimap* map() const { return &map_; } grpc_metadata_array* arr() { return &arr_; } private: grpc_metadata_array arr_; std::multimap map_; }; } // namespace internal } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_METADATA_MAP_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/method_handler_impl.h000066400000000000000000000263331334102242000306340ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H #define GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H #include #include #include #include namespace grpc { namespace internal { // Invoke the method handler, fill in the status, and // return whether or not we finished safely (without an exception). // Note that exception handling is 0-cost in most compiler/library // implementations (except when an exception is actually thrown), // so this process doesn't require additional overhead in the common case. // Additionally, we don't need to return if we caught an exception or not; // the handling is the same in either case. template Status CatchingFunctionHandler(Callable&& handler) { #if GRPC_ALLOW_EXCEPTIONS try { return handler(); } catch (...) { return Status(StatusCode::UNKNOWN, "Unexpected error in RPC handling"); } #else // GRPC_ALLOW_EXCEPTIONS return handler(); #endif // GRPC_ALLOW_EXCEPTIONS } /// A wrapper class of an application provided rpc method handler. template class RpcMethodHandler : public MethodHandler { public: RpcMethodHandler(std::function func, ServiceType* service) : func_(func), service_(service) {} void RunHandler(const HandlerParameter& param) final { RequestType req; Status status = SerializationTraits::Deserialize( param.request.bbuf_ptr(), &req); ResponseType rsp; if (status.ok()) { status = CatchingFunctionHandler([this, ¶m, &req, &rsp] { return func_(service_, param.server_context, &req, &rsp); }); } GPR_CODEGEN_ASSERT(!param.server_context->sent_initial_metadata_); CallOpSet ops; ops.SendInitialMetadata(param.server_context->initial_metadata_, param.server_context->initial_metadata_flags()); if (param.server_context->compression_level_set()) { ops.set_compression_level(param.server_context->compression_level()); } if (status.ok()) { status = ops.SendMessage(rsp); } ops.ServerSendStatus(param.server_context->trailing_metadata_, status); param.call->PerformOps(&ops); param.call->cq()->Pluck(&ops); } private: /// Application provided rpc handler function. std::function func_; // The class the above handler function lives in. ServiceType* service_; }; /// A wrapper class of an application provided client streaming handler. template class ClientStreamingHandler : public MethodHandler { public: ClientStreamingHandler( std::function*, ResponseType*)> func, ServiceType* service) : func_(func), service_(service) {} void RunHandler(const HandlerParameter& param) final { ServerReader reader(param.call, param.server_context); ResponseType rsp; Status status = CatchingFunctionHandler([this, ¶m, &reader, &rsp] { return func_(service_, param.server_context, &reader, &rsp); }); CallOpSet ops; if (!param.server_context->sent_initial_metadata_) { ops.SendInitialMetadata(param.server_context->initial_metadata_, param.server_context->initial_metadata_flags()); if (param.server_context->compression_level_set()) { ops.set_compression_level(param.server_context->compression_level()); } } if (status.ok()) { status = ops.SendMessage(rsp); } ops.ServerSendStatus(param.server_context->trailing_metadata_, status); param.call->PerformOps(&ops); param.call->cq()->Pluck(&ops); } private: std::function*, ResponseType*)> func_; ServiceType* service_; }; /// A wrapper class of an application provided server streaming handler. template class ServerStreamingHandler : public MethodHandler { public: ServerStreamingHandler( std::function*)> func, ServiceType* service) : func_(func), service_(service) {} void RunHandler(const HandlerParameter& param) final { RequestType req; Status status = SerializationTraits::Deserialize( param.request.bbuf_ptr(), &req); if (status.ok()) { ServerWriter writer(param.call, param.server_context); status = CatchingFunctionHandler([this, ¶m, &req, &writer] { return func_(service_, param.server_context, &req, &writer); }); } CallOpSet ops; if (!param.server_context->sent_initial_metadata_) { ops.SendInitialMetadata(param.server_context->initial_metadata_, param.server_context->initial_metadata_flags()); if (param.server_context->compression_level_set()) { ops.set_compression_level(param.server_context->compression_level()); } } ops.ServerSendStatus(param.server_context->trailing_metadata_, status); param.call->PerformOps(&ops); if (param.server_context->has_pending_ops_) { param.call->cq()->Pluck(¶m.server_context->pending_ops_); } param.call->cq()->Pluck(&ops); } private: std::function*)> func_; ServiceType* service_; }; /// A wrapper class of an application provided bidi-streaming handler. /// This also applies to server-streamed implementation of a unary method /// with the additional requirement that such methods must have done a /// write for status to be ok /// Since this is used by more than 1 class, the service is not passed in. /// Instead, it is expected to be an implicitly-captured argument of func /// (through bind or something along those lines) template class TemplatedBidiStreamingHandler : public MethodHandler { public: TemplatedBidiStreamingHandler( std::function func) : func_(func), write_needed_(WriteNeeded) {} void RunHandler(const HandlerParameter& param) final { Streamer stream(param.call, param.server_context); Status status = CatchingFunctionHandler([this, ¶m, &stream] { return func_(param.server_context, &stream); }); CallOpSet ops; if (!param.server_context->sent_initial_metadata_) { ops.SendInitialMetadata(param.server_context->initial_metadata_, param.server_context->initial_metadata_flags()); if (param.server_context->compression_level_set()) { ops.set_compression_level(param.server_context->compression_level()); } if (write_needed_ && status.ok()) { // If we needed a write but never did one, we need to mark the // status as a fail status = Status(StatusCode::INTERNAL, "Service did not provide response message"); } } ops.ServerSendStatus(param.server_context->trailing_metadata_, status); param.call->PerformOps(&ops); if (param.server_context->has_pending_ops_) { param.call->cq()->Pluck(¶m.server_context->pending_ops_); } param.call->cq()->Pluck(&ops); } private: std::function func_; const bool write_needed_; }; template class BidiStreamingHandler : public TemplatedBidiStreamingHandler< ServerReaderWriter, false> { public: BidiStreamingHandler( std::function*)> func, ServiceType* service) : TemplatedBidiStreamingHandler< ServerReaderWriter, false>(std::bind( func, service, std::placeholders::_1, std::placeholders::_2)) {} }; template class StreamedUnaryHandler : public TemplatedBidiStreamingHandler< ServerUnaryStreamer, true> { public: explicit StreamedUnaryHandler( std::function*)> func) : TemplatedBidiStreamingHandler< ServerUnaryStreamer, true>(func) {} }; template class SplitServerStreamingHandler : public TemplatedBidiStreamingHandler< ServerSplitStreamer, false> { public: explicit SplitServerStreamingHandler( std::function*)> func) : TemplatedBidiStreamingHandler< ServerSplitStreamer, false>(func) {} }; /// Handle unknown method by returning UNIMPLEMENTED error. class UnknownMethodHandler : public MethodHandler { public: template static void FillOps(ServerContext* context, T* ops) { Status status(StatusCode::UNIMPLEMENTED, ""); if (!context->sent_initial_metadata_) { ops->SendInitialMetadata(context->initial_metadata_, context->initial_metadata_flags()); if (context->compression_level_set()) { ops->set_compression_level(context->compression_level()); } context->sent_initial_metadata_ = true; } ops->ServerSendStatus(context->trailing_metadata_, status); } void RunHandler(const HandlerParameter& param) final { CallOpSet ops; FillOps(param.server_context, &ops); param.call->PerformOps(&ops); param.call->cq()->Pluck(&ops); } }; } // namespace internal } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_IMPL_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/proto_buffer_reader.h000066400000000000000000000133431334102242000306510ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_READER_H #define GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_READER_H #include #include #include #include #include #include #include #include #include /// This header provides an object that reads bytes directly from a /// grpc::ByteBuffer, via the ZeroCopyInputStream interface namespace grpc { extern CoreCodegenInterface* g_core_codegen_interface; /// This is a specialization of the protobuf class ZeroCopyInputStream /// The principle is to get one chunk of data at a time from the proto layer, /// with options to backup (re-see some bytes) or skip (forward past some bytes) /// /// Read more about ZeroCopyInputStream interface here: /// https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream#ZeroCopyInputStream class ProtoBufferReader : public ::grpc::protobuf::io::ZeroCopyInputStream { public: /// Constructs buffer reader from \a buffer. Will set \a status() to non ok /// if \a buffer is invalid (the internal buffer has not been initialized). explicit ProtoBufferReader(ByteBuffer* buffer) : byte_count_(0), backup_count_(0), status_() { /// Implemented through a grpc_byte_buffer_reader which iterates /// over the slices that make up a byte buffer if (!buffer->Valid() || !g_core_codegen_interface->grpc_byte_buffer_reader_init( &reader_, buffer->c_buffer())) { status_ = Status(StatusCode::INTERNAL, "Couldn't initialize byte buffer reader"); } } ~ProtoBufferReader() { if (status_.ok()) { g_core_codegen_interface->grpc_byte_buffer_reader_destroy(&reader_); } } /// Give the proto library a chunk of data from the stream. The caller /// may safely read from data[0, size - 1]. bool Next(const void** data, int* size) override { if (!status_.ok()) { return false; } /// If we have backed up previously, we need to return the backed-up slice if (backup_count_ > 0) { *data = GRPC_SLICE_START_PTR(slice_) + GRPC_SLICE_LENGTH(slice_) - backup_count_; GPR_CODEGEN_ASSERT(backup_count_ <= INT_MAX); *size = (int)backup_count_; backup_count_ = 0; return true; } /// Otherwise get the next slice from the byte buffer reader if (!g_core_codegen_interface->grpc_byte_buffer_reader_next(&reader_, &slice_)) { return false; } g_core_codegen_interface->grpc_slice_unref(slice_); *data = GRPC_SLICE_START_PTR(slice_); // On win x64, int is only 32bit GPR_CODEGEN_ASSERT(GRPC_SLICE_LENGTH(slice_) <= INT_MAX); byte_count_ += * size = (int)GRPC_SLICE_LENGTH(slice_); return true; } /// Returns the status of the buffer reader. Status status() const { return status_; } /// The proto library calls this to indicate that we should back up \a count /// bytes that have already been returned by the last call of Next. /// So do the backup and have that ready for a later Next. void BackUp(int count) override { GPR_CODEGEN_ASSERT(count <= static_cast(GRPC_SLICE_LENGTH(slice_))); backup_count_ = count; } /// The proto library calls this to skip over \a count bytes. Implement this /// using Next and BackUp combined. bool Skip(int count) override { const void* data; int size; while (Next(&data, &size)) { if (size >= count) { BackUp(size - count); return true; } // size < count; count -= size; } // error or we have too large count; return false; } /// Returns the total number of bytes read since this object was created. grpc::protobuf::int64 ByteCount() const override { return byte_count_ - backup_count_; } // These protected members are needed to support internal optimizations. // they expose internal bits of grpc core that are NOT stable. If you have // a use case needs to use one of these functions, please send an email to // https://groups.google.com/forum/#!forum/grpc-io. protected: void set_byte_count(int64_t byte_count) { byte_count_ = byte_count; } int64_t backup_count() { return backup_count_; } void set_backup_count(int64_t backup_count) { backup_count_ = backup_count; } grpc_byte_buffer_reader* reader() { return &reader_; } grpc_slice* slice() { return &slice_; } private: int64_t byte_count_; ///< total bytes read since object creation int64_t backup_count_; ///< how far backed up in the stream we are grpc_byte_buffer_reader reader_; ///< internal object to read \a grpc_slice ///< from the \a grpc_byte_buffer grpc_slice slice_; ///< current slice passed back to the caller Status status_; ///< status of the entire object }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_READER_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/proto_buffer_writer.h000066400000000000000000000160011334102242000307150ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_WRITER_H #define GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_WRITER_H #include #include #include #include #include #include #include #include /// This header provides an object that writes bytes directly into a /// grpc::ByteBuffer, via the ZeroCopyOutputStream interface namespace grpc { extern CoreCodegenInterface* g_core_codegen_interface; // Forward declaration for testing use only namespace internal { class ProtoBufferWriterPeer; } // namespace internal const int kProtoBufferWriterMaxBufferLength = 1024 * 1024; /// This is a specialization of the protobuf class ZeroCopyOutputStream. /// The principle is to give the proto layer one buffer of bytes at a time /// that it can use to serialize the next portion of the message, with the /// option to "backup" if more buffer is given than required at the last buffer. /// /// Read more about ZeroCopyOutputStream interface here: /// https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.zero_copy_stream#ZeroCopyOutputStream class ProtoBufferWriter : public ::grpc::protobuf::io::ZeroCopyOutputStream { public: /// Constructor for this derived class /// /// \param[out] byte_buffer A pointer to the grpc::ByteBuffer created /// \param block_size How big are the chunks to allocate at a time /// \param total_size How many total bytes are required for this proto ProtoBufferWriter(ByteBuffer* byte_buffer, int block_size, int total_size) : block_size_(block_size), total_size_(total_size), byte_count_(0), have_backup_(false) { GPR_CODEGEN_ASSERT(!byte_buffer->Valid()); /// Create an empty raw byte buffer and look at its underlying slice buffer grpc_byte_buffer* bp = g_core_codegen_interface->grpc_raw_byte_buffer_create(NULL, 0); byte_buffer->set_buffer(bp); slice_buffer_ = &bp->data.raw.slice_buffer; } ~ProtoBufferWriter() { if (have_backup_) { g_core_codegen_interface->grpc_slice_unref(backup_slice_); } } /// Give the proto library the next buffer of bytes and its size. It is /// safe for the caller to write from data[0, size - 1]. bool Next(void** data, int* size) override { // Protobuf should not ask for more memory than total_size_. GPR_CODEGEN_ASSERT(byte_count_ < total_size_); // 1. Use the remaining backup slice if we have one // 2. Otherwise allocate a slice, up to the remaining length needed // or our maximum allocation size // 3. Provide the slice start and size available // 4. Add the slice being returned to the slice buffer size_t remain = total_size_ - byte_count_; if (have_backup_) { /// If we have a backup slice, we should use it first slice_ = backup_slice_; have_backup_ = false; if (GRPC_SLICE_LENGTH(slice_) > remain) { GRPC_SLICE_SET_LENGTH(slice_, remain); } } else { // When less than a whole block is needed, only allocate that much. // But make sure the allocated slice is not inlined. size_t allocate_length = remain > static_cast(block_size_) ? block_size_ : remain; slice_ = g_core_codegen_interface->grpc_slice_malloc( allocate_length > GRPC_SLICE_INLINED_SIZE ? allocate_length : GRPC_SLICE_INLINED_SIZE + 1); } *data = GRPC_SLICE_START_PTR(slice_); // On win x64, int is only 32bit GPR_CODEGEN_ASSERT(GRPC_SLICE_LENGTH(slice_) <= INT_MAX); byte_count_ += * size = (int)GRPC_SLICE_LENGTH(slice_); g_core_codegen_interface->grpc_slice_buffer_add(slice_buffer_, slice_); return true; } /// Backup by \a count bytes because Next returned more bytes than needed /// (only used in the last buffer). \a count must be less than or equal too /// the last buffer returned from next. void BackUp(int count) override { /// 1. Remove the partially-used last slice from the slice buffer /// 2. Split it into the needed (if any) and unneeded part /// 3. Add the needed part back to the slice buffer /// 4. Mark that we still have the remaining part (for later use/unref) GPR_CODEGEN_ASSERT(count <= static_cast(GRPC_SLICE_LENGTH(slice_))); g_core_codegen_interface->grpc_slice_buffer_pop(slice_buffer_); if ((size_t)count == GRPC_SLICE_LENGTH(slice_)) { backup_slice_ = slice_; } else { backup_slice_ = g_core_codegen_interface->grpc_slice_split_tail( &slice_, GRPC_SLICE_LENGTH(slice_) - count); g_core_codegen_interface->grpc_slice_buffer_add(slice_buffer_, slice_); } // It's dangerous to keep an inlined grpc_slice as the backup slice, since // on a following Next() call, a reference will be returned to this slice // via GRPC_SLICE_START_PTR, which will not be an address held by // slice_buffer_. have_backup_ = backup_slice_.refcount != NULL; byte_count_ -= count; } /// Returns the total number of bytes written since this object was created. grpc::protobuf::int64 ByteCount() const override { return byte_count_; } // These protected members are needed to support internal optimizations. // they expose internal bits of grpc core that are NOT stable. If you have // a use case needs to use one of these functions, please send an email to // https://groups.google.com/forum/#!forum/grpc-io. protected: grpc_slice_buffer* slice_buffer() { return slice_buffer_; } void set_byte_count(int64_t byte_count) { byte_count_ = byte_count; } private: // friend for testing purposes only friend class internal::ProtoBufferWriterPeer; const int block_size_; ///< size to alloc for each new \a grpc_slice needed const int total_size_; ///< byte size of proto being serialized int64_t byte_count_; ///< bytes written since this object was created grpc_slice_buffer* slice_buffer_; ///< internal buffer of slices holding the serialized data bool have_backup_; ///< if we are holding a backup slice or not grpc_slice backup_slice_; ///< holds space we can still write to, if the ///< caller has called BackUp grpc_slice slice_; ///< current slice passed back to the caller }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_WRITER_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/proto_utils.h000066400000000000000000000111701334102242000272120ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_PROTO_UTILS_H #define GRPCPP_IMPL_CODEGEN_PROTO_UTILS_H #include #include #include #include #include #include #include #include #include #include #include #include /// This header provides serialization and deserialization between gRPC /// messages serialized using protobuf and the C++ objects they represent. namespace grpc { extern CoreCodegenInterface* g_core_codegen_interface; // ProtoBufferWriter must be a subclass of ::protobuf::io::ZeroCopyOutputStream. template Status GenericSerialize(const grpc::protobuf::Message& msg, ByteBuffer* bb, bool* own_buffer) { static_assert(std::is_base_of::value, "ProtoBufferWriter must be a subclass of " "::protobuf::io::ZeroCopyOutputStream"); *own_buffer = true; int byte_size = msg.ByteSize(); if ((size_t)byte_size <= GRPC_SLICE_INLINED_SIZE) { Slice slice(byte_size); // We serialize directly into the allocated slices memory GPR_CODEGEN_ASSERT(slice.end() == msg.SerializeWithCachedSizesToArray( const_cast(slice.begin()))); ByteBuffer tmp(&slice, 1); bb->Swap(&tmp); return g_core_codegen_interface->ok(); } ProtoBufferWriter writer(bb, kProtoBufferWriterMaxBufferLength, byte_size); return msg.SerializeToZeroCopyStream(&writer) ? g_core_codegen_interface->ok() : Status(StatusCode::INTERNAL, "Failed to serialize message"); } // BufferReader must be a subclass of ::protobuf::io::ZeroCopyInputStream. template Status GenericDeserialize(ByteBuffer* buffer, grpc::protobuf::Message* msg) { static_assert(std::is_base_of::value, "ProtoBufferReader must be a subclass of " "::protobuf::io::ZeroCopyInputStream"); if (buffer == nullptr) { return Status(StatusCode::INTERNAL, "No payload"); } Status result = g_core_codegen_interface->ok(); { ProtoBufferReader reader(buffer); if (!reader.status().ok()) { return reader.status(); } ::grpc::protobuf::io::CodedInputStream decoder(&reader); decoder.SetTotalBytesLimit(INT_MAX, INT_MAX); if (!msg->ParseFromCodedStream(&decoder)) { result = Status(StatusCode::INTERNAL, msg->InitializationErrorString()); } if (!decoder.ConsumedEntireMessage()) { result = Status(StatusCode::INTERNAL, "Did not read entire message"); } } buffer->Clear(); return result; } // this is needed so the following class does not conflict with protobuf // serializers that utilize internal-only tools. #ifdef GRPC_OPEN_SOURCE_PROTO // This class provides a protobuf serializer. It translates between protobuf // objects and grpc_byte_buffers. More information about SerializationTraits can // be found in include/grpcpp/impl/codegen/serialization_traits.h. template class SerializationTraits::value>::type> { public: static Status Serialize(const grpc::protobuf::Message& msg, ByteBuffer* bb, bool* own_buffer) { return GenericSerialize(msg, bb, own_buffer); } static Status Deserialize(ByteBuffer* buffer, grpc::protobuf::Message* msg) { return GenericDeserialize(buffer, msg); } }; #endif } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_PROTO_UTILS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/rpc_method.h000066400000000000000000000032731334102242000267600ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_RPC_METHOD_H #define GRPCPP_IMPL_CODEGEN_RPC_METHOD_H #include #include namespace grpc { namespace internal { /// Descriptor of an RPC method class RpcMethod { public: enum RpcType { NORMAL_RPC = 0, CLIENT_STREAMING, // request streaming SERVER_STREAMING, // response streaming BIDI_STREAMING }; RpcMethod(const char* name, RpcType type) : name_(name), method_type_(type), channel_tag_(NULL) {} RpcMethod(const char* name, RpcType type, const std::shared_ptr& channel) : name_(name), method_type_(type), channel_tag_(channel->RegisterMethod(name)) {} const char* name() const { return name_; } RpcType method_type() const { return method_type_; } void SetMethodType(RpcType type) { method_type_ = type; } void* channel_tag() const { return channel_tag_; } private: const char* const name_; RpcType method_type_; void* const channel_tag_; }; } // namespace internal } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_RPC_METHOD_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/rpc_service_method.h000066400000000000000000000067511334102242000305040ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_RPC_SERVICE_METHOD_H #define GRPCPP_IMPL_CODEGEN_RPC_SERVICE_METHOD_H #include #include #include #include #include #include #include #include #include #include namespace grpc { class ServerContext; namespace internal { /// Base class for running an RPC handler. class MethodHandler { public: virtual ~MethodHandler() {} struct HandlerParameter { HandlerParameter(Call* c, ServerContext* context, grpc_byte_buffer* req) : call(c), server_context(context) { request.set_buffer(req); } ~HandlerParameter() { request.Release(); } Call* call; ServerContext* server_context; // Handler required to destroy these contents ByteBuffer request; }; virtual void RunHandler(const HandlerParameter& param) = 0; }; /// Server side rpc method class class RpcServiceMethod : public RpcMethod { public: /// Takes ownership of the handler RpcServiceMethod(const char* name, RpcMethod::RpcType type, MethodHandler* handler) : RpcMethod(name, type), server_tag_(nullptr), async_type_(AsyncType::UNSET), handler_(handler) {} enum class AsyncType { UNSET, ASYNC, RAW, }; void set_server_tag(void* tag) { server_tag_ = tag; } void* server_tag() const { return server_tag_; } /// if MethodHandler is nullptr, then this is an async method MethodHandler* handler() const { return handler_.get(); } void SetHandler(MethodHandler* handler) { handler_.reset(handler); } void SetServerAsyncType(RpcServiceMethod::AsyncType type) { if (async_type_ == AsyncType::UNSET) { // this marks this method as async handler_.reset(); } else { // this is not an error condition, as it allows users to declare a server // like WithRawMethod_foo. However since it // overwrites behavior, it should be logged. gpr_log( GPR_INFO, "You are marking method %s as '%s', even though it was " "previously marked '%s'. This behavior will overwrite the original " "behavior. If you expected this then ignore this message.", name(), TypeToString(async_type_), TypeToString(type)); } async_type_ = type; } private: void* server_tag_; AsyncType async_type_; std::unique_ptr handler_; const char* TypeToString(RpcServiceMethod::AsyncType type) { switch (type) { case AsyncType::UNSET: return "unset"; case AsyncType::ASYNC: return "async"; case AsyncType::RAW: return "raw"; default: GPR_UNREACHABLE_CODE(return "unknown"); } } }; } // namespace internal } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_RPC_SERVICE_METHOD_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/security/000077500000000000000000000000001334102242000263255ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/security/auth_context.h000066400000000000000000000060021334102242000312010ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H #define GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H #include #include #include #include struct grpc_auth_context; struct grpc_auth_property; struct grpc_auth_property_iterator; namespace grpc { class SecureAuthContext; typedef std::pair AuthProperty; class AuthPropertyIterator : public std::iterator { public: ~AuthPropertyIterator(); AuthPropertyIterator& operator++(); AuthPropertyIterator operator++(int); bool operator==(const AuthPropertyIterator& rhs) const; bool operator!=(const AuthPropertyIterator& rhs) const; const AuthProperty operator*(); protected: AuthPropertyIterator(); AuthPropertyIterator(const grpc_auth_property* property, const grpc_auth_property_iterator* iter); private: friend class SecureAuthContext; const grpc_auth_property* property_; // The following items form a grpc_auth_property_iterator. const grpc_auth_context* ctx_; size_t index_; const char* name_; }; /// Class encapsulating the Authentication Information. /// /// It includes the secure identity of the peer, the type of secure transport /// used as well as any other properties required by the authorization layer. class AuthContext { public: virtual ~AuthContext() {} /// Returns true if the peer is authenticated. virtual bool IsPeerAuthenticated() const = 0; /// A peer identity. /// /// It is, in general, comprised of one or more properties (in which case they /// have the same name). virtual std::vector GetPeerIdentity() const = 0; virtual grpc::string GetPeerIdentityPropertyName() const = 0; /// Returns all the property values with the given name. virtual std::vector FindPropertyValues( const grpc::string& name) const = 0; /// Iteration over all the properties. virtual AuthPropertyIterator begin() const = 0; virtual AuthPropertyIterator end() const = 0; /// Mutation functions: should only be used by an AuthMetadataProcessor. virtual void AddProperty(const grpc::string& key, const grpc::string_ref& value) = 0; virtual bool SetPeerIdentityPropertyName(const grpc::string& name) = 0; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/serialization_traits.h000066400000000000000000000044721334102242000311010ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_SERIALIZATION_TRAITS_H #define GRPCPP_IMPL_CODEGEN_SERIALIZATION_TRAITS_H namespace grpc { /// Defines how to serialize and deserialize some type. /// /// Used for hooking different message serialization API's into GRPC. /// Each SerializationTraits implementation must provide the /// following functions: /// 1. static Status Serialize(const Message& msg, /// ByteBuffer* buffer, /// bool* own_buffer); /// OR /// static Status Serialize(const Message& msg, /// grpc_byte_buffer** buffer, /// bool* own_buffer); /// The former is preferred; the latter is deprecated /// /// 2. static Status Deserialize(ByteBuffer* buffer, /// Message* msg); /// OR /// static Status Deserialize(grpc_byte_buffer* buffer, /// Message* msg); /// The former is preferred; the latter is deprecated /// /// Serialize is required to convert message to a ByteBuffer, and /// return that byte buffer through *buffer. *own_buffer should /// be set to true if the caller owns said byte buffer, or false if /// ownership is retained elsewhere. /// /// Deserialize is required to convert buffer into the message stored at /// msg. max_receive_message_size is passed in as a bound on the maximum /// number of message bytes Deserialize should accept. /// /// Both functions return a Status, allowing them to explain what went /// wrong if required. template class SerializationTraits; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_SERIALIZATION_TRAITS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/server_context.h000066400000000000000000000272261334102242000277120ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_H #define GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_H #include #include #include #include #include #include #include #include #include #include #include #include struct grpc_metadata; struct grpc_call; struct census_context; namespace grpc { class ClientContext; template class ServerAsyncReader; template class ServerAsyncWriter; template class ServerAsyncResponseWriter; template class ServerAsyncReaderWriter; template class ServerReader; template class ServerWriter; namespace internal { template class ServerReaderWriterBody; template class RpcMethodHandler; template class ClientStreamingHandler; template class ServerStreamingHandler; template class BidiStreamingHandler; class UnknownMethodHandler; template class TemplatedBidiStreamingHandler; class Call; } // namespace internal class CompletionQueue; class Server; class ServerInterface; namespace testing { class InteropServerContextInspector; class ServerContextTestSpouse; } // namespace testing /// A ServerContext allows the person implementing a service handler to: /// /// - Add custom initial and trailing metadata key-value pairs that will /// propagated to the client side. /// - Control call settings such as compression and authentication. /// - Access metadata coming from the client. /// - Get performance metrics (ie, census). /// /// Context settings are only relevant to the call handler they are supplied to, /// that is to say, they aren't sticky across multiple calls. Some of these /// settings, such as the compression options, can be made persistent at server /// construction time by specifying the appropriate \a ChannelArguments /// to a \a grpc::ServerBuilder, via \a ServerBuilder::AddChannelArgument. /// /// \warning ServerContext instances should \em not be reused across rpcs. class ServerContext { public: ServerContext(); // for async calls ~ServerContext(); /// Return the deadline for the server call. std::chrono::system_clock::time_point deadline() const { return Timespec2Timepoint(deadline_); } /// Return a \a gpr_timespec representation of the server call's deadline. gpr_timespec raw_deadline() const { return deadline_; } /// Add the (\a meta_key, \a meta_value) pair to the initial metadata /// associated with a server call. These are made available at the client side /// by the \a grpc::ClientContext::GetServerInitialMetadata() method. /// /// \warning This method should only be called before sending initial metadata /// to the client (which can happen explicitly, or implicitly when sending a /// a response message or status to the client). /// /// \param meta_key The metadata key. If \a meta_value is binary data, it must /// end in "-bin". /// \param meta_value The metadata value. If its value is binary, the key name /// must end in "-bin". void AddInitialMetadata(const grpc::string& key, const grpc::string& value); /// Add the (\a meta_key, \a meta_value) pair to the initial metadata /// associated with a server call. These are made available at the client /// side by the \a grpc::ClientContext::GetServerTrailingMetadata() method. /// /// \warning This method should only be called before sending trailing /// metadata to the client (which happens when the call is finished and a /// status is sent to the client). /// /// \param meta_key The metadata key. If \a meta_value is binary data, /// it must end in "-bin". /// \param meta_value The metadata value. If its value is binary, the key name /// must end in "-bin". void AddTrailingMetadata(const grpc::string& key, const grpc::string& value); /// IsCancelled is always safe to call when using sync API. /// When using async API, it is only safe to call IsCancelled after /// the AsyncNotifyWhenDone tag has been delivered. bool IsCancelled() const; /// Cancel the Call from the server. This is a best-effort API and /// depending on when it is called, the RPC may still appear successful to /// the client. /// For example, if TryCancel() is called on a separate thread, it might race /// with the server handler which might return success to the client before /// TryCancel() was even started by the thread. /// /// It is the caller's responsibility to prevent such races and ensure that if /// TryCancel() is called, the serverhandler must return Status::CANCELLED. /// The only exception is that if the serverhandler is already returning an /// error status code, it is ok to not return Status::CANCELLED even if /// TryCancel() was called. /// /// Note that TryCancel() does not change any of the tags that are pending /// on the completion queue. All pending tags will still be delivered /// (though their ok result may reflect the effect of cancellation). void TryCancel() const; /// Return a collection of initial metadata key-value pairs sent from the /// client. Note that keys may happen more than /// once (ie, a \a std::multimap is returned). /// /// It is safe to use this method after initial metadata has been received, /// Calls always begin with the client sending initial metadata, so this is /// safe to access as soon as the call has begun on the server side. /// /// \return A multimap of initial metadata key-value pairs from the server. const std::multimap& client_metadata() const { return *client_metadata_.map(); } /// Return the compression algorithm to be used by the server call. grpc_compression_level compression_level() const { return compression_level_; } /// Set \a algorithm to be the compression algorithm used for the server call. /// /// \param algorithm The compression algorithm used for the server call. void set_compression_level(grpc_compression_level level) { compression_level_set_ = true; compression_level_ = level; } /// Return a bool indicating whether the compression level for this call /// has been set (either implicitly or through a previous call to /// \a set_compression_level. bool compression_level_set() const { return compression_level_set_; } /// Return the compression algorithm the server call will request be used. /// Note that the gRPC runtime may decide to ignore this request, for example, /// due to resource constraints, or if the server is aware the client doesn't /// support the requested algorithm. grpc_compression_algorithm compression_algorithm() const { return compression_algorithm_; } /// Set \a algorithm to be the compression algorithm used for the server call. /// /// \param algorithm The compression algorithm used for the server call. void set_compression_algorithm(grpc_compression_algorithm algorithm); /// Set the serialized load reporting costs in \a cost_data for the call. void SetLoadReportingCosts(const std::vector& cost_data); /// Return the authentication context for this server call. /// /// \see grpc::AuthContext. std::shared_ptr auth_context() const { if (auth_context_.get() == nullptr) { auth_context_ = CreateAuthContext(call_); } return auth_context_; } /// Return the peer uri in a string. /// WARNING: this value is never authenticated or subject to any security /// related code. It must not be used for any authentication related /// functionality. Instead, use auth_context. grpc::string peer() const; /// Get the census context associated with this server call. const struct census_context* census_context() const; /// Async only. Has to be called before the rpc starts. /// Returns the tag in completion queue when the rpc finishes. /// IsCancelled() can then be called to check whether the rpc was cancelled. void AsyncNotifyWhenDone(void* tag) { has_notify_when_done_tag_ = true; async_notify_when_done_tag_ = tag; } /// Should be used for framework-level extensions only. /// Applications never need to call this method. grpc_call* c_call() { return call_; } private: friend class ::grpc::testing::InteropServerContextInspector; friend class ::grpc::testing::ServerContextTestSpouse; friend class ::grpc::ServerInterface; friend class ::grpc::Server; template friend class ::grpc::ServerAsyncReader; template friend class ::grpc::ServerAsyncWriter; template friend class ::grpc::ServerAsyncResponseWriter; template friend class ::grpc::ServerAsyncReaderWriter; template friend class ::grpc::ServerReader; template friend class ::grpc::ServerWriter; template friend class ::grpc::internal::ServerReaderWriterBody; template friend class ::grpc::internal::RpcMethodHandler; template friend class ::grpc::internal::ClientStreamingHandler; template friend class ::grpc::internal::ServerStreamingHandler; template friend class ::grpc::internal::TemplatedBidiStreamingHandler; friend class ::grpc::internal::UnknownMethodHandler; friend class ::grpc::ClientContext; /// Prevent copying. ServerContext(const ServerContext&); ServerContext& operator=(const ServerContext&); class CompletionOp; void BeginCompletionOp(internal::Call* call); /// Return the tag queued by BeginCompletionOp() internal::CompletionQueueTag* GetCompletionOpTag(); ServerContext(gpr_timespec deadline, grpc_metadata_array* arr); void set_call(grpc_call* call) { call_ = call; } uint32_t initial_metadata_flags() const { return 0; } CompletionOp* completion_op_; bool has_notify_when_done_tag_; void* async_notify_when_done_tag_; gpr_timespec deadline_; grpc_call* call_; CompletionQueue* cq_; bool sent_initial_metadata_; mutable std::shared_ptr auth_context_; internal::MetadataMap client_metadata_; std::multimap initial_metadata_; std::multimap trailing_metadata_; bool compression_level_set_; grpc_compression_level compression_level_; grpc_compression_algorithm compression_algorithm_; internal::CallOpSet pending_ops_; bool has_pending_ops_; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/server_interface.h000066400000000000000000000274731334102242000301720ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_SERVER_INTERFACE_H #define GRPCPP_IMPL_CODEGEN_SERVER_INTERFACE_H #include #include #include #include #include #include namespace grpc { class AsyncGenericService; class Channel; class GenericServerContext; class ServerCompletionQueue; class ServerContext; class ServerCredentials; class Service; extern CoreCodegenInterface* g_core_codegen_interface; /// Models a gRPC server. /// /// Servers are configured and started via \a grpc::ServerBuilder. namespace internal { class ServerAsyncStreamingInterface; } // namespace internal class ServerInterface : public internal::CallHook { public: virtual ~ServerInterface() {} /// \a Shutdown does the following things: /// /// 1. Shutdown the server: deactivate all listening ports, mark it in /// "shutdown mode" so that further call Request's or incoming RPC matches /// are no longer allowed. Also return all Request'ed-but-not-yet-active /// calls as failed (!ok). This refers to calls that have been requested /// at the server by the server-side library or application code but that /// have not yet been matched to incoming RPCs from the client. Note that /// this would even include default calls added automatically by the gRPC /// C++ API without the user's input (e.g., "Unimplemented RPC method") /// /// 2. Block until all rpc method handlers invoked automatically by the sync /// API finish. /// /// 3. If all pending calls complete (and all their operations are /// retrieved by Next) before \a deadline expires, this finishes /// gracefully. Otherwise, forcefully cancel all pending calls associated /// with the server after \a deadline expires. In the case of the sync API, /// if the RPC function for a streaming call has already been started and /// takes a week to complete, the RPC function won't be forcefully /// terminated (since that would leave state corrupt and incomplete) and /// the method handler will just keep running (which will prevent the /// server from completing the "join" operation that it needs to do at /// shutdown time). /// /// All completion queue associated with the server (for example, for async /// serving) must be shutdown *after* this method has returned: /// See \a ServerBuilder::AddCompletionQueue for details. /// They must also be drained (by repeated Next) after being shutdown. /// /// \param deadline How long to wait until pending rpcs are forcefully /// terminated. template void Shutdown(const T& deadline) { ShutdownInternal(TimePoint(deadline).raw_time()); } /// Shutdown the server without a deadline and forced cancellation. /// /// All completion queue associated with the server (for example, for async /// serving) must be shutdown *after* this method has returned: /// See \a ServerBuilder::AddCompletionQueue for details. void Shutdown() { ShutdownInternal( g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_MONOTONIC)); } /// Block waiting for all work to complete. /// /// \warning The server must be either shutting down or some other thread must /// call \a Shutdown for this function to ever return. virtual void Wait() = 0; protected: friend class ::grpc::Service; /// Register a service. This call does not take ownership of the service. /// The service must exist for the lifetime of the Server instance. virtual bool RegisterService(const grpc::string* host, Service* service) = 0; /// Register a generic service. This call does not take ownership of the /// service. The service must exist for the lifetime of the Server instance. virtual void RegisterAsyncGenericService(AsyncGenericService* service) = 0; /// Tries to bind \a server to the given \a addr. /// /// It can be invoked multiple times. /// /// \param addr The address to try to bind to the server (eg, localhost:1234, /// 192.168.1.1:31416, [::1]:27182, etc.). /// \params creds The credentials associated with the server. /// /// \return bound port number on sucess, 0 on failure. /// /// \warning It's an error to call this method on an already started server. virtual int AddListeningPort(const grpc::string& addr, ServerCredentials* creds) = 0; /// Start the server. /// /// \param cqs Completion queues for handling asynchronous services. The /// caller is required to keep all completion queues live until the server is /// destroyed. /// \param num_cqs How many completion queues does \a cqs hold. virtual void Start(ServerCompletionQueue** cqs, size_t num_cqs) = 0; virtual void ShutdownInternal(gpr_timespec deadline) = 0; virtual int max_receive_message_size() const = 0; virtual grpc_server* server() = 0; virtual void PerformOpsOnCall(internal::CallOpSetInterface* ops, internal::Call* call) = 0; class BaseAsyncRequest : public internal::CompletionQueueTag { public: BaseAsyncRequest(ServerInterface* server, ServerContext* context, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, void* tag, bool delete_on_finalize); virtual ~BaseAsyncRequest(); bool FinalizeResult(void** tag, bool* status) override; protected: ServerInterface* const server_; ServerContext* const context_; internal::ServerAsyncStreamingInterface* const stream_; CompletionQueue* const call_cq_; void* const tag_; const bool delete_on_finalize_; grpc_call* call_; }; class RegisteredAsyncRequest : public BaseAsyncRequest { public: RegisteredAsyncRequest(ServerInterface* server, ServerContext* context, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, void* tag); // uses BaseAsyncRequest::FinalizeResult protected: void IssueRequest(void* registered_method, grpc_byte_buffer** payload, ServerCompletionQueue* notification_cq); }; class NoPayloadAsyncRequest final : public RegisteredAsyncRequest { public: NoPayloadAsyncRequest(void* registered_method, ServerInterface* server, ServerContext* context, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag) : RegisteredAsyncRequest(server, context, stream, call_cq, tag) { IssueRequest(registered_method, nullptr, notification_cq); } // uses RegisteredAsyncRequest::FinalizeResult }; template class PayloadAsyncRequest final : public RegisteredAsyncRequest { public: PayloadAsyncRequest(void* registered_method, ServerInterface* server, ServerContext* context, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag, Message* request) : RegisteredAsyncRequest(server, context, stream, call_cq, tag), registered_method_(registered_method), server_(server), context_(context), stream_(stream), call_cq_(call_cq), notification_cq_(notification_cq), tag_(tag), request_(request) { IssueRequest(registered_method, payload_.bbuf_ptr(), notification_cq); } ~PayloadAsyncRequest() { payload_.Release(); // We do not own the payload_ } bool FinalizeResult(void** tag, bool* status) override { if (*status) { if (!payload_.Valid() || !SerializationTraits::Deserialize( payload_.bbuf_ptr(), request_) .ok()) { // If deserialization fails, we cancel the call and instantiate // a new instance of ourselves to request another call. We then // return false, which prevents the call from being returned to // the application. g_core_codegen_interface->grpc_call_cancel_with_status( call_, GRPC_STATUS_INTERNAL, "Unable to parse request", nullptr); g_core_codegen_interface->grpc_call_unref(call_); new PayloadAsyncRequest(registered_method_, server_, context_, stream_, call_cq_, notification_cq_, tag_, request_); delete this; return false; } } return RegisteredAsyncRequest::FinalizeResult(tag, status); } private: void* const registered_method_; ServerInterface* const server_; ServerContext* const context_; internal::ServerAsyncStreamingInterface* const stream_; CompletionQueue* const call_cq_; ServerCompletionQueue* const notification_cq_; void* const tag_; Message* const request_; ByteBuffer payload_; }; class GenericAsyncRequest : public BaseAsyncRequest { public: GenericAsyncRequest(ServerInterface* server, GenericServerContext* context, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag, bool delete_on_finalize); bool FinalizeResult(void** tag, bool* status) override; private: grpc_call_details call_details_; }; template void RequestAsyncCall(internal::RpcServiceMethod* method, ServerContext* context, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag, Message* message) { GPR_CODEGEN_ASSERT(method); new PayloadAsyncRequest(method->server_tag(), this, context, stream, call_cq, notification_cq, tag, message); } void RequestAsyncCall(internal::RpcServiceMethod* method, ServerContext* context, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag) { GPR_CODEGEN_ASSERT(method); new NoPayloadAsyncRequest(method->server_tag(), this, context, stream, call_cq, notification_cq, tag); } void RequestAsyncGenericCall(GenericServerContext* context, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag) { new GenericAsyncRequest(this, context, stream, call_cq, notification_cq, tag, true); } }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_SERVER_INTERFACE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/service_type.h000066400000000000000000000146341334102242000273400ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_SERVICE_TYPE_H #define GRPCPP_IMPL_CODEGEN_SERVICE_TYPE_H #include #include #include #include #include #include namespace grpc { class CompletionQueue; class Server; class ServerInterface; class ServerCompletionQueue; class ServerContext; namespace internal { class Call; class ServerAsyncStreamingInterface { public: virtual ~ServerAsyncStreamingInterface() {} /// Request notification of the sending of initial metadata to the client. /// Completion will be notified by \a tag on the associated completion /// queue. This call is optional, but if it is used, it cannot be used /// concurrently with or after the \a Finish method. /// /// \param[in] tag Tag identifying this request. virtual void SendInitialMetadata(void* tag) = 0; private: friend class ::grpc::ServerInterface; virtual void BindCall(Call* call) = 0; }; } // namespace internal /// Desriptor of an RPC service and its various RPC methods class Service { public: Service() : server_(nullptr) {} virtual ~Service() {} bool has_async_methods() const { for (auto it = methods_.begin(); it != methods_.end(); ++it) { if (*it && (*it)->handler() == nullptr) { return true; } } return false; } bool has_synchronous_methods() const { for (auto it = methods_.begin(); it != methods_.end(); ++it) { if (*it && (*it)->handler() != nullptr) { return true; } } return false; } bool has_generic_methods() const { for (auto it = methods_.begin(); it != methods_.end(); ++it) { if (it->get() == nullptr) { return true; } } return false; } protected: template void RequestAsyncUnary(int index, ServerContext* context, Message* request, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag) { server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq, notification_cq, tag, request); } void RequestAsyncClientStreaming( int index, ServerContext* context, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag) { server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq, notification_cq, tag); } template void RequestAsyncServerStreaming( int index, ServerContext* context, Message* request, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag) { server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq, notification_cq, tag, request); } void RequestAsyncBidiStreaming( int index, ServerContext* context, internal::ServerAsyncStreamingInterface* stream, CompletionQueue* call_cq, ServerCompletionQueue* notification_cq, void* tag) { server_->RequestAsyncCall(methods_[index].get(), context, stream, call_cq, notification_cq, tag); } void AddMethod(internal::RpcServiceMethod* method) { methods_.emplace_back(method); } void MarkMethodAsync(int index) { // This does not have to be a hard error, however no one has approached us // with a use case yet. Please file an issue if you believe you have one. GPR_CODEGEN_ASSERT( methods_[index].get() != nullptr && "Cannot mark the method as 'async' because it has already been " "marked as 'generic'."); methods_[index]->SetServerAsyncType( internal::RpcServiceMethod::AsyncType::ASYNC); } void MarkMethodRaw(int index) { // This does not have to be a hard error, however no one has approached us // with a use case yet. Please file an issue if you believe you have one. GPR_CODEGEN_ASSERT(methods_[index].get() != nullptr && "Cannot mark the method as 'raw' because it has already " "been marked as 'generic'."); methods_[index]->SetServerAsyncType( internal::RpcServiceMethod::AsyncType::RAW); } void MarkMethodGeneric(int index) { // This does not have to be a hard error, however no one has approached us // with a use case yet. Please file an issue if you believe you have one. GPR_CODEGEN_ASSERT( methods_[index]->handler() != nullptr && "Cannot mark the method as 'generic' because it has already been " "marked as 'async' or 'raw'."); methods_[index].reset(); } void MarkMethodStreamed(int index, internal::MethodHandler* streamed_method) { // This does not have to be a hard error, however no one has approached us // with a use case yet. Please file an issue if you believe you have one. GPR_CODEGEN_ASSERT(methods_[index] && methods_[index]->handler() && "Cannot mark an async or generic method Streamed"); methods_[index]->SetHandler(streamed_method); // From the server's point of view, streamed unary is a special // case of BIDI_STREAMING that has 1 read and 1 write, in that order, // and split server-side streaming is BIDI_STREAMING with 1 read and // any number of writes, in that order. methods_[index]->SetMethodType(internal::RpcMethod::BIDI_STREAMING); } private: friend class Server; friend class ServerInterface; ServerInterface* server_; std::vector> methods_; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_SERVICE_TYPE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/slice.h000066400000000000000000000122241334102242000257270ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_SLICE_H #define GRPCPP_IMPL_CODEGEN_SLICE_H #include #include #include #include namespace grpc { /// A wrapper around \a grpc_slice. /// /// A slice represents a contiguous reference counted array of bytes. /// It is cheap to take references to a slice, and it is cheap to create a /// slice pointing to a subset of another slice. class Slice final { public: /// Construct an empty slice. Slice() : slice_(g_core_codegen_interface->grpc_empty_slice()) {} /// Destructor - drops one reference. ~Slice() { g_core_codegen_interface->grpc_slice_unref(slice_); } enum AddRef { ADD_REF }; /// Construct a slice from \a slice, adding a reference. Slice(grpc_slice slice, AddRef) : slice_(g_core_codegen_interface->grpc_slice_ref(slice)) {} enum StealRef { STEAL_REF }; /// Construct a slice from \a slice, stealing a reference. Slice(grpc_slice slice, StealRef) : slice_(slice) {} /// Allocate a slice of specified size Slice(size_t len) : slice_(g_core_codegen_interface->grpc_slice_malloc(len)) {} /// Construct a slice from a copied buffer Slice(const void* buf, size_t len) : slice_(g_core_codegen_interface->grpc_slice_from_copied_buffer( reinterpret_cast(buf), len)) {} /// Construct a slice from a copied string Slice(const grpc::string& str) : slice_(g_core_codegen_interface->grpc_slice_from_copied_buffer( str.c_str(), str.length())) {} enum StaticSlice { STATIC_SLICE }; /// Construct a slice from a static buffer Slice(const void* buf, size_t len, StaticSlice) : slice_(g_core_codegen_interface->grpc_slice_from_static_buffer( reinterpret_cast(buf), len)) {} /// Copy constructor, adds a reference. Slice(const Slice& other) : slice_(g_core_codegen_interface->grpc_slice_ref(other.slice_)) {} /// Assignment, reference count is unchanged. Slice& operator=(Slice other) { std::swap(slice_, other.slice_); return *this; } /// Create a slice pointing at some data. Calls malloc to allocate a refcount /// for the object, and arranges that destroy will be called with the /// user data pointer passed in at destruction. Can be the same as buf or /// different (e.g., if data is part of a larger structure that must be /// destroyed when the data is no longer needed) Slice(void* buf, size_t len, void (*destroy)(void*), void* user_data) : slice_(g_core_codegen_interface->grpc_slice_new_with_user_data( buf, len, destroy, user_data)) {} /// Specialization of above for common case where buf == user_data Slice(void* buf, size_t len, void (*destroy)(void*)) : Slice(buf, len, destroy, buf) {} /// Similar to the above but has a destroy that also takes slice length Slice(void* buf, size_t len, void (*destroy)(void*, size_t)) : slice_(g_core_codegen_interface->grpc_slice_new_with_len(buf, len, destroy)) {} /// Byte size. size_t size() const { return GRPC_SLICE_LENGTH(slice_); } /// Raw pointer to the beginning (first element) of the slice. const uint8_t* begin() const { return GRPC_SLICE_START_PTR(slice_); } /// Raw pointer to the end (one byte \em past the last element) of the slice. const uint8_t* end() const { return GRPC_SLICE_END_PTR(slice_); } /// Raw C slice. Caller needs to call grpc_slice_unref when done. grpc_slice c_slice() const { return g_core_codegen_interface->grpc_slice_ref(slice_); } private: friend class ByteBuffer; grpc_slice slice_; }; inline grpc::string_ref StringRefFromSlice(const grpc_slice* slice) { return grpc::string_ref( reinterpret_cast(GRPC_SLICE_START_PTR(*slice)), GRPC_SLICE_LENGTH(*slice)); } inline grpc::string StringFromCopiedSlice(grpc_slice slice) { return grpc::string(reinterpret_cast(GRPC_SLICE_START_PTR(slice)), GRPC_SLICE_LENGTH(slice)); } inline grpc_slice SliceReferencingString(const grpc::string& str) { return g_core_codegen_interface->grpc_slice_from_static_buffer(str.data(), str.length()); } inline grpc_slice SliceFromCopiedString(const grpc::string& str) { return g_core_codegen_interface->grpc_slice_from_copied_buffer(str.data(), str.length()); } } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_SLICE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/status.h000066400000000000000000000125231334102242000261550ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_STATUS_H #define GRPCPP_IMPL_CODEGEN_STATUS_H #include #include #include namespace grpc { /// Did it work? If it didn't, why? /// /// See \a grpc::StatusCode for details on the available code and their meaning. class Status { public: /// Construct an OK instance. Status() : code_(StatusCode::OK) { // Static assertions to make sure that the C++ API value correctly // maps to the core surface API value static_assert(StatusCode::OK == static_cast(GRPC_STATUS_OK), "Mismatched status code"); static_assert( StatusCode::CANCELLED == static_cast(GRPC_STATUS_CANCELLED), "Mismatched status code"); static_assert( StatusCode::UNKNOWN == static_cast(GRPC_STATUS_UNKNOWN), "Mismatched status code"); static_assert(StatusCode::INVALID_ARGUMENT == static_cast(GRPC_STATUS_INVALID_ARGUMENT), "Mismatched status code"); static_assert(StatusCode::DEADLINE_EXCEEDED == static_cast(GRPC_STATUS_DEADLINE_EXCEEDED), "Mismatched status code"); static_assert( StatusCode::NOT_FOUND == static_cast(GRPC_STATUS_NOT_FOUND), "Mismatched status code"); static_assert(StatusCode::ALREADY_EXISTS == static_cast(GRPC_STATUS_ALREADY_EXISTS), "Mismatched status code"); static_assert(StatusCode::PERMISSION_DENIED == static_cast(GRPC_STATUS_PERMISSION_DENIED), "Mismatched status code"); static_assert(StatusCode::UNAUTHENTICATED == static_cast(GRPC_STATUS_UNAUTHENTICATED), "Mismatched status code"); static_assert(StatusCode::RESOURCE_EXHAUSTED == static_cast(GRPC_STATUS_RESOURCE_EXHAUSTED), "Mismatched status code"); static_assert(StatusCode::FAILED_PRECONDITION == static_cast(GRPC_STATUS_FAILED_PRECONDITION), "Mismatched status code"); static_assert( StatusCode::ABORTED == static_cast(GRPC_STATUS_ABORTED), "Mismatched status code"); static_assert(StatusCode::OUT_OF_RANGE == static_cast(GRPC_STATUS_OUT_OF_RANGE), "Mismatched status code"); static_assert(StatusCode::UNIMPLEMENTED == static_cast(GRPC_STATUS_UNIMPLEMENTED), "Mismatched status code"); static_assert( StatusCode::INTERNAL == static_cast(GRPC_STATUS_INTERNAL), "Mismatched status code"); static_assert(StatusCode::UNAVAILABLE == static_cast(GRPC_STATUS_UNAVAILABLE), "Mismatched status code"); static_assert( StatusCode::DATA_LOSS == static_cast(GRPC_STATUS_DATA_LOSS), "Mismatched status code"); } /// Construct an instance with associated \a code and \a error_message. /// It is an error to construct an OK status with non-empty \a error_message. Status(StatusCode code, const grpc::string& error_message) : code_(code), error_message_(error_message) {} /// Construct an instance with \a code, \a error_message and /// \a error_details. It is an error to construct an OK status with non-empty /// \a error_message and/or \a error_details. Status(StatusCode code, const grpc::string& error_message, const grpc::string& error_details) : code_(code), error_message_(error_message), binary_error_details_(error_details) {} // Pre-defined special status objects. /// An OK pre-defined instance. static const Status& OK; /// A CANCELLED pre-defined instance. static const Status& CANCELLED; /// Return the instance's error code. StatusCode error_code() const { return code_; } /// Return the instance's error message. grpc::string error_message() const { return error_message_; } /// Return the (binary) error details. // Usually it contains a serialized google.rpc.Status proto. grpc::string error_details() const { return binary_error_details_; } /// Is the status OK? bool ok() const { return code_ == StatusCode::OK; } // Ignores any errors. This method does nothing except potentially suppress // complaints from any tools that are checking that errors are not dropped on // the floor. void IgnoreError() const {} private: StatusCode code_; grpc::string error_message_; grpc::string binary_error_details_; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_STATUS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/status_code_enum.h000066400000000000000000000134621334102242000301760ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_STATUS_CODE_ENUM_H #define GRPCPP_IMPL_CODEGEN_STATUS_CODE_ENUM_H namespace grpc { enum StatusCode { /// Not an error; returned on success. OK = 0, /// The operation was cancelled (typically by the caller). CANCELLED = 1, /// Unknown error. An example of where this error may be returned is if a /// Status value received from another address space belongs to an error-space /// that is not known in this address space. Also errors raised by APIs that /// do not return enough error information may be converted to this error. UNKNOWN = 2, /// Client specified an invalid argument. Note that this differs from /// FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are /// problematic regardless of the state of the system (e.g., a malformed file /// name). INVALID_ARGUMENT = 3, /// Deadline expired before operation could complete. For operations that /// change the state of the system, this error may be returned even if the /// operation has completed successfully. For example, a successful response /// from a server could have been delayed long enough for the deadline to /// expire. DEADLINE_EXCEEDED = 4, /// Some requested entity (e.g., file or directory) was not found. NOT_FOUND = 5, /// Some entity that we attempted to create (e.g., file or directory) already /// exists. ALREADY_EXISTS = 6, /// The caller does not have permission to execute the specified operation. /// PERMISSION_DENIED must not be used for rejections caused by exhausting /// some resource (use RESOURCE_EXHAUSTED instead for those errors). /// PERMISSION_DENIED must not be used if the caller can not be identified /// (use UNAUTHENTICATED instead for those errors). PERMISSION_DENIED = 7, /// The request does not have valid authentication credentials for the /// operation. UNAUTHENTICATED = 16, /// Some resource has been exhausted, perhaps a per-user quota, or perhaps the /// entire file system is out of space. RESOURCE_EXHAUSTED = 8, /// Operation was rejected because the system is not in a state required for /// the operation's execution. For example, directory to be deleted may be /// non-empty, an rmdir operation is applied to a non-directory, etc. /// /// A litmus test that may help a service implementor in deciding /// between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE: /// (a) Use UNAVAILABLE if the client can retry just the failing call. /// (b) Use ABORTED if the client should retry at a higher-level /// (e.g., restarting a read-modify-write sequence). /// (c) Use FAILED_PRECONDITION if the client should not retry until /// the system state has been explicitly fixed. E.g., if an "rmdir" /// fails because the directory is non-empty, FAILED_PRECONDITION /// should be returned since the client should not retry unless /// they have first fixed up the directory by deleting files from it. /// (d) Use FAILED_PRECONDITION if the client performs conditional /// REST Get/Update/Delete on a resource and the resource on the /// server does not match the condition. E.g., conflicting /// read-modify-write on the same resource. FAILED_PRECONDITION = 9, /// The operation was aborted, typically due to a concurrency issue like /// sequencer check failures, transaction aborts, etc. /// /// See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, /// and UNAVAILABLE. ABORTED = 10, /// Operation was attempted past the valid range. E.g., seeking or reading /// past end of file. /// /// Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed /// if the system state changes. For example, a 32-bit file system will /// generate INVALID_ARGUMENT if asked to read at an offset that is not in the /// range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from /// an offset past the current file size. /// /// There is a fair bit of overlap between FAILED_PRECONDITION and /// OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error) /// when it applies so that callers who are iterating through a space can /// easily look for an OUT_OF_RANGE error to detect when they are done. OUT_OF_RANGE = 11, /// Operation is not implemented or not supported/enabled in this service. UNIMPLEMENTED = 12, /// Internal errors. Means some invariants expected by underlying System has /// been broken. If you see one of these errors, Something is very broken. INTERNAL = 13, /// The service is currently unavailable. This is a most likely a transient /// condition and may be corrected by retrying with a backoff. /// /// \warning Although data MIGHT not have been transmitted when this /// status occurs, there is NOT A GUARANTEE that the server has not seen /// anything. So in general it is unsafe to retry on this status code /// if the call is non-idempotent. /// /// See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, /// and UNAVAILABLE. UNAVAILABLE = 14, /// Unrecoverable data loss or corruption. DATA_LOSS = 15, /// Force users to include a default branch: DO_NOT_USE = -1 }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_STATUS_CODE_ENUM_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/string_ref.h000066400000000000000000000107001334102242000267670ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_STRING_REF_H #define GRPCPP_IMPL_CODEGEN_STRING_REF_H #include #include #include #include #include #include namespace grpc { /// This class is a non owning reference to a string. /// /// It should be a strict subset of the upcoming std::string_ref. /// /// \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html /// /// The constexpr is dropped or replaced with const for legacy compiler /// compatibility. class string_ref { public: /// types typedef const char* const_iterator; typedef std::reverse_iterator const_reverse_iterator; /// constants const static size_t npos; /// construct/copy. string_ref() : data_(nullptr), length_(0) {} string_ref(const string_ref& other) : data_(other.data_), length_(other.length_) {} string_ref& operator=(const string_ref& rhs) { data_ = rhs.data_; length_ = rhs.length_; return *this; } string_ref(const char* s) : data_(s), length_(strlen(s)) {} string_ref(const char* s, size_t l) : data_(s), length_(l) {} string_ref(const grpc::string& s) : data_(s.data()), length_(s.length()) {} /// iterators const_iterator begin() const { return data_; } const_iterator end() const { return data_ + length_; } const_iterator cbegin() const { return data_; } const_iterator cend() const { return data_ + length_; } const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); } const_reverse_iterator crend() const { return const_reverse_iterator(begin()); } /// capacity size_t size() const { return length_; } size_t length() const { return length_; } size_t max_size() const { return length_; } bool empty() const { return length_ == 0; } /// element access const char* data() const { return data_; } /// string operations int compare(string_ref x) const { size_t min_size = length_ < x.length_ ? length_ : x.length_; int r = memcmp(data_, x.data_, 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; } bool starts_with(string_ref x) const { return length_ >= x.length_ && (memcmp(data_, x.data_, x.length_) == 0); } bool ends_with(string_ref x) const { return length_ >= x.length_ && (memcmp(data_ + (length_ - x.length_), x.data_, x.length_) == 0); } size_t find(string_ref s) const { auto it = std::search(cbegin(), cend(), s.cbegin(), s.cend()); return it == cend() ? npos : std::distance(cbegin(), it); } size_t find(char c) const { auto it = std::find(cbegin(), cend(), c); return it == cend() ? npos : std::distance(cbegin(), it); } string_ref substr(size_t pos, size_t n = npos) const { if (pos > length_) pos = length_; if (n > (length_ - pos)) n = length_ - pos; return string_ref(data_ + pos, n); } private: const char* data_; size_t length_; }; /// Comparison operators inline bool operator==(string_ref x, string_ref y) { return x.compare(y) == 0; } inline bool operator!=(string_ref x, string_ref y) { return x.compare(y) != 0; } inline bool operator<(string_ref x, string_ref y) { return x.compare(y) < 0; } inline bool operator<=(string_ref x, string_ref y) { return x.compare(y) <= 0; } inline bool operator>(string_ref x, string_ref y) { return x.compare(y) > 0; } inline bool operator>=(string_ref x, string_ref y) { return x.compare(y) >= 0; } inline std::ostream& operator<<(std::ostream& out, const string_ref& string) { return out << grpc::string(string.begin(), string.end()); } } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_STRING_REF_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/stub_options.h000066400000000000000000000015111334102242000273550ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_STUB_OPTIONS_H #define GRPCPP_IMPL_CODEGEN_STUB_OPTIONS_H namespace grpc { /// Useful interface for generated stubs class StubOptions {}; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_STUB_OPTIONS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/sync_stream.h000066400000000000000000001055401334102242000271630ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_SYNC_STREAM_H #define GRPCPP_IMPL_CODEGEN_SYNC_STREAM_H #include #include #include #include #include #include #include #include namespace grpc { namespace internal { /// Common interface for all synchronous client side streaming. class ClientStreamingInterface { public: virtual ~ClientStreamingInterface() {} /// Block waiting until the stream finishes and a final status of the call is /// available. /// /// It is appropriate to call this method when both: /// * the calling code (client-side) has no more message to send /// (this can be declared implicitly by calling this method, or /// explicitly through an earlier call to WritesDone method of the /// class in use, e.g. \a ClientWriterInterface::WritesDone or /// \a ClientReaderWriterInterface::WritesDone). /// * there are no more messages to be received from the server (which can /// be known implicitly, or explicitly from an earlier call to \a /// ReaderInterface::Read that returned "false"). /// /// This function will return either: /// - when all incoming messages have been read and the server has /// returned status. /// - when the server has returned a non-OK status. /// - OR when the call failed for some reason and the library generated a /// status. /// /// Return values: /// - \a Status contains the status code, message and details for the call /// - the \a ClientContext associated with this call is updated with /// possible trailing metadata sent from the server. virtual Status Finish() = 0; }; /// Common interface for all synchronous server side streaming. class ServerStreamingInterface { public: virtual ~ServerStreamingInterface() {} /// Block to send initial metadata to client. /// This call is optional, but if it is used, it cannot be used concurrently /// with or after the \a Finish method. /// /// The initial metadata that will be sent to the client will be /// taken from the \a ServerContext associated with the call. virtual void SendInitialMetadata() = 0; }; /// An interface that yields a sequence of messages of type \a R. template class ReaderInterface { public: virtual ~ReaderInterface() {} /// Get an upper bound on the next message size available for reading on this /// stream. virtual bool NextMessageSize(uint32_t* sz) = 0; /// Block to read a message and parse to \a msg. Returns \a true on success. /// This is thread-safe with respect to \a Write or \WritesDone methods on /// the same stream. It should not be called concurrently with another \a /// Read on the same stream as the order of delivery will not be defined. /// /// \param[out] msg The read message. /// /// \return \a false when there will be no more incoming messages, either /// because the other side has called \a WritesDone() or the stream has failed /// (or been cancelled). virtual bool Read(R* msg) = 0; }; /// An interface that can be fed a sequence of messages of type \a W. template class WriterInterface { public: virtual ~WriterInterface() {} /// Block to write \a msg to the stream with WriteOptions \a options. /// This is thread-safe with respect to \a ReaderInterface::Read /// /// \param msg The message to be written to the stream. /// \param options The WriteOptions affecting the write operation. /// /// \return \a true on success, \a false when the stream has been closed. virtual bool Write(const W& msg, WriteOptions options) = 0; /// Block to write \a msg to the stream with default write options. /// This is thread-safe with respect to \a ReaderInterface::Read /// /// \param msg The message to be written to the stream. /// /// \return \a true on success, \a false when the stream has been closed. inline bool Write(const W& msg) { return Write(msg, WriteOptions()); } /// Write \a msg and coalesce it with the writing of trailing metadata, using /// WriteOptions \a options. /// /// For client, WriteLast is equivalent of performing Write and WritesDone in /// a single step. \a msg and trailing metadata are coalesced and sent on wire /// by calling this function. For server, WriteLast buffers the \a msg. /// The writing of \a msg is held until the service handler returns, /// where \a msg and trailing metadata are coalesced and sent on wire. /// Note that WriteLast can only buffer \a msg up to the flow control window /// size. If \a msg size is larger than the window size, it will be sent on /// wire without buffering. /// /// \param[in] msg The message to be written to the stream. /// \param[in] options The WriteOptions to be used to write this message. void WriteLast(const W& msg, WriteOptions options) { Write(msg, options.set_last_message()); } }; } // namespace internal /// Client-side interface for streaming reads of message of type \a R. template class ClientReaderInterface : public internal::ClientStreamingInterface, public internal::ReaderInterface { public: /// Block to wait for initial metadata from server. The received metadata /// can only be accessed after this call returns. Should only be called before /// the first read. Calling this method is optional, and if it is not called /// the metadata will be available in ClientContext after the first read. virtual void WaitForInitialMetadata() = 0; }; namespace internal { template class ClientReaderFactory { public: template static ClientReader* Create(ChannelInterface* channel, const ::grpc::internal::RpcMethod& method, ClientContext* context, const W& request) { return new ClientReader(channel, method, context, request); } }; } // namespace internal /// Synchronous (blocking) client-side API for doing server-streaming RPCs, /// where the stream of messages coming from the server has messages /// of type \a R. template class ClientReader final : public ClientReaderInterface { public: /// See the \a ClientStreamingInterface.WaitForInitialMetadata method for /// semantics. /// // Side effect: /// Once complete, the initial metadata read from /// the server will be accessable through the \a ClientContext used to /// construct this object. void WaitForInitialMetadata() override { GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> ops; ops.RecvInitialMetadata(context_); call_.PerformOps(&ops); cq_.Pluck(&ops); /// status ignored } bool NextMessageSize(uint32_t* sz) override { *sz = call_.max_receive_message_size(); return true; } /// See the \a ReaderInterface.Read method for semantics. /// Side effect: /// This also receives initial metadata from the server, if not /// already received (if initial metadata is received, it can be then /// accessed through the \a ClientContext associated with this call). bool Read(R* msg) override { ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, ::grpc::internal::CallOpRecvMessage> ops; if (!context_->initial_metadata_received_) { ops.RecvInitialMetadata(context_); } ops.RecvMessage(msg); call_.PerformOps(&ops); return cq_.Pluck(&ops) && ops.got_message; } /// See the \a ClientStreamingInterface.Finish method for semantics. /// /// Side effect: /// The \a ClientContext associated with this call is updated with /// possible metadata received from the server. Status Finish() override { ::grpc::internal::CallOpSet<::grpc::internal::CallOpClientRecvStatus> ops; Status status; ops.ClientRecvStatus(context_, &status); call_.PerformOps(&ops); GPR_CODEGEN_ASSERT(cq_.Pluck(&ops)); return status; } private: friend class internal::ClientReaderFactory; ClientContext* context_; CompletionQueue cq_; ::grpc::internal::Call call_; /// Block to create a stream and write the initial metadata and \a request /// out. Note that \a context will be used to fill in custom initial /// metadata used to send to the server when starting the call. template ClientReader(::grpc::ChannelInterface* channel, const ::grpc::internal::RpcMethod& method, ClientContext* context, const W& request) : context_(context), cq_(grpc_completion_queue_attributes{ GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq call_(channel->CreateCall(method, context, &cq_)) { ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpSendMessage, ::grpc::internal::CallOpClientSendClose> ops; ops.SendInitialMetadata(context->send_initial_metadata_, context->initial_metadata_flags()); // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(ops.SendMessage(request).ok()); ops.ClientSendClose(); call_.PerformOps(&ops); cq_.Pluck(&ops); } }; /// Client-side interface for streaming writes of message type \a W. template class ClientWriterInterface : public internal::ClientStreamingInterface, public internal::WriterInterface { public: /// Half close writing from the client. (signal that the stream of messages /// coming from the client is complete). /// Blocks until currently-pending writes are completed. /// Thread safe with respect to \a ReaderInterface::Read operations only /// /// \return Whether the writes were successful. virtual bool WritesDone() = 0; }; namespace internal { template class ClientWriterFactory { public: template static ClientWriter* Create(::grpc::ChannelInterface* channel, const ::grpc::internal::RpcMethod& method, ClientContext* context, R* response) { return new ClientWriter(channel, method, context, response); } }; } // namespace internal /// Synchronous (blocking) client-side API for doing client-streaming RPCs, /// where the outgoing message stream coming from the client has messages of /// type \a W. template class ClientWriter : public ClientWriterInterface { public: /// See the \a ClientStreamingInterface.WaitForInitialMetadata method for /// semantics. /// // Side effect: /// Once complete, the initial metadata read from the server will be /// accessable through the \a ClientContext used to construct this object. void WaitForInitialMetadata() { GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> ops; ops.RecvInitialMetadata(context_); call_.PerformOps(&ops); cq_.Pluck(&ops); // status ignored } /// See the WriterInterface.Write(const W& msg, WriteOptions options) method /// for semantics. /// /// Side effect: /// Also sends initial metadata if not already sent (using the /// \a ClientContext associated with this call). using ::grpc::internal::WriterInterface::Write; bool Write(const W& msg, WriteOptions options) override { ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpSendMessage, ::grpc::internal::CallOpClientSendClose> ops; if (options.is_last_message()) { options.set_buffer_hint(); ops.ClientSendClose(); } if (context_->initial_metadata_corked_) { ops.SendInitialMetadata(context_->send_initial_metadata_, context_->initial_metadata_flags()); context_->set_initial_metadata_corked(false); } if (!ops.SendMessage(msg, options).ok()) { return false; } call_.PerformOps(&ops); return cq_.Pluck(&ops); } bool WritesDone() override { ::grpc::internal::CallOpSet<::grpc::internal::CallOpClientSendClose> ops; ops.ClientSendClose(); call_.PerformOps(&ops); return cq_.Pluck(&ops); } /// See the ClientStreamingInterface.Finish method for semantics. /// Side effects: /// - Also receives initial metadata if not already received. /// - Attempts to fill in the \a response parameter passed /// to the constructor of this instance with the response /// message from the server. Status Finish() override { Status status; if (!context_->initial_metadata_received_) { finish_ops_.RecvInitialMetadata(context_); } finish_ops_.ClientRecvStatus(context_, &status); call_.PerformOps(&finish_ops_); GPR_CODEGEN_ASSERT(cq_.Pluck(&finish_ops_)); return status; } private: friend class internal::ClientWriterFactory; /// Block to create a stream (i.e. send request headers and other initial /// metadata to the server). Note that \a context will be used to fill /// in custom initial metadata. \a response will be filled in with the /// single expected response message from the server upon a successful /// call to the \a Finish method of this instance. template ClientWriter(ChannelInterface* channel, const ::grpc::internal::RpcMethod& method, ClientContext* context, R* response) : context_(context), cq_(grpc_completion_queue_attributes{ GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq call_(channel->CreateCall(method, context, &cq_)) { finish_ops_.RecvMessage(response); finish_ops_.AllowNoMessage(); if (!context_->initial_metadata_corked_) { ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> ops; ops.SendInitialMetadata(context->send_initial_metadata_, context->initial_metadata_flags()); call_.PerformOps(&ops); cq_.Pluck(&ops); } } ClientContext* context_; ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, ::grpc::internal::CallOpGenericRecvMessage, ::grpc::internal::CallOpClientRecvStatus> finish_ops_; CompletionQueue cq_; ::grpc::internal::Call call_; }; /// Client-side interface for bi-directional streaming with /// client-to-server stream messages of type \a W and /// server-to-client stream messages of type \a R. template class ClientReaderWriterInterface : public internal::ClientStreamingInterface, public internal::WriterInterface, public internal::ReaderInterface { public: /// Block to wait for initial metadata from server. The received metadata /// can only be accessed after this call returns. Should only be called before /// the first read. Calling this method is optional, and if it is not called /// the metadata will be available in ClientContext after the first read. virtual void WaitForInitialMetadata() = 0; /// Half close writing from the client. (signal that the stream of messages /// coming from the clinet is complete). /// Blocks until currently-pending writes are completed. /// Thread-safe with respect to \a ReaderInterface::Read /// /// \return Whether the writes were successful. virtual bool WritesDone() = 0; }; namespace internal { template class ClientReaderWriterFactory { public: static ClientReaderWriter* Create( ::grpc::ChannelInterface* channel, const ::grpc::internal::RpcMethod& method, ClientContext* context) { return new ClientReaderWriter(channel, method, context); } }; } // namespace internal /// Synchronous (blocking) client-side API for bi-directional streaming RPCs, /// where the outgoing message stream coming from the client has messages of /// type \a W, and the incoming messages stream coming from the server has /// messages of type \a R. template class ClientReaderWriter final : public ClientReaderWriterInterface { public: /// Block waiting to read initial metadata from the server. /// This call is optional, but if it is used, it cannot be used concurrently /// with or after the \a Finish method. /// /// Once complete, the initial metadata read from the server will be /// accessable through the \a ClientContext used to construct this object. void WaitForInitialMetadata() override { GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata> ops; ops.RecvInitialMetadata(context_); call_.PerformOps(&ops); cq_.Pluck(&ops); // status ignored } bool NextMessageSize(uint32_t* sz) override { *sz = call_.max_receive_message_size(); return true; } /// See the \a ReaderInterface.Read method for semantics. /// Side effect: /// Also receives initial metadata if not already received (updates the \a /// ClientContext associated with this call in that case). bool Read(R* msg) override { ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, ::grpc::internal::CallOpRecvMessage> ops; if (!context_->initial_metadata_received_) { ops.RecvInitialMetadata(context_); } ops.RecvMessage(msg); call_.PerformOps(&ops); return cq_.Pluck(&ops) && ops.got_message; } /// See the \a WriterInterface.Write method for semantics. /// /// Side effect: /// Also sends initial metadata if not already sent (using the /// \a ClientContext associated with this call to fill in values). using ::grpc::internal::WriterInterface::Write; bool Write(const W& msg, WriteOptions options) override { ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata, ::grpc::internal::CallOpSendMessage, ::grpc::internal::CallOpClientSendClose> ops; if (options.is_last_message()) { options.set_buffer_hint(); ops.ClientSendClose(); } if (context_->initial_metadata_corked_) { ops.SendInitialMetadata(context_->send_initial_metadata_, context_->initial_metadata_flags()); context_->set_initial_metadata_corked(false); } if (!ops.SendMessage(msg, options).ok()) { return false; } call_.PerformOps(&ops); return cq_.Pluck(&ops); } bool WritesDone() override { ::grpc::internal::CallOpSet<::grpc::internal::CallOpClientSendClose> ops; ops.ClientSendClose(); call_.PerformOps(&ops); return cq_.Pluck(&ops); } /// See the ClientStreamingInterface.Finish method for semantics. /// /// Side effect: /// - the \a ClientContext associated with this call is updated with /// possible trailing metadata sent from the server. Status Finish() override { ::grpc::internal::CallOpSet<::grpc::internal::CallOpRecvInitialMetadata, ::grpc::internal::CallOpClientRecvStatus> ops; if (!context_->initial_metadata_received_) { ops.RecvInitialMetadata(context_); } Status status; ops.ClientRecvStatus(context_, &status); call_.PerformOps(&ops); GPR_CODEGEN_ASSERT(cq_.Pluck(&ops)); return status; } private: friend class internal::ClientReaderWriterFactory; ClientContext* context_; CompletionQueue cq_; ::grpc::internal::Call call_; /// Block to create a stream and write the initial metadata and \a request /// out. Note that \a context will be used to fill in custom initial metadata /// used to send to the server when starting the call. ClientReaderWriter(::grpc::ChannelInterface* channel, const ::grpc::internal::RpcMethod& method, ClientContext* context) : context_(context), cq_(grpc_completion_queue_attributes{ GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING}), // Pluckable cq call_(channel->CreateCall(method, context, &cq_)) { if (!context_->initial_metadata_corked_) { ::grpc::internal::CallOpSet<::grpc::internal::CallOpSendInitialMetadata> ops; ops.SendInitialMetadata(context->send_initial_metadata_, context->initial_metadata_flags()); call_.PerformOps(&ops); cq_.Pluck(&ops); } } }; /// Server-side interface for streaming reads of message of type \a R. template class ServerReaderInterface : public internal::ServerStreamingInterface, public internal::ReaderInterface {}; /// Synchronous (blocking) server-side API for doing client-streaming RPCs, /// where the incoming message stream coming from the client has messages of /// type \a R. template class ServerReader final : public ServerReaderInterface { public: /// See the \a ServerStreamingInterface.SendInitialMetadata method /// for semantics. Note that initial metadata will be affected by the /// \a ServerContext associated with this call. void SendInitialMetadata() override { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); internal::CallOpSet ops; ops.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { ops.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; call_->PerformOps(&ops); call_->cq()->Pluck(&ops); } bool NextMessageSize(uint32_t* sz) override { *sz = call_->max_receive_message_size(); return true; } bool Read(R* msg) override { internal::CallOpSet> ops; ops.RecvMessage(msg); call_->PerformOps(&ops); return call_->cq()->Pluck(&ops) && ops.got_message; } private: internal::Call* const call_; ServerContext* const ctx_; template friend class internal::ClientStreamingHandler; ServerReader(internal::Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {} }; /// Server-side interface for streaming writes of message of type \a W. template class ServerWriterInterface : public internal::ServerStreamingInterface, public internal::WriterInterface {}; /// Synchronous (blocking) server-side API for doing for doing a /// server-streaming RPCs, where the outgoing message stream coming from the /// server has messages of type \a W. template class ServerWriter final : public ServerWriterInterface { public: /// See the \a ServerStreamingInterface.SendInitialMetadata method /// for semantics. /// Note that initial metadata will be affected by the /// \a ServerContext associated with this call. void SendInitialMetadata() override { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); internal::CallOpSet ops; ops.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { ops.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; call_->PerformOps(&ops); call_->cq()->Pluck(&ops); } /// See the \a WriterInterface.Write method for semantics. /// /// Side effect: /// Also sends initial metadata if not already sent (using the /// \a ClientContext associated with this call to fill in values). using internal::WriterInterface::Write; bool Write(const W& msg, WriteOptions options) override { if (options.is_last_message()) { options.set_buffer_hint(); } if (!ctx_->pending_ops_.SendMessage(msg, options).ok()) { return false; } if (!ctx_->sent_initial_metadata_) { ctx_->pending_ops_.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { ctx_->pending_ops_.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; } call_->PerformOps(&ctx_->pending_ops_); // if this is the last message we defer the pluck until AFTER we start // the trailing md op. This prevents hangs. See // https://github.com/grpc/grpc/issues/11546 if (options.is_last_message()) { ctx_->has_pending_ops_ = true; return true; } ctx_->has_pending_ops_ = false; return call_->cq()->Pluck(&ctx_->pending_ops_); } private: internal::Call* const call_; ServerContext* const ctx_; template friend class internal::ServerStreamingHandler; ServerWriter(internal::Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {} }; /// Server-side interface for bi-directional streaming. template class ServerReaderWriterInterface : public internal::ServerStreamingInterface, public internal::WriterInterface, public internal::ReaderInterface {}; /// Actual implementation of bi-directional streaming namespace internal { template class ServerReaderWriterBody final { public: ServerReaderWriterBody(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {} void SendInitialMetadata() { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); CallOpSet ops; ops.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { ops.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; call_->PerformOps(&ops); call_->cq()->Pluck(&ops); } bool NextMessageSize(uint32_t* sz) { *sz = call_->max_receive_message_size(); return true; } bool Read(R* msg) { CallOpSet> ops; ops.RecvMessage(msg); call_->PerformOps(&ops); return call_->cq()->Pluck(&ops) && ops.got_message; } bool Write(const W& msg, WriteOptions options) { if (options.is_last_message()) { options.set_buffer_hint(); } if (!ctx_->pending_ops_.SendMessage(msg, options).ok()) { return false; } if (!ctx_->sent_initial_metadata_) { ctx_->pending_ops_.SendInitialMetadata(ctx_->initial_metadata_, ctx_->initial_metadata_flags()); if (ctx_->compression_level_set()) { ctx_->pending_ops_.set_compression_level(ctx_->compression_level()); } ctx_->sent_initial_metadata_ = true; } call_->PerformOps(&ctx_->pending_ops_); // if this is the last message we defer the pluck until AFTER we start // the trailing md op. This prevents hangs. See // https://github.com/grpc/grpc/issues/11546 if (options.is_last_message()) { ctx_->has_pending_ops_ = true; return true; } ctx_->has_pending_ops_ = false; return call_->cq()->Pluck(&ctx_->pending_ops_); } private: Call* const call_; ServerContext* const ctx_; }; } // namespace internal /// Synchronous (blocking) server-side API for a bidirectional /// streaming call, where the incoming message stream coming from the client has /// messages of type \a R, and the outgoing message streaming coming from /// the server has messages of type \a W. template class ServerReaderWriter final : public ServerReaderWriterInterface { public: /// See the \a ServerStreamingInterface.SendInitialMetadata method /// for semantics. Note that initial metadata will be affected by the /// \a ServerContext associated with this call. void SendInitialMetadata() override { body_.SendInitialMetadata(); } bool NextMessageSize(uint32_t* sz) override { return body_.NextMessageSize(sz); } bool Read(R* msg) override { return body_.Read(msg); } /// See the \a WriterInterface.Write(const W& msg, WriteOptions options) /// method for semantics. /// Side effect: /// Also sends initial metadata if not already sent (using the \a /// ServerContext associated with this call). using internal::WriterInterface::Write; bool Write(const W& msg, WriteOptions options) override { return body_.Write(msg, options); } private: internal::ServerReaderWriterBody body_; friend class internal::TemplatedBidiStreamingHandler, false>; ServerReaderWriter(internal::Call* call, ServerContext* ctx) : body_(call, ctx) {} }; /// A class to represent a flow-controlled unary call. This is something /// of a hybrid between conventional unary and streaming. This is invoked /// through a unary call on the client side, but the server responds to it /// as though it were a single-ping-pong streaming call. The server can use /// the \a NextMessageSize method to determine an upper-bound on the size of /// the message. A key difference relative to streaming: ServerUnaryStreamer /// must have exactly 1 Read and exactly 1 Write, in that order, to function /// correctly. Otherwise, the RPC is in error. template class ServerUnaryStreamer final : public ServerReaderWriterInterface { public: /// Block to send initial metadata to client. /// Implicit input parameter: /// - the \a ServerContext associated with this call will be used for /// sending initial metadata. void SendInitialMetadata() override { body_.SendInitialMetadata(); } /// Get an upper bound on the request message size from the client. bool NextMessageSize(uint32_t* sz) override { return body_.NextMessageSize(sz); } /// Read a message of type \a R into \a msg. Completion will be notified by \a /// tag on the associated completion queue. /// This is thread-safe with respect to \a Write or \a WritesDone methods. It /// should not be called concurrently with other streaming APIs /// on the same stream. It is not meaningful to call it concurrently /// with another \a ReaderInterface::Read on the same stream since reads on /// the same stream are delivered in order. /// /// \param[out] msg Where to eventually store the read message. /// \param[in] tag The tag identifying the operation. bool Read(RequestType* request) override { if (read_done_) { return false; } read_done_ = true; return body_.Read(request); } /// Block to write \a msg to the stream with WriteOptions \a options. /// This is thread-safe with respect to \a ReaderInterface::Read /// /// \param msg The message to be written to the stream. /// \param options The WriteOptions affecting the write operation. /// /// \return \a true on success, \a false when the stream has been closed. using internal::WriterInterface::Write; bool Write(const ResponseType& response, WriteOptions options) override { if (write_done_ || !read_done_) { return false; } write_done_ = true; return body_.Write(response, options); } private: internal::ServerReaderWriterBody body_; bool read_done_; bool write_done_; friend class internal::TemplatedBidiStreamingHandler< ServerUnaryStreamer, true>; ServerUnaryStreamer(internal::Call* call, ServerContext* ctx) : body_(call, ctx), read_done_(false), write_done_(false) {} }; /// A class to represent a flow-controlled server-side streaming call. /// This is something of a hybrid between server-side and bidi streaming. /// This is invoked through a server-side streaming call on the client side, /// but the server responds to it as though it were a bidi streaming call that /// must first have exactly 1 Read and then any number of Writes. template class ServerSplitStreamer final : public ServerReaderWriterInterface { public: /// Block to send initial metadata to client. /// Implicit input parameter: /// - the \a ServerContext associated with this call will be used for /// sending initial metadata. void SendInitialMetadata() override { body_.SendInitialMetadata(); } /// Get an upper bound on the request message size from the client. bool NextMessageSize(uint32_t* sz) override { return body_.NextMessageSize(sz); } /// Read a message of type \a R into \a msg. Completion will be notified by \a /// tag on the associated completion queue. /// This is thread-safe with respect to \a Write or \a WritesDone methods. It /// should not be called concurrently with other streaming APIs /// on the same stream. It is not meaningful to call it concurrently /// with another \a ReaderInterface::Read on the same stream since reads on /// the same stream are delivered in order. /// /// \param[out] msg Where to eventually store the read message. /// \param[in] tag The tag identifying the operation. bool Read(RequestType* request) override { if (read_done_) { return false; } read_done_ = true; return body_.Read(request); } /// Block to write \a msg to the stream with WriteOptions \a options. /// This is thread-safe with respect to \a ReaderInterface::Read /// /// \param msg The message to be written to the stream. /// \param options The WriteOptions affecting the write operation. /// /// \return \a true on success, \a false when the stream has been closed. using internal::WriterInterface::Write; bool Write(const ResponseType& response, WriteOptions options) override { return read_done_ && body_.Write(response, options); } private: internal::ServerReaderWriterBody body_; bool read_done_; friend class internal::TemplatedBidiStreamingHandler< ServerSplitStreamer, false>; ServerSplitStreamer(internal::Call* call, ServerContext* ctx) : body_(call, ctx), read_done_(false) {} }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_SYNC_STREAM_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/codegen/time.h000066400000000000000000000047121334102242000255710ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_CODEGEN_TIME_H #define GRPCPP_IMPL_CODEGEN_TIME_H #include #include #include namespace grpc { /** If you are trying to use CompletionQueue::AsyncNext with a time class that isn't either gpr_timespec or std::chrono::system_clock::time_point, you will most likely be looking at this comment as your compiler will have fired an error below. In order to fix this issue, you have two potential solutions: 1. Use gpr_timespec or std::chrono::system_clock::time_point instead 2. Specialize the TimePoint class with whichever time class that you want to use here. See below for two examples of how to do this. */ template class TimePoint { public: TimePoint(const T& time) { you_need_a_specialization_of_TimePoint(); } gpr_timespec raw_time() { gpr_timespec t; return t; } private: void you_need_a_specialization_of_TimePoint(); }; template <> class TimePoint { public: TimePoint(const gpr_timespec& time) : time_(time) {} gpr_timespec raw_time() { return time_; } private: gpr_timespec time_; }; } // namespace grpc namespace grpc { // from and to should be absolute time. void Timepoint2Timespec(const std::chrono::system_clock::time_point& from, gpr_timespec* to); void TimepointHR2Timespec( const std::chrono::high_resolution_clock::time_point& from, gpr_timespec* to); std::chrono::system_clock::time_point Timespec2Timepoint(gpr_timespec t); template <> class TimePoint { public: TimePoint(const std::chrono::system_clock::time_point& time) { Timepoint2Timespec(time, &time_); } gpr_timespec raw_time() const { return time_; } private: gpr_timespec time_; }; } // namespace grpc #endif // GRPCPP_IMPL_CODEGEN_TIME_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/grpc_library.h000066400000000000000000000032561334102242000257100ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_GRPC_LIBRARY_H #define GRPCPP_IMPL_GRPC_LIBRARY_H #include #include #include #include #include namespace grpc { namespace internal { class GrpcLibrary final : public GrpcLibraryInterface { public: void init() override { grpc_init(); } void shutdown() override { grpc_shutdown(); } }; static GrpcLibrary g_gli; static CoreCodegen g_core_codegen; /// Instantiating this class ensures the proper initialization of gRPC. class GrpcLibraryInitializer final { public: GrpcLibraryInitializer() { if (grpc::g_glip == nullptr) { grpc::g_glip = &g_gli; } if (grpc::g_core_codegen_interface == nullptr) { grpc::g_core_codegen_interface = &g_core_codegen; } } /// A no-op method to force the linker to reference this class, which will /// take care of initializing and shutting down the gRPC runtime. int summon() { return 0; } }; } // namespace internal } // namespace grpc #endif // GRPCPP_IMPL_GRPC_LIBRARY_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/method_handler_impl.h000066400000000000000000000014241334102242000272220ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_METHOD_HANDLER_IMPL_H #define GRPCPP_IMPL_METHOD_HANDLER_IMPL_H #include #endif // GRPCPP_IMPL_METHOD_HANDLER_IMPL_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/rpc_method.h000066400000000000000000000013601334102242000253470ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_RPC_METHOD_H #define GRPCPP_IMPL_RPC_METHOD_H #include #endif // GRPCPP_IMPL_RPC_METHOD_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/rpc_service_method.h000066400000000000000000000014201334102242000270640ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_RPC_SERVICE_METHOD_H #define GRPCPP_IMPL_RPC_SERVICE_METHOD_H #include #endif // GRPCPP_IMPL_RPC_SERVICE_METHOD_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/serialization_traits.h000066400000000000000000000014301334102242000274640ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_SERIALIZATION_TRAITS_H #define GRPCPP_IMPL_SERIALIZATION_TRAITS_H #include #endif // GRPCPP_IMPL_SERIALIZATION_TRAITS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/server_builder_option.h000066400000000000000000000025041334102242000276300ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_SERVER_BUILDER_OPTION_H #define GRPCPP_IMPL_SERVER_BUILDER_OPTION_H #include #include #include #include namespace grpc { /// Interface to pass an option to a \a ServerBuilder. class ServerBuilderOption { public: virtual ~ServerBuilderOption() {} /// Alter the \a ChannelArguments used to create the gRPC server. virtual void UpdateArguments(ChannelArguments* args) = 0; /// Alter the ServerBuilderPlugin map that will be added into ServerBuilder. virtual void UpdatePlugins( std::vector>* plugins) = 0; }; } // namespace grpc #endif // GRPCPP_IMPL_SERVER_BUILDER_OPTION_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/server_builder_plugin.h000066400000000000000000000042531334102242000276210ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_SERVER_BUILDER_PLUGIN_H #define GRPCPP_IMPL_SERVER_BUILDER_PLUGIN_H #include #include namespace grpc { class ServerBuilder; class ServerInitializer; class ChannelArguments; /// This interface is meant for internal usage only. Implementations of this /// interface should add themselves to a \a ServerBuilder instance through the /// \a InternalAddPluginFactory method. class ServerBuilderPlugin { public: virtual ~ServerBuilderPlugin() {} virtual grpc::string name() = 0; /// UpdateServerBuilder will be called at an early stage in /// ServerBuilder::BuildAndStart(), right after the ServerBuilderOptions have /// done their updates. virtual void UpdateServerBuilder(ServerBuilder* builder) {} /// InitServer will be called in ServerBuilder::BuildAndStart(), after the /// Server instance is created. virtual void InitServer(ServerInitializer* si) = 0; /// Finish will be called at the end of ServerBuilder::BuildAndStart(). virtual void Finish(ServerInitializer* si) = 0; /// ChangeArguments is an interface that can be used in /// ServerBuilderOption::UpdatePlugins virtual void ChangeArguments(const grpc::string& name, void* value) = 0; /// UpdateChannelArguments will be called in ServerBuilder::BuildAndStart(), /// before the Server instance is created. virtual void UpdateChannelArguments(ChannelArguments* args) {} virtual bool has_sync_methods() const { return false; } virtual bool has_async_methods() const { return false; } }; } // namespace grpc #endif // GRPCPP_IMPL_SERVER_BUILDER_PLUGIN_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/server_initializer.h000066400000000000000000000025111334102242000271330ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_SERVER_INITIALIZER_H #define GRPCPP_IMPL_SERVER_INITIALIZER_H #include #include #include namespace grpc { class Server; class Service; class ServerInitializer { public: ServerInitializer(Server* server) : server_(server) {} bool RegisterService(std::shared_ptr service) { if (!server_->RegisterService(nullptr, service.get())) { return false; } default_services_.push_back(service); return true; } const std::vector* GetServiceList() { return &server_->services_; } private: Server* server_; std::vector > default_services_; }; } // namespace grpc #endif // GRPCPP_IMPL_SERVER_INITIALIZER_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/service_type.h000066400000000000000000000013701334102242000257250ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_SERVICE_TYPE_H #define GRPCPP_IMPL_SERVICE_TYPE_H #include #endif // GRPCPP_IMPL_SERVICE_TYPE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/sync_cxx11.h000066400000000000000000000013601334102242000252230ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_SYNC_CXX11_H #define GRPCPP_IMPL_SYNC_CXX11_H #include #endif // GRPCPP_IMPL_SYNC_CXX11_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/impl/sync_no_cxx11.h000066400000000000000000000013741334102242000257240ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_IMPL_SYNC_NO_CXX11_H #define GRPCPP_IMPL_SYNC_NO_CXX11_H #include #endif // GRPCPP_IMPL_SYNC_NO_CXX11_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/opencensus.h000066400000000000000000000026501334102242000244470ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_OPENCENSUS_H #define GRPCPP_OPENCENSUS_H namespace grpc { // These symbols in this file will not be included in the binary unless // grpc_opencensus_plugin build target was added as a dependency. At the moment // it is only setup to be built with Bazel. // Registers the OpenCensus plugin with gRPC, so that it will be used for future // RPCs. This must be called before any views are created. void RegisterOpenCensusPlugin(); // RPC stats definitions, defined by // https://github.com/census-instrumentation/opencensus-specs/blob/master/stats/gRPC.md // Registers the cumulative gRPC views so that they will be exported by any // registered stats exporter. For on-task stats, construct a View using the // ViewDescriptors below. void RegisterOpenCensusViewsForExport(); } // namespace grpc #endif // GRPCPP_OPENCENSUS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/resource_quota.h000066400000000000000000000035431334102242000253270ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_RESOURCE_QUOTA_H #define GRPCPP_RESOURCE_QUOTA_H struct grpc_resource_quota; #include #include namespace grpc { /// ResourceQuota represents a bound on memory usage by the gRPC library. /// A ResourceQuota can be attached to a server (via \a ServerBuilder), /// or a client channel (via \a ChannelArguments). /// gRPC will attempt to keep memory used by all attached entities /// below the ResourceQuota bound. class ResourceQuota final : private GrpcLibraryCodegen { public: /// \param name - a unique name for this ResourceQuota. explicit ResourceQuota(const grpc::string& name); ResourceQuota(); ~ResourceQuota(); /// Resize this \a ResourceQuota to a new size. If \a new_size is smaller /// than the current size of the pool, memory usage will be monotonically /// decreased until it falls under \a new_size. /// No time bound is given for this to occur however. ResourceQuota& Resize(size_t new_size); grpc_resource_quota* c_resource_quota() const { return impl_; } private: ResourceQuota(const ResourceQuota& rhs); ResourceQuota& operator=(const ResourceQuota& rhs); grpc_resource_quota* const impl_; }; } // namespace grpc #endif // GRPCPP_RESOURCE_QUOTA_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/security/000077500000000000000000000000001334102242000237605ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpcpp/security/auth_context.h000066400000000000000000000014151334102242000266370ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SECURITY_AUTH_CONTEXT_H #define GRPCPP_SECURITY_AUTH_CONTEXT_H #include #endif // GRPCPP_SECURITY_AUTH_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/security/auth_metadata_processor.h000066400000000000000000000044641334102242000310410ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SECURITY_AUTH_METADATA_PROCESSOR_H #define GRPCPP_SECURITY_AUTH_METADATA_PROCESSOR_H #include #include #include #include namespace grpc { /// Interface allowing custom server-side authorization based on credentials /// encoded in metadata. Objects of this type can be passed to /// \a ServerCredentials::SetAuthMetadataProcessor(). class AuthMetadataProcessor { public: typedef std::multimap InputMetadata; typedef std::multimap OutputMetadata; virtual ~AuthMetadataProcessor() {} /// If this method returns true, the \a Process function will be scheduled in /// a different thread from the one processing the call. virtual bool IsBlocking() const { return true; } /// context is read/write: it contains the properties of the channel peer and /// it is the job of the Process method to augment it with properties derived /// from the passed-in auth_metadata. /// consumed_auth_metadata needs to be filled with metadata that has been /// consumed by the processor and will be removed from the call. /// response_metadata is the metadata that will be sent as part of the /// response. /// If the return value is not Status::OK, the rpc call will be aborted with /// the error code and error message sent back to the client. virtual Status Process(const InputMetadata& auth_metadata, AuthContext* context, OutputMetadata* consumed_auth_metadata, OutputMetadata* response_metadata) = 0; }; } // namespace grpc #endif // GRPCPP_SECURITY_AUTH_METADATA_PROCESSOR_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/security/credentials.h000066400000000000000000000220771334102242000264360ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SECURITY_CREDENTIALS_H #define GRPCPP_SECURITY_CREDENTIALS_H #include #include #include #include #include #include #include struct grpc_call; namespace grpc { class ChannelArguments; class Channel; class SecureChannelCredentials; class CallCredentials; class SecureCallCredentials; /// A channel credentials object encapsulates all the state needed by a client /// to authenticate with a server for a given channel. /// It can make various assertions, e.g., about the client’s identity, role /// for all the calls on that channel. /// /// \see https://grpc.io/docs/guides/auth.html class ChannelCredentials : private GrpcLibraryCodegen { public: ChannelCredentials(); ~ChannelCredentials(); protected: friend std::shared_ptr CompositeChannelCredentials( const std::shared_ptr& channel_creds, const std::shared_ptr& call_creds); virtual SecureChannelCredentials* AsSecureCredentials() = 0; private: friend std::shared_ptr CreateCustomChannel( const grpc::string& target, const std::shared_ptr& creds, const ChannelArguments& args); virtual std::shared_ptr CreateChannel( const grpc::string& target, const ChannelArguments& args) = 0; }; /// A call credentials object encapsulates the state needed by a client to /// authenticate with a server for a given call on a channel. /// /// \see https://grpc.io/docs/guides/auth.html class CallCredentials : private GrpcLibraryCodegen { public: CallCredentials(); ~CallCredentials(); /// Apply this instance's credentials to \a call. virtual bool ApplyToCall(grpc_call* call) = 0; protected: friend std::shared_ptr CompositeChannelCredentials( const std::shared_ptr& channel_creds, const std::shared_ptr& call_creds); friend std::shared_ptr CompositeCallCredentials( const std::shared_ptr& creds1, const std::shared_ptr& creds2); virtual SecureCallCredentials* AsSecureCredentials() = 0; }; /// Options used to build SslCredentials. struct SslCredentialsOptions { /// The buffer containing the PEM encoding of the server root certificates. If /// this parameter is empty, the default roots will be used. The default /// roots can be overridden using the \a GRPC_DEFAULT_SSL_ROOTS_FILE_PATH /// environment variable pointing to a file on the file system containing the /// roots. grpc::string pem_root_certs; /// The buffer containing the PEM encoding of the client's private key. This /// parameter can be empty if the client does not have a private key. grpc::string pem_private_key; /// The buffer containing the PEM encoding of the client's certificate chain. /// This parameter can be empty if the client does not have a certificate /// chain. grpc::string pem_cert_chain; }; // Factories for building different types of Credentials The functions may // return empty shared_ptr when credentials cannot be created. If a // Credentials pointer is returned, it can still be invalid when used to create // a channel. A lame channel will be created then and all rpcs will fail on it. /// Builds credentials with reasonable defaults. /// /// \warning Only use these credentials when connecting to a Google endpoint. /// Using these credentials to connect to any other service may result in this /// service being able to impersonate your client for requests to Google /// services. std::shared_ptr GoogleDefaultCredentials(); /// Builds SSL Credentials given SSL specific options std::shared_ptr SslCredentials( const SslCredentialsOptions& options); /// Builds credentials for use when running in GCE /// /// \warning Only use these credentials when connecting to a Google endpoint. /// Using these credentials to connect to any other service may result in this /// service being able to impersonate your client for requests to Google /// services. std::shared_ptr GoogleComputeEngineCredentials(); /// Constant for maximum auth token lifetime. constexpr long kMaxAuthTokenLifetimeSecs = 3600; /// Builds Service Account JWT Access credentials. /// json_key is the JSON key string containing the client's private key. /// token_lifetime_seconds is the lifetime in seconds of each Json Web Token /// (JWT) created with this credentials. It should not exceed /// \a kMaxAuthTokenLifetimeSecs or will be cropped to this value. std::shared_ptr ServiceAccountJWTAccessCredentials( const grpc::string& json_key, long token_lifetime_seconds = kMaxAuthTokenLifetimeSecs); /// Builds refresh token credentials. /// json_refresh_token is the JSON string containing the refresh token along /// with a client_id and client_secret. /// /// \warning Only use these credentials when connecting to a Google endpoint. /// Using these credentials to connect to any other service may result in this /// service being able to impersonate your client for requests to Google /// services. std::shared_ptr GoogleRefreshTokenCredentials( const grpc::string& json_refresh_token); /// Builds access token credentials. /// access_token is an oauth2 access token that was fetched using an out of band /// mechanism. /// /// \warning Only use these credentials when connecting to a Google endpoint. /// Using these credentials to connect to any other service may result in this /// service being able to impersonate your client for requests to Google /// services. std::shared_ptr AccessTokenCredentials( const grpc::string& access_token); /// Builds IAM credentials. /// /// \warning Only use these credentials when connecting to a Google endpoint. /// Using these credentials to connect to any other service may result in this /// service being able to impersonate your client for requests to Google /// services. std::shared_ptr GoogleIAMCredentials( const grpc::string& authorization_token, const grpc::string& authority_selector); /// Combines a channel credentials and a call credentials into a composite /// channel credentials. std::shared_ptr CompositeChannelCredentials( const std::shared_ptr& channel_creds, const std::shared_ptr& call_creds); /// Combines two call credentials objects into a composite call credentials. std::shared_ptr CompositeCallCredentials( const std::shared_ptr& creds1, const std::shared_ptr& creds2); /// Credentials for an unencrypted, unauthenticated channel std::shared_ptr InsecureChannelCredentials(); /// Credentials for a channel using Cronet. std::shared_ptr CronetChannelCredentials(void* engine); /// User defined metadata credentials. class MetadataCredentialsPlugin { public: virtual ~MetadataCredentialsPlugin() {} /// If this method returns true, the Process function will be scheduled in /// a different thread from the one processing the call. virtual bool IsBlocking() const { return true; } /// Type of credentials this plugin is implementing. virtual const char* GetType() const { return ""; } /// Gets the auth metatada produced by this plugin. /// The fully qualified method name is: /// service_url + "/" + method_name. /// The channel_auth_context contains (among other things), the identity of /// the server. virtual Status GetMetadata( grpc::string_ref service_url, grpc::string_ref method_name, const AuthContext& channel_auth_context, std::multimap* metadata) = 0; }; std::shared_ptr MetadataCredentialsFromPlugin( std::unique_ptr plugin); namespace experimental { /// Options used to build AltsCredentials. struct AltsCredentialsOptions { /// service accounts of target endpoint that will be acceptable /// by the client. If service accounts are provided and none of them matches /// that of the server, authentication will fail. std::vector target_service_accounts; }; /// Builds ALTS Credentials given ALTS specific options std::shared_ptr AltsCredentials( const AltsCredentialsOptions& options); } // namespace experimental } // namespace grpc #endif // GRPCPP_SECURITY_CREDENTIALS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/security/server_credentials.h000066400000000000000000000063771334102242000300310ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SECURITY_SERVER_CREDENTIALS_H #define GRPCPP_SECURITY_SERVER_CREDENTIALS_H #include #include #include #include #include struct grpc_server; namespace grpc { class Server; /// Wrapper around \a grpc_server_credentials, a way to authenticate a server. class ServerCredentials { public: virtual ~ServerCredentials(); /// This method is not thread-safe and has to be called before the server is /// started. The last call to this function wins. virtual void SetAuthMetadataProcessor( const std::shared_ptr& processor) = 0; private: friend class ::grpc::Server; /// Tries to bind \a server to the given \a addr (eg, localhost:1234, /// 192.168.1.1:31416, [::1]:27182, etc.) /// /// \return bound port number on sucess, 0 on failure. // TODO(dgq): the "port" part seems to be a misnomer. virtual int AddPortToServer(const grpc::string& addr, grpc_server* server) = 0; }; /// Options to create ServerCredentials with SSL struct SslServerCredentialsOptions { /// \warning Deprecated SslServerCredentialsOptions() : force_client_auth(false), client_certificate_request(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE) {} SslServerCredentialsOptions( grpc_ssl_client_certificate_request_type request_type) : force_client_auth(false), client_certificate_request(request_type) {} struct PemKeyCertPair { grpc::string private_key; grpc::string cert_chain; }; grpc::string pem_root_certs; std::vector pem_key_cert_pairs; /// \warning Deprecated bool force_client_auth; /// If both \a force_client_auth and \a client_certificate_request /// fields are set, \a force_client_auth takes effect, i.e. /// \a REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY /// will be enforced. grpc_ssl_client_certificate_request_type client_certificate_request; }; /// Builds SSL ServerCredentials given SSL specific options std::shared_ptr SslServerCredentials( const SslServerCredentialsOptions& options); /// Builds insecure server credentials. std::shared_ptr InsecureServerCredentials(); namespace experimental { /// Options to create ServerCredentials with ALTS struct AltsServerCredentialsOptions { /// Add fields if needed. }; /// Builds ALTS ServerCredentials given ALTS specific options std::shared_ptr AltsServerCredentials( const AltsServerCredentialsOptions& options); } // namespace experimental } // namespace grpc #endif // GRPCPP_SECURITY_SERVER_CREDENTIALS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/server.h000066400000000000000000000201301334102242000235640ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SERVER_H #define GRPCPP_SERVER_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct grpc_server; namespace grpc { class AsyncGenericService; class HealthCheckServiceInterface; class ServerContext; class ServerInitializer; /// Represents a gRPC server. /// /// Use a \a grpc::ServerBuilder to create, configure, and start /// \a Server instances. class Server : public ServerInterface, private GrpcLibraryCodegen { public: ~Server(); /// Block until the server shuts down. /// /// \warning The server must be either shutting down or some other thread must /// call \a Shutdown for this function to ever return. void Wait() override; /// Global callbacks are a set of hooks that are called when server /// events occur. \a SetGlobalCallbacks method is used to register /// the hooks with gRPC. Note that /// the \a GlobalCallbacks instance will be shared among all /// \a Server instances in an application and can be set exactly /// once per application. class GlobalCallbacks { public: virtual ~GlobalCallbacks() {} /// Called before server is created. virtual void UpdateArguments(ChannelArguments* args) {} /// Called before application callback for each synchronous server request virtual void PreSynchronousRequest(ServerContext* context) = 0; /// Called after application callback for each synchronous server request virtual void PostSynchronousRequest(ServerContext* context) = 0; /// Called before server is started. virtual void PreServerStart(Server* server) {} /// Called after a server port is added. virtual void AddPort(Server* server, const grpc::string& addr, ServerCredentials* creds, int port) {} }; /// Set the global callback object. Can only be called once per application. /// Does not take ownership of callbacks, and expects the pointed to object /// to be alive until all server objects in the process have been destroyed. /// The same \a GlobalCallbacks object will be used throughout the /// application and is shared among all \a Server objects. static void SetGlobalCallbacks(GlobalCallbacks* callbacks); /// Returns a \em raw pointer to the underlying \a grpc_server instance. /// EXPERIMENTAL: for internal/test use only grpc_server* c_server(); /// Returns the health check service. HealthCheckServiceInterface* GetHealthCheckService() const { return health_check_service_.get(); } /// Establish a channel for in-process communication std::shared_ptr InProcessChannel(const ChannelArguments& args); protected: /// Register a service. This call does not take ownership of the service. /// The service must exist for the lifetime of the Server instance. bool RegisterService(const grpc::string* host, Service* service) override; /// Try binding the server to the given \a addr endpoint /// (port, and optionally including IP address to bind to). /// /// It can be invoked multiple times. Should be used before /// starting the server. /// /// \param addr The address to try to bind to the server (eg, localhost:1234, /// 192.168.1.1:31416, [::1]:27182, etc.). /// \param creds The credentials associated with the server. /// /// \return bound port number on success, 0 on failure. /// /// \warning It is an error to call this method on an already started server. int AddListeningPort(const grpc::string& addr, ServerCredentials* creds) override; /// Server constructors. To be used by \a ServerBuilder only. /// /// \param max_message_size Maximum message length that the channel can /// receive. /// /// \param args The channel args /// /// \param sync_server_cqs The completion queues to use if the server is a /// synchronous server (or a hybrid server). The server polls for new RPCs on /// these queues /// /// \param min_pollers The minimum number of polling threads per server /// completion queue (in param sync_server_cqs) to use for listening to /// incoming requests (used only in case of sync server) /// /// \param max_pollers The maximum number of polling threads per server /// completion queue (in param sync_server_cqs) to use for listening to /// incoming requests (used only in case of sync server) /// /// \param sync_cq_timeout_msec The timeout to use when calling AsyncNext() on /// server completion queues passed via sync_server_cqs param. Server(int max_message_size, ChannelArguments* args, std::shared_ptr>> sync_server_cqs, int min_pollers, int max_pollers, int sync_cq_timeout_msec); /// Start the server. /// /// \param cqs Completion queues for handling asynchronous services. The /// caller is required to keep all completion queues live until the server is /// destroyed. /// \param num_cqs How many completion queues does \a cqs hold. void Start(ServerCompletionQueue** cqs, size_t num_cqs) override; grpc_server* server() override { return server_; }; private: friend class AsyncGenericService; friend class ServerBuilder; friend class ServerInitializer; class SyncRequest; class UnimplementedAsyncRequest; class UnimplementedAsyncResponse; /// SyncRequestThreadManager is an implementation of ThreadManager. This class /// is responsible for polling for incoming RPCs and calling the RPC handlers. /// This is only used in case of a Sync server (i.e a server exposing a sync /// interface) class SyncRequestThreadManager; /// Register a generic service. This call does not take ownership of the /// service. The service must exist for the lifetime of the Server instance. void RegisterAsyncGenericService(AsyncGenericService* service) override; void PerformOpsOnCall(internal::CallOpSetInterface* ops, internal::Call* call) override; void ShutdownInternal(gpr_timespec deadline) override; int max_receive_message_size() const override { return max_receive_message_size_; }; ServerInitializer* initializer(); const int max_receive_message_size_; /// The following completion queues are ONLY used in case of Sync API /// i.e. if the server has any services with sync methods. The server uses /// these completion queues to poll for new RPCs std::shared_ptr>> sync_server_cqs_; /// List of \a ThreadManager instances (one for each cq in /// the \a sync_server_cqs) std::vector> sync_req_mgrs_; // Server status std::mutex mu_; bool started_; bool shutdown_; bool shutdown_notified_; // Was notify called on the shutdown_cv_ std::condition_variable shutdown_cv_; std::shared_ptr global_callbacks_; std::vector services_; bool has_generic_service_; // Pointer to the wrapped grpc_server. grpc_server* server_; std::unique_ptr server_initializer_; std::unique_ptr health_check_service_; bool health_check_service_disabled_; }; } // namespace grpc #endif // GRPCPP_SERVER_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/server_builder.h000066400000000000000000000255551334102242000253120ustar00rootroot00000000000000/* * * Copyright 2015-2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SERVER_BUILDER_H #define GRPCPP_SERVER_BUILDER_H #include #include #include #include #include #include #include #include #include #include #include struct grpc_resource_quota; namespace grpc { class AsyncGenericService; class ResourceQuota; class CompletionQueue; class Server; class ServerCompletionQueue; class ServerCredentials; class Service; namespace testing { class ServerBuilderPluginTest; } // namespace testing /// A builder class for the creation and startup of \a grpc::Server instances. class ServerBuilder { public: ServerBuilder(); virtual ~ServerBuilder(); ////////////////////////////////////////////////////////////////////////////// // Primary API's /// Return a running server which is ready for processing calls. /// Before calling, one typically needs to ensure that: /// 1. a service is registered - so that the server knows what to serve /// (via RegisterService, or RegisterAsyncGenericService) /// 2. a listening port has been added - so the server knows where to receive /// traffic (via AddListeningPort) /// 3. [for async api only] completion queues have been added via /// AddCompletionQueue virtual std::unique_ptr BuildAndStart(); /// Register a service. This call does not take ownership of the service. /// The service must exist for the lifetime of the \a Server instance returned /// by \a BuildAndStart(). /// Matches requests with any :authority ServerBuilder& RegisterService(Service* service); /// Enlists an endpoint \a addr (port with an optional IP address) to /// bind the \a grpc::Server object to be created to. /// /// It can be invoked multiple times. /// /// \param addr_uri The address to try to bind to the server in URI form. If /// the scheme name is omitted, "dns:///" is assumed. To bind to any address, /// please use IPv6 any, i.e., [::]:, which also accepts IPv4 /// connections. Valid values include dns:///localhost:1234, / /// 192.168.1.1:31416, dns:///[::1]:27182, etc.). /// \param creds The credentials associated with the server. /// \param selected_port[out] If not `nullptr`, gets populated with the port /// number bound to the \a grpc::Server for the corresponding endpoint after /// it is successfully bound by BuildAndStart(), 0 otherwise. AddListeningPort /// does not modify this pointer. ServerBuilder& AddListeningPort(const grpc::string& addr_uri, std::shared_ptr creds, int* selected_port = nullptr); /// Add a completion queue for handling asynchronous services. /// /// Best performance is typically obtained by using one thread per polling /// completion queue. /// /// Caller is required to shutdown the server prior to shutting down the /// returned completion queue. Caller is also required to drain the /// completion queue after shutting it down. A typical usage scenario: /// /// // While building the server: /// ServerBuilder builder; /// ... /// cq_ = builder.AddCompletionQueue(); /// server_ = builder.BuildAndStart(); /// /// // While shutting down the server; /// server_->Shutdown(); /// cq_->Shutdown(); // Always *after* the associated server's Shutdown()! /// // Drain the cq_ that was created /// void* ignored_tag; /// bool ignored_ok; /// while (cq_->Next(&ignored_tag, &ignored_ok)) { } /// /// \param is_frequently_polled This is an optional parameter to inform gRPC /// library about whether this completion queue would be frequently polled /// (i.e. by calling \a Next() or \a AsyncNext()). The default value is /// 'true' and is the recommended setting. Setting this to 'false' (i.e. /// not polling the completion queue frequently) will have a significantly /// negative performance impact and hence should not be used in production /// use cases. std::unique_ptr AddCompletionQueue( bool is_frequently_polled = true); ////////////////////////////////////////////////////////////////////////////// // Less commonly used RegisterService variants /// Register a service. This call does not take ownership of the service. /// The service must exist for the lifetime of the \a Server instance returned /// by \a BuildAndStart(). /// Only matches requests with :authority \a host ServerBuilder& RegisterService(const grpc::string& host, Service* service); /// Register a generic service. /// Matches requests with any :authority /// This is mostly useful for writing generic gRPC Proxies where the exact /// serialization format is unknown ServerBuilder& RegisterAsyncGenericService(AsyncGenericService* service); ////////////////////////////////////////////////////////////////////////////// // Fine control knobs /// Set max receive message size in bytes. /// The default is GRPC_DEFAULT_MAX_RECV_MESSAGE_LENGTH. ServerBuilder& SetMaxReceiveMessageSize(int max_receive_message_size) { max_receive_message_size_ = max_receive_message_size; return *this; } /// Set max send message size in bytes. /// The default is GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH. ServerBuilder& SetMaxSendMessageSize(int max_send_message_size) { max_send_message_size_ = max_send_message_size; return *this; } /// \deprecated For backward compatibility. ServerBuilder& SetMaxMessageSize(int max_message_size) { return SetMaxReceiveMessageSize(max_message_size); } /// Set the support status for compression algorithms. All algorithms are /// enabled by default. /// /// Incoming calls compressed with an unsupported algorithm will fail with /// \a GRPC_STATUS_UNIMPLEMENTED. ServerBuilder& SetCompressionAlgorithmSupportStatus( grpc_compression_algorithm algorithm, bool enabled); /// The default compression level to use for all channel calls in the /// absence of a call-specific level. ServerBuilder& SetDefaultCompressionLevel(grpc_compression_level level); /// The default compression algorithm to use for all channel calls in the /// absence of a call-specific level. Note that it overrides any compression /// level set by \a SetDefaultCompressionLevel. ServerBuilder& SetDefaultCompressionAlgorithm( grpc_compression_algorithm algorithm); /// Set the attached buffer pool for this server ServerBuilder& SetResourceQuota(const ResourceQuota& resource_quota); ServerBuilder& SetOption(std::unique_ptr option); /// Options for synchronous servers. enum SyncServerOption { NUM_CQS, ///< Number of completion queues. MIN_POLLERS, ///< Minimum number of polling threads. MAX_POLLERS, ///< Maximum number of polling threads. CQ_TIMEOUT_MSEC ///< Completion queue timeout in milliseconds. }; /// Only useful if this is a Synchronous server. ServerBuilder& SetSyncServerOption(SyncServerOption option, int value); /// Add a channel argument (an escape hatch to tuning core library parameters /// directly) template ServerBuilder& AddChannelArgument(const grpc::string& arg, const T& value) { return SetOption(MakeChannelArgumentOption(arg, value)); } /// For internal use only: Register a ServerBuilderPlugin factory function. static void InternalAddPluginFactory( std::unique_ptr (*CreatePlugin)()); /// Enable a server workaround. Do not use unless you know what the workaround /// does. For explanation and detailed descriptions of workarounds, see /// doc/workarounds.md. ServerBuilder& EnableWorkaround(grpc_workaround_list id); protected: /// Experimental, to be deprecated struct Port { grpc::string addr; std::shared_ptr creds; int* selected_port; }; /// Experimental, to be deprecated typedef std::unique_ptr HostString; struct NamedService { explicit NamedService(Service* s) : service(s) {} NamedService(const grpc::string& h, Service* s) : host(new grpc::string(h)), service(s) {} HostString host; Service* service; }; /// Experimental, to be deprecated std::vector ports() { return ports_; } /// Experimental, to be deprecated std::vector services() { std::vector service_refs; for (auto& ptr : services_) { service_refs.push_back(ptr.get()); } return service_refs; } /// Experimental, to be deprecated std::vector options() { std::vector option_refs; for (auto& ptr : options_) { option_refs.push_back(ptr.get()); } return option_refs; } private: friend class ::grpc::testing::ServerBuilderPluginTest; struct SyncServerSettings { SyncServerSettings() : num_cqs(1), min_pollers(1), max_pollers(2), cq_timeout_msec(10000) {} /// Number of server completion queues to create to listen to incoming RPCs. int num_cqs; /// Minimum number of threads per completion queue that should be listening /// to incoming RPCs. int min_pollers; /// Maximum number of threads per completion queue that can be listening to /// incoming RPCs. int max_pollers; /// The timeout for server completion queue's AsyncNext call. int cq_timeout_msec; }; int max_receive_message_size_; int max_send_message_size_; std::vector> options_; std::vector> services_; std::vector ports_; SyncServerSettings sync_server_settings_; /// List of completion queues added via \a AddCompletionQueue method. std::vector cqs_; std::shared_ptr creds_; std::vector> plugins_; grpc_resource_quota* resource_quota_; AsyncGenericService* generic_service_; struct { bool is_set; grpc_compression_level level; } maybe_default_compression_level_; struct { bool is_set; grpc_compression_algorithm algorithm; } maybe_default_compression_algorithm_; uint32_t enabled_compression_algorithms_bitset_; }; } // namespace grpc #endif // GRPCPP_SERVER_BUILDER_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/server_context.h000066400000000000000000000013611334102242000253350ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SERVER_CONTEXT_H #define GRPCPP_SERVER_CONTEXT_H #include #endif // GRPCPP_SERVER_CONTEXT_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/server_posix.h000066400000000000000000000022051334102242000250110ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SERVER_POSIX_H #define GRPCPP_SERVER_POSIX_H #include #include #include namespace grpc { #ifdef GPR_SUPPORT_CHANNELS_FROM_FD /// Add a new client to a \a Server communicating over the given /// file descriptor. /// /// \param server The server to add the client to. /// \param fd The file descriptor representing a socket. void AddInsecureChannelFromFd(Server* server, int fd); #endif // GPR_SUPPORT_CHANNELS_FROM_FD } // namespace grpc #endif // GRPCPP_SERVER_POSIX_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/000077500000000000000000000000001334102242000236255ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/async_stream.h000066400000000000000000000014011334102242000264620ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_ASYNC_STREAM_H #define GRPCPP_SUPPORT_ASYNC_STREAM_H #include #endif // GRPCPP_SUPPORT_ASYNC_STREAM_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/async_unary_call.h000066400000000000000000000014211334102242000273220ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_ASYNC_UNARY_CALL_H #define GRPCPP_SUPPORT_ASYNC_UNARY_CALL_H #include #endif // GRPCPP_SUPPORT_ASYNC_UNARY_CALL_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/byte_buffer.h000066400000000000000000000017461334102242000263020ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_BYTE_BUFFER_H #define GRPCPP_SUPPORT_BYTE_BUFFER_H #include #include #include #include #include #include #include #include #endif // GRPCPP_SUPPORT_BYTE_BUFFER_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/channel_arguments.h000066400000000000000000000121471334102242000275000ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_H #define GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_H #include #include #include #include #include namespace grpc { namespace testing { class ChannelArgumentsTest; } // namespace testing class ResourceQuota; /// Options for channel creation. The user can use generic setters to pass /// key value pairs down to C channel creation code. For gRPC related options, /// concrete setters are provided. class ChannelArguments { public: ChannelArguments(); ~ChannelArguments(); ChannelArguments(const ChannelArguments& other); ChannelArguments& operator=(ChannelArguments other) { Swap(other); return *this; } void Swap(ChannelArguments& other); /// Dump arguments in this instance to \a channel_args. Does not take /// ownership of \a channel_args. /// /// Note that the underlying arguments are shared. Changes made to either \a /// channel_args or this instance would be reflected on both. void SetChannelArgs(grpc_channel_args* channel_args) const; // gRPC specific channel argument setters /// Set target name override for SSL host name checking. This option is for /// testing only and should never be used in production. void SetSslTargetNameOverride(const grpc::string& name); // TODO(yangg) add flow control options /// Set the compression algorithm for the channel. void SetCompressionAlgorithm(grpc_compression_algorithm algorithm); /// Set the grpclb fallback timeout (in ms) for the channel. If this amount /// of time has passed but we have not gotten any non-empty \a serverlist from /// the balancer, we will fall back to use the backend address(es) returned by /// the resolver. void SetGrpclbFallbackTimeout(int fallback_timeout); /// For client channel's, the socket mutator operates on /// "channel" sockets. For server's, the socket mutator operates /// only on "listen" sockets. /// TODO(apolcyn): allow socket mutators to also operate /// on server "channel" sockets, and adjust the socket mutator /// object to be more speficic about which type of socket /// it should operate on. void SetSocketMutator(grpc_socket_mutator* mutator); /// Set the string to prepend to the user agent. void SetUserAgentPrefix(const grpc::string& user_agent_prefix); /// Set the buffer pool to be attached to the constructed channel. void SetResourceQuota(const ResourceQuota& resource_quota); /// Set the max receive and send message sizes. void SetMaxReceiveMessageSize(int size); void SetMaxSendMessageSize(int size); /// Set LB policy name. /// Note that if the name resolver returns only balancer addresses, the /// grpclb LB policy will be used, regardless of what is specified here. void SetLoadBalancingPolicyName(const grpc::string& lb_policy_name); /// Set service config in JSON form. /// Primarily meant for use in unit tests. void SetServiceConfigJSON(const grpc::string& service_config_json); // Generic channel argument setters. Only for advanced use cases. /// Set an integer argument \a value under \a key. void SetInt(const grpc::string& key, int value); // Generic channel argument setter. Only for advanced use cases. /// Set a pointer argument \a value under \a key. Owership is not transferred. void SetPointer(const grpc::string& key, void* value); void SetPointerWithVtable(const grpc::string& key, void* value, const grpc_arg_pointer_vtable* vtable); /// Set a textual argument \a value under \a key. void SetString(const grpc::string& key, const grpc::string& value); /// Return (by value) a C \a grpc_channel_args structure which points to /// arguments owned by this \a ChannelArguments instance grpc_channel_args c_channel_args() const { grpc_channel_args out; out.num_args = args_.size(); out.args = args_.empty() ? NULL : const_cast(&args_[0]); return out; } private: friend class SecureChannelCredentials; friend class testing::ChannelArgumentsTest; /// Default pointer argument operations. struct PointerVtableMembers { static void* Copy(void* in) { return in; } static void Destroy(void* in) {} static int Compare(void* a, void* b) { if (a < b) return -1; if (a > b) return 1; return 0; } }; // Returns empty string when it is not set. grpc::string GetSslTargetNameOverride() const; std::vector args_; std::list strings_; }; } // namespace grpc #endif // GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/config.h000066400000000000000000000013511334102242000252430ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_CONFIG_H #define GRPCPP_SUPPORT_CONFIG_H #include #endif // GRPCPP_SUPPORT_CONFIG_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/error_details.h000066400000000000000000000026751334102242000266460ustar00rootroot00000000000000/* * * Copyright 2017 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_ERROR_DETAILS_H #define GRPCPP_SUPPORT_ERROR_DETAILS_H #include namespace google { namespace rpc { class Status; } // namespace rpc } // namespace google namespace grpc { /// Map a \a grpc::Status to a \a google::rpc::Status. /// The given \a to object will be cleared. /// On success, returns status with OK. /// Returns status with \a INVALID_ARGUMENT, if failed to deserialize. /// Returns status with \a FAILED_PRECONDITION, if \a to is nullptr. Status ExtractErrorDetails(const Status& from, ::google::rpc::Status* to); /// Map \a google::rpc::Status to a \a grpc::Status. /// Returns OK on success. /// Returns status with \a FAILED_PRECONDITION if \a to is nullptr. Status SetErrorDetails(const ::google::rpc::Status& from, Status* to); } // namespace grpc #endif // GRPCPP_SUPPORT_ERROR_DETAILS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/proto_buffer_reader.h000066400000000000000000000014351334102242000300170ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_PROTO_BUFFER_READER_H #define GRPCPP_SUPPORT_PROTO_BUFFER_READER_H #include #endif // GRPCPP_SUPPORT_PROTO_BUFFER_READER_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/proto_buffer_writer.h000066400000000000000000000014351334102242000300710ustar00rootroot00000000000000/* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_PROTO_BUFFER_WRITER_H #define GRPCPP_SUPPORT_PROTO_BUFFER_WRITER_H #include #endif // GRPCPP_SUPPORT_PROTO_BUFFER_WRITER_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/slice.h000066400000000000000000000014401334102242000250740ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_SLICE_H #define GRPCPP_SUPPORT_SLICE_H #include #include #include #endif // GRPCPP_SUPPORT_SLICE_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/status.h000066400000000000000000000013511334102242000253210ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_STATUS_H #define GRPCPP_SUPPORT_STATUS_H #include #endif // GRPCPP_SUPPORT_STATUS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/status_code_enum.h000066400000000000000000000014211334102242000273350ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_STATUS_CODE_ENUM_H #define GRPCPP_SUPPORT_STATUS_CODE_ENUM_H #include #endif // GRPCPP_SUPPORT_STATUS_CODE_ENUM_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/string_ref.h000066400000000000000000000013711334102242000261420ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_STRING_REF_H #define GRPCPP_SUPPORT_STRING_REF_H #include #endif // GRPCPP_SUPPORT_STRING_REF_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/stub_options.h000066400000000000000000000014011334102242000265220ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_STUB_OPTIONS_H #define GRPCPP_SUPPORT_STUB_OPTIONS_H #include #endif // GRPCPP_SUPPORT_STUB_OPTIONS_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/sync_stream.h000066400000000000000000000013751334102242000263330ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_SYNC_STREAM_H #define GRPCPP_SUPPORT_SYNC_STREAM_H #include #endif // GRPCPP_SUPPORT_SYNC_STREAM_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/support/time.h000066400000000000000000000013411334102242000247330ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_SUPPORT_TIME_H #define GRPCPP_SUPPORT_TIME_H #include #endif // GRPCPP_SUPPORT_TIME_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/test/000077500000000000000000000000001334102242000230705ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/include/grpcpp/test/mock_stream.h000066400000000000000000000074761334102242000255630ustar00rootroot00000000000000/* * * Copyright 2017 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_TEST_MOCK_STREAM_H #define GRPCPP_TEST_MOCK_STREAM_H #include #include #include #include #include #include namespace grpc { namespace testing { template class MockClientReader : public ClientReaderInterface { public: MockClientReader() = default; /// ClientStreamingInterface MOCK_METHOD0_T(Finish, Status()); /// ReaderInterface MOCK_METHOD1_T(NextMessageSize, bool(uint32_t*)); MOCK_METHOD1_T(Read, bool(R*)); /// ClientReaderInterface MOCK_METHOD0_T(WaitForInitialMetadata, void()); }; template class MockClientWriter : public ClientWriterInterface { public: MockClientWriter() = default; /// ClientStreamingInterface MOCK_METHOD0_T(Finish, Status()); /// WriterInterface MOCK_METHOD2_T(Write, bool(const W&, const WriteOptions)); /// ClientWriterInterface MOCK_METHOD0_T(WritesDone, bool()); }; template class MockClientReaderWriter : public ClientReaderWriterInterface { public: MockClientReaderWriter() = default; /// ClientStreamingInterface MOCK_METHOD0_T(Finish, Status()); /// ReaderInterface MOCK_METHOD1_T(NextMessageSize, bool(uint32_t*)); MOCK_METHOD1_T(Read, bool(R*)); /// WriterInterface MOCK_METHOD2_T(Write, bool(const W&, const WriteOptions)); /// ClientReaderWriterInterface MOCK_METHOD0_T(WaitForInitialMetadata, void()); MOCK_METHOD0_T(WritesDone, bool()); }; /// TODO: We do not support mocking an async RPC for now. template class MockClientAsyncResponseReader : public ClientAsyncResponseReaderInterface { public: MockClientAsyncResponseReader() = default; MOCK_METHOD1_T(ReadInitialMetadata, void(void*)); MOCK_METHOD3_T(Finish, void(R*, Status*, void*)); }; template class MockClientAsyncReader : public ClientAsyncReaderInterface { public: MockClientAsyncReader() = default; /// ClientAsyncStreamingInterface MOCK_METHOD1_T(ReadInitialMetadata, void(void*)); MOCK_METHOD2_T(Finish, void(Status*, void*)); /// AsyncReaderInterface MOCK_METHOD2_T(Read, void(R*, void*)); }; template class MockClientAsyncWriter : public ClientAsyncWriterInterface { public: MockClientAsyncWriter() = default; /// ClientAsyncStreamingInterface MOCK_METHOD1_T(ReadInitialMetadata, void(void*)); MOCK_METHOD2_T(Finish, void(Status*, void*)); /// AsyncWriterInterface MOCK_METHOD2_T(Write, void(const W&, void*)); /// ClientAsyncWriterInterface MOCK_METHOD1_T(WritesDone, void(void*)); }; template class MockClientAsyncReaderWriter : public ClientAsyncReaderWriterInterface { public: MockClientAsyncReaderWriter() = default; /// ClientAsyncStreamingInterface MOCK_METHOD1_T(ReadInitialMetadata, void(void*)); MOCK_METHOD2_T(Finish, void(Status*, void*)); /// AsyncWriterInterface MOCK_METHOD2_T(Write, void(const W&, void*)); /// AsyncReaderInterface MOCK_METHOD2_T(Read, void(R*, void*)); /// ClientAsyncReaderWriterInterface MOCK_METHOD1_T(WritesDone, void(void*)); }; } // namespace testing } // namespace grpc #endif // GRPCPP_TEST_MOCK_STREAM_H python-grpc-tools-1.14.1/grpc_root/include/grpcpp/test/server_context_test_spouse.h000066400000000000000000000041321334102242000307500ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPCPP_TEST_SERVER_CONTEXT_TEST_SPOUSE_H #define GRPCPP_TEST_SERVER_CONTEXT_TEST_SPOUSE_H #include #include namespace grpc { namespace testing { /// A test-only class to access private members and methods of ServerContext. class ServerContextTestSpouse { public: explicit ServerContextTestSpouse(ServerContext* ctx) : ctx_(ctx) {} /// Inject client metadata to the ServerContext for the test. The test spouse /// must be alive when \a ServerContext::client_metadata is called. void AddClientMetadata(const grpc::string& key, const grpc::string& value) { client_metadata_storage_.insert( std::pair(key, value)); ctx_->client_metadata_.map()->clear(); for (auto iter = client_metadata_storage_.begin(); iter != client_metadata_storage_.end(); ++iter) { ctx_->client_metadata_.map()->insert( std::pair( iter->first.c_str(), grpc::string_ref(iter->second.data(), iter->second.size()))); } } std::multimap GetInitialMetadata() const { return ctx_->initial_metadata_; } std::multimap GetTrailingMetadata() const { return ctx_->trailing_metadata_; } private: ServerContext* ctx_; // not owned std::multimap client_metadata_storage_; }; } // namespace testing } // namespace grpc #endif // GRPCPP_TEST_SERVER_CONTEXT_TEST_SPOUSE_H python-grpc-tools-1.14.1/grpc_root/src/000077500000000000000000000000001334102242000177625ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/src/compiler/000077500000000000000000000000001334102242000215745ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_root/src/compiler/README.md000066400000000000000000000003201334102242000230460ustar00rootroot00000000000000# Overview This directory contains source code for gRPC protocol buffer compiler (*protoc*) plugins. Along with `protoc`, these plugins are used to generate gRPC client and server stubs from `.proto` files. python-grpc-tools-1.14.1/grpc_root/src/compiler/config.h000066400000000000000000000055211334102242000232150ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef SRC_COMPILER_CONFIG_H #define SRC_COMPILER_CONFIG_H #include #ifndef GRPC_CUSTOM_CODEGENERATOR #include #define GRPC_CUSTOM_CODEGENERATOR ::google::protobuf::compiler::CodeGenerator #define GRPC_CUSTOM_GENERATORCONTEXT \ ::google::protobuf::compiler::GeneratorContext #endif #ifndef GRPC_CUSTOM_PRINTER #include #include #include #define GRPC_CUSTOM_PRINTER ::google::protobuf::io::Printer #define GRPC_CUSTOM_CODEDOUTPUTSTREAM ::google::protobuf::io::CodedOutputStream #define GRPC_CUSTOM_STRINGOUTPUTSTREAM \ ::google::protobuf::io::StringOutputStream #endif #ifndef GRPC_CUSTOM_PLUGINMAIN #include #define GRPC_CUSTOM_PLUGINMAIN ::google::protobuf::compiler::PluginMain #endif #ifndef GRPC_CUSTOM_PARSEGENERATORPARAMETER #include #define GRPC_CUSTOM_PARSEGENERATORPARAMETER \ ::google::protobuf::compiler::ParseGeneratorParameter #endif #ifndef GRPC_CUSTOM_STRING #include #define GRPC_CUSTOM_STRING std::string #endif namespace grpc { typedef GRPC_CUSTOM_STRING string; namespace protobuf { namespace compiler { typedef GRPC_CUSTOM_CODEGENERATOR CodeGenerator; typedef GRPC_CUSTOM_GENERATORCONTEXT GeneratorContext; static inline int PluginMain(int argc, char* argv[], const CodeGenerator* generator) { return GRPC_CUSTOM_PLUGINMAIN(argc, argv, generator); } static inline void ParseGeneratorParameter( const string& parameter, std::vector >* options) { GRPC_CUSTOM_PARSEGENERATORPARAMETER(parameter, options); } } // namespace compiler namespace io { typedef GRPC_CUSTOM_PRINTER Printer; typedef GRPC_CUSTOM_CODEDOUTPUTSTREAM CodedOutputStream; typedef GRPC_CUSTOM_STRINGOUTPUTSTREAM StringOutputStream; } // namespace io } // namespace protobuf } // namespace grpc namespace grpc_cpp_generator { static const char* const kCppGeneratorMessageHeaderExt = ".pb.h"; static const char* const kCppGeneratorServiceHeaderExt = ".grpc.pb.h"; } // namespace grpc_cpp_generator #endif // SRC_COMPILER_CONFIG_H python-grpc-tools-1.14.1/grpc_root/src/compiler/cpp_generator.cc000066400000000000000000002143731334102242000247450ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include "src/compiler/cpp_generator.h" #include namespace grpc_cpp_generator { namespace { template grpc::string as_string(T x) { std::ostringstream out; out << x; return out.str(); } inline bool ClientOnlyStreaming(const grpc_generator::Method* method) { return method->ClientStreaming() && !method->ServerStreaming(); } inline bool ServerOnlyStreaming(const grpc_generator::Method* method) { return !method->ClientStreaming() && method->ServerStreaming(); } grpc::string FilenameIdentifier(const grpc::string& filename) { grpc::string result; for (unsigned i = 0; i < filename.size(); i++) { char c = filename[i]; if (isalnum(c)) { result.push_back(c); } else { static char hex[] = "0123456789abcdef"; result.push_back('_'); result.push_back(hex[(c >> 4) & 0xf]); result.push_back(hex[c & 0xf]); } } return result; } } // namespace template T* array_end(T (&array)[N]) { return array + N; } void PrintIncludes(grpc_generator::Printer* printer, const std::vector& headers, bool use_system_headers, const grpc::string& search_path) { std::map vars; vars["l"] = use_system_headers ? '<' : '"'; vars["r"] = use_system_headers ? '>' : '"'; if (!search_path.empty()) { vars["l"] += search_path; if (search_path[search_path.size() - 1] != '/') { vars["l"] += '/'; } } for (auto i = headers.begin(); i != headers.end(); i++) { vars["h"] = *i; printer->Print(vars, "#include $l$$h$$r$\n"); } } grpc::string GetHeaderPrologue(grpc_generator::File* file, const Parameters& /*params*/) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; vars["filename"] = file->filename(); vars["filename_identifier"] = FilenameIdentifier(file->filename()); vars["filename_base"] = file->filename_without_ext(); vars["message_header_ext"] = kCppGeneratorMessageHeaderExt; printer->Print(vars, "// Generated by the gRPC C++ plugin.\n"); printer->Print(vars, "// If you make any local change, they will be lost.\n"); printer->Print(vars, "// source: $filename$\n"); grpc::string leading_comments = file->GetLeadingComments("//"); if (!leading_comments.empty()) { printer->Print(vars, "// Original file comments:\n"); printer->PrintRaw(leading_comments.c_str()); } printer->Print(vars, "#ifndef GRPC_$filename_identifier$__INCLUDED\n"); printer->Print(vars, "#define GRPC_$filename_identifier$__INCLUDED\n"); printer->Print(vars, "\n"); printer->Print(vars, "#include \"$filename_base$$message_header_ext$\"\n"); printer->Print(vars, file->additional_headers().c_str()); printer->Print(vars, "\n"); } return output; } grpc::string GetHeaderIncludes(grpc_generator::File* file, const Parameters& params) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; if (!params.additional_header_includes.empty()) { PrintIncludes(printer.get(), params.additional_header_includes, false, ""); } static const char* headers_strs[] = { "grpcpp/impl/codegen/async_generic_service.h", "grpcpp/impl/codegen/async_stream.h", "grpcpp/impl/codegen/async_unary_call.h", "grpcpp/impl/codegen/method_handler_impl.h", "grpcpp/impl/codegen/proto_utils.h", "grpcpp/impl/codegen/rpc_method.h", "grpcpp/impl/codegen/service_type.h", "grpcpp/impl/codegen/status.h", "grpcpp/impl/codegen/stub_options.h", "grpcpp/impl/codegen/sync_stream.h"}; std::vector headers(headers_strs, array_end(headers_strs)); PrintIncludes(printer.get(), headers, params.use_system_headers, params.grpc_search_path); printer->Print(vars, "\n"); printer->Print(vars, "namespace grpc {\n"); printer->Print(vars, "class CompletionQueue;\n"); printer->Print(vars, "class Channel;\n"); printer->Print(vars, "class ServerCompletionQueue;\n"); printer->Print(vars, "class ServerContext;\n"); printer->Print(vars, "} // namespace grpc\n\n"); if (!file->package().empty()) { std::vector parts = file->package_parts(); for (auto part = parts.begin(); part != parts.end(); part++) { vars["part"] = *part; printer->Print(vars, "namespace $part$ {\n"); } printer->Print(vars, "\n"); } } return output; } void PrintHeaderClientMethodInterfaces( grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars, bool is_public) { (*vars)["Method"] = method->name(); (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); struct { grpc::string prefix; grpc::string method_params; // extra arguments to method grpc::string raw_args; // extra arguments to raw version of method } async_prefixes[] = {{"Async", ", void* tag", ", tag"}, {"PrepareAsync", "", ""}}; if (is_public) { if (method->NoStreaming()) { printer->Print( *vars, "virtual ::grpc::Status $Method$(::grpc::ClientContext* context, " "const $Request$& request, $Response$* response) = 0;\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; printer->Print( *vars, "std::unique_ptr< " "::grpc::ClientAsyncResponseReaderInterface< $Response$>> " "$AsyncPrefix$$Method$(::grpc::ClientContext* context, " "const $Request$& request, " "::grpc::CompletionQueue* cq) {\n"); printer->Indent(); printer->Print( *vars, "return std::unique_ptr< " "::grpc::ClientAsyncResponseReaderInterface< $Response$>>(" "$AsyncPrefix$$Method$Raw(context, request, cq));\n"); printer->Outdent(); printer->Print("}\n"); } } else if (ClientOnlyStreaming(method)) { printer->Print( *vars, "std::unique_ptr< ::grpc::ClientWriterInterface< $Request$>>" " $Method$(" "::grpc::ClientContext* context, $Response$* response) {\n"); printer->Indent(); printer->Print( *vars, "return std::unique_ptr< ::grpc::ClientWriterInterface< $Request$>>" "($Method$Raw(context, response));\n"); printer->Outdent(); printer->Print("}\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncRawArgs"] = async_prefix.raw_args; printer->Print( *vars, "std::unique_ptr< ::grpc::ClientAsyncWriterInterface< $Request$>>" " $AsyncPrefix$$Method$(::grpc::ClientContext* context, " "$Response$* " "response, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); printer->Indent(); printer->Print(*vars, "return std::unique_ptr< " "::grpc::ClientAsyncWriterInterface< $Request$>>(" "$AsyncPrefix$$Method$Raw(context, response, " "cq$AsyncRawArgs$));\n"); printer->Outdent(); printer->Print("}\n"); } } else if (ServerOnlyStreaming(method)) { printer->Print( *vars, "std::unique_ptr< ::grpc::ClientReaderInterface< $Response$>>" " $Method$(::grpc::ClientContext* context, const $Request$& request)" " {\n"); printer->Indent(); printer->Print( *vars, "return std::unique_ptr< ::grpc::ClientReaderInterface< $Response$>>" "($Method$Raw(context, request));\n"); printer->Outdent(); printer->Print("}\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncRawArgs"] = async_prefix.raw_args; printer->Print( *vars, "std::unique_ptr< ::grpc::ClientAsyncReaderInterface< $Response$>> " "$AsyncPrefix$$Method$(" "::grpc::ClientContext* context, const $Request$& request, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); printer->Indent(); printer->Print( *vars, "return std::unique_ptr< " "::grpc::ClientAsyncReaderInterface< $Response$>>(" "$AsyncPrefix$$Method$Raw(context, request, cq$AsyncRawArgs$));\n"); printer->Outdent(); printer->Print("}\n"); } } else if (method->BidiStreaming()) { printer->Print(*vars, "std::unique_ptr< ::grpc::ClientReaderWriterInterface< " "$Request$, $Response$>> " "$Method$(::grpc::ClientContext* context) {\n"); printer->Indent(); printer->Print( *vars, "return std::unique_ptr< " "::grpc::ClientReaderWriterInterface< $Request$, $Response$>>(" "$Method$Raw(context));\n"); printer->Outdent(); printer->Print("}\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncRawArgs"] = async_prefix.raw_args; printer->Print( *vars, "std::unique_ptr< " "::grpc::ClientAsyncReaderWriterInterface< $Request$, $Response$>> " "$AsyncPrefix$$Method$(::grpc::ClientContext* context, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); printer->Indent(); printer->Print( *vars, "return std::unique_ptr< " "::grpc::ClientAsyncReaderWriterInterface< $Request$, $Response$>>(" "$AsyncPrefix$$Method$Raw(context, cq$AsyncRawArgs$));\n"); printer->Outdent(); printer->Print("}\n"); } } } else { if (method->NoStreaming()) { for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; printer->Print( *vars, "virtual ::grpc::ClientAsyncResponseReaderInterface< $Response$>* " "$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, " "const $Request$& request, " "::grpc::CompletionQueue* cq) = 0;\n"); } } else if (ClientOnlyStreaming(method)) { printer->Print( *vars, "virtual ::grpc::ClientWriterInterface< $Request$>*" " $Method$Raw(" "::grpc::ClientContext* context, $Response$* response) = 0;\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; printer->Print( *vars, "virtual ::grpc::ClientAsyncWriterInterface< $Request$>*" " $AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, " "$Response$* response, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) = 0;\n"); } } else if (ServerOnlyStreaming(method)) { printer->Print( *vars, "virtual ::grpc::ClientReaderInterface< $Response$>* " "$Method$Raw(" "::grpc::ClientContext* context, const $Request$& request) = 0;\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; printer->Print( *vars, "virtual ::grpc::ClientAsyncReaderInterface< $Response$>* " "$AsyncPrefix$$Method$Raw(" "::grpc::ClientContext* context, const $Request$& request, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) = 0;\n"); } } else if (method->BidiStreaming()) { printer->Print(*vars, "virtual ::grpc::ClientReaderWriterInterface< $Request$, " "$Response$>* " "$Method$Raw(::grpc::ClientContext* context) = 0;\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; printer->Print( *vars, "virtual ::grpc::ClientAsyncReaderWriterInterface< " "$Request$, $Response$>* " "$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) = 0;\n"); } } } } void PrintHeaderClientMethod(grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars, bool is_public) { (*vars)["Method"] = method->name(); (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); struct { grpc::string prefix; grpc::string method_params; // extra arguments to method grpc::string raw_args; // extra arguments to raw version of method } async_prefixes[] = {{"Async", ", void* tag", ", tag"}, {"PrepareAsync", "", ""}}; if (is_public) { if (method->NoStreaming()) { printer->Print( *vars, "::grpc::Status $Method$(::grpc::ClientContext* context, " "const $Request$& request, $Response$* response) override;\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; printer->Print( *vars, "std::unique_ptr< ::grpc::ClientAsyncResponseReader< $Response$>> " "$AsyncPrefix$$Method$(::grpc::ClientContext* context, " "const $Request$& request, " "::grpc::CompletionQueue* cq) {\n"); printer->Indent(); printer->Print(*vars, "return std::unique_ptr< " "::grpc::ClientAsyncResponseReader< $Response$>>(" "$AsyncPrefix$$Method$Raw(context, request, cq));\n"); printer->Outdent(); printer->Print("}\n"); } } else if (ClientOnlyStreaming(method)) { printer->Print( *vars, "std::unique_ptr< ::grpc::ClientWriter< $Request$>>" " $Method$(" "::grpc::ClientContext* context, $Response$* response) {\n"); printer->Indent(); printer->Print(*vars, "return std::unique_ptr< ::grpc::ClientWriter< $Request$>>" "($Method$Raw(context, response));\n"); printer->Outdent(); printer->Print("}\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncRawArgs"] = async_prefix.raw_args; printer->Print(*vars, "std::unique_ptr< ::grpc::ClientAsyncWriter< $Request$>>" " $AsyncPrefix$$Method$(::grpc::ClientContext* context, " "$Response$* response, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); printer->Indent(); printer->Print( *vars, "return std::unique_ptr< ::grpc::ClientAsyncWriter< $Request$>>(" "$AsyncPrefix$$Method$Raw(context, response, " "cq$AsyncRawArgs$));\n"); printer->Outdent(); printer->Print("}\n"); } } else if (ServerOnlyStreaming(method)) { printer->Print( *vars, "std::unique_ptr< ::grpc::ClientReader< $Response$>>" " $Method$(::grpc::ClientContext* context, const $Request$& request)" " {\n"); printer->Indent(); printer->Print( *vars, "return std::unique_ptr< ::grpc::ClientReader< $Response$>>" "($Method$Raw(context, request));\n"); printer->Outdent(); printer->Print("}\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncRawArgs"] = async_prefix.raw_args; printer->Print( *vars, "std::unique_ptr< ::grpc::ClientAsyncReader< $Response$>> " "$AsyncPrefix$$Method$(" "::grpc::ClientContext* context, const $Request$& request, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); printer->Indent(); printer->Print( *vars, "return std::unique_ptr< ::grpc::ClientAsyncReader< $Response$>>(" "$AsyncPrefix$$Method$Raw(context, request, cq$AsyncRawArgs$));\n"); printer->Outdent(); printer->Print("}\n"); } } else if (method->BidiStreaming()) { printer->Print( *vars, "std::unique_ptr< ::grpc::ClientReaderWriter< $Request$, $Response$>>" " $Method$(::grpc::ClientContext* context) {\n"); printer->Indent(); printer->Print(*vars, "return std::unique_ptr< " "::grpc::ClientReaderWriter< $Request$, $Response$>>(" "$Method$Raw(context));\n"); printer->Outdent(); printer->Print("}\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncRawArgs"] = async_prefix.raw_args; printer->Print(*vars, "std::unique_ptr< ::grpc::ClientAsyncReaderWriter< " "$Request$, $Response$>> " "$AsyncPrefix$$Method$(::grpc::ClientContext* context, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); printer->Indent(); printer->Print( *vars, "return std::unique_ptr< " "::grpc::ClientAsyncReaderWriter< $Request$, $Response$>>(" "$AsyncPrefix$$Method$Raw(context, cq$AsyncRawArgs$));\n"); printer->Outdent(); printer->Print("}\n"); } } } else { if (method->NoStreaming()) { for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; printer->Print( *vars, "::grpc::ClientAsyncResponseReader< $Response$>* " "$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, " "const $Request$& request, " "::grpc::CompletionQueue* cq) override;\n"); } } else if (ClientOnlyStreaming(method)) { printer->Print(*vars, "::grpc::ClientWriter< $Request$>* $Method$Raw(" "::grpc::ClientContext* context, $Response$* response) " "override;\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncRawArgs"] = async_prefix.raw_args; printer->Print( *vars, "::grpc::ClientAsyncWriter< $Request$>* $AsyncPrefix$$Method$Raw(" "::grpc::ClientContext* context, $Response$* response, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) override;\n"); } } else if (ServerOnlyStreaming(method)) { printer->Print(*vars, "::grpc::ClientReader< $Response$>* $Method$Raw(" "::grpc::ClientContext* context, const $Request$& request)" " override;\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncRawArgs"] = async_prefix.raw_args; printer->Print( *vars, "::grpc::ClientAsyncReader< $Response$>* $AsyncPrefix$$Method$Raw(" "::grpc::ClientContext* context, const $Request$& request, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) override;\n"); } } else if (method->BidiStreaming()) { printer->Print(*vars, "::grpc::ClientReaderWriter< $Request$, $Response$>* " "$Method$Raw(::grpc::ClientContext* context) override;\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncRawArgs"] = async_prefix.raw_args; printer->Print( *vars, "::grpc::ClientAsyncReaderWriter< $Request$, $Response$>* " "$AsyncPrefix$$Method$Raw(::grpc::ClientContext* context, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) override;\n"); } } } } void PrintHeaderClientMethodData(grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { (*vars)["Method"] = method->name(); printer->Print(*vars, "const ::grpc::internal::RpcMethod rpcmethod_$Method$_;\n"); } void PrintHeaderServerMethodSync(grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { (*vars)["Method"] = method->name(); (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); printer->Print(method->GetLeadingComments("//").c_str()); if (method->NoStreaming()) { printer->Print(*vars, "virtual ::grpc::Status $Method$(" "::grpc::ServerContext* context, const $Request$* request, " "$Response$* response);\n"); } else if (ClientOnlyStreaming(method)) { printer->Print(*vars, "virtual ::grpc::Status $Method$(" "::grpc::ServerContext* context, " "::grpc::ServerReader< $Request$>* reader, " "$Response$* response);\n"); } else if (ServerOnlyStreaming(method)) { printer->Print(*vars, "virtual ::grpc::Status $Method$(" "::grpc::ServerContext* context, const $Request$* request, " "::grpc::ServerWriter< $Response$>* writer);\n"); } else if (method->BidiStreaming()) { printer->Print( *vars, "virtual ::grpc::Status $Method$(" "::grpc::ServerContext* context, " "::grpc::ServerReaderWriter< $Response$, $Request$>* stream);" "\n"); } printer->Print(method->GetTrailingComments("//").c_str()); } // Helper generator. Disabled the sync API for Request and Response, then adds // in an async API for RealRequest and RealResponse types. This is to be used // to generate async and raw APIs. void PrintHeaderServerAsyncMethodsHelper( grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { if (method->NoStreaming()) { printer->Print( *vars, "// disable synchronous version of this method\n" "::grpc::Status $Method$(" "::grpc::ServerContext* context, const $Request$* request, " "$Response$* response) override {\n" " abort();\n" " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n" "}\n"); printer->Print( *vars, "void Request$Method$(" "::grpc::ServerContext* context, $RealRequest$* request, " "::grpc::ServerAsyncResponseWriter< $RealResponse$>* response, " "::grpc::CompletionQueue* new_call_cq, " "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n"); printer->Print(*vars, " ::grpc::Service::RequestAsyncUnary($Idx$, context, " "request, response, new_call_cq, notification_cq, tag);\n"); printer->Print("}\n"); } else if (ClientOnlyStreaming(method)) { printer->Print( *vars, "// disable synchronous version of this method\n" "::grpc::Status $Method$(" "::grpc::ServerContext* context, " "::grpc::ServerReader< $Request$>* reader, " "$Response$* response) override {\n" " abort();\n" " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n" "}\n"); printer->Print( *vars, "void Request$Method$(" "::grpc::ServerContext* context, " "::grpc::ServerAsyncReader< $RealResponse$, $RealRequest$>* reader, " "::grpc::CompletionQueue* new_call_cq, " "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n"); printer->Print(*vars, " ::grpc::Service::RequestAsyncClientStreaming($Idx$, " "context, reader, new_call_cq, notification_cq, tag);\n"); printer->Print("}\n"); } else if (ServerOnlyStreaming(method)) { printer->Print( *vars, "// disable synchronous version of this method\n" "::grpc::Status $Method$(" "::grpc::ServerContext* context, const $Request$* request, " "::grpc::ServerWriter< $Response$>* writer) override " "{\n" " abort();\n" " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n" "}\n"); printer->Print( *vars, "void Request$Method$(" "::grpc::ServerContext* context, $RealRequest$* request, " "::grpc::ServerAsyncWriter< $RealResponse$>* writer, " "::grpc::CompletionQueue* new_call_cq, " "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n"); printer->Print( *vars, " ::grpc::Service::RequestAsyncServerStreaming($Idx$, " "context, request, writer, new_call_cq, notification_cq, tag);\n"); printer->Print("}\n"); } else if (method->BidiStreaming()) { printer->Print( *vars, "// disable synchronous version of this method\n" "::grpc::Status $Method$(" "::grpc::ServerContext* context, " "::grpc::ServerReaderWriter< $Response$, $Request$>* stream) " " override {\n" " abort();\n" " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n" "}\n"); printer->Print( *vars, "void Request$Method$(" "::grpc::ServerContext* context, " "::grpc::ServerAsyncReaderWriter< $RealResponse$, $RealRequest$>* " "stream, " "::grpc::CompletionQueue* new_call_cq, " "::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n"); printer->Print(*vars, " ::grpc::Service::RequestAsyncBidiStreaming($Idx$, " "context, stream, new_call_cq, notification_cq, tag);\n"); printer->Print("}\n"); } } void PrintHeaderServerMethodAsync(grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { (*vars)["Method"] = method->name(); // These will be disabled (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); // These will be used for the async API (*vars)["RealRequest"] = method->input_type_name(); (*vars)["RealResponse"] = method->output_type_name(); printer->Print(*vars, "template \n"); printer->Print(*vars, "class WithAsyncMethod_$Method$ : public BaseClass {\n"); printer->Print( " private:\n" " void BaseClassMustBeDerivedFromService(const Service *service) {}\n"); printer->Print(" public:\n"); printer->Indent(); printer->Print(*vars, "WithAsyncMethod_$Method$() {\n" " ::grpc::Service::MarkMethodAsync($Idx$);\n" "}\n"); printer->Print(*vars, "~WithAsyncMethod_$Method$() override {\n" " BaseClassMustBeDerivedFromService(this);\n" "}\n"); PrintHeaderServerAsyncMethodsHelper(printer, method, vars); printer->Outdent(); printer->Print(*vars, "};\n"); } void PrintHeaderServerMethodStreamedUnary( grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { (*vars)["Method"] = method->name(); (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); if (method->NoStreaming()) { printer->Print(*vars, "template \n"); printer->Print(*vars, "class WithStreamedUnaryMethod_$Method$ : " "public BaseClass {\n"); printer->Print( " private:\n" " void BaseClassMustBeDerivedFromService(const Service *service) " "{}\n"); printer->Print(" public:\n"); printer->Indent(); printer->Print(*vars, "WithStreamedUnaryMethod_$Method$() {\n" " ::grpc::Service::MarkMethodStreamed($Idx$,\n" " new ::grpc::internal::StreamedUnaryHandler< $Request$, " "$Response$>(std::bind" "(&WithStreamedUnaryMethod_$Method$::" "Streamed$Method$, this, std::placeholders::_1, " "std::placeholders::_2)));\n" "}\n"); printer->Print(*vars, "~WithStreamedUnaryMethod_$Method$() override {\n" " BaseClassMustBeDerivedFromService(this);\n" "}\n"); printer->Print( *vars, "// disable regular version of this method\n" "::grpc::Status $Method$(" "::grpc::ServerContext* context, const $Request$* request, " "$Response$* response) override {\n" " abort();\n" " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n" "}\n"); printer->Print(*vars, "// replace default version of method with streamed unary\n" "virtual ::grpc::Status Streamed$Method$(" "::grpc::ServerContext* context, " "::grpc::ServerUnaryStreamer< " "$Request$,$Response$>* server_unary_streamer)" " = 0;\n"); printer->Outdent(); printer->Print(*vars, "};\n"); } } void PrintHeaderServerMethodSplitStreaming( grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { (*vars)["Method"] = method->name(); (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); if (ServerOnlyStreaming(method)) { printer->Print(*vars, "template \n"); printer->Print(*vars, "class WithSplitStreamingMethod_$Method$ : " "public BaseClass {\n"); printer->Print( " private:\n" " void BaseClassMustBeDerivedFromService(const Service *service) " "{}\n"); printer->Print(" public:\n"); printer->Indent(); printer->Print( *vars, "WithSplitStreamingMethod_$Method$() {\n" " ::grpc::Service::MarkMethodStreamed($Idx$,\n" " new ::grpc::internal::SplitServerStreamingHandler< $Request$, " "$Response$>(std::bind" "(&WithSplitStreamingMethod_$Method$::" "Streamed$Method$, this, std::placeholders::_1, " "std::placeholders::_2)));\n" "}\n"); printer->Print(*vars, "~WithSplitStreamingMethod_$Method$() override {\n" " BaseClassMustBeDerivedFromService(this);\n" "}\n"); printer->Print( *vars, "// disable regular version of this method\n" "::grpc::Status $Method$(" "::grpc::ServerContext* context, const $Request$* request, " "::grpc::ServerWriter< $Response$>* writer) override " "{\n" " abort();\n" " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n" "}\n"); printer->Print(*vars, "// replace default version of method with split streamed\n" "virtual ::grpc::Status Streamed$Method$(" "::grpc::ServerContext* context, " "::grpc::ServerSplitStreamer< " "$Request$,$Response$>* server_split_streamer)" " = 0;\n"); printer->Outdent(); printer->Print(*vars, "};\n"); } } void PrintHeaderServerMethodGeneric( grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { (*vars)["Method"] = method->name(); (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); printer->Print(*vars, "template \n"); printer->Print(*vars, "class WithGenericMethod_$Method$ : public BaseClass {\n"); printer->Print( " private:\n" " void BaseClassMustBeDerivedFromService(const Service *service) {}\n"); printer->Print(" public:\n"); printer->Indent(); printer->Print(*vars, "WithGenericMethod_$Method$() {\n" " ::grpc::Service::MarkMethodGeneric($Idx$);\n" "}\n"); printer->Print(*vars, "~WithGenericMethod_$Method$() override {\n" " BaseClassMustBeDerivedFromService(this);\n" "}\n"); if (method->NoStreaming()) { printer->Print( *vars, "// disable synchronous version of this method\n" "::grpc::Status $Method$(" "::grpc::ServerContext* context, const $Request$* request, " "$Response$* response) override {\n" " abort();\n" " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n" "}\n"); } else if (ClientOnlyStreaming(method)) { printer->Print( *vars, "// disable synchronous version of this method\n" "::grpc::Status $Method$(" "::grpc::ServerContext* context, " "::grpc::ServerReader< $Request$>* reader, " "$Response$* response) override {\n" " abort();\n" " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n" "}\n"); } else if (ServerOnlyStreaming(method)) { printer->Print( *vars, "// disable synchronous version of this method\n" "::grpc::Status $Method$(" "::grpc::ServerContext* context, const $Request$* request, " "::grpc::ServerWriter< $Response$>* writer) override " "{\n" " abort();\n" " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n" "}\n"); } else if (method->BidiStreaming()) { printer->Print( *vars, "// disable synchronous version of this method\n" "::grpc::Status $Method$(" "::grpc::ServerContext* context, " "::grpc::ServerReaderWriter< $Response$, $Request$>* stream) " " override {\n" " abort();\n" " return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n" "}\n"); } printer->Outdent(); printer->Print(*vars, "};\n"); } void PrintHeaderServerMethodRaw(grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { (*vars)["Method"] = method->name(); // These will be disabled (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); // These will be used for raw API (*vars)["RealRequest"] = "::grpc::ByteBuffer"; (*vars)["RealResponse"] = "::grpc::ByteBuffer"; printer->Print(*vars, "template \n"); printer->Print(*vars, "class WithRawMethod_$Method$ : public BaseClass {\n"); printer->Print( " private:\n" " void BaseClassMustBeDerivedFromService(const Service *service) {}\n"); printer->Print(" public:\n"); printer->Indent(); printer->Print(*vars, "WithRawMethod_$Method$() {\n" " ::grpc::Service::MarkMethodRaw($Idx$);\n" "}\n"); printer->Print(*vars, "~WithRawMethod_$Method$() override {\n" " BaseClassMustBeDerivedFromService(this);\n" "}\n"); PrintHeaderServerAsyncMethodsHelper(printer, method, vars); printer->Outdent(); printer->Print(*vars, "};\n"); } void PrintHeaderService(grpc_generator::Printer* printer, const grpc_generator::Service* service, std::map* vars) { (*vars)["Service"] = service->name(); printer->Print(service->GetLeadingComments("//").c_str()); printer->Print(*vars, "class $Service$ final {\n" " public:\n"); printer->Indent(); // Service metadata printer->Print(*vars, "static constexpr char const* service_full_name() {\n" " return \"$Package$$Service$\";\n" "}\n"); // Client side printer->Print( "class StubInterface {\n" " public:\n"); printer->Indent(); printer->Print("virtual ~StubInterface() {}\n"); for (int i = 0; i < service->method_count(); ++i) { printer->Print(service->method(i)->GetLeadingComments("//").c_str()); PrintHeaderClientMethodInterfaces(printer, service->method(i).get(), vars, true); printer->Print(service->method(i)->GetTrailingComments("//").c_str()); } printer->Outdent(); printer->Print("private:\n"); printer->Indent(); for (int i = 0; i < service->method_count(); ++i) { PrintHeaderClientMethodInterfaces(printer, service->method(i).get(), vars, false); } printer->Outdent(); printer->Print("};\n"); printer->Print( "class Stub final : public StubInterface" " {\n public:\n"); printer->Indent(); printer->Print( "Stub(const std::shared_ptr< ::grpc::ChannelInterface>& " "channel);\n"); for (int i = 0; i < service->method_count(); ++i) { PrintHeaderClientMethod(printer, service->method(i).get(), vars, true); } printer->Outdent(); printer->Print("\n private:\n"); printer->Indent(); printer->Print("std::shared_ptr< ::grpc::ChannelInterface> channel_;\n"); for (int i = 0; i < service->method_count(); ++i) { PrintHeaderClientMethod(printer, service->method(i).get(), vars, false); } for (int i = 0; i < service->method_count(); ++i) { PrintHeaderClientMethodData(printer, service->method(i).get(), vars); } printer->Outdent(); printer->Print("};\n"); printer->Print( "static std::unique_ptr NewStub(const std::shared_ptr< " "::grpc::ChannelInterface>& channel, " "const ::grpc::StubOptions& options = ::grpc::StubOptions());\n"); printer->Print("\n"); // Server side - base printer->Print( "class Service : public ::grpc::Service {\n" " public:\n"); printer->Indent(); printer->Print("Service();\n"); printer->Print("virtual ~Service();\n"); for (int i = 0; i < service->method_count(); ++i) { PrintHeaderServerMethodSync(printer, service->method(i).get(), vars); } printer->Outdent(); printer->Print("};\n"); // Server side - Asynchronous for (int i = 0; i < service->method_count(); ++i) { (*vars)["Idx"] = as_string(i); PrintHeaderServerMethodAsync(printer, service->method(i).get(), vars); } printer->Print("typedef "); for (int i = 0; i < service->method_count(); ++i) { (*vars)["method_name"] = service->method(i).get()->name(); printer->Print(*vars, "WithAsyncMethod_$method_name$<"); } printer->Print("Service"); for (int i = 0; i < service->method_count(); ++i) { printer->Print(" >"); } printer->Print(" AsyncService;\n"); // Server side - Generic for (int i = 0; i < service->method_count(); ++i) { (*vars)["Idx"] = as_string(i); PrintHeaderServerMethodGeneric(printer, service->method(i).get(), vars); } // Server side - Raw for (int i = 0; i < service->method_count(); ++i) { (*vars)["Idx"] = as_string(i); PrintHeaderServerMethodRaw(printer, service->method(i).get(), vars); } // Server side - Streamed Unary for (int i = 0; i < service->method_count(); ++i) { (*vars)["Idx"] = as_string(i); PrintHeaderServerMethodStreamedUnary(printer, service->method(i).get(), vars); } printer->Print("typedef "); for (int i = 0; i < service->method_count(); ++i) { (*vars)["method_name"] = service->method(i).get()->name(); if (service->method(i)->NoStreaming()) { printer->Print(*vars, "WithStreamedUnaryMethod_$method_name$<"); } } printer->Print("Service"); for (int i = 0; i < service->method_count(); ++i) { if (service->method(i)->NoStreaming()) { printer->Print(" >"); } } printer->Print(" StreamedUnaryService;\n"); // Server side - controlled server-side streaming for (int i = 0; i < service->method_count(); ++i) { (*vars)["Idx"] = as_string(i); PrintHeaderServerMethodSplitStreaming(printer, service->method(i).get(), vars); } printer->Print("typedef "); for (int i = 0; i < service->method_count(); ++i) { (*vars)["method_name"] = service->method(i).get()->name(); auto method = service->method(i); if (ServerOnlyStreaming(method.get())) { printer->Print(*vars, "WithSplitStreamingMethod_$method_name$<"); } } printer->Print("Service"); for (int i = 0; i < service->method_count(); ++i) { auto method = service->method(i); if (ServerOnlyStreaming(method.get())) { printer->Print(" >"); } } printer->Print(" SplitStreamedService;\n"); // Server side - typedef for controlled both unary and server-side streaming printer->Print("typedef "); for (int i = 0; i < service->method_count(); ++i) { (*vars)["method_name"] = service->method(i).get()->name(); auto method = service->method(i); if (ServerOnlyStreaming(method.get())) { printer->Print(*vars, "WithSplitStreamingMethod_$method_name$<"); } if (service->method(i)->NoStreaming()) { printer->Print(*vars, "WithStreamedUnaryMethod_$method_name$<"); } } printer->Print("Service"); for (int i = 0; i < service->method_count(); ++i) { auto method = service->method(i); if (service->method(i)->NoStreaming() || ServerOnlyStreaming(method.get())) { printer->Print(" >"); } } printer->Print(" StreamedService;\n"); printer->Outdent(); printer->Print("};\n"); printer->Print(service->GetTrailingComments("//").c_str()); } grpc::string GetHeaderServices(grpc_generator::File* file, const Parameters& params) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; // Package string is empty or ends with a dot. It is used to fully qualify // method names. vars["Package"] = file->package(); if (!file->package().empty()) { vars["Package"].append("."); } if (!params.services_namespace.empty()) { vars["services_namespace"] = params.services_namespace; printer->Print(vars, "\nnamespace $services_namespace$ {\n\n"); } for (int i = 0; i < file->service_count(); ++i) { PrintHeaderService(printer.get(), file->service(i).get(), &vars); printer->Print("\n"); } if (!params.services_namespace.empty()) { printer->Print(vars, "} // namespace $services_namespace$\n\n"); } } return output; } grpc::string GetHeaderEpilogue(grpc_generator::File* file, const Parameters& /*params*/) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; vars["filename"] = file->filename(); vars["filename_identifier"] = FilenameIdentifier(file->filename()); if (!file->package().empty()) { std::vector parts = file->package_parts(); for (auto part = parts.rbegin(); part != parts.rend(); part++) { vars["part"] = *part; printer->Print(vars, "} // namespace $part$\n"); } printer->Print(vars, "\n"); } printer->Print(vars, "\n"); printer->Print(vars, "#endif // GRPC_$filename_identifier$__INCLUDED\n"); printer->Print(file->GetTrailingComments("//").c_str()); } return output; } grpc::string GetSourcePrologue(grpc_generator::File* file, const Parameters& /*params*/) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; vars["filename"] = file->filename(); vars["filename_base"] = file->filename_without_ext(); vars["message_header_ext"] = kCppGeneratorMessageHeaderExt; vars["service_header_ext"] = kCppGeneratorServiceHeaderExt; printer->Print(vars, "// Generated by the gRPC C++ plugin.\n"); printer->Print(vars, "// If you make any local change, they will be lost.\n"); printer->Print(vars, "// source: $filename$\n\n"); printer->Print(vars, "#include \"$filename_base$$message_header_ext$\"\n"); printer->Print(vars, "#include \"$filename_base$$service_header_ext$\"\n"); printer->Print(vars, "\n"); } return output; } grpc::string GetSourceIncludes(grpc_generator::File* file, const Parameters& params) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; static const char* headers_strs[] = { "grpcpp/impl/codegen/async_stream.h", "grpcpp/impl/codegen/async_unary_call.h", "grpcpp/impl/codegen/channel_interface.h", "grpcpp/impl/codegen/client_unary_call.h", "grpcpp/impl/codegen/method_handler_impl.h", "grpcpp/impl/codegen/rpc_service_method.h", "grpcpp/impl/codegen/service_type.h", "grpcpp/impl/codegen/sync_stream.h"}; std::vector headers(headers_strs, array_end(headers_strs)); PrintIncludes(printer.get(), headers, params.use_system_headers, params.grpc_search_path); if (!file->package().empty()) { std::vector parts = file->package_parts(); for (auto part = parts.begin(); part != parts.end(); part++) { vars["part"] = *part; printer->Print(vars, "namespace $part$ {\n"); } } printer->Print(vars, "\n"); } return output; } void PrintSourceClientMethod(grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { (*vars)["Method"] = method->name(); (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); struct { grpc::string prefix; grpc::string start; // bool literal expressed as string grpc::string method_params; // extra arguments to method grpc::string create_args; // extra arguments to creator } async_prefixes[] = {{"Async", "true", ", void* tag", ", tag"}, {"PrepareAsync", "false", "", ", nullptr"}}; if (method->NoStreaming()) { printer->Print(*vars, "::grpc::Status $ns$$Service$::Stub::$Method$(" "::grpc::ClientContext* context, " "const $Request$& request, $Response$* response) {\n"); printer->Print(*vars, " return ::grpc::internal::BlockingUnaryCall" "(channel_.get(), rpcmethod_$Method$_, " "context, request, response);\n}\n\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncStart"] = async_prefix.start; printer->Print(*vars, "::grpc::ClientAsyncResponseReader< $Response$>* " "$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(::grpc::" "ClientContext* context, " "const $Request$& request, " "::grpc::CompletionQueue* cq) {\n"); printer->Print( *vars, " return " "::grpc::internal::ClientAsyncResponseReaderFactory< $Response$>" "::Create(channel_.get(), cq, " "rpcmethod_$Method$_, " "context, request, $AsyncStart$);\n" "}\n\n"); } } else if (ClientOnlyStreaming(method)) { printer->Print(*vars, "::grpc::ClientWriter< $Request$>* " "$ns$$Service$::Stub::$Method$Raw(" "::grpc::ClientContext* context, $Response$* response) {\n"); printer->Print( *vars, " return ::grpc::internal::ClientWriterFactory< $Request$>::Create(" "channel_.get(), " "rpcmethod_$Method$_, " "context, response);\n" "}\n\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncStart"] = async_prefix.start; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncCreateArgs"] = async_prefix.create_args; printer->Print(*vars, "::grpc::ClientAsyncWriter< $Request$>* " "$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(" "::grpc::ClientContext* context, $Response$* response, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); printer->Print( *vars, " return ::grpc::internal::ClientAsyncWriterFactory< $Request$>" "::Create(channel_.get(), cq, " "rpcmethod_$Method$_, " "context, response, $AsyncStart$$AsyncCreateArgs$);\n" "}\n\n"); } } else if (ServerOnlyStreaming(method)) { printer->Print( *vars, "::grpc::ClientReader< $Response$>* " "$ns$$Service$::Stub::$Method$Raw(" "::grpc::ClientContext* context, const $Request$& request) {\n"); printer->Print( *vars, " return ::grpc::internal::ClientReaderFactory< $Response$>::Create(" "channel_.get(), " "rpcmethod_$Method$_, " "context, request);\n" "}\n\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncStart"] = async_prefix.start; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncCreateArgs"] = async_prefix.create_args; printer->Print( *vars, "::grpc::ClientAsyncReader< $Response$>* " "$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(" "::grpc::ClientContext* context, const $Request$& request, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); printer->Print( *vars, " return ::grpc::internal::ClientAsyncReaderFactory< $Response$>" "::Create(channel_.get(), cq, " "rpcmethod_$Method$_, " "context, request, $AsyncStart$$AsyncCreateArgs$);\n" "}\n\n"); } } else if (method->BidiStreaming()) { printer->Print( *vars, "::grpc::ClientReaderWriter< $Request$, $Response$>* " "$ns$$Service$::Stub::$Method$Raw(::grpc::ClientContext* context) {\n"); printer->Print(*vars, " return ::grpc::internal::ClientReaderWriterFactory< " "$Request$, $Response$>::Create(" "channel_.get(), " "rpcmethod_$Method$_, " "context);\n" "}\n\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncStart"] = async_prefix.start; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["AsyncCreateArgs"] = async_prefix.create_args; printer->Print(*vars, "::grpc::ClientAsyncReaderWriter< $Request$, $Response$>* " "$ns$$Service$::Stub::$AsyncPrefix$$Method$Raw(::grpc::" "ClientContext* context, " "::grpc::CompletionQueue* cq$AsyncMethodParams$) {\n"); printer->Print(*vars, " return " "::grpc::internal::ClientAsyncReaderWriterFactory< " "$Request$, $Response$>::Create(" "channel_.get(), cq, " "rpcmethod_$Method$_, " "context, $AsyncStart$$AsyncCreateArgs$);\n" "}\n\n"); } } } void PrintSourceServerMethod(grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { (*vars)["Method"] = method->name(); (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); if (method->NoStreaming()) { printer->Print(*vars, "::grpc::Status $ns$$Service$::Service::$Method$(" "::grpc::ServerContext* context, " "const $Request$* request, $Response$* response) {\n"); printer->Print(" (void) context;\n"); printer->Print(" (void) request;\n"); printer->Print(" (void) response;\n"); printer->Print( " return ::grpc::Status(" "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"); printer->Print("}\n\n"); } else if (ClientOnlyStreaming(method)) { printer->Print(*vars, "::grpc::Status $ns$$Service$::Service::$Method$(" "::grpc::ServerContext* context, " "::grpc::ServerReader< $Request$>* reader, " "$Response$* response) {\n"); printer->Print(" (void) context;\n"); printer->Print(" (void) reader;\n"); printer->Print(" (void) response;\n"); printer->Print( " return ::grpc::Status(" "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"); printer->Print("}\n\n"); } else if (ServerOnlyStreaming(method)) { printer->Print(*vars, "::grpc::Status $ns$$Service$::Service::$Method$(" "::grpc::ServerContext* context, " "const $Request$* request, " "::grpc::ServerWriter< $Response$>* writer) {\n"); printer->Print(" (void) context;\n"); printer->Print(" (void) request;\n"); printer->Print(" (void) writer;\n"); printer->Print( " return ::grpc::Status(" "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"); printer->Print("}\n\n"); } else if (method->BidiStreaming()) { printer->Print(*vars, "::grpc::Status $ns$$Service$::Service::$Method$(" "::grpc::ServerContext* context, " "::grpc::ServerReaderWriter< $Response$, $Request$>* " "stream) {\n"); printer->Print(" (void) context;\n"); printer->Print(" (void) stream;\n"); printer->Print( " return ::grpc::Status(" "::grpc::StatusCode::UNIMPLEMENTED, \"\");\n"); printer->Print("}\n\n"); } } void PrintSourceService(grpc_generator::Printer* printer, const grpc_generator::Service* service, std::map* vars) { (*vars)["Service"] = service->name(); if (service->method_count() > 0) { printer->Print(*vars, "static const char* $prefix$$Service$_method_names[] = {\n"); for (int i = 0; i < service->method_count(); ++i) { (*vars)["Method"] = service->method(i).get()->name(); printer->Print(*vars, " \"/$Package$$Service$/$Method$\",\n"); } printer->Print(*vars, "};\n\n"); } printer->Print(*vars, "std::unique_ptr< $ns$$Service$::Stub> $ns$$Service$::NewStub(" "const std::shared_ptr< ::grpc::ChannelInterface>& channel, " "const ::grpc::StubOptions& options) {\n" " (void)options;\n" " std::unique_ptr< $ns$$Service$::Stub> stub(new " "$ns$$Service$::Stub(channel));\n" " return stub;\n" "}\n\n"); printer->Print(*vars, "$ns$$Service$::Stub::Stub(const std::shared_ptr< " "::grpc::ChannelInterface>& channel)\n"); printer->Indent(); printer->Print(": channel_(channel)"); for (int i = 0; i < service->method_count(); ++i) { auto method = service->method(i); (*vars)["Method"] = method->name(); (*vars)["Idx"] = as_string(i); if (method->NoStreaming()) { (*vars)["StreamingType"] = "NORMAL_RPC"; // NOTE: There is no reason to consider streamed-unary as a separate // category here since this part is setting up the client-side stub // and this appears as a NORMAL_RPC from the client-side. } else if (ClientOnlyStreaming(method.get())) { (*vars)["StreamingType"] = "CLIENT_STREAMING"; } else if (ServerOnlyStreaming(method.get())) { (*vars)["StreamingType"] = "SERVER_STREAMING"; } else { (*vars)["StreamingType"] = "BIDI_STREAMING"; } printer->Print(*vars, ", rpcmethod_$Method$_(" "$prefix$$Service$_method_names[$Idx$], " "::grpc::internal::RpcMethod::$StreamingType$, " "channel" ")\n"); } printer->Print("{}\n\n"); printer->Outdent(); for (int i = 0; i < service->method_count(); ++i) { (*vars)["Idx"] = as_string(i); PrintSourceClientMethod(printer, service->method(i).get(), vars); } printer->Print(*vars, "$ns$$Service$::Service::Service() {\n"); printer->Indent(); for (int i = 0; i < service->method_count(); ++i) { auto method = service->method(i); (*vars)["Idx"] = as_string(i); (*vars)["Method"] = method->name(); (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); if (method->NoStreaming()) { printer->Print( *vars, "AddMethod(new ::grpc::internal::RpcServiceMethod(\n" " $prefix$$Service$_method_names[$Idx$],\n" " ::grpc::internal::RpcMethod::NORMAL_RPC,\n" " new ::grpc::internal::RpcMethodHandler< $ns$$Service$::Service, " "$Request$, " "$Response$>(\n" " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); } else if (ClientOnlyStreaming(method.get())) { printer->Print( *vars, "AddMethod(new ::grpc::internal::RpcServiceMethod(\n" " $prefix$$Service$_method_names[$Idx$],\n" " ::grpc::internal::RpcMethod::CLIENT_STREAMING,\n" " new ::grpc::internal::ClientStreamingHandler< " "$ns$$Service$::Service, $Request$, $Response$>(\n" " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); } else if (ServerOnlyStreaming(method.get())) { printer->Print( *vars, "AddMethod(new ::grpc::internal::RpcServiceMethod(\n" " $prefix$$Service$_method_names[$Idx$],\n" " ::grpc::internal::RpcMethod::SERVER_STREAMING,\n" " new ::grpc::internal::ServerStreamingHandler< " "$ns$$Service$::Service, $Request$, $Response$>(\n" " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); } else if (method->BidiStreaming()) { printer->Print( *vars, "AddMethod(new ::grpc::internal::RpcServiceMethod(\n" " $prefix$$Service$_method_names[$Idx$],\n" " ::grpc::internal::RpcMethod::BIDI_STREAMING,\n" " new ::grpc::internal::BidiStreamingHandler< " "$ns$$Service$::Service, $Request$, $Response$>(\n" " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); } } printer->Outdent(); printer->Print(*vars, "}\n\n"); printer->Print(*vars, "$ns$$Service$::Service::~Service() {\n" "}\n\n"); for (int i = 0; i < service->method_count(); ++i) { (*vars)["Idx"] = as_string(i); PrintSourceServerMethod(printer, service->method(i).get(), vars); } } grpc::string GetSourceServices(grpc_generator::File* file, const Parameters& params) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; // Package string is empty or ends with a dot. It is used to fully qualify // method names. vars["Package"] = file->package(); if (!file->package().empty()) { vars["Package"].append("."); } if (!params.services_namespace.empty()) { vars["ns"] = params.services_namespace + "::"; vars["prefix"] = params.services_namespace; } else { vars["ns"] = ""; vars["prefix"] = ""; } for (int i = 0; i < file->service_count(); ++i) { PrintSourceService(printer.get(), file->service(i).get(), &vars); printer->Print("\n"); } } return output; } grpc::string GetSourceEpilogue(grpc_generator::File* file, const Parameters& /*params*/) { grpc::string temp; if (!file->package().empty()) { std::vector parts = file->package_parts(); for (auto part = parts.begin(); part != parts.end(); part++) { temp.append("} // namespace "); temp.append(*part); temp.append("\n"); } temp.append("\n"); } return temp; } // TODO(mmukhi): Make sure we need parameters or not. grpc::string GetMockPrologue(grpc_generator::File* file, const Parameters& /*params*/) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; vars["filename"] = file->filename(); vars["filename_base"] = file->filename_without_ext(); vars["message_header_ext"] = kCppGeneratorMessageHeaderExt; vars["service_header_ext"] = kCppGeneratorServiceHeaderExt; printer->Print(vars, "// Generated by the gRPC C++ plugin.\n"); printer->Print(vars, "// If you make any local change, they will be lost.\n"); printer->Print(vars, "// source: $filename$\n\n"); printer->Print(vars, "#include \"$filename_base$$message_header_ext$\"\n"); printer->Print(vars, "#include \"$filename_base$$service_header_ext$\"\n"); printer->Print(vars, file->additional_headers().c_str()); printer->Print(vars, "\n"); } return output; } // TODO(mmukhi): Add client-stream and completion-queue headers. grpc::string GetMockIncludes(grpc_generator::File* file, const Parameters& params) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; static const char* headers_strs[] = { "grpcpp/impl/codegen/async_stream.h", "grpcpp/impl/codegen/sync_stream.h", }; std::vector headers(headers_strs, array_end(headers_strs)); PrintIncludes(printer.get(), headers, params.use_system_headers, params.grpc_search_path); std::vector gmock_header; if (params.gmock_search_path.empty()) { gmock_header.push_back("gmock/gmock.h"); PrintIncludes(printer.get(), gmock_header, params.use_system_headers, params.grpc_search_path); } else { gmock_header.push_back("gmock.h"); // We use local includes when a gmock_search_path is given PrintIncludes(printer.get(), gmock_header, false, params.gmock_search_path); } if (!file->package().empty()) { std::vector parts = file->package_parts(); for (auto part = parts.begin(); part != parts.end(); part++) { vars["part"] = *part; printer->Print(vars, "namespace $part$ {\n"); } } printer->Print(vars, "\n"); } return output; } void PrintMockClientMethods(grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { (*vars)["Method"] = method->name(); (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); struct { grpc::string prefix; grpc::string method_params; // extra arguments to method int extra_method_param_count; } async_prefixes[] = {{"Async", ", void* tag", 1}, {"PrepareAsync", "", 0}}; if (method->NoStreaming()) { printer->Print( *vars, "MOCK_METHOD3($Method$, ::grpc::Status(::grpc::ClientContext* context, " "const $Request$& request, $Response$* response));\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; printer->Print( *vars, "MOCK_METHOD3($AsyncPrefix$$Method$Raw, " "::grpc::ClientAsyncResponseReaderInterface< $Response$>*" "(::grpc::ClientContext* context, const $Request$& request, " "::grpc::CompletionQueue* cq));\n"); } } else if (ClientOnlyStreaming(method)) { printer->Print( *vars, "MOCK_METHOD2($Method$Raw, " "::grpc::ClientWriterInterface< $Request$>*" "(::grpc::ClientContext* context, $Response$* response));\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["MockArgs"] = std::to_string(3 + async_prefix.extra_method_param_count); printer->Print(*vars, "MOCK_METHOD$MockArgs$($AsyncPrefix$$Method$Raw, " "::grpc::ClientAsyncWriterInterface< $Request$>*" "(::grpc::ClientContext* context, $Response$* response, " "::grpc::CompletionQueue* cq$AsyncMethodParams$));\n"); } } else if (ServerOnlyStreaming(method)) { printer->Print( *vars, "MOCK_METHOD2($Method$Raw, " "::grpc::ClientReaderInterface< $Response$>*" "(::grpc::ClientContext* context, const $Request$& request));\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["MockArgs"] = std::to_string(3 + async_prefix.extra_method_param_count); printer->Print( *vars, "MOCK_METHOD$MockArgs$($AsyncPrefix$$Method$Raw, " "::grpc::ClientAsyncReaderInterface< $Response$>*" "(::grpc::ClientContext* context, const $Request$& request, " "::grpc::CompletionQueue* cq$AsyncMethodParams$));\n"); } } else if (method->BidiStreaming()) { printer->Print( *vars, "MOCK_METHOD1($Method$Raw, " "::grpc::ClientReaderWriterInterface< $Request$, $Response$>*" "(::grpc::ClientContext* context));\n"); for (auto async_prefix : async_prefixes) { (*vars)["AsyncPrefix"] = async_prefix.prefix; (*vars)["AsyncMethodParams"] = async_prefix.method_params; (*vars)["MockArgs"] = std::to_string(2 + async_prefix.extra_method_param_count); printer->Print( *vars, "MOCK_METHOD$MockArgs$($AsyncPrefix$$Method$Raw, " "::grpc::ClientAsyncReaderWriterInterface<$Request$, $Response$>*" "(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq" "$AsyncMethodParams$));\n"); } } } void PrintMockService(grpc_generator::Printer* printer, const grpc_generator::Service* service, std::map* vars) { (*vars)["Service"] = service->name(); printer->Print(*vars, "class Mock$Service$Stub : public $Service$::StubInterface {\n" " public:\n"); printer->Indent(); for (int i = 0; i < service->method_count(); ++i) { PrintMockClientMethods(printer, service->method(i).get(), vars); } printer->Outdent(); printer->Print("};\n"); } grpc::string GetMockServices(grpc_generator::File* file, const Parameters& params) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. auto printer = file->CreatePrinter(&output); std::map vars; // Package string is empty or ends with a dot. It is used to fully qualify // method names. vars["Package"] = file->package(); if (!file->package().empty()) { vars["Package"].append("."); } if (!params.services_namespace.empty()) { vars["services_namespace"] = params.services_namespace; printer->Print(vars, "\nnamespace $services_namespace$ {\n\n"); } for (int i = 0; i < file->service_count(); i++) { PrintMockService(printer.get(), file->service(i).get(), &vars); printer->Print("\n"); } if (!params.services_namespace.empty()) { printer->Print(vars, "} // namespace $services_namespace$\n\n"); } } return output; } grpc::string GetMockEpilogue(grpc_generator::File* file, const Parameters& /*params*/) { grpc::string temp; if (!file->package().empty()) { std::vector parts = file->package_parts(); for (auto part = parts.begin(); part != parts.end(); part++) { temp.append("} // namespace "); temp.append(*part); temp.append("\n"); } temp.append("\n"); } return temp; } } // namespace grpc_cpp_generator python-grpc-tools-1.14.1/grpc_root/src/compiler/cpp_generator.h000066400000000000000000000107361334102242000246040ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_CPP_GENERATOR_H #define GRPC_INTERNAL_COMPILER_CPP_GENERATOR_H // cpp_generator.h/.cc do not directly depend on GRPC/ProtoBuf, such that they // can be used to generate code for other serialization systems, such as // FlatBuffers. #include #include #include "src/compiler/config.h" #include "src/compiler/schema_interface.h" #ifndef GRPC_CUSTOM_STRING #include #define GRPC_CUSTOM_STRING std::string #endif namespace grpc { typedef GRPC_CUSTOM_STRING string; } // namespace grpc namespace grpc_cpp_generator { // Contains all the parameters that are parsed from the command line. struct Parameters { // Puts the service into a namespace grpc::string services_namespace; // Use system includes (<>) or local includes ("") bool use_system_headers; // Prefix to any grpc include grpc::string grpc_search_path; // Generate Google Mock code to facilitate unit testing. bool generate_mock_code; // Google Mock search path, when non-empty, local includes will be used. grpc::string gmock_search_path; // *EXPERIMENTAL* Additional include files in grpc.pb.h std::vector additional_header_includes; }; // Return the prologue of the generated header file. grpc::string GetHeaderPrologue(grpc_generator::File* file, const Parameters& params); // Return the includes needed for generated header file. grpc::string GetHeaderIncludes(grpc_generator::File* file, const Parameters& params); // Return the includes needed for generated source file. grpc::string GetSourceIncludes(grpc_generator::File* file, const Parameters& params); // Return the epilogue of the generated header file. grpc::string GetHeaderEpilogue(grpc_generator::File* file, const Parameters& params); // Return the prologue of the generated source file. grpc::string GetSourcePrologue(grpc_generator::File* file, const Parameters& params); // Return the services for generated header file. grpc::string GetHeaderServices(grpc_generator::File* file, const Parameters& params); // Return the services for generated source file. grpc::string GetSourceServices(grpc_generator::File* file, const Parameters& params); // Return the epilogue of the generated source file. grpc::string GetSourceEpilogue(grpc_generator::File* file, const Parameters& params); // Return the prologue of the generated mock file. grpc::string GetMockPrologue(grpc_generator::File* file, const Parameters& params); // Return the includes needed for generated mock file. grpc::string GetMockIncludes(grpc_generator::File* file, const Parameters& params); // Return the services for generated mock file. grpc::string GetMockServices(grpc_generator::File* file, const Parameters& params); // Return the epilogue of generated mock file. grpc::string GetMockEpilogue(grpc_generator::File* file, const Parameters& params); // Return the prologue of the generated mock file. grpc::string GetMockPrologue(grpc_generator::File* file, const Parameters& params); // Return the includes needed for generated mock file. grpc::string GetMockIncludes(grpc_generator::File* file, const Parameters& params); // Return the services for generated mock file. grpc::string GetMockServices(grpc_generator::File* file, const Parameters& params); // Return the epilogue of generated mock file. grpc::string GetMockEpilogue(grpc_generator::File* file, const Parameters& params); } // namespace grpc_cpp_generator #endif // GRPC_INTERNAL_COMPILER_CPP_GENERATOR_H python-grpc-tools-1.14.1/grpc_root/src/compiler/cpp_generator_helpers.h000066400000000000000000000042031334102242000263160ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_CPP_GENERATOR_HELPERS_H #define GRPC_INTERNAL_COMPILER_CPP_GENERATOR_HELPERS_H #include #include "src/compiler/config.h" #include "src/compiler/generator_helpers.h" namespace grpc_cpp_generator { inline grpc::string DotsToColons(const grpc::string& name) { return grpc_generator::StringReplace(name, ".", "::"); } inline grpc::string DotsToUnderscores(const grpc::string& name) { return grpc_generator::StringReplace(name, ".", "_"); } inline grpc::string ClassName(const grpc::protobuf::Descriptor* descriptor, bool qualified) { // Find "outer", the descriptor of the top-level message in which // "descriptor" is embedded. const grpc::protobuf::Descriptor* outer = descriptor; while (outer->containing_type() != NULL) outer = outer->containing_type(); const grpc::string& outer_name = outer->full_name(); grpc::string inner_name = descriptor->full_name().substr(outer_name.size()); if (qualified) { return "::" + DotsToColons(outer_name) + DotsToUnderscores(inner_name); } else { return outer->name() + DotsToUnderscores(inner_name); } } // Get leading or trailing comments in a string. Comment lines start with "// ". // Leading detached comments are put in in front of leading comments. template inline grpc::string GetCppComments(const DescriptorType* desc, bool leading) { return grpc_generator::GetPrefixedComments(desc, leading, "//"); } } // namespace grpc_cpp_generator #endif // GRPC_INTERNAL_COMPILER_CPP_GENERATOR_HELPERS_H python-grpc-tools-1.14.1/grpc_root/src/compiler/cpp_plugin.cc000066400000000000000000000140261334102242000242460ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // Generates cpp gRPC service interface out of Protobuf IDL. // #include #include #include "src/compiler/config.h" #include "src/compiler/cpp_generator.h" #include "src/compiler/generator_helpers.h" #include "src/compiler/protobuf_plugin.h" class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { public: CppGrpcGenerator() {} virtual ~CppGrpcGenerator() {} virtual bool Generate(const grpc::protobuf::FileDescriptor* file, const grpc::string& parameter, grpc::protobuf::compiler::GeneratorContext* context, grpc::string* error) const { if (file->options().cc_generic_services()) { *error = "cpp grpc proto compiler plugin does not work with generic " "services. To generate cpp grpc APIs, please set \"" "cc_generic_service = false\"."; return false; } grpc_cpp_generator::Parameters generator_parameters; generator_parameters.use_system_headers = true; generator_parameters.generate_mock_code = false; ProtoBufFile pbfile(file); if (!parameter.empty()) { std::vector parameters_list = grpc_generator::tokenize(parameter, ","); for (auto parameter_string = parameters_list.begin(); parameter_string != parameters_list.end(); parameter_string++) { std::vector param = grpc_generator::tokenize(*parameter_string, "="); if (param[0] == "services_namespace") { generator_parameters.services_namespace = param[1]; } else if (param[0] == "use_system_headers") { if (param[1] == "true") { generator_parameters.use_system_headers = true; } else if (param[1] == "false") { generator_parameters.use_system_headers = false; } else { *error = grpc::string("Invalid parameter: ") + *parameter_string; return false; } } else if (param[0] == "grpc_search_path") { generator_parameters.grpc_search_path = param[1]; } else if (param[0] == "generate_mock_code") { if (param[1] == "true") { generator_parameters.generate_mock_code = true; } else if (param[1] != "false") { *error = grpc::string("Invalid parameter: ") + *parameter_string; return false; } } else if (param[0] == "gmock_search_path") { generator_parameters.gmock_search_path = param[1]; } else if (param[0] == "additional_header_includes") { generator_parameters.additional_header_includes = grpc_generator::tokenize(param[1], ":"); } else { *error = grpc::string("Unknown parameter: ") + *parameter_string; return false; } } } grpc::string file_name = grpc_generator::StripProto(file->name()); grpc::string header_code = grpc_cpp_generator::GetHeaderPrologue(&pbfile, generator_parameters) + grpc_cpp_generator::GetHeaderIncludes(&pbfile, generator_parameters) + grpc_cpp_generator::GetHeaderServices(&pbfile, generator_parameters) + grpc_cpp_generator::GetHeaderEpilogue(&pbfile, generator_parameters); std::unique_ptr header_output( context->Open(file_name + ".grpc.pb.h")); grpc::protobuf::io::CodedOutputStream header_coded_out(header_output.get()); header_coded_out.WriteRaw(header_code.data(), header_code.size()); grpc::string source_code = grpc_cpp_generator::GetSourcePrologue(&pbfile, generator_parameters) + grpc_cpp_generator::GetSourceIncludes(&pbfile, generator_parameters) + grpc_cpp_generator::GetSourceServices(&pbfile, generator_parameters) + grpc_cpp_generator::GetSourceEpilogue(&pbfile, generator_parameters); std::unique_ptr source_output( context->Open(file_name + ".grpc.pb.cc")); grpc::protobuf::io::CodedOutputStream source_coded_out(source_output.get()); source_coded_out.WriteRaw(source_code.data(), source_code.size()); if (!generator_parameters.generate_mock_code) { return true; } grpc::string mock_code = grpc_cpp_generator::GetMockPrologue(&pbfile, generator_parameters) + grpc_cpp_generator::GetMockIncludes(&pbfile, generator_parameters) + grpc_cpp_generator::GetMockServices(&pbfile, generator_parameters) + grpc_cpp_generator::GetMockEpilogue(&pbfile, generator_parameters); std::unique_ptr mock_output( context->Open(file_name + "_mock.grpc.pb.h")); grpc::protobuf::io::CodedOutputStream mock_coded_out(mock_output.get()); mock_coded_out.WriteRaw(mock_code.data(), mock_code.size()); return true; } private: // Insert the given code into the given file at the given insertion point. void Insert(grpc::protobuf::compiler::GeneratorContext* context, const grpc::string& filename, const grpc::string& insertion_point, const grpc::string& code) const { std::unique_ptr output( context->OpenForInsert(filename, insertion_point)); grpc::protobuf::io::CodedOutputStream coded_out(output.get()); coded_out.WriteRaw(code.data(), code.size()); } }; int main(int argc, char* argv[]) { CppGrpcGenerator generator; return grpc::protobuf::compiler::PluginMain(argc, argv, &generator); } python-grpc-tools-1.14.1/grpc_root/src/compiler/csharp_generator.cc000066400000000000000000000615601334102242000254410ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include #include #include #include "src/compiler/config.h" #include "src/compiler/csharp_generator.h" #include "src/compiler/csharp_generator_helpers.h" using google::protobuf::compiler::csharp::GetClassName; using google::protobuf::compiler::csharp::GetFileNamespace; using google::protobuf::compiler::csharp::GetReflectionClassName; using grpc::protobuf::Descriptor; using grpc::protobuf::FileDescriptor; using grpc::protobuf::MethodDescriptor; using grpc::protobuf::ServiceDescriptor; using grpc::protobuf::io::Printer; using grpc::protobuf::io::StringOutputStream; using grpc_generator::GetMethodType; using grpc_generator::METHODTYPE_BIDI_STREAMING; using grpc_generator::METHODTYPE_CLIENT_STREAMING; using grpc_generator::METHODTYPE_NO_STREAMING; using grpc_generator::METHODTYPE_SERVER_STREAMING; using grpc_generator::MethodType; using grpc_generator::StringReplace; using std::map; using std::vector; namespace grpc_csharp_generator { namespace { // This function is a massaged version of // https://github.com/google/protobuf/blob/master/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc // Currently, we cannot easily reuse the functionality as // google/protobuf/compiler/csharp/csharp_doc_comment.h is not a public header. // TODO(jtattermusch): reuse the functionality from google/protobuf. bool GenerateDocCommentBodyImpl(grpc::protobuf::io::Printer* printer, grpc::protobuf::SourceLocation location) { grpc::string comments = location.leading_comments.empty() ? location.trailing_comments : location.leading_comments; if (comments.empty()) { return false; } // 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 = grpc_generator::StringReplace(comments, "&", "&", true); comments = grpc_generator::StringReplace(comments, "<", "<", true); std::vector lines; grpc_generator::Split(comments, '\n', &lines); // 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("/// \n"); bool last_was_empty = false; // We squash multiple blank lines down to one, and remove any trailing blank // lines. We need // to preserve the blank lines themselves, as this is relevant in the // markdown. // Note that we can't remove leading or trailing whitespace as *that's* // relevant in markdown too. // (We don't skip "just whitespace" lines, either.) for (std::vector::iterator it = lines.begin(); it != lines.end(); ++it) { grpc::string line = *it; if (line.empty()) { last_was_empty = true; } else { if (last_was_empty) { printer->Print("///\n"); } last_was_empty = false; printer->Print("///$line$\n", "line", *it); } } printer->Print("/// \n"); return true; } template bool GenerateDocCommentBody(grpc::protobuf::io::Printer* printer, const DescriptorType* descriptor) { grpc::protobuf::SourceLocation location; if (!descriptor->GetSourceLocation(&location)) { return false; } return GenerateDocCommentBodyImpl(printer, location); } void GenerateDocCommentServerMethod(grpc::protobuf::io::Printer* printer, const MethodDescriptor* method) { if (GenerateDocCommentBody(printer, method)) { if (method->client_streaming()) { printer->Print( "/// Used for reading requests from " "the client.\n"); } else { printer->Print( "/// The request received from the " "client.\n"); } if (method->server_streaming()) { printer->Print( "/// Used for sending responses back " "to the client.\n"); } printer->Print( "/// The context of the server-side call " "handler being invoked.\n"); if (method->server_streaming()) { printer->Print( "/// A task indicating completion of the " "handler.\n"); } else { printer->Print( "/// The response to send back to the client (wrapped by a " "task).\n"); } } } void GenerateDocCommentClientMethod(grpc::protobuf::io::Printer* printer, const MethodDescriptor* method, bool is_sync, bool use_call_options) { if (GenerateDocCommentBody(printer, method)) { if (!method->client_streaming()) { printer->Print( "/// The request to send to the " "server.\n"); } if (!use_call_options) { printer->Print( "/// The initial metadata to send with the " "call. This parameter is optional.\n"); printer->Print( "/// An optional deadline for the call. The " "call will be cancelled if deadline is hit.\n"); printer->Print( "/// An optional token for " "canceling the call.\n"); } else { printer->Print( "/// The options for the call.\n"); } if (is_sync) { printer->Print( "/// The response received from the server.\n"); } else { printer->Print("/// The call object.\n"); } } } std::string GetServiceClassName(const ServiceDescriptor* service) { return service->name(); } std::string GetClientClassName(const ServiceDescriptor* service) { return service->name() + "Client"; } std::string GetServerClassName(const ServiceDescriptor* service) { return service->name() + "Base"; } std::string GetCSharpMethodType(MethodType method_type) { switch (method_type) { case METHODTYPE_NO_STREAMING: return "grpc::MethodType.Unary"; case METHODTYPE_CLIENT_STREAMING: return "grpc::MethodType.ClientStreaming"; case METHODTYPE_SERVER_STREAMING: return "grpc::MethodType.ServerStreaming"; case METHODTYPE_BIDI_STREAMING: return "grpc::MethodType.DuplexStreaming"; } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } std::string GetServiceNameFieldName() { return "__ServiceName"; } std::string GetMarshallerFieldName(const Descriptor* message) { return "__Marshaller_" + grpc_generator::StringReplace(message->full_name(), ".", "_", true); } std::string GetMethodFieldName(const MethodDescriptor* method) { return "__Method_" + method->name(); } std::string GetMethodRequestParamMaybe(const MethodDescriptor* method, bool invocation_param = false) { if (method->client_streaming()) { return ""; } if (invocation_param) { return "request, "; } return GetClassName(method->input_type()) + " request, "; } std::string GetAccessLevel(bool internal_access) { return internal_access ? "internal" : "public"; } std::string GetMethodReturnTypeClient(const MethodDescriptor* method) { switch (GetMethodType(method)) { case METHODTYPE_NO_STREAMING: return "grpc::AsyncUnaryCall<" + GetClassName(method->output_type()) + ">"; case METHODTYPE_CLIENT_STREAMING: return "grpc::AsyncClientStreamingCall<" + GetClassName(method->input_type()) + ", " + GetClassName(method->output_type()) + ">"; case METHODTYPE_SERVER_STREAMING: return "grpc::AsyncServerStreamingCall<" + GetClassName(method->output_type()) + ">"; case METHODTYPE_BIDI_STREAMING: return "grpc::AsyncDuplexStreamingCall<" + GetClassName(method->input_type()) + ", " + GetClassName(method->output_type()) + ">"; } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } std::string GetMethodRequestParamServer(const MethodDescriptor* method) { switch (GetMethodType(method)) { case METHODTYPE_NO_STREAMING: case METHODTYPE_SERVER_STREAMING: return GetClassName(method->input_type()) + " request"; case METHODTYPE_CLIENT_STREAMING: case METHODTYPE_BIDI_STREAMING: return "grpc::IAsyncStreamReader<" + GetClassName(method->input_type()) + "> requestStream"; } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } std::string GetMethodReturnTypeServer(const MethodDescriptor* method) { switch (GetMethodType(method)) { case METHODTYPE_NO_STREAMING: case METHODTYPE_CLIENT_STREAMING: return "global::System.Threading.Tasks.Task<" + GetClassName(method->output_type()) + ">"; case METHODTYPE_SERVER_STREAMING: case METHODTYPE_BIDI_STREAMING: return "global::System.Threading.Tasks.Task"; } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } std::string GetMethodResponseStreamMaybe(const MethodDescriptor* method) { switch (GetMethodType(method)) { case METHODTYPE_NO_STREAMING: case METHODTYPE_CLIENT_STREAMING: return ""; case METHODTYPE_SERVER_STREAMING: case METHODTYPE_BIDI_STREAMING: return ", grpc::IServerStreamWriter<" + GetClassName(method->output_type()) + "> responseStream"; } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } // Gets vector of all messages used as input or output types. std::vector GetUsedMessages( const ServiceDescriptor* service) { std::set descriptor_set; std::vector result; // vector is to maintain stable ordering for (int i = 0; i < service->method_count(); i++) { const MethodDescriptor* method = service->method(i); if (descriptor_set.find(method->input_type()) == descriptor_set.end()) { descriptor_set.insert(method->input_type()); result.push_back(method->input_type()); } if (descriptor_set.find(method->output_type()) == descriptor_set.end()) { descriptor_set.insert(method->output_type()); result.push_back(method->output_type()); } } return result; } void GenerateMarshallerFields(Printer* out, const ServiceDescriptor* service) { std::vector used_messages = GetUsedMessages(service); for (size_t i = 0; i < used_messages.size(); i++) { const Descriptor* message = used_messages[i]; out->Print( "static readonly grpc::Marshaller<$type$> $fieldname$ = " "grpc::Marshallers.Create((arg) => " "global::Google.Protobuf.MessageExtensions.ToByteArray(arg), " "$type$.Parser.ParseFrom);\n", "fieldname", GetMarshallerFieldName(message), "type", GetClassName(message)); } out->Print("\n"); } void GenerateStaticMethodField(Printer* out, const MethodDescriptor* method) { out->Print( "static readonly grpc::Method<$request$, $response$> $fieldname$ = new " "grpc::Method<$request$, $response$>(\n", "fieldname", GetMethodFieldName(method), "request", GetClassName(method->input_type()), "response", GetClassName(method->output_type())); out->Indent(); out->Indent(); out->Print("$methodtype$,\n", "methodtype", GetCSharpMethodType(GetMethodType(method))); out->Print("$servicenamefield$,\n", "servicenamefield", GetServiceNameFieldName()); out->Print("\"$methodname$\",\n", "methodname", method->name()); out->Print("$requestmarshaller$,\n", "requestmarshaller", GetMarshallerFieldName(method->input_type())); out->Print("$responsemarshaller$);\n", "responsemarshaller", GetMarshallerFieldName(method->output_type())); out->Print("\n"); out->Outdent(); out->Outdent(); } void GenerateServiceDescriptorProperty(Printer* out, const ServiceDescriptor* service) { std::ostringstream index; index << service->index(); out->Print("/// Service descriptor\n"); out->Print( "public static global::Google.Protobuf.Reflection.ServiceDescriptor " "Descriptor\n"); out->Print("{\n"); out->Print(" get { return $umbrella$.Descriptor.Services[$index$]; }\n", "umbrella", GetReflectionClassName(service->file()), "index", index.str()); out->Print("}\n"); out->Print("\n"); } void GenerateServerClass(Printer* out, const ServiceDescriptor* service) { out->Print( "/// Base class for server-side implementations of " "$servicename$\n", "servicename", GetServiceClassName(service)); out->Print("public abstract partial class $name$\n", "name", GetServerClassName(service)); out->Print("{\n"); out->Indent(); for (int i = 0; i < service->method_count(); i++) { const MethodDescriptor* method = service->method(i); GenerateDocCommentServerMethod(out, method); out->Print( "public virtual $returntype$ " "$methodname$($request$$response_stream_maybe$, " "grpc::ServerCallContext context)\n", "methodname", method->name(), "returntype", GetMethodReturnTypeServer(method), "request", GetMethodRequestParamServer(method), "response_stream_maybe", GetMethodResponseStreamMaybe(method)); out->Print("{\n"); out->Indent(); out->Print( "throw new grpc::RpcException(" "new grpc::Status(grpc::StatusCode.Unimplemented, \"\"));\n"); out->Outdent(); out->Print("}\n\n"); } out->Outdent(); out->Print("}\n"); out->Print("\n"); } void GenerateClientStub(Printer* out, const ServiceDescriptor* service) { out->Print("/// Client for $servicename$\n", "servicename", GetServiceClassName(service)); out->Print("public partial class $name$ : grpc::ClientBase<$name$>\n", "name", GetClientClassName(service)); out->Print("{\n"); out->Indent(); // constructors out->Print( "/// Creates a new client for $servicename$\n" "/// The channel to use to make remote " "calls.\n", "servicename", GetServiceClassName(service)); out->Print("public $name$(grpc::Channel channel) : base(channel)\n", "name", GetClientClassName(service)); out->Print("{\n"); out->Print("}\n"); out->Print( "/// Creates a new client for $servicename$ that uses a custom " "CallInvoker.\n" "/// The callInvoker to use to make remote " "calls.\n", "servicename", GetServiceClassName(service)); out->Print( "public $name$(grpc::CallInvoker callInvoker) : base(callInvoker)\n", "name", GetClientClassName(service)); out->Print("{\n"); out->Print("}\n"); out->Print( "/// Protected parameterless constructor to allow creation" " of test doubles.\n"); out->Print("protected $name$() : base()\n", "name", GetClientClassName(service)); out->Print("{\n"); out->Print("}\n"); out->Print( "/// Protected constructor to allow creation of configured " "clients.\n" "/// The client configuration.\n"); out->Print( "protected $name$(ClientBaseConfiguration configuration)" " : base(configuration)\n", "name", GetClientClassName(service)); out->Print("{\n"); out->Print("}\n\n"); for (int i = 0; i < service->method_count(); i++) { const MethodDescriptor* method = service->method(i); MethodType method_type = GetMethodType(method); if (method_type == METHODTYPE_NO_STREAMING) { // unary calls have an extra synchronous stub method GenerateDocCommentClientMethod(out, method, true, false); out->Print( "public virtual $response$ $methodname$($request$ request, " "grpc::Metadata " "headers = null, global::System.DateTime? deadline = null, " "global::System.Threading.CancellationToken " "cancellationToken = " "default(global::System.Threading.CancellationToken))\n", "methodname", method->name(), "request", GetClassName(method->input_type()), "response", GetClassName(method->output_type())); out->Print("{\n"); out->Indent(); out->Print( "return $methodname$(request, new grpc::CallOptions(headers, " "deadline, " "cancellationToken));\n", "methodname", method->name()); out->Outdent(); out->Print("}\n"); // overload taking CallOptions as a param GenerateDocCommentClientMethod(out, method, true, true); out->Print( "public virtual $response$ $methodname$($request$ request, " "grpc::CallOptions options)\n", "methodname", method->name(), "request", GetClassName(method->input_type()), "response", GetClassName(method->output_type())); out->Print("{\n"); out->Indent(); out->Print( "return CallInvoker.BlockingUnaryCall($methodfield$, null, options, " "request);\n", "methodfield", GetMethodFieldName(method)); out->Outdent(); out->Print("}\n"); } std::string method_name = method->name(); if (method_type == METHODTYPE_NO_STREAMING) { method_name += "Async"; // prevent name clash with synchronous method. } GenerateDocCommentClientMethod(out, method, false, false); out->Print( "public virtual $returntype$ " "$methodname$($request_maybe$grpc::Metadata " "headers = null, global::System.DateTime? deadline = null, " "global::System.Threading.CancellationToken " "cancellationToken = " "default(global::System.Threading.CancellationToken))\n", "methodname", method_name, "request_maybe", GetMethodRequestParamMaybe(method), "returntype", GetMethodReturnTypeClient(method)); out->Print("{\n"); out->Indent(); out->Print( "return $methodname$($request_maybe$new grpc::CallOptions(headers, " "deadline, " "cancellationToken));\n", "methodname", method_name, "request_maybe", GetMethodRequestParamMaybe(method, true)); out->Outdent(); out->Print("}\n"); // overload taking CallOptions as a param GenerateDocCommentClientMethod(out, method, false, true); out->Print( "public virtual $returntype$ " "$methodname$($request_maybe$grpc::CallOptions " "options)\n", "methodname", method_name, "request_maybe", GetMethodRequestParamMaybe(method), "returntype", GetMethodReturnTypeClient(method)); out->Print("{\n"); out->Indent(); switch (GetMethodType(method)) { case METHODTYPE_NO_STREAMING: out->Print( "return CallInvoker.AsyncUnaryCall($methodfield$, null, options, " "request);\n", "methodfield", GetMethodFieldName(method)); break; case METHODTYPE_CLIENT_STREAMING: out->Print( "return CallInvoker.AsyncClientStreamingCall($methodfield$, null, " "options);\n", "methodfield", GetMethodFieldName(method)); break; case METHODTYPE_SERVER_STREAMING: out->Print( "return CallInvoker.AsyncServerStreamingCall($methodfield$, null, " "options, request);\n", "methodfield", GetMethodFieldName(method)); break; case METHODTYPE_BIDI_STREAMING: out->Print( "return CallInvoker.AsyncDuplexStreamingCall($methodfield$, null, " "options);\n", "methodfield", GetMethodFieldName(method)); break; default: GOOGLE_LOG(FATAL) << "Can't get here."; } out->Outdent(); out->Print("}\n"); } // override NewInstance method out->Print( "/// Creates a new instance of client from given " "ClientBaseConfiguration.\n"); out->Print( "protected override $name$ NewInstance(ClientBaseConfiguration " "configuration)\n", "name", GetClientClassName(service)); out->Print("{\n"); out->Indent(); out->Print("return new $name$(configuration);\n", "name", GetClientClassName(service)); out->Outdent(); out->Print("}\n"); out->Outdent(); out->Print("}\n"); out->Print("\n"); } void GenerateBindServiceMethod(Printer* out, const ServiceDescriptor* service) { out->Print( "/// Creates service definition that can be registered with a " "server\n"); out->Print( "/// An object implementing the server-side" " handling logic.\n"); out->Print( "public static grpc::ServerServiceDefinition BindService($implclass$ " "serviceImpl)\n", "implclass", GetServerClassName(service)); out->Print("{\n"); out->Indent(); out->Print("return grpc::ServerServiceDefinition.CreateBuilder()"); out->Indent(); out->Indent(); for (int i = 0; i < service->method_count(); i++) { const MethodDescriptor* method = service->method(i); out->Print("\n.AddMethod($methodfield$, serviceImpl.$methodname$)", "methodfield", GetMethodFieldName(method), "methodname", method->name()); } out->Print(".Build();\n"); out->Outdent(); out->Outdent(); out->Outdent(); out->Print("}\n"); out->Print("\n"); } void GenerateService(Printer* out, const ServiceDescriptor* service, bool generate_client, bool generate_server, bool internal_access) { GenerateDocCommentBody(out, service); out->Print("$access_level$ static partial class $classname$\n", "access_level", GetAccessLevel(internal_access), "classname", GetServiceClassName(service)); out->Print("{\n"); out->Indent(); out->Print("static readonly string $servicenamefield$ = \"$servicename$\";\n", "servicenamefield", GetServiceNameFieldName(), "servicename", service->full_name()); out->Print("\n"); GenerateMarshallerFields(out, service); for (int i = 0; i < service->method_count(); i++) { GenerateStaticMethodField(out, service->method(i)); } GenerateServiceDescriptorProperty(out, service); if (generate_server) { GenerateServerClass(out, service); } if (generate_client) { GenerateClientStub(out, service); } if (generate_server) { GenerateBindServiceMethod(out, service); } out->Outdent(); out->Print("}\n"); } } // anonymous namespace grpc::string GetServices(const FileDescriptor* file, bool generate_client, bool generate_server, bool internal_access) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. StringOutputStream output_stream(&output); Printer out(&output_stream, '$'); // Don't write out any output if there no services, to avoid empty service // files being generated for proto files that don't declare any. if (file->service_count() == 0) { return output; } // Write out a file header. out.Print("// \n"); out.Print( "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"); out.Print("// source: $filename$\n", "filename", file->name()); out.Print("// \n"); // use C++ style as there are no file-level XML comments in .NET grpc::string leading_comments = GetCsharpComments(file, true); if (!leading_comments.empty()) { out.Print("// Original file comments:\n"); out.PrintRaw(leading_comments.c_str()); } out.Print("#pragma warning disable 0414, 1591\n"); out.Print("#region Designer generated code\n"); out.Print("\n"); out.Print("using grpc = global::Grpc.Core;\n"); out.Print("\n"); grpc::string file_namespace = GetFileNamespace(file); if (file_namespace != "") { out.Print("namespace $namespace$ {\n", "namespace", file_namespace); out.Indent(); } for (int i = 0; i < file->service_count(); i++) { GenerateService(&out, file->service(i), generate_client, generate_server, internal_access); } if (file_namespace != "") { out.Outdent(); out.Print("}\n"); } out.Print("#endregion\n"); } return output; } } // namespace grpc_csharp_generator python-grpc-tools-1.14.1/grpc_root/src/compiler/csharp_generator.h000066400000000000000000000021301334102242000252670ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_CSHARP_GENERATOR_H #define GRPC_INTERNAL_COMPILER_CSHARP_GENERATOR_H #include "src/compiler/config.h" #include namespace grpc_csharp_generator { grpc::string GetServices(const grpc::protobuf::FileDescriptor* file, bool generate_client, bool generate_server, bool internal_access); } // namespace grpc_csharp_generator #endif // GRPC_INTERNAL_COMPILER_CSHARP_GENERATOR_H python-grpc-tools-1.14.1/grpc_root/src/compiler/csharp_generator_helpers.h000066400000000000000000000030271334102242000270170ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_CSHARP_GENERATOR_HELPERS_H #define GRPC_INTERNAL_COMPILER_CSHARP_GENERATOR_HELPERS_H #include "src/compiler/config.h" #include "src/compiler/generator_helpers.h" namespace grpc_csharp_generator { inline bool ServicesFilename(const grpc::protobuf::FileDescriptor* file, grpc::string* file_name_or_error) { *file_name_or_error = grpc_generator::FileNameInUpperCamel(file, false) + "Grpc.cs"; return true; } // Get leading or trailing comments in a string. Comment lines start with "// ". // Leading detached comments are put in in front of leading comments. template inline grpc::string GetCsharpComments(const DescriptorType* desc, bool leading) { return grpc_generator::GetPrefixedComments(desc, leading, "//"); } } // namespace grpc_csharp_generator #endif // GRPC_INTERNAL_COMPILER_CSHARP_GENERATOR_HELPERS_H python-grpc-tools-1.14.1/grpc_root/src/compiler/csharp_plugin.cc000066400000000000000000000050621334102242000247440ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // Generates C# gRPC service interface out of Protobuf IDL. #include #include "src/compiler/config.h" #include "src/compiler/csharp_generator.h" #include "src/compiler/csharp_generator_helpers.h" class CSharpGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { public: CSharpGrpcGenerator() {} ~CSharpGrpcGenerator() {} bool Generate(const grpc::protobuf::FileDescriptor* file, const grpc::string& parameter, grpc::protobuf::compiler::GeneratorContext* context, grpc::string* error) const { std::vector > options; grpc::protobuf::compiler::ParseGeneratorParameter(parameter, &options); bool generate_client = true; bool generate_server = true; bool internal_access = false; for (size_t i = 0; i < options.size(); i++) { if (options[i].first == "no_client") { generate_client = false; } else if (options[i].first == "no_server") { generate_server = false; } else if (options[i].first == "internal_access") { internal_access = true; } else { *error = "Unknown generator option: " + options[i].first; return false; } } grpc::string code = grpc_csharp_generator::GetServices( file, generate_client, generate_server, internal_access); if (code.size() == 0) { return true; // don't generate a file if there are no services } // Get output file name. grpc::string file_name; if (!grpc_csharp_generator::ServicesFilename(file, &file_name)) { return false; } std::unique_ptr output( context->Open(file_name)); grpc::protobuf::io::CodedOutputStream coded_out(output.get()); coded_out.WriteRaw(code.data(), code.size()); return true; } }; int main(int argc, char* argv[]) { CSharpGrpcGenerator generator; return grpc::protobuf::compiler::PluginMain(argc, argv, &generator); } python-grpc-tools-1.14.1/grpc_root/src/compiler/generator_helpers.h000066400000000000000000000200261334102242000254550ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_GENERATOR_HELPERS_H #define GRPC_INTERNAL_COMPILER_GENERATOR_HELPERS_H #include #include #include #include #include #include "src/compiler/config.h" namespace grpc_generator { inline bool StripSuffix(grpc::string* filename, const grpc::string& suffix) { if (filename->length() >= suffix.length()) { size_t suffix_pos = filename->length() - suffix.length(); if (filename->compare(suffix_pos, grpc::string::npos, suffix) == 0) { filename->resize(filename->size() - suffix.size()); return true; } } return false; } inline bool StripPrefix(grpc::string* name, const grpc::string& prefix) { if (name->length() >= prefix.length()) { if (name->substr(0, prefix.size()) == prefix) { *name = name->substr(prefix.size()); return true; } } return false; } inline grpc::string StripProto(grpc::string filename) { if (!StripSuffix(&filename, ".protodevel")) { StripSuffix(&filename, ".proto"); } return filename; } inline grpc::string StringReplace(grpc::string str, const grpc::string& from, const grpc::string& to, bool replace_all) { size_t pos = 0; do { pos = str.find(from, pos); if (pos == grpc::string::npos) { break; } str.replace(pos, from.length(), to); pos += to.length(); } while (replace_all); return str; } inline grpc::string StringReplace(grpc::string str, const grpc::string& from, const grpc::string& to) { return StringReplace(str, from, to, true); } inline std::vector tokenize(const grpc::string& input, const grpc::string& delimiters) { std::vector tokens; size_t pos, last_pos = 0; for (;;) { bool done = false; pos = input.find_first_of(delimiters, last_pos); if (pos == grpc::string::npos) { done = true; pos = input.length(); } tokens.push_back(input.substr(last_pos, pos - last_pos)); if (done) return tokens; last_pos = pos + 1; } } inline grpc::string CapitalizeFirstLetter(grpc::string s) { if (s.empty()) { return s; } s[0] = ::toupper(s[0]); return s; } inline grpc::string LowercaseFirstLetter(grpc::string s) { if (s.empty()) { return s; } s[0] = ::tolower(s[0]); return s; } inline grpc::string LowerUnderscoreToUpperCamel(grpc::string str) { std::vector tokens = tokenize(str, "_"); grpc::string result = ""; for (unsigned int i = 0; i < tokens.size(); i++) { result += CapitalizeFirstLetter(tokens[i]); } return result; } inline grpc::string FileNameInUpperCamel( const grpc::protobuf::FileDescriptor* file, bool include_package_path) { std::vector tokens = tokenize(StripProto(file->name()), "/"); grpc::string result = ""; if (include_package_path) { for (unsigned int i = 0; i < tokens.size() - 1; i++) { result += tokens[i] + "/"; } } result += LowerUnderscoreToUpperCamel(tokens.back()); return result; } inline grpc::string FileNameInUpperCamel( const grpc::protobuf::FileDescriptor* file) { return FileNameInUpperCamel(file, true); } enum MethodType { METHODTYPE_NO_STREAMING, METHODTYPE_CLIENT_STREAMING, METHODTYPE_SERVER_STREAMING, METHODTYPE_BIDI_STREAMING }; inline MethodType GetMethodType( const grpc::protobuf::MethodDescriptor* method) { if (method->client_streaming()) { if (method->server_streaming()) { return METHODTYPE_BIDI_STREAMING; } else { return METHODTYPE_CLIENT_STREAMING; } } else { if (method->server_streaming()) { return METHODTYPE_SERVER_STREAMING; } else { return METHODTYPE_NO_STREAMING; } } } inline void Split(const grpc::string& s, char delim, std::vector* append_to) { std::istringstream iss(s); grpc::string piece; while (std::getline(iss, piece)) { append_to->push_back(piece); } } enum CommentType { COMMENTTYPE_LEADING, COMMENTTYPE_TRAILING, COMMENTTYPE_LEADING_DETACHED }; // Get all the raw comments and append each line without newline to out. template inline void GetComment(const DescriptorType* desc, CommentType type, std::vector* out) { grpc::protobuf::SourceLocation location; if (!desc->GetSourceLocation(&location)) { return; } if (type == COMMENTTYPE_LEADING || type == COMMENTTYPE_TRAILING) { const grpc::string& comments = type == COMMENTTYPE_LEADING ? location.leading_comments : location.trailing_comments; Split(comments, '\n', out); } else if (type == COMMENTTYPE_LEADING_DETACHED) { for (unsigned int i = 0; i < location.leading_detached_comments.size(); i++) { Split(location.leading_detached_comments[i], '\n', out); out->push_back(""); } } else { std::cerr << "Unknown comment type " << type << std::endl; abort(); } } // Each raw comment line without newline is appended to out. // For file level leading and detached leading comments, we return comments // above syntax line. Return nothing for trailing comments. template <> inline void GetComment(const grpc::protobuf::FileDescriptor* desc, CommentType type, std::vector* out) { if (type == COMMENTTYPE_TRAILING) { return; } grpc::protobuf::SourceLocation location; std::vector path; path.push_back(grpc::protobuf::FileDescriptorProto::kSyntaxFieldNumber); if (!desc->GetSourceLocation(path, &location)) { return; } if (type == COMMENTTYPE_LEADING) { Split(location.leading_comments, '\n', out); } else if (type == COMMENTTYPE_LEADING_DETACHED) { for (unsigned int i = 0; i < location.leading_detached_comments.size(); i++) { Split(location.leading_detached_comments[i], '\n', out); out->push_back(""); } } else { std::cerr << "Unknown comment type " << type << std::endl; abort(); } } // Add prefix and newline to each comment line and concatenate them together. // Make sure there is a space after the prefix unless the line is empty. inline grpc::string GenerateCommentsWithPrefix( const std::vector& in, const grpc::string& prefix) { std::ostringstream oss; for (auto it = in.begin(); it != in.end(); it++) { const grpc::string& elem = *it; if (elem.empty()) { oss << prefix << "\n"; } else if (elem[0] == ' ') { oss << prefix << elem << "\n"; } else { oss << prefix << " " << elem << "\n"; } } return oss.str(); } template inline grpc::string GetPrefixedComments(const DescriptorType* desc, bool leading, const grpc::string& prefix) { std::vector out; if (leading) { grpc_generator::GetComment( desc, grpc_generator::COMMENTTYPE_LEADING_DETACHED, &out); std::vector leading; grpc_generator::GetComment(desc, grpc_generator::COMMENTTYPE_LEADING, &leading); out.insert(out.end(), leading.begin(), leading.end()); } else { grpc_generator::GetComment(desc, grpc_generator::COMMENTTYPE_TRAILING, &out); } return GenerateCommentsWithPrefix(out, prefix); } } // namespace grpc_generator #endif // GRPC_INTERNAL_COMPILER_GENERATOR_HELPERS_H python-grpc-tools-1.14.1/grpc_root/src/compiler/node_generator.cc000066400000000000000000000244461334102242000251100ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include "src/compiler/config.h" #include "src/compiler/generator_helpers.h" #include "src/compiler/node_generator.h" #include "src/compiler/node_generator_helpers.h" using grpc::protobuf::Descriptor; using grpc::protobuf::FileDescriptor; using grpc::protobuf::MethodDescriptor; using grpc::protobuf::ServiceDescriptor; using grpc::protobuf::io::Printer; using grpc::protobuf::io::StringOutputStream; using std::map; namespace grpc_node_generator { namespace { // Returns the alias we assign to the module of the given .proto filename // when importing. Copied entirely from // github:google/protobuf/src/google/protobuf/compiler/js/js_generator.cc#L154 grpc::string ModuleAlias(const grpc::string filename) { // This scheme could technically cause problems if a file includes any 2 of: // foo/bar_baz.proto // foo_bar_baz.proto // foo_bar/baz.proto // // We'll worry about this problem if/when we actually see it. This name isn't // exposed to users so we can change it later if we need to. grpc::string basename = grpc_generator::StripProto(filename); basename = grpc_generator::StringReplace(basename, "-", "$"); basename = grpc_generator::StringReplace(basename, "/", "_"); basename = grpc_generator::StringReplace(basename, ".", "_"); return basename + "_pb"; } // Given a filename like foo/bar/baz.proto, returns the corresponding JavaScript // message file foo/bar/baz.js grpc::string GetJSMessageFilename(const grpc::string& filename) { grpc::string name = filename; return grpc_generator::StripProto(name) + "_pb.js"; } // Given a filename like foo/bar/baz.proto, returns the root directory // path ../../ grpc::string GetRootPath(const grpc::string& from_filename, const grpc::string& to_filename) { if (to_filename.find("google/protobuf") == 0) { // Well-known types (.proto files in the google/protobuf directory) are // assumed to come from the 'google-protobuf' npm package. We may want to // generalize this exception later by letting others put generated code in // their own npm packages. return "google-protobuf/"; } size_t slashes = std::count(from_filename.begin(), from_filename.end(), '/'); if (slashes == 0) { return "./"; } grpc::string result = ""; for (size_t i = 0; i < slashes; i++) { result += "../"; } return result; } // Return the relative path to load to_file from the directory containing // from_file, assuming that both paths are relative to the same directory grpc::string GetRelativePath(const grpc::string& from_file, const grpc::string& to_file) { return GetRootPath(from_file, to_file) + to_file; } /* Finds all message types used in all services in the file, and returns them * as a map of fully qualified message type name to message descriptor */ map GetAllMessages( const FileDescriptor* file) { map message_types; for (int service_num = 0; service_num < file->service_count(); service_num++) { const ServiceDescriptor* service = file->service(service_num); for (int method_num = 0; method_num < service->method_count(); method_num++) { const MethodDescriptor* method = service->method(method_num); const Descriptor* input_type = method->input_type(); const Descriptor* output_type = method->output_type(); message_types[input_type->full_name()] = input_type; message_types[output_type->full_name()] = output_type; } } return message_types; } grpc::string MessageIdentifierName(const grpc::string& name) { return grpc_generator::StringReplace(name, ".", "_"); } grpc::string NodeObjectPath(const Descriptor* descriptor) { grpc::string module_alias = ModuleAlias(descriptor->file()->name()); grpc::string name = descriptor->full_name(); grpc_generator::StripPrefix(&name, descriptor->file()->package() + "."); return module_alias + "." + name; } // Prints out the message serializer and deserializer functions void PrintMessageTransformer(const Descriptor* descriptor, Printer* out, const Parameters& params) { map template_vars; grpc::string full_name = descriptor->full_name(); template_vars["identifier_name"] = MessageIdentifierName(full_name); template_vars["name"] = full_name; template_vars["node_name"] = NodeObjectPath(descriptor); // Print the serializer out->Print(template_vars, "function serialize_$identifier_name$(arg) {\n"); out->Indent(); out->Print(template_vars, "if (!(arg instanceof $node_name$)) {\n"); out->Indent(); out->Print(template_vars, "throw new Error('Expected argument of type $name$');\n"); out->Outdent(); out->Print("}\n"); if (params.minimum_node_version > 5) { // Node version is > 5, we should use Buffer.from out->Print("return Buffer.from(arg.serializeBinary());\n"); } else { out->Print("return new Buffer(arg.serializeBinary());\n"); } out->Outdent(); out->Print("}\n\n"); // Print the deserializer out->Print(template_vars, "function deserialize_$identifier_name$(buffer_arg) {\n"); out->Indent(); out->Print( template_vars, "return $node_name$.deserializeBinary(new Uint8Array(buffer_arg));\n"); out->Outdent(); out->Print("}\n\n"); } void PrintMethod(const MethodDescriptor* method, Printer* out) { const Descriptor* input_type = method->input_type(); const Descriptor* output_type = method->output_type(); map vars; vars["service_name"] = method->service()->full_name(); vars["name"] = method->name(); vars["input_type"] = NodeObjectPath(input_type); vars["input_type_id"] = MessageIdentifierName(input_type->full_name()); vars["output_type"] = NodeObjectPath(output_type); vars["output_type_id"] = MessageIdentifierName(output_type->full_name()); vars["client_stream"] = method->client_streaming() ? "true" : "false"; vars["server_stream"] = method->server_streaming() ? "true" : "false"; out->Print("{\n"); out->Indent(); out->Print(vars, "path: '/$service_name$/$name$',\n"); out->Print(vars, "requestStream: $client_stream$,\n"); out->Print(vars, "responseStream: $server_stream$,\n"); out->Print(vars, "requestType: $input_type$,\n"); out->Print(vars, "responseType: $output_type$,\n"); out->Print(vars, "requestSerialize: serialize_$input_type_id$,\n"); out->Print(vars, "requestDeserialize: deserialize_$input_type_id$,\n"); out->Print(vars, "responseSerialize: serialize_$output_type_id$,\n"); out->Print(vars, "responseDeserialize: deserialize_$output_type_id$,\n"); out->Outdent(); out->Print("}"); } // Prints out the service descriptor object void PrintService(const ServiceDescriptor* service, Printer* out) { map template_vars; out->Print(GetNodeComments(service, true).c_str()); template_vars["name"] = service->name(); out->Print(template_vars, "var $name$Service = exports.$name$Service = {\n"); out->Indent(); for (int i = 0; i < service->method_count(); i++) { grpc::string method_name = grpc_generator::LowercaseFirstLetter(service->method(i)->name()); out->Print(GetNodeComments(service->method(i), true).c_str()); out->Print("$method_name$: ", "method_name", method_name); PrintMethod(service->method(i), out); out->Print(",\n"); out->Print(GetNodeComments(service->method(i), false).c_str()); } out->Outdent(); out->Print("};\n\n"); out->Print(template_vars, "exports.$name$Client = " "grpc.makeGenericClientConstructor($name$Service);\n"); out->Print(GetNodeComments(service, false).c_str()); } void PrintImports(const FileDescriptor* file, Printer* out) { out->Print("var grpc = require('grpc');\n"); if (file->message_type_count() > 0) { grpc::string file_path = GetRelativePath(file->name(), GetJSMessageFilename(file->name())); out->Print("var $module_alias$ = require('$file_path$');\n", "module_alias", ModuleAlias(file->name()), "file_path", file_path); } for (int i = 0; i < file->dependency_count(); i++) { grpc::string file_path = GetRelativePath( file->name(), GetJSMessageFilename(file->dependency(i)->name())); out->Print("var $module_alias$ = require('$file_path$');\n", "module_alias", ModuleAlias(file->dependency(i)->name()), "file_path", file_path); } out->Print("\n"); } void PrintTransformers(const FileDescriptor* file, Printer* out, const Parameters& params) { map messages = GetAllMessages(file); for (std::map::iterator it = messages.begin(); it != messages.end(); it++) { PrintMessageTransformer(it->second, out, params); } out->Print("\n"); } void PrintServices(const FileDescriptor* file, Printer* out) { for (int i = 0; i < file->service_count(); i++) { PrintService(file->service(i), out); } } } // namespace grpc::string GenerateFile(const FileDescriptor* file, const Parameters& params) { grpc::string output; { StringOutputStream output_stream(&output); Printer out(&output_stream, '$'); if (file->service_count() == 0) { return output; } out.Print("// GENERATED CODE -- DO NOT EDIT!\n\n"); grpc::string leading_comments = GetNodeComments(file, true); if (!leading_comments.empty()) { out.Print("// Original file comments:\n"); out.PrintRaw(leading_comments.c_str()); } out.Print("'use strict';\n"); PrintImports(file, &out); PrintTransformers(file, &out, params); PrintServices(file, &out); out.Print(GetNodeComments(file, false).c_str()); } return output; } } // namespace grpc_node_generator python-grpc-tools-1.14.1/grpc_root/src/compiler/node_generator.h000066400000000000000000000022231334102242000247370ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_NODE_GENERATOR_H #define GRPC_INTERNAL_COMPILER_NODE_GENERATOR_H #include "src/compiler/config.h" namespace grpc_node_generator { // Contains all the parameters that are parsed from the command line. struct Parameters { // Sets the earliest version of nodejs that needs to be supported. int minimum_node_version; }; grpc::string GenerateFile(const grpc::protobuf::FileDescriptor* file, const Parameters& params); } // namespace grpc_node_generator #endif // GRPC_INTERNAL_COMPILER_NODE_GENERATOR_H python-grpc-tools-1.14.1/grpc_root/src/compiler/node_generator_helpers.h000066400000000000000000000026151334102242000264660ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_NODE_GENERATOR_HELPERS_H #define GRPC_INTERNAL_COMPILER_NODE_GENERATOR_HELPERS_H #include #include "src/compiler/config.h" #include "src/compiler/generator_helpers.h" namespace grpc_node_generator { inline grpc::string GetJSServiceFilename(const grpc::string& filename) { return grpc_generator::StripProto(filename) + "_grpc_pb.js"; } // Get leading or trailing comments in a string. Comment lines start with "// ". // Leading detached comments are put in in front of leading comments. template inline grpc::string GetNodeComments(const DescriptorType* desc, bool leading) { return grpc_generator::GetPrefixedComments(desc, leading, "//"); } } // namespace grpc_node_generator #endif // GRPC_INTERNAL_COMPILER_NODE_GENERATOR_HELPERS_H python-grpc-tools-1.14.1/grpc_root/src/compiler/node_plugin.cc000066400000000000000000000051131334102242000244060ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // Generates Node gRPC service interface out of Protobuf IDL. #include #include "src/compiler/config.h" #include "src/compiler/node_generator.h" #include "src/compiler/node_generator_helpers.h" using grpc_node_generator::GenerateFile; using grpc_node_generator::GetJSServiceFilename; class NodeGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { public: NodeGrpcGenerator() {} ~NodeGrpcGenerator() {} bool Generate(const grpc::protobuf::FileDescriptor* file, const grpc::string& parameter, grpc::protobuf::compiler::GeneratorContext* context, grpc::string* error) const { grpc_node_generator::Parameters generator_parameters; generator_parameters.minimum_node_version = 4; if (!parameter.empty()) { std::vector parameters_list = grpc_generator::tokenize(parameter, ","); for (auto parameter_string = parameters_list.begin(); parameter_string != parameters_list.end(); parameter_string++) { std::vector param = grpc_generator::tokenize(*parameter_string, "="); if (param[0] == "minimum_node_version") { sscanf(param[1].c_str(), "%d", &generator_parameters.minimum_node_version); } else { *error = grpc::string("Unknown parameter: ") + *parameter_string; return false; } } } grpc::string code = GenerateFile(file, generator_parameters); if (code.size() == 0) { return true; } // Get output file name grpc::string file_name = GetJSServiceFilename(file->name()); std::unique_ptr output( context->Open(file_name)); grpc::protobuf::io::CodedOutputStream coded_out(output.get()); coded_out.WriteRaw(code.data(), code.size()); return true; } }; int main(int argc, char* argv[]) { NodeGrpcGenerator generator; return grpc::protobuf::compiler::PluginMain(argc, argv, &generator); } python-grpc-tools-1.14.1/grpc_root/src/compiler/objective_c_generator.cc000066400000000000000000000250461334102242000264340ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include #include #include "src/compiler/config.h" #include "src/compiler/objective_c_generator.h" #include "src/compiler/objective_c_generator_helpers.h" #include using ::google::protobuf::compiler::objectivec::ClassName; using ::grpc::protobuf::FileDescriptor; using ::grpc::protobuf::FileDescriptor; using ::grpc::protobuf::MethodDescriptor; using ::grpc::protobuf::ServiceDescriptor; using ::grpc::protobuf::io::Printer; using ::std::map; using ::std::set; namespace grpc_objective_c_generator { namespace { void PrintProtoRpcDeclarationAsPragma( Printer* printer, const MethodDescriptor* method, map< ::grpc::string, ::grpc::string> vars) { vars["client_stream"] = method->client_streaming() ? "stream " : ""; vars["server_stream"] = method->server_streaming() ? "stream " : ""; printer->Print(vars, "#pragma mark $method_name$($client_stream$$request_type$)" " returns ($server_stream$$response_type$)\n\n"); } template static void PrintAllComments(const DescriptorType* desc, Printer* printer) { std::vector comments; grpc_generator::GetComment(desc, grpc_generator::COMMENTTYPE_LEADING_DETACHED, &comments); grpc_generator::GetComment(desc, grpc_generator::COMMENTTYPE_LEADING, &comments); grpc_generator::GetComment(desc, grpc_generator::COMMENTTYPE_TRAILING, &comments); if (comments.empty()) { return; } printer->Print("/**\n"); for (auto it = comments.begin(); it != comments.end(); ++it) { printer->Print(" * "); size_t start_pos = it->find_first_not_of(' '); if (start_pos != grpc::string::npos) { printer->PrintRaw(it->c_str() + start_pos); } printer->Print("\n"); } printer->Print(" */\n"); } void PrintMethodSignature(Printer* printer, const MethodDescriptor* method, const map< ::grpc::string, ::grpc::string>& vars) { // Print comment PrintAllComments(method, printer); printer->Print(vars, "- ($return_type$)$method_name$With"); if (method->client_streaming()) { printer->Print("RequestsWriter:(GRXWriter *)requestWriter"); } else { printer->Print(vars, "Request:($request_class$ *)request"); } // TODO(jcanizales): Put this on a new line and align colons. if (method->server_streaming()) { printer->Print(vars, " eventHandler:(void(^)(BOOL done, " "$response_class$ *_Nullable response, NSError *_Nullable " "error))eventHandler"); } else { printer->Print(vars, " handler:(void(^)($response_class$ *_Nullable response, " "NSError *_Nullable error))handler"); } } void PrintSimpleSignature(Printer* printer, const MethodDescriptor* method, map< ::grpc::string, ::grpc::string> vars) { vars["method_name"] = grpc_generator::LowercaseFirstLetter(vars["method_name"]); vars["return_type"] = "void"; PrintMethodSignature(printer, method, vars); } void PrintAdvancedSignature(Printer* printer, const MethodDescriptor* method, map< ::grpc::string, ::grpc::string> vars) { vars["method_name"] = "RPCTo" + vars["method_name"]; vars["return_type"] = "GRPCProtoCall *"; PrintMethodSignature(printer, method, vars); } inline map< ::grpc::string, ::grpc::string> GetMethodVars( const MethodDescriptor* method) { map< ::grpc::string, ::grpc::string> res; res["method_name"] = method->name(); res["request_type"] = method->input_type()->name(); res["response_type"] = method->output_type()->name(); res["request_class"] = ClassName(method->input_type()); res["response_class"] = ClassName(method->output_type()); return res; } void PrintMethodDeclarations(Printer* printer, const MethodDescriptor* method) { map< ::grpc::string, ::grpc::string> vars = GetMethodVars(method); PrintProtoRpcDeclarationAsPragma(printer, method, vars); PrintSimpleSignature(printer, method, vars); printer->Print(";\n\n"); PrintAdvancedSignature(printer, method, vars); printer->Print(";\n\n\n"); } void PrintSimpleImplementation(Printer* printer, const MethodDescriptor* method, map< ::grpc::string, ::grpc::string> vars) { printer->Print("{\n"); printer->Print(vars, " [[self RPCTo$method_name$With"); if (method->client_streaming()) { printer->Print("RequestsWriter:requestWriter"); } else { printer->Print("Request:request"); } if (method->server_streaming()) { printer->Print(" eventHandler:eventHandler] start];\n"); } else { printer->Print(" handler:handler] start];\n"); } printer->Print("}\n"); } void PrintAdvancedImplementation(Printer* printer, const MethodDescriptor* method, map< ::grpc::string, ::grpc::string> vars) { printer->Print("{\n"); printer->Print(vars, " return [self RPCToMethod:@\"$method_name$\"\n"); printer->Print(" requestsWriter:"); if (method->client_streaming()) { printer->Print("requestWriter\n"); } else { printer->Print("[GRXWriter writerWithValue:request]\n"); } printer->Print(vars, " responseClass:[$response_class$ class]\n"); printer->Print(" responsesWriteable:[GRXWriteable "); if (method->server_streaming()) { printer->Print("writeableWithEventHandler:eventHandler]];\n"); } else { printer->Print("writeableWithSingleHandler:handler]];\n"); } printer->Print("}\n"); } void PrintMethodImplementations(Printer* printer, const MethodDescriptor* method) { map< ::grpc::string, ::grpc::string> vars = GetMethodVars(method); PrintProtoRpcDeclarationAsPragma(printer, method, vars); // TODO(jcanizales): Print documentation from the method. PrintSimpleSignature(printer, method, vars); PrintSimpleImplementation(printer, method, vars); printer->Print("// Returns a not-yet-started RPC object.\n"); PrintAdvancedSignature(printer, method, vars); PrintAdvancedImplementation(printer, method, vars); } } // namespace ::grpc::string GetAllMessageClasses(const FileDescriptor* file) { ::grpc::string output; set< ::grpc::string> classes; for (int i = 0; i < file->service_count(); i++) { const auto service = file->service(i); for (int i = 0; i < service->method_count(); i++) { const auto method = service->method(i); classes.insert(ClassName(method->input_type())); classes.insert(ClassName(method->output_type())); } } for (auto one_class : classes) { output += "@class " + one_class + ";\n"; } return output; } ::grpc::string GetProtocol(const ServiceDescriptor* service) { ::grpc::string output; // Scope the output stream so it closes and finalizes output to the string. grpc::protobuf::io::StringOutputStream output_stream(&output); Printer printer(&output_stream, '$'); map< ::grpc::string, ::grpc::string> vars = { {"service_class", ServiceClassName(service)}}; printer.Print(vars, "@protocol $service_class$ \n\n"); for (int i = 0; i < service->method_count(); i++) { PrintMethodDeclarations(&printer, service->method(i)); } printer.Print("@end\n\n"); return output; } ::grpc::string GetInterface(const ServiceDescriptor* service) { ::grpc::string output; // Scope the output stream so it closes and finalizes output to the string. grpc::protobuf::io::StringOutputStream output_stream(&output); Printer printer(&output_stream, '$'); map< ::grpc::string, ::grpc::string> vars = { {"service_class", ServiceClassName(service)}}; printer.Print(vars, "/**\n" " * Basic service implementation, over gRPC, that only does\n" " * marshalling and parsing.\n" " */\n"); printer.Print(vars, "@interface $service_class$ :" " GRPCProtoService<$service_class$>\n"); printer.Print( "- (instancetype)initWithHost:(NSString *)host" " NS_DESIGNATED_INITIALIZER;\n"); printer.Print("+ (instancetype)serviceWithHost:(NSString *)host;\n"); printer.Print("@end\n"); return output; } ::grpc::string GetSource(const ServiceDescriptor* service) { ::grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. grpc::protobuf::io::StringOutputStream output_stream(&output); Printer printer(&output_stream, '$'); map< ::grpc::string, ::grpc::string> vars = { {"service_name", service->name()}, {"service_class", ServiceClassName(service)}, {"package", service->file()->package()}}; printer.Print(vars, "@implementation $service_class$\n\n" "// Designated initializer\n" "- (instancetype)initWithHost:(NSString *)host {\n" " self = [super initWithHost:host\n" " packageName:@\"$package$\"\n" " serviceName:@\"$service_name$\"];\n" " return self;\n" "}\n\n"); printer.Print( "// Override superclass initializer to disallow different" " package and service names.\n" "- (instancetype)initWithHost:(NSString *)host\n" " packageName:(NSString *)packageName\n" " serviceName:(NSString *)serviceName {\n" " return [self initWithHost:host];\n" "}\n\n"); printer.Print( "#pragma mark - Class Methods\n\n" "+ (instancetype)serviceWithHost:(NSString *)host {\n" " return [[self alloc] initWithHost:host];\n" "}\n\n"); printer.Print("#pragma mark - Method Implementations\n\n"); for (int i = 0; i < service->method_count(); i++) { PrintMethodImplementations(&printer, service->method(i)); } printer.Print("@end\n"); } return output; } } // namespace grpc_objective_c_generator python-grpc-tools-1.14.1/grpc_root/src/compiler/objective_c_generator.h000066400000000000000000000032631334102242000262730ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_OBJECTIVE_C_GENERATOR_H #define GRPC_INTERNAL_COMPILER_OBJECTIVE_C_GENERATOR_H #include "src/compiler/config.h" namespace grpc_objective_c_generator { using ::grpc::protobuf::FileDescriptor; using ::grpc::protobuf::FileDescriptor; using ::grpc::protobuf::ServiceDescriptor; using ::grpc::string; // Returns forward declaration of classes in the generated header file. string GetAllMessageClasses(const FileDescriptor* file); // Returns the content to be included defining the @protocol segment at the // insertion point of the generated implementation file. string GetProtocol(const ServiceDescriptor* service); // Returns the content to be included defining the @interface segment at the // insertion point of the generated implementation file. string GetInterface(const ServiceDescriptor* service); // Returns the content to be included in the "global_scope" insertion point of // the generated implementation file. string GetSource(const ServiceDescriptor* service); } // namespace grpc_objective_c_generator #endif // GRPC_INTERNAL_COMPILER_OBJECTIVE_C_GENERATOR_H python-grpc-tools-1.14.1/grpc_root/src/compiler/objective_c_generator_helpers.h000066400000000000000000000061451334102242000300170ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_OBJECTIVE_C_GENERATOR_HELPERS_H #define GRPC_INTERNAL_COMPILER_OBJECTIVE_C_GENERATOR_HELPERS_H #include #include "src/compiler/config.h" #include "src/compiler/generator_helpers.h" #include namespace grpc_objective_c_generator { using ::grpc::protobuf::FileDescriptor; using ::grpc::protobuf::ServiceDescriptor; using ::grpc::string; inline string MessageHeaderName(const FileDescriptor* file) { return google::protobuf::compiler::objectivec::FilePath(file) + ".pbobjc.h"; } inline string ServiceClassName(const ServiceDescriptor* service) { const FileDescriptor* file = service->file(); string prefix = file->options().objc_class_prefix(); return prefix + service->name(); } inline ::grpc::string LocalImport(const ::grpc::string& import) { return ::grpc::string("#import \"" + import + "\"\n"); } inline ::grpc::string SystemImport(const ::grpc::string& import) { return ::grpc::string("#import <" + import + ">\n"); } inline ::grpc::string PreprocConditional(::grpc::string symbol, bool invert) { return invert ? "!defined(" + symbol + ") || !" + symbol : "defined(" + symbol + ") && " + symbol; } inline ::grpc::string PreprocIf(const ::grpc::string& symbol, const ::grpc::string& if_true) { return ::grpc::string("#if " + PreprocConditional(symbol, false) + "\n" + if_true + "#endif\n"); } inline ::grpc::string PreprocIfNot(const ::grpc::string& symbol, const ::grpc::string& if_true) { return ::grpc::string("#if " + PreprocConditional(symbol, true) + "\n" + if_true + "#endif\n"); } inline ::grpc::string PreprocIfElse(const ::grpc::string& symbol, const ::grpc::string& if_true, const ::grpc::string& if_false) { return ::grpc::string("#if " + PreprocConditional(symbol, false) + "\n" + if_true + "#else\n" + if_false + "#endif\n"); } inline ::grpc::string PreprocIfNotElse(const ::grpc::string& symbol, const ::grpc::string& if_true, const ::grpc::string& if_false) { return ::grpc::string("#if " + PreprocConditional(symbol, true) + "\n" + if_true + "#else\n" + if_false + "#endif\n"); } } // namespace grpc_objective_c_generator #endif // GRPC_INTERNAL_COMPILER_OBJECTIVE_C_GENERATOR_HELPERS_H python-grpc-tools-1.14.1/grpc_root/src/compiler/objective_c_plugin.cc000066400000000000000000000142601334102242000257400ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // Generates Objective C gRPC service interface out of Protobuf IDL. #include #include "src/compiler/config.h" #include "src/compiler/objective_c_generator.h" #include "src/compiler/objective_c_generator_helpers.h" #include using ::google::protobuf::compiler::objectivec:: IsProtobufLibraryBundledProtoFile; using ::google::protobuf::compiler::objectivec::ProtobufLibraryFrameworkName; using ::grpc_objective_c_generator::LocalImport; using ::grpc_objective_c_generator::PreprocIfElse; using ::grpc_objective_c_generator::PreprocIfNot; using ::grpc_objective_c_generator::SystemImport; namespace { inline ::grpc::string ImportProtoHeaders( const grpc::protobuf::FileDescriptor* dep, const char* indent) { ::grpc::string header = grpc_objective_c_generator::MessageHeaderName(dep); if (!IsProtobufLibraryBundledProtoFile(dep)) { return indent + LocalImport(header); } ::grpc::string base_name = header; grpc_generator::StripPrefix(&base_name, "google/protobuf/"); // create the import code snippet ::grpc::string framework_header = ::grpc::string(ProtobufLibraryFrameworkName) + "/" + base_name; static const ::grpc::string kFrameworkImportsCondition = "GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS"; return PreprocIfElse(kFrameworkImportsCondition, indent + SystemImport(framework_header), indent + LocalImport(header)); } } // namespace class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { public: ObjectiveCGrpcGenerator() {} virtual ~ObjectiveCGrpcGenerator() {} public: virtual bool Generate(const grpc::protobuf::FileDescriptor* file, const ::grpc::string& parameter, grpc::protobuf::compiler::GeneratorContext* context, ::grpc::string* error) const { if (file->service_count() == 0) { // No services. Do nothing. return true; } static const ::grpc::string kNonNullBegin = "NS_ASSUME_NONNULL_BEGIN\n"; static const ::grpc::string kNonNullEnd = "NS_ASSUME_NONNULL_END\n"; static const ::grpc::string kProtocolOnly = "GPB_GRPC_PROTOCOL_ONLY"; static const ::grpc::string kForwardDeclare = "GPB_GRPC_FORWARD_DECLARE_MESSAGE_PROTO"; ::grpc::string file_name = google::protobuf::compiler::objectivec::FilePath(file); { // Generate .pbrpc.h ::grpc::string imports = LocalImport(file_name + ".pbobjc.h"); ::grpc::string system_imports = SystemImport("ProtoRPC/ProtoService.h") + SystemImport("ProtoRPC/ProtoRPC.h") + SystemImport("RxLibrary/GRXWriteable.h") + SystemImport("RxLibrary/GRXWriter.h"); ::grpc::string forward_declarations = "@class GRPCProtoCall;\n\n"; ::grpc::string class_declarations = grpc_objective_c_generator::GetAllMessageClasses(file); ::grpc::string class_imports; for (int i = 0; i < file->dependency_count(); i++) { class_imports += ImportProtoHeaders(file->dependency(i), " "); } ::grpc::string protocols; for (int i = 0; i < file->service_count(); i++) { const grpc::protobuf::ServiceDescriptor* service = file->service(i); protocols += grpc_objective_c_generator::GetProtocol(service); } ::grpc::string interfaces; for (int i = 0; i < file->service_count(); i++) { const grpc::protobuf::ServiceDescriptor* service = file->service(i); interfaces += grpc_objective_c_generator::GetInterface(service); } Write(context, file_name + ".pbrpc.h", PreprocIfNot(kForwardDeclare, imports) + "\n" + PreprocIfNot(kProtocolOnly, system_imports) + "\n" + class_declarations + "\n" + PreprocIfNot(kForwardDeclare, class_imports) + "\n" + forward_declarations + "\n" + kNonNullBegin + "\n" + protocols + "\n" + PreprocIfNot(kProtocolOnly, interfaces) + "\n" + kNonNullEnd + "\n"); } { // Generate .pbrpc.m ::grpc::string imports = LocalImport(file_name + ".pbrpc.h") + LocalImport(file_name + ".pbobjc.h") + SystemImport("ProtoRPC/ProtoRPC.h") + SystemImport("RxLibrary/GRXWriter+Immediate.h"); ::grpc::string class_imports; for (int i = 0; i < file->dependency_count(); i++) { class_imports += ImportProtoHeaders(file->dependency(i), ""); } ::grpc::string definitions; for (int i = 0; i < file->service_count(); i++) { const grpc::protobuf::ServiceDescriptor* service = file->service(i); definitions += grpc_objective_c_generator::GetSource(service); } Write(context, file_name + ".pbrpc.m", PreprocIfNot(kProtocolOnly, imports + "\n" + class_imports + "\n" + definitions)); } return true; } private: // Write the given code into the given file. void Write(grpc::protobuf::compiler::GeneratorContext* context, const ::grpc::string& filename, const ::grpc::string& code) const { std::unique_ptr output( context->Open(filename)); grpc::protobuf::io::CodedOutputStream coded_out(output.get()); coded_out.WriteRaw(code.data(), code.size()); } }; int main(int argc, char* argv[]) { ObjectiveCGrpcGenerator generator; return grpc::protobuf::compiler::PluginMain(argc, argv, &generator); } python-grpc-tools-1.14.1/grpc_root/src/compiler/php_generator.cc000066400000000000000000000141321334102242000247410ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include #include "src/compiler/config.h" #include "src/compiler/generator_helpers.h" #include "src/compiler/php_generator_helpers.h" using google::protobuf::compiler::php::GeneratedClassName; using grpc::protobuf::Descriptor; using grpc::protobuf::FileDescriptor; using grpc::protobuf::MethodDescriptor; using grpc::protobuf::ServiceDescriptor; using grpc::protobuf::io::Printer; using grpc::protobuf::io::StringOutputStream; using std::map; namespace grpc_php_generator { namespace { grpc::string ConvertToPhpNamespace(const grpc::string& name) { std::vector tokens = grpc_generator::tokenize(name, "."); std::ostringstream oss; for (unsigned int i = 0; i < tokens.size(); i++) { oss << (i == 0 ? "" : "\\") << grpc_generator::CapitalizeFirstLetter(tokens[i]); } return oss.str(); } grpc::string PackageName(const FileDescriptor* file) { if (file->options().has_php_namespace()) { return file->options().php_namespace(); } else { return ConvertToPhpNamespace(file->package()); } } grpc::string MessageIdentifierName(const grpc::string& name, const FileDescriptor* file) { std::vector tokens = grpc_generator::tokenize(name, "."); std::ostringstream oss; if (PackageName(file) != "") { oss << PackageName(file) << "\\"; } oss << grpc_generator::CapitalizeFirstLetter(tokens[tokens.size() - 1]); return oss.str(); } void PrintMethod(const MethodDescriptor* method, Printer* out) { const Descriptor* input_type = method->input_type(); const Descriptor* output_type = method->output_type(); map vars; vars["service_name"] = method->service()->full_name(); vars["name"] = method->name(); vars["input_type_id"] = MessageIdentifierName(GeneratedClassName(input_type), input_type->file()); vars["output_type_id"] = MessageIdentifierName( GeneratedClassName(output_type), output_type->file()); out->Print("/**\n"); out->Print(GetPHPComments(method, " *").c_str()); if (method->client_streaming()) { out->Print(vars, " * @param array $$metadata metadata\n" " * @param array $$options call options\n */\n" "public function $name$($$metadata = [], " "$$options = []) {\n"); out->Indent(); out->Indent(); if (method->server_streaming()) { out->Print("return $$this->_bidiRequest("); } else { out->Print("return $$this->_clientStreamRequest("); } out->Print(vars, "'/$service_name$/$name$',\n" "['\\$output_type_id$','decode'],\n" "$$metadata, $$options);\n"); } else { out->Print(vars, " * @param \\$input_type_id$ $$argument input argument\n" " * @param array $$metadata metadata\n" " * @param array $$options call options\n */\n" "public function $name$(\\$input_type_id$ $$argument,\n" " $$metadata = [], $$options = []) {\n"); out->Indent(); out->Indent(); if (method->server_streaming()) { out->Print("return $$this->_serverStreamRequest("); } else { out->Print("return $$this->_simpleRequest("); } out->Print(vars, "'/$service_name$/$name$',\n" "$$argument,\n" "['\\$output_type_id$', 'decode'],\n" "$$metadata, $$options);\n"); } out->Outdent(); out->Outdent(); out->Print("}\n\n"); } // Prints out the service descriptor object void PrintService(const ServiceDescriptor* service, const grpc::string& class_suffix, Printer* out) { map vars; out->Print("/**\n"); out->Print(GetPHPComments(service, " *").c_str()); out->Print(" */\n"); vars["name"] = GetPHPServiceClassname(service, class_suffix); out->Print(vars, "class $name$ extends \\Grpc\\BaseStub {\n\n"); out->Indent(); out->Indent(); out->Print( "/**\n * @param string $$hostname hostname\n" " * @param array $$opts channel options\n" " * @param \\Grpc\\Channel $$channel (optional) re-use channel " "object\n */\n" "public function __construct($$hostname, $$opts, " "$$channel = null) {\n"); out->Indent(); out->Indent(); out->Print("parent::__construct($$hostname, $$opts, $$channel);\n"); out->Outdent(); out->Outdent(); out->Print("}\n\n"); for (int i = 0; i < service->method_count(); i++) { grpc::string method_name = grpc_generator::LowercaseFirstLetter(service->method(i)->name()); PrintMethod(service->method(i), out); } out->Outdent(); out->Outdent(); out->Print("}\n"); } } // namespace grpc::string GenerateFile(const FileDescriptor* file, const ServiceDescriptor* service, const grpc::string& class_suffix) { grpc::string output; { StringOutputStream output_stream(&output); Printer out(&output_stream, '$'); out.Print(" vars; grpc::string php_namespace = PackageName(file); vars["package"] = php_namespace; out.Print(vars, "namespace $package$;\n\n"); PrintService(service, class_suffix, &out); } return output; } } // namespace grpc_php_generator python-grpc-tools-1.14.1/grpc_root/src/compiler/php_generator.h000066400000000000000000000020431334102242000246010ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_PHP_GENERATOR_H #define GRPC_INTERNAL_COMPILER_PHP_GENERATOR_H #include "src/compiler/config.h" namespace grpc_php_generator { grpc::string GenerateFile(const grpc::protobuf::FileDescriptor* file, const grpc::protobuf::ServiceDescriptor* service, const grpc::string& class_suffix); } // namespace grpc_php_generator #endif // GRPC_INTERNAL_COMPILER_PHP_GENERATOR_H python-grpc-tools-1.14.1/grpc_root/src/compiler/php_generator_helpers.h000066400000000000000000000051231334102242000263250ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_PHP_GENERATOR_HELPERS_H #define GRPC_INTERNAL_COMPILER_PHP_GENERATOR_HELPERS_H #include #include "src/compiler/config.h" #include "src/compiler/generator_helpers.h" namespace grpc_php_generator { inline grpc::string GetPHPServiceClassname( const grpc::protobuf::ServiceDescriptor* service, const grpc::string& class_suffix) { return service->name() + (class_suffix == "" ? "Client" : class_suffix); } // ReplaceAll replaces all instances of search with replace in s. inline grpc::string ReplaceAll(grpc::string s, const grpc::string& search, const grpc::string& replace) { size_t pos = 0; while ((pos = s.find(search, pos)) != grpc::string::npos) { s.replace(pos, search.length(), replace); pos += replace.length(); } return s; } inline grpc::string GetPHPServiceFilename( const grpc::protobuf::FileDescriptor* file, const grpc::protobuf::ServiceDescriptor* service, const grpc::string& class_suffix) { std::ostringstream oss; if (file->options().has_php_namespace()) { oss << ReplaceAll(file->options().php_namespace(), "\\", "/"); } else { std::vector tokens = grpc_generator::tokenize(file->package(), "."); for (unsigned int i = 0; i < tokens.size(); i++) { oss << (i == 0 ? "" : "/") << grpc_generator::CapitalizeFirstLetter(tokens[i]); } } return oss.str() + "/" + GetPHPServiceClassname(service, class_suffix) + ".php"; } // Get leading or trailing comments in a string. Comment lines start with "// ". // Leading detached comments are put in in front of leading comments. template inline grpc::string GetPHPComments(const DescriptorType* desc, grpc::string prefix) { return ReplaceAll(grpc_generator::GetPrefixedComments(desc, true, prefix), "*/", "*/"); } } // namespace grpc_php_generator #endif // GRPC_INTERNAL_COMPILER_PHP_GENERATOR_HELPERS_H python-grpc-tools-1.14.1/grpc_root/src/compiler/php_plugin.cc000066400000000000000000000046101334102242000242510ustar00rootroot00000000000000/* * * Copyright 2016 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // Generates PHP gRPC service interface out of Protobuf IDL. #include #include "src/compiler/config.h" #include "src/compiler/php_generator.h" #include "src/compiler/php_generator_helpers.h" using google::protobuf::compiler::ParseGeneratorParameter; using grpc_php_generator::GenerateFile; using grpc_php_generator::GetPHPServiceFilename; class PHPGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { public: PHPGrpcGenerator() {} ~PHPGrpcGenerator() {} bool Generate(const grpc::protobuf::FileDescriptor* file, const grpc::string& parameter, grpc::protobuf::compiler::GeneratorContext* context, grpc::string* error) const { if (file->service_count() == 0) { return true; } std::vector > options; ParseGeneratorParameter(parameter, &options); grpc::string class_suffix; for (size_t i = 0; i < options.size(); ++i) { if (options[i].first == "class_suffix") { class_suffix = options[i].second; } else { *error = "unsupported options: " + options[i].first; return false; } } for (int i = 0; i < file->service_count(); i++) { grpc::string code = GenerateFile(file, file->service(i), class_suffix); // Get output file name grpc::string file_name = GetPHPServiceFilename(file, file->service(i), class_suffix); std::unique_ptr output( context->Open(file_name)); grpc::protobuf::io::CodedOutputStream coded_out(output.get()); coded_out.WriteRaw(code.data(), code.size()); } return true; } }; int main(int argc, char* argv[]) { PHPGrpcGenerator generator; return grpc::protobuf::compiler::PluginMain(argc, argv, &generator); } python-grpc-tools-1.14.1/grpc_root/src/compiler/protobuf_plugin.h000066400000000000000000000146561334102242000251770ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_PROTOBUF_PLUGIN_H #define GRPC_INTERNAL_COMPILER_PROTOBUF_PLUGIN_H #include "src/compiler/config.h" #include "src/compiler/cpp_generator_helpers.h" #include "src/compiler/python_generator_helpers.h" #include "src/compiler/python_private_generator.h" #include "src/compiler/schema_interface.h" #include // Get leading or trailing comments in a string. template inline grpc::string GetCommentsHelper(const DescriptorType* desc, bool leading, const grpc::string& prefix) { return grpc_generator::GetPrefixedComments(desc, leading, prefix); } class ProtoBufMethod : public grpc_generator::Method { public: ProtoBufMethod(const grpc::protobuf::MethodDescriptor* method) : method_(method) {} grpc::string name() const { return method_->name(); } grpc::string input_type_name() const { return grpc_cpp_generator::ClassName(method_->input_type(), true); } grpc::string output_type_name() const { return grpc_cpp_generator::ClassName(method_->output_type(), true); } grpc::string get_input_type_name() const { return method_->input_type()->file()->name(); } grpc::string get_output_type_name() const { return method_->output_type()->file()->name(); } bool get_module_and_message_path_input(grpc::string* str, grpc::string generator_file_name, bool generate_in_pb2_grpc, grpc::string import_prefix) const { return grpc_python_generator::GetModuleAndMessagePath( method_->input_type(), str, generator_file_name, generate_in_pb2_grpc, import_prefix); } bool get_module_and_message_path_output(grpc::string* str, grpc::string generator_file_name, bool generate_in_pb2_grpc, grpc::string import_prefix) const { return grpc_python_generator::GetModuleAndMessagePath( method_->output_type(), str, generator_file_name, generate_in_pb2_grpc, import_prefix); } bool NoStreaming() const { return !method_->client_streaming() && !method_->server_streaming(); } bool ClientStreaming() const { return method_->client_streaming(); } bool ServerStreaming() const { return method_->server_streaming(); } bool BidiStreaming() const { return method_->client_streaming() && method_->server_streaming(); } grpc::string GetLeadingComments(const grpc::string prefix) const { return GetCommentsHelper(method_, true, prefix); } grpc::string GetTrailingComments(const grpc::string prefix) const { return GetCommentsHelper(method_, false, prefix); } vector GetAllComments() const { return grpc_python_generator::get_all_comments(method_); } private: const grpc::protobuf::MethodDescriptor* method_; }; class ProtoBufService : public grpc_generator::Service { public: ProtoBufService(const grpc::protobuf::ServiceDescriptor* service) : service_(service) {} grpc::string name() const { return service_->name(); } int method_count() const { return service_->method_count(); }; std::unique_ptr method(int i) const { return std::unique_ptr( new ProtoBufMethod(service_->method(i))); }; grpc::string GetLeadingComments(const grpc::string prefix) const { return GetCommentsHelper(service_, true, prefix); } grpc::string GetTrailingComments(const grpc::string prefix) const { return GetCommentsHelper(service_, false, prefix); } vector GetAllComments() const { return grpc_python_generator::get_all_comments(service_); } private: const grpc::protobuf::ServiceDescriptor* service_; }; class ProtoBufPrinter : public grpc_generator::Printer { public: ProtoBufPrinter(grpc::string* str) : output_stream_(str), printer_(&output_stream_, '$') {} void Print(const std::map& vars, const char* string_template) { printer_.Print(vars, string_template); } void Print(const char* string) { printer_.Print(string); } void PrintRaw(const char* string) { printer_.PrintRaw(string); } void Indent() { printer_.Indent(); } void Outdent() { printer_.Outdent(); } private: grpc::protobuf::io::StringOutputStream output_stream_; grpc::protobuf::io::Printer printer_; }; class ProtoBufFile : public grpc_generator::File { public: ProtoBufFile(const grpc::protobuf::FileDescriptor* file) : file_(file) {} grpc::string filename() const { return file_->name(); } grpc::string filename_without_ext() const { return grpc_generator::StripProto(filename()); } grpc::string package() const { return file_->package(); } std::vector package_parts() const { return grpc_generator::tokenize(package(), "."); } grpc::string additional_headers() const { return ""; } int service_count() const { return file_->service_count(); }; std::unique_ptr service(int i) const { return std::unique_ptr( new ProtoBufService(file_->service(i))); } std::unique_ptr CreatePrinter( grpc::string* str) const { return std::unique_ptr(new ProtoBufPrinter(str)); } grpc::string GetLeadingComments(const grpc::string prefix) const { return GetCommentsHelper(file_, true, prefix); } grpc::string GetTrailingComments(const grpc::string prefix) const { return GetCommentsHelper(file_, false, prefix); } vector GetAllComments() const { return grpc_python_generator::get_all_comments(file_); } private: const grpc::protobuf::FileDescriptor* file_; }; #endif // GRPC_INTERNAL_COMPILER_PROTOBUF_PLUGIN_H python-grpc-tools-1.14.1/grpc_root/src/compiler/python_generator.cc000066400000000000000000000741701334102242000255030ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "src/compiler/config.h" #include "src/compiler/generator_helpers.h" #include "src/compiler/protobuf_plugin.h" #include "src/compiler/python_generator.h" #include "src/compiler/python_generator_helpers.h" #include "src/compiler/python_private_generator.h" using grpc::protobuf::FileDescriptor; using grpc::protobuf::compiler::GeneratorContext; using grpc::protobuf::io::CodedOutputStream; using grpc::protobuf::io::ZeroCopyOutputStream; using std::make_pair; using std::map; using std::pair; using std::replace; using std::set; using std::tuple; using std::vector; namespace grpc_python_generator { grpc::string generator_file_name; namespace { typedef map StringMap; typedef vector StringVector; typedef tuple StringPair; typedef set StringPairSet; // Provides RAII indentation handling. Use as: // { // IndentScope raii_my_indent_var_name_here(my_py_printer); // // constructor indented my_py_printer // ... // // destructor called at end of scope, un-indenting my_py_printer // } class IndentScope { public: explicit IndentScope(grpc_generator::Printer* printer) : printer_(printer) { printer_->Indent(); } ~IndentScope() { printer_->Outdent(); } private: grpc_generator::Printer* printer_; }; PrivateGenerator::PrivateGenerator(const GeneratorConfiguration& config, const grpc_generator::File* file) : config(config), file(file) {} void PrivateGenerator::PrintAllComments(StringVector comments, grpc_generator::Printer* out) { if (comments.empty()) { // Python requires code structures like class and def to have // a body, even if it is just "pass" or a docstring. We need // to ensure not to generate empty bodies. We could do something // smarter and more sophisticated, but at the moment, if there is // no docstring to print, we simply emit "pass" to ensure validity // of the generated code. out->Print("# missing associated documentation comment in .proto file\n"); out->Print("pass\n"); return; } out->Print("\"\"\""); for (StringVector::iterator it = comments.begin(); it != comments.end(); ++it) { size_t start_pos = it->find_first_not_of(' '); if (start_pos != grpc::string::npos) { out->PrintRaw(it->c_str() + start_pos); } out->Print("\n"); } out->Print("\"\"\"\n"); } bool PrivateGenerator::PrintBetaServicer(const grpc_generator::Service* service, grpc_generator::Printer* out) { StringMap service_dict; service_dict["Service"] = service->name(); out->Print("\n\n"); out->Print(service_dict, "class Beta$Service$Servicer(object):\n"); { IndentScope raii_class_indent(out); out->Print( "\"\"\"The Beta API is deprecated for 0.15.0 and later.\n" "\nIt is recommended to use the GA API (classes and functions in this\n" "file not marked beta) for all further purposes. This class was " "generated\n" "only to ease transition from grpcio<0.15.0 to " "grpcio>=0.15.0.\"\"\"\n"); StringVector service_comments = service->GetAllComments(); PrintAllComments(service_comments, out); for (int i = 0; i < service->method_count(); ++i) { auto method = service->method(i); grpc::string arg_name = method->ClientStreaming() ? "request_iterator" : "request"; StringMap method_dict; method_dict["Method"] = method->name(); method_dict["ArgName"] = arg_name; out->Print(method_dict, "def $Method$(self, $ArgName$, context):\n"); { IndentScope raii_method_indent(out); StringVector method_comments = method->GetAllComments(); PrintAllComments(method_comments, out); out->Print("context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)\n"); } } } return true; } bool PrivateGenerator::PrintBetaStub(const grpc_generator::Service* service, grpc_generator::Printer* out) { StringMap service_dict; service_dict["Service"] = service->name(); out->Print("\n\n"); out->Print(service_dict, "class Beta$Service$Stub(object):\n"); { IndentScope raii_class_indent(out); out->Print( "\"\"\"The Beta API is deprecated for 0.15.0 and later.\n" "\nIt is recommended to use the GA API (classes and functions in this\n" "file not marked beta) for all further purposes. This class was " "generated\n" "only to ease transition from grpcio<0.15.0 to " "grpcio>=0.15.0.\"\"\"\n"); StringVector service_comments = service->GetAllComments(); PrintAllComments(service_comments, out); for (int i = 0; i < service->method_count(); ++i) { auto method = service->method(i); grpc::string arg_name = method->ClientStreaming() ? "request_iterator" : "request"; StringMap method_dict; method_dict["Method"] = method->name(); method_dict["ArgName"] = arg_name; out->Print(method_dict, "def $Method$(self, $ArgName$, timeout, metadata=None, " "with_call=False, protocol_options=None):\n"); { IndentScope raii_method_indent(out); StringVector method_comments = method->GetAllComments(); PrintAllComments(method_comments, out); out->Print("raise NotImplementedError()\n"); } if (!method->ServerStreaming()) { out->Print(method_dict, "$Method$.future = None\n"); } } } return true; } bool PrivateGenerator::PrintBetaServerFactory( const grpc::string& package_qualified_service_name, const grpc_generator::Service* service, grpc_generator::Printer* out) { StringMap service_dict; service_dict["Service"] = service->name(); out->Print("\n\n"); out->Print(service_dict, "def beta_create_$Service$_server(servicer, pool=None, " "pool_size=None, default_timeout=None, maximum_timeout=None):\n"); { IndentScope raii_create_server_indent(out); out->Print( "\"\"\"The Beta API is deprecated for 0.15.0 and later.\n" "\nIt is recommended to use the GA API (classes and functions in this\n" "file not marked beta) for all further purposes. This function was\n" "generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0" "\"\"\"\n"); StringMap method_implementation_constructors; StringMap input_message_modules_and_classes; StringMap output_message_modules_and_classes; for (int i = 0; i < service->method_count(); ++i) { auto method = service->method(i); const grpc::string method_implementation_constructor = grpc::string(method->ClientStreaming() ? "stream_" : "unary_") + grpc::string(method->ServerStreaming() ? "stream_" : "unary_") + "inline"; grpc::string input_message_module_and_class; if (!method->get_module_and_message_path_input( &input_message_module_and_class, generator_file_name, generate_in_pb2_grpc, config.import_prefix)) { return false; } grpc::string output_message_module_and_class; if (!method->get_module_and_message_path_output( &output_message_module_and_class, generator_file_name, generate_in_pb2_grpc, config.import_prefix)) { return false; } method_implementation_constructors.insert( make_pair(method->name(), method_implementation_constructor)); input_message_modules_and_classes.insert( make_pair(method->name(), input_message_module_and_class)); output_message_modules_and_classes.insert( make_pair(method->name(), output_message_module_and_class)); } StringMap method_dict; method_dict["PackageQualifiedServiceName"] = package_qualified_service_name; out->Print("request_deserializers = {\n"); for (StringMap::iterator name_and_input_module_class_pair = input_message_modules_and_classes.begin(); name_and_input_module_class_pair != input_message_modules_and_classes.end(); name_and_input_module_class_pair++) { method_dict["MethodName"] = name_and_input_module_class_pair->first; method_dict["InputTypeModuleAndClass"] = name_and_input_module_class_pair->second; IndentScope raii_indent(out); out->Print(method_dict, "(\'$PackageQualifiedServiceName$\', \'$MethodName$\'): " "$InputTypeModuleAndClass$.FromString,\n"); } out->Print("}\n"); out->Print("response_serializers = {\n"); for (StringMap::iterator name_and_output_module_class_pair = output_message_modules_and_classes.begin(); name_and_output_module_class_pair != output_message_modules_and_classes.end(); name_and_output_module_class_pair++) { method_dict["MethodName"] = name_and_output_module_class_pair->first; method_dict["OutputTypeModuleAndClass"] = name_and_output_module_class_pair->second; IndentScope raii_indent(out); out->Print(method_dict, "(\'$PackageQualifiedServiceName$\', \'$MethodName$\'): " "$OutputTypeModuleAndClass$.SerializeToString,\n"); } out->Print("}\n"); out->Print("method_implementations = {\n"); for (StringMap::iterator name_and_implementation_constructor = method_implementation_constructors.begin(); name_and_implementation_constructor != method_implementation_constructors.end(); name_and_implementation_constructor++) { method_dict["Method"] = name_and_implementation_constructor->first; method_dict["Constructor"] = name_and_implementation_constructor->second; IndentScope raii_descriptions_indent(out); const grpc::string method_name = name_and_implementation_constructor->first; out->Print(method_dict, "(\'$PackageQualifiedServiceName$\', \'$Method$\'): " "face_utilities.$Constructor$(servicer.$Method$),\n"); } out->Print("}\n"); out->Print( "server_options = beta_implementations.server_options(" "request_deserializers=request_deserializers, " "response_serializers=response_serializers, " "thread_pool=pool, thread_pool_size=pool_size, " "default_timeout=default_timeout, " "maximum_timeout=maximum_timeout)\n"); out->Print( "return beta_implementations.server(method_implementations, " "options=server_options)\n"); } return true; } bool PrivateGenerator::PrintBetaStubFactory( const grpc::string& package_qualified_service_name, const grpc_generator::Service* service, grpc_generator::Printer* out) { StringMap dict; dict["Service"] = service->name(); out->Print("\n\n"); out->Print(dict, "def beta_create_$Service$_stub(channel, host=None," " metadata_transformer=None, pool=None, pool_size=None):\n"); { IndentScope raii_create_server_indent(out); out->Print( "\"\"\"The Beta API is deprecated for 0.15.0 and later.\n" "\nIt is recommended to use the GA API (classes and functions in this\n" "file not marked beta) for all further purposes. This function was\n" "generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0" "\"\"\"\n"); StringMap method_cardinalities; StringMap input_message_modules_and_classes; StringMap output_message_modules_and_classes; for (int i = 0; i < service->method_count(); ++i) { auto method = service->method(i); const grpc::string method_cardinality = grpc::string(method->ClientStreaming() ? "STREAM" : "UNARY") + "_" + grpc::string(method->ServerStreaming() ? "STREAM" : "UNARY"); grpc::string input_message_module_and_class; if (!method->get_module_and_message_path_input( &input_message_module_and_class, generator_file_name, generate_in_pb2_grpc, config.import_prefix)) { return false; } grpc::string output_message_module_and_class; if (!method->get_module_and_message_path_output( &output_message_module_and_class, generator_file_name, generate_in_pb2_grpc, config.import_prefix)) { return false; } method_cardinalities.insert( make_pair(method->name(), method_cardinality)); input_message_modules_and_classes.insert( make_pair(method->name(), input_message_module_and_class)); output_message_modules_and_classes.insert( make_pair(method->name(), output_message_module_and_class)); } StringMap method_dict; method_dict["PackageQualifiedServiceName"] = package_qualified_service_name; out->Print("request_serializers = {\n"); for (StringMap::iterator name_and_input_module_class_pair = input_message_modules_and_classes.begin(); name_and_input_module_class_pair != input_message_modules_and_classes.end(); name_and_input_module_class_pair++) { method_dict["MethodName"] = name_and_input_module_class_pair->first; method_dict["InputTypeModuleAndClass"] = name_and_input_module_class_pair->second; IndentScope raii_indent(out); out->Print(method_dict, "(\'$PackageQualifiedServiceName$\', \'$MethodName$\'): " "$InputTypeModuleAndClass$.SerializeToString,\n"); } out->Print("}\n"); out->Print("response_deserializers = {\n"); for (StringMap::iterator name_and_output_module_class_pair = output_message_modules_and_classes.begin(); name_and_output_module_class_pair != output_message_modules_and_classes.end(); name_and_output_module_class_pair++) { method_dict["MethodName"] = name_and_output_module_class_pair->first; method_dict["OutputTypeModuleAndClass"] = name_and_output_module_class_pair->second; IndentScope raii_indent(out); out->Print(method_dict, "(\'$PackageQualifiedServiceName$\', \'$MethodName$\'): " "$OutputTypeModuleAndClass$.FromString,\n"); } out->Print("}\n"); out->Print("cardinalities = {\n"); for (StringMap::iterator name_and_cardinality = method_cardinalities.begin(); name_and_cardinality != method_cardinalities.end(); name_and_cardinality++) { method_dict["Method"] = name_and_cardinality->first; method_dict["Cardinality"] = name_and_cardinality->second; IndentScope raii_descriptions_indent(out); out->Print(method_dict, "\'$Method$\': cardinality.Cardinality.$Cardinality$,\n"); } out->Print("}\n"); out->Print( "stub_options = beta_implementations.stub_options(" "host=host, metadata_transformer=metadata_transformer, " "request_serializers=request_serializers, " "response_deserializers=response_deserializers, " "thread_pool=pool, thread_pool_size=pool_size)\n"); out->Print(method_dict, "return beta_implementations.dynamic_stub(channel, " "\'$PackageQualifiedServiceName$\', " "cardinalities, options=stub_options)\n"); } return true; } bool PrivateGenerator::PrintStub( const grpc::string& package_qualified_service_name, const grpc_generator::Service* service, grpc_generator::Printer* out) { StringMap dict; dict["Service"] = service->name(); out->Print("\n\n"); out->Print(dict, "class $Service$Stub(object):\n"); { IndentScope raii_class_indent(out); StringVector service_comments = service->GetAllComments(); PrintAllComments(service_comments, out); out->Print("\n"); out->Print("def __init__(self, channel):\n"); { IndentScope raii_init_indent(out); out->Print("\"\"\"Constructor.\n"); out->Print("\n"); out->Print("Args:\n"); { IndentScope raii_args_indent(out); out->Print("channel: A grpc.Channel.\n"); } out->Print("\"\"\"\n"); for (int i = 0; i < service->method_count(); ++i) { auto method = service->method(i); grpc::string multi_callable_constructor = grpc::string(method->ClientStreaming() ? "stream" : "unary") + "_" + grpc::string(method->ServerStreaming() ? "stream" : "unary"); grpc::string request_module_and_class; if (!method->get_module_and_message_path_input( &request_module_and_class, generator_file_name, generate_in_pb2_grpc, config.import_prefix)) { return false; } grpc::string response_module_and_class; if (!method->get_module_and_message_path_output( &response_module_and_class, generator_file_name, generate_in_pb2_grpc, config.import_prefix)) { return false; } StringMap method_dict; method_dict["Method"] = method->name(); method_dict["MultiCallableConstructor"] = multi_callable_constructor; out->Print(method_dict, "self.$Method$ = channel.$MultiCallableConstructor$(\n"); { method_dict["PackageQualifiedService"] = package_qualified_service_name; method_dict["RequestModuleAndClass"] = request_module_and_class; method_dict["ResponseModuleAndClass"] = response_module_and_class; IndentScope raii_first_attribute_indent(out); IndentScope raii_second_attribute_indent(out); out->Print(method_dict, "'/$PackageQualifiedService$/$Method$',\n"); out->Print(method_dict, "request_serializer=$RequestModuleAndClass$." "SerializeToString,\n"); out->Print( method_dict, "response_deserializer=$ResponseModuleAndClass$.FromString,\n"); out->Print(")\n"); } } } } return true; } bool PrivateGenerator::PrintServicer(const grpc_generator::Service* service, grpc_generator::Printer* out) { StringMap service_dict; service_dict["Service"] = service->name(); out->Print("\n\n"); out->Print(service_dict, "class $Service$Servicer(object):\n"); { IndentScope raii_class_indent(out); StringVector service_comments = service->GetAllComments(); PrintAllComments(service_comments, out); for (int i = 0; i < service->method_count(); ++i) { auto method = service->method(i); grpc::string arg_name = method->ClientStreaming() ? "request_iterator" : "request"; StringMap method_dict; method_dict["Method"] = method->name(); method_dict["ArgName"] = arg_name; out->Print("\n"); out->Print(method_dict, "def $Method$(self, $ArgName$, context):\n"); { IndentScope raii_method_indent(out); StringVector method_comments = method->GetAllComments(); PrintAllComments(method_comments, out); out->Print("context.set_code(grpc.StatusCode.UNIMPLEMENTED)\n"); out->Print("context.set_details('Method not implemented!')\n"); out->Print("raise NotImplementedError('Method not implemented!')\n"); } } } return true; } bool PrivateGenerator::PrintAddServicerToServer( const grpc::string& package_qualified_service_name, const grpc_generator::Service* service, grpc_generator::Printer* out) { StringMap service_dict; service_dict["Service"] = service->name(); out->Print("\n\n"); out->Print(service_dict, "def add_$Service$Servicer_to_server(servicer, server):\n"); { IndentScope raii_class_indent(out); out->Print("rpc_method_handlers = {\n"); { IndentScope raii_dict_first_indent(out); IndentScope raii_dict_second_indent(out); for (int i = 0; i < service->method_count(); ++i) { auto method = service->method(i); grpc::string method_handler_constructor = grpc::string(method->ClientStreaming() ? "stream" : "unary") + "_" + grpc::string(method->ServerStreaming() ? "stream" : "unary") + "_rpc_method_handler"; grpc::string request_module_and_class; if (!method->get_module_and_message_path_input( &request_module_and_class, generator_file_name, generate_in_pb2_grpc, config.import_prefix)) { return false; } grpc::string response_module_and_class; if (!method->get_module_and_message_path_output( &response_module_and_class, generator_file_name, generate_in_pb2_grpc, config.import_prefix)) { return false; } StringMap method_dict; method_dict["Method"] = method->name(); method_dict["MethodHandlerConstructor"] = method_handler_constructor; method_dict["RequestModuleAndClass"] = request_module_and_class; method_dict["ResponseModuleAndClass"] = response_module_and_class; out->Print(method_dict, "'$Method$': grpc.$MethodHandlerConstructor$(\n"); { IndentScope raii_call_first_indent(out); IndentScope raii_call_second_indent(out); out->Print(method_dict, "servicer.$Method$,\n"); out->Print( method_dict, "request_deserializer=$RequestModuleAndClass$.FromString,\n"); out->Print( method_dict, "response_serializer=$ResponseModuleAndClass$.SerializeToString," "\n"); } out->Print("),\n"); } } StringMap method_dict; method_dict["PackageQualifiedServiceName"] = package_qualified_service_name; out->Print("}\n"); out->Print("generic_handler = grpc.method_handlers_generic_handler(\n"); { IndentScope raii_call_first_indent(out); IndentScope raii_call_second_indent(out); out->Print(method_dict, "'$PackageQualifiedServiceName$', rpc_method_handlers)\n"); } out->Print("server.add_generic_rpc_handlers((generic_handler,))\n"); } return true; } bool PrivateGenerator::PrintBetaPreamble(grpc_generator::Printer* out) { StringMap var; var["Package"] = config.beta_package_root; out->Print(var, "from $Package$ import implementations as beta_implementations\n"); out->Print(var, "from $Package$ import interfaces as beta_interfaces\n"); out->Print("from grpc.framework.common import cardinality\n"); out->Print( "from grpc.framework.interfaces.face import utilities as " "face_utilities\n"); return true; } bool PrivateGenerator::PrintPreamble(grpc_generator::Printer* out) { StringMap var; var["Package"] = config.grpc_package_root; out->Print(var, "import $Package$\n"); if (generate_in_pb2_grpc) { out->Print("\n"); StringPairSet imports_set; for (int i = 0; i < file->service_count(); ++i) { auto service = file->service(i); for (int j = 0; j < service->method_count(); ++j) { auto method = service.get()->method(j); grpc::string input_type_file_name = method->get_input_type_name(); grpc::string input_module_name = ModuleName(input_type_file_name, config.import_prefix); grpc::string input_module_alias = ModuleAlias(input_type_file_name, config.import_prefix); imports_set.insert( std::make_tuple(input_module_name, input_module_alias)); grpc::string output_type_file_name = method->get_output_type_name(); grpc::string output_module_name = ModuleName(output_type_file_name, config.import_prefix); grpc::string output_module_alias = ModuleAlias(output_type_file_name, config.import_prefix); imports_set.insert( std::make_tuple(output_module_name, output_module_alias)); } } for (StringPairSet::iterator it = imports_set.begin(); it != imports_set.end(); ++it) { auto module_name = std::get<0>(*it); var["ModuleAlias"] = std::get<1>(*it); const size_t last_dot_pos = module_name.rfind('.'); if (last_dot_pos == grpc::string::npos) { var["ImportStatement"] = "import " + module_name; } else { var["ImportStatement"] = "from " + module_name.substr(0, last_dot_pos) + " import " + module_name.substr(last_dot_pos + 1); } out->Print(var, "$ImportStatement$ as $ModuleAlias$\n"); } } return true; } bool PrivateGenerator::PrintGAServices(grpc_generator::Printer* out) { grpc::string package = file->package(); if (!package.empty()) { package = package.append("."); } for (int i = 0; i < file->service_count(); ++i) { auto service = file->service(i); grpc::string package_qualified_service_name = package + service->name(); if (!(PrintStub(package_qualified_service_name, service.get(), out) && PrintServicer(service.get(), out) && PrintAddServicerToServer(package_qualified_service_name, service.get(), out))) { return false; } } return true; } bool PrivateGenerator::PrintBetaServices(grpc_generator::Printer* out) { grpc::string package = file->package(); if (!package.empty()) { package = package.append("."); } for (int i = 0; i < file->service_count(); ++i) { auto service = file->service(i); grpc::string package_qualified_service_name = package + service->name(); if (!(PrintBetaServicer(service.get(), out) && PrintBetaStub(service.get(), out) && PrintBetaServerFactory(package_qualified_service_name, service.get(), out) && PrintBetaStubFactory(package_qualified_service_name, service.get(), out))) { return false; } } return true; } pair PrivateGenerator::GetGrpcServices() { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. auto out = file->CreatePrinter(&output); if (generate_in_pb2_grpc) { out->Print( "# Generated by the gRPC Python protocol compiler plugin. " "DO NOT EDIT!\n"); if (!PrintPreamble(out.get())) { return make_pair(false, ""); } if (!PrintGAServices(out.get())) { return make_pair(false, ""); } } else { out->Print("try:\n"); { IndentScope raii_dict_try_indent(out.get()); out->Print( "# THESE ELEMENTS WILL BE DEPRECATED.\n" "# Please use the generated *_pb2_grpc.py files instead.\n"); if (!PrintPreamble(out.get())) { return make_pair(false, ""); } if (!PrintBetaPreamble(out.get())) { return make_pair(false, ""); } if (!PrintGAServices(out.get())) { return make_pair(false, ""); } if (!PrintBetaServices(out.get())) { return make_pair(false, ""); } } out->Print("except ImportError:\n"); { IndentScope raii_dict_except_indent(out.get()); out->Print("pass"); } } } return make_pair(true, std::move(output)); } } // namespace GeneratorConfiguration::GeneratorConfiguration() : grpc_package_root("grpc"), beta_package_root("grpc.beta"), import_prefix("") {} PythonGrpcGenerator::PythonGrpcGenerator(const GeneratorConfiguration& config) : config_(config) {} PythonGrpcGenerator::~PythonGrpcGenerator() {} static bool GenerateGrpc(GeneratorContext* context, PrivateGenerator& generator, grpc::string file_name, bool generate_in_pb2_grpc) { bool success; std::unique_ptr output; std::unique_ptr coded_output; grpc::string grpc_code; if (generate_in_pb2_grpc) { output.reset(context->Open(file_name)); generator.generate_in_pb2_grpc = true; } else { output.reset(context->OpenForInsert(file_name, "module_scope")); generator.generate_in_pb2_grpc = false; } coded_output.reset(new CodedOutputStream(output.get())); tie(success, grpc_code) = generator.GetGrpcServices(); if (success) { coded_output->WriteRaw(grpc_code.data(), grpc_code.size()); return true; } else { return false; } } bool PythonGrpcGenerator::Generate(const FileDescriptor* file, const grpc::string& parameter, GeneratorContext* context, grpc::string* error) const { // Get output file name. grpc::string pb2_file_name; grpc::string pb2_grpc_file_name; static const int proto_suffix_length = strlen(".proto"); if (file->name().size() > static_cast(proto_suffix_length) && file->name().find_last_of(".proto") == file->name().size() - 1) { grpc::string base = file->name().substr(0, file->name().size() - proto_suffix_length); std::replace(base.begin(), base.end(), '-', '_'); pb2_file_name = base + "_pb2.py"; pb2_grpc_file_name = base + "_pb2_grpc.py"; } else { *error = "Invalid proto file name. Proto file must end with .proto"; return false; } generator_file_name = file->name(); ProtoBufFile pbfile(file); PrivateGenerator generator(config_, &pbfile); if (parameter == "" || parameter == "grpc_2_0") { return GenerateGrpc(context, generator, pb2_grpc_file_name, true); } else if (parameter == "grpc_1_0") { return GenerateGrpc(context, generator, pb2_grpc_file_name, true) && GenerateGrpc(context, generator, pb2_file_name, false); } else { *error = "Invalid parameter '" + parameter + "'."; return false; } } } // namespace grpc_python_generator python-grpc-tools-1.14.1/grpc_root/src/compiler/python_generator.h000066400000000000000000000033731334102242000253420ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_PYTHON_GENERATOR_H #define GRPC_INTERNAL_COMPILER_PYTHON_GENERATOR_H #include #include "src/compiler/config.h" #include "src/compiler/schema_interface.h" namespace grpc_python_generator { // Data pertaining to configuration of the generator with respect to anything // that may be used internally at Google. struct GeneratorConfiguration { GeneratorConfiguration(); grpc::string grpc_package_root; // TODO(https://github.com/grpc/grpc/issues/8622): Drop this. grpc::string beta_package_root; // TODO(https://github.com/google/protobuf/issues/888): Drop this. grpc::string import_prefix; }; class PythonGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { public: PythonGrpcGenerator(const GeneratorConfiguration& config); ~PythonGrpcGenerator(); bool Generate(const grpc::protobuf::FileDescriptor* file, const grpc::string& parameter, grpc::protobuf::compiler::GeneratorContext* context, grpc::string* error) const; private: GeneratorConfiguration config_; }; } // namespace grpc_python_generator #endif // GRPC_INTERNAL_COMPILER_PYTHON_GENERATOR_H python-grpc-tools-1.14.1/grpc_root/src/compiler/python_generator_helpers.h000066400000000000000000000110321334102242000270530ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_PYTHON_GENERATOR_HELPERS_H #define GRPC_INTERNAL_COMPILER_PYTHON_GENERATOR_HELPERS_H #include #include #include #include #include "src/compiler/config.h" #include "src/compiler/generator_helpers.h" #include "src/compiler/python_generator.h" #include "src/compiler/python_private_generator.h" using grpc::protobuf::Descriptor; using grpc::protobuf::FileDescriptor; using grpc::protobuf::MethodDescriptor; using grpc::protobuf::ServiceDescriptor; using grpc::protobuf::compiler::GeneratorContext; using grpc::protobuf::io::CodedOutputStream; using grpc::protobuf::io::Printer; using grpc::protobuf::io::StringOutputStream; using grpc::protobuf::io::ZeroCopyOutputStream; using grpc_generator::StringReplace; using grpc_generator::StripProto; using std::vector; namespace grpc_python_generator { namespace { typedef vector DescriptorVector; typedef vector StringVector; // TODO(https://github.com/google/protobuf/issues/888): // Export `ModuleName` from protobuf's // `src/google/protobuf/compiler/python/python_generator.cc` file. grpc::string ModuleName(const grpc::string& filename, const grpc::string& import_prefix) { grpc::string basename = StripProto(filename); basename = StringReplace(basename, "-", "_"); basename = StringReplace(basename, "/", "."); return import_prefix + basename + "_pb2"; } // TODO(https://github.com/google/protobuf/issues/888): // Export `ModuleAlias` from protobuf's // `src/google/protobuf/compiler/python/python_generator.cc` file. grpc::string ModuleAlias(const grpc::string& filename, const grpc::string& import_prefix) { grpc::string module_name = ModuleName(filename, import_prefix); // 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. module_name = StringReplace(module_name, "_", "__"); module_name = StringReplace(module_name, ".", "_dot_"); return module_name; } bool GetModuleAndMessagePath(const Descriptor* type, grpc::string* out, grpc::string generator_file_name, bool generate_in_pb2_grpc, grpc::string& import_prefix) { const Descriptor* path_elem_type = type; DescriptorVector message_path; do { message_path.push_back(path_elem_type); path_elem_type = path_elem_type->containing_type(); } while (path_elem_type); // implicit nullptr comparison; don't be explicit grpc::string file_name = type->file()->name(); static const int proto_suffix_length = strlen(".proto"); if (!(file_name.size() > static_cast(proto_suffix_length) && file_name.find_last_of(".proto") == file_name.size() - 1)) { return false; } grpc::string module; if (generator_file_name != file_name || generate_in_pb2_grpc) { module = ModuleAlias(file_name, import_prefix) + "."; } else { module = ""; } grpc::string message_type; for (DescriptorVector::reverse_iterator path_iter = message_path.rbegin(); path_iter != message_path.rend(); ++path_iter) { message_type += (*path_iter)->name() + "."; } // no pop_back prior to C++11 message_type.resize(message_type.size() - 1); *out = module + message_type; return true; } template StringVector get_all_comments(const DescriptorType* descriptor) { StringVector comments; grpc_generator::GetComment( descriptor, grpc_generator::COMMENTTYPE_LEADING_DETACHED, &comments); grpc_generator::GetComment(descriptor, grpc_generator::COMMENTTYPE_LEADING, &comments); grpc_generator::GetComment(descriptor, grpc_generator::COMMENTTYPE_TRAILING, &comments); return comments; } } // namespace } // namespace grpc_python_generator #endif // GRPC_INTERNAL_COMPILER_PYTHON_GENERATOR_HELPERS_H python-grpc-tools-1.14.1/grpc_root/src/compiler/python_plugin.cc000066400000000000000000000017721334102242000250110ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // Generates a Python gRPC service interface out of Protobuf IDL. #include "src/compiler/config.h" #include "src/compiler/protobuf_plugin.h" #include "src/compiler/python_generator.h" int main(int argc, char* argv[]) { grpc_python_generator::GeneratorConfiguration config; grpc_python_generator::PythonGrpcGenerator generator(config); return grpc::protobuf::compiler::PluginMain(argc, argv, &generator); } python-grpc-tools-1.14.1/grpc_root/src/compiler/python_private_generator.h000066400000000000000000000061461334102242000270750ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_PYTHON_PRIVATE_GENERATOR_H #define GRPC_INTERNAL_COMPILER_PYTHON_PRIVATE_GENERATOR_H #include #include #include "src/compiler/python_generator.h" #include "src/compiler/schema_interface.h" namespace grpc_python_generator { namespace { // Tucks all generator state in an anonymous namespace away from // PythonGrpcGenerator and the header file, mostly to encourage future changes // to not require updates to the grpcio-tools C++ code part. Assumes that it is // only ever used from a single thread. struct PrivateGenerator { const GeneratorConfiguration& config; const grpc_generator::File* file; bool generate_in_pb2_grpc; PrivateGenerator(const GeneratorConfiguration& config, const grpc_generator::File* file); std::pair GetGrpcServices(); private: bool PrintPreamble(grpc_generator::Printer* out); bool PrintBetaPreamble(grpc_generator::Printer* out); bool PrintGAServices(grpc_generator::Printer* out); bool PrintBetaServices(grpc_generator::Printer* out); bool PrintAddServicerToServer( const grpc::string& package_qualified_service_name, const grpc_generator::Service* service, grpc_generator::Printer* out); bool PrintServicer(const grpc_generator::Service* service, grpc_generator::Printer* out); bool PrintStub(const grpc::string& package_qualified_service_name, const grpc_generator::Service* service, grpc_generator::Printer* out); bool PrintBetaServicer(const grpc_generator::Service* service, grpc_generator::Printer* out); bool PrintBetaServerFactory( const grpc::string& package_qualified_service_name, const grpc_generator::Service* service, grpc_generator::Printer* out); bool PrintBetaStub(const grpc_generator::Service* service, grpc_generator::Printer* out); bool PrintBetaStubFactory(const grpc::string& package_qualified_service_name, const grpc_generator::Service* service, grpc_generator::Printer* out); // Get all comments (leading, leading_detached, trailing) and print them as a // docstring. Any leading space of a line will be removed, but the line // wrapping will not be changed. void PrintAllComments(std::vector comments, grpc_generator::Printer* out); }; } // namespace } // namespace grpc_python_generator #endif // GRPC_INTERNAL_COMPILER_PYTHON_PRIVATE_GENERATOR_H python-grpc-tools-1.14.1/grpc_root/src/compiler/ruby_generator.cc000066400000000000000000000152611334102242000251370ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include #include #include "src/compiler/config.h" #include "src/compiler/ruby_generator.h" #include "src/compiler/ruby_generator_helpers-inl.h" #include "src/compiler/ruby_generator_map-inl.h" #include "src/compiler/ruby_generator_string-inl.h" using grpc::protobuf::FileDescriptor; using grpc::protobuf::MethodDescriptor; using grpc::protobuf::ServiceDescriptor; using grpc::protobuf::io::Printer; using grpc::protobuf::io::StringOutputStream; using std::map; using std::vector; namespace grpc_ruby_generator { namespace { // Prints out the method using the ruby gRPC DSL. void PrintMethod(const MethodDescriptor* method, const grpc::string& package, Printer* out) { grpc::string input_type = RubyTypeOf(method->input_type()->full_name(), package); if (method->client_streaming()) { input_type = "stream(" + input_type + ")"; } grpc::string output_type = RubyTypeOf(method->output_type()->full_name(), package); if (method->server_streaming()) { output_type = "stream(" + output_type + ")"; } std::map method_vars = ListToDict({ "mth.name", method->name(), "input.type", input_type, "output.type", output_type, }); out->Print(GetRubyComments(method, true).c_str()); out->Print(method_vars, "rpc :$mth.name$, $input.type$, $output.type$\n"); out->Print(GetRubyComments(method, false).c_str()); } // Prints out the service using the ruby gRPC DSL. void PrintService(const ServiceDescriptor* service, const grpc::string& package, Printer* out) { if (service->method_count() == 0) { return; } // Begin the service module std::map module_vars = ListToDict({ "module.name", Modularize(service->name()), }); out->Print(module_vars, "module $module.name$\n"); out->Indent(); out->Print(GetRubyComments(service, true).c_str()); out->Print("class Service\n"); // Write the indented class body. out->Indent(); out->Print("\n"); out->Print("include GRPC::GenericService\n"); out->Print("\n"); out->Print("self.marshal_class_method = :encode\n"); out->Print("self.unmarshal_class_method = :decode\n"); std::map pkg_vars = ListToDict({"service_full_name", service->full_name()}); out->Print(pkg_vars, "self.service_name = '$service_full_name$'\n"); out->Print("\n"); for (int i = 0; i < service->method_count(); ++i) { PrintMethod(service->method(i), package, out); } out->Outdent(); out->Print("end\n"); out->Print("\n"); out->Print("Stub = Service.rpc_stub_class\n"); // End the service module out->Outdent(); out->Print("end\n"); out->Print(GetRubyComments(service, false).c_str()); } } // namespace // The following functions are copied directly from the source for the protoc // ruby generator // to ensure compatibility (with the exception of int and string type changes). // See // https://github.com/google/protobuf/blob/master/src/google/protobuf/compiler/ruby/ruby_generator.cc#L250 // TODO: keep up to date with protoc code generation, though this behavior isn't // expected to change bool IsLower(char ch) { return ch >= 'a' && ch <= 'z'; } char ToUpper(char ch) { return IsLower(ch) ? (ch - 'a' + 'A') : ch; } // Package names in protobuf are snake_case by convention, but Ruby module // names must be PascalCased. // // foo_bar_baz -> FooBarBaz grpc::string PackageToModule(const grpc::string& name) { bool next_upper = true; grpc::string result; result.reserve(name.size()); for (grpc::string::size_type i = 0; i < name.size(); i++) { if (name[i] == '_') { next_upper = true; } else { if (next_upper) { result.push_back(ToUpper(name[i])); } else { result.push_back(name[i]); } next_upper = false; } } return result; } // end copying of protoc generator for ruby code grpc::string GetServices(const FileDescriptor* file) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. StringOutputStream output_stream(&output); Printer out(&output_stream, '$'); // Don't write out any output if there no services, to avoid empty service // files being generated for proto files that don't declare any. if (file->service_count() == 0) { return output; } // Write out a file header. std::map header_comment_vars = ListToDict({ "file.name", file->name(), "file.package", file->package(), }); out.Print("# Generated by the protocol buffer compiler. DO NOT EDIT!\n"); out.Print(header_comment_vars, "# Source: $file.name$ for package '$file.package$'\n"); grpc::string leading_comments = GetRubyComments(file, true); if (!leading_comments.empty()) { out.Print("# Original file comments:\n"); out.PrintRaw(leading_comments.c_str()); } out.Print("\n"); out.Print("require 'grpc'\n"); // Write out require statemment to import the separately generated file // that defines the messages used by the service. This is generated by the // main ruby plugin. std::map dep_vars = ListToDict({ "dep.name", MessagesRequireName(file), }); out.Print(dep_vars, "require '$dep.name$'\n"); // Write out services within the modules out.Print("\n"); std::vector modules = Split(file->package(), '.'); for (size_t i = 0; i < modules.size(); ++i) { std::map module_vars = ListToDict({ "module.name", PackageToModule(modules[i]), }); out.Print(module_vars, "module $module.name$\n"); out.Indent(); } for (int i = 0; i < file->service_count(); ++i) { auto service = file->service(i); PrintService(service, file->package(), &out); } for (size_t i = 0; i < modules.size(); ++i) { out.Outdent(); out.Print("end\n"); } out.Print(GetRubyComments(file, false).c_str()); } return output; } } // namespace grpc_ruby_generator python-grpc-tools-1.14.1/grpc_root/src/compiler/ruby_generator.h000066400000000000000000000016371334102242000250030ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_H #define GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_H #include "src/compiler/config.h" namespace grpc_ruby_generator { grpc::string GetServices(const grpc::protobuf::FileDescriptor* file); } // namespace grpc_ruby_generator #endif // GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_H python-grpc-tools-1.14.1/grpc_root/src/compiler/ruby_generator_helpers-inl.h000066400000000000000000000040431334102242000272770ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_HELPERS_INL_H #define GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_HELPERS_INL_H #include "src/compiler/config.h" #include "src/compiler/generator_helpers.h" #include "src/compiler/ruby_generator_string-inl.h" namespace grpc_ruby_generator { inline bool ServicesFilename(const grpc::protobuf::FileDescriptor* file, grpc::string* file_name_or_error) { // Get output file name. static const unsigned proto_suffix_length = 6; // length of ".proto" if (file->name().size() > proto_suffix_length && file->name().find_last_of(".proto") == file->name().size() - 1) { *file_name_or_error = file->name().substr(0, file->name().size() - proto_suffix_length) + "_services_pb.rb"; return true; } else { *file_name_or_error = "Invalid proto file name: must end with .proto"; return false; } } inline grpc::string MessagesRequireName( const grpc::protobuf::FileDescriptor* file) { return Replace(file->name(), ".proto", "_pb"); } // Get leading or trailing comments in a string. Comment lines start with "# ". // Leading detached comments are put in in front of leading comments. template inline grpc::string GetRubyComments(const DescriptorType* desc, bool leading) { return grpc_generator::GetPrefixedComments(desc, leading, "#"); } } // namespace grpc_ruby_generator #endif // GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_HELPERS_INL_H python-grpc-tools-1.14.1/grpc_root/src/compiler/ruby_generator_map-inl.h000066400000000000000000000033131334102242000264110ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_MAP_INL_H #define GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_MAP_INL_H #include "src/compiler/config.h" #include #include #include #include // NOLINT #include using std::initializer_list; using std::map; using std::vector; namespace grpc_ruby_generator { // Converts an initializer list of the form { key0, value0, key1, value1, ... } // into a map of key* to value*. Is merely a readability helper for later code. inline std::map ListToDict( const initializer_list& values) { if (values.size() % 2 != 0) { std::cerr << "Not every 'key' has a value in `values`." << std::endl; } std::map value_map; auto value_iter = values.begin(); for (unsigned i = 0; i < values.size() / 2; ++i) { grpc::string key = *value_iter; ++value_iter; grpc::string value = *value_iter; value_map[key] = value; ++value_iter; } return value_map; } } // namespace grpc_ruby_generator #endif // GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_MAP_INL_H python-grpc-tools-1.14.1/grpc_root/src/compiler/ruby_generator_string-inl.h000066400000000000000000000077241334102242000271540ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_STRING_INL_H #define GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_STRING_INL_H #include "src/compiler/config.h" #include #include #include using std::getline; using std::transform; namespace grpc_ruby_generator { // Split splits a string using char into elems. inline std::vector& Split(const grpc::string& s, char delim, std::vector* elems) { std::stringstream ss(s); grpc::string item; while (getline(ss, item, delim)) { elems->push_back(item); } return *elems; } // Split splits a string using char, returning the result in a vector. inline std::vector Split(const grpc::string& s, char delim) { std::vector elems; Split(s, delim, &elems); return elems; } // Replace replaces from with to in s. inline grpc::string Replace(grpc::string s, const grpc::string& from, const grpc::string& to) { size_t start_pos = s.find(from); if (start_pos == grpc::string::npos) { return s; } s.replace(start_pos, from.length(), to); return s; } // ReplaceAll replaces all instances of search with replace in s. inline grpc::string ReplaceAll(grpc::string s, const grpc::string& search, const grpc::string& replace) { size_t pos = 0; while ((pos = s.find(search, pos)) != grpc::string::npos) { s.replace(pos, search.length(), replace); pos += replace.length(); } return s; } // ReplacePrefix replaces from with to in s if search is a prefix of s. inline bool ReplacePrefix(grpc::string* s, const grpc::string& from, const grpc::string& to) { size_t start_pos = s->find(from); if (start_pos == grpc::string::npos || start_pos != 0) { return false; } s->replace(start_pos, from.length(), to); return true; } // Modularize converts a string into a ruby module compatible name inline grpc::string Modularize(grpc::string s) { if (s.empty()) { return s; } grpc::string new_string = ""; bool was_last_underscore = false; new_string.append(1, ::toupper(s[0])); for (grpc::string::size_type i = 1; i < s.size(); ++i) { if (was_last_underscore && s[i] != '_') { new_string.append(1, ::toupper(s[i])); } else if (s[i] != '_') { new_string.append(1, s[i]); } was_last_underscore = s[i] == '_'; } return new_string; } // RubyTypeOf updates a proto type to the required ruby equivalent. inline grpc::string RubyTypeOf(const grpc::string& a_type, const grpc::string& package) { grpc::string res(a_type); ReplacePrefix(&res, package, ""); // remove the leading package if present ReplacePrefix(&res, ".", ""); // remove the leading . (no package) if (res.find('.') == grpc::string::npos) { return res; } else { std::vector prefixes_and_type = Split(res, '.'); res.clear(); for (unsigned int i = 0; i < prefixes_and_type.size(); ++i) { if (i != 0) { res += "::"; // switch '.' to the ruby module delim } if (i < prefixes_and_type.size() - 1) { res += Modularize(prefixes_and_type[i]); // capitalize pkgs } else { res += prefixes_and_type[i]; } } return res; } } } // namespace grpc_ruby_generator #endif // GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_STRING_INL_H python-grpc-tools-1.14.1/grpc_root/src/compiler/ruby_plugin.cc000066400000000000000000000035251334102242000244470ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ // Generates Ruby gRPC service interface out of Protobuf IDL. #include #include "src/compiler/config.h" #include "src/compiler/ruby_generator.h" #include "src/compiler/ruby_generator_helpers-inl.h" class RubyGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { public: RubyGrpcGenerator() {} ~RubyGrpcGenerator() {} bool Generate(const grpc::protobuf::FileDescriptor* file, const grpc::string& parameter, grpc::protobuf::compiler::GeneratorContext* context, grpc::string* error) const { grpc::string code = grpc_ruby_generator::GetServices(file); if (code.size() == 0) { return true; // don't generate a file if there are no services } // Get output file name. grpc::string file_name; if (!grpc_ruby_generator::ServicesFilename(file, &file_name)) { return false; } std::unique_ptr output( context->Open(file_name)); grpc::protobuf::io::CodedOutputStream coded_out(output.get()); coded_out.WriteRaw(code.data(), code.size()); return true; } }; int main(int argc, char* argv[]) { RubyGrpcGenerator generator; return grpc::protobuf::compiler::PluginMain(argc, argv, &generator); } python-grpc-tools-1.14.1/grpc_root/src/compiler/schema_interface.h000066400000000000000000000070061334102242000252300ustar00rootroot00000000000000/* * * Copyright 2015 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #ifndef GRPC_INTERNAL_COMPILER_SCHEMA_INTERFACE_H #define GRPC_INTERNAL_COMPILER_SCHEMA_INTERFACE_H #include "src/compiler/config.h" #include #include #ifndef GRPC_CUSTOM_STRING #include #define GRPC_CUSTOM_STRING std::string #endif namespace grpc { typedef GRPC_CUSTOM_STRING string; } // namespace grpc namespace grpc_generator { // A common interface for objects having comments in the source. // Return formatted comments to be inserted in generated code. struct CommentHolder { virtual ~CommentHolder() {} virtual grpc::string GetLeadingComments(const grpc::string prefix) const = 0; virtual grpc::string GetTrailingComments(const grpc::string prefix) const = 0; virtual std::vector GetAllComments() const = 0; }; // An abstract interface representing a method. struct Method : public CommentHolder { virtual ~Method() {} virtual grpc::string name() const = 0; virtual grpc::string input_type_name() const = 0; virtual grpc::string output_type_name() const = 0; virtual bool get_module_and_message_path_input( grpc::string* str, grpc::string generator_file_name, bool generate_in_pb2_grpc, grpc::string import_prefix) const = 0; virtual bool get_module_and_message_path_output( grpc::string* str, grpc::string generator_file_name, bool generate_in_pb2_grpc, grpc::string import_prefix) const = 0; virtual grpc::string get_input_type_name() const = 0; virtual grpc::string get_output_type_name() const = 0; virtual bool NoStreaming() const = 0; virtual bool ClientStreaming() const = 0; virtual bool ServerStreaming() const = 0; virtual bool BidiStreaming() const = 0; }; // An abstract interface representing a service. struct Service : public CommentHolder { virtual ~Service() {} virtual grpc::string name() const = 0; virtual int method_count() const = 0; virtual std::unique_ptr method(int i) const = 0; }; struct Printer { virtual ~Printer() {} virtual void Print(const std::map& vars, const char* template_string) = 0; virtual void Print(const char* string) = 0; virtual void PrintRaw(const char* string) = 0; virtual void Indent() = 0; virtual void Outdent() = 0; }; // An interface that allows the source generated to be output using various // libraries/idls/serializers. struct File : public CommentHolder { virtual ~File() {} virtual grpc::string filename() const = 0; virtual grpc::string filename_without_ext() const = 0; virtual grpc::string package() const = 0; virtual std::vector package_parts() const = 0; virtual grpc::string additional_headers() const = 0; virtual int service_count() const = 0; virtual std::unique_ptr service(int i) const = 0; virtual std::unique_ptr CreatePrinter(grpc::string* str) const = 0; }; } // namespace grpc_generator #endif // GRPC_INTERNAL_COMPILER_SCHEMA_INTERFACE_H python-grpc-tools-1.14.1/grpc_tools/000077500000000000000000000000001334102242000173505ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_tools/__init__.py000066400000000000000000000011011334102242000214520ustar00rootroot00000000000000# Copyright 2016 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. python-grpc-tools-1.14.1/grpc_tools/_proto/000077500000000000000000000000001334102242000206525ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_tools/_proto/google/000077500000000000000000000000001334102242000221265ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/000077500000000000000000000000001334102242000237665ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/any.proto000066400000000000000000000125531334102242000256500ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option go_package = "github.com/golang/protobuf/ptypes/any"; option java_package = "com.google.protobuf"; option java_outer_classname = "AnyProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // `Any` contains an arbitrary serialized protocol buffer message along with a // URL that describes the type of the serialized message. // // Protobuf library provides support to pack/unpack Any values in the form // of utility functions or additional generated methods of the Any type. // // Example 1: Pack and unpack a message in C++. // // Foo foo = ...; // Any any; // any.PackFrom(foo); // ... // if (any.UnpackTo(&foo)) { // ... // } // // Example 2: Pack and unpack a message in Java. // // Foo foo = ...; // Any any = Any.pack(foo); // ... // if (any.is(Foo.class)) { // foo = any.unpack(Foo.class); // } // // Example 3: Pack and unpack a message in Python. // // foo = Foo(...) // any = Any() // any.Pack(foo) // ... // if any.Is(Foo.DESCRIPTOR): // any.Unpack(foo) // ... // // Example 4: Pack and unpack a message in Go // // foo := &pb.Foo{...} // any, err := ptypes.MarshalAny(foo) // ... // foo := &pb.Foo{} // if err := ptypes.UnmarshalAny(any, foo); err != nil { // ... // } // // The pack methods provided by protobuf library will by default use // 'type.googleapis.com/full.type.name' as the type URL and the unpack // methods only use the fully qualified type name after the last '/' // in the type URL, for example "foo.bar.com/x/y.z" will yield type // name "y.z". // // // JSON // ==== // The JSON representation of an `Any` value uses the regular // representation of the deserialized, embedded message, with an // additional field `@type` which contains the type URL. Example: // // package google.profile; // message Person { // string first_name = 1; // string last_name = 2; // } // // { // "@type": "type.googleapis.com/google.profile.Person", // "firstName": , // "lastName": // } // // If the embedded message type is well-known and has a custom JSON // representation, that representation will be embedded adding a field // `value` which holds the custom JSON in addition to the `@type` // field. Example (for message [google.protobuf.Duration][]): // // { // "@type": "type.googleapis.com/google.protobuf.Duration", // "value": "1.212s" // } // message Any { // A URL/resource name whose content describes the type of the // serialized protocol buffer message. // // For URLs which use the scheme `http`, `https`, or no scheme, the // following restrictions and interpretations apply: // // * If no scheme is provided, `https` is assumed. // * The last segment of the URL's path must represent the fully // qualified name of the type (as in `path/google.protobuf.Duration`). // The name should be in a canonical form (e.g., leading "." is // not accepted). // * An HTTP GET on the URL must yield a [google.protobuf.Type][] // value in binary format, or produce an error. // * Applications are allowed to cache lookup results based on the // URL, or have them precompiled into a binary to avoid any // lookup. Therefore, binary compatibility needs to be preserved // on changes to types. (Use versioned type names to manage // breaking changes.) // // Schemes other than `http`, `https` (or the empty scheme) might be // used with implementation specific semantics. // string type_url = 1; // Must be a valid serialized protocol buffer of the above specified type. bytes value = 2; } python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/api.proto000066400000000000000000000170661334102242000256360ustar00rootroot00000000000000// 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 google.protobuf; import "google/protobuf/source_context.proto"; import "google/protobuf/type.proto"; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option java_package = "com.google.protobuf"; option java_outer_classname = "ApiProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; option go_package = "google.golang.org/genproto/protobuf/api;api"; // Api is a light-weight descriptor for an API Interface. // // Interfaces are also described as "protocol buffer services" in some contexts, // such as by the "service" keyword in a .proto file, but they are different // from API Services, which represent a concrete implementation of an interface // as opposed to simply a description of methods and bindings. They are also // sometimes simply referred to as "APIs" in other contexts, such as the name of // this message itself. See https://cloud.google.com/apis/design/glossary for // detailed terminology. message Api { // The fully qualified name of this interface, including package name // followed by the interface's simple name. string name = 1; // The methods of this interface, in unspecified order. repeated Method methods = 2; // Any metadata attached to the interface. repeated Option options = 3; // A version string for this interface. If specified, must have the form // `major-version.minor-version`, as in `1.10`. If the minor version is // omitted, it defaults to zero. If the entire version field is empty, the // major version is derived from the package name, as outlined below. If the // field is not empty, the version in the package name will be verified to be // consistent with what is provided here. // // The versioning schema uses [semantic // versioning](http://semver.org) where the major version number // indicates a breaking change and the minor version an additive, // non-breaking change. Both version numbers are signals to users // what to expect from different versions, and should be carefully // chosen based on the product plan. // // The major version is also reflected in the package name of the // interface, which must end in `v`, as in // `google.feature.v1`. For major versions 0 and 1, the suffix can // be omitted. Zero major versions must only be used for // experimental, non-GA interfaces. // // string version = 4; // Source context for the protocol buffer service represented by this // message. SourceContext source_context = 5; // Included interfaces. See [Mixin][]. repeated Mixin mixins = 6; // The source syntax of the service. Syntax syntax = 7; } // Method represents a method of an API interface. message Method { // The simple name of this method. string name = 1; // A URL of the input message type. string request_type_url = 2; // If true, the request is streamed. bool request_streaming = 3; // The URL of the output message type. string response_type_url = 4; // If true, the response is streamed. bool response_streaming = 5; // Any metadata attached to the method. repeated Option options = 6; // The source syntax of this method. Syntax syntax = 7; } // Declares an API Interface to be included in this interface. The including // interface must redeclare all the methods from the included interface, but // documentation and options are inherited as follows: // // - If after comment and whitespace stripping, the documentation // string of the redeclared method is empty, it will be inherited // from the original method. // // - Each annotation belonging to the service config (http, // visibility) which is not set in the redeclared method will be // inherited. // // - If an http annotation is inherited, the path pattern will be // modified as follows. Any version prefix will be replaced by the // version of the including interface plus the [root][] path if // specified. // // Example of a simple mixin: // // package google.acl.v1; // service AccessControl { // // Get the underlying ACL object. // rpc GetAcl(GetAclRequest) returns (Acl) { // option (google.api.http).get = "/v1/{resource=**}:getAcl"; // } // } // // package google.storage.v2; // service Storage { // rpc GetAcl(GetAclRequest) returns (Acl); // // // Get a data record. // rpc GetData(GetDataRequest) returns (Data) { // option (google.api.http).get = "/v2/{resource=**}"; // } // } // // Example of a mixin configuration: // // apis: // - name: google.storage.v2.Storage // mixins: // - name: google.acl.v1.AccessControl // // The mixin construct implies that all methods in `AccessControl` are // also declared with same name and request/response types in // `Storage`. A documentation generator or annotation processor will // see the effective `Storage.GetAcl` method after inherting // documentation and annotations as follows: // // service Storage { // // Get the underlying ACL object. // rpc GetAcl(GetAclRequest) returns (Acl) { // option (google.api.http).get = "/v2/{resource=**}:getAcl"; // } // ... // } // // Note how the version in the path pattern changed from `v1` to `v2`. // // If the `root` field in the mixin is specified, it should be a // relative path under which inherited HTTP paths are placed. Example: // // apis: // - name: google.storage.v2.Storage // mixins: // - name: google.acl.v1.AccessControl // root: acls // // This implies the following inherited HTTP annotation: // // service Storage { // // Get the underlying ACL object. // rpc GetAcl(GetAclRequest) returns (Acl) { // option (google.api.http).get = "/v2/acls/{resource=**}:getAcl"; // } // ... // } message Mixin { // The fully qualified name of the interface which is included. string name = 1; // If non-empty specifies a path under which inherited HTTP paths // are rooted. string root = 2; } python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/compiler/000077500000000000000000000000001334102242000256005ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/compiler/plugin.proto000066400000000000000000000200101334102242000301540ustar00rootroot00000000000000// 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) // // 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. // // Plugins written using C++ can use google/protobuf/compiler/plugin.h instead // of dealing with the raw protocol defined here. // // A plugin executable needs only to be placed somewhere in the path. The // plugin should be named "protoc-gen-$NAME", and will then be used when the // flag "--${NAME}_out" is passed to protoc. syntax = "proto2"; package google.protobuf.compiler; option java_package = "com.google.protobuf.compiler"; option java_outer_classname = "PluginProtos"; option go_package = "github.com/golang/protobuf/protoc-gen-go/plugin;plugin_go"; import "google/protobuf/descriptor.proto"; // The version number of protocol compiler. message Version { optional int32 major = 1; optional int32 minor = 2; optional int32 patch = 3; // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should // be empty for mainline stable releases. optional string suffix = 4; } // An encoded CodeGeneratorRequest is written to the plugin's stdin. message CodeGeneratorRequest { // 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. repeated string file_to_generate = 1; // The generator parameter passed on the command-line. optional string parameter = 2; // 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. repeated FileDescriptorProto proto_file = 15; // The version number of protocol compiler. optional Version compiler_version = 3; } // The plugin writes an encoded CodeGeneratorResponse to stdout. message CodeGeneratorResponse { // 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. optional string error = 1; // Represents a single generated file. message File { // 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. optional string name = 1; // 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. optional string insertion_point = 2; // The file contents. optional string content = 15; } repeated File file = 15; } python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/descriptor.proto000066400000000000000000001066651334102242000272470ustar00rootroot00000000000000// 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. // // The messages in this file describe the definitions found in .proto files. // A valid .proto file can be translated directly to a FileDescriptorProto // without any other information (e.g. without reading its imports). syntax = "proto2"; package google.protobuf; option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; option java_package = "com.google.protobuf"; option java_outer_classname = "DescriptorProtos"; option csharp_namespace = "Google.Protobuf.Reflection"; option objc_class_prefix = "GPB"; option cc_enable_arenas = true; // descriptor.proto must be optimized for speed because reflection-based // algorithms don't work during bootstrapping. option optimize_for = SPEED; // The protocol compiler can output a FileDescriptorSet containing the .proto // files it parses. message FileDescriptorSet { repeated FileDescriptorProto file = 1; } // Describes a complete .proto file. message FileDescriptorProto { optional string name = 1; // file name, relative to root of source tree optional string package = 2; // e.g. "foo", "foo.bar", etc. // Names of files imported by this file. repeated string dependency = 3; // Indexes of the public imported files in the dependency list above. repeated int32 public_dependency = 10; // Indexes of the weak imported files in the dependency list. // For Google-internal migration only. Do not use. repeated int32 weak_dependency = 11; // All top-level definitions in this file. repeated DescriptorProto message_type = 4; repeated EnumDescriptorProto enum_type = 5; repeated ServiceDescriptorProto service = 6; repeated FieldDescriptorProto extension = 7; optional FileOptions options = 8; // This field contains optional information about the original source code. // You may safely remove this entire field without harming runtime // functionality of the descriptors -- the information is needed only by // development tools. optional SourceCodeInfo source_code_info = 9; // The syntax of the proto file. // The supported values are "proto2" and "proto3". optional string syntax = 12; } // Describes a message type. message DescriptorProto { optional string name = 1; repeated FieldDescriptorProto field = 2; repeated FieldDescriptorProto extension = 6; repeated DescriptorProto nested_type = 3; repeated EnumDescriptorProto enum_type = 4; message ExtensionRange { optional int32 start = 1; optional int32 end = 2; optional ExtensionRangeOptions options = 3; } repeated ExtensionRange extension_range = 5; repeated OneofDescriptorProto oneof_decl = 8; optional MessageOptions options = 7; // Range of reserved tag numbers. Reserved tag numbers may not be used by // fields or extension ranges in the same message. Reserved ranges may // not overlap. message ReservedRange { optional int32 start = 1; // Inclusive. optional int32 end = 2; // Exclusive. } repeated ReservedRange reserved_range = 9; // Reserved field names, which may not be used by fields in the same message. // A given name may only be reserved once. repeated string reserved_name = 10; } message ExtensionRangeOptions { // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } // Describes a field within a message. message FieldDescriptorProto { enum Type { // 0 is reserved for errors. // Order is weird for historical reasons. TYPE_DOUBLE = 1; TYPE_FLOAT = 2; // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if // negative values are likely. TYPE_INT64 = 3; TYPE_UINT64 = 4; // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if // negative values are likely. TYPE_INT32 = 5; TYPE_FIXED64 = 6; TYPE_FIXED32 = 7; TYPE_BOOL = 8; TYPE_STRING = 9; // Tag-delimited aggregate. // Group type is deprecated and not supported in proto3. However, Proto3 // implementations should still be able to parse the group wire format and // treat group fields as unknown fields. TYPE_GROUP = 10; TYPE_MESSAGE = 11; // Length-delimited aggregate. // New in version 2. TYPE_BYTES = 12; TYPE_UINT32 = 13; TYPE_ENUM = 14; TYPE_SFIXED32 = 15; TYPE_SFIXED64 = 16; TYPE_SINT32 = 17; // Uses ZigZag encoding. TYPE_SINT64 = 18; // Uses ZigZag encoding. }; enum Label { // 0 is reserved for errors LABEL_OPTIONAL = 1; LABEL_REQUIRED = 2; LABEL_REPEATED = 3; }; optional string name = 1; optional int32 number = 3; optional Label label = 4; // If type_name is set, this need not be set. If both this and type_name // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. optional Type type = 5; // For message and enum types, this is the name of the type. If the name // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping // rules are used to find the type (i.e. first the nested types within this // message are searched, then within the parent, on up to the root // namespace). optional string type_name = 6; // For extensions, this is the name of the type being extended. It is // resolved in the same manner as type_name. optional string extendee = 2; // For numeric types, contains the original text representation of the value. // For booleans, "true" or "false". // For strings, contains the default text contents (not escaped in any way). // For bytes, contains the C escaped value. All bytes >= 128 are escaped. // TODO(kenton): Base-64 encode? optional string default_value = 7; // If set, gives the index of a oneof in the containing type's oneof_decl // list. This field is a member of that oneof. optional int32 oneof_index = 9; // JSON name of this field. The value is set by protocol compiler. If the // user has set a "json_name" option on this field, that option's value // will be used. Otherwise, it's deduced from the field's name by converting // it to camelCase. optional string json_name = 10; optional FieldOptions options = 8; } // Describes a oneof. message OneofDescriptorProto { optional string name = 1; optional OneofOptions options = 2; } // Describes an enum type. message EnumDescriptorProto { optional string name = 1; repeated EnumValueDescriptorProto value = 2; optional EnumOptions options = 3; // Range of reserved numeric values. Reserved values may not be used by // entries in the same enum. Reserved ranges may not overlap. // // Note that this is distinct from DescriptorProto.ReservedRange in that it // is inclusive such that it can appropriately represent the entire int32 // domain. message EnumReservedRange { optional int32 start = 1; // Inclusive. optional int32 end = 2; // Inclusive. } // Range of reserved numeric values. Reserved numeric values may not be used // by enum values in the same enum declaration. Reserved ranges may not // overlap. repeated EnumReservedRange reserved_range = 4; // Reserved enum value names, which may not be reused. A given name may only // be reserved once. repeated string reserved_name = 5; } // Describes a value within an enum. message EnumValueDescriptorProto { optional string name = 1; optional int32 number = 2; optional EnumValueOptions options = 3; } // Describes a service. message ServiceDescriptorProto { optional string name = 1; repeated MethodDescriptorProto method = 2; optional ServiceOptions options = 3; } // Describes a method of a service. message MethodDescriptorProto { optional string name = 1; // Input and output type names. These are resolved in the same way as // FieldDescriptorProto.type_name, but must refer to a message type. optional string input_type = 2; optional string output_type = 3; optional MethodOptions options = 4; // Identifies if client streams multiple client messages optional bool client_streaming = 5 [default=false]; // Identifies if server streams multiple server messages optional bool server_streaming = 6 [default=false]; } // =================================================================== // Options // Each of the definitions above may have "options" attached. These are // just annotations which may cause code to be generated slightly differently // or may contain hints for code that manipulates protocol messages. // // Clients may define custom options as extensions of the *Options messages. // These extensions may not yet be known at parsing time, so the parser cannot // store the values in them. Instead it stores them in a field in the *Options // message called uninterpreted_option. This field must have the same name // across all *Options messages. We then use this field to populate the // extensions when we build a descriptor, at which point all protos have been // parsed and so all extensions are known. // // Extension numbers for custom options may be chosen as follows: // * For options which will only be used within a single application or // organization, or for experimental options, use field numbers 50000 // through 99999. It is up to you to ensure that you do not use the // same number for multiple options. // * For options which will be published and used publicly by multiple // independent entities, e-mail protobuf-global-extension-registry@google.com // to reserve extension numbers. Simply provide your project name (e.g. // Objective-C plugin) and your project website (if available) -- there's no // need to explain how you intend to use them. Usually you only need one // extension number. You can declare multiple options with only one extension // number by putting them in a sub-message. See the Custom Options section of // the docs for examples: // https://developers.google.com/protocol-buffers/docs/proto#options // If this turns out to be popular, a web service will be set up // to automatically assign option numbers. message FileOptions { // Sets the Java package where classes generated from this .proto will be // placed. By default, the proto package is used, but this is often // inappropriate because proto packages do not normally start with backwards // domain names. optional string java_package = 1; // If set, all the classes from the .proto file are wrapped in a single // outer class with the given name. This applies to both Proto1 // (equivalent to the old "--one_java_file" option) and Proto2 (where // a .proto always translates to a single class, but you may want to // explicitly choose the class name). optional string java_outer_classname = 8; // If set true, then the Java code generator will generate a separate .java // file for each top-level message, enum, and service defined in the .proto // file. Thus, these types will *not* be nested inside the outer class // named by java_outer_classname. However, the outer class will still be // generated to contain the file's getDescriptor() method as well as any // top-level extensions defined in the file. optional bool java_multiple_files = 10 [default=false]; // This option does nothing. optional bool java_generate_equals_and_hash = 20 [deprecated=true]; // If set true, then the Java2 code generator will generate code that // throws an exception whenever an attempt is made to assign a non-UTF-8 // byte sequence to a string field. // Message reflection will do the same. // However, an extension field still accepts non-UTF-8 byte sequences. // This option has no effect on when used with the lite runtime. optional bool java_string_check_utf8 = 27 [default=false]; // Generated classes can be optimized for speed or code size. enum OptimizeMode { SPEED = 1; // Generate complete code for parsing, serialization, // etc. CODE_SIZE = 2; // Use ReflectionOps to implement these methods. LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. } optional OptimizeMode optimize_for = 9 [default=SPEED]; // Sets the Go package where structs generated from this .proto will be // placed. If omitted, the Go package will be derived from the following: // - The basename of the package import path, if provided. // - Otherwise, the package statement in the .proto file, if present. // - Otherwise, the basename of the .proto file, without extension. optional string go_package = 11; // Should generic services be generated in each language? "Generic" services // are not specific to any particular RPC system. They are generated by the // main code generators in each language (without additional plugins). // Generic services were the only kind of service generation supported by // early versions of google.protobuf. // // Generic services are now considered deprecated in favor of using plugins // that generate code specific to your particular RPC system. Therefore, // these default to false. Old code which depends on generic services should // explicitly set them to true. optional bool cc_generic_services = 16 [default=false]; optional bool java_generic_services = 17 [default=false]; optional bool py_generic_services = 18 [default=false]; optional bool php_generic_services = 42 [default=false]; // Is this file deprecated? // Depending on the target platform, this can emit Deprecated annotations // for everything in the file, or it will be completely ignored; in the very // least, this is a formalization for deprecating files. optional bool deprecated = 23 [default=false]; // Enables the use of arenas for the proto messages in this file. This applies // only to generated classes for C++. optional bool cc_enable_arenas = 31 [default=false]; // Sets the objective c class prefix which is prepended to all objective c // generated classes from this .proto. There is no default. optional string objc_class_prefix = 36; // Namespace for generated classes; defaults to the package. optional string csharp_namespace = 37; // By default Swift generators will take the proto package and CamelCase it // replacing '.' with underscore and use that to prefix the types/symbols // defined. When this options is provided, they will use this value instead // to prefix the types/symbols defined. optional string swift_prefix = 39; // Sets the php class prefix which is prepended to all php generated classes // from this .proto. Default is empty. optional string php_class_prefix = 40; // Use this option to change the namespace of php generated classes. Default // is empty. When this option is empty, the package name will be used for // determining the namespace. optional string php_namespace = 41; // The parser stores options it doesn't recognize here. // See the documentation for the "Options" section above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. // See the documentation for the "Options" section above. extensions 1000 to max; reserved 38; } message MessageOptions { // Set true to use the old proto1 MessageSet wire format for extensions. // This is provided for backwards-compatibility with the MessageSet wire // format. You should not use this for any other reason: It's less // efficient, has fewer features, and is more complicated. // // The message must be defined exactly as follows: // message Foo { // option message_set_wire_format = true; // extensions 4 to max; // } // Note that the message cannot have any defined fields; MessageSets only // have extensions. // // All extensions of your type must be singular messages; e.g. they cannot // be int32s, enums, or repeated messages. // // Because this is an option, the above two restrictions are not enforced by // the protocol compiler. optional bool message_set_wire_format = 1 [default=false]; // Disables the generation of the standard "descriptor()" accessor, which can // conflict with a field of the same name. This is meant to make migration // from proto1 easier; new code should avoid fields named "descriptor". optional bool no_standard_descriptor_accessor = 2 [default=false]; // Is this message deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the message, or it will be completely ignored; in the very least, // this is a formalization for deprecating messages. optional bool deprecated = 3 [default=false]; // Whether the message is an automatically generated map entry type for the // maps field. // // For maps fields: // map map_field = 1; // The parsed descriptor looks like: // message MapFieldEntry { // option map_entry = true; // optional KeyType key = 1; // optional ValueType value = 2; // } // repeated MapFieldEntry map_field = 1; // // Implementations may choose not to generate the map_entry=true message, but // use a native map in the target language to hold the keys and values. // The reflection APIs in such implementions 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 reserved 9; // javanano_as_lite // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } message FieldOptions { // The ctype option instructs the C++ code generator to use a different // representation of the field than it normally would. See the specific // options below. This option is not yet implemented in the open source // release -- sorry, we'll try to include it in a future version! optional CType ctype = 1 [default = STRING]; enum CType { // Default mode. STRING = 0; CORD = 1; STRING_PIECE = 2; } // The packed option can be enabled for repeated primitive fields to enable // a more efficient representation on the wire. Rather than repeatedly // writing the tag and type for each element, the entire array is encoded as // a single length-delimited blob. In proto3, only explicit setting it to // false will avoid using packed encoding. optional bool packed = 2; // The jstype option determines the JavaScript type used for values of the // field. The option is permitted only for 64 bit integral and fixed types // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING // is represented as JavaScript string, which avoids loss of precision that // can happen when a large value is converted to a floating point JavaScript. // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to // use the JavaScript "number" type. The behavior of the default option // JS_NORMAL is implementation dependent. // // This option is an enum to permit additional types to be added, e.g. // goog.math.Integer. optional JSType jstype = 6 [default = JS_NORMAL]; enum JSType { // Use the default type. JS_NORMAL = 0; // Use JavaScript strings. JS_STRING = 1; // Use JavaScript numbers. JS_NUMBER = 2; } // Should this field be parsed lazily? Lazy applies only to message-type // fields. It means that when the outer message is initially parsed, the // inner message's contents will not be parsed but instead stored in encoded // form. The inner message will actually be parsed when it is first accessed. // // This is only a hint. Implementations are free to choose whether to use // eager or lazy parsing regardless of the value of this option. However, // setting this option true suggests that the protocol author believes that // using lazy parsing on this field is worth the additional bookkeeping // overhead typically needed to implement it. // // This option does not affect the public interface of any generated code; // all method signatures remain the same. Furthermore, thread-safety of the // interface is not affected by this option; const methods remain safe to // call from multiple threads concurrently, while non-const methods continue // to require exclusive access. // // // Note that implementations may choose not to check required fields within // a lazy sub-message. That is, calling IsInitialized() on the outer message // may return true even if the inner message has missing required fields. // This is necessary because otherwise the inner message would have to be // parsed in order to perform the check, defeating the purpose of lazy // parsing. An implementation which chooses not to check required fields // must be consistent about it. That is, for any particular sub-message, the // implementation must either *always* check its required fields, or *never* // check its required fields, regardless of whether or not the message has // been parsed. optional bool lazy = 5 [default=false]; // Is this field deprecated? // Depending on the target platform, this can emit Deprecated annotations // for accessors, or it will be completely ignored; in the very least, this // is a formalization for deprecating fields. optional bool deprecated = 3 [default=false]; // For Google-internal migration only. Do not use. optional bool weak = 10 [default=false]; // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; reserved 4; // removed jtype } message OneofOptions { // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } message EnumOptions { // Set this option to true to allow mapping different tag names to the same // value. optional bool allow_alias = 2; // Is this enum deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the enum, or it will be completely ignored; in the very least, this // is a formalization for deprecating enums. optional bool deprecated = 3 [default=false]; reserved 5; // javanano_as_lite // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } message EnumValueOptions { // Is this enum value deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the enum value, or it will be completely ignored; in the very least, // this is a formalization for deprecating enum values. optional bool deprecated = 1 [default=false]; // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } message ServiceOptions { // Note: Field numbers 1 through 32 are reserved for Google's internal RPC // framework. We apologize for hoarding these numbers to ourselves, but // we were already using them long before we decided to release Protocol // Buffers. // Is this service deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the service, or it will be completely ignored; in the very least, // this is a formalization for deprecating services. optional bool deprecated = 33 [default=false]; // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } message MethodOptions { // Note: Field numbers 1 through 32 are reserved for Google's internal RPC // framework. We apologize for hoarding these numbers to ourselves, but // we were already using them long before we decided to release Protocol // Buffers. // Is this method deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the method, or it will be completely ignored; in the very least, // this is a formalization for deprecating methods. optional bool deprecated = 33 [default=false]; // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, // or neither? HTTP based RPC implementation may choose GET verb for safe // methods, and PUT verb for idempotent methods instead of the default POST. enum IdempotencyLevel { IDEMPOTENCY_UNKNOWN = 0; NO_SIDE_EFFECTS = 1; // implies idempotent IDEMPOTENT = 2; // idempotent, but may have side effects } optional IdempotencyLevel idempotency_level = 34 [default=IDEMPOTENCY_UNKNOWN]; // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } // A message representing a option the parser does not recognize. This only // appears in options protos created by the compiler::Parser class. // DescriptorPool resolves these when building Descriptor objects. Therefore, // options protos in descriptor objects (e.g. returned by Descriptor::options(), // or produced by Descriptor::CopyTo()) will never have UninterpretedOptions // in them. message UninterpretedOption { // The name of the uninterpreted option. Each string represents a segment in // a dot-separated name. is_extension is true iff a segment represents an // extension (denoted with parentheses in options specs in .proto files). // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents // "foo.(bar.baz).qux". message NamePart { required string name_part = 1; required bool is_extension = 2; } repeated NamePart name = 2; // The value of the uninterpreted option, in whatever type the tokenizer // identified it as during parsing. Exactly one of these should be set. optional string identifier_value = 3; optional uint64 positive_int_value = 4; optional int64 negative_int_value = 5; optional double double_value = 6; optional bytes string_value = 7; optional string aggregate_value = 8; } // =================================================================== // Optional source code info // Encapsulates information about the original source file from which a // FileDescriptorProto was generated. message SourceCodeInfo { // A Location identifies a piece of source code in a .proto file which // corresponds to a particular definition. This information is intended // to be useful to IDEs, code indexers, documentation generators, and similar // tools. // // For example, say we have a file like: // message Foo { // optional string foo = 1; // } // Let's look at just the field definition: // optional string foo = 1; // ^ ^^ ^^ ^ ^^^ // a bc de f ghi // We have the following locations: // span path represents // [a,i) [ 4, 0, 2, 0 ] The whole field definition. // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). // // Notes: // - A location may refer to a repeated field itself (i.e. not to any // particular index within it). This is used whenever a set of elements are // logically enclosed in a single code segment. For example, an entire // extend block (possibly containing multiple extension definitions) will // have an outer location whose path refers to the "extensions" repeated // field without an index. // - Multiple locations may have the same path. This happens when a single // logical declaration is spread out across multiple places. The most // obvious example is the "extend" block again -- there may be multiple // extend blocks in the same scope, each of which will have the same path. // - A location's span is not always a subset of its parent's span. For // example, the "extendee" of an extension declaration appears at the // beginning of the "extend" block and is shared by all extensions within // the block. // - Just because a location's span is a subset of some other location's span // does not mean that it is a descendent. For example, a "group" defines // both a type and a field in a single declaration. Thus, the locations // corresponding to the type and field and their components will overlap. // - Code which tries to interpret locations should probably be designed to // ignore those that it doesn't understand, as more types of locations could // be recorded in the future. repeated Location location = 1; message Location { // Identifies which part of the FileDescriptorProto was defined at this // location. // // Each element is a field number or an index. They form a path from // the root FileDescriptorProto to the place where the definition. For // example, this path: // [ 4, 3, 2, 7, 1 ] // refers to: // file.message_type(3) // 4, 3 // .field(7) // 2, 7 // .name() // 1 // This is because FileDescriptorProto.message_type has field number 4: // repeated DescriptorProto message_type = 4; // and DescriptorProto.field has field number 2: // repeated FieldDescriptorProto field = 2; // and FieldDescriptorProto.name has field number 1: // optional string name = 1; // // Thus, the above path gives the location of a field name. If we removed // the last element: // [ 4, 3, 2, 7 ] // this path refers to the whole field declaration (from the beginning // of the label to the terminating semicolon). repeated int32 path = 1 [packed=true]; // Always has exactly three or four elements: start line, start column, // end line (optional, otherwise assumed same as start line), end column. // These are packed into a single field for efficiency. Note that line // and column numbers are zero-based -- typically you will want to add // 1 to each before displaying to a user. repeated int32 span = 2 [packed=true]; // If this SourceCodeInfo represents a complete declaration, these are any // comments appearing before and after the declaration which appear to be // attached to the declaration. // // A series of line comments appearing on consecutive lines, with no other // tokens appearing on those lines, will be treated as a single comment. // // leading_detached_comments will keep paragraphs of comments that appear // before (but not connected to) the current element. Each paragraph, // separated by empty lines, will be one comment element in the repeated // field. // // Only the comment content is provided; comment markers (e.g. //) are // stripped out. For block comments, leading whitespace and an asterisk // will be stripped from the beginning of each line other than the first. // Newlines are included in the output. // // Examples: // // optional int32 foo = 1; // Comment attached to foo. // // Comment attached to bar. // optional int32 bar = 2; // // optional string baz = 3; // // Comment attached to baz. // // Another line attached to baz. // // // Comment attached to qux. // // // // Another line attached to qux. // optional double qux = 4; // // // Detached comment for corge. This is not leading or trailing comments // // to qux or corge because there are blank lines separating it from // // both. // // // Detached comment for corge paragraph 2. // // optional string corge = 5; // /* Block comment attached // * to corge. Leading asterisks // * will be removed. */ // /* Block comment attached to // * grault. */ // optional int32 grault = 6; // // // ignored detached comments. optional string leading_comments = 3; optional string trailing_comments = 4; repeated string leading_detached_comments = 6; } } // Describes the relationship between generated code and its original source // file. A GeneratedCodeInfo message is associated with only one generated // source file, but may contain references to different source .proto files. message GeneratedCodeInfo { // An Annotation connects some span of text in generated code to an element // of its generating .proto file. repeated Annotation annotation = 1; message Annotation { // Identifies the element in the original source .proto file. This field // is formatted the same as SourceCodeInfo.Location.path. repeated int32 path = 1 [packed=true]; // Identifies the filesystem path to the original source .proto. optional string source_file = 2; // Identifies the starting offset in bytes in the generated code // that relates to the identified object. 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 // the last relevant byte (so the length of the text = end - begin). optional int32 end = 4; } } python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/duration.proto000066400000000000000000000114321334102242000267010ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; option go_package = "github.com/golang/protobuf/ptypes/duration"; option java_package = "com.google.protobuf"; option java_outer_classname = "DurationProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // A Duration represents a signed, fixed-length span of time represented // as a count of seconds and fractions of seconds at nanosecond // resolution. It is independent of any calendar and concepts like "day" // or "month". It is related to Timestamp in that the difference between // two Timestamp values is a Duration and it can be added or subtracted // from a Timestamp. Range is approximately +-10,000 years. // // # Examples // // Example 1: Compute Duration from two Timestamps in pseudo code. // // Timestamp start = ...; // Timestamp end = ...; // Duration duration = ...; // // duration.seconds = end.seconds - start.seconds; // duration.nanos = end.nanos - start.nanos; // // if (duration.seconds < 0 && duration.nanos > 0) { // duration.seconds += 1; // duration.nanos -= 1000000000; // } else if (durations.seconds > 0 && duration.nanos < 0) { // duration.seconds -= 1; // duration.nanos += 1000000000; // } // // Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. // // Timestamp start = ...; // Duration duration = ...; // Timestamp end = ...; // // end.seconds = start.seconds + duration.seconds; // end.nanos = start.nanos + duration.nanos; // // if (end.nanos < 0) { // end.seconds -= 1; // end.nanos += 1000000000; // } else if (end.nanos >= 1000000000) { // end.seconds += 1; // end.nanos -= 1000000000; // } // // Example 3: Compute Duration from datetime.timedelta in Python. // // td = datetime.timedelta(days=3, minutes=10) // duration = Duration() // duration.FromTimedelta(td) // // # JSON Mapping // // In JSON format, the Duration type is encoded as a string rather than an // object, where the string ends in the suffix "s" (indicating seconds) and // is preceded by the number of seconds, with nanoseconds expressed as // fractional seconds. For example, 3 seconds with 0 nanoseconds should be // encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should // be expressed in JSON format as "3.000000001s", and 3 seconds and 1 // microsecond should be expressed in JSON format as "3.000001s". // // message Duration { // Signed seconds of the span of time. Must be from -315,576,000,000 // to +315,576,000,000 inclusive. Note: these bounds are computed from: // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years int64 seconds = 1; // Signed fractions of a second at nanosecond resolution of the span // of time. Durations less than one second are represented with a 0 // `seconds` field and a positive or negative `nanos` field. For durations // of one second or more, a non-zero value for the `nanos` field must be // of the same sign as the `seconds` field. Must be from -999,999,999 // to +999,999,999 inclusive. int32 nanos = 2; } python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/empty.proto000066400000000000000000000045661334102242000262240ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option go_package = "github.com/golang/protobuf/ptypes/empty"; option java_package = "com.google.protobuf"; option java_outer_classname = "EmptyProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; option cc_enable_arenas = true; // A generic empty message that you can re-use to avoid defining duplicated // empty messages in your APIs. A typical example is to use it as the request // or the response type of an API method. For instance: // // service Foo { // rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); // } // // The JSON representation for `Empty` is empty JSON object `{}`. message Empty {} python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/field_mask.proto000066400000000000000000000200041334102242000271450ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option java_package = "com.google.protobuf"; option java_outer_classname = "FieldMaskProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; option go_package = "google.golang.org/genproto/protobuf/field_mask;field_mask"; // `FieldMask` represents a set of symbolic field paths, for example: // // paths: "f.a" // paths: "f.b.d" // // Here `f` represents a field in some root message, `a` and `b` // fields in the message found in `f`, and `d` a field found in the // message in `f.b`. // // Field masks are used to specify a subset of fields that should be // returned by a get operation or modified by an update operation. // Field masks also have a custom JSON encoding (see below). // // # Field Masks in Projections // // When used in the context of a projection, a response message or // sub-message is filtered by the API to only contain those fields as // specified in the mask. For example, if the mask in the previous // example is applied to a response message as follows: // // f { // a : 22 // b { // d : 1 // x : 2 // } // y : 13 // } // z: 8 // // The result will not contain specific values for fields x,y and z // (their value will be set to the default, and omitted in proto text // output): // // // f { // a : 22 // b { // d : 1 // } // } // // A repeated field is not allowed except at the last position of a // paths string. // // If a FieldMask object is not present in a get operation, the // operation applies to all fields (as if a FieldMask of all fields // had been specified). // // Note that a field mask does not necessarily apply to the // top-level response message. In case of a REST get operation, the // field mask applies directly to the response, but in case of a REST // list operation, the mask instead applies to each individual message // in the returned resource list. In case of a REST custom method, // other definitions may be used. Where the mask applies will be // clearly documented together with its declaration in the API. In // any case, the effect on the returned resource/resources is required // behavior for APIs. // // # Field Masks in Update Operations // // A field mask in update operations specifies which fields of the // targeted resource are going to be updated. The API is required // to only change the values of the fields as specified in the mask // and leave the others untouched. If a resource is passed in to // describe the updated values, the API ignores the values of all // fields not covered by the mask. // // If a repeated field is specified for an update operation, the existing // repeated values in the target resource will be overwritten by the new values. // Note that a repeated field is only allowed in the last position of a `paths` // string. // // If a sub-message is specified in the last position of the field mask for an // update operation, then the existing sub-message in the target resource is // overwritten. Given the target message: // // f { // b { // d : 1 // x : 2 // } // c : 1 // } // // And an update message: // // f { // b { // d : 10 // } // } // // then if the field mask is: // // paths: "f.b" // // then the result will be: // // f { // b { // d : 10 // } // c : 1 // } // // However, if the update mask was: // // paths: "f.b.d" // // then the result would be: // // f { // b { // d : 10 // x : 2 // } // c : 1 // } // // In order to reset a field's value to the default, the field must // be in the mask and set to the default value in the provided resource. // Hence, in order to reset all fields of a resource, provide a default // instance of the resource and set all fields in the mask, or do // not provide a mask as described below. // // If a field mask is not present on update, the operation applies to // all fields (as if a field mask of all fields has been specified). // Note that in the presence of schema evolution, this may mean that // fields the client does not know and has therefore not filled into // the request will be reset to their default. If this is unwanted // behavior, a specific service may require a client to always specify // a field mask, producing an error if not. // // As with get operations, the location of the resource which // describes the updated values in the request message depends on the // operation kind. In any case, the effect of the field mask is // required to be honored by the API. // // ## Considerations for HTTP REST // // The HTTP kind of an update operation which uses a field mask must // be set to PATCH instead of PUT in order to satisfy HTTP semantics // (PUT must only be used for full updates). // // # JSON Encoding of Field Masks // // In JSON, a field mask is encoded as a single string where paths are // separated by a comma. Fields name in each path are converted // to/from lower-camel naming conventions. // // As an example, consider the following message declarations: // // message Profile { // User user = 1; // Photo photo = 2; // } // message User { // string display_name = 1; // string address = 2; // } // // In proto a field mask for `Profile` may look as such: // // mask { // paths: "user.display_name" // paths: "photo" // } // // In JSON, the same mask is represented as below: // // { // mask: "user.displayName,photo" // } // // # Field Masks and Oneof Fields // // Field masks treat fields in oneofs just as regular fields. Consider the // following message: // // message SampleMessage { // oneof test_oneof { // string name = 4; // SubMessage sub_message = 9; // } // } // // The field mask can be: // // mask { // paths: "name" // } // // Or: // // mask { // paths: "sub_message" // } // // Note that oneof type names ("test_oneof" in this case) cannot be used in // paths. // // ## Field Mask Verification // // The implementation of the all the API methods, which have any FieldMask type // field in the request, should verify the included field paths, and return // `INVALID_ARGUMENT` error if any path is duplicated or unmappable. message FieldMask { // The set of field mask paths. repeated string paths = 1; } python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/source_context.proto000066400000000000000000000044601334102242000301230ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option java_package = "com.google.protobuf"; option java_outer_classname = "SourceContextProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; option go_package = "google.golang.org/genproto/protobuf/source_context;source_context"; // `SourceContext` represents information about the source of a // protobuf element, like the file in which it is defined. message SourceContext { // The path-qualified name of the .proto file that contained the associated // protobuf element. For example: `"google/protobuf/source_context.proto"`. string file_name = 1; } python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/struct.proto000066400000000000000000000073051334102242000264040ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; option go_package = "github.com/golang/protobuf/ptypes/struct;structpb"; option java_package = "com.google.protobuf"; option java_outer_classname = "StructProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // `Struct` represents a structured data value, consisting of fields // which map to dynamically typed values. In some languages, `Struct` // might be supported by a native representation. For example, in // scripting languages like JS a struct is represented as an // object. The details of that representation are described together // with the proto support for the language. // // The JSON representation for `Struct` is JSON object. message Struct { // Unordered map of dynamically typed values. map fields = 1; } // `Value` represents a dynamically typed value which can be either // null, a number, a string, a boolean, a recursive struct value, or a // list of values. A producer of value is expected to set one of that // variants, absence of any variant indicates an error. // // The JSON representation for `Value` is JSON value. message Value { // The kind of value. oneof kind { // Represents a null value. NullValue null_value = 1; // Represents a double value. double number_value = 2; // Represents a string value. string string_value = 3; // Represents a boolean value. bool bool_value = 4; // Represents a structured value. Struct struct_value = 5; // Represents a repeated `Value`. ListValue list_value = 6; } } // `NullValue` is a singleton enumeration to represent the null value for the // `Value` type union. // // The JSON representation for `NullValue` is JSON `null`. enum NullValue { // Null value. NULL_VALUE = 0; } // `ListValue` is a wrapper around a repeated field of values. // // The JSON representation for `ListValue` is JSON array. message ListValue { // Repeated field of dynamically typed values. repeated Value values = 1; } python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/timestamp.proto000066400000000000000000000135271334102242000270660ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; option go_package = "github.com/golang/protobuf/ptypes/timestamp"; option java_package = "com.google.protobuf"; option java_outer_classname = "TimestampProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // A Timestamp represents a point in time independent of any time zone // or calendar, represented as seconds and fractions of seconds at // nanosecond resolution in UTC Epoch time. It is encoded using the // Proleptic Gregorian Calendar which extends the Gregorian calendar // backwards to year one. It is encoded assuming all minutes are 60 // seconds long, i.e. leap seconds are "smeared" so that no leap second // table is needed for interpretation. Range is from // 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. // By restricting to that range, we ensure that we can convert to // and from RFC 3339 date strings. // See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). // // # Examples // // Example 1: Compute Timestamp from POSIX `time()`. // // Timestamp timestamp; // timestamp.set_seconds(time(NULL)); // timestamp.set_nanos(0); // // Example 2: Compute Timestamp from POSIX `gettimeofday()`. // // struct timeval tv; // gettimeofday(&tv, NULL); // // Timestamp timestamp; // timestamp.set_seconds(tv.tv_sec); // timestamp.set_nanos(tv.tv_usec * 1000); // // Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. // // FILETIME ft; // GetSystemTimeAsFileTime(&ft); // UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; // // // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z // // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. // Timestamp timestamp; // timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); // timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); // // Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. // // long millis = System.currentTimeMillis(); // // Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) // .setNanos((int) ((millis % 1000) * 1000000)).build(); // // // Example 5: Compute Timestamp from current time in Python. // // timestamp = Timestamp() // timestamp.GetCurrentTime() // // # JSON Mapping // // In JSON format, the Timestamp type is encoded as a string in the // [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the // format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" // where {year} is always expressed using four digits while {month}, {day}, // {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional // seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), // are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone // is required, though only UTC (as indicated by "Z") is presently supported. // // For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past // 01:30 UTC on January 15, 2017. // // In JavaScript, one can convert a Date object to this format using the // standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] // method. In Python, a standard `datetime.datetime` object can be converted // to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) // with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one // can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( // http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--) // to obtain a formatter capable of generating timestamps in this format. // // message Timestamp { // Represents seconds of UTC time since Unix epoch // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to // 9999-12-31T23:59:59Z inclusive. int64 seconds = 1; // Non-negative fractions of a second at nanosecond resolution. Negative // second values with fractions must still have non-negative nanos values // that count forward in time. Must be from 0 to 999,999,999 // inclusive. int32 nanos = 2; } python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/type.proto000066400000000000000000000142131334102242000260350ustar00rootroot00000000000000// 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 google.protobuf; import "google/protobuf/any.proto"; import "google/protobuf/source_context.proto"; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; option java_package = "com.google.protobuf"; option java_outer_classname = "TypeProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; option go_package = "google.golang.org/genproto/protobuf/ptype;ptype"; // A protocol buffer message type. message Type { // The fully qualified message name. string name = 1; // The list of fields. repeated Field fields = 2; // The list of types appearing in `oneof` definitions in this type. repeated string oneofs = 3; // The protocol buffer options. repeated Option options = 4; // The source context. SourceContext source_context = 5; // The source syntax. Syntax syntax = 6; } // A single field of a message type. message Field { // Basic field types. enum Kind { // Field type unknown. TYPE_UNKNOWN = 0; // Field type double. TYPE_DOUBLE = 1; // Field type float. TYPE_FLOAT = 2; // Field type int64. TYPE_INT64 = 3; // Field type uint64. TYPE_UINT64 = 4; // Field type int32. TYPE_INT32 = 5; // Field type fixed64. TYPE_FIXED64 = 6; // Field type fixed32. TYPE_FIXED32 = 7; // Field type bool. TYPE_BOOL = 8; // Field type string. TYPE_STRING = 9; // Field type group. Proto2 syntax only, and deprecated. TYPE_GROUP = 10; // Field type message. TYPE_MESSAGE = 11; // Field type bytes. TYPE_BYTES = 12; // Field type uint32. TYPE_UINT32 = 13; // Field type enum. TYPE_ENUM = 14; // Field type sfixed32. TYPE_SFIXED32 = 15; // Field type sfixed64. TYPE_SFIXED64 = 16; // Field type sint32. TYPE_SINT32 = 17; // Field type sint64. TYPE_SINT64 = 18; }; // Whether a field is optional, required, or repeated. enum Cardinality { // For fields with unknown cardinality. CARDINALITY_UNKNOWN = 0; // For optional fields. CARDINALITY_OPTIONAL = 1; // For required fields. Proto2 syntax only. CARDINALITY_REQUIRED = 2; // For repeated fields. CARDINALITY_REPEATED = 3; }; // The field type. Kind kind = 1; // The field cardinality. Cardinality cardinality = 2; // The field number. int32 number = 3; // The field name. string name = 4; // The field type URL, without the scheme, for message or enumeration // types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`. string type_url = 6; // The index of the field type in `Type.oneofs`, for message or enumeration // types. The first type has index 1; zero means the type is not in the list. int32 oneof_index = 7; // Whether to use alternative packed wire representation. bool packed = 8; // The protocol buffer options. repeated Option options = 9; // The field JSON name. string json_name = 10; // The string value of the default value of this field. Proto2 syntax only. string default_value = 11; } // Enum type definition. message Enum { // Enum type name. string name = 1; // Enum value definitions. repeated EnumValue enumvalue = 2; // Protocol buffer options. repeated Option options = 3; // The source context. SourceContext source_context = 4; // The source syntax. Syntax syntax = 5; } // Enum value definition. message EnumValue { // Enum value name. string name = 1; // Enum value number. int32 number = 2; // Protocol buffer options. repeated Option options = 3; } // A protocol buffer option, which can be attached to a message, field, // enumeration, etc. message Option { // The option's name. For protobuf built-in options (options defined in // descriptor.proto), this is the short name. For example, `"map_entry"`. // For custom options, it should be the fully-qualified name. For example, // `"google.api.http"`. string name = 1; // The option's value packed in an Any message. If the value is a primitive, // the corresponding wrapper type defined in google/protobuf/wrappers.proto // should be used. If the value is an enum, it should be stored as an int32 // value using the google.protobuf.Int32Value type. Any value = 2; } // The syntax in which a protocol buffer element is defined. enum Syntax { // Syntax `proto2`. SYNTAX_PROTO2 = 0; // Syntax `proto3`. SYNTAX_PROTO3 = 1; } python-grpc-tools-1.14.1/grpc_tools/_proto/google/protobuf/wrappers.proto000066400000000000000000000072411334102242000267220ustar00rootroot00000000000000// 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. // Wrappers for primitive (non-message) types. These types are useful // for embedding primitives in the `google.protobuf.Any` type and for places // where we need to distinguish between the absence of a primitive // typed field and its default value. syntax = "proto3"; package google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; option go_package = "github.com/golang/protobuf/ptypes/wrappers"; option java_package = "com.google.protobuf"; option java_outer_classname = "WrappersProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // Wrapper message for `double`. // // The JSON representation for `DoubleValue` is JSON number. message DoubleValue { // The double value. double value = 1; } // Wrapper message for `float`. // // The JSON representation for `FloatValue` is JSON number. message FloatValue { // The float value. float value = 1; } // Wrapper message for `int64`. // // The JSON representation for `Int64Value` is JSON string. message Int64Value { // The int64 value. int64 value = 1; } // Wrapper message for `uint64`. // // The JSON representation for `UInt64Value` is JSON string. message UInt64Value { // The uint64 value. uint64 value = 1; } // Wrapper message for `int32`. // // The JSON representation for `Int32Value` is JSON number. message Int32Value { // The int32 value. int32 value = 1; } // Wrapper message for `uint32`. // // The JSON representation for `UInt32Value` is JSON number. message UInt32Value { // The uint32 value. uint32 value = 1; } // Wrapper message for `bool`. // // The JSON representation for `BoolValue` is JSON `true` and `false`. message BoolValue { // The bool value. bool value = 1; } // Wrapper message for `string`. // // The JSON representation for `StringValue` is JSON string. message StringValue { // The string value. string value = 1; } // Wrapper message for `bytes`. // // The JSON representation for `BytesValue` is JSON string. message BytesValue { // The bytes value. bytes value = 1; } python-grpc-tools-1.14.1/grpc_tools/_protoc_compiler.cpp000066400000000000000000003613041334102242000234220ustar00rootroot00000000000000/* Generated by Cython 0.28.4 */ /* BEGIN: Cython Metadata { "distutils": { "define_macros": [ [ "HAVE_PTHREAD", 1 ] ], "depends": [ "grpc_tools/main.h" ], "extra_compile_args": [ "-std=c++11", "-fno-wrapv", "-frtti" ], "extra_link_args": [ "-lpthread" ], "include_dirs": [ ".", "grpc_root", "grpc_root/include", "third_party/protobuf/src" ], "language": "c++", "name": "grpc_tools._protoc_compiler", "sources": [ "grpc_tools/_protoc_compiler.pyx", "grpc_tools/main.cc", "grpc_root/src/compiler/python_generator.cc", "grpc_tools/protobuf_generated_well_known_types_embed.cc", "third_party/protobuf/src/google/protobuf/compiler/zip_writer.cc", "third_party/protobuf/src/google/protobuf/compiler/subprocess.cc", "third_party/protobuf/src/google/protobuf/compiler/ruby/ruby_generator.cc", "third_party/protobuf/src/google/protobuf/compiler/python/python_generator.cc", "third_party/protobuf/src/google/protobuf/compiler/plugin.pb.cc", "third_party/protobuf/src/google/protobuf/compiler/plugin.cc", "third_party/protobuf/src/google/protobuf/compiler/php/php_generator.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_message.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_generator.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_file.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_field.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_extension.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc", "third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_enum.cc", "third_party/protobuf/src/google/protobuf/compiler/js/js_generator.cc", "third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc", "third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_message_field.cc", "third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_message.cc", "third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_map_field.cc", "third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_helpers.cc", "third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_generator.cc", "third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_file.cc", "third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_field.cc", "third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_extension.cc", "third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_enum_field.cc", "third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_enum.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_string_field_lite.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_string_field.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_service.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_primitive_field_lite.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_name_resolver.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_message_lite.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_message_field_lite.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_message_field.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_message_builder_lite.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_message_builder.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_message.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_map_field_lite.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_map_field.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field_lite.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_helpers.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_generator_factory.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_generator.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_field.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_extension_lite.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_extension.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_enum_lite.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_enum_field_lite.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_enum.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc", "third_party/protobuf/src/google/protobuf/compiler/java/java_context.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_message_field.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_message.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_map_field.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_helpers.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_generator.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_field_base.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_enum_field.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_enum.cc", "third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_map_field.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc", "third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc", "third_party/protobuf/src/google/protobuf/compiler/command_line_interface.cc", "third_party/protobuf/src/google/protobuf/compiler/code_generator.cc", "third_party/protobuf/src/google/protobuf/wrappers.pb.cc", "third_party/protobuf/src/google/protobuf/wire_format.cc", "third_party/protobuf/src/google/protobuf/util/type_resolver_util.cc", "third_party/protobuf/src/google/protobuf/util/time_util.cc", "third_party/protobuf/src/google/protobuf/util/message_differencer.cc", "third_party/protobuf/src/google/protobuf/util/json_util.cc", "third_party/protobuf/src/google/protobuf/util/internal/utility.cc", "third_party/protobuf/src/google/protobuf/util/internal/type_info_test_helper.cc", "third_party/protobuf/src/google/protobuf/util/internal/type_info.cc", "third_party/protobuf/src/google/protobuf/util/internal/protostream_objectwriter.cc", "third_party/protobuf/src/google/protobuf/util/internal/protostream_objectsource.cc", "third_party/protobuf/src/google/protobuf/util/internal/proto_writer.cc", "third_party/protobuf/src/google/protobuf/util/internal/object_writer.cc", "third_party/protobuf/src/google/protobuf/util/internal/json_stream_parser.cc", "third_party/protobuf/src/google/protobuf/util/internal/json_objectwriter.cc", "third_party/protobuf/src/google/protobuf/util/internal/json_escaping.cc", "third_party/protobuf/src/google/protobuf/util/internal/field_mask_utility.cc", "third_party/protobuf/src/google/protobuf/util/internal/error_listener.cc", "third_party/protobuf/src/google/protobuf/util/internal/default_value_objectwriter.cc", "third_party/protobuf/src/google/protobuf/util/internal/datapiece.cc", "third_party/protobuf/src/google/protobuf/util/field_mask_util.cc", "third_party/protobuf/src/google/protobuf/util/field_comparator.cc", "third_party/protobuf/src/google/protobuf/util/delimited_message_util.cc", "third_party/protobuf/src/google/protobuf/unknown_field_set.cc", "third_party/protobuf/src/google/protobuf/type.pb.cc", "third_party/protobuf/src/google/protobuf/timestamp.pb.cc", "third_party/protobuf/src/google/protobuf/text_format.cc", "third_party/protobuf/src/google/protobuf/stubs/substitute.cc", "third_party/protobuf/src/google/protobuf/stubs/mathlimits.cc", "third_party/protobuf/src/google/protobuf/struct.pb.cc", "third_party/protobuf/src/google/protobuf/source_context.pb.cc", "third_party/protobuf/src/google/protobuf/service.cc", "third_party/protobuf/src/google/protobuf/reflection_ops.cc", "third_party/protobuf/src/google/protobuf/message.cc", "third_party/protobuf/src/google/protobuf/map_field.cc", "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc", "third_party/protobuf/src/google/protobuf/io/tokenizer.cc", "third_party/protobuf/src/google/protobuf/io/strtod.cc", "third_party/protobuf/src/google/protobuf/io/printer.cc", "third_party/protobuf/src/google/protobuf/io/gzip_stream.cc", "third_party/protobuf/src/google/protobuf/generated_message_table_driven.cc", "third_party/protobuf/src/google/protobuf/generated_message_reflection.cc", "third_party/protobuf/src/google/protobuf/field_mask.pb.cc", "third_party/protobuf/src/google/protobuf/extension_set_heavy.cc", "third_party/protobuf/src/google/protobuf/empty.pb.cc", "third_party/protobuf/src/google/protobuf/dynamic_message.cc", "third_party/protobuf/src/google/protobuf/duration.pb.cc", "third_party/protobuf/src/google/protobuf/descriptor_database.cc", "third_party/protobuf/src/google/protobuf/descriptor.pb.cc", "third_party/protobuf/src/google/protobuf/descriptor.cc", "third_party/protobuf/src/google/protobuf/compiler/parser.cc", "third_party/protobuf/src/google/protobuf/compiler/importer.cc", "third_party/protobuf/src/google/protobuf/api.pb.cc", "third_party/protobuf/src/google/protobuf/any.pb.cc", "third_party/protobuf/src/google/protobuf/any.cc", "third_party/protobuf/src/google/protobuf/wire_format_lite.cc", "third_party/protobuf/src/google/protobuf/stubs/time.cc", "third_party/protobuf/src/google/protobuf/stubs/strutil.cc", "third_party/protobuf/src/google/protobuf/stubs/structurally_valid.cc", "third_party/protobuf/src/google/protobuf/stubs/stringprintf.cc", "third_party/protobuf/src/google/protobuf/stubs/stringpiece.cc", "third_party/protobuf/src/google/protobuf/stubs/statusor.cc", "third_party/protobuf/src/google/protobuf/stubs/status.cc", "third_party/protobuf/src/google/protobuf/stubs/once.cc", "third_party/protobuf/src/google/protobuf/stubs/io_win32.cc", "third_party/protobuf/src/google/protobuf/stubs/int128.cc", "third_party/protobuf/src/google/protobuf/stubs/common.cc", "third_party/protobuf/src/google/protobuf/stubs/bytestream.cc", "third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc", "third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc", "third_party/protobuf/src/google/protobuf/repeated_field.cc", "third_party/protobuf/src/google/protobuf/message_lite.cc", "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc", "third_party/protobuf/src/google/protobuf/io/zero_copy_stream.cc", "third_party/protobuf/src/google/protobuf/io/coded_stream.cc", "third_party/protobuf/src/google/protobuf/generated_message_util.cc", "third_party/protobuf/src/google/protobuf/generated_message_table_driven_lite.cc", "third_party/protobuf/src/google/protobuf/extension_set.cc", "third_party/protobuf/src/google/protobuf/arenastring.cc", "third_party/protobuf/src/google/protobuf/arena.cc" ] }, "module_name": "grpc_tools._protoc_compiler" } END: Cython Metadata */ #define PY_SSIZE_T_CLEAN #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else #define CYTHON_ABI "0_28_4" #define CYTHON_FUTURE_DIVISION 0 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #if PY_VERSION_HEX >= 0x02070000 #define HAVE_LONG_LONG #endif #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #elif !defined(CYTHON_USE_PYLONG_INTERNALS) #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT (0 && PY_VERSION_HEX >= 0x03050000) #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #undef SHIFT #undef BASE #undef MASK #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } # else # define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; #endif #endif #else #include #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) && __cplusplus >= 201103L #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #elif __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__ ) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifndef __cplusplus #error "Cython files generated with the C++ option must be compiled with a C++ compiler." #endif #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #else #define CYTHON_INLINE inline #endif #endif template void __Pyx_call_destructor(T& x) { x.~T(); } template class __Pyx_FakeReference { public: __Pyx_FakeReference() : ptr(NULL) { } __Pyx_FakeReference(const T& ref) : ptr(const_cast(&ref)) { } T *operator->() { return ptr; } T *operator&() { return ptr; } operator T&() { return *ptr; } template bool operator ==(U other) { return *ptr == other; } template bool operator !=(U other) { return *ptr != other; } private: T *ptr; }; #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyType_Type #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_FAST_PYCCALL #define __Pyx_PyFastCFunction_Check(func)\ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS))))) #else #define __Pyx_PyFastCFunction_Check(func) 0 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_PYSTON #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; // PyThread_create_key reports success always } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif // TSS (Thread Specific Storage) API #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) #else #define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #define PyObject_Unicode PyObject_Str #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #else #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_ERR(f_index, lineno, Ln_error) \ { \ __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ } #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__grpc_tools___protoc_compiler #define __PYX_HAVE_API__grpc_tools___protoc_compiler /* Early includes */ #include #include #include "grpc_tools/main.h" #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_cython_runtime = NULL; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "grpc_tools/_protoc_compiler.pyx", }; /*--- Type declarations ---*/ /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* ArgTypeTest.proto */ #define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ __Pyx__ArgTypeTest(obj, type, name, exact)) static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); /* GetItemInt.proto */ #define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ __Pyx_GetItemInt_Generic(o, to_py_func(i)))) #define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); #define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck); /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* Module declarations from 'libc' */ /* Module declarations from 'libc.string' */ /* Module declarations from 'libc.stdlib' */ /* Module declarations from 'grpc_tools._protoc_compiler' */ #define __Pyx_MODULE_NAME "grpc_tools._protoc_compiler" extern int __pyx_module_is_main_grpc_tools___protoc_compiler; int __pyx_module_is_main_grpc_tools___protoc_compiler = 0; /* Implementation of 'grpc_tools._protoc_compiler' */ static PyObject *__pyx_builtin_range; static const char __pyx_k_i[] = "i"; static const char __pyx_k_args[] = "args"; static const char __pyx_k_argv[] = "argv"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_range[] = "range"; static const char __pyx_k_run_main[] = "run_main"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_grpc_tools__protoc_compiler[] = "grpc_tools._protoc_compiler"; static const char __pyx_k_grpc_tools__protoc_compiler_pyx[] = "grpc_tools/_protoc_compiler.pyx"; static PyObject *__pyx_n_s_args; static PyObject *__pyx_n_s_argv; static PyObject *__pyx_n_s_cline_in_traceback; static PyObject *__pyx_n_s_grpc_tools__protoc_compiler; static PyObject *__pyx_kp_s_grpc_tools__protoc_compiler_pyx; static PyObject *__pyx_n_s_i; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_range; static PyObject *__pyx_n_s_run_main; static PyObject *__pyx_n_s_test; static PyObject *__pyx_pf_10grpc_tools_16_protoc_compiler_run_main(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_args); /* proto */ static PyObject *__pyx_tuple_; static PyObject *__pyx_codeobj__2; /* Late includes */ /* "grpc_tools/_protoc_compiler.pyx":20 * int protoc_main(int argc, char *argv[]) * * def run_main(list args not None): # <<<<<<<<<<<<<< * cdef char **argv = stdlib.malloc(len(args)*sizeof(char *)) * for i in range(len(args)): */ /* Python wrapper */ static PyObject *__pyx_pw_10grpc_tools_16_protoc_compiler_1run_main(PyObject *__pyx_self, PyObject *__pyx_v_args); /*proto*/ static PyMethodDef __pyx_mdef_10grpc_tools_16_protoc_compiler_1run_main = {"run_main", (PyCFunction)__pyx_pw_10grpc_tools_16_protoc_compiler_1run_main, METH_O, 0}; static PyObject *__pyx_pw_10grpc_tools_16_protoc_compiler_1run_main(PyObject *__pyx_self, PyObject *__pyx_v_args) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("run_main (wrapper)", 0); if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_args), (&PyList_Type), 0, "args", 1))) __PYX_ERR(0, 20, __pyx_L1_error) __pyx_r = __pyx_pf_10grpc_tools_16_protoc_compiler_run_main(__pyx_self, ((PyObject*)__pyx_v_args)); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_10grpc_tools_16_protoc_compiler_run_main(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_args) { char **__pyx_v_argv; Py_ssize_t __pyx_v_i; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations Py_ssize_t __pyx_t_1; Py_ssize_t __pyx_t_2; Py_ssize_t __pyx_t_3; PyObject *__pyx_t_4 = NULL; char *__pyx_t_5; __Pyx_RefNannySetupContext("run_main", 0); /* "grpc_tools/_protoc_compiler.pyx":21 * * def run_main(list args not None): * cdef char **argv = stdlib.malloc(len(args)*sizeof(char *)) # <<<<<<<<<<<<<< * for i in range(len(args)): * argv[i] = args[i] */ __pyx_t_1 = PyList_GET_SIZE(__pyx_v_args); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 21, __pyx_L1_error) __pyx_v_argv = ((char **)malloc((__pyx_t_1 * (sizeof(char *))))); /* "grpc_tools/_protoc_compiler.pyx":22 * def run_main(list args not None): * cdef char **argv = stdlib.malloc(len(args)*sizeof(char *)) * for i in range(len(args)): # <<<<<<<<<<<<<< * argv[i] = args[i] * return protoc_main(len(args), argv) */ __pyx_t_1 = PyList_GET_SIZE(__pyx_v_args); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 22, __pyx_L1_error) __pyx_t_2 = __pyx_t_1; for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { __pyx_v_i = __pyx_t_3; /* "grpc_tools/_protoc_compiler.pyx":23 * cdef char **argv = stdlib.malloc(len(args)*sizeof(char *)) * for i in range(len(args)): * argv[i] = args[i] # <<<<<<<<<<<<<< * return protoc_main(len(args), argv) */ __pyx_t_4 = __Pyx_GetItemInt_List(__pyx_v_args, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 1, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 23, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyObject_AsWritableString(__pyx_t_4); if (unlikely((!__pyx_t_5) && PyErr_Occurred())) __PYX_ERR(0, 23, __pyx_L1_error) (__pyx_v_argv[__pyx_v_i]) = __pyx_t_5; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } /* "grpc_tools/_protoc_compiler.pyx":24 * for i in range(len(args)): * argv[i] = args[i] * return protoc_main(len(args), argv) # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyList_GET_SIZE(__pyx_v_args); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 24, __pyx_L1_error) __pyx_t_4 = __Pyx_PyInt_From_int(protoc_main(__pyx_t_1, __pyx_v_argv)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; /* "grpc_tools/_protoc_compiler.pyx":20 * int protoc_main(int argc, char *argv[]) * * def run_main(list args not None): # <<<<<<<<<<<<<< * cdef char **argv = stdlib.malloc(len(args)*sizeof(char *)) * for i in range(len(args)): */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("grpc_tools._protoc_compiler.run_main", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec__protoc_compiler(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec__protoc_compiler}, {0, NULL} }; #endif static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, "_protoc_compiler", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, {&__pyx_n_s_argv, __pyx_k_argv, sizeof(__pyx_k_argv), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_grpc_tools__protoc_compiler, __pyx_k_grpc_tools__protoc_compiler, sizeof(__pyx_k_grpc_tools__protoc_compiler), 0, 0, 1, 1}, {&__pyx_kp_s_grpc_tools__protoc_compiler_pyx, __pyx_k_grpc_tools__protoc_compiler_pyx, sizeof(__pyx_k_grpc_tools__protoc_compiler_pyx), 0, 0, 1, 0}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_n_s_run_main, __pyx_k_run_main, sizeof(__pyx_k_run_main), 0, 0, 1, 1}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 22, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "grpc_tools/_protoc_compiler.pyx":20 * int protoc_main(int argc, char *argv[]) * * def run_main(list args not None): # <<<<<<<<<<<<<< * cdef char **argv = stdlib.malloc(len(args)*sizeof(char *)) * for i in range(len(args)): */ __pyx_tuple_ = PyTuple_Pack(3, __pyx_n_s_args, __pyx_n_s_argv, __pyx_n_s_i); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 20, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_grpc_tools__protoc_compiler_pyx, __pyx_n_s_run_main, 20, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) __PYX_ERR(0, 20, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); return 0; __pyx_L1_error:; return -1; } static int __Pyx_modinit_global_init_code(void); /*proto*/ static int __Pyx_modinit_variable_export_code(void); /*proto*/ static int __Pyx_modinit_function_export_code(void); /*proto*/ static int __Pyx_modinit_type_init_code(void); /*proto*/ static int __Pyx_modinit_type_import_code(void); /*proto*/ static int __Pyx_modinit_variable_import_code(void); /*proto*/ static int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #if PY_MAJOR_VERSION < 3 #ifdef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC void #else #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #endif #else #ifdef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyObject * #else #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #endif #endif #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (!(defined(__cplusplus)) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) #define CYTHON_SMALL_CODE __attribute__((optimize("Os"))) #else #define CYTHON_SMALL_CODE #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC init_protoc_compiler(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC init_protoc_compiler(void) #else __Pyx_PyMODINIT_FUNC PyInit__protoc_compiler(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit__protoc_compiler(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name) { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { result = PyDict_SetItemString(moddict, to_name, value); Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__") < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__") < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__") < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__") < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static int __pyx_pymod_exec__protoc_compiler(PyObject *__pyx_pyinit_module) #endif #endif { PyObject *__pyx_t_1 = NULL; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m && __pyx_m == __pyx_pyinit_module) return 0; #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__protoc_compiler(void)", 0); if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_protoc_compiler", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) #if CYTHON_COMPILING_IN_PYPY Py_INCREF(__pyx_b); #endif if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_grpc_tools___protoc_compiler) { if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "grpc_tools._protoc_compiler")) { if (unlikely(PyDict_SetItemString(modules, "grpc_tools._protoc_compiler", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); (void)__Pyx_modinit_type_init_code(); (void)__Pyx_modinit_type_import_code(); (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "grpc_tools/_protoc_compiler.pyx":20 * int protoc_main(int argc, char *argv[]) * * def run_main(list args not None): # <<<<<<<<<<<<<< * cdef char **argv = stdlib.malloc(len(args)*sizeof(char *)) * for i in range(len(args)): */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_10grpc_tools_16_protoc_compiler_1run_main, NULL, __pyx_n_s_grpc_tools__protoc_compiler); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 20, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_run_main, __pyx_t_1) < 0) __PYX_ERR(0, 20, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "grpc_tools/_protoc_compiler.pyx":1 * # Copyright 2016 gRPC authors. # <<<<<<<<<<<<<< * # * # Licensed under the Apache License, Version 2.0 (the "License"); */ __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init grpc_tools._protoc_compiler", 0, __pyx_lineno, __pyx_filename); } Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init grpc_tools._protoc_compiler"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* ArgTypeTest */ static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) { if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } else if (exact) { #if PY_MAJOR_VERSION == 2 if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; #endif } else { if (likely(__Pyx_TypeCheck(obj, type))) return 1; } PyErr_Format(PyExc_TypeError, "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", name, type->tp_name, Py_TYPE(obj)->tp_name); return 0; } /* GetItemInt */ static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyList_GET_SIZE(o); } if ((!boundscheck) || likely((0 <= wrapped_i) & (wrapped_i < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS Py_ssize_t wrapped_i = i; if (wraparound & unlikely(i < 0)) { wrapped_i += PyTuple_GET_SIZE(o); } if ((!boundscheck) || likely((0 <= wrapped_i) & (wrapped_i < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS if (is_list || PyList_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; if (likely(m && m->sq_item)) { if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { Py_ssize_t l = m->sq_length(o); if (likely(l >= 0)) { i += l; } else { if (!PyErr_ExceptionMatches(PyExc_OverflowError)) return NULL; PyErr_Clear(); } } return m->sq_item(o, i); } } #else if (is_list || PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #endif /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { use_cline = __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback); } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (PyObject_Not(use_cline) != 0) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { const int neg_one = (int) -1, const_zero = (int) 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(int) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(int), little, !is_unsigned); } } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { const long neg_one = (long) -1, const_zero = (long) 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { const long neg_one = (long) -1, const_zero = (long) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) case -2: if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { const int neg_one = (int) -1, const_zero = (int) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) case -2: if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = a->tp_base; if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; if (!res) { res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } return res; } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; ip) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", type_name, type_name, Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(x); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)b)->ob_digit; const Py_ssize_t size = Py_SIZE(b); if (likely(__Pyx_sst_abs(size) <= 1)) { ival = likely(size) ? digits[0] : 0; if (size == -1) ival = -ival; return ival; } else { switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */ python-grpc-tools-1.14.1/grpc_tools/_protoc_compiler.pyx000066400000000000000000000015561334102242000234600ustar00rootroot00000000000000# Copyright 2016 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from libc cimport stdlib cdef extern from "grpc_tools/main.h": int protoc_main(int argc, char *argv[]) def run_main(list args not None): cdef char **argv = stdlib.malloc(len(args)*sizeof(char *)) for i in range(len(args)): argv[i] = args[i] return protoc_main(len(args), argv) python-grpc-tools-1.14.1/grpc_tools/command.py000066400000000000000000000042211334102242000213370ustar00rootroot00000000000000# Copyright 2016 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import pkg_resources import sys import setuptools from grpc_tools import protoc def build_package_protos(package_root): proto_files = [] inclusion_root = os.path.abspath(package_root) for root, _, files in os.walk(inclusion_root): for filename in files: if filename.endswith('.proto'): proto_files.append( os.path.abspath(os.path.join(root, filename))) well_known_protos_include = pkg_resources.resource_filename( 'grpc_tools', '_proto') for proto_file in proto_files: command = [ 'grpc_tools.protoc', '--proto_path={}'.format(inclusion_root), '--proto_path={}'.format(well_known_protos_include), '--python_out={}'.format(inclusion_root), '--grpc_python_out={}'.format(inclusion_root), ] + [proto_file] if protoc.main(command) != 0: sys.stderr.write('warning: {} failed'.format(command)) class BuildPackageProtos(setuptools.Command): """Command to generate project *_pb2.py modules from proto files.""" description = 'build grpc protobuf modules' user_options = [] def initialize_options(self): pass def finalize_options(self): pass def run(self): # due to limitations of the proto generator, we require that only *one* # directory is provided as an 'include' directory. We assume it's the '' key # to `self.distribution.package_dir` (and get a key error if it's not # there). build_package_protos(self.distribution.package_dir['']) python-grpc-tools-1.14.1/grpc_tools/main.cc000066400000000000000000000026251334102242000206100ustar00rootroot00000000000000// Copyright 2016 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include "src/compiler/python_generator.h" #include "grpc_tools/main.h" int protoc_main(int argc, char* argv[]) { google::protobuf::compiler::CommandLineInterface cli; cli.AllowPlugins("protoc-"); // Proto2 Python google::protobuf::compiler::python::Generator py_generator; cli.RegisterGenerator("--python_out", &py_generator, "Generate Python source file."); // gRPC Python grpc_python_generator::GeneratorConfiguration grpc_py_config; grpc_python_generator::PythonGrpcGenerator grpc_py_generator(grpc_py_config); cli.RegisterGenerator("--grpc_python_out", &grpc_py_generator, "Generate Python source file."); return cli.Run(argc, argv); } python-grpc-tools-1.14.1/grpc_tools/main.h000066400000000000000000000014201334102242000204420ustar00rootroot00000000000000// Copyright 2016 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // We declare `protoc_main` here since we want access to it from Cython as an // extern but *without* triggering a dllimport declspec when on Windows. int protoc_main(int argc, char *argv[]); python-grpc-tools-1.14.1/grpc_tools/protobuf_generated_well_known_types_embed.cc000066400000000000000000000330171334102242000303600ustar00rootroot00000000000000// Copyright 2017 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // HACK: Embed the generated well_known_types_js.cc to make // grpc-tools python package compilation easy. #include struct FileToc well_known_types_js[] = { {"any.js", "// Protocol Buffers - Google's data interchange format\n" "// Copyright 2008 Google Inc. All rights reserved.\n" "// https://developers.google.com/protocol-buffers/\n" "//\n" "// Redistribution and use in source and binary forms, with or without\n" "// modification, are permitted provided that the following conditions are\n" "// met:\n" "//\n" "// * Redistributions of source code must retain the above copyright\n" "// notice, this list of conditions and the following disclaimer.\n" "// * Redistributions in binary form must reproduce the above\n" "// copyright notice, this list of conditions and the following disclaimer\n" "// in the documentation and/or other materials provided with the\n" "// distribution.\n" "// * Neither the name of Google Inc. nor the names of its\n" "// contributors may be used to endorse or promote products derived from\n" "// this software without specific prior written permission.\n" "//\n" "// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n" "// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" "// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n" "// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" "// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" "// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" "// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n" "// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" "\n" "/* This code will be inserted into generated code for\n" " * google/protobuf/any.proto. */\n" "\n" "/**\n" " * Returns the type name contained in this instance, if any.\n" " * @return {string|undefined}\n" " */\n" "proto.google.protobuf.Any.prototype.getTypeName = function() {\n" " return this.getTypeUrl().split('/').pop();\n" "};\n" "\n" "\n" "/**\n" " * Packs the given message instance into this Any.\n" " * @param {!Uint8Array} serialized The serialized data to pack.\n" " * @param {string} name The type name of this message object.\n" " * @param {string=} opt_typeUrlPrefix the type URL prefix.\n" " */\n" "proto.google.protobuf.Any.prototype.pack = function(serialized, name,\n" " opt_typeUrlPrefix) {\n" " if (!opt_typeUrlPrefix) {\n" " opt_typeUrlPrefix = 'type.googleapis.com/';\n" " }\n" "\n" " if (opt_typeUrlPrefix.substr(-1) != '/') {\n" " this.setTypeUrl(opt_typeUrlPrefix + '/' + name);\n" " } else {\n" " this.setTypeUrl(opt_typeUrlPrefix + name);\n" " }\n" "\n" " this.setValue(serialized);\n" "};\n" "\n" "\n" "/**\n" " * @template T\n" " * Unpacks this Any into the given message object.\n" " * @param {function(Uint8Array):T} deserialize Function that will deserialize\n" " * the binary data properly.\n" " * @param {string} name The expected type name of this message object.\n" " * @return {?T} If the name matched the expected name, returns the deserialized\n" " * object, otherwise returns undefined.\n" " */\n" "proto.google.protobuf.Any.prototype.unpack = function(deserialize, name) {\n" " if (this.getTypeName() == name) {\n" " return deserialize(this.getValue_asU8());\n" " } else {\n" " return null;\n" " }\n" "};\n" }, {"struct.js", "// Protocol Buffers - Google's data interchange format\n" "// Copyright 2008 Google Inc. All rights reserved.\n" "// https://developers.google.com/protocol-buffers/\n" "//\n" "// Redistribution and use in source and binary forms, with or without\n" "// modification, are permitted provided that the following conditions are\n" "// met:\n" "//\n" "// * Redistributions of source code must retain the above copyright\n" "// notice, this list of conditions and the following disclaimer.\n" "// * Redistributions in binary form must reproduce the above\n" "// copyright notice, this list of conditions and the following disclaimer\n" "// in the documentation and/or other materials provided with the\n" "// distribution.\n" "// * Neither the name of Google Inc. nor the names of its\n" "// contributors may be used to endorse or promote products derived from\n" "// this software without specific prior written permission.\n" "//\n" "// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n" "// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" "// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n" "// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" "// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" "// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" "// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n" "// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" "\n" "/* This code will be inserted into generated code for\n" " * google/protobuf/struct.proto. */\n" "\n" "/**\n" " * Typedef representing plain JavaScript values that can go into a\n" " * Struct.\n" " * @typedef {null|number|string|boolean|Array|Object}\n" " */\n" "proto.google.protobuf.JavaScriptValue;\n" "\n" "\n" "/**\n" " * Converts this Value object to a plain JavaScript value.\n" " * @return {?proto.google.protobuf.JavaScriptValue} a plain JavaScript\n" " * value representing this Struct.\n" " */\n" "proto.google.protobuf.Value.prototype.toJavaScript = function() {\n" " var kindCase = proto.google.protobuf.Value.KindCase;\n" " switch (this.getKindCase()) {\n" " case kindCase.NULL_VALUE:\n" " return null;\n" " case kindCase.NUMBER_VALUE:\n" " return this.getNumberValue();\n" " case kindCase.STRING_VALUE:\n" " return this.getStringValue();\n" " case kindCase.BOOL_VALUE:\n" " return this.getBoolValue();\n" " case kindCase.STRUCT_VALUE:\n" " return this.getStructValue().toJavaScript();\n" " case kindCase.LIST_VALUE:\n" " return this.getListValue().toJavaScript();\n" " default:\n" " throw new Error('Unexpected struct type');\n" " }\n" "};\n" "\n" "\n" "/**\n" " * Converts this JavaScript value to a new Value proto.\n" " * @param {!proto.google.protobuf.JavaScriptValue} value The value to\n" " * convert.\n" " * @return {!proto.google.protobuf.Value} The newly constructed value.\n" " */\n" "proto.google.protobuf.Value.fromJavaScript = function(value) {\n" " var ret = new proto.google.protobuf.Value();\n" " switch (goog.typeOf(value)) {\n" " case 'string':\n" " ret.setStringValue(/** @type {string} */ (value));\n" " break;\n" " case 'number':\n" " ret.setNumberValue(/** @type {number} */ (value));\n" " break;\n" " case 'boolean':\n" " ret.setBoolValue(/** @type {boolean} */ (value));\n" " break;\n" " case 'null':\n" " ret.setNullValue(proto.google.protobuf.NullValue.NULL_VALUE);\n" " break;\n" " case 'array':\n" " ret.setListValue(proto.google.protobuf.ListValue.fromJavaScript(\n" " /** @type{!Array} */ (value)));\n" " break;\n" " case 'object':\n" " ret.setStructValue(proto.google.protobuf.Struct.fromJavaScript(\n" " /** @type{!Object} */ (value)));\n" " break;\n" " default:\n" " throw new Error('Unexpected struct type.');\n" " }\n" "\n" " return ret;\n" "};\n" "\n" "\n" "/**\n" " * Converts this ListValue object to a plain JavaScript array.\n" " * @return {!Array} a plain JavaScript array representing this List.\n" " */\n" "proto.google.protobuf.ListValue.prototype.toJavaScript = function() {\n" " var ret = [];\n" " var values = this.getValuesList();\n" "\n" " for (var i = 0; i < values.length; i++) {\n" " ret[i] = values[i].toJavaScript();\n" " }\n" "\n" " return ret;\n" "};\n" "\n" "\n" "/**\n" " * Constructs a ListValue protobuf from this plain JavaScript array.\n" " * @param {!Array} array a plain JavaScript array\n" " * @return {proto.google.protobuf.ListValue} a new ListValue object\n" " */\n" "proto.google.protobuf.ListValue.fromJavaScript = function(array) {\n" " var ret = new proto.google.protobuf.ListValue();\n" "\n" " for (var i = 0; i < array.length; i++) {\n" " ret.addValues(proto.google.protobuf.Value.fromJavaScript(array[i]));\n" " }\n" "\n" " return ret;\n" "};\n" "\n" "\n" "/**\n" " * Converts this Struct object to a plain JavaScript object.\n" " * @return {!Object} a plain\n" " * JavaScript object representing this Struct.\n" " */\n" "proto.google.protobuf.Struct.prototype.toJavaScript = function() {\n" " var ret = {};\n" "\n" " this.getFieldsMap().forEach(function(value, key) {\n" " ret[key] = value.toJavaScript();\n" " });\n" "\n" " return ret;\n" "};\n" "\n" "\n" "/**\n" " * Constructs a Struct protobuf from this plain JavaScript object.\n" " * @param {!Object} obj a plain JavaScript object\n" " * @return {proto.google.protobuf.Struct} a new Struct object\n" " */\n" "proto.google.protobuf.Struct.fromJavaScript = function(obj) {\n" " var ret = new proto.google.protobuf.Struct();\n" " var map = ret.getFieldsMap();\n" "\n" " for (var property in obj) {\n" " var val = obj[property];\n" " map.set(property, proto.google.protobuf.Value.fromJavaScript(val));\n" " }\n" "\n" " return ret;\n" "};\n" }, {"timestamp.js", "// Protocol Buffers - Google's data interchange format\n" "// Copyright 2008 Google Inc. All rights reserved.\n" "// https://developers.google.com/protocol-buffers/\n" "//\n" "// Redistribution and use in source and binary forms, with or without\n" "// modification, are permitted provided that the following conditions are\n" "// met:\n" "//\n" "// * Redistributions of source code must retain the above copyright\n" "// notice, this list of conditions and the following disclaimer.\n" "// * Redistributions in binary form must reproduce the above\n" "// copyright notice, this list of conditions and the following disclaimer\n" "// in the documentation and/or other materials provided with the\n" "// distribution.\n" "// * Neither the name of Google Inc. nor the names of its\n" "// contributors may be used to endorse or promote products derived from\n" "// this software without specific prior written permission.\n" "//\n" "// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" "// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" "// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" "// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n" "// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" "// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n" "// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" "// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" "// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" "// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n" "// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" "\n" "/* This code will be inserted into generated code for\n" " * google/protobuf/timestamp.proto. */\n" "\n" "/**\n" " * Returns a JavaScript 'Date' object corresponding to this Timestamp.\n" " * @return {!Date}\n" " */\n" "proto.google.protobuf.Timestamp.prototype.toDate = function() {\n" " var seconds = this.getSeconds();\n" " var nanos = this.getNanos();\n" "\n" " return new Date((seconds * 1000) + (nanos / 1000000));\n" "};\n" "\n" "\n" "/**\n" " * Sets the value of this Timestamp object to be the given Date.\n" " * @param {!Date} value The value to set.\n" " */\n" "proto.google.protobuf.Timestamp.prototype.fromDate = function(value) {\n" " var millis = value.getTime();\n" " this.setSeconds(Math.floor(value.getTime() / 1000));\n" " this.setNanos(value.getMilliseconds() * 1000000);\n" "};\n" }, {NULL, NULL} // Terminate the list. }; python-grpc-tools-1.14.1/grpc_tools/protoc.py000066400000000000000000000022561334102242000212350ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2016 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import pkg_resources import sys from grpc_tools import _protoc_compiler def main(command_arguments): """Run the protocol buffer compiler with the given command-line arguments. Args: command_arguments: a list of strings representing command line arguments to `protoc`. """ command_arguments = [argument.encode() for argument in command_arguments] return _protoc_compiler.run_main(command_arguments) if __name__ == '__main__': proto_include = pkg_resources.resource_filename('grpc_tools', '_proto') sys.exit(main(sys.argv + ['-I{}'.format(proto_include)])) python-grpc-tools-1.14.1/grpc_version.py000066400000000000000000000013011334102242000202420ustar00rootroot00000000000000# Copyright 2015 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!! VERSION = '1.14.1' python-grpc-tools-1.14.1/grpcio_tools.egg-info/000077500000000000000000000000001334102242000213725ustar00rootroot00000000000000python-grpc-tools-1.14.1/grpcio_tools.egg-info/PKG-INFO000066400000000000000000000013131334102242000224650ustar00rootroot00000000000000Metadata-Version: 1.1 Name: grpcio-tools Version: 1.14.1 Summary: Protobuf code generator for gRPC Home-page: https://grpc.io Author: The gRPC Authors Author-email: grpc-io@googlegroups.com License: Apache License 2.0 Description: UNKNOWN Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: License :: OSI Approved :: Apache Software License python-grpc-tools-1.14.1/grpcio_tools.egg-info/SOURCES.txt000066400000000000000000001542251334102242000232670ustar00rootroot00000000000000MANIFEST.in README.rst grpc_version.py protoc_lib_deps.py setup.py grpc_root/include/grpc/byte_buffer.h grpc_root/include/grpc/byte_buffer_reader.h grpc_root/include/grpc/census.h grpc_root/include/grpc/compression.h grpc_root/include/grpc/fork.h grpc_root/include/grpc/grpc.h grpc_root/include/grpc/grpc_cronet.h grpc_root/include/grpc/grpc_posix.h grpc_root/include/grpc/grpc_security.h grpc_root/include/grpc/grpc_security_constants.h grpc_root/include/grpc/load_reporting.h grpc_root/include/grpc/module.modulemap grpc_root/include/grpc/slice.h grpc_root/include/grpc/slice_buffer.h grpc_root/include/grpc/status.h grpc_root/include/grpc++/alarm.h grpc_root/include/grpc++/channel.h grpc_root/include/grpc++/client_context.h grpc_root/include/grpc++/completion_queue.h grpc_root/include/grpc++/create_channel.h grpc_root/include/grpc++/create_channel_posix.h grpc_root/include/grpc++/grpc++.h grpc_root/include/grpc++/health_check_service_interface.h grpc_root/include/grpc++/resource_quota.h grpc_root/include/grpc++/server.h grpc_root/include/grpc++/server_builder.h grpc_root/include/grpc++/server_context.h grpc_root/include/grpc++/server_posix.h grpc_root/include/grpc++/ext/health_check_service_server_builder_option.h grpc_root/include/grpc++/ext/proto_server_reflection_plugin.h grpc_root/include/grpc++/generic/async_generic_service.h grpc_root/include/grpc++/generic/generic_stub.h grpc_root/include/grpc++/impl/call.h grpc_root/include/grpc++/impl/channel_argument_option.h grpc_root/include/grpc++/impl/client_unary_call.h grpc_root/include/grpc++/impl/grpc_library.h grpc_root/include/grpc++/impl/method_handler_impl.h grpc_root/include/grpc++/impl/rpc_method.h grpc_root/include/grpc++/impl/rpc_service_method.h grpc_root/include/grpc++/impl/serialization_traits.h grpc_root/include/grpc++/impl/server_builder_option.h grpc_root/include/grpc++/impl/server_builder_plugin.h grpc_root/include/grpc++/impl/server_initializer.h grpc_root/include/grpc++/impl/service_type.h grpc_root/include/grpc++/impl/sync_cxx11.h grpc_root/include/grpc++/impl/sync_no_cxx11.h grpc_root/include/grpc++/impl/codegen/async_stream.h grpc_root/include/grpc++/impl/codegen/async_unary_call.h grpc_root/include/grpc++/impl/codegen/byte_buffer.h grpc_root/include/grpc++/impl/codegen/call.h grpc_root/include/grpc++/impl/codegen/call_hook.h grpc_root/include/grpc++/impl/codegen/channel_interface.h grpc_root/include/grpc++/impl/codegen/client_context.h grpc_root/include/grpc++/impl/codegen/client_unary_call.h grpc_root/include/grpc++/impl/codegen/completion_queue.h grpc_root/include/grpc++/impl/codegen/completion_queue_tag.h grpc_root/include/grpc++/impl/codegen/config.h grpc_root/include/grpc++/impl/codegen/config_protobuf.h grpc_root/include/grpc++/impl/codegen/core_codegen.h grpc_root/include/grpc++/impl/codegen/core_codegen_interface.h grpc_root/include/grpc++/impl/codegen/create_auth_context.h grpc_root/include/grpc++/impl/codegen/grpc_library.h grpc_root/include/grpc++/impl/codegen/metadata_map.h grpc_root/include/grpc++/impl/codegen/method_handler_impl.h grpc_root/include/grpc++/impl/codegen/proto_utils.h grpc_root/include/grpc++/impl/codegen/rpc_method.h grpc_root/include/grpc++/impl/codegen/rpc_service_method.h grpc_root/include/grpc++/impl/codegen/serialization_traits.h grpc_root/include/grpc++/impl/codegen/server_context.h grpc_root/include/grpc++/impl/codegen/server_interface.h grpc_root/include/grpc++/impl/codegen/service_type.h grpc_root/include/grpc++/impl/codegen/slice.h grpc_root/include/grpc++/impl/codegen/status.h grpc_root/include/grpc++/impl/codegen/status_code_enum.h grpc_root/include/grpc++/impl/codegen/string_ref.h grpc_root/include/grpc++/impl/codegen/stub_options.h grpc_root/include/grpc++/impl/codegen/sync_stream.h grpc_root/include/grpc++/impl/codegen/time.h grpc_root/include/grpc++/impl/codegen/security/auth_context.h grpc_root/include/grpc++/security/auth_context.h grpc_root/include/grpc++/security/auth_metadata_processor.h grpc_root/include/grpc++/security/credentials.h grpc_root/include/grpc++/security/server_credentials.h grpc_root/include/grpc++/support/async_stream.h grpc_root/include/grpc++/support/async_unary_call.h grpc_root/include/grpc++/support/byte_buffer.h grpc_root/include/grpc++/support/channel_arguments.h grpc_root/include/grpc++/support/config.h grpc_root/include/grpc++/support/error_details.h grpc_root/include/grpc++/support/slice.h grpc_root/include/grpc++/support/status.h grpc_root/include/grpc++/support/status_code_enum.h grpc_root/include/grpc++/support/string_ref.h grpc_root/include/grpc++/support/stub_options.h grpc_root/include/grpc++/support/sync_stream.h grpc_root/include/grpc++/support/time.h grpc_root/include/grpc++/test/mock_stream.h grpc_root/include/grpc++/test/server_context_test_spouse.h grpc_root/include/grpc/impl/codegen/atm.h grpc_root/include/grpc/impl/codegen/atm_gcc_atomic.h grpc_root/include/grpc/impl/codegen/atm_gcc_sync.h grpc_root/include/grpc/impl/codegen/atm_windows.h grpc_root/include/grpc/impl/codegen/byte_buffer.h grpc_root/include/grpc/impl/codegen/byte_buffer_reader.h grpc_root/include/grpc/impl/codegen/compression_types.h grpc_root/include/grpc/impl/codegen/connectivity_state.h grpc_root/include/grpc/impl/codegen/fork.h grpc_root/include/grpc/impl/codegen/gpr_slice.h grpc_root/include/grpc/impl/codegen/gpr_types.h grpc_root/include/grpc/impl/codegen/grpc_types.h grpc_root/include/grpc/impl/codegen/log.h grpc_root/include/grpc/impl/codegen/port_platform.h grpc_root/include/grpc/impl/codegen/propagation_bits.h grpc_root/include/grpc/impl/codegen/slice.h grpc_root/include/grpc/impl/codegen/status.h grpc_root/include/grpc/impl/codegen/sync.h grpc_root/include/grpc/impl/codegen/sync_custom.h grpc_root/include/grpc/impl/codegen/sync_generic.h grpc_root/include/grpc/impl/codegen/sync_posix.h grpc_root/include/grpc/impl/codegen/sync_windows.h grpc_root/include/grpc/support/alloc.h grpc_root/include/grpc/support/atm.h grpc_root/include/grpc/support/atm_gcc_atomic.h grpc_root/include/grpc/support/atm_gcc_sync.h grpc_root/include/grpc/support/atm_windows.h grpc_root/include/grpc/support/cpu.h grpc_root/include/grpc/support/log.h grpc_root/include/grpc/support/log_windows.h grpc_root/include/grpc/support/port_platform.h grpc_root/include/grpc/support/string_util.h grpc_root/include/grpc/support/sync.h grpc_root/include/grpc/support/sync_custom.h grpc_root/include/grpc/support/sync_generic.h grpc_root/include/grpc/support/sync_posix.h grpc_root/include/grpc/support/sync_windows.h grpc_root/include/grpc/support/thd_id.h grpc_root/include/grpc/support/time.h grpc_root/include/grpc/support/workaround_list.h grpc_root/include/grpcpp/alarm.h grpc_root/include/grpcpp/channel.h grpc_root/include/grpcpp/client_context.h grpc_root/include/grpcpp/completion_queue.h grpc_root/include/grpcpp/create_channel.h grpc_root/include/grpcpp/create_channel_posix.h grpc_root/include/grpcpp/grpcpp.h grpc_root/include/grpcpp/health_check_service_interface.h grpc_root/include/grpcpp/opencensus.h grpc_root/include/grpcpp/resource_quota.h grpc_root/include/grpcpp/server.h grpc_root/include/grpcpp/server_builder.h grpc_root/include/grpcpp/server_context.h grpc_root/include/grpcpp/server_posix.h grpc_root/include/grpcpp/ext/health_check_service_server_builder_option.h grpc_root/include/grpcpp/ext/proto_server_reflection_plugin.h grpc_root/include/grpcpp/ext/server_load_reporting.h grpc_root/include/grpcpp/generic/async_generic_service.h grpc_root/include/grpcpp/generic/generic_stub.h grpc_root/include/grpcpp/impl/README.md grpc_root/include/grpcpp/impl/call.h grpc_root/include/grpcpp/impl/channel_argument_option.h grpc_root/include/grpcpp/impl/client_unary_call.h grpc_root/include/grpcpp/impl/grpc_library.h grpc_root/include/grpcpp/impl/method_handler_impl.h grpc_root/include/grpcpp/impl/rpc_method.h grpc_root/include/grpcpp/impl/rpc_service_method.h grpc_root/include/grpcpp/impl/serialization_traits.h grpc_root/include/grpcpp/impl/server_builder_option.h grpc_root/include/grpcpp/impl/server_builder_plugin.h grpc_root/include/grpcpp/impl/server_initializer.h grpc_root/include/grpcpp/impl/service_type.h grpc_root/include/grpcpp/impl/sync_cxx11.h grpc_root/include/grpcpp/impl/sync_no_cxx11.h grpc_root/include/grpcpp/impl/codegen/async_generic_service.h grpc_root/include/grpcpp/impl/codegen/async_stream.h grpc_root/include/grpcpp/impl/codegen/async_unary_call.h grpc_root/include/grpcpp/impl/codegen/byte_buffer.h grpc_root/include/grpcpp/impl/codegen/call.h grpc_root/include/grpcpp/impl/codegen/call_hook.h grpc_root/include/grpcpp/impl/codegen/channel_interface.h grpc_root/include/grpcpp/impl/codegen/client_context.h grpc_root/include/grpcpp/impl/codegen/client_unary_call.h grpc_root/include/grpcpp/impl/codegen/completion_queue.h grpc_root/include/grpcpp/impl/codegen/completion_queue_tag.h grpc_root/include/grpcpp/impl/codegen/config.h grpc_root/include/grpcpp/impl/codegen/config_protobuf.h grpc_root/include/grpcpp/impl/codegen/core_codegen.h grpc_root/include/grpcpp/impl/codegen/core_codegen_interface.h grpc_root/include/grpcpp/impl/codegen/create_auth_context.h grpc_root/include/grpcpp/impl/codegen/grpc_library.h grpc_root/include/grpcpp/impl/codegen/metadata_map.h grpc_root/include/grpcpp/impl/codegen/method_handler_impl.h grpc_root/include/grpcpp/impl/codegen/proto_buffer_reader.h grpc_root/include/grpcpp/impl/codegen/proto_buffer_writer.h grpc_root/include/grpcpp/impl/codegen/proto_utils.h grpc_root/include/grpcpp/impl/codegen/rpc_method.h grpc_root/include/grpcpp/impl/codegen/rpc_service_method.h grpc_root/include/grpcpp/impl/codegen/serialization_traits.h grpc_root/include/grpcpp/impl/codegen/server_context.h grpc_root/include/grpcpp/impl/codegen/server_interface.h grpc_root/include/grpcpp/impl/codegen/service_type.h grpc_root/include/grpcpp/impl/codegen/slice.h grpc_root/include/grpcpp/impl/codegen/status.h grpc_root/include/grpcpp/impl/codegen/status_code_enum.h grpc_root/include/grpcpp/impl/codegen/string_ref.h grpc_root/include/grpcpp/impl/codegen/stub_options.h grpc_root/include/grpcpp/impl/codegen/sync_stream.h grpc_root/include/grpcpp/impl/codegen/time.h grpc_root/include/grpcpp/impl/codegen/security/auth_context.h grpc_root/include/grpcpp/security/auth_context.h grpc_root/include/grpcpp/security/auth_metadata_processor.h grpc_root/include/grpcpp/security/credentials.h grpc_root/include/grpcpp/security/server_credentials.h grpc_root/include/grpcpp/support/async_stream.h grpc_root/include/grpcpp/support/async_unary_call.h grpc_root/include/grpcpp/support/byte_buffer.h grpc_root/include/grpcpp/support/channel_arguments.h grpc_root/include/grpcpp/support/config.h grpc_root/include/grpcpp/support/error_details.h grpc_root/include/grpcpp/support/proto_buffer_reader.h grpc_root/include/grpcpp/support/proto_buffer_writer.h grpc_root/include/grpcpp/support/slice.h grpc_root/include/grpcpp/support/status.h grpc_root/include/grpcpp/support/status_code_enum.h grpc_root/include/grpcpp/support/string_ref.h grpc_root/include/grpcpp/support/stub_options.h grpc_root/include/grpcpp/support/sync_stream.h grpc_root/include/grpcpp/support/time.h grpc_root/include/grpcpp/test/mock_stream.h grpc_root/include/grpcpp/test/server_context_test_spouse.h grpc_root/src/compiler/README.md grpc_root/src/compiler/config.h grpc_root/src/compiler/cpp_generator.cc grpc_root/src/compiler/cpp_generator.h grpc_root/src/compiler/cpp_generator_helpers.h grpc_root/src/compiler/cpp_plugin.cc grpc_root/src/compiler/csharp_generator.cc grpc_root/src/compiler/csharp_generator.h grpc_root/src/compiler/csharp_generator_helpers.h grpc_root/src/compiler/csharp_plugin.cc grpc_root/src/compiler/generator_helpers.h grpc_root/src/compiler/node_generator.cc grpc_root/src/compiler/node_generator.h grpc_root/src/compiler/node_generator_helpers.h grpc_root/src/compiler/node_plugin.cc grpc_root/src/compiler/objective_c_generator.cc grpc_root/src/compiler/objective_c_generator.h grpc_root/src/compiler/objective_c_generator_helpers.h grpc_root/src/compiler/objective_c_plugin.cc grpc_root/src/compiler/php_generator.cc grpc_root/src/compiler/php_generator.h grpc_root/src/compiler/php_generator_helpers.h grpc_root/src/compiler/php_plugin.cc grpc_root/src/compiler/protobuf_plugin.h grpc_root/src/compiler/python_generator.cc grpc_root/src/compiler/python_generator.h grpc_root/src/compiler/python_generator_helpers.h grpc_root/src/compiler/python_plugin.cc grpc_root/src/compiler/python_private_generator.h grpc_root/src/compiler/ruby_generator.cc grpc_root/src/compiler/ruby_generator.h grpc_root/src/compiler/ruby_generator_helpers-inl.h grpc_root/src/compiler/ruby_generator_map-inl.h grpc_root/src/compiler/ruby_generator_string-inl.h grpc_root/src/compiler/ruby_plugin.cc grpc_root/src/compiler/schema_interface.h grpc_tools/__init__.py grpc_tools/_protoc_compiler.cpp grpc_tools/_protoc_compiler.pyx grpc_tools/command.py grpc_tools/main.cc grpc_tools/main.h grpc_tools/protobuf_generated_well_known_types_embed.cc grpc_tools/protoc.py grpc_tools/_proto/google/protobuf/any.proto grpc_tools/_proto/google/protobuf/api.proto grpc_tools/_proto/google/protobuf/descriptor.proto grpc_tools/_proto/google/protobuf/duration.proto grpc_tools/_proto/google/protobuf/empty.proto grpc_tools/_proto/google/protobuf/field_mask.proto grpc_tools/_proto/google/protobuf/source_context.proto grpc_tools/_proto/google/protobuf/struct.proto grpc_tools/_proto/google/protobuf/timestamp.proto grpc_tools/_proto/google/protobuf/type.proto grpc_tools/_proto/google/protobuf/wrappers.proto grpc_tools/_proto/google/protobuf/compiler/plugin.proto grpcio_tools.egg-info/PKG-INFO grpcio_tools.egg-info/SOURCES.txt grpcio_tools.egg-info/dependency_links.txt grpcio_tools.egg-info/requires.txt grpcio_tools.egg-info/top_level.txt third_party/protobuf/src/Makefile.am third_party/protobuf/src/README.md third_party/protobuf/src/libprotobuf-lite.map third_party/protobuf/src/libprotobuf.map third_party/protobuf/src/libprotoc.map third_party/protobuf/src/google/protobuf/any.cc third_party/protobuf/src/google/protobuf/any.h third_party/protobuf/src/google/protobuf/any.pb.cc third_party/protobuf/src/google/protobuf/any.pb.h third_party/protobuf/src/google/protobuf/any.proto third_party/protobuf/src/google/protobuf/any_test.cc third_party/protobuf/src/google/protobuf/any_test.proto third_party/protobuf/src/google/protobuf/api.pb.cc third_party/protobuf/src/google/protobuf/api.pb.h third_party/protobuf/src/google/protobuf/api.proto third_party/protobuf/src/google/protobuf/arena.cc third_party/protobuf/src/google/protobuf/arena.h third_party/protobuf/src/google/protobuf/arena_impl.h third_party/protobuf/src/google/protobuf/arena_test_util.cc third_party/protobuf/src/google/protobuf/arena_test_util.h third_party/protobuf/src/google/protobuf/arena_unittest.cc third_party/protobuf/src/google/protobuf/arenastring.cc third_party/protobuf/src/google/protobuf/arenastring.h third_party/protobuf/src/google/protobuf/arenastring_unittest.cc third_party/protobuf/src/google/protobuf/descriptor.cc third_party/protobuf/src/google/protobuf/descriptor.h third_party/protobuf/src/google/protobuf/descriptor.pb.cc third_party/protobuf/src/google/protobuf/descriptor.pb.h third_party/protobuf/src/google/protobuf/descriptor.proto third_party/protobuf/src/google/protobuf/descriptor_database.cc third_party/protobuf/src/google/protobuf/descriptor_database.h third_party/protobuf/src/google/protobuf/descriptor_database_unittest.cc third_party/protobuf/src/google/protobuf/descriptor_unittest.cc third_party/protobuf/src/google/protobuf/drop_unknown_fields_test.cc third_party/protobuf/src/google/protobuf/duration.pb.cc third_party/protobuf/src/google/protobuf/duration.pb.h third_party/protobuf/src/google/protobuf/duration.proto third_party/protobuf/src/google/protobuf/dynamic_message.cc third_party/protobuf/src/google/protobuf/dynamic_message.h third_party/protobuf/src/google/protobuf/dynamic_message_unittest.cc third_party/protobuf/src/google/protobuf/empty.pb.cc third_party/protobuf/src/google/protobuf/empty.pb.h third_party/protobuf/src/google/protobuf/empty.proto third_party/protobuf/src/google/protobuf/extension_set.cc third_party/protobuf/src/google/protobuf/extension_set.h third_party/protobuf/src/google/protobuf/extension_set_heavy.cc third_party/protobuf/src/google/protobuf/extension_set_unittest.cc third_party/protobuf/src/google/protobuf/field_mask.pb.cc third_party/protobuf/src/google/protobuf/field_mask.pb.h third_party/protobuf/src/google/protobuf/field_mask.proto third_party/protobuf/src/google/protobuf/generated_enum_reflection.h third_party/protobuf/src/google/protobuf/generated_enum_util.h third_party/protobuf/src/google/protobuf/generated_message_reflection.cc third_party/protobuf/src/google/protobuf/generated_message_reflection.h third_party/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc third_party/protobuf/src/google/protobuf/generated_message_table_driven.cc third_party/protobuf/src/google/protobuf/generated_message_table_driven.h third_party/protobuf/src/google/protobuf/generated_message_table_driven_lite.cc third_party/protobuf/src/google/protobuf/generated_message_table_driven_lite.h third_party/protobuf/src/google/protobuf/generated_message_util.cc third_party/protobuf/src/google/protobuf/generated_message_util.h third_party/protobuf/src/google/protobuf/has_bits.h third_party/protobuf/src/google/protobuf/implicit_weak_message.cc third_party/protobuf/src/google/protobuf/implicit_weak_message.h third_party/protobuf/src/google/protobuf/lite_arena_unittest.cc third_party/protobuf/src/google/protobuf/lite_unittest.cc third_party/protobuf/src/google/protobuf/map.h third_party/protobuf/src/google/protobuf/map_entry.h third_party/protobuf/src/google/protobuf/map_entry_lite.h third_party/protobuf/src/google/protobuf/map_field.cc third_party/protobuf/src/google/protobuf/map_field.h third_party/protobuf/src/google/protobuf/map_field_inl.h third_party/protobuf/src/google/protobuf/map_field_lite.h third_party/protobuf/src/google/protobuf/map_field_test.cc third_party/protobuf/src/google/protobuf/map_lite_test_util.cc third_party/protobuf/src/google/protobuf/map_lite_test_util.h third_party/protobuf/src/google/protobuf/map_lite_unittest.proto third_party/protobuf/src/google/protobuf/map_proto2_unittest.proto third_party/protobuf/src/google/protobuf/map_test.cc third_party/protobuf/src/google/protobuf/map_test_util.cc third_party/protobuf/src/google/protobuf/map_test_util.h third_party/protobuf/src/google/protobuf/map_test_util_impl.h third_party/protobuf/src/google/protobuf/map_type_handler.h third_party/protobuf/src/google/protobuf/map_unittest.proto third_party/protobuf/src/google/protobuf/map_unittest_proto3.proto third_party/protobuf/src/google/protobuf/message.cc third_party/protobuf/src/google/protobuf/message.h third_party/protobuf/src/google/protobuf/message_lite.cc third_party/protobuf/src/google/protobuf/message_lite.h third_party/protobuf/src/google/protobuf/message_unittest.cc third_party/protobuf/src/google/protobuf/metadata.h third_party/protobuf/src/google/protobuf/metadata_lite.h third_party/protobuf/src/google/protobuf/no_field_presence_test.cc third_party/protobuf/src/google/protobuf/package_info.h third_party/protobuf/src/google/protobuf/preserve_unknown_enum_test.cc third_party/protobuf/src/google/protobuf/proto3_arena_lite_unittest.cc third_party/protobuf/src/google/protobuf/proto3_arena_unittest.cc third_party/protobuf/src/google/protobuf/proto3_lite_unittest.cc third_party/protobuf/src/google/protobuf/reflection.h third_party/protobuf/src/google/protobuf/reflection_internal.h third_party/protobuf/src/google/protobuf/reflection_ops.cc third_party/protobuf/src/google/protobuf/reflection_ops.h third_party/protobuf/src/google/protobuf/reflection_ops_unittest.cc third_party/protobuf/src/google/protobuf/repeated_field.cc third_party/protobuf/src/google/protobuf/repeated_field.h third_party/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc third_party/protobuf/src/google/protobuf/repeated_field_unittest.cc third_party/protobuf/src/google/protobuf/service.cc third_party/protobuf/src/google/protobuf/service.h third_party/protobuf/src/google/protobuf/source_context.pb.cc third_party/protobuf/src/google/protobuf/source_context.pb.h third_party/protobuf/src/google/protobuf/source_context.proto third_party/protobuf/src/google/protobuf/struct.pb.cc third_party/protobuf/src/google/protobuf/struct.pb.h third_party/protobuf/src/google/protobuf/struct.proto third_party/protobuf/src/google/protobuf/test_messages_proto2.proto third_party/protobuf/src/google/protobuf/test_messages_proto3.proto third_party/protobuf/src/google/protobuf/test_util.cc third_party/protobuf/src/google/protobuf/test_util.h third_party/protobuf/src/google/protobuf/test_util_lite.cc third_party/protobuf/src/google/protobuf/test_util_lite.h third_party/protobuf/src/google/protobuf/text_format.cc third_party/protobuf/src/google/protobuf/text_format.h third_party/protobuf/src/google/protobuf/text_format_unittest.cc third_party/protobuf/src/google/protobuf/timestamp.pb.cc third_party/protobuf/src/google/protobuf/timestamp.pb.h third_party/protobuf/src/google/protobuf/timestamp.proto third_party/protobuf/src/google/protobuf/type.pb.cc third_party/protobuf/src/google/protobuf/type.pb.h third_party/protobuf/src/google/protobuf/type.proto third_party/protobuf/src/google/protobuf/unittest.proto third_party/protobuf/src/google/protobuf/unittest_arena.proto third_party/protobuf/src/google/protobuf/unittest_custom_options.proto third_party/protobuf/src/google/protobuf/unittest_drop_unknown_fields.proto third_party/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto third_party/protobuf/src/google/protobuf/unittest_empty.proto third_party/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto third_party/protobuf/src/google/protobuf/unittest_import.proto third_party/protobuf/src/google/protobuf/unittest_import_lite.proto third_party/protobuf/src/google/protobuf/unittest_import_proto3.proto third_party/protobuf/src/google/protobuf/unittest_import_public.proto third_party/protobuf/src/google/protobuf/unittest_import_public_lite.proto third_party/protobuf/src/google/protobuf/unittest_import_public_proto3.proto third_party/protobuf/src/google/protobuf/unittest_lazy_dependencies.proto third_party/protobuf/src/google/protobuf/unittest_lazy_dependencies_custom_option.proto third_party/protobuf/src/google/protobuf/unittest_lazy_dependencies_enum.proto third_party/protobuf/src/google/protobuf/unittest_lite.proto third_party/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto third_party/protobuf/src/google/protobuf/unittest_mset.proto third_party/protobuf/src/google/protobuf/unittest_mset_wire_format.proto third_party/protobuf/src/google/protobuf/unittest_no_arena.proto third_party/protobuf/src/google/protobuf/unittest_no_arena_import.proto third_party/protobuf/src/google/protobuf/unittest_no_arena_lite.proto third_party/protobuf/src/google/protobuf/unittest_no_field_presence.proto third_party/protobuf/src/google/protobuf/unittest_no_generic_services.proto third_party/protobuf/src/google/protobuf/unittest_optimize_for.proto third_party/protobuf/src/google/protobuf/unittest_preserve_unknown_enum.proto third_party/protobuf/src/google/protobuf/unittest_preserve_unknown_enum2.proto third_party/protobuf/src/google/protobuf/unittest_proto3.proto third_party/protobuf/src/google/protobuf/unittest_proto3_arena.proto third_party/protobuf/src/google/protobuf/unittest_proto3_arena_lite.proto third_party/protobuf/src/google/protobuf/unittest_proto3_lite.proto third_party/protobuf/src/google/protobuf/unittest_well_known_types.proto third_party/protobuf/src/google/protobuf/unknown_field_set.cc third_party/protobuf/src/google/protobuf/unknown_field_set.h third_party/protobuf/src/google/protobuf/unknown_field_set_unittest.cc third_party/protobuf/src/google/protobuf/well_known_types_unittest.cc third_party/protobuf/src/google/protobuf/wire_format.cc third_party/protobuf/src/google/protobuf/wire_format.h third_party/protobuf/src/google/protobuf/wire_format_lite.cc third_party/protobuf/src/google/protobuf/wire_format_lite.h third_party/protobuf/src/google/protobuf/wire_format_lite_inl.h third_party/protobuf/src/google/protobuf/wire_format_unittest.cc third_party/protobuf/src/google/protobuf/wrappers.pb.cc third_party/protobuf/src/google/protobuf/wrappers.pb.h third_party/protobuf/src/google/protobuf/wrappers.proto third_party/protobuf/src/google/protobuf/compiler/annotation_test_util.cc third_party/protobuf/src/google/protobuf/compiler/annotation_test_util.h third_party/protobuf/src/google/protobuf/compiler/code_generator.cc third_party/protobuf/src/google/protobuf/compiler/code_generator.h third_party/protobuf/src/google/protobuf/compiler/command_line_interface.cc third_party/protobuf/src/google/protobuf/compiler/command_line_interface.h third_party/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc third_party/protobuf/src/google/protobuf/compiler/importer.cc third_party/protobuf/src/google/protobuf/compiler/importer.h third_party/protobuf/src/google/protobuf/compiler/importer_unittest.cc third_party/protobuf/src/google/protobuf/compiler/main.cc third_party/protobuf/src/google/protobuf/compiler/mock_code_generator.cc third_party/protobuf/src/google/protobuf/compiler/mock_code_generator.h third_party/protobuf/src/google/protobuf/compiler/package_info.h third_party/protobuf/src/google/protobuf/compiler/parser.cc third_party/protobuf/src/google/protobuf/compiler/parser.h third_party/protobuf/src/google/protobuf/compiler/parser_unittest.cc third_party/protobuf/src/google/protobuf/compiler/plugin.cc third_party/protobuf/src/google/protobuf/compiler/plugin.h third_party/protobuf/src/google/protobuf/compiler/plugin.pb.cc third_party/protobuf/src/google/protobuf/compiler/plugin.pb.h third_party/protobuf/src/google/protobuf/compiler/plugin.proto third_party/protobuf/src/google/protobuf/compiler/subprocess.cc third_party/protobuf/src/google/protobuf/compiler/subprocess.h third_party/protobuf/src/google/protobuf/compiler/test_plugin.cc third_party/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh third_party/protobuf/src/google/protobuf/compiler/zip_writer.cc third_party/protobuf/src/google/protobuf/compiler/zip_writer.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_map_field.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_map_field.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_layout_helper.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_move_unittest.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_options.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_padding_optimizer.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_test_large_enum_value.proto third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.h third_party/protobuf/src/google/protobuf/compiler/cpp/metadata_test.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_doc_comment.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_doc_comment.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_enum.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_enum.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_enum_field.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_enum_field.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_field_base.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_field_base.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_generator.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_generator.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_helpers.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_helpers.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_map_field.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_map_field.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_message.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_message.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_message_field.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_message_field.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_names.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_options.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_primitive_field.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_reflection_class.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_reflection_class.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_source_generator_base.h third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_wrapper_field.h third_party/protobuf/src/google/protobuf/compiler/java/java_context.cc third_party/protobuf/src/google/protobuf/compiler/java/java_context.h third_party/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc third_party/protobuf/src/google/protobuf/compiler/java/java_doc_comment.h third_party/protobuf/src/google/protobuf/compiler/java/java_doc_comment_unittest.cc third_party/protobuf/src/google/protobuf/compiler/java/java_enum.cc third_party/protobuf/src/google/protobuf/compiler/java/java_enum.h third_party/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc third_party/protobuf/src/google/protobuf/compiler/java/java_enum_field.h third_party/protobuf/src/google/protobuf/compiler/java/java_enum_field_lite.cc third_party/protobuf/src/google/protobuf/compiler/java/java_enum_field_lite.h third_party/protobuf/src/google/protobuf/compiler/java/java_enum_lite.cc third_party/protobuf/src/google/protobuf/compiler/java/java_enum_lite.h third_party/protobuf/src/google/protobuf/compiler/java/java_extension.cc third_party/protobuf/src/google/protobuf/compiler/java/java_extension.h third_party/protobuf/src/google/protobuf/compiler/java/java_extension_lite.cc third_party/protobuf/src/google/protobuf/compiler/java/java_extension_lite.h third_party/protobuf/src/google/protobuf/compiler/java/java_field.cc third_party/protobuf/src/google/protobuf/compiler/java/java_field.h third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc third_party/protobuf/src/google/protobuf/compiler/java/java_file.h third_party/protobuf/src/google/protobuf/compiler/java/java_generator.cc third_party/protobuf/src/google/protobuf/compiler/java/java_generator.h third_party/protobuf/src/google/protobuf/compiler/java/java_generator_factory.cc third_party/protobuf/src/google/protobuf/compiler/java/java_generator_factory.h third_party/protobuf/src/google/protobuf/compiler/java/java_helpers.cc third_party/protobuf/src/google/protobuf/compiler/java/java_helpers.h third_party/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.cc third_party/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.h third_party/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field_lite.cc third_party/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field_lite.h third_party/protobuf/src/google/protobuf/compiler/java/java_map_field.cc third_party/protobuf/src/google/protobuf/compiler/java/java_map_field.h third_party/protobuf/src/google/protobuf/compiler/java/java_map_field_lite.cc third_party/protobuf/src/google/protobuf/compiler/java/java_map_field_lite.h third_party/protobuf/src/google/protobuf/compiler/java/java_message.cc third_party/protobuf/src/google/protobuf/compiler/java/java_message.h third_party/protobuf/src/google/protobuf/compiler/java/java_message_builder.cc third_party/protobuf/src/google/protobuf/compiler/java/java_message_builder.h third_party/protobuf/src/google/protobuf/compiler/java/java_message_builder_lite.cc third_party/protobuf/src/google/protobuf/compiler/java/java_message_builder_lite.h third_party/protobuf/src/google/protobuf/compiler/java/java_message_field.cc third_party/protobuf/src/google/protobuf/compiler/java/java_message_field.h third_party/protobuf/src/google/protobuf/compiler/java/java_message_field_lite.cc third_party/protobuf/src/google/protobuf/compiler/java/java_message_field_lite.h third_party/protobuf/src/google/protobuf/compiler/java/java_message_lite.cc third_party/protobuf/src/google/protobuf/compiler/java/java_message_lite.h third_party/protobuf/src/google/protobuf/compiler/java/java_name_resolver.cc third_party/protobuf/src/google/protobuf/compiler/java/java_name_resolver.h third_party/protobuf/src/google/protobuf/compiler/java/java_names.h third_party/protobuf/src/google/protobuf/compiler/java/java_options.h third_party/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc third_party/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc third_party/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h third_party/protobuf/src/google/protobuf/compiler/java/java_primitive_field_lite.cc third_party/protobuf/src/google/protobuf/compiler/java/java_primitive_field_lite.h third_party/protobuf/src/google/protobuf/compiler/java/java_service.cc third_party/protobuf/src/google/protobuf/compiler/java/java_service.h third_party/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.cc third_party/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.h third_party/protobuf/src/google/protobuf/compiler/java/java_string_field.cc third_party/protobuf/src/google/protobuf/compiler/java/java_string_field.h third_party/protobuf/src/google/protobuf/compiler/java/java_string_field_lite.cc third_party/protobuf/src/google/protobuf/compiler/java/java_string_field_lite.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_enum.cc third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_enum.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_enum_field.cc third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_enum_field.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_extension.cc third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_extension.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_field.cc third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_field.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_file.cc third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_file.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_generator.cc third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_generator.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_helpers.cc third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_helpers.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_map_field.cc third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_map_field.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_message.cc third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_message.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_message_field.cc third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_message_field.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_params.h third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_primitive_field.h third_party/protobuf/src/google/protobuf/compiler/js/embed.cc third_party/protobuf/src/google/protobuf/compiler/js/js_generator.cc third_party/protobuf/src/google/protobuf/compiler/js/js_generator.h third_party/protobuf/src/google/protobuf/compiler/js/well_known_types_embed.h third_party/protobuf/src/google/protobuf/compiler/js/well_known_types/any.js third_party/protobuf/src/google/protobuf/compiler/js/well_known_types/struct.js third_party/protobuf/src/google/protobuf/compiler/js/well_known_types/timestamp.js third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_enum.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_enum.h third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_extension.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_extension.h third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_field.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_field.h third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_file.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_file.h third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_generator.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_generator.h third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_helpers.h third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_map_field.h third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_message.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_message.h third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_message_field.h third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_oneof.h third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h third_party/protobuf/src/google/protobuf/compiler/php/php_generator.cc third_party/protobuf/src/google/protobuf/compiler/php/php_generator.h third_party/protobuf/src/google/protobuf/compiler/python/python_generator.cc third_party/protobuf/src/google/protobuf/compiler/python/python_generator.h third_party/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc third_party/protobuf/src/google/protobuf/compiler/ruby/ruby_generated_code.proto third_party/protobuf/src/google/protobuf/compiler/ruby/ruby_generated_code_pb.rb third_party/protobuf/src/google/protobuf/compiler/ruby/ruby_generator.cc third_party/protobuf/src/google/protobuf/compiler/ruby/ruby_generator.h third_party/protobuf/src/google/protobuf/compiler/ruby/ruby_generator_unittest.cc third_party/protobuf/src/google/protobuf/io/coded_stream.cc third_party/protobuf/src/google/protobuf/io/coded_stream.h third_party/protobuf/src/google/protobuf/io/coded_stream_inl.h third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc third_party/protobuf/src/google/protobuf/io/gzip_stream.cc third_party/protobuf/src/google/protobuf/io/gzip_stream.h third_party/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh third_party/protobuf/src/google/protobuf/io/package_info.h third_party/protobuf/src/google/protobuf/io/printer.cc third_party/protobuf/src/google/protobuf/io/printer.h third_party/protobuf/src/google/protobuf/io/printer_unittest.cc third_party/protobuf/src/google/protobuf/io/strtod.cc third_party/protobuf/src/google/protobuf/io/strtod.h third_party/protobuf/src/google/protobuf/io/tokenizer.cc third_party/protobuf/src/google/protobuf/io/tokenizer.h third_party/protobuf/src/google/protobuf/io/tokenizer_unittest.cc third_party/protobuf/src/google/protobuf/io/zero_copy_stream.cc third_party/protobuf/src/google/protobuf/io/zero_copy_stream.h third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h third_party/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc third_party/protobuf/src/google/protobuf/stubs/atomic_sequence_num.h third_party/protobuf/src/google/protobuf/stubs/atomicops.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_c11_atomic.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_power.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_ppc_gcc.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_solaris.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h third_party/protobuf/src/google/protobuf/stubs/bytestream.cc third_party/protobuf/src/google/protobuf/stubs/bytestream.h third_party/protobuf/src/google/protobuf/stubs/bytestream_unittest.cc third_party/protobuf/src/google/protobuf/stubs/callback.h third_party/protobuf/src/google/protobuf/stubs/casts.h third_party/protobuf/src/google/protobuf/stubs/common.cc third_party/protobuf/src/google/protobuf/stubs/common.h third_party/protobuf/src/google/protobuf/stubs/common_unittest.cc third_party/protobuf/src/google/protobuf/stubs/fastmem.h third_party/protobuf/src/google/protobuf/stubs/hash.h third_party/protobuf/src/google/protobuf/stubs/int128.cc third_party/protobuf/src/google/protobuf/stubs/int128.h third_party/protobuf/src/google/protobuf/stubs/int128_unittest.cc third_party/protobuf/src/google/protobuf/stubs/io_win32.cc third_party/protobuf/src/google/protobuf/stubs/io_win32.h third_party/protobuf/src/google/protobuf/stubs/io_win32_unittest.cc third_party/protobuf/src/google/protobuf/stubs/logging.h third_party/protobuf/src/google/protobuf/stubs/macros.h third_party/protobuf/src/google/protobuf/stubs/map_util.h third_party/protobuf/src/google/protobuf/stubs/mathlimits.cc third_party/protobuf/src/google/protobuf/stubs/mathlimits.h third_party/protobuf/src/google/protobuf/stubs/mathutil.h third_party/protobuf/src/google/protobuf/stubs/mutex.h third_party/protobuf/src/google/protobuf/stubs/once.cc third_party/protobuf/src/google/protobuf/stubs/once.h third_party/protobuf/src/google/protobuf/stubs/once_unittest.cc third_party/protobuf/src/google/protobuf/stubs/platform_macros.h third_party/protobuf/src/google/protobuf/stubs/port.h third_party/protobuf/src/google/protobuf/stubs/scoped_ptr.h third_party/protobuf/src/google/protobuf/stubs/shared_ptr.h third_party/protobuf/src/google/protobuf/stubs/singleton.h third_party/protobuf/src/google/protobuf/stubs/status.cc third_party/protobuf/src/google/protobuf/stubs/status.h third_party/protobuf/src/google/protobuf/stubs/status_macros.h third_party/protobuf/src/google/protobuf/stubs/status_test.cc third_party/protobuf/src/google/protobuf/stubs/statusor.cc third_party/protobuf/src/google/protobuf/stubs/statusor.h third_party/protobuf/src/google/protobuf/stubs/statusor_test.cc third_party/protobuf/src/google/protobuf/stubs/stl_util.h third_party/protobuf/src/google/protobuf/stubs/stringpiece.cc third_party/protobuf/src/google/protobuf/stubs/stringpiece.h third_party/protobuf/src/google/protobuf/stubs/stringpiece_unittest.cc third_party/protobuf/src/google/protobuf/stubs/stringprintf.cc third_party/protobuf/src/google/protobuf/stubs/stringprintf.h third_party/protobuf/src/google/protobuf/stubs/stringprintf_unittest.cc third_party/protobuf/src/google/protobuf/stubs/structurally_valid.cc third_party/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc third_party/protobuf/src/google/protobuf/stubs/strutil.cc third_party/protobuf/src/google/protobuf/stubs/strutil.h third_party/protobuf/src/google/protobuf/stubs/strutil_unittest.cc third_party/protobuf/src/google/protobuf/stubs/substitute.cc third_party/protobuf/src/google/protobuf/stubs/substitute.h third_party/protobuf/src/google/protobuf/stubs/template_util.h third_party/protobuf/src/google/protobuf/stubs/template_util_unittest.cc third_party/protobuf/src/google/protobuf/stubs/time.cc third_party/protobuf/src/google/protobuf/stubs/time.h third_party/protobuf/src/google/protobuf/stubs/time_test.cc third_party/protobuf/src/google/protobuf/stubs/type_traits.h third_party/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc third_party/protobuf/src/google/protobuf/testdata/bad_utf8_string third_party/protobuf/src/google/protobuf/testdata/golden_message third_party/protobuf/src/google/protobuf/testdata/golden_message_maps third_party/protobuf/src/google/protobuf/testdata/golden_message_oneof_implemented third_party/protobuf/src/google/protobuf/testdata/golden_message_proto3 third_party/protobuf/src/google/protobuf/testdata/golden_packed_fields_message third_party/protobuf/src/google/protobuf/testdata/map_test_data.txt third_party/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt third_party/protobuf/src/google/protobuf/testdata/text_format_unittest_data_oneof_implemented.txt third_party/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy.txt third_party/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy_oneof.txt third_party/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt third_party/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data_pointy.txt third_party/protobuf/src/google/protobuf/testing/file.cc third_party/protobuf/src/google/protobuf/testing/file.h third_party/protobuf/src/google/protobuf/testing/googletest.cc third_party/protobuf/src/google/protobuf/testing/googletest.h third_party/protobuf/src/google/protobuf/testing/zcgunzip.cc third_party/protobuf/src/google/protobuf/testing/zcgzip.cc third_party/protobuf/src/google/protobuf/util/delimited_message_util.cc third_party/protobuf/src/google/protobuf/util/delimited_message_util.h third_party/protobuf/src/google/protobuf/util/delimited_message_util_test.cc third_party/protobuf/src/google/protobuf/util/field_comparator.cc third_party/protobuf/src/google/protobuf/util/field_comparator.h third_party/protobuf/src/google/protobuf/util/field_comparator_test.cc third_party/protobuf/src/google/protobuf/util/field_mask_util.cc third_party/protobuf/src/google/protobuf/util/field_mask_util.h third_party/protobuf/src/google/protobuf/util/field_mask_util_test.cc third_party/protobuf/src/google/protobuf/util/json_format_proto3.proto third_party/protobuf/src/google/protobuf/util/json_util.cc third_party/protobuf/src/google/protobuf/util/json_util.h third_party/protobuf/src/google/protobuf/util/json_util_test.cc third_party/protobuf/src/google/protobuf/util/message_differencer.cc third_party/protobuf/src/google/protobuf/util/message_differencer.h third_party/protobuf/src/google/protobuf/util/message_differencer_unittest.cc third_party/protobuf/src/google/protobuf/util/message_differencer_unittest.proto third_party/protobuf/src/google/protobuf/util/package_info.h third_party/protobuf/src/google/protobuf/util/time_util.cc third_party/protobuf/src/google/protobuf/util/time_util.h third_party/protobuf/src/google/protobuf/util/time_util_test.cc third_party/protobuf/src/google/protobuf/util/type_resolver.h third_party/protobuf/src/google/protobuf/util/type_resolver_util.cc third_party/protobuf/src/google/protobuf/util/type_resolver_util.h third_party/protobuf/src/google/protobuf/util/type_resolver_util_test.cc third_party/protobuf/src/google/protobuf/util/internal/constants.h third_party/protobuf/src/google/protobuf/util/internal/datapiece.cc third_party/protobuf/src/google/protobuf/util/internal/datapiece.h third_party/protobuf/src/google/protobuf/util/internal/default_value_objectwriter.cc third_party/protobuf/src/google/protobuf/util/internal/default_value_objectwriter.h third_party/protobuf/src/google/protobuf/util/internal/default_value_objectwriter_test.cc third_party/protobuf/src/google/protobuf/util/internal/error_listener.cc third_party/protobuf/src/google/protobuf/util/internal/error_listener.h third_party/protobuf/src/google/protobuf/util/internal/expecting_objectwriter.h third_party/protobuf/src/google/protobuf/util/internal/field_mask_utility.cc third_party/protobuf/src/google/protobuf/util/internal/field_mask_utility.h third_party/protobuf/src/google/protobuf/util/internal/json_escaping.cc third_party/protobuf/src/google/protobuf/util/internal/json_escaping.h third_party/protobuf/src/google/protobuf/util/internal/json_objectwriter.cc third_party/protobuf/src/google/protobuf/util/internal/json_objectwriter.h third_party/protobuf/src/google/protobuf/util/internal/json_objectwriter_test.cc third_party/protobuf/src/google/protobuf/util/internal/json_stream_parser.cc third_party/protobuf/src/google/protobuf/util/internal/json_stream_parser.h third_party/protobuf/src/google/protobuf/util/internal/json_stream_parser_test.cc third_party/protobuf/src/google/protobuf/util/internal/location_tracker.h third_party/protobuf/src/google/protobuf/util/internal/mock_error_listener.h third_party/protobuf/src/google/protobuf/util/internal/object_location_tracker.h third_party/protobuf/src/google/protobuf/util/internal/object_source.h third_party/protobuf/src/google/protobuf/util/internal/object_writer.cc third_party/protobuf/src/google/protobuf/util/internal/object_writer.h third_party/protobuf/src/google/protobuf/util/internal/proto_writer.cc third_party/protobuf/src/google/protobuf/util/internal/proto_writer.h third_party/protobuf/src/google/protobuf/util/internal/protostream_objectsource.cc third_party/protobuf/src/google/protobuf/util/internal/protostream_objectsource.h third_party/protobuf/src/google/protobuf/util/internal/protostream_objectsource_test.cc third_party/protobuf/src/google/protobuf/util/internal/protostream_objectwriter.cc third_party/protobuf/src/google/protobuf/util/internal/protostream_objectwriter.h third_party/protobuf/src/google/protobuf/util/internal/protostream_objectwriter_test.cc third_party/protobuf/src/google/protobuf/util/internal/structured_objectwriter.h third_party/protobuf/src/google/protobuf/util/internal/type_info.cc third_party/protobuf/src/google/protobuf/util/internal/type_info.h third_party/protobuf/src/google/protobuf/util/internal/type_info_test_helper.cc third_party/protobuf/src/google/protobuf/util/internal/type_info_test_helper.h third_party/protobuf/src/google/protobuf/util/internal/utility.cc third_party/protobuf/src/google/protobuf/util/internal/utility.h third_party/protobuf/src/google/protobuf/util/internal/testdata/anys.proto third_party/protobuf/src/google/protobuf/util/internal/testdata/books.proto third_party/protobuf/src/google/protobuf/util/internal/testdata/default_value.proto third_party/protobuf/src/google/protobuf/util/internal/testdata/default_value_test.proto third_party/protobuf/src/google/protobuf/util/internal/testdata/field_mask.proto third_party/protobuf/src/google/protobuf/util/internal/testdata/maps.proto third_party/protobuf/src/google/protobuf/util/internal/testdata/oneofs.proto third_party/protobuf/src/google/protobuf/util/internal/testdata/proto3.proto third_party/protobuf/src/google/protobuf/util/internal/testdata/struct.proto third_party/protobuf/src/google/protobuf/util/internal/testdata/timestamp_duration.proto third_party/protobuf/src/google/protobuf/util/internal/testdata/wrappers.proto third_party/protobuf/src/solaris/libstdc++.lapython-grpc-tools-1.14.1/grpcio_tools.egg-info/dependency_links.txt000066400000000000000000000000011334102242000254400ustar00rootroot00000000000000 python-grpc-tools-1.14.1/grpcio_tools.egg-info/requires.txt000066400000000000000000000000451334102242000237710ustar00rootroot00000000000000protobuf>=3.5.0.post1 grpcio>=1.14.1 python-grpc-tools-1.14.1/grpcio_tools.egg-info/top_level.txt000066400000000000000000000000131334102242000241160ustar00rootroot00000000000000grpc_tools python-grpc-tools-1.14.1/protoc_lib_deps.py000066400000000000000000000227441334102242000207270ustar00rootroot00000000000000 # Copyright 2017 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # AUTO-GENERATED BY make_grpcio_tools.py! CC_FILES=['google/protobuf/compiler/zip_writer.cc', 'google/protobuf/compiler/subprocess.cc', 'google/protobuf/compiler/ruby/ruby_generator.cc', 'google/protobuf/compiler/python/python_generator.cc', 'google/protobuf/compiler/plugin.pb.cc', 'google/protobuf/compiler/plugin.cc', 'google/protobuf/compiler/php/php_generator.cc', 'google/protobuf/compiler/objectivec/objectivec_primitive_field.cc', 'google/protobuf/compiler/objectivec/objectivec_oneof.cc', 'google/protobuf/compiler/objectivec/objectivec_message_field.cc', 'google/protobuf/compiler/objectivec/objectivec_message.cc', 'google/protobuf/compiler/objectivec/objectivec_map_field.cc', 'google/protobuf/compiler/objectivec/objectivec_helpers.cc', 'google/protobuf/compiler/objectivec/objectivec_generator.cc', 'google/protobuf/compiler/objectivec/objectivec_file.cc', 'google/protobuf/compiler/objectivec/objectivec_field.cc', 'google/protobuf/compiler/objectivec/objectivec_extension.cc', 'google/protobuf/compiler/objectivec/objectivec_enum_field.cc', 'google/protobuf/compiler/objectivec/objectivec_enum.cc', 'google/protobuf/compiler/js/well_known_types_embed.cc', 'google/protobuf/compiler/js/js_generator.cc', 'google/protobuf/compiler/javanano/javanano_primitive_field.cc', 'google/protobuf/compiler/javanano/javanano_message_field.cc', 'google/protobuf/compiler/javanano/javanano_message.cc', 'google/protobuf/compiler/javanano/javanano_map_field.cc', 'google/protobuf/compiler/javanano/javanano_helpers.cc', 'google/protobuf/compiler/javanano/javanano_generator.cc', 'google/protobuf/compiler/javanano/javanano_file.cc', 'google/protobuf/compiler/javanano/javanano_field.cc', 'google/protobuf/compiler/javanano/javanano_extension.cc', 'google/protobuf/compiler/javanano/javanano_enum_field.cc', 'google/protobuf/compiler/javanano/javanano_enum.cc', 'google/protobuf/compiler/java/java_string_field_lite.cc', 'google/protobuf/compiler/java/java_string_field.cc', 'google/protobuf/compiler/java/java_shared_code_generator.cc', 'google/protobuf/compiler/java/java_service.cc', 'google/protobuf/compiler/java/java_primitive_field_lite.cc', 'google/protobuf/compiler/java/java_primitive_field.cc', 'google/protobuf/compiler/java/java_name_resolver.cc', 'google/protobuf/compiler/java/java_message_lite.cc', 'google/protobuf/compiler/java/java_message_field_lite.cc', 'google/protobuf/compiler/java/java_message_field.cc', 'google/protobuf/compiler/java/java_message_builder_lite.cc', 'google/protobuf/compiler/java/java_message_builder.cc', 'google/protobuf/compiler/java/java_message.cc', 'google/protobuf/compiler/java/java_map_field_lite.cc', 'google/protobuf/compiler/java/java_map_field.cc', 'google/protobuf/compiler/java/java_lazy_message_field_lite.cc', 'google/protobuf/compiler/java/java_lazy_message_field.cc', 'google/protobuf/compiler/java/java_helpers.cc', 'google/protobuf/compiler/java/java_generator_factory.cc', 'google/protobuf/compiler/java/java_generator.cc', 'google/protobuf/compiler/java/java_file.cc', 'google/protobuf/compiler/java/java_field.cc', 'google/protobuf/compiler/java/java_extension_lite.cc', 'google/protobuf/compiler/java/java_extension.cc', 'google/protobuf/compiler/java/java_enum_lite.cc', 'google/protobuf/compiler/java/java_enum_field_lite.cc', 'google/protobuf/compiler/java/java_enum_field.cc', 'google/protobuf/compiler/java/java_enum.cc', 'google/protobuf/compiler/java/java_doc_comment.cc', 'google/protobuf/compiler/java/java_context.cc', 'google/protobuf/compiler/csharp/csharp_wrapper_field.cc', 'google/protobuf/compiler/csharp/csharp_source_generator_base.cc', 'google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc', 'google/protobuf/compiler/csharp/csharp_repeated_message_field.cc', 'google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc', 'google/protobuf/compiler/csharp/csharp_reflection_class.cc', 'google/protobuf/compiler/csharp/csharp_primitive_field.cc', 'google/protobuf/compiler/csharp/csharp_message_field.cc', 'google/protobuf/compiler/csharp/csharp_message.cc', 'google/protobuf/compiler/csharp/csharp_map_field.cc', 'google/protobuf/compiler/csharp/csharp_helpers.cc', 'google/protobuf/compiler/csharp/csharp_generator.cc', 'google/protobuf/compiler/csharp/csharp_field_base.cc', 'google/protobuf/compiler/csharp/csharp_enum_field.cc', 'google/protobuf/compiler/csharp/csharp_enum.cc', 'google/protobuf/compiler/csharp/csharp_doc_comment.cc', 'google/protobuf/compiler/cpp/cpp_string_field.cc', 'google/protobuf/compiler/cpp/cpp_service.cc', 'google/protobuf/compiler/cpp/cpp_primitive_field.cc', 'google/protobuf/compiler/cpp/cpp_padding_optimizer.cc', 'google/protobuf/compiler/cpp/cpp_message_field.cc', 'google/protobuf/compiler/cpp/cpp_message.cc', 'google/protobuf/compiler/cpp/cpp_map_field.cc', 'google/protobuf/compiler/cpp/cpp_helpers.cc', 'google/protobuf/compiler/cpp/cpp_generator.cc', 'google/protobuf/compiler/cpp/cpp_file.cc', 'google/protobuf/compiler/cpp/cpp_field.cc', 'google/protobuf/compiler/cpp/cpp_extension.cc', 'google/protobuf/compiler/cpp/cpp_enum_field.cc', 'google/protobuf/compiler/cpp/cpp_enum.cc', 'google/protobuf/compiler/command_line_interface.cc', 'google/protobuf/compiler/code_generator.cc', 'google/protobuf/wrappers.pb.cc', 'google/protobuf/wire_format.cc', 'google/protobuf/util/type_resolver_util.cc', 'google/protobuf/util/time_util.cc', 'google/protobuf/util/message_differencer.cc', 'google/protobuf/util/json_util.cc', 'google/protobuf/util/internal/utility.cc', 'google/protobuf/util/internal/type_info_test_helper.cc', 'google/protobuf/util/internal/type_info.cc', 'google/protobuf/util/internal/protostream_objectwriter.cc', 'google/protobuf/util/internal/protostream_objectsource.cc', 'google/protobuf/util/internal/proto_writer.cc', 'google/protobuf/util/internal/object_writer.cc', 'google/protobuf/util/internal/json_stream_parser.cc', 'google/protobuf/util/internal/json_objectwriter.cc', 'google/protobuf/util/internal/json_escaping.cc', 'google/protobuf/util/internal/field_mask_utility.cc', 'google/protobuf/util/internal/error_listener.cc', 'google/protobuf/util/internal/default_value_objectwriter.cc', 'google/protobuf/util/internal/datapiece.cc', 'google/protobuf/util/field_mask_util.cc', 'google/protobuf/util/field_comparator.cc', 'google/protobuf/util/delimited_message_util.cc', 'google/protobuf/unknown_field_set.cc', 'google/protobuf/type.pb.cc', 'google/protobuf/timestamp.pb.cc', 'google/protobuf/text_format.cc', 'google/protobuf/stubs/substitute.cc', 'google/protobuf/stubs/mathlimits.cc', 'google/protobuf/struct.pb.cc', 'google/protobuf/source_context.pb.cc', 'google/protobuf/service.cc', 'google/protobuf/reflection_ops.cc', 'google/protobuf/message.cc', 'google/protobuf/map_field.cc', 'google/protobuf/io/zero_copy_stream_impl.cc', 'google/protobuf/io/tokenizer.cc', 'google/protobuf/io/strtod.cc', 'google/protobuf/io/printer.cc', 'google/protobuf/io/gzip_stream.cc', 'google/protobuf/generated_message_table_driven.cc', 'google/protobuf/generated_message_reflection.cc', 'google/protobuf/field_mask.pb.cc', 'google/protobuf/extension_set_heavy.cc', 'google/protobuf/empty.pb.cc', 'google/protobuf/dynamic_message.cc', 'google/protobuf/duration.pb.cc', 'google/protobuf/descriptor_database.cc', 'google/protobuf/descriptor.pb.cc', 'google/protobuf/descriptor.cc', 'google/protobuf/compiler/parser.cc', 'google/protobuf/compiler/importer.cc', 'google/protobuf/api.pb.cc', 'google/protobuf/any.pb.cc', 'google/protobuf/any.cc', 'google/protobuf/wire_format_lite.cc', 'google/protobuf/stubs/time.cc', 'google/protobuf/stubs/strutil.cc', 'google/protobuf/stubs/structurally_valid.cc', 'google/protobuf/stubs/stringprintf.cc', 'google/protobuf/stubs/stringpiece.cc', 'google/protobuf/stubs/statusor.cc', 'google/protobuf/stubs/status.cc', 'google/protobuf/stubs/once.cc', 'google/protobuf/stubs/io_win32.cc', 'google/protobuf/stubs/int128.cc', 'google/protobuf/stubs/common.cc', 'google/protobuf/stubs/bytestream.cc', 'google/protobuf/stubs/atomicops_internals_x86_msvc.cc', 'google/protobuf/stubs/atomicops_internals_x86_gcc.cc', 'google/protobuf/repeated_field.cc', 'google/protobuf/message_lite.cc', 'google/protobuf/io/zero_copy_stream_impl_lite.cc', 'google/protobuf/io/zero_copy_stream.cc', 'google/protobuf/io/coded_stream.cc', 'google/protobuf/generated_message_util.cc', 'google/protobuf/generated_message_table_driven_lite.cc', 'google/protobuf/extension_set.cc', 'google/protobuf/arenastring.cc', 'google/protobuf/arena.cc', 'google/protobuf/compiler/js/embed.cc'] PROTO_FILES=['google/protobuf/wrappers.proto', 'google/protobuf/type.proto', 'google/protobuf/timestamp.proto', 'google/protobuf/struct.proto', 'google/protobuf/source_context.proto', 'google/protobuf/field_mask.proto', 'google/protobuf/empty.proto', 'google/protobuf/duration.proto', 'google/protobuf/descriptor.proto', 'google/protobuf/compiler/plugin.proto', 'google/protobuf/api.proto', 'google/protobuf/any.proto'] CC_INCLUDE='third_party/protobuf/src' PROTO_INCLUDE='third_party/protobuf/src' PROTOBUF_SUBMODULE_VERSION="b5fbb742af122b565925987e65c08957739976a7" python-grpc-tools-1.14.1/setup.cfg000066400000000000000000000000461334102242000170160ustar00rootroot00000000000000[egg_info] tag_build = tag_date = 0 python-grpc-tools-1.14.1/setup.py000066400000000000000000000212061334102242000167100ustar00rootroot00000000000000# Copyright 2016 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from distutils import cygwinccompiler from distutils import extension from distutils import util import errno import os import os.path import pkg_resources import platform import re import shlex import shutil import sys import sysconfig import setuptools from setuptools.command import build_ext # TODO(atash) add flag to disable Cython use os.chdir(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.abspath('.')) import protoc_lib_deps import grpc_version CLASSIFIERS = [ 'Development Status :: 5 - Production/Stable', 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'License :: OSI Approved :: Apache Software License', ] PY3 = sys.version_info.major == 3 # Environment variable to determine whether or not the Cython extension should # *use* Cython or use the generated C files. Note that this requires the C files # to have been generated by building first *with* Cython support. BUILD_WITH_CYTHON = os.environ.get('GRPC_PYTHON_BUILD_WITH_CYTHON', False) # There are some situations (like on Windows) where CC, CFLAGS, and LDFLAGS are # entirely ignored/dropped/forgotten by distutils and its Cygwin/MinGW support. # We use these environment variables to thus get around that without locking # ourselves in w.r.t. the multitude of operating systems this ought to build on. # We can also use these variables as a way to inject environment-specific # compiler/linker flags. We assume GCC-like compilers and/or MinGW as a # reasonable default. EXTRA_ENV_COMPILE_ARGS = os.environ.get('GRPC_PYTHON_CFLAGS', None) EXTRA_ENV_LINK_ARGS = os.environ.get('GRPC_PYTHON_LDFLAGS', None) if EXTRA_ENV_COMPILE_ARGS is None: EXTRA_ENV_COMPILE_ARGS = '-std=c++11' if 'win32' in sys.platform: if sys.version_info < (3, 5): # We use define flags here and don't directly add to DEFINE_MACROS below to # ensure that the expert user/builder has a way of turning it off (via the # envvars) without adding yet more GRPC-specific envvars. # See https://sourceforge.net/p/mingw-w64/bugs/363/ if '32' in platform.architecture()[0]: EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime32 -D_timeb=__timeb32 -D_ftime_s=_ftime32_s -D_hypot=hypot' else: EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime64 -D_timeb=__timeb64 -D_hypot=hypot' else: # We need to statically link the C++ Runtime, only the C runtime is # available dynamically EXTRA_ENV_COMPILE_ARGS += ' /MT' elif "linux" in sys.platform or "darwin" in sys.platform: EXTRA_ENV_COMPILE_ARGS += ' -fno-wrapv -frtti' if EXTRA_ENV_LINK_ARGS is None: EXTRA_ENV_LINK_ARGS = '' if "linux" in sys.platform or "darwin" in sys.platform: EXTRA_ENV_LINK_ARGS += ' -lpthread' elif "win32" in sys.platform and sys.version_info < (3, 5): msvcr = cygwinccompiler.get_msvcr()[0] # TODO(atash) sift through the GCC specs to see if libstdc++ can have any # influence on the linkage outcome on MinGW for non-C++ programs. EXTRA_ENV_LINK_ARGS += ( ' -static-libgcc -static-libstdc++ -mcrtdll={msvcr} ' '-static'.format(msvcr=msvcr)) EXTRA_COMPILE_ARGS = shlex.split(EXTRA_ENV_COMPILE_ARGS) EXTRA_LINK_ARGS = shlex.split(EXTRA_ENV_LINK_ARGS) CC_FILES = [os.path.normpath(cc_file) for cc_file in protoc_lib_deps.CC_FILES] PROTO_FILES = [ os.path.normpath(proto_file) for proto_file in protoc_lib_deps.PROTO_FILES ] CC_INCLUDE = os.path.normpath(protoc_lib_deps.CC_INCLUDE) PROTO_INCLUDE = os.path.normpath(protoc_lib_deps.PROTO_INCLUDE) GRPC_PYTHON_TOOLS_PACKAGE = 'grpc_tools' GRPC_PYTHON_PROTO_RESOURCES_NAME = '_proto' DEFINE_MACROS = () if "win32" in sys.platform: DEFINE_MACROS += (('WIN32_LEAN_AND_MEAN', 1),) if '64bit' in platform.architecture()[0]: DEFINE_MACROS += (('MS_WIN64', 1),) elif "linux" in sys.platform or "darwin" in sys.platform: DEFINE_MACROS += (('HAVE_PTHREAD', 1),) # By default, Python3 distutils enforces compatibility of # c plugins (.so files) with the OSX version Python3 was built with. # For Python3.4, this is OSX 10.6, but we need Thread Local Support (__thread) if 'darwin' in sys.platform and PY3: mac_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') if mac_target and (pkg_resources.parse_version(mac_target) < pkg_resources.parse_version('10.9.0')): os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.9' os.environ['_PYTHON_HOST_PLATFORM'] = re.sub( r'macosx-[0-9]+\.[0-9]+-(.+)', r'macosx-10.9-\1', util.get_platform()) def package_data(): tools_path = GRPC_PYTHON_TOOLS_PACKAGE.replace('.', os.path.sep) proto_resources_path = os.path.join(tools_path, GRPC_PYTHON_PROTO_RESOURCES_NAME) proto_files = [] for proto_file in PROTO_FILES: source = os.path.join(PROTO_INCLUDE, proto_file) target = os.path.join(proto_resources_path, proto_file) relative_target = os.path.join(GRPC_PYTHON_PROTO_RESOURCES_NAME, proto_file) try: os.makedirs(os.path.dirname(target)) except OSError as error: if error.errno == errno.EEXIST: pass else: raise shutil.copy(source, target) proto_files.append(relative_target) return {GRPC_PYTHON_TOOLS_PACKAGE: proto_files} def extension_modules(): if BUILD_WITH_CYTHON: plugin_sources = [os.path.join('grpc_tools', '_protoc_compiler.pyx')] else: plugin_sources = [os.path.join('grpc_tools', '_protoc_compiler.cpp')] plugin_sources += [ os.path.join('grpc_tools', 'main.cc'), os.path.join('grpc_root', 'src', 'compiler', 'python_generator.cc') ] #HACK: Substitute the embed.cc, which is a JS to C++ # preprocessor with the generated code. # The generated code should not be material # to the parts of protoc we use (it affects # the JavaScript code generator, supposedly), # but we need to be cautious about it. cc_files_clone = list(CC_FILES) embed_cc_file = os.path.normpath('google/protobuf/compiler/js/embed.cc') well_known_types_file = os.path.normpath( 'google/protobuf/compiler/js/well_known_types_embed.cc') if embed_cc_file in cc_files_clone: cc_files_clone.remove(embed_cc_file) if well_known_types_file in cc_files_clone: cc_files_clone.remove(well_known_types_file) plugin_sources += [ os.path.join('grpc_tools', 'protobuf_generated_well_known_types_embed.cc') ] plugin_sources += [ os.path.join(CC_INCLUDE, cc_file) for cc_file in cc_files_clone ] plugin_ext = extension.Extension( name='grpc_tools._protoc_compiler', sources=plugin_sources, include_dirs=[ '.', 'grpc_root', os.path.join('grpc_root', 'include'), CC_INCLUDE, ], language='c++', define_macros=list(DEFINE_MACROS), extra_compile_args=list(EXTRA_COMPILE_ARGS), extra_link_args=list(EXTRA_LINK_ARGS), ) extensions = [plugin_ext] if BUILD_WITH_CYTHON: from Cython import Build return Build.cythonize(extensions) else: return extensions setuptools.setup( name='grpcio-tools', version=grpc_version.VERSION, description='Protobuf code generator for gRPC', author='The gRPC Authors', author_email='grpc-io@googlegroups.com', url='https://grpc.io', license='Apache License 2.0', classifiers=CLASSIFIERS, ext_modules=extension_modules(), packages=setuptools.find_packages('.'), install_requires=[ 'protobuf>=3.5.0.post1', 'grpcio>={version}'.format(version=grpc_version.VERSION), ], package_data=package_data(), ) python-grpc-tools-1.14.1/third_party/000077500000000000000000000000001334102242000175265ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/000077500000000000000000000000001334102242000213665ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/000077500000000000000000000000001334102242000221555ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/Makefile.am000066400000000000000000001564421334102242000242250ustar00rootroot00000000000000## 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 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) # 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/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 # 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 \ google/protobuf/compiler/js/well_known_types_embed.cc \ js_embed$(EXEEXT) MAINTAINERCLEANFILES = \ Makefile.in nobase_include_HEADERS = \ google/protobuf/stubs/atomic_sequence_num.h \ google/protobuf/stubs/atomicops.h \ google/protobuf/stubs/atomicops_internals_power.h \ google/protobuf/stubs/atomicops_internals_ppc_gcc.h \ google/protobuf/stubs/atomicops_internals_arm64_gcc.h \ google/protobuf/stubs/atomicops_internals_arm_gcc.h \ google/protobuf/stubs/atomicops_internals_arm_qnx.h \ google/protobuf/stubs/atomicops_internals_generic_c11_atomic.h \ google/protobuf/stubs/atomicops_internals_generic_gcc.h \ google/protobuf/stubs/atomicops_internals_mips_gcc.h \ google/protobuf/stubs/atomicops_internals_solaris.h \ google/protobuf/stubs/atomicops_internals_tsan.h \ google/protobuf/stubs/atomicops_internals_x86_gcc.h \ google/protobuf/stubs/atomicops_internals_x86_msvc.h \ google/protobuf/stubs/callback.h \ google/protobuf/stubs/bytestream.h \ google/protobuf/stubs/casts.h \ google/protobuf/stubs/common.h \ google/protobuf/stubs/fastmem.h \ google/protobuf/stubs/hash.h \ google/protobuf/stubs/logging.h \ google/protobuf/stubs/macros.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/scoped_ptr.h \ google/protobuf/stubs/shared_ptr.h \ google/protobuf/stubs/singleton.h \ google/protobuf/stubs/status.h \ google/protobuf/stubs/stl_util.h \ google/protobuf/stubs/stringpiece.h \ google/protobuf/stubs/template_util.h \ google/protobuf/stubs/type_traits.h \ google/protobuf/any.pb.h \ google/protobuf/api.pb.h \ google/protobuf/any.h \ google/protobuf/arena.h \ google/protobuf/arena_impl.h \ google/protobuf/arenastring.h \ google/protobuf/descriptor_database.h \ google/protobuf/descriptor.h \ google/protobuf/descriptor.pb.h \ google/protobuf/duration.pb.h \ google/protobuf/dynamic_message.h \ google/protobuf/empty.pb.h \ google/protobuf/extension_set.h \ google/protobuf/field_mask.pb.h \ google/protobuf/generated_enum_reflection.h \ google/protobuf/generated_enum_util.h \ google/protobuf/generated_message_reflection.h \ google/protobuf/generated_message_table_driven.h \ google/protobuf/generated_message_util.h \ google/protobuf/has_bits.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.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/reflection.h \ google/protobuf/reflection_ops.h \ google/protobuf/repeated_field.h \ google/protobuf/service.h \ google/protobuf/source_context.pb.h \ google/protobuf/struct.pb.h \ google/protobuf/text_format.h \ google/protobuf/timestamp.pb.h \ google/protobuf/type.pb.h \ google/protobuf/unknown_field_set.h \ google/protobuf/wire_format.h \ google/protobuf/wire_format_lite.h \ google/protobuf/wire_format_lite_inl.h \ google/protobuf/wrappers.pb.h \ google/protobuf/io/coded_stream.h \ $(GZHEADERS) \ 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/compiler/code_generator.h \ google/protobuf/compiler/command_line_interface.h \ google/protobuf/compiler/importer.h \ google/protobuf/compiler/parser.h \ google/protobuf/compiler/plugin.h \ google/protobuf/compiler/plugin.pb.h \ google/protobuf/compiler/cpp/cpp_generator.h \ google/protobuf/compiler/csharp/csharp_generator.h \ google/protobuf/compiler/csharp/csharp_names.h \ google/protobuf/compiler/java/java_generator.h \ google/protobuf/compiler/java/java_names.h \ google/protobuf/compiler/javanano/javanano_generator.h \ google/protobuf/compiler/js/js_generator.h \ google/protobuf/compiler/js/well_known_types_embed.h \ google/protobuf/compiler/objectivec/objectivec_generator.h \ google/protobuf/compiler/objectivec/objectivec_helpers.h \ google/protobuf/compiler/php/php_generator.h \ google/protobuf/compiler/python/python_generator.h \ google/protobuf/compiler/ruby/ruby_generator.h \ google/protobuf/util/type_resolver.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/time_util.h \ google/protobuf/util/type_resolver_util.h \ google/protobuf/util/message_differencer.h lib_LTLIBRARIES = libprotobuf-lite.la libprotobuf.la libprotoc.la libprotobuf_lite_la_LIBADD = $(PTHREAD_LIBS) libprotobuf_lite_la_LDFLAGS = -version-info 15:1:0 -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/stubs/atomicops_internals_x86_gcc.cc \ google/protobuf/stubs/atomicops_internals_x86_msvc.cc \ google/protobuf/stubs/bytestream.cc \ google/protobuf/stubs/bytestream.h \ google/protobuf/stubs/common.cc \ google/protobuf/stubs/hash.h \ google/protobuf/stubs/int128.cc \ google/protobuf/stubs/int128.h \ google/protobuf/stubs/io_win32.cc \ google/protobuf/stubs/io_win32.h \ google/protobuf/stubs/map_util.h \ google/protobuf/stubs/mathutil.h \ google/protobuf/stubs/once.cc \ google/protobuf/stubs/shared_ptr.h \ google/protobuf/stubs/status.cc \ google/protobuf/stubs/status.h \ google/protobuf/stubs/status_macros.h \ google/protobuf/stubs/statusor.cc \ google/protobuf/stubs/statusor.h \ google/protobuf/stubs/stringpiece.cc \ google/protobuf/stubs/stringpiece.h \ google/protobuf/stubs/stringprintf.cc \ google/protobuf/stubs/stringprintf.h \ google/protobuf/stubs/structurally_valid.cc \ google/protobuf/stubs/strutil.cc \ google/protobuf/stubs/strutil.h \ google/protobuf/stubs/time.cc \ google/protobuf/stubs/time.h \ google/protobuf/arena.cc \ google/protobuf/arenastring.cc \ google/protobuf/extension_set.cc \ google/protobuf/generated_message_util.cc \ google/protobuf/generated_message_table_driven_lite.h \ google/protobuf/generated_message_table_driven_lite.cc \ google/protobuf/message_lite.cc \ google/protobuf/repeated_field.cc \ google/protobuf/wire_format_lite.cc \ google/protobuf/io/coded_stream.cc \ google/protobuf/io/coded_stream_inl.h \ google/protobuf/io/zero_copy_stream.cc \ google/protobuf/io/zero_copy_stream_impl_lite.cc libprotobuf_la_LIBADD = $(PTHREAD_LIBS) libprotobuf_la_LDFLAGS = -version-info 15:1:0 -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.pb.cc \ google/protobuf/api.pb.cc \ google/protobuf/stubs/mathlimits.cc \ google/protobuf/stubs/mathlimits.h \ google/protobuf/any.cc \ google/protobuf/descriptor.cc \ google/protobuf/descriptor_database.cc \ google/protobuf/descriptor.pb.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_reflection.cc \ google/protobuf/generated_message_table_driven_lite.h \ google/protobuf/generated_message_table_driven.cc \ google/protobuf/map_field.cc \ google/protobuf/message.cc \ google/protobuf/reflection_internal.h \ 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/wire_format.cc \ google/protobuf/wrappers.pb.cc \ google/protobuf/io/gzip_stream.cc \ google/protobuf/io/printer.cc \ google/protobuf/io/strtod.cc \ google/protobuf/io/tokenizer.cc \ google/protobuf/io/zero_copy_stream_impl.cc \ google/protobuf/compiler/importer.cc \ google/protobuf/compiler/parser.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/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/proto_writer.cc \ google/protobuf/util/internal/proto_writer.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.cc \ 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 nodist_libprotobuf_la_SOURCES = $(nodist_libprotobuf_lite_la_SOURCES) libprotoc_la_LIBADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc_la_LDFLAGS = -version-info 15:1:0 -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/plugin.cc \ google/protobuf/compiler/plugin.pb.cc \ google/protobuf/compiler/subprocess.cc \ google/protobuf/compiler/subprocess.h \ google/protobuf/compiler/zip_writer.cc \ google/protobuf/compiler/zip_writer.h \ google/protobuf/compiler/cpp/cpp_enum.cc \ google/protobuf/compiler/cpp/cpp_enum.h \ google/protobuf/compiler/cpp/cpp_enum_field.cc \ google/protobuf/compiler/cpp/cpp_enum_field.h \ google/protobuf/compiler/cpp/cpp_extension.cc \ google/protobuf/compiler/cpp/cpp_extension.h \ google/protobuf/compiler/cpp/cpp_field.cc \ google/protobuf/compiler/cpp/cpp_field.h \ google/protobuf/compiler/cpp/cpp_file.cc \ google/protobuf/compiler/cpp/cpp_file.h \ google/protobuf/compiler/cpp/cpp_generator.cc \ google/protobuf/compiler/cpp/cpp_helpers.cc \ google/protobuf/compiler/cpp/cpp_helpers.h \ google/protobuf/compiler/cpp/cpp_map_field.cc \ google/protobuf/compiler/cpp/cpp_map_field.h \ google/protobuf/compiler/cpp/cpp_message.cc \ google/protobuf/compiler/cpp/cpp_message.h \ google/protobuf/compiler/cpp/cpp_message_field.cc \ google/protobuf/compiler/cpp/cpp_message_field.h \ google/protobuf/compiler/cpp/cpp_message_layout_helper.h \ google/protobuf/compiler/cpp/cpp_options.h \ google/protobuf/compiler/cpp/cpp_padding_optimizer.cc \ google/protobuf/compiler/cpp/cpp_padding_optimizer.h \ google/protobuf/compiler/cpp/cpp_primitive_field.cc \ google/protobuf/compiler/cpp/cpp_primitive_field.h \ google/protobuf/compiler/cpp/cpp_service.cc \ google/protobuf/compiler/cpp/cpp_service.h \ google/protobuf/compiler/cpp/cpp_string_field.cc \ google/protobuf/compiler/cpp/cpp_string_field.h \ google/protobuf/compiler/java/java_context.cc \ google/protobuf/compiler/java/java_context.h \ google/protobuf/compiler/java/java_enum.cc \ google/protobuf/compiler/java/java_enum_lite.cc \ google/protobuf/compiler/java/java_enum_field.cc \ google/protobuf/compiler/java/java_enum_field.h \ google/protobuf/compiler/java/java_enum_field_lite.cc \ google/protobuf/compiler/java/java_enum_field_lite.h \ google/protobuf/compiler/java/java_enum.h \ google/protobuf/compiler/java/java_enum_lite.h \ google/protobuf/compiler/java/java_extension.cc \ google/protobuf/compiler/java/java_extension.h \ google/protobuf/compiler/java/java_extension_lite.cc \ google/protobuf/compiler/java/java_extension_lite.h \ google/protobuf/compiler/java/java_field.cc \ google/protobuf/compiler/java/java_field.h \ google/protobuf/compiler/java/java_file.cc \ google/protobuf/compiler/java/java_file.h \ google/protobuf/compiler/java/java_generator.cc \ google/protobuf/compiler/java/java_generator_factory.cc \ google/protobuf/compiler/java/java_generator_factory.h \ google/protobuf/compiler/java/java_helpers.cc \ google/protobuf/compiler/java/java_helpers.h \ google/protobuf/compiler/java/java_lazy_message_field.cc \ google/protobuf/compiler/java/java_lazy_message_field.h \ google/protobuf/compiler/java/java_lazy_message_field_lite.cc\ google/protobuf/compiler/java/java_lazy_message_field_lite.h \ google/protobuf/compiler/java/java_map_field.cc \ google/protobuf/compiler/java/java_map_field.h \ google/protobuf/compiler/java/java_map_field_lite.cc \ google/protobuf/compiler/java/java_map_field_lite.h \ google/protobuf/compiler/java/java_message.cc \ google/protobuf/compiler/java/java_message_lite.cc \ google/protobuf/compiler/java/java_message_builder.cc \ google/protobuf/compiler/java/java_message_builder_lite.cc \ google/protobuf/compiler/java/java_message_field.cc \ google/protobuf/compiler/java/java_message_field.h \ google/protobuf/compiler/java/java_message_field_lite.cc \ google/protobuf/compiler/java/java_message_field_lite.h \ google/protobuf/compiler/java/java_message.h \ google/protobuf/compiler/java/java_message_lite.h \ google/protobuf/compiler/java/java_message_builder.h \ google/protobuf/compiler/java/java_message_builder_lite.h \ google/protobuf/compiler/java/java_name_resolver.cc \ google/protobuf/compiler/java/java_name_resolver.h \ google/protobuf/compiler/java/java_options.h \ google/protobuf/compiler/java/java_primitive_field.cc \ google/protobuf/compiler/java/java_primitive_field.h \ google/protobuf/compiler/java/java_primitive_field_lite.cc \ google/protobuf/compiler/java/java_primitive_field_lite.h \ google/protobuf/compiler/java/java_shared_code_generator.cc \ google/protobuf/compiler/java/java_shared_code_generator.h \ google/protobuf/compiler/java/java_service.cc \ google/protobuf/compiler/java/java_service.h \ google/protobuf/compiler/java/java_string_field.cc \ google/protobuf/compiler/java/java_string_field.h \ google/protobuf/compiler/java/java_string_field_lite.cc \ google/protobuf/compiler/java/java_string_field_lite.h \ google/protobuf/compiler/java/java_doc_comment.cc \ google/protobuf/compiler/java/java_doc_comment.h \ google/protobuf/compiler/js/js_generator.cc \ google/protobuf/compiler/js/well_known_types_embed.cc \ google/protobuf/compiler/javanano/javanano_enum.cc \ google/protobuf/compiler/javanano/javanano_enum.h \ google/protobuf/compiler/javanano/javanano_enum_field.cc \ google/protobuf/compiler/javanano/javanano_enum_field.h \ google/protobuf/compiler/javanano/javanano_extension.cc \ google/protobuf/compiler/javanano/javanano_extension.h \ google/protobuf/compiler/javanano/javanano_field.cc \ google/protobuf/compiler/javanano/javanano_field.h \ google/protobuf/compiler/javanano/javanano_file.cc \ google/protobuf/compiler/javanano/javanano_file.h \ google/protobuf/compiler/javanano/javanano_generator.cc \ google/protobuf/compiler/javanano/javanano_generator.h \ google/protobuf/compiler/javanano/javanano_helpers.cc \ google/protobuf/compiler/javanano/javanano_helpers.h \ google/protobuf/compiler/javanano/javanano_map_field.cc \ google/protobuf/compiler/javanano/javanano_map_field.h \ google/protobuf/compiler/javanano/javanano_message.cc \ google/protobuf/compiler/javanano/javanano_message.h \ google/protobuf/compiler/javanano/javanano_message_field.cc \ google/protobuf/compiler/javanano/javanano_message_field.h \ google/protobuf/compiler/javanano/javanano_params.h \ google/protobuf/compiler/javanano/javanano_primitive_field.cc \ google/protobuf/compiler/javanano/javanano_primitive_field.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_helpers.h \ 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_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/python/python_generator.cc \ google/protobuf/compiler/ruby/ruby_generator.cc \ google/protobuf/compiler/csharp/csharp_doc_comment.cc \ google/protobuf/compiler/csharp/csharp_doc_comment.h \ 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_options.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 bin_PROGRAMS = protoc protoc_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la protoc_SOURCES = google/protobuf/compiler/main.cc # The special JS code for the well-known types is linked into the compiler via # well_known_types_embed.cc, which is generated from .js source files. We have # to build the js_embed binary using $(CXX_FOR_BUILD) so that it is executable # on the build machine in a cross-compilation setup. js_embed$(EXEEXT): $(srcdir)/google/protobuf/compiler/js/embed.cc $(CXX_FOR_BUILD) -o $@ $< js_well_known_types_sources = \ google/protobuf/compiler/js/well_known_types/any.js \ google/protobuf/compiler/js/well_known_types/struct.js \ google/protobuf/compiler/js/well_known_types/timestamp.js # We have to cd to $(srcdir) so that out-of-tree builds work properly. google/protobuf/compiler/js/well_known_types_embed.cc: js_embed$(EXEEXT) $(js_well_known_types_sources) mkdir -p `dirname $@` && \ oldpwd=`pwd` && cd $(srcdir) && \ $$oldpwd/js_embed$(EXEEXT) $(js_well_known_types_sources) > $$oldpwd/$@ # Tests ============================================================== protoc_inputs = \ google/protobuf/any_test.proto \ google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto \ google/protobuf/map_lite_unittest.proto \ google/protobuf/map_proto2_unittest.proto \ google/protobuf/map_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_lite.proto \ google/protobuf/unittest_import.proto \ google/protobuf/unittest_import_public_lite.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_lite.proto \ google/protobuf/unittest_mset.proto \ google/protobuf/unittest_mset_wire_format.proto \ google/protobuf/unittest_no_arena_lite.proto \ google/protobuf/unittest_no_arena_import.proto \ google/protobuf/unittest_no_arena.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_enum2.proto \ google/protobuf/unittest_preserve_unknown_enum.proto \ google/protobuf/unittest.proto \ google/protobuf/unittest_proto3_arena.proto \ google/protobuf/unittest_proto3_arena_lite.proto \ google/protobuf/unittest_proto3_lite.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_proto3.proto \ google/protobuf/util/message_differencer_unittest.proto \ google/protobuf/compiler/cpp/cpp_test_large_enum_value.proto EXTRA_DIST = \ $(protoc_inputs) \ $(js_well_known_types_sources) \ solaris/libstdc++.la \ google/protobuf/unittest_proto3.proto \ google/protobuf/unittest_import_public_proto3.proto \ google/protobuf/unittest_import_proto3.proto \ google/protobuf/test_messages_proto3.proto \ google/protobuf/test_messages_proto2.proto \ google/protobuf/map_unittest_proto3.proto \ google/protobuf/io/gzip_stream.h \ google/protobuf/io/gzip_stream_unittest.sh \ 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/bad_utf8_string \ 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/package_info.h \ google/protobuf/io/package_info.h \ google/protobuf/util/package_info.h \ google/protobuf/compiler/js/embed.cc \ google/protobuf/compiler/ruby/ruby_generated_code.proto \ google/protobuf/compiler/ruby/ruby_generated_code_pb.rb \ google/protobuf/compiler/package_info.h \ google/protobuf/compiler/zip_output_unittest.sh \ libprotobuf-lite.map \ libprotobuf.map \ libprotoc.map \ README.md protoc_lite_outputs = \ google/protobuf/map_lite_unittest.pb.cc \ google/protobuf/map_lite_unittest.pb.h \ google/protobuf/unittest_lite.pb.cc \ google/protobuf/unittest_lite.pb.h \ google/protobuf/unittest_no_arena_lite.pb.cc \ google/protobuf/unittest_no_arena_lite.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 protoc_outputs = \ $(protoc_lite_outputs) \ google/protobuf/any_test.pb.cc \ google/protobuf/any_test.pb.h \ google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.cc \ google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h \ google/protobuf/compiler/cpp/cpp_test_large_enum_value.pb.cc \ google/protobuf/compiler/cpp/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_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_arena_import.pb.cc \ google/protobuf/unittest_no_arena_import.pb.h \ google/protobuf/unittest_no_arena.pb.cc \ google/protobuf/unittest_no_arena.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.pb.cc \ google/protobuf/unittest.pb.h \ google/protobuf/unittest_preserve_unknown_enum2.pb.cc \ google/protobuf/unittest_preserve_unknown_enum2.pb.h \ google/protobuf/unittest_preserve_unknown_enum.pb.cc \ google/protobuf/unittest_preserve_unknown_enum.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_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_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 BUILT_SOURCES = $(protoc_outputs) google/protobuf/compiler/js/well_known_types_embed.cc 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) ) touch unittest_proto_middleman endif $(protoc_outputs): unittest_proto_middleman COMMON_TEST_SOURCES = \ google/protobuf/arena_test_util.cc \ google/protobuf/arena_test_util.h \ google/protobuf/map_test_util.cc \ google/protobuf/map_test_util.h \ google/protobuf/map_test_util_impl.h \ google/protobuf/test_util.cc \ google/protobuf/test_util.h \ google/protobuf/testing/googletest.cc \ google/protobuf/testing/googletest.h \ google/protobuf/testing/file.cc \ google/protobuf/testing/file.h 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 \ ../gmock/gtest/lib/libgtest.la \ ../gmock/lib/libgmock.la \ ../gmock/lib/libgmock_main.la protobuf_test_CPPFLAGS = -I$(srcdir)/../gmock/gtest/include \ -I$(srcdir)/../gmock/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 = \ google/protobuf/stubs/bytestream_unittest.cc \ google/protobuf/stubs/common_unittest.cc \ google/protobuf/stubs/int128_unittest.cc \ google/protobuf/stubs/io_win32_unittest.cc \ google/protobuf/stubs/once_unittest.cc \ google/protobuf/stubs/statusor_test.cc \ google/protobuf/stubs/status_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/stubs/type_traits_unittest.cc \ google/protobuf/any_test.cc \ google/protobuf/arenastring_unittest.cc \ google/protobuf/arena_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/map_field_test.cc \ google/protobuf/map_test.cc \ google/protobuf/message_unittest.cc \ google/protobuf/no_field_presence_test.cc \ google/protobuf/preserve_unknown_enum_test.cc \ google/protobuf/proto3_arena_unittest.cc \ google/protobuf/proto3_arena_lite_unittest.cc \ google/protobuf/proto3_lite_unittest.cc \ google/protobuf/reflection_ops_unittest.cc \ google/protobuf/repeated_field_reflection_unittest.cc \ google/protobuf/repeated_field_unittest.cc \ google/protobuf/text_format_unittest.cc \ google/protobuf/unknown_field_set_unittest.cc \ google/protobuf/well_known_types_unittest.cc \ google/protobuf/wire_format_unittest.cc \ google/protobuf/io/coded_stream_unittest.cc \ google/protobuf/io/printer_unittest.cc \ google/protobuf/io/tokenizer_unittest.cc \ google/protobuf/io/zero_copy_stream_unittest.cc \ google/protobuf/compiler/annotation_test_util.h \ google/protobuf/compiler/annotation_test_util.cc \ google/protobuf/compiler/command_line_interface_unittest.cc \ google/protobuf/compiler/importer_unittest.cc \ google/protobuf/compiler/mock_code_generator.cc \ google/protobuf/compiler/mock_code_generator.h \ google/protobuf/compiler/parser_unittest.cc \ google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc \ google/protobuf/compiler/cpp/cpp_move_unittest.cc \ google/protobuf/compiler/cpp/cpp_unittest.h \ google/protobuf/compiler/cpp/cpp_unittest.cc \ google/protobuf/compiler/cpp/cpp_plugin_unittest.cc \ google/protobuf/compiler/cpp/metadata_test.cc \ google/protobuf/compiler/java/java_plugin_unittest.cc \ google/protobuf/compiler/java/java_doc_comment_unittest.cc \ google/protobuf/compiler/objectivec/objectivec_helpers_unittest.cc \ google/protobuf/compiler/python/python_plugin_unittest.cc \ google/protobuf/compiler/ruby/ruby_generator_unittest.cc \ google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc \ google/protobuf/compiler/csharp/csharp_generator_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 \ $(COMMON_TEST_SOURCES) nodist_protobuf_test_SOURCES = $(protoc_outputs) # Run cpp_unittest again with PROTOBUF_TEST_NO_DESCRIPTORS defined. protobuf_lazy_descriptor_test_LDADD = $(PTHREAD_LIBS) libprotobuf.la \ libprotoc.la \ ../gmock/gtest/lib/libgtest.la \ ../gmock/lib/libgmock.la \ ../gmock/lib/libgmock_main.la protobuf_lazy_descriptor_test_CPPFLAGS = -I$(srcdir)/../gmock/include \ -I$(srcdir)/../gmock/gtest/include \ -DPROTOBUF_TEST_NO_DESCRIPTORS protobuf_lazy_descriptor_test_CXXFLAGS = $(NO_OPT_CXXFLAGS) protobuf_lazy_descriptor_test_SOURCES = \ google/protobuf/compiler/cpp/cpp_unittest.cc \ $(COMMON_TEST_SOURCES) nodist_protobuf_lazy_descriptor_test_SOURCES = $(protoc_outputs) 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/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 \ ../gmock/gtest/lib/libgtest.la \ ../gmock/lib/libgmock.la \ ../gmock/lib/libgmock_main.la protobuf_lite_test_CPPFLAGS= -I$(srcdir)/../gmock/include \ -I$(srcdir)/../gmock/gtest/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) # 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 \ ../gmock/gtest/lib/libgtest.la \ ../gmock/lib/libgmock.la \ ../gmock/lib/libgmock_main.la protobuf_lite_arena_test_CPPFLAGS = -I$(srcdir)/../gmock/include \ -I$(srcdir)/../gmock/gtest/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) # Test plugin binary. test_plugin_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la \ ../gmock/gtest/lib/libgtest.la test_plugin_CPPFLAGS = -I$(srcdir)/../gmock/gtest/include test_plugin_SOURCES = \ google/protobuf/compiler/mock_code_generator.cc \ google/protobuf/testing/file.cc \ google/protobuf/testing/file.h \ google/protobuf/compiler/test_plugin.cc 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 \ if ! echo $${FILE} | grep "atomicops"; then \ echo "#include <$${FILE}>" >> no_warning_test.cc; \ fi \ 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 python-grpc-tools-1.14.1/third_party/protobuf/src/README.md000066400000000000000000000160331334102242000234370ustar00rootroot00000000000000Protocol Buffers - Google's data interchange format =================================================== [![Build Status](https://travis-ci.org/google/protobuf.svg?branch=master)](https://travis-ci.org/google/protobuf) [![Build status](https://ci.appveyor.com/api/projects/status/73ctee6ua4w2ruin?svg=true)](https://ci.appveyor.com/project/protobuf/protobuf) Copyright 2008 Google Inc. https://developers.google.com/protocol-buffers/ C++ Installation - Unix ----------------------- To build protobuf from source, the following tools are needed: * autoconf * automake * libtool * curl (used to download gmock) * make * g++ * unzip On Ubuntu, you can install them with: $ sudo apt-get install autoconf automake libtool curl make g++ unzip On other platforms, please use the corresponding package managing tool to install them before proceeding. If you get the source from github, you need to generate the configure script first: $ ./autogen.sh This will download gmock source (which is used for C++ Protocol Buffer unit-tests) to the current directory and run automake, autoconf, etc. to generate the configure script and various template makefiles. You can skip this step if you are using a release package (which already contains gmock and the configure script). To build and install the C++ Protocol Buffer runtime and the Protocol Buffer compiler (protoc) execute the following: $ ./configure $ make $ make check $ sudo make install $ sudo ldconfig # refresh shared library cache. 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. 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. **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. **Note for Mac users** For a Mac system, Unix tools are not available by default. You will first need to install Xcode from the Mac AppStore and then run the following command from a terminal: $ sudo xcode-select --install To install Unix tools, you can install "port" following the instructions at 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 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 -------------------------- If you only need the protoc binary, you can download it from the release page: https://github.com/google/protobuf/releases In the downloads section, download the zip file protoc-$VERSION-win32.zip. It contains the protoc binary as well as public proto files of protobuf library. To build from source using Microsoft Visual C++, see [cmake/README.md](../cmake/README.md). To build from source using Cygwin or MinGW, follow the Unix installation instructions, above. Binary Compatibility Warning ---------------------------- Due to the nature of C++, it is unlikely that any two versions of the Protocol Buffers C++ runtime libraries will have compatible ABIs. That is, if you linked an executable against an older version of 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: ./configure --disable-shared Usage ----- The complete documentation for Protocol Buffers is available via the web at: https://developers.google.com/protocol-buffers/ python-grpc-tools-1.14.1/third_party/protobuf/src/google/000077500000000000000000000000001334102242000234315ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/000077500000000000000000000000001334102242000252715ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/any.cc000066400000000000000000000104151334102242000263700ustar00rootroot00000000000000// 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 #include namespace google { namespace protobuf { namespace internal { namespace { string GetTypeUrl(const Descriptor* message, const string& type_url_prefix) { if (!type_url_prefix.empty() && type_url_prefix[type_url_prefix.size() - 1] == '/') { return type_url_prefix + message->full_name(); } else { return type_url_prefix + "/" + message->full_name(); } } } // namespace const char kAnyFullTypeName[] = "google.protobuf.Any"; const char kTypeGoogleApisComPrefix[] = "type.googleapis.com/"; const char kTypeGoogleProdComPrefix[] = "type.googleprod.com/"; AnyMetadata::AnyMetadata(UrlType* type_url, ValueType* value) : type_url_(type_url), value_(value) { } void AnyMetadata::PackFrom(const Message& message) { PackFrom(message, kTypeGoogleApisComPrefix); } void AnyMetadata::PackFrom(const Message& message, const string& type_url_prefix) { type_url_->SetNoArena(&::google::protobuf::internal::GetEmptyString(), GetTypeUrl(message.GetDescriptor(), type_url_prefix)); message.SerializeToString(value_->MutableNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited())); } bool AnyMetadata::UnpackTo(Message* message) const { if (!InternalIs(message->GetDescriptor())) { return false; } return message->ParseFromString(value_->GetNoArena()); } bool AnyMetadata::InternalIs(const Descriptor* descriptor) const { const string type_url = type_url_->GetNoArena(); string full_name; if (!ParseAnyTypeUrl(type_url, &full_name)) { return false; } return full_name == descriptor->full_name(); } bool ParseAnyTypeUrl(const string& type_url, string* full_type_name) { size_t pos = type_url.find_last_of("/"); if (pos == string::npos || pos + 1 == type_url.size()) { return false; } *full_type_name = type_url.substr(pos + 1); return true; } bool GetAnyFieldDescriptors(const Message& message, const FieldDescriptor** type_url_field, const FieldDescriptor** value_field) { const Descriptor* descriptor = message.GetDescriptor(); if (descriptor->full_name() != kAnyFullTypeName) { return false; } *type_url_field = descriptor->FindFieldByNumber(1); *value_field = descriptor->FindFieldByNumber(2); return (*type_url_field != NULL && (*type_url_field)->type() == FieldDescriptor::TYPE_STRING && *value_field != NULL && (*value_field)->type() == FieldDescriptor::TYPE_BYTES); } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/any.h000066400000000000000000000111671334102242000262370ustar00rootroot00000000000000// 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_ANY_H__ #define GOOGLE_PROTOBUF_ANY_H__ #include #include #include #include #include namespace google { namespace protobuf { namespace internal { // Helper class used to implement google::protobuf::Any. class LIBPROTOBUF_EXPORT AnyMetadata { typedef ArenaStringPtr UrlType; typedef ArenaStringPtr ValueType; public: // AnyMetadata does not take ownership of "type_url" and "value". AnyMetadata(UrlType* type_url, ValueType* value); // Packs a message using the default type URL prefix: "type.googleapis.com". // The resulted type URL will be "type.googleapis.com/". void PackFrom(const Message& message); // Packs a message using the given type URL prefix. The type URL will be // constructed by concatenating the message type's full name to the prefix // with an optional "/" separator if the prefix doesn't already end up "/". // For example, both PackFrom(message, "type.googleapis.com") and // PackFrom(message, "type.googleapis.com/") yield the same result type // URL: "type.googleapis.com/". void PackFrom(const Message& message, const string& 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 // name after the last "/" of the type URL doesn't match the message's actual // full name) or parsing the payload has failed. bool UnpackTo(Message* message) const; // Checks whether the type specified in the type URL matches the given type. // A type is consdiered matching if its full name matches the full name after // the last "/" in the type URL. template bool Is() const { return InternalIs(T::default_instance().GetDescriptor()); } private: bool InternalIs(const Descriptor* message) const; UrlType* type_url_; ValueType* value_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AnyMetadata); }; extern const char kAnyFullTypeName[]; // "google.protobuf.Any". extern const char kTypeGoogleApisComPrefix[]; // "type.googleapis.com/". extern const char kTypeGoogleProdComPrefix[]; // "type.googleprod.com/". // Get the proto type name from Any::type_url value. For example, passing // "type.googleapis.com/rpc.QueryOrigin" will return "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(const string& type_url, string* full_type_name); // See if message is of type google.protobuf.Any, if so, return the descriptors // for "type_url" and "value" fields. bool GetAnyFieldDescriptors(const Message& message, const FieldDescriptor** type_url_field, const FieldDescriptor** value_field); } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ANY_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/any.pb.cc000066400000000000000000000370411334102242000267740ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/any.proto #include #include #include #include #include #include #include #include #include #include #include // This is a temporary google only hack #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS #include "third_party/protobuf/version.h" #endif // @@protoc_insertion_point(includes) namespace google { namespace protobuf { class AnyDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Any_default_instance_; } // namespace protobuf } // namespace google namespace protobuf_google_2fprotobuf_2fany_2eproto { void InitDefaultsAnyImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_Any_default_instance_; new (ptr) ::google::protobuf::Any(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::Any::InitAsDefaultInstance(); } void InitDefaultsAny() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsAnyImpl); } ::google::protobuf::Metadata file_level_metadata[1]; const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Any, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Any, type_url_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Any, value_), }; static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { { 0, -1, sizeof(::google::protobuf::Any)}, }; static ::google::protobuf::Message const * const file_default_instances[] = { reinterpret_cast(&::google::protobuf::_Any_default_instance_), }; void protobuf_AssignDescriptors() { AddDescriptors(); ::google::protobuf::MessageFactory* factory = NULL; AssignDescriptors( "google/protobuf/any.proto", schemas, file_default_instances, TableStruct::offsets, factory, file_level_metadata, NULL, NULL); } void protobuf_AssignDescriptorsOnce() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors); } void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD; void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1); } void AddDescriptorsImpl() { InitDefaults(); static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_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(\014Bo\n\023com.google.protobufB\010AnyProtoP\001Z" "%github.com/golang/protobuf/ptypes/any\242\002" "\003GPB\252\002\036Google.Protobuf.WellKnownTypesb\006p" "roto3" }; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( descriptor, 205); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "google/protobuf/any.proto", &protobuf_RegisterTypes); } void AddDescriptors() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl); } // Force AddDescriptors() to be called at dynamic initialization time. struct StaticDescriptorInitializer { StaticDescriptorInitializer() { AddDescriptors(); } } static_descriptor_initializer; } // namespace protobuf_google_2fprotobuf_2fany_2eproto namespace google { namespace protobuf { // =================================================================== void Any::InitAsDefaultInstance() { } void Any::PackFrom(const ::google::protobuf::Message& message) { _any_metadata_.PackFrom(message); } void Any::PackFrom(const ::google::protobuf::Message& message, const ::std::string& type_url_prefix) { _any_metadata_.PackFrom(message, type_url_prefix); } bool Any::UnpackTo(::google::protobuf::Message* message) const { return _any_metadata_.UnpackTo(message); } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int Any::kTypeUrlFieldNumber; const int Any::kValueFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Any::Any() : ::google::protobuf::Message(), _internal_metadata_(NULL), _any_metadata_(&type_url_, &value_) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fany_2eproto::InitDefaultsAny(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.Any) } Any::Any(const Any& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _cached_size_(0), _any_metadata_(&type_url_, &value_) { _internal_metadata_.MergeFrom(from._internal_metadata_); type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.type_url().size() > 0) { type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.type_url_); } value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.value().size() > 0) { value_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.value_); } // @@protoc_insertion_point(copy_constructor:google.protobuf.Any) } void Any::SharedCtor() { type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); _cached_size_ = 0; } Any::~Any() { // @@protoc_insertion_point(destructor:google.protobuf.Any) SharedDtor(); } void Any::SharedDtor() { type_url_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void Any::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* Any::descriptor() { ::protobuf_google_2fprotobuf_2fany_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fany_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const Any& Any::default_instance() { ::protobuf_google_2fprotobuf_2fany_2eproto::InitDefaultsAny(); return *internal_default_instance(); } Any* Any::New(::google::protobuf::Arena* arena) const { Any* n = new Any; if (arena != NULL) { arena->Own(n); } return n; } void Any::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.Any) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); _internal_metadata_.Clear(); } bool Any::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.Any) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // string type_url = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_type_url())); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->type_url().data(), static_cast(this->type_url().length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.Any.type_url")); } else { goto handle_unusual; } break; } // bytes value = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( input, this->mutable_value())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.Any) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.Any) return false; #undef DO_ } void Any::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.Any) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // string type_url = 1; if (this->type_url().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->type_url().data(), static_cast(this->type_url().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Any.type_url"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->type_url(), output); } // bytes value = 2; if (this->value().size() > 0) { ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( 2, this->value(), output); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.Any) } ::google::protobuf::uint8* Any::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Any) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // string type_url = 1; if (this->type_url().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->type_url().data(), static_cast(this->type_url().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Any.type_url"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->type_url(), target); } // bytes value = 2; if (this->value().size() > 0) { target = ::google::protobuf::internal::WireFormatLite::WriteBytesToArray( 2, this->value(), target); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Any) return target; } size_t Any::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Any) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } // string type_url = 1; if (this->type_url().size() > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->type_url()); } // bytes value = 2; if (this->value().size() > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( this->value()); } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void Any::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Any) GOOGLE_DCHECK_NE(&from, this); const Any* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.Any) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.Any) MergeFrom(*source); } } void Any::MergeFrom(const Any& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Any) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; if (from.type_url().size() > 0) { type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.type_url_); } if (from.value().size() > 0) { value_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.value_); } } void Any::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.Any) if (&from == this) return; Clear(); MergeFrom(from); } void Any::CopyFrom(const Any& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Any) if (&from == this) return; Clear(); MergeFrom(from); } bool Any::IsInitialized() const { return true; } void Any::Swap(Any* other) { if (other == this) return; InternalSwap(other); } void Any::InternalSwap(Any* other) { using std::swap; type_url_.Swap(&other->type_url_); value_.Swap(&other->value_); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata Any::GetMetadata() const { protobuf_google_2fprotobuf_2fany_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fany_2eproto::file_level_metadata[kIndexInFileMessages]; } // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/any.pb.h000066400000000000000000000264561334102242000266460ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/any.proto #ifndef PROTOBUF_google_2fprotobuf_2fany_2eproto__INCLUDED #define PROTOBUF_google_2fprotobuf_2fany_2eproto__INCLUDED #include #include #if GOOGLE_PROTOBUF_VERSION < 3005000 #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 3005001 < GOOGLE_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 #include #include #include #include #include #include #include #include // IWYU pragma: export #include // IWYU pragma: export #include #include // @@protoc_insertion_point(includes) namespace protobuf_google_2fprotobuf_2fany_2eproto { // Internal implementation detail -- do not use these members. struct LIBPROTOBUF_EXPORT TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; static const ::google::protobuf::internal::ParseTable schema[1]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; }; void LIBPROTOBUF_EXPORT AddDescriptors(); void LIBPROTOBUF_EXPORT InitDefaultsAnyImpl(); void LIBPROTOBUF_EXPORT InitDefaultsAny(); inline void LIBPROTOBUF_EXPORT InitDefaults() { InitDefaultsAny(); } } // namespace protobuf_google_2fprotobuf_2fany_2eproto namespace google { namespace protobuf { class Any; class AnyDefaultTypeInternal; LIBPROTOBUF_EXPORT extern AnyDefaultTypeInternal _Any_default_instance_; } // namespace protobuf } // namespace google namespace google { namespace protobuf { // =================================================================== class LIBPROTOBUF_EXPORT Any : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Any) */ { public: Any(); virtual ~Any(); Any(const Any& from); inline Any& operator=(const Any& from) { CopyFrom(from); return *this; } #if LANG_CXX11 Any(Any&& from) noexcept : Any() { *this = ::std::move(from); } inline Any& operator=(Any&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif static const ::google::protobuf::Descriptor* descriptor(); static const Any& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const Any* internal_default_instance() { return reinterpret_cast( &_Any_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 0; // implements Any ----------------------------------------------- void PackFrom(const ::google::protobuf::Message& message); void PackFrom(const ::google::protobuf::Message& message, const ::std::string& type_url_prefix); bool UnpackTo(::google::protobuf::Message* message) const; template bool Is() const { return _any_metadata_.Is(); } void Swap(Any* other); friend void swap(Any& a, Any& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline Any* New() const PROTOBUF_FINAL { return New(NULL); } Any* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const Any& from); void MergeFrom(const Any& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(Any* other); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return NULL; } inline void* MaybeArenaPtr() const { return NULL; } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // string type_url = 1; void clear_type_url(); static const int kTypeUrlFieldNumber = 1; const ::std::string& type_url() const; void set_type_url(const ::std::string& value); #if LANG_CXX11 void set_type_url(::std::string&& value); #endif void set_type_url(const char* value); void set_type_url(const char* value, size_t size); ::std::string* mutable_type_url(); ::std::string* release_type_url(); void set_allocated_type_url(::std::string* type_url); // bytes value = 2; void clear_value(); static const int kValueFieldNumber = 2; const ::std::string& value() const; void set_value(const ::std::string& value); #if LANG_CXX11 void set_value(::std::string&& value); #endif void set_value(const char* value); void set_value(const void* value, size_t size); ::std::string* mutable_value(); ::std::string* release_value(); void set_allocated_value(::std::string* value); // @@protoc_insertion_point(class_scope:google.protobuf.Any) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; ::google::protobuf::internal::ArenaStringPtr type_url_; ::google::protobuf::internal::ArenaStringPtr value_; mutable int _cached_size_; ::google::protobuf::internal::AnyMetadata _any_metadata_; friend struct ::protobuf_google_2fprotobuf_2fany_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fany_2eproto::InitDefaultsAnyImpl(); }; // =================================================================== // =================================================================== #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif // __GNUC__ // Any // string type_url = 1; inline void Any::clear_type_url() { type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline const ::std::string& Any::type_url() const { // @@protoc_insertion_point(field_get:google.protobuf.Any.type_url) return type_url_.GetNoArena(); } inline void Any::set_type_url(const ::std::string& value) { type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.Any.type_url) } #if LANG_CXX11 inline void Any::set_type_url(::std::string&& value) { type_url_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Any.type_url) } #endif inline void Any::set_type_url(const char* value) { GOOGLE_DCHECK(value != NULL); type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.Any.type_url) } inline void Any::set_type_url(const char* value, size_t size) { type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.Any.type_url) } inline ::std::string* Any::mutable_type_url() { // @@protoc_insertion_point(field_mutable:google.protobuf.Any.type_url) return type_url_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* Any::release_type_url() { // @@protoc_insertion_point(field_release:google.protobuf.Any.type_url) return type_url_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void Any::set_allocated_type_url(::std::string* type_url) { if (type_url != NULL) { } else { } type_url_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), type_url); // @@protoc_insertion_point(field_set_allocated:google.protobuf.Any.type_url) } // bytes value = 2; inline void Any::clear_value() { value_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline const ::std::string& Any::value() const { // @@protoc_insertion_point(field_get:google.protobuf.Any.value) return value_.GetNoArena(); } inline void Any::set_value(const ::std::string& value) { value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.Any.value) } #if LANG_CXX11 inline void Any::set_value(::std::string&& value) { value_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Any.value) } #endif inline void Any::set_value(const char* value) { GOOGLE_DCHECK(value != NULL); value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.Any.value) } inline void Any::set_value(const void* value, size_t size) { value_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.Any.value) } inline ::std::string* Any::mutable_value() { // @@protoc_insertion_point(field_mutable:google.protobuf.Any.value) return value_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* Any::release_value() { // @@protoc_insertion_point(field_release:google.protobuf.Any.value) return value_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void Any::set_allocated_value(::std::string* value) { if (value != NULL) { } else { } value_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set_allocated:google.protobuf.Any.value) } #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) #endif // PROTOBUF_google_2fprotobuf_2fany_2eproto__INCLUDED python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/any.proto000066400000000000000000000125531334102242000271530ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option go_package = "github.com/golang/protobuf/ptypes/any"; option java_package = "com.google.protobuf"; option java_outer_classname = "AnyProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // `Any` contains an arbitrary serialized protocol buffer message along with a // URL that describes the type of the serialized message. // // Protobuf library provides support to pack/unpack Any values in the form // of utility functions or additional generated methods of the Any type. // // Example 1: Pack and unpack a message in C++. // // Foo foo = ...; // Any any; // any.PackFrom(foo); // ... // if (any.UnpackTo(&foo)) { // ... // } // // Example 2: Pack and unpack a message in Java. // // Foo foo = ...; // Any any = Any.pack(foo); // ... // if (any.is(Foo.class)) { // foo = any.unpack(Foo.class); // } // // Example 3: Pack and unpack a message in Python. // // foo = Foo(...) // any = Any() // any.Pack(foo) // ... // if any.Is(Foo.DESCRIPTOR): // any.Unpack(foo) // ... // // Example 4: Pack and unpack a message in Go // // foo := &pb.Foo{...} // any, err := ptypes.MarshalAny(foo) // ... // foo := &pb.Foo{} // if err := ptypes.UnmarshalAny(any, foo); err != nil { // ... // } // // The pack methods provided by protobuf library will by default use // 'type.googleapis.com/full.type.name' as the type URL and the unpack // methods only use the fully qualified type name after the last '/' // in the type URL, for example "foo.bar.com/x/y.z" will yield type // name "y.z". // // // JSON // ==== // The JSON representation of an `Any` value uses the regular // representation of the deserialized, embedded message, with an // additional field `@type` which contains the type URL. Example: // // package google.profile; // message Person { // string first_name = 1; // string last_name = 2; // } // // { // "@type": "type.googleapis.com/google.profile.Person", // "firstName": , // "lastName": // } // // If the embedded message type is well-known and has a custom JSON // representation, that representation will be embedded adding a field // `value` which holds the custom JSON in addition to the `@type` // field. Example (for message [google.protobuf.Duration][]): // // { // "@type": "type.googleapis.com/google.protobuf.Duration", // "value": "1.212s" // } // message Any { // A URL/resource name whose content describes the type of the // serialized protocol buffer message. // // For URLs which use the scheme `http`, `https`, or no scheme, the // following restrictions and interpretations apply: // // * If no scheme is provided, `https` is assumed. // * The last segment of the URL's path must represent the fully // qualified name of the type (as in `path/google.protobuf.Duration`). // The name should be in a canonical form (e.g., leading "." is // not accepted). // * An HTTP GET on the URL must yield a [google.protobuf.Type][] // value in binary format, or produce an error. // * Applications are allowed to cache lookup results based on the // URL, or have them precompiled into a binary to avoid any // lookup. Therefore, binary compatibility needs to be preserved // on changes to types. (Use versioned type names to manage // breaking changes.) // // Schemes other than `http`, `https` (or the empty scheme) might be // used with implementation specific semantics. // string type_url = 1; // Must be a valid serialized protocol buffer of the above specified type. bytes value = 2; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/any_test.cc000066400000000000000000000066451334102242000274410ustar00rootroot00000000000000// 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 #include namespace google { namespace protobuf { namespace { TEST(AnyTest, TestPackAndUnpack) { protobuf_unittest::TestAny submessage; submessage.set_int32_value(12345); protobuf_unittest::TestAny message; message.mutable_any_value()->PackFrom(submessage); string data = message.SerializeAsString(); ASSERT_TRUE(message.ParseFromString(data)); EXPECT_TRUE(message.has_any_value()); ASSERT_TRUE(message.any_value().UnpackTo(&submessage)); EXPECT_EQ(12345, submessage.int32_value()); } TEST(AnyTest, TestPackAndUnpackAny) { // We can pack a Any message inside another Any message. protobuf_unittest::TestAny submessage; submessage.set_int32_value(12345); google::protobuf::Any any; any.PackFrom(submessage); protobuf_unittest::TestAny message; message.mutable_any_value()->PackFrom(any); string data = message.SerializeAsString(); ASSERT_TRUE(message.ParseFromString(data)); EXPECT_TRUE(message.has_any_value()); ASSERT_TRUE(message.any_value().UnpackTo(&any)); ASSERT_TRUE(any.UnpackTo(&submessage)); EXPECT_EQ(12345, submessage.int32_value()); } TEST(AnyTest, TestIs) { protobuf_unittest::TestAny submessage; submessage.set_int32_value(12345); google::protobuf::Any any; any.PackFrom(submessage); ASSERT_TRUE(any.ParseFromString(any.SerializeAsString())); EXPECT_TRUE(any.Is()); EXPECT_FALSE(any.Is()); protobuf_unittest::TestAny message; message.mutable_any_value()->PackFrom(any); ASSERT_TRUE(message.ParseFromString(message.SerializeAsString())); EXPECT_FALSE(message.any_value().Is()); EXPECT_TRUE(message.any_value().Is()); } } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/any_test.proto000066400000000000000000000035321334102242000302070ustar00rootroot00000000000000// 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 protobuf_unittest; import "google/protobuf/any.proto"; message TestAny { int32 int32_value = 1; google.protobuf.Any any_value = 2; repeated google.protobuf.Any repeated_any_value = 3; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/api.pb.cc000066400000000000000000001675341334102242000267710ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/api.proto #include #include #include #include #include #include #include #include #include #include #include // This is a temporary google only hack #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS #include "third_party/protobuf/version.h" #endif // @@protoc_insertion_point(includes) namespace google { namespace protobuf { class ApiDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Api_default_instance_; class MethodDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Method_default_instance_; class MixinDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Mixin_default_instance_; } // namespace protobuf } // namespace google namespace protobuf_google_2fprotobuf_2fapi_2eproto { void InitDefaultsApiImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMethod(); protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOption(); protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaultsSourceContext(); protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMixin(); { void* ptr = &::google::protobuf::_Api_default_instance_; new (ptr) ::google::protobuf::Api(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::Api::InitAsDefaultInstance(); } void InitDefaultsApi() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsApiImpl); } void InitDefaultsMethodImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2ftype_2eproto::InitDefaultsOption(); { void* ptr = &::google::protobuf::_Method_default_instance_; new (ptr) ::google::protobuf::Method(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::Method::InitAsDefaultInstance(); } void InitDefaultsMethod() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsMethodImpl); } void InitDefaultsMixinImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_Mixin_default_instance_; new (ptr) ::google::protobuf::Mixin(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::Mixin::InitAsDefaultInstance(); } void InitDefaultsMixin() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsMixinImpl); } ::google::protobuf::Metadata file_level_metadata[3]; const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, methods_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, options_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, version_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, source_context_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, mixins_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Api, syntax_), ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, request_type_url_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, request_streaming_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, response_type_url_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, response_streaming_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, options_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Method, syntax_), ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Mixin, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Mixin, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Mixin, root_), }; static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { { 0, -1, sizeof(::google::protobuf::Api)}, { 12, -1, sizeof(::google::protobuf::Method)}, { 24, -1, sizeof(::google::protobuf::Mixin)}, }; static ::google::protobuf::Message const * const file_default_instances[] = { reinterpret_cast(&::google::protobuf::_Api_default_instance_), reinterpret_cast(&::google::protobuf::_Method_default_instance_), reinterpret_cast(&::google::protobuf::_Mixin_default_instance_), }; void protobuf_AssignDescriptors() { AddDescriptors(); ::google::protobuf::MessageFactory* factory = NULL; AssignDescriptors( "google/protobuf/api.proto", schemas, file_default_instances, TableStruct::offsets, factory, file_level_metadata, NULL, NULL); } void protobuf_AssignDescriptorsOnce() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors); } void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD; void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 3); } void AddDescriptorsImpl() { InitDefaults(); static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_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(\tBu\n\023com.google.pr" "otobufB\010ApiProtoP\001Z+google.golang.org/ge" "nproto/protobuf/api;api\242\002\003GPB\252\002\036Google.P" "rotobuf.WellKnownTypesb\006proto3" }; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( descriptor, 750); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "google/protobuf/api.proto", &protobuf_RegisterTypes); ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::AddDescriptors(); ::protobuf_google_2fprotobuf_2ftype_2eproto::AddDescriptors(); } void AddDescriptors() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl); } // Force AddDescriptors() to be called at dynamic initialization time. struct StaticDescriptorInitializer { StaticDescriptorInitializer() { AddDescriptors(); } } static_descriptor_initializer; } // namespace protobuf_google_2fprotobuf_2fapi_2eproto namespace google { namespace protobuf { // =================================================================== void Api::InitAsDefaultInstance() { ::google::protobuf::_Api_default_instance_._instance.get_mutable()->source_context_ = const_cast< ::google::protobuf::SourceContext*>( ::google::protobuf::SourceContext::internal_default_instance()); } void Api::clear_options() { options_.Clear(); } void Api::clear_source_context() { if (GetArenaNoVirtual() == NULL && source_context_ != NULL) { delete source_context_; } source_context_ = NULL; } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int Api::kNameFieldNumber; const int Api::kMethodsFieldNumber; const int Api::kOptionsFieldNumber; const int Api::kVersionFieldNumber; const int Api::kSourceContextFieldNumber; const int Api::kMixinsFieldNumber; const int Api::kSyntaxFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Api::Api() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsApi(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.Api) } Api::Api(const Api& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), methods_(from.methods_), options_(from.options_), mixins_(from.mixins_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.name().size() > 0) { name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_); } version_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.version().size() > 0) { version_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.version_); } if (from.has_source_context()) { source_context_ = new ::google::protobuf::SourceContext(*from.source_context_); } else { source_context_ = NULL; } syntax_ = from.syntax_; // @@protoc_insertion_point(copy_constructor:google.protobuf.Api) } void Api::SharedCtor() { name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); version_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(&source_context_, 0, static_cast( reinterpret_cast(&syntax_) - reinterpret_cast(&source_context_)) + sizeof(syntax_)); _cached_size_ = 0; } Api::~Api() { // @@protoc_insertion_point(destructor:google.protobuf.Api) SharedDtor(); } void Api::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); version_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (this != internal_default_instance()) delete source_context_; } void Api::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* Api::descriptor() { ::protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const Api& Api::default_instance() { ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsApi(); return *internal_default_instance(); } Api* Api::New(::google::protobuf::Arena* arena) const { Api* n = new Api; if (arena != NULL) { arena->Own(n); } return n; } void Api::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.Api) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; methods_.Clear(); options_.Clear(); mixins_.Clear(); name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); version_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (GetArenaNoVirtual() == NULL && source_context_ != NULL) { delete source_context_; } source_context_ = NULL; syntax_ = 0; _internal_metadata_.Clear(); } bool Api::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.Api) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.Api.name")); } else { goto handle_unusual; } break; } // repeated .google.protobuf.Method methods = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_methods())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.Option options = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_options())); } else { goto handle_unusual; } break; } // string version = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_version())); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->version().data(), static_cast(this->version().length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.Api.version")); } else { goto handle_unusual; } break; } // .google.protobuf.SourceContext source_context = 5; case 5: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_source_context())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.Mixin mixins = 6; case 6: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_mixins())); } else { goto handle_unusual; } break; } // .google.protobuf.Syntax syntax = 7; case 7: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(56u /* 56 & 0xFF */)) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); set_syntax(static_cast< ::google::protobuf::Syntax >(value)); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.Api) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.Api) return false; #undef DO_ } void Api::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.Api) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // string name = 1; if (this->name().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Api.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // repeated .google.protobuf.Method methods = 2; for (unsigned int i = 0, n = static_cast(this->methods_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 2, this->methods(static_cast(i)), output); } // repeated .google.protobuf.Option options = 3; for (unsigned int i = 0, n = static_cast(this->options_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 3, this->options(static_cast(i)), output); } // string version = 4; if (this->version().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->version().data(), static_cast(this->version().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Api.version"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 4, this->version(), output); } // .google.protobuf.SourceContext source_context = 5; if (this->has_source_context()) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 5, *this->source_context_, output); } // repeated .google.protobuf.Mixin mixins = 6; for (unsigned int i = 0, n = static_cast(this->mixins_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 6, this->mixins(static_cast(i)), output); } // .google.protobuf.Syntax syntax = 7; if (this->syntax() != 0) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 7, this->syntax(), output); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.Api) } ::google::protobuf::uint8* Api::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Api) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // string name = 1; if (this->name().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Api.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // repeated .google.protobuf.Method methods = 2; for (unsigned int i = 0, n = static_cast(this->methods_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 2, this->methods(static_cast(i)), deterministic, target); } // repeated .google.protobuf.Option options = 3; for (unsigned int i = 0, n = static_cast(this->options_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 3, this->options(static_cast(i)), deterministic, target); } // string version = 4; if (this->version().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->version().data(), static_cast(this->version().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Api.version"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 4, this->version(), target); } // .google.protobuf.SourceContext source_context = 5; if (this->has_source_context()) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 5, *this->source_context_, deterministic, target); } // repeated .google.protobuf.Mixin mixins = 6; for (unsigned int i = 0, n = static_cast(this->mixins_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 6, this->mixins(static_cast(i)), deterministic, target); } // .google.protobuf.Syntax syntax = 7; if (this->syntax() != 0) { target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( 7, this->syntax(), target); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Api) return target; } size_t Api::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Api) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } // repeated .google.protobuf.Method methods = 2; { unsigned int count = static_cast(this->methods_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->methods(static_cast(i))); } } // repeated .google.protobuf.Option options = 3; { unsigned int count = static_cast(this->options_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->options(static_cast(i))); } } // repeated .google.protobuf.Mixin mixins = 6; { unsigned int count = static_cast(this->mixins_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->mixins(static_cast(i))); } } // string name = 1; if (this->name().size() > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // string version = 4; if (this->version().size() > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->version()); } // .google.protobuf.SourceContext source_context = 5; if (this->has_source_context()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->source_context_); } // .google.protobuf.Syntax syntax = 7; if (this->syntax() != 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->syntax()); } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void Api::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Api) GOOGLE_DCHECK_NE(&from, this); const Api* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.Api) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.Api) MergeFrom(*source); } } void Api::MergeFrom(const Api& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Api) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; methods_.MergeFrom(from.methods_); options_.MergeFrom(from.options_); mixins_.MergeFrom(from.mixins_); if (from.name().size() > 0) { name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_); } if (from.version().size() > 0) { version_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.version_); } if (from.has_source_context()) { mutable_source_context()->::google::protobuf::SourceContext::MergeFrom(from.source_context()); } if (from.syntax() != 0) { set_syntax(from.syntax()); } } void Api::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.Api) if (&from == this) return; Clear(); MergeFrom(from); } void Api::CopyFrom(const Api& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Api) if (&from == this) return; Clear(); MergeFrom(from); } bool Api::IsInitialized() const { return true; } void Api::Swap(Api* other) { if (other == this) return; InternalSwap(other); } void Api::InternalSwap(Api* other) { using std::swap; methods_.InternalSwap(&other->methods_); options_.InternalSwap(&other->options_); mixins_.InternalSwap(&other->mixins_); name_.Swap(&other->name_); version_.Swap(&other->version_); swap(source_context_, other->source_context_); swap(syntax_, other->syntax_); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata Api::GetMetadata() const { protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void Method::InitAsDefaultInstance() { } void Method::clear_options() { options_.Clear(); } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int Method::kNameFieldNumber; const int Method::kRequestTypeUrlFieldNumber; const int Method::kRequestStreamingFieldNumber; const int Method::kResponseTypeUrlFieldNumber; const int Method::kResponseStreamingFieldNumber; const int Method::kOptionsFieldNumber; const int Method::kSyntaxFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Method::Method() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMethod(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.Method) } Method::Method(const Method& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), options_(from.options_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.name().size() > 0) { name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_); } request_type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.request_type_url().size() > 0) { request_type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.request_type_url_); } response_type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.response_type_url().size() > 0) { response_type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.response_type_url_); } ::memcpy(&request_streaming_, &from.request_streaming_, static_cast(reinterpret_cast(&syntax_) - reinterpret_cast(&request_streaming_)) + sizeof(syntax_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.Method) } void Method::SharedCtor() { name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); request_type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); response_type_url_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(&request_streaming_, 0, static_cast( reinterpret_cast(&syntax_) - reinterpret_cast(&request_streaming_)) + sizeof(syntax_)); _cached_size_ = 0; } Method::~Method() { // @@protoc_insertion_point(destructor:google.protobuf.Method) SharedDtor(); } void Method::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); request_type_url_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); response_type_url_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void Method::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* Method::descriptor() { ::protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const Method& Method::default_instance() { ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMethod(); return *internal_default_instance(); } Method* Method::New(::google::protobuf::Arena* arena) const { Method* n = new Method; if (arena != NULL) { arena->Own(n); } return n; } void Method::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.Method) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; options_.Clear(); name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); request_type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); response_type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(&request_streaming_, 0, static_cast( reinterpret_cast(&syntax_) - reinterpret_cast(&request_streaming_)) + sizeof(syntax_)); _internal_metadata_.Clear(); } bool Method::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.Method) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.Method.name")); } else { goto handle_unusual; } break; } // string request_type_url = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_request_type_url())); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->request_type_url().data(), static_cast(this->request_type_url().length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.Method.request_type_url")); } else { goto handle_unusual; } break; } // bool request_streaming = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &request_streaming_))); } else { goto handle_unusual; } break; } // string response_type_url = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_response_type_url())); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->response_type_url().data(), static_cast(this->response_type_url().length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.Method.response_type_url")); } else { goto handle_unusual; } break; } // bool response_streaming = 5; case 5: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(40u /* 40 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &response_streaming_))); } else { goto handle_unusual; } break; } // repeated .google.protobuf.Option options = 6; case 6: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_options())); } else { goto handle_unusual; } break; } // .google.protobuf.Syntax syntax = 7; case 7: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(56u /* 56 & 0xFF */)) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); set_syntax(static_cast< ::google::protobuf::Syntax >(value)); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.Method) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.Method) return false; #undef DO_ } void Method::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.Method) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // string name = 1; if (this->name().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Method.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // string request_type_url = 2; if (this->request_type_url().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->request_type_url().data(), static_cast(this->request_type_url().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Method.request_type_url"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 2, this->request_type_url(), output); } // bool request_streaming = 3; if (this->request_streaming() != 0) { ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->request_streaming(), output); } // string response_type_url = 4; if (this->response_type_url().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->response_type_url().data(), static_cast(this->response_type_url().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Method.response_type_url"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 4, this->response_type_url(), output); } // bool response_streaming = 5; if (this->response_streaming() != 0) { ::google::protobuf::internal::WireFormatLite::WriteBool(5, this->response_streaming(), output); } // repeated .google.protobuf.Option options = 6; for (unsigned int i = 0, n = static_cast(this->options_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 6, this->options(static_cast(i)), output); } // .google.protobuf.Syntax syntax = 7; if (this->syntax() != 0) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 7, this->syntax(), output); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.Method) } ::google::protobuf::uint8* Method::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Method) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // string name = 1; if (this->name().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Method.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // string request_type_url = 2; if (this->request_type_url().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->request_type_url().data(), static_cast(this->request_type_url().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Method.request_type_url"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 2, this->request_type_url(), target); } // bool request_streaming = 3; if (this->request_streaming() != 0) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->request_streaming(), target); } // string response_type_url = 4; if (this->response_type_url().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->response_type_url().data(), static_cast(this->response_type_url().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Method.response_type_url"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 4, this->response_type_url(), target); } // bool response_streaming = 5; if (this->response_streaming() != 0) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(5, this->response_streaming(), target); } // repeated .google.protobuf.Option options = 6; for (unsigned int i = 0, n = static_cast(this->options_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 6, this->options(static_cast(i)), deterministic, target); } // .google.protobuf.Syntax syntax = 7; if (this->syntax() != 0) { target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( 7, this->syntax(), target); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Method) return target; } size_t Method::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Method) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } // repeated .google.protobuf.Option options = 6; { unsigned int count = static_cast(this->options_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->options(static_cast(i))); } } // string name = 1; if (this->name().size() > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // string request_type_url = 2; if (this->request_type_url().size() > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->request_type_url()); } // string response_type_url = 4; if (this->response_type_url().size() > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->response_type_url()); } // bool request_streaming = 3; if (this->request_streaming() != 0) { total_size += 1 + 1; } // bool response_streaming = 5; if (this->response_streaming() != 0) { total_size += 1 + 1; } // .google.protobuf.Syntax syntax = 7; if (this->syntax() != 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->syntax()); } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void Method::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Method) GOOGLE_DCHECK_NE(&from, this); const Method* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.Method) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.Method) MergeFrom(*source); } } void Method::MergeFrom(const Method& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Method) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; options_.MergeFrom(from.options_); if (from.name().size() > 0) { name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_); } if (from.request_type_url().size() > 0) { request_type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.request_type_url_); } if (from.response_type_url().size() > 0) { response_type_url_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.response_type_url_); } if (from.request_streaming() != 0) { set_request_streaming(from.request_streaming()); } if (from.response_streaming() != 0) { set_response_streaming(from.response_streaming()); } if (from.syntax() != 0) { set_syntax(from.syntax()); } } void Method::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.Method) if (&from == this) return; Clear(); MergeFrom(from); } void Method::CopyFrom(const Method& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Method) if (&from == this) return; Clear(); MergeFrom(from); } bool Method::IsInitialized() const { return true; } void Method::Swap(Method* other) { if (other == this) return; InternalSwap(other); } void Method::InternalSwap(Method* other) { using std::swap; options_.InternalSwap(&other->options_); name_.Swap(&other->name_); request_type_url_.Swap(&other->request_type_url_); response_type_url_.Swap(&other->response_type_url_); swap(request_streaming_, other->request_streaming_); swap(response_streaming_, other->response_streaming_); swap(syntax_, other->syntax_); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata Method::GetMetadata() const { protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void Mixin::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int Mixin::kNameFieldNumber; const int Mixin::kRootFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Mixin::Mixin() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMixin(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.Mixin) } Mixin::Mixin(const Mixin& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.name().size() > 0) { name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_); } root_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.root().size() > 0) { root_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.root_); } // @@protoc_insertion_point(copy_constructor:google.protobuf.Mixin) } void Mixin::SharedCtor() { name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); root_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); _cached_size_ = 0; } Mixin::~Mixin() { // @@protoc_insertion_point(destructor:google.protobuf.Mixin) SharedDtor(); } void Mixin::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); root_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void Mixin::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* Mixin::descriptor() { ::protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const Mixin& Mixin::default_instance() { ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMixin(); return *internal_default_instance(); } Mixin* Mixin::New(::google::protobuf::Arena* arena) const { Mixin* n = new Mixin; if (arena != NULL) { arena->Own(n); } return n; } void Mixin::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.Mixin) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); root_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); _internal_metadata_.Clear(); } bool Mixin::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.Mixin) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.Mixin.name")); } else { goto handle_unusual; } break; } // string root = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_root())); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->root().data(), static_cast(this->root().length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.Mixin.root")); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.Mixin) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.Mixin) return false; #undef DO_ } void Mixin::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.Mixin) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // string name = 1; if (this->name().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Mixin.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // string root = 2; if (this->root().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->root().data(), static_cast(this->root().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Mixin.root"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 2, this->root(), output); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.Mixin) } ::google::protobuf::uint8* Mixin::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Mixin) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // string name = 1; if (this->name().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Mixin.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // string root = 2; if (this->root().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->root().data(), static_cast(this->root().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Mixin.root"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 2, this->root(), target); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Mixin) return target; } size_t Mixin::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Mixin) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } // string name = 1; if (this->name().size() > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // string root = 2; if (this->root().size() > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->root()); } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void Mixin::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Mixin) GOOGLE_DCHECK_NE(&from, this); const Mixin* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.Mixin) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.Mixin) MergeFrom(*source); } } void Mixin::MergeFrom(const Mixin& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Mixin) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; if (from.name().size() > 0) { name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_); } if (from.root().size() > 0) { root_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.root_); } } void Mixin::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.Mixin) if (&from == this) return; Clear(); MergeFrom(from); } void Mixin::CopyFrom(const Mixin& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Mixin) if (&from == this) return; Clear(); MergeFrom(from); } bool Mixin::IsInitialized() const { return true; } void Mixin::Swap(Mixin* other) { if (other == this) return; InternalSwap(other); } void Mixin::InternalSwap(Mixin* other) { using std::swap; name_.Swap(&other->name_); root_.Swap(&other->root_); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata Mixin::GetMetadata() const { protobuf_google_2fprotobuf_2fapi_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fapi_2eproto::file_level_metadata[kIndexInFileMessages]; } // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/api.pb.h000066400000000000000000001243551334102242000266250ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/api.proto #ifndef PROTOBUF_google_2fprotobuf_2fapi_2eproto__INCLUDED #define PROTOBUF_google_2fprotobuf_2fapi_2eproto__INCLUDED #include #include #if GOOGLE_PROTOBUF_VERSION < 3005000 #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 3005001 < GOOGLE_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 #include #include #include #include #include #include #include #include // IWYU pragma: export #include // IWYU pragma: export #include #include #include // @@protoc_insertion_point(includes) namespace protobuf_google_2fprotobuf_2fapi_2eproto { // Internal implementation detail -- do not use these members. struct LIBPROTOBUF_EXPORT TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; static const ::google::protobuf::internal::ParseTable schema[3]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; }; void LIBPROTOBUF_EXPORT AddDescriptors(); void LIBPROTOBUF_EXPORT InitDefaultsApiImpl(); void LIBPROTOBUF_EXPORT InitDefaultsApi(); void LIBPROTOBUF_EXPORT InitDefaultsMethodImpl(); void LIBPROTOBUF_EXPORT InitDefaultsMethod(); void LIBPROTOBUF_EXPORT InitDefaultsMixinImpl(); void LIBPROTOBUF_EXPORT InitDefaultsMixin(); inline void LIBPROTOBUF_EXPORT InitDefaults() { InitDefaultsApi(); InitDefaultsMethod(); InitDefaultsMixin(); } } // namespace protobuf_google_2fprotobuf_2fapi_2eproto namespace google { namespace protobuf { class Api; class ApiDefaultTypeInternal; LIBPROTOBUF_EXPORT extern ApiDefaultTypeInternal _Api_default_instance_; class Method; class MethodDefaultTypeInternal; LIBPROTOBUF_EXPORT extern MethodDefaultTypeInternal _Method_default_instance_; class Mixin; class MixinDefaultTypeInternal; LIBPROTOBUF_EXPORT extern MixinDefaultTypeInternal _Mixin_default_instance_; } // namespace protobuf } // namespace google namespace google { namespace protobuf { // =================================================================== class LIBPROTOBUF_EXPORT Api : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Api) */ { public: Api(); virtual ~Api(); Api(const Api& from); inline Api& operator=(const Api& from) { CopyFrom(from); return *this; } #if LANG_CXX11 Api(Api&& from) noexcept : Api() { *this = ::std::move(from); } inline Api& operator=(Api&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif static const ::google::protobuf::Descriptor* descriptor(); static const Api& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const Api* internal_default_instance() { return reinterpret_cast( &_Api_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 0; void Swap(Api* other); friend void swap(Api& a, Api& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline Api* New() const PROTOBUF_FINAL { return New(NULL); } Api* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const Api& from); void MergeFrom(const Api& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(Api* other); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return NULL; } inline void* MaybeArenaPtr() const { return NULL; } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated .google.protobuf.Method methods = 2; int methods_size() const; void clear_methods(); static const int kMethodsFieldNumber = 2; const ::google::protobuf::Method& methods(int index) const; ::google::protobuf::Method* mutable_methods(int index); ::google::protobuf::Method* add_methods(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::Method >* mutable_methods(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Method >& methods() const; // repeated .google.protobuf.Option options = 3; int options_size() const; void clear_options(); static const int kOptionsFieldNumber = 3; const ::google::protobuf::Option& options(int index) const; ::google::protobuf::Option* mutable_options(int index); ::google::protobuf::Option* add_options(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >* mutable_options(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >& options() const; // repeated .google.protobuf.Mixin mixins = 6; int mixins_size() const; void clear_mixins(); static const int kMixinsFieldNumber = 6; const ::google::protobuf::Mixin& mixins(int index) const; ::google::protobuf::Mixin* mutable_mixins(int index); ::google::protobuf::Mixin* add_mixins(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::Mixin >* mutable_mixins(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Mixin >& mixins() const; // string name = 1; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); // string version = 4; void clear_version(); static const int kVersionFieldNumber = 4; const ::std::string& version() const; void set_version(const ::std::string& value); #if LANG_CXX11 void set_version(::std::string&& value); #endif void set_version(const char* value); void set_version(const char* value, size_t size); ::std::string* mutable_version(); ::std::string* release_version(); void set_allocated_version(::std::string* version); // .google.protobuf.SourceContext source_context = 5; bool has_source_context() const; void clear_source_context(); static const int kSourceContextFieldNumber = 5; const ::google::protobuf::SourceContext& source_context() const; ::google::protobuf::SourceContext* release_source_context(); ::google::protobuf::SourceContext* mutable_source_context(); void set_allocated_source_context(::google::protobuf::SourceContext* source_context); // .google.protobuf.Syntax syntax = 7; void clear_syntax(); static const int kSyntaxFieldNumber = 7; ::google::protobuf::Syntax syntax() const; void set_syntax(::google::protobuf::Syntax value); // @@protoc_insertion_point(class_scope:google.protobuf.Api) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::Method > methods_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option > options_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::Mixin > mixins_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::internal::ArenaStringPtr version_; ::google::protobuf::SourceContext* source_context_; int syntax_; mutable int _cached_size_; friend struct ::protobuf_google_2fprotobuf_2fapi_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsApiImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT Method : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Method) */ { public: Method(); virtual ~Method(); Method(const Method& from); inline Method& operator=(const Method& from) { CopyFrom(from); return *this; } #if LANG_CXX11 Method(Method&& from) noexcept : Method() { *this = ::std::move(from); } inline Method& operator=(Method&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif static const ::google::protobuf::Descriptor* descriptor(); static const Method& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const Method* internal_default_instance() { return reinterpret_cast( &_Method_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 1; void Swap(Method* other); friend void swap(Method& a, Method& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline Method* New() const PROTOBUF_FINAL { return New(NULL); } Method* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const Method& from); void MergeFrom(const Method& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(Method* other); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return NULL; } inline void* MaybeArenaPtr() const { return NULL; } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated .google.protobuf.Option options = 6; int options_size() const; void clear_options(); static const int kOptionsFieldNumber = 6; const ::google::protobuf::Option& options(int index) const; ::google::protobuf::Option* mutable_options(int index); ::google::protobuf::Option* add_options(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >* mutable_options(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >& options() const; // string name = 1; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); // string request_type_url = 2; void clear_request_type_url(); static const int kRequestTypeUrlFieldNumber = 2; const ::std::string& request_type_url() const; void set_request_type_url(const ::std::string& value); #if LANG_CXX11 void set_request_type_url(::std::string&& value); #endif void set_request_type_url(const char* value); void set_request_type_url(const char* value, size_t size); ::std::string* mutable_request_type_url(); ::std::string* release_request_type_url(); void set_allocated_request_type_url(::std::string* request_type_url); // string response_type_url = 4; void clear_response_type_url(); static const int kResponseTypeUrlFieldNumber = 4; const ::std::string& response_type_url() const; void set_response_type_url(const ::std::string& value); #if LANG_CXX11 void set_response_type_url(::std::string&& value); #endif void set_response_type_url(const char* value); void set_response_type_url(const char* value, size_t size); ::std::string* mutable_response_type_url(); ::std::string* release_response_type_url(); void set_allocated_response_type_url(::std::string* response_type_url); // bool request_streaming = 3; void clear_request_streaming(); static const int kRequestStreamingFieldNumber = 3; bool request_streaming() const; void set_request_streaming(bool value); // bool response_streaming = 5; void clear_response_streaming(); static const int kResponseStreamingFieldNumber = 5; bool response_streaming() const; void set_response_streaming(bool value); // .google.protobuf.Syntax syntax = 7; void clear_syntax(); static const int kSyntaxFieldNumber = 7; ::google::protobuf::Syntax syntax() const; void set_syntax(::google::protobuf::Syntax value); // @@protoc_insertion_point(class_scope:google.protobuf.Method) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option > options_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::internal::ArenaStringPtr request_type_url_; ::google::protobuf::internal::ArenaStringPtr response_type_url_; bool request_streaming_; bool response_streaming_; int syntax_; mutable int _cached_size_; friend struct ::protobuf_google_2fprotobuf_2fapi_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMethodImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT Mixin : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Mixin) */ { public: Mixin(); virtual ~Mixin(); Mixin(const Mixin& from); inline Mixin& operator=(const Mixin& from) { CopyFrom(from); return *this; } #if LANG_CXX11 Mixin(Mixin&& from) noexcept : Mixin() { *this = ::std::move(from); } inline Mixin& operator=(Mixin&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif static const ::google::protobuf::Descriptor* descriptor(); static const Mixin& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const Mixin* internal_default_instance() { return reinterpret_cast( &_Mixin_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 2; void Swap(Mixin* other); friend void swap(Mixin& a, Mixin& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline Mixin* New() const PROTOBUF_FINAL { return New(NULL); } Mixin* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const Mixin& from); void MergeFrom(const Mixin& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(Mixin* other); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return NULL; } inline void* MaybeArenaPtr() const { return NULL; } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // string name = 1; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); // string root = 2; void clear_root(); static const int kRootFieldNumber = 2; const ::std::string& root() const; void set_root(const ::std::string& value); #if LANG_CXX11 void set_root(::std::string&& value); #endif void set_root(const char* value); void set_root(const char* value, size_t size); ::std::string* mutable_root(); ::std::string* release_root(); void set_allocated_root(::std::string* root); // @@protoc_insertion_point(class_scope:google.protobuf.Mixin) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::internal::ArenaStringPtr root_; mutable int _cached_size_; friend struct ::protobuf_google_2fprotobuf_2fapi_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fapi_2eproto::InitDefaultsMixinImpl(); }; // =================================================================== // =================================================================== #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif // __GNUC__ // Api // string name = 1; inline void Api::clear_name() { name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline const ::std::string& Api::name() const { // @@protoc_insertion_point(field_get:google.protobuf.Api.name) return name_.GetNoArena(); } inline void Api::set_name(const ::std::string& value) { name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.Api.name) } #if LANG_CXX11 inline void Api::set_name(::std::string&& value) { name_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Api.name) } #endif inline void Api::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.Api.name) } inline void Api::set_name(const char* value, size_t size) { name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.Api.name) } inline ::std::string* Api::mutable_name() { // @@protoc_insertion_point(field_mutable:google.protobuf.Api.name) return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* Api::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.Api.name) return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void Api::set_allocated_name(::std::string* name) { if (name != NULL) { } else { } name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name); // @@protoc_insertion_point(field_set_allocated:google.protobuf.Api.name) } // repeated .google.protobuf.Method methods = 2; inline int Api::methods_size() const { return methods_.size(); } inline void Api::clear_methods() { methods_.Clear(); } inline const ::google::protobuf::Method& Api::methods(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.Api.methods) return methods_.Get(index); } inline ::google::protobuf::Method* Api::mutable_methods(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.Api.methods) return methods_.Mutable(index); } inline ::google::protobuf::Method* Api::add_methods() { // @@protoc_insertion_point(field_add:google.protobuf.Api.methods) return methods_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::Method >* Api::mutable_methods() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.Api.methods) return &methods_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Method >& Api::methods() const { // @@protoc_insertion_point(field_list:google.protobuf.Api.methods) return methods_; } // repeated .google.protobuf.Option options = 3; inline int Api::options_size() const { return options_.size(); } inline const ::google::protobuf::Option& Api::options(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.Api.options) return options_.Get(index); } inline ::google::protobuf::Option* Api::mutable_options(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.Api.options) return options_.Mutable(index); } inline ::google::protobuf::Option* Api::add_options() { // @@protoc_insertion_point(field_add:google.protobuf.Api.options) return options_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >* Api::mutable_options() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.Api.options) return &options_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >& Api::options() const { // @@protoc_insertion_point(field_list:google.protobuf.Api.options) return options_; } // string version = 4; inline void Api::clear_version() { version_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline const ::std::string& Api::version() const { // @@protoc_insertion_point(field_get:google.protobuf.Api.version) return version_.GetNoArena(); } inline void Api::set_version(const ::std::string& value) { version_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.Api.version) } #if LANG_CXX11 inline void Api::set_version(::std::string&& value) { version_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Api.version) } #endif inline void Api::set_version(const char* value) { GOOGLE_DCHECK(value != NULL); version_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.Api.version) } inline void Api::set_version(const char* value, size_t size) { version_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.Api.version) } inline ::std::string* Api::mutable_version() { // @@protoc_insertion_point(field_mutable:google.protobuf.Api.version) return version_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* Api::release_version() { // @@protoc_insertion_point(field_release:google.protobuf.Api.version) return version_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void Api::set_allocated_version(::std::string* version) { if (version != NULL) { } else { } version_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), version); // @@protoc_insertion_point(field_set_allocated:google.protobuf.Api.version) } // .google.protobuf.SourceContext source_context = 5; inline bool Api::has_source_context() const { return this != internal_default_instance() && source_context_ != NULL; } inline const ::google::protobuf::SourceContext& Api::source_context() const { const ::google::protobuf::SourceContext* p = source_context_; // @@protoc_insertion_point(field_get:google.protobuf.Api.source_context) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::_SourceContext_default_instance_); } inline ::google::protobuf::SourceContext* Api::release_source_context() { // @@protoc_insertion_point(field_release:google.protobuf.Api.source_context) ::google::protobuf::SourceContext* temp = source_context_; source_context_ = NULL; return temp; } inline ::google::protobuf::SourceContext* Api::mutable_source_context() { if (source_context_ == NULL) { source_context_ = new ::google::protobuf::SourceContext; } // @@protoc_insertion_point(field_mutable:google.protobuf.Api.source_context) return source_context_; } inline void Api::set_allocated_source_context(::google::protobuf::SourceContext* source_context) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete reinterpret_cast< ::google::protobuf::MessageLite*>(source_context_); } if (source_context) { ::google::protobuf::Arena* submessage_arena = NULL; if (message_arena != submessage_arena) { source_context = ::google::protobuf::internal::GetOwnedMessage( message_arena, source_context, submessage_arena); } } else { } source_context_ = source_context; // @@protoc_insertion_point(field_set_allocated:google.protobuf.Api.source_context) } // repeated .google.protobuf.Mixin mixins = 6; inline int Api::mixins_size() const { return mixins_.size(); } inline void Api::clear_mixins() { mixins_.Clear(); } inline const ::google::protobuf::Mixin& Api::mixins(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.Api.mixins) return mixins_.Get(index); } inline ::google::protobuf::Mixin* Api::mutable_mixins(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.Api.mixins) return mixins_.Mutable(index); } inline ::google::protobuf::Mixin* Api::add_mixins() { // @@protoc_insertion_point(field_add:google.protobuf.Api.mixins) return mixins_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::Mixin >* Api::mutable_mixins() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.Api.mixins) return &mixins_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Mixin >& Api::mixins() const { // @@protoc_insertion_point(field_list:google.protobuf.Api.mixins) return mixins_; } // .google.protobuf.Syntax syntax = 7; inline void Api::clear_syntax() { syntax_ = 0; } inline ::google::protobuf::Syntax Api::syntax() const { // @@protoc_insertion_point(field_get:google.protobuf.Api.syntax) return static_cast< ::google::protobuf::Syntax >(syntax_); } inline void Api::set_syntax(::google::protobuf::Syntax value) { syntax_ = value; // @@protoc_insertion_point(field_set:google.protobuf.Api.syntax) } // ------------------------------------------------------------------- // Method // string name = 1; inline void Method::clear_name() { name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline const ::std::string& Method::name() const { // @@protoc_insertion_point(field_get:google.protobuf.Method.name) return name_.GetNoArena(); } inline void Method::set_name(const ::std::string& value) { name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.Method.name) } #if LANG_CXX11 inline void Method::set_name(::std::string&& value) { name_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Method.name) } #endif inline void Method::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.Method.name) } inline void Method::set_name(const char* value, size_t size) { name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.Method.name) } inline ::std::string* Method::mutable_name() { // @@protoc_insertion_point(field_mutable:google.protobuf.Method.name) return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* Method::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.Method.name) return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void Method::set_allocated_name(::std::string* name) { if (name != NULL) { } else { } name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name); // @@protoc_insertion_point(field_set_allocated:google.protobuf.Method.name) } // string request_type_url = 2; inline void Method::clear_request_type_url() { request_type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline const ::std::string& Method::request_type_url() const { // @@protoc_insertion_point(field_get:google.protobuf.Method.request_type_url) return request_type_url_.GetNoArena(); } inline void Method::set_request_type_url(const ::std::string& value) { request_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.Method.request_type_url) } #if LANG_CXX11 inline void Method::set_request_type_url(::std::string&& value) { request_type_url_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Method.request_type_url) } #endif inline void Method::set_request_type_url(const char* value) { GOOGLE_DCHECK(value != NULL); request_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.Method.request_type_url) } inline void Method::set_request_type_url(const char* value, size_t size) { request_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.Method.request_type_url) } inline ::std::string* Method::mutable_request_type_url() { // @@protoc_insertion_point(field_mutable:google.protobuf.Method.request_type_url) return request_type_url_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* Method::release_request_type_url() { // @@protoc_insertion_point(field_release:google.protobuf.Method.request_type_url) return request_type_url_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void Method::set_allocated_request_type_url(::std::string* request_type_url) { if (request_type_url != NULL) { } else { } request_type_url_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), request_type_url); // @@protoc_insertion_point(field_set_allocated:google.protobuf.Method.request_type_url) } // bool request_streaming = 3; inline void Method::clear_request_streaming() { request_streaming_ = false; } inline bool Method::request_streaming() const { // @@protoc_insertion_point(field_get:google.protobuf.Method.request_streaming) return request_streaming_; } inline void Method::set_request_streaming(bool value) { request_streaming_ = value; // @@protoc_insertion_point(field_set:google.protobuf.Method.request_streaming) } // string response_type_url = 4; inline void Method::clear_response_type_url() { response_type_url_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline const ::std::string& Method::response_type_url() const { // @@protoc_insertion_point(field_get:google.protobuf.Method.response_type_url) return response_type_url_.GetNoArena(); } inline void Method::set_response_type_url(const ::std::string& value) { response_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.Method.response_type_url) } #if LANG_CXX11 inline void Method::set_response_type_url(::std::string&& value) { response_type_url_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Method.response_type_url) } #endif inline void Method::set_response_type_url(const char* value) { GOOGLE_DCHECK(value != NULL); response_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.Method.response_type_url) } inline void Method::set_response_type_url(const char* value, size_t size) { response_type_url_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.Method.response_type_url) } inline ::std::string* Method::mutable_response_type_url() { // @@protoc_insertion_point(field_mutable:google.protobuf.Method.response_type_url) return response_type_url_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* Method::release_response_type_url() { // @@protoc_insertion_point(field_release:google.protobuf.Method.response_type_url) return response_type_url_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void Method::set_allocated_response_type_url(::std::string* response_type_url) { if (response_type_url != NULL) { } else { } response_type_url_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), response_type_url); // @@protoc_insertion_point(field_set_allocated:google.protobuf.Method.response_type_url) } // bool response_streaming = 5; inline void Method::clear_response_streaming() { response_streaming_ = false; } inline bool Method::response_streaming() const { // @@protoc_insertion_point(field_get:google.protobuf.Method.response_streaming) return response_streaming_; } inline void Method::set_response_streaming(bool value) { response_streaming_ = value; // @@protoc_insertion_point(field_set:google.protobuf.Method.response_streaming) } // repeated .google.protobuf.Option options = 6; inline int Method::options_size() const { return options_.size(); } inline const ::google::protobuf::Option& Method::options(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.Method.options) return options_.Get(index); } inline ::google::protobuf::Option* Method::mutable_options(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.Method.options) return options_.Mutable(index); } inline ::google::protobuf::Option* Method::add_options() { // @@protoc_insertion_point(field_add:google.protobuf.Method.options) return options_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >* Method::mutable_options() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.Method.options) return &options_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Option >& Method::options() const { // @@protoc_insertion_point(field_list:google.protobuf.Method.options) return options_; } // .google.protobuf.Syntax syntax = 7; inline void Method::clear_syntax() { syntax_ = 0; } inline ::google::protobuf::Syntax Method::syntax() const { // @@protoc_insertion_point(field_get:google.protobuf.Method.syntax) return static_cast< ::google::protobuf::Syntax >(syntax_); } inline void Method::set_syntax(::google::protobuf::Syntax value) { syntax_ = value; // @@protoc_insertion_point(field_set:google.protobuf.Method.syntax) } // ------------------------------------------------------------------- // Mixin // string name = 1; inline void Mixin::clear_name() { name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline const ::std::string& Mixin::name() const { // @@protoc_insertion_point(field_get:google.protobuf.Mixin.name) return name_.GetNoArena(); } inline void Mixin::set_name(const ::std::string& value) { name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.Mixin.name) } #if LANG_CXX11 inline void Mixin::set_name(::std::string&& value) { name_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Mixin.name) } #endif inline void Mixin::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.Mixin.name) } inline void Mixin::set_name(const char* value, size_t size) { name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.Mixin.name) } inline ::std::string* Mixin::mutable_name() { // @@protoc_insertion_point(field_mutable:google.protobuf.Mixin.name) return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* Mixin::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.Mixin.name) return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void Mixin::set_allocated_name(::std::string* name) { if (name != NULL) { } else { } name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name); // @@protoc_insertion_point(field_set_allocated:google.protobuf.Mixin.name) } // string root = 2; inline void Mixin::clear_root() { root_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline const ::std::string& Mixin::root() const { // @@protoc_insertion_point(field_get:google.protobuf.Mixin.root) return root_.GetNoArena(); } inline void Mixin::set_root(const ::std::string& value) { root_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.Mixin.root) } #if LANG_CXX11 inline void Mixin::set_root(::std::string&& value) { root_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Mixin.root) } #endif inline void Mixin::set_root(const char* value) { GOOGLE_DCHECK(value != NULL); root_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.Mixin.root) } inline void Mixin::set_root(const char* value, size_t size) { root_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.Mixin.root) } inline ::std::string* Mixin::mutable_root() { // @@protoc_insertion_point(field_mutable:google.protobuf.Mixin.root) return root_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* Mixin::release_root() { // @@protoc_insertion_point(field_release:google.protobuf.Mixin.root) return root_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void Mixin::set_allocated_root(::std::string* root) { if (root != NULL) { } else { } root_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), root); // @@protoc_insertion_point(field_set_allocated:google.protobuf.Mixin.root) } #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ // ------------------------------------------------------------------- // ------------------------------------------------------------------- // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) #endif // PROTOBUF_google_2fprotobuf_2fapi_2eproto__INCLUDED python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/api.proto000066400000000000000000000170661334102242000271410ustar00rootroot00000000000000// 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 google.protobuf; import "google/protobuf/source_context.proto"; import "google/protobuf/type.proto"; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option java_package = "com.google.protobuf"; option java_outer_classname = "ApiProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; option go_package = "google.golang.org/genproto/protobuf/api;api"; // Api is a light-weight descriptor for an API Interface. // // Interfaces are also described as "protocol buffer services" in some contexts, // such as by the "service" keyword in a .proto file, but they are different // from API Services, which represent a concrete implementation of an interface // as opposed to simply a description of methods and bindings. They are also // sometimes simply referred to as "APIs" in other contexts, such as the name of // this message itself. See https://cloud.google.com/apis/design/glossary for // detailed terminology. message Api { // The fully qualified name of this interface, including package name // followed by the interface's simple name. string name = 1; // The methods of this interface, in unspecified order. repeated Method methods = 2; // Any metadata attached to the interface. repeated Option options = 3; // A version string for this interface. If specified, must have the form // `major-version.minor-version`, as in `1.10`. If the minor version is // omitted, it defaults to zero. If the entire version field is empty, the // major version is derived from the package name, as outlined below. If the // field is not empty, the version in the package name will be verified to be // consistent with what is provided here. // // The versioning schema uses [semantic // versioning](http://semver.org) where the major version number // indicates a breaking change and the minor version an additive, // non-breaking change. Both version numbers are signals to users // what to expect from different versions, and should be carefully // chosen based on the product plan. // // The major version is also reflected in the package name of the // interface, which must end in `v`, as in // `google.feature.v1`. For major versions 0 and 1, the suffix can // be omitted. Zero major versions must only be used for // experimental, non-GA interfaces. // // string version = 4; // Source context for the protocol buffer service represented by this // message. SourceContext source_context = 5; // Included interfaces. See [Mixin][]. repeated Mixin mixins = 6; // The source syntax of the service. Syntax syntax = 7; } // Method represents a method of an API interface. message Method { // The simple name of this method. string name = 1; // A URL of the input message type. string request_type_url = 2; // If true, the request is streamed. bool request_streaming = 3; // The URL of the output message type. string response_type_url = 4; // If true, the response is streamed. bool response_streaming = 5; // Any metadata attached to the method. repeated Option options = 6; // The source syntax of this method. Syntax syntax = 7; } // Declares an API Interface to be included in this interface. The including // interface must redeclare all the methods from the included interface, but // documentation and options are inherited as follows: // // - If after comment and whitespace stripping, the documentation // string of the redeclared method is empty, it will be inherited // from the original method. // // - Each annotation belonging to the service config (http, // visibility) which is not set in the redeclared method will be // inherited. // // - If an http annotation is inherited, the path pattern will be // modified as follows. Any version prefix will be replaced by the // version of the including interface plus the [root][] path if // specified. // // Example of a simple mixin: // // package google.acl.v1; // service AccessControl { // // Get the underlying ACL object. // rpc GetAcl(GetAclRequest) returns (Acl) { // option (google.api.http).get = "/v1/{resource=**}:getAcl"; // } // } // // package google.storage.v2; // service Storage { // rpc GetAcl(GetAclRequest) returns (Acl); // // // Get a data record. // rpc GetData(GetDataRequest) returns (Data) { // option (google.api.http).get = "/v2/{resource=**}"; // } // } // // Example of a mixin configuration: // // apis: // - name: google.storage.v2.Storage // mixins: // - name: google.acl.v1.AccessControl // // The mixin construct implies that all methods in `AccessControl` are // also declared with same name and request/response types in // `Storage`. A documentation generator or annotation processor will // see the effective `Storage.GetAcl` method after inherting // documentation and annotations as follows: // // service Storage { // // Get the underlying ACL object. // rpc GetAcl(GetAclRequest) returns (Acl) { // option (google.api.http).get = "/v2/{resource=**}:getAcl"; // } // ... // } // // Note how the version in the path pattern changed from `v1` to `v2`. // // If the `root` field in the mixin is specified, it should be a // relative path under which inherited HTTP paths are placed. Example: // // apis: // - name: google.storage.v2.Storage // mixins: // - name: google.acl.v1.AccessControl // root: acls // // This implies the following inherited HTTP annotation: // // service Storage { // // Get the underlying ACL object. // rpc GetAcl(GetAclRequest) returns (Acl) { // option (google.api.http).get = "/v2/acls/{resource=**}:getAcl"; // } // ... // } message Mixin { // The fully qualified name of the interface which is included. string name = 1; // If non-empty specifies a path under which inherited HTTP paths // are rooted. string root = 2; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/arena.cc000066400000000000000000000312031334102242000266650ustar00rootroot00000000000000// 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 #include #include #ifdef ADDRESS_SANITIZER #include #endif // ADDRESS_SANITIZER #include namespace google { static const size_t kMinCleanupListElements = 8; static const size_t kMaxCleanupListElements = 64; // 1kB on 64-bit. namespace protobuf { namespace internal { google::protobuf::internal::SequenceNumber ArenaImpl::lifecycle_id_generator_; #if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL) ArenaImpl::ThreadCache& ArenaImpl::thread_cache() { static internal::ThreadLocalStorage* thread_cache_ = new internal::ThreadLocalStorage(); return *thread_cache_->Get(); } #elif defined(PROTOBUF_USE_DLLS) ArenaImpl::ThreadCache& ArenaImpl::thread_cache() { static GOOGLE_THREAD_LOCAL ThreadCache thread_cache_ = { -1, NULL }; return thread_cache_; } #else GOOGLE_THREAD_LOCAL ArenaImpl::ThreadCache ArenaImpl::thread_cache_ = {-1, NULL}; #endif void ArenaImpl::Init() { lifecycle_id_ = lifecycle_id_generator_.GetNext(); google::protobuf::internal::NoBarrier_Store(&hint_, 0); google::protobuf::internal::NoBarrier_Store(&threads_, 0); if (initial_block_) { // Thread which calls Init() owns the first block. This allows the // single-threaded case to allocate on the first block without having to // perform atomic operations. InitBlock(initial_block_, &thread_cache(), options_.initial_block_size); ThreadInfo* info = NewThreadInfo(initial_block_); info->next = NULL; google::protobuf::internal::NoBarrier_Store(&threads_, reinterpret_cast(info)); google::protobuf::internal::NoBarrier_Store(&space_allocated_, options_.initial_block_size); CacheBlock(initial_block_); } else { google::protobuf::internal::NoBarrier_Store(&space_allocated_, 0); } } ArenaImpl::~ArenaImpl() { // Have to do this in a first pass, because some of the destructors might // refer to memory in other blocks. CleanupList(); FreeBlocks(); } uint64 ArenaImpl::Reset() { // Have to do this in a first pass, because some of the destructors might // refer to memory in other blocks. CleanupList(); uint64 space_allocated = FreeBlocks(); Init(); return space_allocated; } ArenaImpl::Block* ArenaImpl::NewBlock(void* me, Block* my_last_block, size_t min_bytes) { size_t size; if (my_last_block != NULL) { // Double the current block size, up to a limit. size = std::min(2 * my_last_block->size, options_.max_block_size); } else { size = options_.start_block_size; } // Verify that min_bytes + kHeaderSize won't overflow. GOOGLE_CHECK_LE(min_bytes, std::numeric_limits::max() - kHeaderSize); size = std::max(size, kHeaderSize + min_bytes); Block* b = reinterpret_cast(options_.block_alloc(size)); InitBlock(b, me, size); google::protobuf::internal::NoBarrier_AtomicIncrement(&space_allocated_, size); return b; } void ArenaImpl::InitBlock(Block* b, void *me, size_t size) { b->pos = kHeaderSize; b->size = size; b->owner = me; b->next = NULL; #ifdef ADDRESS_SANITIZER // Poison the rest of the block for ASAN. It was unpoisoned by the underlying // malloc but it's not yet usable until we return it as part of an allocation. ASAN_POISON_MEMORY_REGION( reinterpret_cast(b) + b->pos, b->size - b->pos); #endif // ADDRESS_SANITIZER } ArenaImpl::CleanupChunk* ArenaImpl::ExpandCleanupList(CleanupChunk* cleanup, Block* b) { size_t size = cleanup ? cleanup->size * 2 : kMinCleanupListElements; size = std::min(size, kMaxCleanupListElements); size_t bytes = internal::AlignUpTo8(CleanupChunk::SizeOf(size)); if (b->avail() < bytes) { b = GetBlock(bytes); } CleanupChunk* list = reinterpret_cast(AllocFromBlock(b, bytes)); list->next = b->thread_info->cleanup; list->size = size; list->len = 0; b->thread_info->cleanup = list; return list; } inline GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void ArenaImpl::AddCleanupInBlock( Block* b, void* elem, void (*func)(void*)) { CleanupChunk* cleanup = b->thread_info->cleanup; if (cleanup == NULL || cleanup->len == cleanup->size) { cleanup = ExpandCleanupList(cleanup, b); } CleanupNode* node = &cleanup->nodes[cleanup->len++]; node->elem = elem; node->cleanup = func; } void ArenaImpl::AddCleanup(void* elem, void (*cleanup)(void*)) { return AddCleanupInBlock(GetBlock(0), elem, cleanup); } void* ArenaImpl::AllocateAligned(size_t n) { GOOGLE_DCHECK_EQ(internal::AlignUpTo8(n), n); // Must be already aligned. return AllocFromBlock(GetBlock(n), n); } void* ArenaImpl::AllocateAlignedAndAddCleanup(size_t n, void (*cleanup)(void*)) { GOOGLE_DCHECK_EQ(internal::AlignUpTo8(n), n); // Must be already aligned. Block* b = GetBlock(n); void* mem = AllocFromBlock(b, n); AddCleanupInBlock(b, mem, cleanup); return mem; } inline GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE ArenaImpl::Block* ArenaImpl::GetBlock(size_t n) { Block* my_block = NULL; // 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. ThreadCache* tc = &thread_cache(); if (tc->last_lifecycle_id_seen == lifecycle_id_) { my_block = tc->last_block_used_; if (my_block->avail() >= n) { return my_block; } } // Check whether we own the last accessed block on this arena. // This fast path optimizes the case where a single thread uses multiple // arenas. Block* b = reinterpret_cast(google::protobuf::internal::Acquire_Load(&hint_)); if (b != NULL && b->owner == tc) { my_block = b; if (my_block->avail() >= n) { return my_block; } } return GetBlockSlow(tc, my_block, n); } inline GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void* ArenaImpl::AllocFromBlock(Block* b, size_t n) { GOOGLE_DCHECK_EQ(internal::AlignUpTo8(b->pos), b->pos); // Must be already aligned. GOOGLE_DCHECK_EQ(internal::AlignUpTo8(n), n); // Must be already aligned. GOOGLE_DCHECK_GE(b->avail(), n); size_t p = b->pos; b->pos = p + n; #ifdef ADDRESS_SANITIZER ASAN_UNPOISON_MEMORY_REGION(reinterpret_cast(b) + p, n); #endif // ADDRESS_SANITIZER return reinterpret_cast(b) + p; } ArenaImpl::Block* ArenaImpl::GetBlockSlow(void* me, Block* my_full_block, size_t n) { ThreadInfo* info = my_full_block ? my_full_block->thread_info : GetThreadInfo(me, n); GOOGLE_DCHECK(info != NULL); Block* b = info->head; if (b->avail() < n) { Block* new_b = NewBlock(me, b, n); new_b->thread_info = info; new_b->next = b; info->head = new_b; b = new_b; } CacheBlock(b); return b; } uint64 ArenaImpl::SpaceAllocated() const { return google::protobuf::internal::NoBarrier_Load(&space_allocated_); } uint64 ArenaImpl::SpaceUsed() const { ThreadInfo* info = reinterpret_cast(google::protobuf::internal::Acquire_Load(&threads_)); uint64 space_used = 0; for ( ; info; info = info->next) { // Remove the overhead of the ThreadInfo itself. space_used -= sizeof(ThreadInfo); for (Block* b = info->head; b; b = b->next) { space_used += (b->pos - kHeaderSize); } } return space_used; } uint64 ArenaImpl::FreeBlocks() { uint64 space_allocated = 0; // 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. ThreadInfo* info = reinterpret_cast(google::protobuf::internal::NoBarrier_Load(&threads_)); while (info) { // This is inside the block we are freeing, so we need to read it now. ThreadInfo* next_info = info->next; for (Block* b = info->head; b; ) { // This is inside the block we are freeing, so we need to read it now. Block* next_block = b->next; space_allocated += (b->size); #ifdef ADDRESS_SANITIZER // This memory was provided by the underlying allocator as unpoisoned, so // return it in an unpoisoned state. ASAN_UNPOISON_MEMORY_REGION(reinterpret_cast(b), b->size); #endif // ADDRESS_SANITIZER if (b != initial_block_) { options_.block_dealloc(b, b->size); } b = next_block; } info = next_info; } return space_allocated; } void ArenaImpl::CleanupList() { // 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. ThreadInfo* info = reinterpret_cast(google::protobuf::internal::NoBarrier_Load(&threads_)); for ( ; info; info = info->next) { CleanupChunk* list = info->cleanup; while (list) { size_t n = list->len; CleanupNode* node = &list->nodes[list->len - 1]; for (size_t i = 0; i < n; i++, node--) { node->cleanup(node->elem); } list = list->next; } } } ArenaImpl::ThreadInfo* ArenaImpl::NewThreadInfo(Block* b) { GOOGLE_DCHECK(FindThreadInfo(b->owner) == NULL); ThreadInfo* info = reinterpret_cast(AllocFromBlock(b, sizeof(ThreadInfo))); b->thread_info = info; info->owner = b->owner; info->head = b; info->cleanup = NULL; return info; } ArenaImpl::ThreadInfo* ArenaImpl::FindThreadInfo(void* me) { ThreadInfo* info = reinterpret_cast(google::protobuf::internal::Acquire_Load(&threads_)); for ( ; info; info = info->next) { if (info->owner == me) { return info; } } return NULL; } ArenaImpl::ThreadInfo* ArenaImpl::GetThreadInfo(void* me, size_t n) { ThreadInfo* info = FindThreadInfo(me); if (!info) { // This thread doesn't have any ThreadInfo, which also means it doesn't have // any blocks yet. So we'll allocate its first block now. Block* b = NewBlock(me, NULL, sizeof(ThreadInfo) + n); info = NewThreadInfo(b); google::protobuf::internal::AtomicWord head; do { head = google::protobuf::internal::NoBarrier_Load(&threads_); info->next = reinterpret_cast(head); } while (google::protobuf::internal::Release_CompareAndSwap( &threads_, head, reinterpret_cast(info)) != head); } return info; } } // namespace internal void Arena::CallDestructorHooks() { uint64 space_allocated = impl_.SpaceAllocated(); // Call the reset hook if (on_arena_reset_ != NULL) { on_arena_reset_(this, hooks_cookie_, space_allocated); } // Call the destruction hook if (on_arena_destruction_ != NULL) { on_arena_destruction_(this, hooks_cookie_, space_allocated); } } void Arena::OnArenaAllocation(const std::type_info* allocated_type, size_t n) const { if (on_arena_allocation_ != NULL) { on_arena_allocation_(allocated_type, n, hooks_cookie_); } } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/arena.h000066400000000000000000001135521334102242000265370ustar00rootroot00000000000000// 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 defines an Arena allocator for better allocation performance. #ifndef GOOGLE_PROTOBUF_ARENA_H__ #define GOOGLE_PROTOBUF_ARENA_H__ #include #ifdef max #undef max // Visual Studio defines this macro #endif #if LANG_CXX11 #include #endif #if defined(_MSC_VER) && !_HAS_EXCEPTIONS // Work around bugs in MSVC header when _HAS_EXCEPTIONS=0. #include #include namespace std { using type_info = ::type_info; } #else #include #endif #include #include namespace google { namespace protobuf { class Arena; // defined below class Message; // message.h namespace internal { struct ArenaStringPtr; // arenastring.h class LazyField; // lazy_field.h template class GenericTypeHandler; // repeated_field.h // Templated cleanup methods. template void arena_destruct_object(void* object) { reinterpret_cast(object)->~T(); } template void arena_delete_object(void* object) { delete reinterpret_cast(object); } inline void arena_free(void* object, size_t size) { #if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation) ::operator delete(object, size); #else (void)size; ::operator delete(object); #endif } } // namespace internal // ArenaOptions provides optional additional parameters to arena construction // that control its block-allocation behavior. struct ArenaOptions { // This defines the size of the first block requested from the system malloc. // Subsequent block sizes will increase in a geometric series up to a maximum. size_t start_block_size; // This defines the maximum block size requested from system malloc (unless an // individual arena allocation request occurs with a size larger than this // maximum). Requested block sizes increase up to this value, then remain // here. size_t max_block_size; // An initial block of memory for the arena to use, or NULL 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. char* initial_block; // The size of the initial block, if provided. size_t initial_block_size; // A function pointer to an alloc method that returns memory blocks of size // requested. By default, it contains a ptr to the malloc function. // // NOTE: block_alloc and dealloc functions are expected to behave like // malloc and free, including Asan poisoning. void* (*block_alloc)(size_t); // A function pointer to a dealloc method that takes ownership of the blocks // from the arena. By default, it contains a ptr to a wrapper function that // calls free. void (*block_dealloc)(void*, size_t); // Hooks for adding external functionality such as user-specific metrics // collection, specific debugging abilities, etc. // Init hook may return a pointer to a cookie to be stored in the arena. // reset and destruction hooks will then be called with the same cookie // pointer. This allows us to save an external object per arena instance and // use it on the other hooks (Note: It is just as legal for init to return // NULL and not use the cookie feature). // on_arena_reset and on_arena_destruction also receive the space used in // the arena just before the reset. void* (*on_arena_init)(Arena* arena); void (*on_arena_reset)(Arena* arena, void* cookie, uint64 space_used); void (*on_arena_destruction)(Arena* arena, void* cookie, uint64 space_used); // type_info is promised to be static - its lifetime extends to // match program's lifetime (It is given by typeid operator). // Note: typeid(void) will be passed as allocated_type every time we // intentionally want to avoid monitoring an allocation. (i.e. internal // allocations for managing the arena) void (*on_arena_allocation)(const std::type_info* allocated_type, uint64 alloc_size, void* cookie); ArenaOptions() : start_block_size(kDefaultStartBlockSize), max_block_size(kDefaultMaxBlockSize), initial_block(NULL), initial_block_size(0), block_alloc(&::operator new), block_dealloc(&internal::arena_free), on_arena_init(NULL), on_arena_reset(NULL), on_arena_destruction(NULL), on_arena_allocation(NULL) {} private: // Constants define default starting block size and max block size for // arena allocator behavior -- see descriptions above. static const size_t kDefaultStartBlockSize = 256; static const size_t kDefaultMaxBlockSize = 8192; }; // Support for non-RTTI environments. (The metrics hooks API uses type // information.) #ifndef GOOGLE_PROTOBUF_NO_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 // allocated on an arena by using Arena::CreateMessage(Arena*), below, and // are automatically freed when the arena is destroyed. // // This is a thread-safe implementation: multiple threads may allocate from the // arena concurrently. Destruction is not thread-safe and the destructing // thread must synchronize with users of the arena first. // // An arena provides two allocation interfaces: CreateMessage, which works // for arena-enabled proto2 message types as well as other types that satisfy // the appropriate protocol (described below), and Create, which works for // any arbitrary type T. CreateMessage is better when the type T supports it, // because this interface (i) passes the arena pointer to the created object so // that its sub-objects and internal allocations can use the arena too, and (ii) // elides the object's destructor call when possible. Create does not place // any special requirements on the type T, and will invoke the object's // destructor when the arena is destroyed. // // The arena message allocation protocol, required by CreateMessage, is as // follows: // // - The type T must have (at least) two constructors: a constructor with no // arguments, called when a T is allocated on the heap; and a constructor with // a google::protobuf::Arena* argument, 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 (no-argument) constructor. // // - The type T must have a particular type trait: a nested type // |InternalArenaConstructable_|. This is usually a typedef to |void|. If no // such type trait exists, then the instantiation CreateMessage will fail // to compile. // // - 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 // present on the type, then its destructor is always called when the // containing arena is destroyed. // // - One- and two-user-argument forms of CreateMessage() also exist that // forward these constructor arguments to T's constructor: for example, // CreateMessage(Arena*, arg1, arg2) forwards to a constructor T(Arena*, // arg1, arg2). // // This protocol is implemented by all arena-enabled proto2 message classes as // well as RepeatedPtrField. // // Do NOT subclass Arena. This class will be marked as final when C++11 is // enabled. class LIBPROTOBUF_EXPORT Arena { public: // Arena constructor taking custom options. See ArenaOptions below for // descriptions of the options available. explicit Arena(const ArenaOptions& options) : impl_(options) { Init(options); } // Block overhead. Use this as a guide for how much to over-allocate the // initial block if you want an allocation of size N to fit inside it. // // WARNING: if you allocate multiple objects, it is difficult to guarantee // that a series of allocations will fit in the initial block, especially if // Arena changes its alignment guarantees in the future! static const size_t kBlockOverhead = internal::ArenaImpl::kHeaderSize; // Default constructor with sensible default options, tuned for average // use-cases. Arena() : impl_(ArenaOptions()) { Init(ArenaOptions()); } ~Arena() { if (on_arena_reset_ != NULL || on_arena_destruction_ != NULL) { CallDestructorHooks(); } } void Init(const ArenaOptions& options) { on_arena_allocation_ = options.on_arena_allocation; on_arena_reset_ = options.on_arena_reset; on_arena_destruction_ = options.on_arena_destruction; // Call the initialization hook if (options.on_arena_init != NULL) { hooks_cookie_ = options.on_arena_init(this); } else { hooks_cookie_ = NULL; } } // 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. // // RepeatedField and RepeatedPtrField may also be instantiated directly on an // arena with this method. // // This function also accepts any type T that satisfies the arena message // allocation protocol, documented above. #if LANG_CXX11 template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateMessage( ::google::protobuf::Arena* arena, Args&&... args) { static_assert( InternalHelper::is_arena_constructable::value, "CreateMessage can only construct types that are ArenaConstructable"); if (arena == NULL) { return new T(NULL, std::forward(args)...); } else { return arena->CreateMessageInternal(std::forward(args)...); } } #endif template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateMessage(::google::protobuf::Arena* arena) { #if LANG_CXX11 static_assert( InternalHelper::is_arena_constructable::value, "CreateMessage can only construct types that are ArenaConstructable"); #endif if (arena == NULL) { return new T; } else { return arena->CreateMessageInternal(); } } // One-argument form of CreateMessage. This is useful for constructing objects // that implement the arena message construction protocol described above but // take additional constructor arguments. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateMessage(::google::protobuf::Arena* arena, const Arg& arg) { #if LANG_CXX11 static_assert( InternalHelper::is_arena_constructable::value, "CreateMessage can only construct types that are ArenaConstructable"); #endif if (arena == NULL) { return new T(NULL, arg); } else { return arena->CreateMessageInternal(arg); } } // Two-argument form of CreateMessage. This is useful for constructing objects // that implement the arena message construction protocol described above but // take additional constructor arguments. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateMessage(::google::protobuf::Arena* arena, const Arg1& arg1, const Arg2& arg2) { #if LANG_CXX11 static_assert( InternalHelper::is_arena_constructable::value, "CreateMessage can only construct types that are ArenaConstructable"); #endif if (arena == NULL) { return new T(NULL, arg1, arg2); } else { return arena->CreateMessageInternal(arg1, arg2); } } // API to create any objects on the arena. Note that only the object will // be created on the arena; the underlying ptrs (in case of a proto2 message) // will be still heap allocated. Proto messages should usually be allocated // with CreateMessage() instead. // // Note that even if T satisfies the arena message construction protocol // (InternalArenaConstructable_ trait and optional DestructorSkippable_ // trait), as described above, this function does not follow the protocol; // instead, it treats T as a black-box type, just as if it did not have these // traits. Specifically, T's constructor arguments will always be only those // passed to Create() -- no additional arena pointer is implicitly added. // Furthermore, the destructor will always be called at arena destruction time // (unless the destructor is trivial). Hence, from T's point of view, it is as // if the object were allocated on the heap (except that the underlying memory // is obtained from the arena). #if LANG_CXX11 template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena, Args&&... args) { if (arena == NULL) { return new T(std::forward(args)...); } else { return arena->CreateInternal(google::protobuf::internal::has_trivial_destructor::value, std::forward(args)...); } } #endif template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena) { if (arena == NULL) { return new T(); } else { return arena->CreateInternal(google::protobuf::internal::has_trivial_destructor::value); } } // Version of the above with one constructor argument for the created object. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena, const Arg& arg) { if (arena == NULL) { return new T(arg); } else { return arena->CreateInternal(google::protobuf::internal::has_trivial_destructor::value, arg); } } // Version of the above with two constructor arguments for the created object. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena, const Arg1& arg1, const Arg2& arg2) { if (arena == NULL) { return new T(arg1, arg2); } else { return arena->CreateInternal(google::protobuf::internal::has_trivial_destructor::value, arg1, arg2); } } // Version of the above with three constructor arguments for the created // object. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) { if (arena == NULL) { return new T(arg1, arg2, arg3); } else { return arena->CreateInternal(google::protobuf::internal::has_trivial_destructor::value, arg1, arg2, arg3); } } // Version of the above with four constructor arguments for the created // object. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) { if (arena == NULL) { return new T(arg1, arg2, arg3, arg4); } else { return arena->CreateInternal(google::protobuf::internal::has_trivial_destructor::value, arg1, arg2, arg3, arg4); } } // Version of the above with five constructor arguments for the created // object. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) { if (arena == NULL) { return new T(arg1, arg2, arg3, arg4, arg5); } else { return arena->CreateInternal(google::protobuf::internal::has_trivial_destructor::value, arg1, arg2, arg3, arg4, arg5); } } // Version of the above with six constructor arguments for the created // object. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5, const Arg6& arg6) { if (arena == NULL) { return new T(arg1, arg2, arg3, arg4, arg5, arg6); } else { return arena->CreateInternal(google::protobuf::internal::has_trivial_destructor::value, arg1, arg2, arg3, arg4, arg5, arg6); } } // Version of the above with seven constructor arguments for the created // object. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5, const Arg6& arg6, const Arg7& arg7) { if (arena == NULL) { return new T(arg1, arg2, arg3, arg4, arg5, arg6, arg7); } else { return arena->CreateInternal(google::protobuf::internal::has_trivial_destructor::value, arg1, arg2, arg3, arg4, arg5, arg6, arg7); } } // Version of the above with eight constructor arguments for the created // object. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* Create(::google::protobuf::Arena* arena, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5, const Arg6& arg6, const Arg7& arg7, const Arg8& arg8) { if (arena == NULL) { return new T(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); } else { return arena->CreateInternal( google::protobuf::internal::has_trivial_destructor::value, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); } } // Create an array of object type T on the arena *without* invoking the // constructor of T. If `arena` is null, then the return value should be freed // with `delete[] x;` (or `::operator delete[](x);`). // To ensure safe uses, this function checks at compile time // (when compiled as C++11) that T is trivially default-constructible and // trivially destructible. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateArray(::google::protobuf::Arena* arena, size_t num_elements) { GOOGLE_CHECK_LE(num_elements, std::numeric_limits::max() / sizeof(T)) << "Requested size is too large to fit into size_t."; if (arena == NULL) { return static_cast(::operator new[](num_elements * sizeof(T))); } else { return arena->CreateInternalRawArray(num_elements); } } // Returns the total space allocated by the arena, which is the sum of the // sizes of the underlying blocks. This method is relatively fast; a counter // is kept as blocks are allocated. uint64 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. uint64 SpaceUsed() const { return impl_.SpaceUsed(); } // DEPRECATED. Please use SpaceAllocated() and SpaceUsed(). // // Combines SpaceAllocated and SpaceUsed. Returns a pair of // . std::pair SpaceAllocatedAndUsed() const { return std::make_pair(SpaceAllocated(), SpaceUsed()); } // Frees all storage allocated by this arena after calling destructors // registered with OwnDestructor() and freeing objects registered with Own(). // Any objects allocated on this arena are unusable after this call. It also // returns the total space used by the arena which is the sums of the sizes // of the allocated blocks. This method is not thread-safe. GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE uint64 Reset() { // Call the reset hook if (on_arena_reset_ != NULL) { on_arena_reset_(this, hooks_cookie_, impl_.SpaceAllocated()); } return impl_.Reset(); } // Adds |object| to a list of heap-allocated objects to be freed with |delete| // when the arena is destroyed or reset. template GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE void Own(T* object) { OwnInternal(object, google::protobuf::internal::is_convertible()); } // Adds |object| to a list of objects whose destructors will be manually // called when the arena is destroyed or reset. This differs from Own() in // that it does not free the underlying memory with |delete|; hence, it is // normally only used for objects that are placement-newed into // arena-allocated memory. template GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE void OwnDestructor(T* object) { if (object != NULL) { impl_.AddCleanup(object, &internal::arena_destruct_object); } } // Adds a custom member function on an object to the list of destructors that // will be manually called when the arena is destroyed or reset. This differs // from OwnDestructor() in that any member function may be specified, not only // the class destructor. GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE void OwnCustomDestructor( void* object, void (*destruct)(void*)) { impl_.AddCleanup(object, destruct); } // Retrieves the arena associated with |value| if |value| is an arena-capable // message, or NULL otherwise. This differs from value->GetArena() in that the // latter is a virtual call, while this method is a templated call that // resolves at compile-time. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static ::google::protobuf::Arena* GetArena(const T* value) { return GetArenaInternal(value, is_arena_constructable()); } template class InternalHelper { template static char DestructorSkippable(const typename U::DestructorSkippable_*); template static double DestructorSkippable(...); typedef google::protobuf::internal::integral_constant< bool, sizeof(DestructorSkippable(static_cast(0))) == sizeof(char) || google::protobuf::internal::has_trivial_destructor::value> is_destructor_skippable; template static char ArenaConstructable( const typename U::InternalArenaConstructable_*); template static double ArenaConstructable(...); typedef google::protobuf::internal::integral_constant( static_cast(0))) == sizeof(char)> is_arena_constructable; #if LANG_CXX11 template static T* Construct(void* ptr, Args&&... args) { return new (ptr) T(std::forward(args)...); } #else template static T* Construct(void* ptr, const Arg1& arg1) { return new (ptr) T(arg1); } template static T* Construct(void* ptr, const Arg1& arg1, const Arg2& arg2) { return new (ptr) T(arg1, arg2); } template static T* Construct(void* ptr, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) { return new (ptr) T(arg1, arg2, arg3); } #endif // LANG_CXX11 static Arena* GetArena(const T* p) { return p->GetArenaNoVirtual(); } friend class Arena; }; // Helper typetrait that indicates support for arenas in a type T at compile // time. This is public only to allow construction of higher-level templated // utilities. is_arena_constructable::value is true if the message type T // has arena support enabled, and false otherwise. // // This is inside Arena because only Arena has the friend relationships // necessary to see the underlying generated code traits. template struct is_arena_constructable : InternalHelper::is_arena_constructable {}; private: void CallDestructorHooks(); void OnArenaAllocation(const std::type_info* allocated_type, size_t n) const; inline void AllocHook(const std::type_info* allocated_type, size_t n) const { if (GOOGLE_PREDICT_FALSE(hooks_cookie_ != NULL)) { OnArenaAllocation(allocated_type, n); } } // Allocate and also optionally call on_arena_allocation callback with the // allocated type info when the hooks are in place in ArenaOptions and // the cookie is not null. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void* AllocateInternal(bool skip_explicit_ownership) { const size_t n = internal::AlignUpTo8(sizeof(T)); AllocHook(RTTI_TYPE_ID(T), n); // Monitor allocation if needed. if (skip_explicit_ownership) { return impl_.AllocateAligned(n); } else { return impl_.AllocateAlignedAndAddCleanup( n, &internal::arena_destruct_object); } } // CreateMessage requires that T supports arenas, but this private method // works whether or not T supports arenas. These are not exposed to user code // as it can cause confusing API usages, and end up having double free in // user code. These are used only internally from LazyField and Repeated // fields, since they are designed to work in all mode combinations. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static Msg* CreateMaybeMessage(Arena* arena, google::protobuf::internal::true_type) { return CreateMessage(arena); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateMaybeMessage(Arena* arena, google::protobuf::internal::false_type) { return Create(arena); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateMaybeMessage(Arena* arena) { return CreateMaybeMessage(arena, is_arena_constructable()); } // Just allocate the required size for the given type assuming the // type has a trivial constructor. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternalRawArray(size_t num_elements) { GOOGLE_CHECK_LE(num_elements, std::numeric_limits::max() / sizeof(T)) << "Requested size is too large to fit into size_t."; const size_t n = internal::AlignUpTo8(sizeof(T) * num_elements); // Monitor allocation if needed. AllocHook(RTTI_TYPE_ID(T), n); return static_cast(impl_.AllocateAligned(n)); } #if LANG_CXX11 template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership, Args&&... args) { return new (AllocateInternal(skip_explicit_ownership)) T(std::forward(args)...); } #else template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership) { return new (AllocateInternal(skip_explicit_ownership)) T(); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership, const Arg& arg) { return new (AllocateInternal(skip_explicit_ownership)) T(arg); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership, const Arg1& arg1, const Arg2& arg2) { return new (AllocateInternal(skip_explicit_ownership)) T(arg1, arg2); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) { return new (AllocateInternal(skip_explicit_ownership)) T(arg1, arg2, arg3); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) { return new (AllocateInternal(skip_explicit_ownership)) T(arg1, arg2, arg3, arg4); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) { return new (AllocateInternal(skip_explicit_ownership)) T(arg1, arg2, arg3, arg4, arg5); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5, const Arg6& arg6) { return new (AllocateInternal(skip_explicit_ownership)) T(arg1, arg2, arg3, arg4, arg5, arg6); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5, const Arg6& arg6, const Arg7& arg7) { return new (AllocateInternal(skip_explicit_ownership)) T(arg1, arg2, arg3, arg4, arg5, arg6, arg7); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternal(bool skip_explicit_ownership, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5, const Arg6& arg6, const Arg7& arg7, const Arg8& arg8) { return new (AllocateInternal(skip_explicit_ownership)) T(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); } #endif #if LANG_CXX11 template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateMessageInternal( Args&&... args) { return InternalHelper::Construct( AllocateInternal(InternalHelper::is_destructor_skippable::value), this, std::forward(args)...); } #endif template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateMessageInternal() { return InternalHelper::Construct( AllocateInternal(InternalHelper::is_destructor_skippable::value), this); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateMessageInternal(const Arg& arg) { return InternalHelper::Construct( AllocateInternal(InternalHelper::is_destructor_skippable::value), this, arg); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateMessageInternal(const Arg1& arg1, const Arg2& arg2) { return InternalHelper::Construct( AllocateInternal(InternalHelper::is_destructor_skippable::value), this, arg1, arg2); } // CreateInArenaStorage is used to implement map field. Without it, // google::protobuf::Map need to call generated message's protected arena constructor, // which needs to declare google::protobuf::Map as friend of generated message. template static void CreateInArenaStorage(T* ptr, Arena* arena) { CreateInArenaStorageInternal(ptr, arena, typename is_arena_constructable::type()); RegisterDestructorInternal( ptr, arena, typename InternalHelper::is_destructor_skippable::type()); } template static void CreateInArenaStorageInternal( T* ptr, Arena* arena, google::protobuf::internal::true_type) { InternalHelper::Construct(ptr, arena); } template static void CreateInArenaStorageInternal( T* ptr, Arena* /* arena */, google::protobuf::internal::false_type) { new (ptr) T(); } template static void RegisterDestructorInternal( T* /* ptr */, Arena* /* arena */, google::protobuf::internal::true_type) {} template static void RegisterDestructorInternal( T* ptr, Arena* arena, google::protobuf::internal::false_type) { arena->OwnDestructor(ptr); } // These implement Own(), which registers an object for deletion (destructor // call and operator delete()). The second parameter has type 'true_type' if T // is a subtype of ::google::protobuf::Message and 'false_type' otherwise. Collapsing // all template instantiations to one for generic Message reduces code size, // using the virtual destructor instead. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void OwnInternal(T* object, google::protobuf::internal::true_type) { if (object != NULL) { impl_.AddCleanup(object, &internal::arena_delete_object< ::google::protobuf::Message>); } } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void OwnInternal(T* object, google::protobuf::internal::false_type) { if (object != NULL) { impl_.AddCleanup(object, &internal::arena_delete_object); } } // Implementation for GetArena(). Only message objects with // InternalArenaConstructable_ tags can be associated with an arena, and such // objects must implement a GetArenaNoVirtual() method. template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static ::google::protobuf::Arena* GetArenaInternal( const T* value, google::protobuf::internal::true_type) { return InternalHelper::GetArena(value); } template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static ::google::protobuf::Arena* GetArenaInternal( const T* /* value */, google::protobuf::internal::false_type) { return NULL; } // For friends of arena. void* AllocateAligned(size_t n) { AllocHook(NULL, n); return impl_.AllocateAligned(internal::AlignUpTo8(n)); } internal::ArenaImpl impl_; void* (*on_arena_init_)(Arena* arena); void (*on_arena_allocation_)(const std::type_info* allocated_type, uint64 alloc_size, void* cookie); void (*on_arena_reset_)(Arena* arena, void* cookie, uint64 space_used); void (*on_arena_destruction_)(Arena* arena, void* cookie, uint64 space_used); // The arena may save a cookie it receives from the external on_init hook // and then use it when calling the on_reset and on_destruction hooks. void* hooks_cookie_; template friend class ::google::protobuf::internal::GenericTypeHandler; friend struct internal::ArenaStringPtr; // For AllocateAligned. friend class internal::LazyField; // For CreateMaybeMessage. template friend class Map; }; // Defined above for supporting environments without RTTI. #undef RTTI_TYPE_ID } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ARENA_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/arena_impl.h000066400000000000000000000226671334102242000275660ustar00rootroot00000000000000// 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 defines an Arena allocator for better allocation performance. #ifndef GOOGLE_PROTOBUF_ARENA_IMPL_H__ #define GOOGLE_PROTOBUF_ARENA_IMPL_H__ #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { inline size_t AlignUpTo8(size_t n) { // Align n to next multiple of 8 (from Hacker's Delight, Chapter 3.) return (n + 7) & -8; } // This class provides the core Arena memory allocation library. Different // implementations only need to implement the public interface below. // Arena is not a template type as that would only be useful if all protos // in turn would be templates, which will/cannot happen. However separating // the memory allocation part from the cruft of the API users expect we can // use #ifdef the select the best implementation based on hardware / OS. class LIBPROTOBUF_EXPORT ArenaImpl { public: struct Options { size_t start_block_size; size_t max_block_size; char* initial_block; size_t initial_block_size; void* (*block_alloc)(size_t); void (*block_dealloc)(void*, size_t); template explicit Options(const O& options) : start_block_size(options.start_block_size), max_block_size(options.max_block_size), initial_block(options.initial_block), initial_block_size(options.initial_block_size), block_alloc(options.block_alloc), block_dealloc(options.block_dealloc) {} }; template explicit ArenaImpl(const O& options) : options_(options) { if (options_.initial_block != NULL && options_.initial_block_size > 0) { GOOGLE_CHECK_GE(options_.initial_block_size, sizeof(Block)) << ": Initial block size too small for header."; initial_block_ = reinterpret_cast(options_.initial_block); } else { initial_block_ = NULL; } Init(); } // Destructor deletes all owned heap allocated objects, and destructs objects // that have non-trivial destructors, except for proto2 message objects whose // destructors can be skipped. Also, frees all blocks except the initial block // if it was passed in. ~ArenaImpl(); uint64 Reset(); uint64 SpaceAllocated() const; uint64 SpaceUsed() const; void* AllocateAligned(size_t n); void* AllocateAlignedAndAddCleanup(size_t n, void (*cleanup)(void*)); // Add object pointer and cleanup function pointer to the list. void AddCleanup(void* elem, void (*cleanup)(void*)); private: // 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. }; // Cleanup uses a chunked linked list, to reduce pointer chasing. struct CleanupChunk { static size_t SizeOf(size_t i) { return sizeof(CleanupChunk) + (sizeof(CleanupNode) * (i - 1)); } size_t len; // Number of elements currently present. size_t size; // Total elements in the list. CleanupChunk* next; // Next node in the list. CleanupNode nodes[1]; // True length is |size|. }; struct Block; // Tracks per-thread info. ThreadInfos are kept in a linked list. struct ThreadInfo { void *owner; // &ThreadCache of this thread; Block* head; // Head of linked list of blocks. CleanupChunk* cleanup; // Head of cleanup list. ThreadInfo* next; // Next ThreadInfo in this linked list. }; // Blocks are variable length malloc-ed objects. The following structure // describes the common header for all blocks. struct Block { void* owner; // &ThreadCache of thread that owns this block. ThreadInfo* thread_info; // ThreadInfo of thread that owns this block. Block* next; // Next block in arena (may have different owner) // ((char*) &block) + pos is next available byte. It is always // aligned at a multiple of 8 bytes. size_t pos; size_t size; // total size of the block. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE size_t avail() const { return size - pos; } // data follows }; struct ThreadCache { #if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL) // If we are using the ThreadLocalStorage class to store the ThreadCache, // then the ThreadCache's default constructor has to be responsible for // initializing it. ThreadCache() : last_lifecycle_id_seen(-1), last_block_used_(NULL) {} #endif // The ThreadCache is considered valid as long as this matches the // lifecycle_id of the arena being used. int64 last_lifecycle_id_seen; Block* last_block_used_; }; static google::protobuf::internal::SequenceNumber lifecycle_id_generator_; #if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL) // Android ndk does not support GOOGLE_THREAD_LOCAL keyword so we use a custom thread // local storage class we implemented. // iOS also does not support the GOOGLE_THREAD_LOCAL keyword. static ThreadCache& thread_cache(); #elif defined(PROTOBUF_USE_DLLS) // Thread local variables cannot be exposed through DLL interface but we can // wrap them in static functions. static ThreadCache& thread_cache(); #else static GOOGLE_THREAD_LOCAL ThreadCache thread_cache_; static ThreadCache& thread_cache() { return thread_cache_; } #endif void Init(); // Free all blocks and return the total space used which is the sums of sizes // of the all the allocated blocks. uint64 FreeBlocks(); void AddCleanupInBlock(Block* b, void* elem, void (*func)(void*)); CleanupChunk* ExpandCleanupList(CleanupChunk* cleanup, Block* b); // Delete or Destruct all objects owned by the arena. void CleanupList(); inline void CacheBlock(Block* block) { thread_cache().last_block_used_ = block; thread_cache().last_lifecycle_id_seen = lifecycle_id_; // TODO(haberman): evaluate whether we would gain efficiency by getting rid // of hint_. It's the only write we do to ArenaImpl in the allocation path, // which will dirty the cache line. google::protobuf::internal::Release_Store(&hint_, reinterpret_cast(block)); } google::protobuf::internal::AtomicWord threads_; // Pointer to a linked list of ThreadInfo. google::protobuf::internal::AtomicWord hint_; // Fast thread-local block access google::protobuf::internal::AtomicWord space_allocated_; // Sum of sizes of all allocated blocks. Block *initial_block_; // If non-NULL, points to the block that came from // user data. // Returns a block owned by this thread. Block* GetBlock(size_t n); Block* GetBlockSlow(void* me, Block* my_full_block, size_t n); Block* NewBlock(void* me, Block* my_last_block, size_t min_bytes); void InitBlock(Block* b, void *me, size_t size); static void* AllocFromBlock(Block* b, size_t n); ThreadInfo* NewThreadInfo(Block* b); ThreadInfo* FindThreadInfo(void* me); ThreadInfo* GetThreadInfo(void* me, size_t n); int64 lifecycle_id_; // Unique for each arena. Changes on Reset(). Options options_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArenaImpl); public: // kHeaderSize is sizeof(Block), aligned up to the nearest multiple of 8 to // protect the invariant that pos is always at a multiple of 8. static const size_t kHeaderSize = (sizeof(Block) + 7) & -8; #if LANG_CXX11 static_assert(kHeaderSize % 8 == 0, "kHeaderSize must be a multiple of 8."); #endif }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ARENA_IMPL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/arena_test_util.cc000066400000000000000000000041021334102242000307570ustar00rootroot00000000000000// 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 #include #include #define EXPECT_EQ GOOGLE_CHECK_EQ namespace google { namespace protobuf { namespace internal { NoHeapChecker::~NoHeapChecker() { capture_alloc.Unhook(); EXPECT_EQ(0, capture_alloc.alloc_count()); EXPECT_EQ(0, capture_alloc.free_count()); } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/arena_test_util.h000066400000000000000000000064721334102242000306350ustar00rootroot00000000000000// 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_TEST_UTIL_H__ #define GOOGLE_PROTOBUF_ARENA_TEST_UTIL_H__ #include #include #include namespace google { namespace protobuf { template void TestParseCorruptedString(const T& message) { int success_count = 0; string s = message.SerializeAsString(); const int kMaxIters = 900; const int stride = s.size() <= kMaxIters ? 1 : s.size() / kMaxIters; const int start = stride == 1 || use_arena ? 0 : (stride + 1) / 2; for (int i = start; i < s.size(); i += stride) { for (int c = 1 + (i % 17); c < 256; c += 2 * c + (i & 3)) { s[i] ^= c; google::protobuf::Arena arena; T* message = google::protobuf::Arena::CreateMessage(use_arena ? &arena : NULL); if (message->ParseFromString(s)) { ++success_count; } if (!use_arena) { delete message; } s[i] ^= c; // Restore s to its original state. } } // This next line is a low bar. But getting through the test without crashing // due to use-after-free or other bugs is a big part of what we're checking. GOOGLE_CHECK_GT(success_count, 0); } namespace internal { class NoHeapChecker { public: NoHeapChecker() { capture_alloc.Hook(); } ~NoHeapChecker(); private: class NewDeleteCapture { public: // TOOD(xiaofeng): Implement this for opensource protobuf. void Hook() {} void Unhook() {} int alloc_count() { return 0; } int free_count() { return 0; } } capture_alloc; }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ARENA_TEST_UTIL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/arena_unittest.cc000066400000000000000000001461561334102242000306420ustar00rootroot00000000000000// 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 #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { using proto2_arena_unittest::ArenaMessage; using protobuf_unittest::TestAllTypes; using protobuf_unittest::TestAllExtensions; using protobuf_unittest::TestOneof2; using protobuf_unittest::TestEmptyMessage; namespace protobuf { namespace { class Notifier { public: Notifier() : count_(0) {} void Notify() { count_++; } int GetCount() { return count_; } private: int count_; }; class SimpleDataType { public: SimpleDataType() : notifier_(NULL) {} void SetNotifier(Notifier* notifier) { notifier_ = notifier; } virtual ~SimpleDataType() { if (notifier_ != NULL) { notifier_->Notify(); } }; private: Notifier* notifier_; }; // A simple class that does not allow copying and so cannot be used as a // parameter type without "const &". class PleaseDontCopyMe { public: explicit PleaseDontCopyMe(int value) : value_(value) {} int value() const { return value_; } private: int value_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PleaseDontCopyMe); }; // A class that takes four different types as constructor arguments. class MustBeConstructedWithOneThroughFour { public: MustBeConstructedWithOneThroughFour( int one, const char* two, const string& three, const PleaseDontCopyMe* four) : one_(one), two_(two), three_(three), four_(four) {} int one_; const char* const two_; string three_; const PleaseDontCopyMe* four_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MustBeConstructedWithOneThroughFour); }; // A class that takes eight different types as constructor arguments. class MustBeConstructedWithOneThroughEight { public: MustBeConstructedWithOneThroughEight( int one, const char* two, const string& three, const PleaseDontCopyMe* four, int five, const char* six, const string& seven, const string& eight) : one_(one), two_(two), three_(three), four_(four), five_(five), six_(six), seven_(seven), eight_(eight) {} int one_; const char* const two_; string three_; const PleaseDontCopyMe* four_; int five_; const char* const six_; string seven_; string eight_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MustBeConstructedWithOneThroughEight); }; TEST(ArenaTest, ArenaConstructable) { EXPECT_TRUE(Arena::is_arena_constructable::type::value); EXPECT_TRUE(Arena::is_arena_constructable::type::value); EXPECT_FALSE(Arena::is_arena_constructable::type::value); } TEST(ArenaTest, BasicCreate) { Arena arena; EXPECT_TRUE(Arena::Create(&arena) != NULL); EXPECT_TRUE(Arena::Create(&arena) != NULL); EXPECT_TRUE(Arena::Create(&arena) != NULL); EXPECT_TRUE(Arena::Create(&arena) != NULL); EXPECT_TRUE(Arena::Create(&arena) != NULL); arena.Own(new int32); arena.Own(new int64); arena.Own(new float); arena.Own(new double); arena.Own(new string); arena.Own(NULL); Notifier notifier; SimpleDataType* data = Arena::Create(&arena); data->SetNotifier(¬ifier); data = new SimpleDataType; data->SetNotifier(¬ifier); arena.Own(data); arena.Reset(); EXPECT_EQ(2, notifier.GetCount()); } TEST(ArenaTest, CreateAndConstCopy) { Arena arena; const string s("foo"); const string* s_copy = Arena::Create(&arena, s); EXPECT_TRUE(s_copy != NULL); EXPECT_EQ("foo", s); EXPECT_EQ("foo", *s_copy); } TEST(ArenaTest, CreateAndNonConstCopy) { Arena arena; string s("foo"); const string* s_copy = Arena::Create(&arena, s); EXPECT_TRUE(s_copy != NULL); EXPECT_EQ("foo", s); EXPECT_EQ("foo", *s_copy); } #if LANG_CXX11 TEST(ArenaTest, CreateAndMove) { Arena arena; string s("foo"); const string* s_move = Arena::Create(&arena, std::move(s)); EXPECT_TRUE(s_move != NULL); EXPECT_TRUE(s.empty()); // NOLINT EXPECT_EQ("foo", *s_move); } #endif TEST(ArenaTest, CreateWithFourConstructorArguments) { Arena arena; const string three("3"); const PleaseDontCopyMe four(4); const MustBeConstructedWithOneThroughFour* new_object = Arena::Create( &arena, 1, "2", three, &four); EXPECT_TRUE(new_object != NULL); ASSERT_EQ(1, new_object->one_); ASSERT_STREQ("2", new_object->two_); ASSERT_EQ("3", new_object->three_); ASSERT_EQ(4, new_object->four_->value()); } TEST(ArenaTest, CreateWithEightConstructorArguments) { Arena arena; const string three("3"); const PleaseDontCopyMe four(4); const string seven("7"); const string eight("8"); const MustBeConstructedWithOneThroughEight* new_object = Arena::Create( &arena, 1, "2", three, &four, 5, "6", seven, eight); EXPECT_TRUE(new_object != NULL); ASSERT_EQ(1, new_object->one_); ASSERT_STREQ("2", new_object->two_); ASSERT_EQ("3", new_object->three_); ASSERT_EQ(4, new_object->four_->value()); ASSERT_EQ(5, new_object->five_); ASSERT_STREQ("6", new_object->six_); ASSERT_EQ("7", new_object->seven_); ASSERT_EQ("8", new_object->eight_); } #if LANG_CXX11 class PleaseMoveMe { public: explicit PleaseMoveMe(const string& value) : value_(value) {} PleaseMoveMe(PleaseMoveMe&&) = default; PleaseMoveMe(const PleaseMoveMe&) = delete; const string& value() const { return value_; } private: string value_; }; TEST(ArenaTest, CreateWithMoveArguments) { Arena arena; PleaseMoveMe one("1"); const PleaseMoveMe* new_object = Arena::Create(&arena, std::move(one)); EXPECT_TRUE(new_object); ASSERT_EQ("1", new_object->value()); } #endif TEST(ArenaTest, InitialBlockTooSmall) { // Construct a small (64 byte) initial block of memory to be used by the // arena allocator; then, allocate an object which will not fit in the // initial block. std::vector arena_block(72); ArenaOptions options; options.initial_block = &arena_block[0]; options.initial_block_size = arena_block.size(); Arena arena(options); char* p = ::google::protobuf::Arena::CreateArray(&arena, 96); uintptr_t allocation = reinterpret_cast(p); // Ensure that the arena allocator did not return memory pointing into the // initial block of memory. uintptr_t arena_start = reinterpret_cast(&arena_block[0]); uintptr_t arena_end = arena_start + arena_block.size(); EXPECT_FALSE(allocation >= arena_start && allocation < arena_end); // Write to the memory we allocated; this should (but is not guaranteed to) // trigger a check for heap corruption if the object was allocated from the // initially-provided block. memset(p, '\0', 96); } TEST(ArenaTest, Parsing) { TestAllTypes original; TestUtil::SetAllFields(&original); // Test memory leak. Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->ParseFromString(original.SerializeAsString()); TestUtil::ExpectAllFieldsSet(*arena_message); // Test that string fields have nul terminator bytes (earlier bug). EXPECT_EQ(strlen(original.optional_string().c_str()), strlen(arena_message->optional_string().c_str())); } TEST(ArenaTest, UnknownFields) { TestAllTypes original; TestUtil::SetAllFields(&original); // Test basic parsing into (populating) and reading out of unknown fields on // an arena. Arena arena; TestEmptyMessage* arena_message = Arena::CreateMessage(&arena); arena_message->ParseFromString(original.SerializeAsString()); TestAllTypes copied; copied.ParseFromString(arena_message->SerializeAsString()); TestUtil::ExpectAllFieldsSet(copied); // Exercise UFS manual manipulation (setters). arena_message = Arena::CreateMessage(&arena); arena_message->mutable_unknown_fields()->AddVarint( TestAllTypes::kOptionalInt32FieldNumber, 42); copied.Clear(); copied.ParseFromString(arena_message->SerializeAsString()); EXPECT_TRUE(copied.has_optional_int32()); EXPECT_EQ(42, copied.optional_int32()); // Exercise UFS swap path. TestEmptyMessage* arena_message_2 = Arena::CreateMessage(&arena); arena_message_2->Swap(arena_message); copied.Clear(); copied.ParseFromString(arena_message_2->SerializeAsString()); EXPECT_TRUE(copied.has_optional_int32()); EXPECT_EQ(42, copied.optional_int32()); // Test field manipulation. TestEmptyMessage* arena_message_3 = Arena::CreateMessage(&arena); arena_message_3->mutable_unknown_fields()->AddVarint(1000, 42); arena_message_3->mutable_unknown_fields()->AddFixed32(1001, 42); arena_message_3->mutable_unknown_fields()->AddFixed64(1002, 42); arena_message_3->mutable_unknown_fields()->AddLengthDelimited(1003); arena_message_3->mutable_unknown_fields()->DeleteSubrange(0, 2); arena_message_3->mutable_unknown_fields()->DeleteByNumber(1002); arena_message_3->mutable_unknown_fields()->DeleteByNumber(1003); EXPECT_TRUE(arena_message_3->unknown_fields().empty()); } TEST(ArenaTest, Swap) { Arena arena1; Arena arena2; TestAllTypes* arena1_message; TestAllTypes* arena2_message; // Case 1: Swap(), no UFS on either message, both messages on different // arenas. Arena pointers should remain the same after swap. arena1_message = Arena::CreateMessage(&arena1); arena2_message = Arena::CreateMessage(&arena2); arena1_message->Swap(arena2_message); EXPECT_EQ(&arena1, arena1_message->GetArena()); EXPECT_EQ(&arena2, arena2_message->GetArena()); // Case 2: Swap(), UFS on one message, both messages on different arenas. arena1_message = Arena::CreateMessage(&arena1); arena2_message = Arena::CreateMessage(&arena2); arena1_message->mutable_unknown_fields()->AddVarint(1, 42); arena1_message->Swap(arena2_message); EXPECT_EQ(&arena1, arena1_message->GetArena()); EXPECT_EQ(&arena2, arena2_message->GetArena()); EXPECT_EQ(0, arena1_message->unknown_fields().field_count()); EXPECT_EQ(1, arena2_message->unknown_fields().field_count()); EXPECT_EQ(42, arena2_message->unknown_fields().field(0).varint()); // Case 3: Swap(), UFS on both messages, both messages on different arenas. arena1_message = Arena::CreateMessage(&arena1); arena2_message = Arena::CreateMessage(&arena2); arena1_message->mutable_unknown_fields()->AddVarint(1, 42); arena2_message->mutable_unknown_fields()->AddVarint(2, 84); arena1_message->Swap(arena2_message); EXPECT_EQ(&arena1, arena1_message->GetArena()); EXPECT_EQ(&arena2, arena2_message->GetArena()); EXPECT_EQ(1, arena1_message->unknown_fields().field_count()); EXPECT_EQ(1, arena2_message->unknown_fields().field_count()); EXPECT_EQ(84, arena1_message->unknown_fields().field(0).varint()); EXPECT_EQ(42, arena2_message->unknown_fields().field(0).varint()); } TEST(ArenaTest, ReflectionSwapFields) { Arena arena1; Arena arena2; TestAllTypes* arena1_message; TestAllTypes* arena2_message; // Case 1: messages on different arenas, only one message is set. arena1_message = Arena::CreateMessage(&arena1); arena2_message = Arena::CreateMessage(&arena2); TestUtil::SetAllFields(arena1_message); const Reflection* reflection = arena1_message->GetReflection(); std::vector fields; reflection->ListFields(*arena1_message, &fields); reflection->SwapFields(arena1_message, arena2_message, fields); EXPECT_EQ(&arena1, arena1_message->GetArena()); EXPECT_EQ(&arena2, arena2_message->GetArena()); string output; arena1_message->SerializeToString(&output); EXPECT_EQ(0, output.size()); TestUtil::ExpectAllFieldsSet(*arena2_message); reflection->SwapFields(arena1_message, arena2_message, fields); arena2_message->SerializeToString(&output); EXPECT_EQ(0, output.size()); TestUtil::ExpectAllFieldsSet(*arena1_message); // Case 2: messages on different arenas, both messages are set. arena1_message = Arena::CreateMessage(&arena1); arena2_message = Arena::CreateMessage(&arena2); TestUtil::SetAllFields(arena1_message); TestUtil::SetAllFields(arena2_message); reflection->SwapFields(arena1_message, arena2_message, fields); EXPECT_EQ(&arena1, arena1_message->GetArena()); EXPECT_EQ(&arena2, arena2_message->GetArena()); TestUtil::ExpectAllFieldsSet(*arena1_message); TestUtil::ExpectAllFieldsSet(*arena2_message); // Case 3: messages on different arenas with different lifetimes. arena1_message = Arena::CreateMessage(&arena1); { Arena arena3; TestAllTypes* arena3_message = Arena::CreateMessage(&arena3); TestUtil::SetAllFields(arena3_message); reflection->SwapFields(arena1_message, arena3_message, fields); } TestUtil::ExpectAllFieldsSet(*arena1_message); // Case 4: one message on arena, the other on heap. arena1_message = Arena::CreateMessage(&arena1); TestAllTypes message; TestUtil::SetAllFields(arena1_message); reflection->SwapFields(arena1_message, &message, fields); EXPECT_EQ(&arena1, arena1_message->GetArena()); EXPECT_EQ(NULL, message.GetArena()); arena1_message->SerializeToString(&output); EXPECT_EQ(0, output.size()); TestUtil::ExpectAllFieldsSet(message); } TEST(ArenaTest, SetAllocatedMessage) { Arena arena; TestAllTypes *arena_message = Arena::CreateMessage(&arena); TestAllTypes::NestedMessage* nested = new TestAllTypes::NestedMessage; nested->set_bb(118); arena_message->set_allocated_optional_nested_message(nested); EXPECT_EQ(118, arena_message->optional_nested_message().bb()); protobuf_unittest_no_arena::TestNoArenaMessage no_arena_message; EXPECT_FALSE(no_arena_message.has_arena_message()); no_arena_message.set_allocated_arena_message(NULL); EXPECT_FALSE(no_arena_message.has_arena_message()); no_arena_message.set_allocated_arena_message(new ArenaMessage); EXPECT_TRUE(no_arena_message.has_arena_message()); } TEST(ArenaTest, ReleaseMessage) { Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->mutable_optional_nested_message()->set_bb(118); google::protobuf::scoped_ptr nested( arena_message->release_optional_nested_message()); EXPECT_EQ(118, nested->bb()); TestAllTypes::NestedMessage* released_null = arena_message->release_optional_nested_message(); EXPECT_EQ(NULL, released_null); } TEST(ArenaTest, SetAllocatedString) { Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); string* allocated_str = new string("hello"); arena_message->set_allocated_optional_string(allocated_str); EXPECT_EQ("hello", arena_message->optional_string()); } TEST(ArenaTest, ReleaseString) { Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->set_optional_string("hello"); google::protobuf::scoped_ptr released_str( arena_message->release_optional_string()); EXPECT_EQ("hello", *released_str); // Test default value. } TEST(ArenaTest, SwapBetweenArenasWithAllFieldsSet) { Arena arena1; TestAllTypes* arena1_message = Arena::CreateMessage(&arena1); { Arena arena2; TestAllTypes* arena2_message = Arena::CreateMessage(&arena2); TestUtil::SetAllFields(arena2_message); arena2_message->Swap(arena1_message); string output; arena2_message->SerializeToString(&output); EXPECT_EQ(0, output.size()); } TestUtil::ExpectAllFieldsSet(*arena1_message); } TEST(ArenaTest, SwapBetweenArenaAndNonArenaWithAllFieldsSet) { TestAllTypes non_arena_message; TestUtil::SetAllFields(&non_arena_message); { Arena arena2; TestAllTypes* arena2_message = Arena::CreateMessage(&arena2); TestUtil::SetAllFields(arena2_message); arena2_message->Swap(&non_arena_message); TestUtil::ExpectAllFieldsSet(*arena2_message); TestUtil::ExpectAllFieldsSet(non_arena_message); } } TEST(ArenaTest, UnsafeArenaSwap) { Arena shared_arena; TestAllTypes* message1 = Arena::CreateMessage(&shared_arena); TestAllTypes* message2 = Arena::CreateMessage(&shared_arena); TestUtil::SetAllFields(message1); message1->UnsafeArenaSwap(message2); TestUtil::ExpectAllFieldsSet(*message2); } TEST(ArenaTest, SwapBetweenArenasUsingReflection) { Arena arena1; TestAllTypes* arena1_message = Arena::CreateMessage(&arena1); { Arena arena2; TestAllTypes* arena2_message = Arena::CreateMessage(&arena2); TestUtil::SetAllFields(arena2_message); const Reflection* r = arena2_message->GetReflection(); r->Swap(arena1_message, arena2_message); string output; arena2_message->SerializeToString(&output); EXPECT_EQ(0, output.size()); } TestUtil::ExpectAllFieldsSet(*arena1_message); } TEST(ArenaTest, SwapBetweenArenaAndNonArenaUsingReflection) { TestAllTypes non_arena_message; TestUtil::SetAllFields(&non_arena_message); { Arena arena2; TestAllTypes* arena2_message = Arena::CreateMessage(&arena2); TestUtil::SetAllFields(arena2_message); const Reflection* r = arena2_message->GetReflection(); r->Swap(&non_arena_message, arena2_message); TestUtil::ExpectAllFieldsSet(*arena2_message); TestUtil::ExpectAllFieldsSet(non_arena_message); } } TEST(ArenaTest, ReleaseFromArenaMessageMakesCopy) { TestAllTypes::NestedMessage* nested_msg = NULL; string* nested_string = NULL; { Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->mutable_optional_nested_message()->set_bb(42); *arena_message->mutable_optional_string() = "Hello"; nested_msg = arena_message->release_optional_nested_message(); nested_string = arena_message->release_optional_string(); } EXPECT_EQ(42, nested_msg->bb()); EXPECT_EQ("Hello", *nested_string); delete nested_msg; delete nested_string; } #ifndef GOOGLE_PROTOBUF_NO_RTTI TEST(ArenaTest, ReleaseFromArenaMessageUsingReflectionMakesCopy) { TestAllTypes::NestedMessage* nested_msg = NULL; // Note: no string: reflection API only supports releasing submessages. { Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->mutable_optional_nested_message()->set_bb(42); const Reflection* r = arena_message->GetReflection(); const FieldDescriptor* f = arena_message->GetDescriptor()->FindFieldByName( "optional_nested_message"); nested_msg = static_cast( r->ReleaseMessage(arena_message, f)); } EXPECT_EQ(42, nested_msg->bb()); delete nested_msg; } #endif // !GOOGLE_PROTOBUF_NO_RTTI TEST(ArenaTest, UnsafeArenaReleaseDoesNotMakeCopy) { Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); TestAllTypes::NestedMessage* nested_msg = NULL; TestAllTypes::NestedMessage* orig_nested_msg = NULL; string* nested_string = NULL; string* orig_nested_string = NULL; arena_message->mutable_optional_nested_message()->set_bb(42); *arena_message->mutable_optional_string() = "Hello"; orig_nested_msg = arena_message->mutable_optional_nested_message(); orig_nested_string = arena_message->mutable_optional_string(); nested_msg = arena_message->unsafe_arena_release_optional_nested_message(); nested_string = arena_message->unsafe_arena_release_optional_string(); EXPECT_EQ(orig_nested_msg, nested_msg); EXPECT_EQ(orig_nested_string, nested_string); // Released pointers still on arena; no 'delete' calls needed here. } TEST(ArenaTest, SetAllocatedAcrossArenas) { Arena arena1; TestAllTypes* arena1_message = Arena::CreateMessage(&arena1); TestAllTypes::NestedMessage* heap_submessage = new TestAllTypes::NestedMessage(); heap_submessage->set_bb(42); arena1_message->set_allocated_optional_nested_message(heap_submessage); // Should keep same object and add to arena's Own()-list. EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message()); { Arena arena2; TestAllTypes::NestedMessage* arena2_submessage = Arena::CreateMessage(&arena2); arena2_submessage->set_bb(42); arena1_message->set_allocated_optional_nested_message(arena2_submessage); EXPECT_NE(arena2_submessage, arena1_message->mutable_optional_nested_message()); } TestAllTypes::NestedMessage* arena1_submessage = Arena::CreateMessage(&arena1); arena1_submessage->set_bb(42); TestAllTypes* heap_message = new TestAllTypes; heap_message->set_allocated_optional_nested_message(arena1_submessage); EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message()); delete heap_message; } TEST(ArenaTest, SetAllocatedAcrossArenasWithReflection) { // Same as above, with reflection. Arena arena1; TestAllTypes* arena1_message = Arena::CreateMessage(&arena1); const Reflection* r = arena1_message->GetReflection(); const Descriptor* d = arena1_message->GetDescriptor(); const FieldDescriptor* msg_field = d->FindFieldByName( "optional_nested_message"); TestAllTypes::NestedMessage* heap_submessage = new TestAllTypes::NestedMessage(); heap_submessage->set_bb(42); r->SetAllocatedMessage(arena1_message, heap_submessage, msg_field); // Should keep same object and add to arena's Own()-list. EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message()); { Arena arena2; TestAllTypes::NestedMessage* arena2_submessage = Arena::CreateMessage(&arena2); arena2_submessage->set_bb(42); r->SetAllocatedMessage(arena1_message, arena2_submessage, msg_field); EXPECT_NE(arena2_submessage, arena1_message->mutable_optional_nested_message()); } TestAllTypes::NestedMessage* arena1_submessage = Arena::CreateMessage(&arena1); arena1_submessage->set_bb(42); TestAllTypes* heap_message = new TestAllTypes; r->SetAllocatedMessage(heap_message, arena1_submessage, msg_field); EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message()); delete heap_message; } TEST(ArenaTest, AddAllocatedWithReflection) { Arena arena1; ArenaMessage* arena1_message = Arena::CreateMessage(&arena1); const Reflection* r = arena1_message->GetReflection(); const Descriptor* d = arena1_message->GetDescriptor(); const FieldDescriptor* fd = d->FindFieldByName("repeated_import_no_arena_message"); // Message with cc_enable_arenas = false; r->AddMessage(arena1_message, fd); r->AddMessage(arena1_message, fd); r->AddMessage(arena1_message, fd); EXPECT_EQ(3, r->FieldSize(*arena1_message, fd)); // Message with cc_enable_arenas = true; fd = d->FindFieldByName("repeated_nested_message"); r->AddMessage(arena1_message, fd); r->AddMessage(arena1_message, fd); r->AddMessage(arena1_message, fd); EXPECT_EQ(3, r->FieldSize(*arena1_message, fd)); } TEST(ArenaTest, RepeatedPtrFieldAddClearedTest) { { RepeatedPtrField repeated_field; EXPECT_TRUE(repeated_field.empty()); EXPECT_EQ(0, repeated_field.size()); // Ownership is passed to repeated_field. TestAllTypes* cleared = new TestAllTypes(); repeated_field.AddCleared(cleared); EXPECT_TRUE(repeated_field.empty()); EXPECT_EQ(0, repeated_field.size()); } { RepeatedPtrField repeated_field; EXPECT_TRUE(repeated_field.empty()); EXPECT_EQ(0, repeated_field.size()); // Ownership is passed to repeated_field. TestAllTypes* cleared = new TestAllTypes(); repeated_field.AddAllocated(cleared); EXPECT_FALSE(repeated_field.empty()); EXPECT_EQ(1, repeated_field.size()); } } TEST(ArenaTest, AddAllocatedToRepeatedField) { // Heap->arena case. Arena arena1; TestAllTypes* arena1_message = Arena::CreateMessage(&arena1); for (int i = 0; i < 10; i++) { TestAllTypes::NestedMessage* heap_submessage = new TestAllTypes::NestedMessage(); heap_submessage->set_bb(42); arena1_message->mutable_repeated_nested_message()-> AddAllocated(heap_submessage); // Should not copy object -- will use arena_->Own(). EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(i)); EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb()); } // Arena1->Arena2 case. arena1_message->Clear(); for (int i = 0; i < 10; i++) { Arena arena2; TestAllTypes::NestedMessage* arena2_submessage = Arena::CreateMessage(&arena2); arena2_submessage->set_bb(42); arena1_message->mutable_repeated_nested_message()-> AddAllocated(arena2_submessage); // Should copy object. EXPECT_NE(arena2_submessage, &arena1_message->repeated_nested_message(i)); EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb()); } // Arena->heap case. TestAllTypes* heap_message = new TestAllTypes(); for (int i = 0; i < 10; i++) { Arena arena2; TestAllTypes::NestedMessage* arena2_submessage = Arena::CreateMessage(&arena2); arena2_submessage->set_bb(42); heap_message->mutable_repeated_nested_message()-> AddAllocated(arena2_submessage); // Should copy object. EXPECT_NE(arena2_submessage, &heap_message->repeated_nested_message(i)); EXPECT_EQ(42, heap_message->repeated_nested_message(i).bb()); } delete heap_message; // Heap-arena case for strings (which are not arena-allocated). arena1_message->Clear(); for (int i = 0; i < 10; i++) { string* s = new string("Test"); arena1_message->mutable_repeated_string()-> AddAllocated(s); // Should not copy. EXPECT_EQ(s, &arena1_message->repeated_string(i)); EXPECT_EQ("Test", arena1_message->repeated_string(i)); } } TEST(ArenaTest, AddAllocatedToRepeatedFieldViaReflection) { // Heap->arena case. Arena arena1; TestAllTypes* arena1_message = Arena::CreateMessage(&arena1); const Reflection* r = arena1_message->GetReflection(); const Descriptor* d = arena1_message->GetDescriptor(); const FieldDescriptor* fd = d->FindFieldByName("repeated_nested_message"); for (int i = 0; i < 10; i++) { TestAllTypes::NestedMessage* heap_submessage = new TestAllTypes::NestedMessage; heap_submessage->set_bb(42); r->AddAllocatedMessage(arena1_message, fd, heap_submessage); // Should not copy object -- will use arena_->Own(). EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(i)); EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb()); } // Arena1->Arena2 case. arena1_message->Clear(); for (int i = 0; i < 10; i++) { Arena arena2; TestAllTypes::NestedMessage* arena2_submessage = Arena::CreateMessage(&arena2); arena2_submessage->set_bb(42); r->AddAllocatedMessage(arena1_message, fd, arena2_submessage); // Should copy object. EXPECT_NE(arena2_submessage, &arena1_message->repeated_nested_message(i)); EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb()); } // Arena->heap case. TestAllTypes* heap_message = new TestAllTypes; for (int i = 0; i < 10; i++) { Arena arena2; TestAllTypes::NestedMessage* arena2_submessage = Arena::CreateMessage(&arena2); arena2_submessage->set_bb(42); r->AddAllocatedMessage(heap_message, fd, arena2_submessage); // Should copy object. EXPECT_NE(arena2_submessage, &heap_message->repeated_nested_message(i)); EXPECT_EQ(42, heap_message->repeated_nested_message(i).bb()); } delete heap_message; } TEST(ArenaTest, ReleaseLastRepeatedField) { // Release from arena-allocated repeated field and ensure that returned object // is heap-allocated. Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); for (int i = 0; i < 10; i++) { TestAllTypes::NestedMessage* nested = Arena::CreateMessage(&arena); nested->set_bb(42); arena_message->mutable_repeated_nested_message()->AddAllocated(nested); } for (int i = 0; i < 10; i++) { const TestAllTypes::NestedMessage *orig_submessage = &arena_message->repeated_nested_message(10 - 1 - i); // last element TestAllTypes::NestedMessage *released = arena_message->mutable_repeated_nested_message()->ReleaseLast(); EXPECT_NE(released, orig_submessage); EXPECT_EQ(42, released->bb()); delete released; } // Test UnsafeArenaReleaseLast(). for (int i = 0; i < 10; i++) { TestAllTypes::NestedMessage* nested = Arena::CreateMessage(&arena); nested->set_bb(42); arena_message->mutable_repeated_nested_message()->AddAllocated(nested); } for (int i = 0; i < 10; i++) { const TestAllTypes::NestedMessage *orig_submessage = &arena_message->repeated_nested_message(10 - 1 - i); // last element TestAllTypes::NestedMessage *released = arena_message->mutable_repeated_nested_message()-> UnsafeArenaReleaseLast(); EXPECT_EQ(released, orig_submessage); EXPECT_EQ(42, released->bb()); // no delete -- |released| is on the arena. } // Test string case as well. ReleaseLast() in this case must copy the string, // even though it was originally heap-allocated and its pointer was simply // appended to the repeated field's internal vector, because the string was // placed on the arena's destructor list and cannot be removed from that list // (so the arena permanently owns the original instance). arena_message->Clear(); for (int i = 0; i < 10; i++) { string* s = new string("Test"); arena_message->mutable_repeated_string()->AddAllocated(s); } for (int i = 0; i < 10; i++) { const string* orig_element = &arena_message->repeated_string(10 - 1 - i); string* released = arena_message->mutable_repeated_string()->ReleaseLast(); EXPECT_NE(released, orig_element); EXPECT_EQ("Test", *released); delete released; } } TEST(ArenaTest, UnsafeArenaReleaseAdd) { // Use unsafe_arena_release() and unsafe_arena_set_allocated() to transfer an // arena-allocated string from one message to another. Arena arena; TestAllTypes* message1 = Arena::CreateMessage(&arena); TestAllTypes* message2 = Arena::CreateMessage(&arena); string* arena_string = Arena::Create(&arena); *arena_string = "Test content"; message1->unsafe_arena_set_allocated_optional_string(arena_string); EXPECT_EQ(arena_string, message1->mutable_optional_string()); message2->unsafe_arena_set_allocated_optional_string( message1->unsafe_arena_release_optional_string()); EXPECT_EQ(arena_string, message2->mutable_optional_string()); } TEST(ArenaTest, UnsafeArenaAddAllocated) { Arena arena; TestAllTypes* message = Arena::CreateMessage(&arena); for (int i = 0; i < 10; i++) { string* arena_string = Arena::Create(&arena); message->mutable_repeated_string()->UnsafeArenaAddAllocated(arena_string); EXPECT_EQ(arena_string, message->mutable_repeated_string(i)); } } TEST(ArenaTest, UnsafeArenaRelease) { Arena arena; TestAllTypes* message = Arena::CreateMessage(&arena); string* s = new string("test string"); message->unsafe_arena_set_allocated_optional_string(s); EXPECT_TRUE(message->has_optional_string()); EXPECT_EQ("test string", message->optional_string()); s = message->unsafe_arena_release_optional_string(); EXPECT_FALSE(message->has_optional_string()); delete s; s = new string("test string"); message->unsafe_arena_set_allocated_oneof_string(s); EXPECT_TRUE(message->has_oneof_string()); EXPECT_EQ("test string", message->oneof_string()); s = message->unsafe_arena_release_oneof_string(); EXPECT_FALSE(message->has_oneof_string()); delete s; } TEST(ArenaTest, OneofMerge) { Arena arena; TestAllTypes* message0 = Arena::CreateMessage(&arena); TestAllTypes* message1 = Arena::CreateMessage(&arena); message0->unsafe_arena_set_allocated_oneof_string(new string("x")); ASSERT_TRUE(message0->has_oneof_string()); message1->unsafe_arena_set_allocated_oneof_string(new string("y")); ASSERT_TRUE(message1->has_oneof_string()); EXPECT_EQ("x", message0->oneof_string()); EXPECT_EQ("y", message1->oneof_string()); message0->MergeFrom(*message1); EXPECT_EQ("y", message0->oneof_string()); EXPECT_EQ("y", message1->oneof_string()); delete message0->unsafe_arena_release_oneof_string(); delete message1->unsafe_arena_release_oneof_string(); } TEST(ArenaTest, ArenaOneofReflection) { Arena arena; TestAllTypes* message = Arena::CreateMessage(&arena); const Descriptor* desc = message->GetDescriptor(); const Reflection* refl = message->GetReflection(); const FieldDescriptor* string_field = desc->FindFieldByName( "oneof_string"); const FieldDescriptor* msg_field = desc->FindFieldByName( "oneof_nested_message"); const OneofDescriptor* oneof = desc->FindOneofByName( "oneof_field"); refl->SetString(message, string_field, "Test value"); EXPECT_TRUE(refl->HasOneof(*message, oneof)); refl->ClearOneof(message, oneof); EXPECT_FALSE(refl->HasOneof(*message, oneof)); Message* submsg = refl->MutableMessage(message, msg_field); EXPECT_TRUE(refl->HasOneof(*message, oneof)); refl->ClearOneof(message, oneof); EXPECT_FALSE(refl->HasOneof(*message, oneof)); refl->MutableMessage(message, msg_field); EXPECT_TRUE(refl->HasOneof(*message, oneof)); submsg = refl->ReleaseMessage(message, msg_field); EXPECT_FALSE(refl->HasOneof(*message, oneof)); EXPECT_TRUE(submsg->GetArena() == NULL); delete submsg; } void TestSwapRepeatedField(Arena* arena1, Arena* arena2) { // Test "safe" (copying) semantics for direct Swap() on RepeatedPtrField // between arenas. RepeatedPtrField field1(arena1); RepeatedPtrField field2(arena2); for (int i = 0; i < 10; i++) { TestAllTypes* t = Arena::CreateMessage(arena1); t->set_optional_string("field1"); t->set_optional_int32(i); if (arena1 != NULL) { field1.UnsafeArenaAddAllocated(t); } else { field1.AddAllocated(t); } } for (int i = 0; i < 5; i++) { TestAllTypes* t = Arena::CreateMessage(arena2); t->set_optional_string("field2"); t->set_optional_int32(i); if (arena2 != NULL) { field2.UnsafeArenaAddAllocated(t); } else { field2.AddAllocated(t); } } field1.Swap(&field2); EXPECT_EQ(5, field1.size()); EXPECT_EQ(10, field2.size()); EXPECT_TRUE(string("field1") == field2.Get(0).optional_string()); EXPECT_TRUE(string("field2") == field1.Get(0).optional_string()); // Ensure that fields retained their original order: for (int i = 0; i < field1.size(); i++) { EXPECT_EQ(i, field1.Get(i).optional_int32()); } for (int i = 0; i < field2.size(); i++) { EXPECT_EQ(i, field2.Get(i).optional_int32()); } } TEST(ArenaTest, SwapRepeatedField) { Arena arena; TestSwapRepeatedField(&arena, &arena); } TEST(ArenaTest, SwapRepeatedFieldWithDifferentArenas) { Arena arena1; Arena arena2; TestSwapRepeatedField(&arena1, &arena2); } TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnRightHandSide) { Arena arena; TestSwapRepeatedField(&arena, NULL); } TEST(ArenaTest, SwapRepeatedFieldWithNoArenaOnLeftHandSide) { Arena arena; TestSwapRepeatedField(NULL, &arena); } TEST(ArenaTest, ExtensionsOnArena) { Arena arena; // Ensure no leaks. TestAllExtensions* message_ext = Arena::CreateMessage(&arena); message_ext->SetExtension( protobuf_unittest::optional_int32_extension, 42); message_ext->SetExtension( protobuf_unittest::optional_string_extension, string("test")); message_ext->MutableExtension( protobuf_unittest::optional_nested_message_extension)->set_bb(42); } TEST(ArenaTest, RepeatedFieldOnArena) { // Preallocate an initial arena block to avoid mallocs during hooked region. std::vector arena_block(1024 * 1024); ArenaOptions options; options.initial_block = &arena_block[0]; options.initial_block_size = arena_block.size(); Arena arena(options); { internal::NoHeapChecker no_heap; // Fill some repeated fields on the arena to test for leaks. Also verify no // memory allocations. RepeatedField repeated_int32(&arena); RepeatedPtrField repeated_message(&arena); for (int i = 0; i < 100; i++) { repeated_int32.Add(42); repeated_message.Add()->set_optional_int32(42); EXPECT_EQ(&arena, repeated_message.Get(0).GetArena()); const TestAllTypes* msg_in_repeated_field = &repeated_message.Get(0); TestAllTypes* msg = repeated_message.UnsafeArenaReleaseLast(); EXPECT_EQ(msg_in_repeated_field, msg); } // UnsafeArenaExtractSubrange (i) should not leak and (ii) should return // on-arena pointers. for (int i = 0; i < 10; i++) { repeated_message.Add()->set_optional_int32(42); } TestAllTypes* extracted_messages[5]; repeated_message.UnsafeArenaExtractSubrange(0, 5, extracted_messages); EXPECT_EQ(&arena, repeated_message.Get(0).GetArena()); EXPECT_EQ(5, repeated_message.size()); } // Now, outside the scope of the NoHeapChecker, test ExtractSubrange's copying // semantics. { RepeatedPtrField repeated_message(&arena); for (int i = 0; i < 100; i++) { repeated_message.Add()->set_optional_int32(42); } TestAllTypes* extracted_messages[5]; // ExtractSubrange should copy to the heap. repeated_message.ExtractSubrange(0, 5, extracted_messages); EXPECT_EQ(NULL, 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; } } // Now check that we can create RepeatedFields/RepeatedPtrFields themselves on // the arena. They have the necessary type traits so that they can behave like // messages in this way. This is useful for higher-level generic templated // code that may allocate messages or repeated fields of messages on an arena. { RepeatedPtrField* repeated_ptr_on_arena = Arena::CreateMessage< RepeatedPtrField >(&arena); for (int i = 0; i < 10; i++) { // Add some elements and let the leak-checker ensure that everything is // freed. repeated_ptr_on_arena->Add(); } RepeatedField* repeated_int_on_arena = Arena::CreateMessage< RepeatedField >(&arena); for (int i = 0; i < 100; i++) { repeated_int_on_arena->Add(i); } } arena.Reset(); } #ifndef GOOGLE_PROTOBUF_NO_RTTI TEST(ArenaTest, MutableMessageReflection) { Arena arena; TestAllTypes* message = Arena::CreateMessage(&arena); const Reflection* r = message->GetReflection(); const Descriptor* d = message->GetDescriptor(); const FieldDescriptor* field = d->FindFieldByName("optional_nested_message"); TestAllTypes::NestedMessage* submessage = static_cast( r->MutableMessage(message, field)); TestAllTypes::NestedMessage* submessage_expected = message->mutable_optional_nested_message(); EXPECT_EQ(submessage_expected, submessage); EXPECT_EQ(&arena, submessage->GetArena()); const FieldDescriptor* oneof_field = d->FindFieldByName("oneof_nested_message"); submessage = static_cast( r->MutableMessage(message, oneof_field)); submessage_expected = message->mutable_oneof_nested_message(); EXPECT_EQ(submessage_expected, submessage); EXPECT_EQ(&arena, submessage->GetArena()); } #endif // !GOOGLE_PROTOBUF_NO_RTTI void FillArenaAwareFields(TestAllTypes* message) { string test_string = "hello world"; message->set_optional_int32(42); message->set_optional_string(test_string); message->set_optional_bytes(test_string); message->mutable_optional_nested_message()->set_bb(42); message->set_oneof_uint32(42); message->mutable_oneof_nested_message()->set_bb(42); message->set_oneof_string(test_string); message->set_oneof_bytes(test_string); message->add_repeated_int32(42); // No repeated string: not yet arena-aware. message->add_repeated_nested_message()->set_bb(42); message->mutable_optional_lazy_message()->set_bb(42); } // Test: no allocations occur on heap while touching all supported field types. TEST(ArenaTest, NoHeapAllocationsTest) { // Allocate a large initial block to avoid mallocs during hooked test. std::vector arena_block(128 * 1024); ArenaOptions options; options.initial_block = &arena_block[0]; options.initial_block_size = arena_block.size(); Arena arena(options); { TestAllTypes* message = Arena::CreateMessage(&arena); FillArenaAwareFields(message); } arena.Reset(); } TEST(ArenaTest, ParseCorruptedString) { TestAllTypes message; TestUtil::SetAllFields(&message); TestParseCorruptedString(message); TestParseCorruptedString(message); } #ifndef GOOGLE_PROTOBUF_NO_RTTI // Test construction on an arena via generic MessageLite interface. We should be // able to successfully deserialize on the arena without incurring heap // allocations, i.e., everything should still be arena-allocation-aware. TEST(ArenaTest, MessageLiteOnArena) { std::vector arena_block(128 * 1024); ArenaOptions options; options.initial_block = &arena_block[0]; options.initial_block_size = arena_block.size(); Arena arena(options); const google::protobuf::MessageLite* prototype = &TestAllTypes::default_instance(); TestAllTypes initial_message; FillArenaAwareFields(&initial_message); string serialized; initial_message.SerializeToString(&serialized); { google::protobuf::MessageLite* generic_message = prototype->New(&arena); EXPECT_TRUE(generic_message != NULL); EXPECT_EQ(&arena, generic_message->GetArena()); EXPECT_TRUE(generic_message->ParseFromString(serialized)); TestAllTypes* deserialized = static_cast(generic_message); EXPECT_EQ(42, deserialized->optional_int32()); } arena.Reset(); } #endif // !GOOGLE_PROTOBUF_NO_RTTI // RepeatedField should support non-POD types, and invoke constructors and // destructors appropriately, because it's used this way by lots of other code // (even if this was not its original intent). TEST(ArenaTest, RepeatedFieldWithNonPODType) { { RepeatedField field_on_heap; for (int i = 0; i < 100; i++) { *field_on_heap.Add() = "test string long enough to exceed inline buffer"; } } { Arena arena; RepeatedField field_on_arena(&arena); for (int i = 0; i < 100; i++) { *field_on_arena.Add() = "test string long enough to exceed inline buffer"; } } } // Align n to next multiple of 8 uint64 Align8(uint64 n) { return (n + 7) & -8; } TEST(ArenaTest, SpaceAllocated_and_Used) { ArenaOptions options; options.start_block_size = 256; options.max_block_size = 8192; Arena arena_1(options); EXPECT_EQ(0, arena_1.SpaceAllocated()); EXPECT_EQ(0, arena_1.SpaceUsed()); EXPECT_EQ(0, arena_1.Reset()); ::google::protobuf::Arena::CreateArray(&arena_1, 320); // Arena will allocate slightly more than 320 for the block headers. EXPECT_LE(320, arena_1.SpaceAllocated()); EXPECT_EQ(Align8(320), arena_1.SpaceUsed()); EXPECT_LE(320, arena_1.Reset()); // Test with initial block. std::vector arena_block(1024); options.initial_block = &arena_block[0]; options.initial_block_size = arena_block.size(); Arena arena_2(options); EXPECT_EQ(1024, arena_2.SpaceAllocated()); EXPECT_EQ(0, arena_2.SpaceUsed()); EXPECT_EQ(1024, arena_2.Reset()); ::google::protobuf::Arena::CreateArray(&arena_2, 55); EXPECT_EQ(1024, arena_2.SpaceAllocated()); EXPECT_EQ(Align8(55), arena_2.SpaceUsed()); EXPECT_EQ(1024, arena_2.Reset()); // Reset options to test doubling policy explicitly. options.initial_block = NULL; options.initial_block_size = 0; Arena arena_3(options); EXPECT_EQ(0, arena_3.SpaceUsed()); ::google::protobuf::Arena::CreateArray(&arena_3, 182); EXPECT_EQ(256, arena_3.SpaceAllocated()); EXPECT_EQ(Align8(182), arena_3.SpaceUsed()); ::google::protobuf::Arena::CreateArray(&arena_3, 70); EXPECT_EQ(256 + 512, arena_3.SpaceAllocated()); EXPECT_EQ(Align8(182) + Align8(70), arena_3.SpaceUsed()); EXPECT_EQ(256 + 512, arena_3.Reset()); } TEST(ArenaTest, Alignment) { ::google::protobuf::Arena arena; for (int i = 0; i < 200; i++) { void* p = ::google::protobuf::Arena::CreateArray(&arena, i); GOOGLE_CHECK_EQ(reinterpret_cast(p) % 8, 0) << i << ": " << p; } } TEST(ArenaTest, BlockSizeSmallerThanAllocation) { for (size_t i = 0; i <= 8; ++i) { ::google::protobuf::ArenaOptions opt; opt.start_block_size = opt.max_block_size = i; ::google::protobuf::Arena arena(opt); *::google::protobuf::Arena::Create(&arena) = 42; EXPECT_GE(arena.SpaceAllocated(), 8); EXPECT_EQ(8, arena.SpaceUsed()); *::google::protobuf::Arena::Create(&arena) = 42; EXPECT_GE(arena.SpaceAllocated(), 16); EXPECT_EQ(16, arena.SpaceUsed()); } } TEST(ArenaTest, GetArenaShouldReturnTheArenaForArenaAllocatedMessages) { ::google::protobuf::Arena arena; ArenaMessage* message = Arena::CreateMessage(&arena); const ArenaMessage* const_pointer_to_message = message; EXPECT_EQ(&arena, Arena::GetArena(message)); EXPECT_EQ(&arena, Arena::GetArena(const_pointer_to_message)); } 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)); } TEST(ArenaTest, UnsafeSetAllocatedOnArena) { ::google::protobuf::Arena arena; TestAllTypes* message = Arena::CreateMessage(&arena); EXPECT_FALSE(message->has_optional_string()); string owned_string = "test with long enough content to heap-allocate"; message->unsafe_arena_set_allocated_optional_string(&owned_string); EXPECT_TRUE(message->has_optional_string()); message->unsafe_arena_set_allocated_optional_string(NULL); EXPECT_FALSE(message->has_optional_string()); } // A helper utility class to only contain static hook functions, some // counters to be used to verify the counters have been called and a cookie // value to be verified. class ArenaHooksTestUtil { public: static void* on_init(::google::protobuf::Arena* arena) { ++num_init; int* cookie = new int(kCookieValue); return static_cast(cookie); } static void on_allocation(const std::type_info* /*unused*/, uint64 alloc_size, void* cookie) { ++num_allocations; int cookie_value = *static_cast(cookie); EXPECT_EQ(kCookieValue, cookie_value); } static void on_reset(::google::protobuf::Arena* arena, void* cookie, uint64 space_used) { ++num_reset; int cookie_value = *static_cast(cookie); EXPECT_EQ(kCookieValue, cookie_value); } static void on_destruction(::google::protobuf::Arena* arena, void* cookie, uint64 space_used) { ++num_destruct; int cookie_value = *static_cast(cookie); EXPECT_EQ(kCookieValue, cookie_value); delete static_cast(cookie); } static const int kCookieValue = 999; static uint32 num_init; static uint32 num_allocations; static uint32 num_reset; static uint32 num_destruct; }; uint32 ArenaHooksTestUtil::num_init = 0; uint32 ArenaHooksTestUtil::num_allocations = 0; uint32 ArenaHooksTestUtil::num_reset = 0; uint32 ArenaHooksTestUtil::num_destruct = 0; const int ArenaHooksTestUtil::kCookieValue; // Test the hooks are correctly called and that the cookie is passed. TEST(ArenaTest, ArenaHooksSanity) { ::google::protobuf::ArenaOptions options; options.on_arena_init = ArenaHooksTestUtil::on_init; options.on_arena_allocation = ArenaHooksTestUtil::on_allocation; options.on_arena_reset = ArenaHooksTestUtil::on_reset; options.on_arena_destruction = ArenaHooksTestUtil::on_destruction; // Scope for defining the arena { ::google::protobuf::Arena arena(options); EXPECT_EQ(1, ArenaHooksTestUtil::num_init); EXPECT_EQ(0, ArenaHooksTestUtil::num_allocations); ::google::protobuf::Arena::Create(&arena); if (google::protobuf::internal::has_trivial_destructor::value) { EXPECT_EQ(1, ArenaHooksTestUtil::num_allocations); } else { EXPECT_EQ(2, ArenaHooksTestUtil::num_allocations); } arena.Reset(); arena.Reset(); EXPECT_EQ(2, ArenaHooksTestUtil::num_reset); } EXPECT_EQ(3, ArenaHooksTestUtil::num_reset); EXPECT_EQ(1, ArenaHooksTestUtil::num_destruct); } } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/arenastring.cc000066400000000000000000000036561334102242000301270ustar00rootroot00000000000000// 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. // The ArenaString implementation is not included in the open-source release. Do // not include this file in the distribution. #include namespace google { namespace protobuf { namespace internal { } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/arenastring.h000066400000000000000000000303701334102242000277620ustar00rootroot00000000000000// 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_ARENASTRING_H__ #define GOOGLE_PROTOBUF_ARENASTRING_H__ #include #include #include #include #include #include // This is the implementation of arena string fields written for the open-source // release. The ArenaStringPtr struct below is an internal implementation class // and *should not be used* by user code. It is used to collect string // operations together into one place and abstract away the underlying // string-field pointer representation, so that (for example) an alternate // implementation that knew more about ::std::string's internals could integrate more // closely with the arena allocator. namespace google { namespace protobuf { namespace internal { struct LIBPROTOBUF_EXPORT ArenaStringPtr { inline void Set(const ::std::string* default_value, const ::std::string& value, ::google::protobuf::Arena* arena) { if (ptr_ == default_value) { CreateInstance(arena, &value); } else { *ptr_ = value; } } inline void SetLite(const ::std::string* default_value, const ::std::string& value, ::google::protobuf::Arena* arena) { Set(default_value, value, arena); } // Basic accessors. inline const ::std::string& Get() const { return *ptr_; } inline ::std::string* Mutable(const ::std::string* default_value, ::google::protobuf::Arena* arena) { if (ptr_ == default_value) { CreateInstance(arena, default_value); } return ptr_; } // Release returns a ::std::string* instance that is heap-allocated and is not // Own()'d by any arena. If the field was not set, it returns NULL. The caller // retains ownership. Clears this field back to NULL state. Used to implement // release_() methods on generated classes. inline ::std::string* Release(const ::std::string* default_value, ::google::protobuf::Arena* arena) { if (ptr_ == default_value) { return NULL; } ::std::string* released = NULL; if (arena != NULL) { // ptr_ is owned by the arena. released = new ::std::string; released->swap(*ptr_); } else { released = ptr_; } ptr_ = const_cast< ::std::string* >(default_value); return released; } // UnsafeArenaRelease returns a ::std::string*, but it may be arena-owned (i.e. // have its destructor already registered) if arena != NULL. If the field was // not set, this returns NULL. This method clears this field back to NULL // state. Used to implement unsafe_arena_release_() methods on // generated classes. inline ::std::string* UnsafeArenaRelease(const ::std::string* default_value, ::google::protobuf::Arena* /* arena */) { if (ptr_ == default_value) { return NULL; } ::std::string* released = ptr_; ptr_ = const_cast< ::std::string* >(default_value); return released; } // Takes a string that is heap-allocated, and takes ownership. The string's // destructor is registered with the arena. Used to implement // set_allocated_ in generated classes. inline void SetAllocated(const ::std::string* default_value, ::std::string* value, ::google::protobuf::Arena* arena) { if (arena == NULL && ptr_ != default_value) { Destroy(default_value, arena); } if (value != NULL) { ptr_ = value; if (arena != NULL) { arena->Own(value); } } else { ptr_ = const_cast< ::std::string* >(default_value); } } // Takes a string that has lifetime equal to the arena's lifetime. The arena // must be non-null. It is safe only to pass this method a value returned by // UnsafeArenaRelease() on another field of a message in the same arena. Used // to implement unsafe_arena_set_allocated_ in generated classes. inline void UnsafeArenaSetAllocated(const ::std::string* default_value, ::std::string* value, ::google::protobuf::Arena* /* arena */) { if (value != NULL) { ptr_ = value; } else { ptr_ = const_cast< ::std::string* >(default_value); } } // Swaps internal pointers. Arena-safety semantics: this is guarded by the // logic in Swap()/UnsafeArenaSwap() at the message level, so this method is // 'unsafe' if called directly. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void Swap(ArenaStringPtr* other) { std::swap(ptr_, other->ptr_); } // Frees storage (if not on an arena). inline void Destroy(const ::std::string* default_value, ::google::protobuf::Arena* arena) { if (arena == NULL && ptr_ != default_value) { delete ptr_; } } // Clears content, but keeps allocated string if arena != NULL, to avoid the // overhead of heap operations. After this returns, the content (as seen by // the user) will always be the empty string. Assumes that |default_value| // is an empty string. inline void ClearToEmpty(const ::std::string* default_value, ::google::protobuf::Arena* /* arena */) { if (ptr_ == default_value) { // Already set to default (which is empty) -- do nothing. } else { ptr_->clear(); } } // Clears content, but keeps allocated string if arena != NULL, to avoid the // overhead of heap operations. After this returns, the content (as seen by // the user) will always be equal to |default_value|. inline void ClearToDefault(const ::std::string* default_value, ::google::protobuf::Arena* /* arena */) { if (ptr_ == default_value) { // Already set to default -- do nothing. } else { // Have another allocated string -- rather than throwing this away and // resetting ptr_ to the canonical default string instance, we just reuse // this instance. *ptr_ = *default_value; } } // Called from generated code / reflection runtime only. Resets value to point // to a default string pointer, with the semantics that this ArenaStringPtr // does not own the pointed-to memory. Disregards initial value of ptr_ (so // this is the *ONLY* safe method to call after construction or when // reinitializing after becoming the active field in a oneof union). inline void UnsafeSetDefault(const ::std::string* default_value) { // Casting away 'const' is safe here: accessors ensure that ptr_ is only // returned as a const if it is equal to default_value. ptr_ = const_cast< ::std::string* >(default_value); } // The 'NoArena' variants of methods below assume arena == NULL and are // optimized to provide very little overhead relative to a raw string pointer // (while still being in-memory compatible with other code that assumes // ArenaStringPtr). Note the invariant that a class instance that has only // ever been mutated by NoArena methods must *only* be in the String state // (i.e., tag bits are not used), *NEVER* ArenaString. This allows all // tagged-pointer manipulations to be avoided. inline void SetNoArena(const ::std::string* default_value, const ::std::string& value) { if (ptr_ == default_value) { CreateInstanceNoArena(&value); } else { *ptr_ = value; } } #if LANG_CXX11 void SetNoArena(const ::std::string* default_value, ::std::string&& value) { if (IsDefault(default_value)) { ptr_ = new ::std::string(std::move(value)); } else { *ptr_ = std::move(value); } } #endif void AssignWithDefault(const ::std::string* default_value, ArenaStringPtr value); inline const ::std::string& GetNoArena() const { return *ptr_; } inline ::std::string* MutableNoArena(const ::std::string* default_value) { if (ptr_ == default_value) { CreateInstanceNoArena(default_value); } return ptr_; } inline ::std::string* ReleaseNoArena(const ::std::string* default_value) { if (ptr_ == default_value) { return NULL; } else { ::std::string* released = ptr_; ptr_ = const_cast< ::std::string* >(default_value); return released; } } inline void SetAllocatedNoArena(const ::std::string* default_value, ::std::string* value) { if (ptr_ != default_value) { delete ptr_; } if (value != NULL) { ptr_ = value; } else { ptr_ = const_cast< ::std::string* >(default_value); } } inline void DestroyNoArena(const ::std::string* default_value) { if (ptr_ != default_value) { delete ptr_; } } inline void ClearToEmptyNoArena(const ::std::string* default_value) { if (ptr_ == default_value) { // Nothing: already equal to default (which is the empty string). } else { ptr_->clear(); } } inline void ClearToDefaultNoArena(const ::std::string* default_value) { if (ptr_ == default_value) { // Nothing: already set to default. } else { // Reuse existing allocated instance. *ptr_ = *default_value; } } // Internal accessor used only at parse time to provide direct access to the // raw pointer from the shared parse routine (in the non-arenas case). The // parse routine does the string allocation in order to save code size in the // generated parsing code. inline ::std::string** UnsafeRawStringPointer() { return &ptr_; } inline bool IsDefault(const ::std::string* default_value) const { return ptr_ == default_value; } private: ::std::string* ptr_; GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE void CreateInstance(::google::protobuf::Arena* arena, const ::std::string* initial_value) { GOOGLE_DCHECK(initial_value != NULL); ptr_ = new ::std::string(*initial_value); if (arena != NULL) { arena->Own(ptr_); } } GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE void CreateInstanceNoArena(const ::std::string* initial_value) { GOOGLE_DCHECK(initial_value != NULL); ptr_ = new ::std::string(*initial_value); } }; } // namespace internal } // namespace protobuf namespace protobuf { namespace internal { inline void ArenaStringPtr::AssignWithDefault(const ::std::string* default_value, ArenaStringPtr value) { const ::std::string* me = *UnsafeRawStringPointer(); const ::std::string* other = *value.UnsafeRawStringPointer(); // If the pointers are the same then do nothing. if (me != other) { SetNoArena(default_value, value.GetNoArena()); } } } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ARENASTRING_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/arenastring_unittest.cc000066400000000000000000000127241334102242000320620ustar00rootroot00000000000000// 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. // Based on mvels@'s frankenstring. #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include namespace google { using google::protobuf::internal::ArenaStringPtr; namespace protobuf { static string WrapString(const char* value) { return value; } // Test ArenaStringPtr with arena == NULL. TEST(ArenaStringPtrTest, ArenaStringPtrOnHeap) { ArenaStringPtr field; ::std::string default_value = "default"; field.UnsafeSetDefault(&default_value); EXPECT_EQ(string("default"), field.Get()); field.Set(&default_value, WrapString("Test short"), NULL); EXPECT_EQ(string("Test short"), field.Get()); field.Set(&default_value, WrapString("Test long long long long value"), NULL); EXPECT_EQ(string("Test long long long long value"), field.Get()); field.Set(&default_value, string(""), NULL); field.Destroy(&default_value, NULL); ArenaStringPtr field2; field2.UnsafeSetDefault(&default_value); ::std::string* mut = field2.Mutable(&default_value, NULL); EXPECT_EQ(mut, field2.Mutable(&default_value, NULL)); EXPECT_EQ(mut, &field2.Get()); EXPECT_NE(&default_value, mut); EXPECT_EQ(string("default"), *mut); *mut = "Test long long long long value"; // ensure string allocates storage EXPECT_EQ(string("Test long long long long value"), field2.Get()); field2.Destroy(&default_value, NULL); } TEST(ArenaStringPtrTest, ArenaStringPtrOnArena) { google::protobuf::Arena arena; ArenaStringPtr field; ::std::string default_value = "default"; field.UnsafeSetDefault(&default_value); EXPECT_EQ(string("default"), field.Get()); field.Set(&default_value, WrapString("Test short"), &arena); EXPECT_EQ(string("Test short"), field.Get()); field.Set(&default_value, WrapString("Test long long long long value"), &arena); EXPECT_EQ(string("Test long long long long value"), field.Get()); field.Set(&default_value, string(""), &arena); field.Destroy(&default_value, &arena); ArenaStringPtr field2; field2.UnsafeSetDefault(&default_value); ::std::string* mut = field2.Mutable(&default_value, &arena); EXPECT_EQ(mut, field2.Mutable(&default_value, &arena)); EXPECT_EQ(mut, &field2.Get()); EXPECT_NE(&default_value, mut); EXPECT_EQ(string("default"), *mut); *mut = "Test long long long long value"; // ensure string allocates storage EXPECT_EQ(string("Test long long long long value"), field2.Get()); field2.Destroy(&default_value, &arena); } TEST(ArenaStringPtrTest, ArenaStringPtrOnArenaNoSSO) { google::protobuf::Arena arena; ArenaStringPtr field; ::std::string default_value = "default"; field.UnsafeSetDefault(&default_value); EXPECT_EQ(string("default"), field.Get()); // Avoid triggering the SSO optimization by setting the string to something // larger than the internal buffer. field.Set(&default_value, WrapString("Test long long long long value"), &arena); EXPECT_EQ(string("Test long long long long value"), field.Get()); field.Set(&default_value, string(""), &arena); field.Destroy(&default_value, &arena); ArenaStringPtr field2; field2.UnsafeSetDefault(&default_value); ::std::string* mut = field2.Mutable(&default_value, &arena); EXPECT_EQ(mut, field2.Mutable(&default_value, &arena)); EXPECT_EQ(mut, &field2.Get()); EXPECT_NE(&default_value, mut); EXPECT_EQ(string("default"), *mut); *mut = "Test long long long long value"; // ensure string allocates storage EXPECT_EQ(string("Test long long long long value"), field2.Get()); field2.Destroy(&default_value, &arena); } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/000077500000000000000000000000001334102242000271035ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/annotation_test_util.cc000066400000000000000000000153151334102242000336650ustar00rootroot00000000000000// 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 #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace annotation_test_util { namespace { // A CodeGenerator that captures the FileDescriptor it's passed as a // FileDescriptorProto. class DescriptorCapturingGenerator : public CodeGenerator { public: // Does not own file; file must outlive the Generator. explicit DescriptorCapturingGenerator(FileDescriptorProto* file) : file_(file) {} virtual bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const { file->CopyTo(file_); return true; } private: FileDescriptorProto* file_; }; } // namespace void AddFile(const string& filename, const string& data) { GOOGLE_CHECK_OK(File::SetContents(TestTempDir() + "/" + filename, data, true)); } bool CaptureMetadata(const string& filename, const string& plugin_specific_args, const string& meta_file_suffix, CommandLineInterface* cli, FileDescriptorProto* file, std::vector* outputs) { cli->SetInputsAreProtoPathRelative(true); DescriptorCapturingGenerator capturing_generator(file); cli->RegisterGenerator("--capture_out", &capturing_generator, ""); string proto_path = "-I" + TestTempDir(); string capture_out = "--capture_out=" + TestTempDir(); const char* argv[] = {"protoc", proto_path.c_str(), plugin_specific_args.c_str(), capture_out.c_str(), filename.c_str()}; if (cli->Run(5, argv) != 0) { return false; } if (outputs != NULL) { for (std::vector::iterator i = outputs->begin(); i != outputs->end(); ++i) { GOOGLE_CHECK_OK(File::GetContents(TestTempDir() + "/" + i->file_path, &i->file_content, true)); if (!DecodeMetadata( TestTempDir() + "/" + i->file_path + meta_file_suffix, &i->file_info)) { return false; } } } return true; } bool DecodeMetadata(const string& path, GeneratedCodeInfo* info) { string data; GOOGLE_CHECK_OK(File::GetContents(path, &data, true)); io::ArrayInputStream input(data.data(), data.size()); return info->ParseFromZeroCopyStream(&input); } void FindAnnotationsOnPath( const GeneratedCodeInfo& info, const string& source_file, const std::vector& path, std::vector* annotations) { for (int i = 0; i < info.annotation_size(); ++i) { const GeneratedCodeInfo::Annotation* annotation = &info.annotation(i); if (annotation->source_file() != source_file || annotation->path_size() != path.size()) { continue; } int node = 0; for (; node < path.size(); ++node) { if (annotation->path(node) != path[node]) { break; } } if (node == path.size()) { annotations->push_back(annotation); } } } const GeneratedCodeInfo::Annotation* FindAnnotationOnPath( const GeneratedCodeInfo& info, const string& source_file, const std::vector& path) { std::vector annotations; FindAnnotationsOnPath(info, source_file, path, &annotations); if (annotations.empty()) { return NULL; } return annotations[0]; } bool AtLeastOneAnnotationMatchesSubstring( const string& file_content, const std::vector& annotations, const string& expected_text) { for (std::vector::const_iterator i = annotations.begin(), e = annotations.end(); i != e; ++i) { const GeneratedCodeInfo::Annotation* annotation = *i; uint32 begin = annotation->begin(); uint32 end = annotation->end(); if (end < begin || end > file_content.size()) { return false; } if (file_content.substr(begin, end - begin) == expected_text) { return true; } } return false; } bool AnnotationMatchesSubstring(const string& file_content, const GeneratedCodeInfo::Annotation* annotation, const string& expected_text) { std::vector annotations; annotations.push_back(annotation); return AtLeastOneAnnotationMatchesSubstring(file_content, annotations, expected_text); } } // namespace annotation_test_util } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/annotation_test_util.h000066400000000000000000000127001334102242000335220ustar00rootroot00000000000000// 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_ANNOTATION_TEST_UTIL_H__ #define GOOGLE_PROTOBUF_COMPILER_ANNOTATION_TEST_UTIL_H__ #include #include #include // Utilities that assist in writing tests for generator annotations. // See java/internal/annotation_unittest.cc for an example. namespace google { namespace protobuf { namespace compiler { namespace annotation_test_util { // Struct that contains the file generated from a .proto file and its // GeneratedCodeInfo. For example, the Java generator will fill this struct // (for some 'foo.proto') with: // file_path = "Foo.java" // file_content = content of Foo.java // file_info = parsed content of Foo.java.pb.meta struct ExpectedOutput { string file_path; string file_content; GeneratedCodeInfo file_info; explicit ExpectedOutput(const string& file_path) : file_path(file_path) {} }; // Creates a file with name `filename` and content `data` in temp test // directory. void AddFile(const string& filename, const string& data); // Tries to capture a FileDescriptorProto, GeneratedCodeInfo, and output // code from the previously added file with name `filename`. // // filename: source .proto file used to generate code. // plugin_specific_args: command line arguments specific to current generator. // For Java, this value might be "--java_out=annotate_code:test_temp_dir" // meta_file_suffix: suffix of meta files that contain annotations. For Java // it is ".pb.meta" because for file Foo.java meta file is Foo.java.pb.meta // cli: instance of command line interface to run generator. See Java's // annotation_unittest.cc for an example of how to initialize it. // file: output parameter, will be set to the descriptor of the proto file // specified in filename. // outputs: output parameter. If not NULL, each ExpectedOutput in the vector // should have its file_path set; CaptureMetadata will fill the rest of // the fields appropriately. bool CaptureMetadata(const string& filename, const string& plugin_specific_args, const string& meta_file_suffix, CommandLineInterface* cli, FileDescriptorProto* file, std::vector* outputs); bool DecodeMetadata(const string& path, GeneratedCodeInfo* info); // Finds all of the Annotations for a given source file and path. // See Location.path in http://google/protobuf/descriptor.proto for // explanation of what path vector is. void FindAnnotationsOnPath( const GeneratedCodeInfo& info, const string& source_file, const std::vector& path, std::vector* annotations); // Finds the Annotation for a given source file and path (or returns null if it // couldn't). If there are several annotations for given path, returns the first // one. See Location.path in // http://google/protobuf/descriptor.proto for explanation of what path // vector is. const GeneratedCodeInfo::Annotation* FindAnnotationOnPath( const GeneratedCodeInfo& info, const string& source_file, const std::vector& path); // Returns true if at least one of the provided annotations covers a given // substring in file_content. bool AtLeastOneAnnotationMatchesSubstring( const string& file_content, const std::vector& annotations, const string& expected_text); // Returns true if the provided annotation covers a given substring in // file_content. bool AnnotationMatchesSubstring(const string& file_content, const GeneratedCodeInfo::Annotation* annotation, const string& expected_text); } // namespace annotation_test_util } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_ANNOTATION_TEST_UTIL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/code_generator.cc000066400000000000000000000107041334102242000323740ustar00rootroot00000000000000// 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 #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { CodeGenerator::~CodeGenerator() {} bool CodeGenerator::GenerateAll( const std::vector& files, const string& parameter, GeneratorContext* generator_context, string* error) const { // Default implemenation is just to call the per file method, and prefix any // error string with the file to provide context. bool succeeded = true; for (int i = 0; i < files.size(); i++) { const FileDescriptor* file = files[i]; succeeded = Generate(file, parameter, generator_context, error); if (!succeeded && error && error->empty()) { *error = "Code generator returned false but provided no error " "description."; } if (error && !error->empty()) { *error = file->name() + ": " + *error; break; } if (!succeeded) { break; } } return succeeded; } GeneratorContext::~GeneratorContext() {} io::ZeroCopyOutputStream* GeneratorContext::OpenForAppend(const string& filename) { return NULL; } io::ZeroCopyOutputStream* GeneratorContext::OpenForInsert( const string& filename, const string& insertion_point) { GOOGLE_LOG(FATAL) << "This GeneratorContext does not support insertion."; return NULL; // make compiler happy } void GeneratorContext::ListParsedFiles( std::vector* output) { GOOGLE_LOG(FATAL) << "This GeneratorContext does not support ListParsedFiles"; } void GeneratorContext::GetCompilerVersion(Version* version) const { version->set_major(GOOGLE_PROTOBUF_VERSION / 1000000); version->set_minor(GOOGLE_PROTOBUF_VERSION / 1000 % 1000); version->set_patch(GOOGLE_PROTOBUF_VERSION % 1000); version->set_suffix(GOOGLE_PROTOBUF_VERSION_SUFFIX); } // Parses a set of comma-delimited name/value pairs. void ParseGeneratorParameter(const string& text, std::vector >* output) { std::vector parts = Split(text, ",", true); for (int i = 0; i < parts.size(); i++) { string::size_type equals_pos = parts[i].find_first_of('='); std::pair value; if (equals_pos == string::npos) { value.first = parts[i]; value.second = ""; } else { value.first = parts[i].substr(0, equals_pos); value.second = parts[i].substr(equals_pos + 1); } output->push_back(value); } } } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/code_generator.h000066400000000000000000000163401334102242000322400ustar00rootroot00000000000000// 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. // // Defines the abstract interface implemented by each of the language-specific // code generators. #ifndef GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__ #include #include #include #include namespace google { namespace protobuf { namespace io { class ZeroCopyOutputStream; } class FileDescriptor; namespace compiler { class AccessInfoMap; class Version; // Defined in this file. class CodeGenerator; class GeneratorContext; // The abstract interface to a class which generates code implementing a // particular proto file in a particular language. A number of these may // be registered with CommandLineInterface to support various languages. class LIBPROTOC_EXPORT CodeGenerator { public: inline CodeGenerator() {} virtual ~CodeGenerator(); // Generates code for the given proto file, generating one or more files in // the given output directory. // // A parameter to be passed to the generator can be specified on the command // line. This is intended to be used to pass generator specific parameters. // It is empty if no parameter was given. ParseGeneratorParameter (below), // can be used to accept multiple parameters within the single parameter // command line flag. // // Returns true if successful. Otherwise, sets *error to a description of // the problem (e.g. "invalid parameter") and returns false. virtual bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* generator_context, string* error) const = 0; // Generates code for all given proto files. // // WARNING: The canonical code generator design produces one or two output // files per input .proto file, and we do not wish to encourage alternate // designs. // // A parameter is given as passed on the command line, as in |Generate()| // above. // // Returns true if successful. Otherwise, sets *error to a description of // the problem (e.g. "invalid parameter") and returns false. virtual bool GenerateAll(const std::vector& files, const string& parameter, GeneratorContext* generator_context, string* error) const; // This is no longer used, but this class is part of the opensource protobuf // library, so it has to remain to keep vtables the same for the current // 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 // abstract interface represents the directory to which the CodeGenerator is // to write and other information about the context in which the Generator // runs. class LIBPROTOC_EXPORT GeneratorContext { public: inline GeneratorContext() { } virtual ~GeneratorContext(); // Opens the given file, truncating it if it exists, and returns a // ZeroCopyOutputStream that writes to the file. The caller takes ownership // of the returned object. This method never fails (a dummy stream will be // returned instead). // // The filename given should be relative to the root of the source tree. // E.g. the C++ generator, when generating code for "foo/bar.proto", will // generate the files "foo/bar.pb.h" and "foo/bar.pb.cc"; note that // "foo/" is included in these filenames. The filename is not allowed to // contain "." or ".." components. virtual io::ZeroCopyOutputStream* Open(const string& filename) = 0; // Similar to Open() but the output will be appended to the file if exists virtual io::ZeroCopyOutputStream* OpenForAppend(const string& filename); // Creates a ZeroCopyOutputStream which will insert code into the given file // at the given insertion point. See plugin.proto (plugin.pb.h) for more // information on insertion points. The default implementation // assert-fails -- it exists only for backwards-compatibility. // // WARNING: This feature is currently EXPERIMENTAL and is subject to change. virtual io::ZeroCopyOutputStream* OpenForInsert( const string& filename, const string& insertion_point); // Returns a vector of FileDescriptors for all the files being compiled // in this run. Useful for languages, such as Go, that treat files // differently when compiled as a set rather than individually. virtual void ListParsedFiles(std::vector* output); // Retrieves the version number of the protocol compiler associated with // this GeneratorContext. virtual void GetCompilerVersion(Version* version) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratorContext); }; // The type GeneratorContext was once called OutputDirectory. This typedef // provides backward compatibility. typedef GeneratorContext OutputDirectory; // Several code generators treat the parameter argument as holding a // list of options separated by commas. This helper function parses // a set of comma-delimited name/value pairs: e.g., // "foo=bar,baz,qux=corge" // parses to the pairs: // ("foo", "bar"), ("baz", ""), ("qux", "corge") void ParseGeneratorParameter( const string&, std::vector >*); } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/command_line_interface.cc000066400000000000000000002322371334102242000340700ustar00rootroot00000000000000// 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 #include #include #include #ifdef major #undef major #endif #ifdef minor #undef minor #endif #include #include #ifndef _MSC_VER #include #endif #include #include #include #include #include //For PATH_MAX #include #ifndef _SHARED_PTR_H #include #endif #ifdef __APPLE__ #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { #ifndef O_BINARY #ifdef _O_BINARY #define O_BINARY _O_BINARY #else #define O_BINARY 0 // If this isn't defined, the platform doesn't need it. #endif #endif namespace { #if defined(_WIN32) // DO NOT include , instead create functions in io_win32.{h,cc} and import // them like we do below. using google::protobuf::internal::win32::access; using google::protobuf::internal::win32::close; using google::protobuf::internal::win32::mkdir; using google::protobuf::internal::win32::open; using google::protobuf::internal::win32::setmode; using google::protobuf::internal::win32::write; #endif static const char* kDefaultDirectDependenciesViolationMsg = "File is imported but not declared in --direct_dependencies: %s"; // 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 importer.cc? static bool IsWindowsAbsolutePath(const string& text) { #if defined(_WIN32) || defined(__CYGWIN__) return text.size() >= 3 && text[1] == ':' && isalpha(text[0]) && (text[2] == '/' || text[2] == '\\') && text.find_last_of(':') == 1; #else return false; #endif } void SetFdToTextMode(int fd) { #ifdef _WIN32 if (setmode(fd, _O_TEXT) == -1) { // This should never happen, I think. GOOGLE_LOG(WARNING) << "setmode(" << fd << ", _O_TEXT): " << strerror(errno); } #endif // (Text and binary are the same on non-Windows platforms.) } void SetFdToBinaryMode(int fd) { #ifdef _WIN32 if (setmode(fd, _O_BINARY) == -1) { // This should never happen, I think. GOOGLE_LOG(WARNING) << "setmode(" << fd << ", _O_BINARY): " << strerror(errno); } #endif // (Text and binary are the same on non-Windows platforms.) } void AddTrailingSlash(string* path) { if (!path->empty() && path->at(path->size() - 1) != '/') { path->push_back('/'); } } bool VerifyDirectoryExists(const string& path) { if (path.empty()) return true; if (access(path.c_str(), F_OK) == -1) { std::cerr << path << ": " << strerror(errno) << std::endl; return false; } else { return true; } } // Try to create the parent directory of the given file, creating the parent's // parent if necessary, and so on. The full file name is actually // (prefix + filename), but we assume |prefix| already exists and only create // directories listed in |filename|. bool TryCreateParentDirectory(const string& prefix, const string& filename) { // Recursively create parent directories to the output file. std::vector parts = Split(filename, "/", true); string path_so_far = prefix; for (int i = 0; i < parts.size() - 1; i++) { path_so_far += parts[i]; if (mkdir(path_so_far.c_str(), 0777) != 0) { if (errno != EEXIST) { std::cerr << filename << ": while trying to create directory " << path_so_far << ": " << strerror(errno) << std::endl; return false; } } path_so_far += '/'; } return true; } // Get the absolute path of this protoc binary. bool GetProtocAbsolutePath(string* path) { #ifdef _WIN32 char buffer[MAX_PATH]; int len = GetModuleFileNameA(NULL, buffer, MAX_PATH); #elif __APPLE__ char buffer[PATH_MAX]; int len = 0; char dirtybuffer[PATH_MAX]; uint32_t size = sizeof(dirtybuffer); if (_NSGetExecutablePath(dirtybuffer, &size) == 0) { realpath(dirtybuffer, buffer); len = strlen(buffer); } #else char buffer[PATH_MAX]; int len = readlink("/proc/self/exe", buffer, PATH_MAX); #endif if (len > 0) { path->assign(buffer, len); return true; } else { return false; } } // Whether a path is where google/protobuf/descriptor.proto and other well-known // type protos are installed. bool IsInstalledProtoPath(const string& path) { // Checking the descriptor.proto file should be good enough. string file_path = path + "/google/protobuf/descriptor.proto"; return access(file_path.c_str(), F_OK) != -1; } // Add the paths where google/protobuf/descriptor.proto and other well-known // type protos are installed. void AddDefaultProtoPaths(vector >* paths) { // TODO(xiaofeng): The code currently only checks relative paths of where // the protoc binary is installed. We probably should make it handle more // cases than that. string path; if (!GetProtocAbsolutePath(&path)) { return; } // Strip the binary name. size_t pos = path.find_last_of("/\\"); if (pos == string::npos || pos == 0) { return; } path = path.substr(0, pos); // Check the binary's directory. if (IsInstalledProtoPath(path)) { paths->push_back(pair("", path)); return; } // Check if there is an include subdirectory. if (IsInstalledProtoPath(path + "/include")) { paths->push_back(pair("", path + "/include")); return; } // Check if the upper level directory has an "include" subdirectory. pos = path.find_last_of("/\\"); if (pos == string::npos || pos == 0) { return; } path = path.substr(0, pos); if (IsInstalledProtoPath(path + "/include")) { paths->push_back(pair("", path + "/include")); return; } } string PluginName(const string& plugin_prefix, const string& directive) { // Assuming the directive starts with "--" and ends with "_out" or "_opt", // strip the "--" and "_out/_opt" and add the plugin prefix. return plugin_prefix + "gen-" + directive.substr(2, directive.size() - 6); } } // namespace // A MultiFileErrorCollector that prints errors to stderr. class CommandLineInterface::ErrorPrinter : public MultiFileErrorCollector, public io::ErrorCollector, public DescriptorPool::ErrorCollector { public: ErrorPrinter(ErrorFormat format, DiskSourceTree *tree = NULL) : format_(format), tree_(tree), found_errors_(false) {} ~ErrorPrinter() {} // implements MultiFileErrorCollector ------------------------------ void AddError(const string& filename, int line, int column, const string& message) { found_errors_ = true; AddErrorOrWarning(filename, line, column, message, "error", std::cerr); } void AddWarning(const string& filename, int line, int column, const string& message) { AddErrorOrWarning(filename, line, column, message, "warning", std::clog); } // implements io::ErrorCollector ----------------------------------- void AddError(int line, int column, const string& message) { AddError("input", line, column, message); } void AddWarning(int line, int column, const string& message) { AddErrorOrWarning("input", line, column, message, "warning", std::clog); } // implements DescriptorPool::ErrorCollector------------------------- void AddError( const string& filename, const string& element_name, const Message* descriptor, ErrorLocation location, const string& message) { AddErrorOrWarning(filename, -1, -1, message, "error", std::cerr); } void AddWarning( const string& filename, const string& element_name, const Message* descriptor, ErrorLocation location, const string& message) { AddErrorOrWarning(filename, -1, -1, message, "warning", std::clog); } bool FoundErrors() const { return found_errors_; } private: void AddErrorOrWarning(const string& filename, int line, int column, const string& message, const string& type, std::ostream& out) { // Print full path when running under MSVS string dfile; if (format_ == CommandLineInterface::ERROR_FORMAT_MSVS && tree_ != NULL && tree_->VirtualFileToDiskFile(filename, &dfile)) { out << dfile; } else { out << filename; } // Users typically expect 1-based line/column numbers, so we add 1 // to each here. if (line != -1) { // Allow for both GCC- and Visual-Studio-compatible output. switch (format_) { case CommandLineInterface::ERROR_FORMAT_GCC: out << ":" << (line + 1) << ":" << (column + 1); break; case CommandLineInterface::ERROR_FORMAT_MSVS: out << "(" << (line + 1) << ") : " << type << " in column=" << (column + 1); break; } } if (type == "warning") { out << ": warning: " << message << std::endl; } else { out << ": " << message << std::endl; } } const ErrorFormat format_; DiskSourceTree *tree_; bool found_errors_; }; // ------------------------------------------------------------------- // A GeneratorContext implementation that buffers files in memory, then dumps // them all to disk on demand. class CommandLineInterface::GeneratorContextImpl : public GeneratorContext { public: GeneratorContextImpl(const std::vector& parsed_files); ~GeneratorContextImpl(); // Write all files in the directory to disk at the given output location, // which must end in a '/'. bool WriteAllToDisk(const string& prefix); // Write the contents of this directory to a ZIP-format archive with the // given name. bool WriteAllToZip(const string& filename); // Add a boilerplate META-INF/MANIFEST.MF file as required by the Java JAR // format, unless one has already been written. void AddJarManifest(); // Get name of all output files. void GetOutputFilenames(std::vector* output_filenames); // implements GeneratorContext -------------------------------------- io::ZeroCopyOutputStream* Open(const string& filename); io::ZeroCopyOutputStream* OpenForAppend(const string& filename); io::ZeroCopyOutputStream* OpenForInsert( const string& filename, const string& insertion_point); void ListParsedFiles(std::vector* output) { *output = parsed_files_; } private: friend class MemoryOutputStream; // map instead of hash_map so that files are written in order (good when // writing zips). std::map files_; const std::vector& parsed_files_; bool had_error_; }; class CommandLineInterface::MemoryOutputStream : public io::ZeroCopyOutputStream { public: MemoryOutputStream(GeneratorContextImpl* directory, const string& filename, bool append_mode); MemoryOutputStream(GeneratorContextImpl* directory, const string& filename, const string& insertion_point); virtual ~MemoryOutputStream(); // implements ZeroCopyOutputStream --------------------------------- virtual bool Next(void** data, int* size) { return inner_->Next(data, size); } virtual void BackUp(int count) { inner_->BackUp(count); } virtual int64 ByteCount() const { return inner_->ByteCount(); } private: // Checks to see if "filename_.meta" exists in directory_; if so, fixes the // offsets in that GeneratedCodeInfo record to reflect bytes inserted in // filename_ at original offset insertion_offset with length insertion_length. // We assume that insertions will not occur within any given annotated span // of text. void UpdateMetadata(size_t insertion_offset, size_t insertion_length); // Where to insert the string when it's done. GeneratorContextImpl* directory_; string filename_; string insertion_point_; // The string we're building. string data_; // Whether we should append the output stream to the existing file. bool append_mode_; // StringOutputStream writing to data_. google::protobuf::scoped_ptr inner_; }; // ------------------------------------------------------------------- CommandLineInterface::GeneratorContextImpl::GeneratorContextImpl( const std::vector& parsed_files) : parsed_files_(parsed_files), had_error_(false) {} CommandLineInterface::GeneratorContextImpl::~GeneratorContextImpl() { STLDeleteValues(&files_); } bool CommandLineInterface::GeneratorContextImpl::WriteAllToDisk( const string& prefix) { if (had_error_) { return false; } if (!VerifyDirectoryExists(prefix)) { return false; } for (std::map::const_iterator iter = files_.begin(); iter != files_.end(); ++iter) { const string& relative_filename = iter->first; const char* data = iter->second->data(); int size = iter->second->size(); if (!TryCreateParentDirectory(prefix, relative_filename)) { return false; } string filename = prefix + relative_filename; // Create the output file. int file_descriptor; do { file_descriptor = open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); } while (file_descriptor < 0 && errno == EINTR); if (file_descriptor < 0) { int error = errno; std::cerr << filename << ": " << strerror(error); return false; } // Write the file. while (size > 0) { int write_result; do { write_result = write(file_descriptor, data, size); } while (write_result < 0 && errno == EINTR); if (write_result <= 0) { // Write error. // FIXME(kenton): According to the man page, if write() returns zero, // there was no error; write() simply did not write anything. It's // unclear under what circumstances this might happen, but presumably // errno won't be set in this case. I am confused as to how such an // event should be handled. For now I'm treating it as an error, // since retrying seems like it could lead to an infinite loop. I // suspect this never actually happens anyway. if (write_result < 0) { int error = errno; std::cerr << filename << ": write: " << strerror(error); } else { std::cerr << filename << ": write() returned zero?" << std::endl; } return false; } data += write_result; size -= write_result; } if (close(file_descriptor) != 0) { int error = errno; std::cerr << filename << ": close: " << strerror(error); return false; } } return true; } bool CommandLineInterface::GeneratorContextImpl::WriteAllToZip( const string& filename) { if (had_error_) { return false; } // Create the output file. int file_descriptor; do { file_descriptor = open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); } while (file_descriptor < 0 && errno == EINTR); if (file_descriptor < 0) { int error = errno; std::cerr << filename << ": " << strerror(error); return false; } // Create the ZipWriter io::FileOutputStream stream(file_descriptor); ZipWriter zip_writer(&stream); for (std::map::const_iterator iter = files_.begin(); iter != files_.end(); ++iter) { zip_writer.Write(iter->first, *iter->second); } zip_writer.WriteDirectory(); if (stream.GetErrno() != 0) { std::cerr << filename << ": " << strerror(stream.GetErrno()) << std::endl; } if (!stream.Close()) { std::cerr << filename << ": " << strerror(stream.GetErrno()) << std::endl; } return true; } void CommandLineInterface::GeneratorContextImpl::AddJarManifest() { string** map_slot = &files_["META-INF/MANIFEST.MF"]; if (*map_slot == NULL) { *map_slot = new string( "Manifest-Version: 1.0\n" "Created-By: 1.6.0 (protoc)\n" "\n"); } } void CommandLineInterface::GeneratorContextImpl::GetOutputFilenames( std::vector* output_filenames) { for (std::map::iterator iter = files_.begin(); iter != files_.end(); ++iter) { output_filenames->push_back(iter->first); } } io::ZeroCopyOutputStream* CommandLineInterface::GeneratorContextImpl::Open( const string& filename) { return new MemoryOutputStream(this, filename, false); } io::ZeroCopyOutputStream* CommandLineInterface::GeneratorContextImpl::OpenForAppend( const string& filename) { return new MemoryOutputStream(this, filename, true); } io::ZeroCopyOutputStream* CommandLineInterface::GeneratorContextImpl::OpenForInsert( const string& filename, const string& insertion_point) { return new MemoryOutputStream(this, filename, insertion_point); } // ------------------------------------------------------------------- CommandLineInterface::MemoryOutputStream::MemoryOutputStream( GeneratorContextImpl* directory, const string& filename, bool append_mode) : directory_(directory), filename_(filename), append_mode_(append_mode), inner_(new io::StringOutputStream(&data_)) { } CommandLineInterface::MemoryOutputStream::MemoryOutputStream( GeneratorContextImpl* directory, const string& filename, const string& insertion_point) : directory_(directory), filename_(filename), insertion_point_(insertion_point), inner_(new io::StringOutputStream(&data_)) { } void CommandLineInterface::MemoryOutputStream::UpdateMetadata( size_t insertion_offset, size_t insertion_length) { std::map::iterator meta_file = directory_->files_.find(filename_ + ".meta"); if (meta_file == directory_->files_.end() || !meta_file->second) { // No metadata was recorded for this file. return; } string* encoded_data = meta_file->second; GeneratedCodeInfo metadata; bool is_text_format = false; if (!metadata.ParseFromString(*encoded_data)) { if (!TextFormat::ParseFromString(*encoded_data, &metadata)) { // The metadata is invalid. std::cerr << filename_ << ".meta: Could not parse metadata as wire or text format." << std::endl; return; } // Generators that use the public plugin interface emit text-format // metadata (because in the public plugin protocol, file content must be // UTF8-encoded strings). is_text_format = true; } for (int i = 0; i < metadata.annotation_size(); ++i) { GeneratedCodeInfo::Annotation* annotation = metadata.mutable_annotation(i); if (annotation->begin() >= insertion_offset) { annotation->set_begin(annotation->begin() + insertion_length); annotation->set_end(annotation->end() + insertion_length); } } if (is_text_format) { TextFormat::PrintToString(metadata, encoded_data); } else { metadata.SerializeToString(encoded_data); } } CommandLineInterface::MemoryOutputStream::~MemoryOutputStream() { // Make sure all data has been written. inner_.reset(); // Insert into the directory. string** map_slot = &directory_->files_[filename_]; if (insertion_point_.empty()) { // This was just a regular Open(). if (*map_slot != NULL) { if (append_mode_) { (*map_slot)->append(data_); } else { std::cerr << filename_ << ": Tried to write the same file twice." << std::endl; directory_->had_error_ = true; } return; } *map_slot = new string; (*map_slot)->swap(data_); } else { // This was an OpenForInsert(). // If the data doesn't end with a clean line break, add one. if (!data_.empty() && data_[data_.size() - 1] != '\n') { data_.push_back('\n'); } // Find the file we are going to insert into. if (*map_slot == NULL) { std::cerr << filename_ << ": Tried to insert into file that doesn't exist." << std::endl; directory_->had_error_ = true; return; } string* target = *map_slot; // Find the insertion point. string magic_string = strings::Substitute( "@@protoc_insertion_point($0)", insertion_point_); string::size_type pos = target->find(magic_string); if (pos == string::npos) { std::cerr << filename_ << ": insertion point \"" << insertion_point_ << "\" not found." << std::endl; directory_->had_error_ = true; return; } if ((pos > 3) && (target->substr(pos - 3, 2) == "/*")) { // Support for inline "/* @@protoc_insertion_point() */" pos = pos - 3; } else { // Seek backwards to the beginning of the line, which is where we will // insert the data. Note that this has the effect of pushing the // insertion point down, so the data is inserted before it. This is // intentional because it means that multiple insertions at the same point // will end up in the expected order in the final output. pos = target->find_last_of('\n', pos); if (pos == string::npos) { // Insertion point is on the first line. pos = 0; } else { // Advance to character after '\n'. ++pos; } } // Extract indent. string indent_(*target, pos, target->find_first_not_of(" \t", pos) - pos); if (indent_.empty()) { // No indent. This makes things easier. target->insert(pos, data_); UpdateMetadata(pos, data_.size()); } else { // Calculate how much space we need. int indent_size = 0; for (int i = 0; i < data_.size(); i++) { if (data_[i] == '\n') indent_size += indent_.size(); } // Make a hole for it. target->insert(pos, data_.size() + indent_size, '\0'); UpdateMetadata(pos, data_.size() + indent_size); // Now copy in the data. string::size_type data_pos = 0; char* target_ptr = string_as_array(target) + pos; while (data_pos < data_.size()) { // Copy indent. memcpy(target_ptr, indent_.data(), indent_.size()); target_ptr += indent_.size(); // Copy line from data_. // We already guaranteed that data_ ends with a newline (above), so this // search can't fail. string::size_type line_length = data_.find_first_of('\n', data_pos) + 1 - data_pos; memcpy(target_ptr, data_.data() + data_pos, line_length); target_ptr += line_length; data_pos += line_length; } GOOGLE_CHECK_EQ(target_ptr, string_as_array(target) + pos + data_.size() + indent_size); } } } // =================================================================== #if defined(_WIN32) && !defined(__CYGWIN__) const char* const CommandLineInterface::kPathSeparator = ";"; #else const char* const CommandLineInterface::kPathSeparator = ":"; #endif CommandLineInterface::CommandLineInterface() : mode_(MODE_COMPILE), print_mode_(PRINT_NONE), error_format_(ERROR_FORMAT_GCC), direct_dependencies_explicitly_set_(false), direct_dependencies_violation_msg_( kDefaultDirectDependenciesViolationMsg), imports_in_descriptor_set_(false), source_info_in_descriptor_set_(false), disallow_services_(false) {} CommandLineInterface::~CommandLineInterface() {} void CommandLineInterface::RegisterGenerator(const string& flag_name, CodeGenerator* generator, const string& help_text) { GeneratorInfo info; info.flag_name = flag_name; info.generator = generator; info.help_text = help_text; generators_by_flag_name_[flag_name] = info; } void CommandLineInterface::RegisterGenerator(const string& flag_name, const string& option_flag_name, CodeGenerator* generator, const string& help_text) { GeneratorInfo info; info.flag_name = flag_name; info.option_flag_name = option_flag_name; info.generator = generator; info.help_text = help_text; generators_by_flag_name_[flag_name] = info; generators_by_option_name_[option_flag_name] = info; } void CommandLineInterface::AllowPlugins(const string& exe_name_prefix) { plugin_prefix_ = exe_name_prefix; } int CommandLineInterface::Run(int argc, const char* const argv[]) { Clear(); switch (ParseArguments(argc, argv)) { case PARSE_ARGUMENT_DONE_AND_EXIT: return 0; case PARSE_ARGUMENT_FAIL: return 1; case PARSE_ARGUMENT_DONE_AND_CONTINUE: break; } std::vector parsed_files; // null unless descriptor_set_in_names_.empty() google::protobuf::scoped_ptr disk_source_tree; google::protobuf::scoped_ptr error_collector; google::protobuf::scoped_ptr descriptor_pool; google::protobuf::scoped_ptr descriptor_database; if (descriptor_set_in_names_.empty()) { disk_source_tree.reset(new DiskSourceTree()); if (!InitializeDiskSourceTree(disk_source_tree.get())) { return 1; } error_collector.reset( new ErrorPrinter(error_format_, disk_source_tree.get())); SourceTreeDescriptorDatabase* database = new SourceTreeDescriptorDatabase(disk_source_tree.get()); database->RecordErrorsTo(error_collector.get()); descriptor_database.reset(database); descriptor_pool.reset(new DescriptorPool( descriptor_database.get(), database->GetValidationErrorCollector())); } else { error_collector.reset(new ErrorPrinter(error_format_)); SimpleDescriptorDatabase* database = new SimpleDescriptorDatabase(); descriptor_database.reset(database); if (!PopulateSimpleDescriptorDatabase(database)) { return 1; } descriptor_pool.reset(new DescriptorPool(database, error_collector.get())); } descriptor_pool->EnforceWeakDependencies(true); if (!ParseInputFiles(descriptor_pool.get(), &parsed_files)) { return 1; } // We construct a separate GeneratorContext for each output location. Note // that two code generators may output to the same location, in which case // they should share a single GeneratorContext so that OpenForInsert() works. GeneratorContextMap output_directories; // Generate output. if (mode_ == MODE_COMPILE) { for (int i = 0; i < output_directives_.size(); i++) { string output_location = output_directives_[i].output_location; if (!HasSuffixString(output_location, ".zip") && !HasSuffixString(output_location, ".jar")) { AddTrailingSlash(&output_location); } GeneratorContextImpl** map_slot = &output_directories[output_location]; if (*map_slot == NULL) { // First time we've seen this output location. *map_slot = new GeneratorContextImpl(parsed_files); } if (!GenerateOutput(parsed_files, output_directives_[i], *map_slot)) { STLDeleteValues(&output_directories); return 1; } } } // Write all output to disk. for (GeneratorContextMap::iterator iter = output_directories.begin(); iter != output_directories.end(); ++iter) { const string& location = iter->first; GeneratorContextImpl* directory = iter->second; if (HasSuffixString(location, "/")) { if (!directory->WriteAllToDisk(location)) { STLDeleteValues(&output_directories); return 1; } } else { if (HasSuffixString(location, ".jar")) { directory->AddJarManifest(); } if (!directory->WriteAllToZip(location)) { STLDeleteValues(&output_directories); return 1; } } } if (!dependency_out_name_.empty()) { GOOGLE_DCHECK(disk_source_tree.get()); if (!GenerateDependencyManifestFile(parsed_files, output_directories, disk_source_tree.get())) { return 1; } } STLDeleteValues(&output_directories); if (!descriptor_set_out_name_.empty()) { if (!WriteDescriptorSet(parsed_files)) { return 1; } } if (mode_ == MODE_ENCODE || mode_ == MODE_DECODE) { if (codec_type_.empty()) { // HACK: Define an EmptyMessage type to use for decoding. DescriptorPool pool; FileDescriptorProto file; file.set_name("empty_message.proto"); file.add_message_type()->set_name("EmptyMessage"); GOOGLE_CHECK(pool.BuildFile(file) != NULL); codec_type_ = "EmptyMessage"; if (!EncodeOrDecode(&pool)) { return 1; } } else { if (!EncodeOrDecode(descriptor_pool.get())) { return 1; } } } if (error_collector->FoundErrors()) { return 1; } if (mode_ == MODE_PRINT) { switch (print_mode_) { case PRINT_FREE_FIELDS: for (int i = 0; i < parsed_files.size(); ++i) { const FileDescriptor* fd = parsed_files[i]; for (int j = 0; j < fd->message_type_count(); ++j) { PrintFreeFieldNumbers(fd->message_type(j)); } } break; case PRINT_NONE: GOOGLE_LOG(ERROR) << "If the code reaches here, it usually means a bug of " "flag parsing in the CommandLineInterface."; return 1; // Do not add a default case. } } return 0; } bool CommandLineInterface::InitializeDiskSourceTree( DiskSourceTree* source_tree) { AddDefaultProtoPaths(&proto_path_); // Set up the source tree. for (int i = 0; i < proto_path_.size(); i++) { source_tree->MapPath(proto_path_[i].first, proto_path_[i].second); } // Map input files to virtual paths if possible. if (!MakeInputsBeProtoPathRelative(source_tree)) { return false; } return true; } bool CommandLineInterface::PopulateSimpleDescriptorDatabase( SimpleDescriptorDatabase* database) { for (int i = 0; i < descriptor_set_in_names_.size(); i++) { int fd; do { fd = open(descriptor_set_in_names_[i].c_str(), O_RDONLY | O_BINARY); } while (fd < 0 && errno == EINTR); if (fd < 0) { std::cerr << descriptor_set_in_names_[i] << ": " << strerror(ENOENT) << std::endl; return false; } FileDescriptorSet file_descriptor_set; bool parsed = file_descriptor_set.ParseFromFileDescriptor(fd); if (close(fd) != 0) { std::cerr << descriptor_set_in_names_[i] << ": close: " << strerror(errno) << std::endl; return false; } if (!parsed) { std::cerr << descriptor_set_in_names_[i] << ": Unable to parse." << std::endl; return false; } for (int j = 0; j < file_descriptor_set.file_size(); j++) { FileDescriptorProto previously_added_file_descriptor_proto; if (database->FindFileByName(file_descriptor_set.file(j).name(), &previously_added_file_descriptor_proto)) { // already present - skip continue; } if (!database->Add(file_descriptor_set.file(j))) { return false; } } } return true; } bool CommandLineInterface::ParseInputFiles( DescriptorPool* descriptor_pool, std::vector* parsed_files) { // Parse each file. for (int i = 0; i < input_files_.size(); i++) { // Import the file. descriptor_pool->AddUnusedImportTrackFile(input_files_[i]); const FileDescriptor* parsed_file = descriptor_pool->FindFileByName(input_files_[i]); descriptor_pool->ClearUnusedImportTrackFiles(); if (parsed_file == NULL) { if (!descriptor_set_in_names_.empty()) { std::cerr << input_files_[i] << ": " << strerror(ENOENT) << std::endl; } return false; } parsed_files->push_back(parsed_file); // Enforce --disallow_services. if (disallow_services_ && parsed_file->service_count() > 0) { std::cerr << parsed_file->name() << ": This file contains services, but " "--disallow_services was used." << std::endl; return false; } // Enforce --direct_dependencies if (direct_dependencies_explicitly_set_) { bool indirect_imports = false; for (int i = 0; i < parsed_file->dependency_count(); i++) { if (direct_dependencies_.find(parsed_file->dependency(i)->name()) == 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 */) << std::endl; } } if (indirect_imports) { return false; } } } return true; } void CommandLineInterface::Clear() { // Clear all members that are set by Run(). Note that we must not clear // members which are set by other methods before Run() is called. executable_name_.clear(); proto_path_.clear(); input_files_.clear(); direct_dependencies_.clear(); direct_dependencies_violation_msg_ = kDefaultDirectDependenciesViolationMsg; output_directives_.clear(); codec_type_.clear(); descriptor_set_in_names_.clear(); descriptor_set_out_name_.clear(); dependency_out_name_.clear(); mode_ = MODE_COMPILE; print_mode_ = PRINT_NONE; imports_in_descriptor_set_ = false; source_info_in_descriptor_set_ = false; disallow_services_ = false; direct_dependencies_explicitly_set_ = false; } bool CommandLineInterface::MakeInputsBeProtoPathRelative( DiskSourceTree* source_tree) { for (int i = 0; i < input_files_.size(); i++) { // If the input file path is not a physical file path, it must be a virtual // path. if (access(input_files_[i].c_str(), F_OK) < 0) { string disk_file; if (source_tree->VirtualFileToDiskFile(input_files_[i], &disk_file)) { return true; } else { std::cerr << input_files_[i] << ": " << strerror(ENOENT) << std::endl; return false; } } string virtual_file, shadowing_disk_file; switch (source_tree->DiskFileToVirtualFile( input_files_[i], &virtual_file, &shadowing_disk_file)) { case DiskSourceTree::SUCCESS: input_files_[i] = virtual_file; break; case DiskSourceTree::SHADOWED: std::cerr << input_files_[i] << ": Input is shadowed in the --proto_path by \"" << shadowing_disk_file << "\". Either use the latter file as your input or reorder " "the --proto_path so that the former file's location " "comes first." << std::endl; return false; case DiskSourceTree::CANNOT_OPEN: std::cerr << input_files_[i] << ": " << strerror(errno) << std::endl; return false; case DiskSourceTree::NO_MAPPING: { // Try to interpret the path as a virtual path. string disk_file; if (source_tree->VirtualFileToDiskFile(input_files_[i], &disk_file)) { return true; } else { // The input file path can't be mapped to any --proto_path and it also // can't be interpreted as a virtual path. std::cerr << input_files_[i] << ": File does not reside within any path " "specified using --proto_path (or -I). You must specify a " "--proto_path which encompasses this file. Note that the " "proto_path must be an exact prefix of the .proto file " "names -- protoc is too dumb to figure out when two paths " "(e.g. absolute and relative) are equivalent (it's harder " "than you think)." << std::endl; return false; } } } } return true; } bool CommandLineInterface::ExpandArgumentFile(const string& file, std::vector* arguments) { // The argument file is searched in the working directory only. We don't // use the proto import path here. std::ifstream file_stream(file.c_str()); if (!file_stream.is_open()) { return false; } string argument; // We don't support any kind of shell expansion right now. while (std::getline(file_stream, argument)) { arguments->push_back(argument); } return true; } CommandLineInterface::ParseArgumentStatus CommandLineInterface::ParseArguments(int argc, const char* const argv[]) { executable_name_ = argv[0]; std::vector arguments; for (int i = 1; i < argc; ++i) { if (argv[i][0] == '@') { if (!ExpandArgumentFile(argv[i] + 1, &arguments)) { std::cerr << "Failed to open argument file: " << (argv[i] + 1) << std::endl; return PARSE_ARGUMENT_FAIL; } continue; } arguments.push_back(argv[i]); } // if no arguments are given, show help if (arguments.empty()) { PrintHelpText(); return PARSE_ARGUMENT_DONE_AND_EXIT; // Exit without running compiler. } // Iterate through all arguments and parse them. for (int i = 0; i < arguments.size(); ++i) { string name, value; if (ParseArgument(arguments[i].c_str(), &name, &value)) { // Returned true => Use the next argument as the flag value. if (i + 1 == arguments.size() || arguments[i + 1][0] == '-') { std::cerr << "Missing value for flag: " << name << std::endl; if (name == "--decode") { std::cerr << "To decode an unknown message, use --decode_raw." << std::endl; } return PARSE_ARGUMENT_FAIL; } else { ++i; value = arguments[i]; } } ParseArgumentStatus status = InterpretArgument(name, value); if (status != PARSE_ARGUMENT_DONE_AND_CONTINUE) return status; } // Make sure each plugin option has a matching plugin output. bool foundUnknownPluginOption = false; for (std::map::const_iterator i = plugin_parameters_.begin(); i != plugin_parameters_.end(); ++i) { if (plugins_.find(i->first) != plugins_.end()) { continue; } bool foundImplicitPlugin = false; for (std::vector::const_iterator j = output_directives_.begin(); j != output_directives_.end(); ++j) { if (j->generator == NULL) { string plugin_name = PluginName(plugin_prefix_ , j->name); if (plugin_name == i->first) { foundImplicitPlugin = true; break; } } } if (!foundImplicitPlugin) { std::cerr << "Unknown flag: " // strip prefix + "gen-" and add back "_opt" << "--" + i->first.substr(plugin_prefix_.size() + 4) + "_opt" << std::endl; foundUnknownPluginOption = true; } } if (foundUnknownPluginOption) { return PARSE_ARGUMENT_FAIL; } // If no --proto_path was given, use the current working directory. if (proto_path_.empty()) { // Don't use make_pair as the old/default standard library on Solaris // doesn't support it without explicit template parameters, which are // incompatible with C++0x's make_pair. proto_path_.push_back(std::pair("", ".")); } // Check some errror cases. bool decoding_raw = (mode_ == MODE_DECODE) && codec_type_.empty(); if (decoding_raw && !input_files_.empty()) { std::cerr << "When using --decode_raw, no input files should be given." << std::endl; return PARSE_ARGUMENT_FAIL; } else if (!decoding_raw && input_files_.empty()) { std::cerr << "Missing input file." << std::endl; return PARSE_ARGUMENT_FAIL; } if (mode_ == MODE_COMPILE && output_directives_.empty() && descriptor_set_out_name_.empty()) { std::cerr << "Missing output directives." << std::endl; return PARSE_ARGUMENT_FAIL; } if (mode_ != MODE_COMPILE && !dependency_out_name_.empty()) { std::cerr << "Can only use --dependency_out=FILE when generating code." << std::endl; return PARSE_ARGUMENT_FAIL; } if (!dependency_out_name_.empty() && input_files_.size() > 1) { std::cerr << "Can only process one input file when using --dependency_out=FILE." << std::endl; return PARSE_ARGUMENT_FAIL; } if (imports_in_descriptor_set_ && descriptor_set_out_name_.empty()) { std::cerr << "--include_imports only makes sense when combined with " "--descriptor_set_out." << std::endl; } if (source_info_in_descriptor_set_ && descriptor_set_out_name_.empty()) { std::cerr << "--include_source_info only makes sense when combined with " "--descriptor_set_out." << std::endl; } return PARSE_ARGUMENT_DONE_AND_CONTINUE; } bool CommandLineInterface::ParseArgument(const char* arg, string* name, string* value) { bool parsed_value = false; if (arg[0] != '-') { // Not a flag. name->clear(); parsed_value = true; *value = arg; } else if (arg[1] == '-') { // Two dashes: Multi-character name, with '=' separating name and // value. const char* equals_pos = strchr(arg, '='); if (equals_pos != NULL) { *name = string(arg, equals_pos - arg); *value = equals_pos + 1; parsed_value = true; } else { *name = arg; } } else { // One dash: One-character name, all subsequent characters are the // value. if (arg[1] == '\0') { // arg is just "-". We treat this as an input file, except that at // present this will just lead to a "file not found" error. name->clear(); *value = arg; parsed_value = true; } else { *name = string(arg, 2); *value = arg + 2; parsed_value = !value->empty(); } } // Need to return true iff the next arg should be used as the value for this // one, false otherwise. if (parsed_value) { // We already parsed a value for this flag. return false; } if (*name == "-h" || *name == "--help" || *name == "--disallow_services" || *name == "--include_imports" || *name == "--include_source_info" || *name == "--version" || *name == "--decode_raw" || *name == "--print_free_field_numbers") { // HACK: These are the only flags that don't take a value. // They probably should not be hard-coded like this but for now it's // not worth doing better. return false; } // Next argument is the flag value. return true; } CommandLineInterface::ParseArgumentStatus CommandLineInterface::InterpretArgument(const string& name, const string& value) { if (name.empty()) { // Not a flag. Just a filename. if (value.empty()) { std::cerr << "You seem to have passed an empty string as one of the " "arguments to " << executable_name_ << ". This is actually " "sort of hard to do. Congrats. Unfortunately it is not valid " "input so the program is going to die now." << std::endl; return PARSE_ARGUMENT_FAIL; } input_files_.push_back(value); } else if (name == "-I" || name == "--proto_path") { if (!descriptor_set_in_names_.empty()) { std::cerr << "Only one of " << name << " and --descriptor_set_in can be specified." << std::endl; return PARSE_ARGUMENT_FAIL; } // 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 parts = Split( value, CommandLineInterface::kPathSeparator, true); for (int i = 0; i < parts.size(); i++) { string virtual_path; string disk_path; string::size_type equals_pos = parts[i].find_first_of('='); if (equals_pos == string::npos) { virtual_path = ""; disk_path = parts[i]; } else { virtual_path = parts[i].substr(0, equals_pos); disk_path = parts[i].substr(equals_pos + 1); } if (disk_path.empty()) { std::cerr << "--proto_path passed empty directory name. (Use \".\" for " "current directory.)" << std::endl; return PARSE_ARGUMENT_FAIL; } // Make sure disk path exists, warn otherwise. if (access(disk_path.c_str(), F_OK) < 0) { // Try the original path; it may have just happed to have a '=' in it. if (access(parts[i].c_str(), F_OK) < 0) { std::cerr << disk_path << ": warning: directory does not exist." << std::endl; } else { virtual_path = ""; disk_path = parts[i]; } } // Don't use make_pair as the old/default standard library on Solaris // doesn't support it without explicit template parameters, which are // incompatible with C++0x's make_pair. proto_path_.push_back(std::pair(virtual_path, disk_path)); } } else if (name == "--direct_dependencies") { if (direct_dependencies_explicitly_set_) { std::cerr << name << " may only be passed once. To specify multiple " "direct dependencies, pass them all as a single " "parameter separated by ':'." << std::endl; return PARSE_ARGUMENT_FAIL; } direct_dependencies_explicitly_set_ = true; std::vector direct = Split( value, ":", true); GOOGLE_DCHECK(direct_dependencies_.empty()); direct_dependencies_.insert(direct.begin(), direct.end()); } else if (name == "--direct_dependencies_violation_msg") { direct_dependencies_violation_msg_ = value; } else if (name == "--descriptor_set_in") { if (!descriptor_set_in_names_.empty()) { std::cerr << name << " may only be passed once. To specify multiple " "descriptor sets, pass them all as a single " "parameter separated by '" << CommandLineInterface::kPathSeparator << "'." << std::endl; return PARSE_ARGUMENT_FAIL; } if (value.empty()) { std::cerr << name << " requires a non-empty value." << std::endl; return PARSE_ARGUMENT_FAIL; } if (!proto_path_.empty()) { std::cerr << "Only one of " << name << " and --proto_path can be specified." << std::endl; return PARSE_ARGUMENT_FAIL; } if (!dependency_out_name_.empty()) { std::cerr << name << " cannot be used with --dependency_out." << std::endl; return PARSE_ARGUMENT_FAIL; } descriptor_set_in_names_ = Split( value, CommandLineInterface::kPathSeparator, true); } else if (name == "-o" || name == "--descriptor_set_out") { if (!descriptor_set_out_name_.empty()) { std::cerr << name << " may only be passed once." << std::endl; return PARSE_ARGUMENT_FAIL; } if (value.empty()) { std::cerr << name << " requires a non-empty value." << std::endl; return PARSE_ARGUMENT_FAIL; } if (mode_ != MODE_COMPILE) { std::cerr << "Cannot use --encode or --decode and generate descriptors at the " "same time." << std::endl; return PARSE_ARGUMENT_FAIL; } descriptor_set_out_name_ = value; } else if (name == "--dependency_out") { if (!dependency_out_name_.empty()) { std::cerr << name << " may only be passed once." << std::endl; return PARSE_ARGUMENT_FAIL; } if (value.empty()) { std::cerr << name << " requires a non-empty value." << std::endl; return PARSE_ARGUMENT_FAIL; } if (!descriptor_set_in_names_.empty()) { std::cerr << name << " cannot be used with --descriptor_set_in." << std::endl; return PARSE_ARGUMENT_FAIL; } dependency_out_name_ = value; } else if (name == "--include_imports") { if (imports_in_descriptor_set_) { std::cerr << name << " may only be passed once." << std::endl; return PARSE_ARGUMENT_FAIL; } imports_in_descriptor_set_ = true; } else if (name == "--include_source_info") { if (source_info_in_descriptor_set_) { std::cerr << name << " may only be passed once." << std::endl; return PARSE_ARGUMENT_FAIL; } source_info_in_descriptor_set_ = true; } else if (name == "-h" || name == "--help") { PrintHelpText(); return PARSE_ARGUMENT_DONE_AND_EXIT; // Exit without running compiler. } else if (name == "--version") { if (!version_info_.empty()) { std::cout << version_info_ << std::endl; } std::cout << "libprotoc " << protobuf::internal::VersionString(GOOGLE_PROTOBUF_VERSION) << std::endl; return PARSE_ARGUMENT_DONE_AND_EXIT; // Exit without running compiler. } else if (name == "--disallow_services") { disallow_services_ = true; } else if (name == "--encode" || name == "--decode" || name == "--decode_raw") { if (mode_ != MODE_COMPILE) { std::cerr << "Only one of --encode and --decode can be specified." << std::endl; return PARSE_ARGUMENT_FAIL; } if (!output_directives_.empty() || !descriptor_set_out_name_.empty()) { std::cerr << "Cannot use " << name << " and generate code or descriptors at the same time." << std::endl; return PARSE_ARGUMENT_FAIL; } mode_ = (name == "--encode") ? MODE_ENCODE : MODE_DECODE; if (value.empty() && name != "--decode_raw") { std::cerr << "Type name for " << name << " cannot be blank." << std::endl; if (name == "--decode") { std::cerr << "To decode an unknown message, use --decode_raw." << std::endl; } return PARSE_ARGUMENT_FAIL; } else if (!value.empty() && name == "--decode_raw") { std::cerr << "--decode_raw does not take a parameter." << std::endl; return PARSE_ARGUMENT_FAIL; } codec_type_ = value; } else if (name == "--error_format") { if (value == "gcc") { error_format_ = ERROR_FORMAT_GCC; } else if (value == "msvs") { error_format_ = ERROR_FORMAT_MSVS; } else { std::cerr << "Unknown error format: " << value << std::endl; return PARSE_ARGUMENT_FAIL; } } else if (name == "--plugin") { if (plugin_prefix_.empty()) { std::cerr << "This compiler does not support plugins." << std::endl; return PARSE_ARGUMENT_FAIL; } string plugin_name; string path; string::size_type equals_pos = value.find_first_of('='); if (equals_pos == string::npos) { // Use the basename of the file. string::size_type slash_pos = value.find_last_of('/'); if (slash_pos == string::npos) { plugin_name = value; } else { plugin_name = value.substr(slash_pos + 1); } path = value; } else { plugin_name = value.substr(0, equals_pos); path = value.substr(equals_pos + 1); } plugins_[plugin_name] = path; } else if (name == "--print_free_field_numbers") { if (mode_ != MODE_COMPILE) { std::cerr << "Cannot use " << name << " and use --encode, --decode or print " << "other info at the same time." << std::endl; return PARSE_ARGUMENT_FAIL; } if (!output_directives_.empty() || !descriptor_set_out_name_.empty()) { std::cerr << "Cannot use " << name << " and generate code or descriptors at the same time." << std::endl; return PARSE_ARGUMENT_FAIL; } mode_ = MODE_PRINT; print_mode_ = PRINT_FREE_FIELDS; } else if (name == "--profile_path") { } else { // Some other flag. Look it up in the generators list. const GeneratorInfo* generator_info = FindOrNull(generators_by_flag_name_, name); if (generator_info == NULL && (plugin_prefix_.empty() || !HasSuffixString(name, "_out"))) { // Check if it's a generator option flag. generator_info = FindOrNull(generators_by_option_name_, name); if (generator_info != NULL) { string* parameters = &generator_parameters_[generator_info->flag_name]; if (!parameters->empty()) { parameters->append(","); } parameters->append(value); } else if (HasPrefixString(name, "--") && HasSuffixString(name, "_opt")) { string* parameters = &plugin_parameters_[PluginName(plugin_prefix_, name)]; if (!parameters->empty()) { parameters->append(","); } parameters->append(value); } else { std::cerr << "Unknown flag: " << name << std::endl; return PARSE_ARGUMENT_FAIL; } } else { // It's an output flag. Add it to the output directives. if (mode_ != MODE_COMPILE) { std::cerr << "Cannot use --encode, --decode or print .proto info and " "generate code at the same time." << std::endl; return PARSE_ARGUMENT_FAIL; } OutputDirective directive; directive.name = name; if (generator_info == NULL) { directive.generator = NULL; } else { directive.generator = generator_info->generator; } // Split value at ':' to separate the generator parameter from the // filename. However, avoid doing this if the colon is part of a valid // Windows-style absolute path. string::size_type colon_pos = value.find_first_of(':'); if (colon_pos == string::npos || IsWindowsAbsolutePath(value)) { directive.output_location = value; } else { directive.parameter = value.substr(0, colon_pos); directive.output_location = value.substr(colon_pos + 1); } output_directives_.push_back(directive); } } return PARSE_ARGUMENT_DONE_AND_CONTINUE; } void CommandLineInterface::PrintHelpText() { // Sorry for indentation here; line wrapping would be uglier. std::cout << "Usage: " << executable_name_ << " [OPTION] PROTO_FILES\n" "Parse PROTO_FILES and generate output based on the options given:\n" " -IPATH, --proto_path=PATH Specify the directory in which to search for\n" " imports. May be specified multiple times;\n" " directories will be searched in order. If not\n" " given, the current working directory is used.\n" " --version Show version info and exit.\n" " -h, --help Show this text and exit.\n" " --encode=MESSAGE_TYPE Read a text-format message of the given type\n" " from standard input and write it in binary\n" " to standard output. The message type must\n" " be defined in PROTO_FILES or their imports.\n" " --decode=MESSAGE_TYPE Read a binary message of the given type from\n" " standard input and write it in text format\n" " to standard output. The message type must\n" " be defined in PROTO_FILES or their imports.\n" " --decode_raw Read an arbitrary protocol message from\n" " standard input and write the raw tag/value\n" " pairs in text format to standard output. No\n" " PROTO_FILES should be given when using this\n" " flag.\n" " --descriptor_set_in=FILES Specifies a delimited list of FILES\n" " each containing a FileDescriptorSet (a\n" " protocol buffer defined in descriptor.proto).\n" " The FileDescriptor for each of the PROTO_FILES\n" " provided will be loaded from these\n" " FileDescriptorSets. If a FileDescriptor\n" " appears multiple times, the first occurrence\n" " will be used.\n" " -oFILE, Writes a FileDescriptorSet (a protocol buffer,\n" " --descriptor_set_out=FILE defined in descriptor.proto) containing all of\n" " the input files to FILE.\n" " --include_imports When using --descriptor_set_out, also include\n" " all dependencies of the input files in the\n" " set, so that the set is self-contained.\n" " --include_source_info When using --descriptor_set_out, do not strip\n" " SourceCodeInfo from the FileDescriptorProto.\n" " This results in vastly larger descriptors that\n" " include information about the original\n" " location of each decl in the source file as\n" " well as surrounding comments.\n" " --dependency_out=FILE Write a dependency output file in the format\n" " expected by make. This writes the transitive\n" " set of input file paths to FILE\n" " --error_format=FORMAT Set the format in which to print errors.\n" " FORMAT may be 'gcc' (the default) or 'msvs'\n" " (Microsoft Visual Studio format).\n" " --print_free_field_numbers Print the free field numbers of the messages\n" " defined in the given proto files. Groups share\n" " the same field number space with the parent \n" " message. Extension ranges are counted as \n" " occupied fields numbers.\n" << std::endl; if (!plugin_prefix_.empty()) { std::cout << " --plugin=EXECUTABLE Specifies a plugin executable to use.\n" " Normally, protoc searches the PATH for\n" " plugins, but you may specify additional\n" " executables not in the path using this flag.\n" " Additionally, EXECUTABLE may be of the form\n" " NAME=PATH, in which case the given plugin name\n" " is mapped to the given executable even if\n" " the executable's own name differs." << std::endl; } for (GeneratorMap::iterator iter = generators_by_flag_name_.begin(); iter != generators_by_flag_name_.end(); ++iter) { // 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 << " " << iter->first << "=OUT_DIR " << string(19 - iter->first.size(), ' ') // Spaces for alignment. << iter->second.help_text << std::endl; } std::cerr << " @ Read options and filenames from file. If a\n" " relative file path is specified, the file\n" " will be searched in the working directory.\n" " The --proto_path option will not affect how\n" " this argument file is searched. Content of\n" " the file will be expanded in the position of\n" " @ as in the argument list. Note\n" " that shell expansion is not applied to the\n" " content of the file (i.e., you cannot use\n" " quotes, wildcards, escapes, commands, etc.).\n" " Each line corresponds to a single argument,\n" " even if it contains spaces." << std::endl; } bool CommandLineInterface::GenerateOutput( const std::vector& parsed_files, const OutputDirective& output_directive, GeneratorContext* generator_context) { // Call the generator. string error; if (output_directive.generator == NULL) { // This is a plugin. GOOGLE_CHECK(HasPrefixString(output_directive.name, "--") && HasSuffixString(output_directive.name, "_out")) << "Bad name for plugin generator: " << output_directive.name; string plugin_name = PluginName(plugin_prefix_ , output_directive.name); string parameters = output_directive.parameter; if (!plugin_parameters_[plugin_name].empty()) { if (!parameters.empty()) { parameters.append(","); } parameters.append(plugin_parameters_[plugin_name]); } if (!GeneratePluginOutput(parsed_files, plugin_name, parameters, generator_context, &error)) { std::cerr << output_directive.name << ": " << error << std::endl; return false; } } else { // Regular generator. string parameters = output_directive.parameter; if (!generator_parameters_[output_directive.name].empty()) { if (!parameters.empty()) { parameters.append(","); } parameters.append(generator_parameters_[output_directive.name]); } if (!output_directive.generator->GenerateAll( parsed_files, parameters, generator_context, &error)) { // Generator returned an error. std::cerr << output_directive.name << ": " << error << std::endl; return false; } } return true; } bool CommandLineInterface::GenerateDependencyManifestFile( const std::vector& parsed_files, const GeneratorContextMap& output_directories, DiskSourceTree* source_tree) { FileDescriptorSet file_set; std::set already_seen; for (int i = 0; i < parsed_files.size(); i++) { GetTransitiveDependencies(parsed_files[i], false, false, &already_seen, file_set.mutable_file()); } std::vector output_filenames; for (GeneratorContextMap::const_iterator iter = output_directories.begin(); iter != output_directories.end(); ++iter) { const string& location = iter->first; GeneratorContextImpl* directory = iter->second; std::vector relative_output_filenames; directory->GetOutputFilenames(&relative_output_filenames); for (int i = 0; i < relative_output_filenames.size(); i++) { string output_filename = location + relative_output_filenames[i]; if (output_filename.compare(0, 2, "./") == 0) { output_filename = output_filename.substr(2); } output_filenames.push_back(output_filename); } } int fd; do { fd = open(dependency_out_name_.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); } while (fd < 0 && errno == EINTR); if (fd < 0) { perror(dependency_out_name_.c_str()); return false; } io::FileOutputStream out(fd); io::Printer printer(&out, '$'); for (int i = 0; i < output_filenames.size(); i++) { printer.Print(output_filenames[i].c_str()); if (i == output_filenames.size() - 1) { printer.Print(":"); } else { printer.Print(" \\\n"); } } for (int i = 0; i < file_set.file_size(); i++) { const FileDescriptorProto& file = file_set.file(i); const string& virtual_file = file.name(); string disk_file; if (source_tree && source_tree->VirtualFileToDiskFile(virtual_file, &disk_file)) { printer.Print(" $disk_file$", "disk_file", disk_file); if (i < file_set.file_size() - 1) printer.Print("\\\n"); } else { std::cerr << "Unable to identify path for file " << virtual_file << std::endl; return false; } } return true; } bool CommandLineInterface::GeneratePluginOutput( const std::vector& parsed_files, const string& plugin_name, const string& parameter, GeneratorContext* generator_context, string* error) { CodeGeneratorRequest request; CodeGeneratorResponse response; // Build the request. if (!parameter.empty()) { request.set_parameter(parameter); } std::set already_seen; for (int i = 0; i < parsed_files.size(); i++) { request.add_file_to_generate(parsed_files[i]->name()); GetTransitiveDependencies(parsed_files[i], true, // Include json_name for plugins. true, // Include source code info. &already_seen, request.mutable_proto_file()); } google::protobuf::compiler::Version* version = request.mutable_compiler_version(); version->set_major(GOOGLE_PROTOBUF_VERSION / 1000000); version->set_minor(GOOGLE_PROTOBUF_VERSION / 1000 % 1000); version->set_patch(GOOGLE_PROTOBUF_VERSION % 1000); version->set_suffix(GOOGLE_PROTOBUF_VERSION_SUFFIX); // Invoke the plugin. Subprocess subprocess; if (plugins_.count(plugin_name) > 0) { subprocess.Start(plugins_[plugin_name], Subprocess::EXACT_NAME); } else { subprocess.Start(plugin_name, Subprocess::SEARCH_PATH); } string communicate_error; if (!subprocess.Communicate(request, &response, &communicate_error)) { *error = strings::Substitute("$0: $1", plugin_name, communicate_error); return false; } // Write the files. We do this even if there was a generator error in order // to match the behavior of a compiled-in generator. google::protobuf::scoped_ptr current_output; for (int i = 0; i < response.file_size(); i++) { const CodeGeneratorResponse::File& output_file = response.file(i); if (!output_file.insertion_point().empty()) { // Open a file for insert. // We reset current_output to NULL first so that the old file is closed // before the new one is opened. current_output.reset(); current_output.reset(generator_context->OpenForInsert( output_file.name(), output_file.insertion_point())); } else if (!output_file.name().empty()) { // Starting a new file. Open it. // We reset current_output to NULL first so that the old file is closed // before the new one is opened. current_output.reset(); current_output.reset(generator_context->Open(output_file.name())); } else if (current_output == NULL) { *error = strings::Substitute( "$0: First file chunk returned by plugin did not specify a file name.", plugin_name); return false; } // Use CodedOutputStream for convenience; otherwise we'd need to provide // our own buffer-copying loop. io::CodedOutputStream writer(current_output.get()); writer.WriteString(output_file.content()); } // Check for errors. if (!response.error().empty()) { // Generator returned an error. *error = response.error(); return false; } return true; } bool CommandLineInterface::EncodeOrDecode(const DescriptorPool* pool) { // Look up the type. const Descriptor* type = pool->FindMessageTypeByName(codec_type_); if (type == NULL) { std::cerr << "Type not defined: " << codec_type_ << std::endl; return false; } DynamicMessageFactory dynamic_factory(pool); google::protobuf::scoped_ptr message(dynamic_factory.GetPrototype(type)->New()); if (mode_ == MODE_ENCODE) { SetFdToTextMode(STDIN_FILENO); SetFdToBinaryMode(STDOUT_FILENO); } else { SetFdToBinaryMode(STDIN_FILENO); SetFdToTextMode(STDOUT_FILENO); } io::FileInputStream in(STDIN_FILENO); io::FileOutputStream out(STDOUT_FILENO); if (mode_ == MODE_ENCODE) { // Input is text. ErrorPrinter error_collector(error_format_); TextFormat::Parser parser; parser.RecordErrorsTo(&error_collector); parser.AllowPartialMessage(true); if (!parser.Parse(&in, message.get())) { std::cerr << "Failed to parse input." << std::endl; return false; } } else { // Input is binary. if (!message->ParsePartialFromZeroCopyStream(&in)) { std::cerr << "Failed to parse input." << std::endl; return false; } } if (!message->IsInitialized()) { std::cerr << "warning: Input message is missing required fields: " << message->InitializationErrorString() << std::endl; } if (mode_ == MODE_ENCODE) { // Output is binary. if (!message->SerializePartialToZeroCopyStream(&out)) { std::cerr << "output: I/O error." << std::endl; return false; } } else { // Output is text. if (!TextFormat::Print(*message, &out)) { std::cerr << "output: I/O error." << std::endl; return false; } } return true; } bool CommandLineInterface::WriteDescriptorSet( const std::vector& parsed_files) { FileDescriptorSet file_set; std::set already_seen; if (!imports_in_descriptor_set_) { // Since we don't want to output transitive dependencies, but we do want // things to be in dependency order, add all dependencies that aren't in // parsed_files to already_seen. This will short circuit the recursion // in GetTransitiveDependencies. std::set to_output; to_output.insert(parsed_files.begin(), parsed_files.end()); for (int i = 0; i < parsed_files.size(); i++) { const FileDescriptor* file = parsed_files[i]; for (int i = 0; i < file->dependency_count(); i++) { const FileDescriptor* dependency = file->dependency(i); // if the dependency isn't in parsed files, mark it as already seen if (to_output.find(dependency) == to_output.end()) { already_seen.insert(dependency); } } } } for (int i = 0; i < parsed_files.size(); i++) { GetTransitiveDependencies(parsed_files[i], true, // Include json_name source_info_in_descriptor_set_, &already_seen, file_set.mutable_file()); } int fd; do { fd = open(descriptor_set_out_name_.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); } while (fd < 0 && errno == EINTR); if (fd < 0) { perror(descriptor_set_out_name_.c_str()); return false; } io::FileOutputStream out(fd); if (!file_set.SerializeToZeroCopyStream(&out)) { std::cerr << descriptor_set_out_name_ << ": " << strerror(out.GetErrno()) << std::endl; out.Close(); return false; } if (!out.Close()) { std::cerr << descriptor_set_out_name_ << ": " << strerror(out.GetErrno()) << std::endl; return false; } return true; } void CommandLineInterface::GetTransitiveDependencies( const FileDescriptor* file, bool include_json_name, bool include_source_code_info, std::set* already_seen, RepeatedPtrField* output) { if (!already_seen->insert(file).second) { // Already saw this file. Skip. return; } // Add all dependencies. for (int i = 0; i < file->dependency_count(); i++) { GetTransitiveDependencies(file->dependency(i), include_json_name, include_source_code_info, already_seen, output); } // Add this file. FileDescriptorProto* new_descriptor = output->Add(); file->CopyTo(new_descriptor); if (include_json_name) { file->CopyJsonNameTo(new_descriptor); } if (include_source_code_info) { file->CopySourceCodeInfoTo(new_descriptor); } } namespace { // Utility function for PrintFreeFieldNumbers. // Stores occupied ranges into the ranges parameter, and next level of sub // message types into the nested_messages parameter. The FieldRange is left // inclusive, right exclusive. i.e. [a, b). // // Nested Messages: // Note that it only stores the nested message type, iff the nested type is // either a direct child of the given descriptor, or the nested type is a // decendent of the given descriptor and all the nodes between the // nested type and the given descriptor are group types. e.g. // // message Foo { // message Bar { // message NestedBar {} // } // group Baz = 1 { // group NestedBazGroup = 2 { // message Quz { // message NestedQuz {} // } // } // message NestedBaz {} // } // } // // In this case, Bar, Quz and NestedBaz will be added into the nested types. // Since free field numbers of group types will not be printed, this makes sure // the nested message types in groups will not be dropped. The nested_messages // parameter will contain the direct children (when groups are ignored in the // tree) of the given descriptor for the caller to traverse. The declaration // order of the nested messages is also preserved. typedef std::pair FieldRange; void GatherOccupiedFieldRanges( const Descriptor* descriptor, std::set* ranges, std::vector* nested_messages) { std::set groups; for (int i = 0; i < descriptor->field_count(); ++i) { const FieldDescriptor* fd = descriptor->field(i); ranges->insert(FieldRange(fd->number(), fd->number() + 1)); if (fd->type() == FieldDescriptor::TYPE_GROUP) { groups.insert(fd->message_type()); } } for (int i = 0; i < descriptor->extension_range_count(); ++i) { ranges->insert(FieldRange(descriptor->extension_range(i)->start, descriptor->extension_range(i)->end)); } for (int i = 0; i < descriptor->reserved_range_count(); ++i) { ranges->insert(FieldRange(descriptor->reserved_range(i)->start, descriptor->reserved_range(i)->end)); } // Handle the nested messages/groups in declaration order to make it // post-order strict. for (int i = 0; i < descriptor->nested_type_count(); ++i) { const Descriptor* nested_desc = descriptor->nested_type(i); if (groups.find(nested_desc) != groups.end()) { GatherOccupiedFieldRanges(nested_desc, ranges, nested_messages); } else { nested_messages->push_back(nested_desc); } } } // Utility function for PrintFreeFieldNumbers. // Actually prints the formatted free field numbers for given message name and // occupied ranges. void FormatFreeFieldNumbers(const string& name, const std::set& ranges) { string output; StringAppendF(&output, "%-35s free:", name.c_str()); int next_free_number = 1; for (std::set::const_iterator i = ranges.begin(); i != ranges.end(); ++i) { // This happens when groups re-use parent field numbers, in which // case we skip the FieldRange entirely. if (next_free_number >= i->second) continue; if (next_free_number < i->first) { if (next_free_number + 1 == i->first) { // Singleton StringAppendF(&output, " %d", next_free_number); } else { // Range StringAppendF(&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); } std::cout << output << std::endl; } } // namespace void CommandLineInterface::PrintFreeFieldNumbers( const Descriptor* descriptor) { std::set ranges; std::vector nested_messages; GatherOccupiedFieldRanges(descriptor, &ranges, &nested_messages); for (int i = 0; i < nested_messages.size(); ++i) { PrintFreeFieldNumbers(nested_messages[i]); } FormatFreeFieldNumbers(descriptor->full_name(), ranges); } } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/command_line_interface.h000066400000000000000000000451161334102242000337300ustar00rootroot00000000000000// 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. // // Implements the Protocol Compiler front-end such that it may be reused by // custom compilers written to support other languages. #ifndef GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__ #define GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__ #include #include #include #include #include #include #include namespace google { namespace protobuf { class Descriptor; // descriptor.h class DescriptorPool; // descriptor.h class FileDescriptor; // descriptor.h class FileDescriptorSet; // descriptor.h class FileDescriptorProto; // descriptor.pb.h template class RepeatedPtrField; // repeated_field.h class SimpleDescriptorDatabase; // descriptor_database.h namespace compiler { class CodeGenerator; // code_generator.h class GeneratorContext; // code_generator.h class DiskSourceTree; // importer.h // This class implements the command-line interface to the protocol compiler. // It is designed to make it very easy to create a custom protocol compiler // supporting the languages of your choice. For example, if you wanted to // create a custom protocol compiler binary which includes both the regular // C++ support plus support for your own custom output "Foo", you would // write a class "FooGenerator" which implements the CodeGenerator interface, // then write a main() procedure like this: // // int main(int argc, char* argv[]) { // google::protobuf::compiler::CommandLineInterface cli; // // // Support generation of C++ source and headers. // google::protobuf::compiler::cpp::CppGenerator cpp_generator; // cli.RegisterGenerator("--cpp_out", &cpp_generator, // "Generate C++ source and header."); // // // Support generation of Foo code. // FooGenerator foo_generator; // cli.RegisterGenerator("--foo_out", &foo_generator, // "Generate Foo file."); // // return cli.Run(argc, argv); // } // // The compiler is invoked with syntax like: // protoc --cpp_out=outdir --foo_out=outdir --proto_path=src src/foo.proto // // The .proto file to compile can be specified on the command line using either // its physical file path, or a virtual path relative to a diretory specified // in --proto_path. For example, for src/foo.proto, the following two protoc // invocations work the same way: // 1. protoc --proto_path=src src/foo.proto (physical file path) // 2. protoc --proto_path=src foo.proto (virtual path relative to src) // // If a file path can be interpreted both as a physical file path and as a // relative virtual path, the physical file path takes precendence. // // For a full description of the command-line syntax, invoke it with --help. class LIBPROTOC_EXPORT CommandLineInterface { public: static const char* const kPathSeparator; CommandLineInterface(); ~CommandLineInterface(); // Register a code generator for a language. // // Parameters: // * flag_name: The command-line flag used to specify an output file of // this type. The name must start with a '-'. If the name is longer // than one letter, it must start with two '-'s. // * generator: The CodeGenerator which will be called to generate files // of this type. // * help_text: Text describing this flag in the --help output. // // Some generators accept extra parameters. You can specify this parameter // on the command-line by placing it before the output directory, separated // by a colon: // protoc --foo_out=enable_bar:outdir // The text before the colon is passed to CodeGenerator::Generate() as the // "parameter". void RegisterGenerator(const string& flag_name, CodeGenerator* generator, const string& help_text); // Register a code generator for a language. // Besides flag_name you can specify another option_flag_name that could be // used to pass extra parameters to the registered code generator. // Suppose you have registered a generator by calling: // command_line_interface.RegisterGenerator("--foo_out", "--foo_opt", ...) // Then you could invoke the compiler with a command like: // protoc --foo_out=enable_bar:outdir --foo_opt=enable_baz // This will pass "enable_bar,enable_baz" as the parameter to the generator. void RegisterGenerator(const string& flag_name, const string& option_flag_name, CodeGenerator* generator, const string& help_text); // Enables "plugins". In this mode, if a command-line flag ends with "_out" // but does not match any registered generator, the compiler will attempt to // find a "plugin" to implement the generator. Plugins are just executables. // They should live somewhere in the PATH. // // The compiler determines the executable name to search for by concatenating // exe_name_prefix with the unrecognized flag name, removing "_out". So, for // example, if exe_name_prefix is "protoc-" and you pass the flag --foo_out, // the compiler will try to run the program "protoc-foo". // // The plugin program should implement the following usage: // plugin [--out=OUTDIR] [--parameter=PARAMETER] PROTO_FILES < DESCRIPTORS // --out indicates the output directory (as passed to the --foo_out // parameter); if omitted, the current directory should be used. --parameter // gives the generator parameter, if any was provided (see below). The // PROTO_FILES list the .proto files which were given on the compiler // command-line; these are the files for which the plugin is expected to // generate output code. Finally, DESCRIPTORS is an encoded FileDescriptorSet // (as defined in descriptor.proto). This is piped to the plugin's stdin. // The set will include descriptors for all the files listed in PROTO_FILES as // well as all files that they import. The plugin MUST NOT attempt to read // the PROTO_FILES directly -- it must use the FileDescriptorSet. // // The plugin should generate whatever files are necessary, as code generators // normally do. It should write the names of all files it generates to // stdout. The names should be relative to the output directory, NOT absolute // names or relative to the current directory. If any errors occur, error // messages should be written to stderr. If an error is fatal, the plugin // should exit with a non-zero exit code. // // Plugins can have generator parameters similar to normal built-in // generators. Extra generator parameters can be passed in via a matching // "_opt" parameter. For example: // protoc --plug_out=enable_bar:outdir --plug_opt=enable_baz // This will pass "enable_bar,enable_baz" as the parameter to the plugin. // void AllowPlugins(const string& exe_name_prefix); // Run the Protocol Compiler with the given command-line parameters. // Returns the error code which should be returned by main(). // // It may not be safe to call Run() in a multi-threaded environment because // it calls strerror(). I'm not sure why you'd want to do this anyway. int Run(int argc, const char* const argv[]); // DEPRECATED. Calling this method has no effect. Protocol compiler now // always try to find the .proto file relative to the current directory // first and if the file is not found, it will then treat the input path // as a virutal path. void SetInputsAreProtoPathRelative(bool /* enable */) {} // Provides some text which will be printed when the --version flag is // used. The version of libprotoc will also be printed on the next line // after this text. void SetVersionInfo(const string& text) { version_info_ = text; } private: // ----------------------------------------------------------------- class ErrorPrinter; class GeneratorContextImpl; class MemoryOutputStream; typedef hash_map GeneratorContextMap; // Clear state from previous Run(). void Clear(); // Remaps each file in input_files_ so that it is relative to one of the // directories in proto_path_. Returns false if an error occurred. This // is only used if inputs_are_proto_path_relative_ is false. bool MakeInputsBeProtoPathRelative( DiskSourceTree* source_tree); // Return status for ParseArguments() and InterpretArgument(). enum ParseArgumentStatus { PARSE_ARGUMENT_DONE_AND_CONTINUE, PARSE_ARGUMENT_DONE_AND_EXIT, PARSE_ARGUMENT_FAIL }; // Parse all command-line arguments. ParseArgumentStatus ParseArguments(int argc, const char* const argv[]); // Read an argument file and append the file's content to the list of // arguments. Return false if the file cannot be read. bool ExpandArgumentFile(const string& file, std::vector* arguments); // Parses a command-line argument into a name/value pair. Returns // true if the next argument in the argv should be used as the value, // false otherwise. // // Examples: // "-Isrc/protos" -> // name = "-I", value = "src/protos" // "--cpp_out=src/foo.pb2.cc" -> // name = "--cpp_out", value = "src/foo.pb2.cc" // "foo.proto" -> // name = "", value = "foo.proto" bool ParseArgument(const char* arg, string* name, string* value); // Interprets arguments parsed with ParseArgument. ParseArgumentStatus InterpretArgument(const string& name, const string& value); // Print the --help text to stderr. void PrintHelpText(); // Loads proto_path_ into the provided source_tree. bool InitializeDiskSourceTree(DiskSourceTree* source_tree); // Loads descriptor_set_in into the provided database bool PopulateSimpleDescriptorDatabase(SimpleDescriptorDatabase* database); // Parses input_files_ into parsed_files bool ParseInputFiles(DescriptorPool* descriptor_pool, std::vector* parsed_files); // Generate the given output file from the given input. struct OutputDirective; // see below bool GenerateOutput(const std::vector& parsed_files, const OutputDirective& output_directive, GeneratorContext* generator_context); bool GeneratePluginOutput( const std::vector& parsed_files, const string& plugin_name, const string& parameter, GeneratorContext* generator_context, string* error); // Implements --encode and --decode. bool EncodeOrDecode(const DescriptorPool* pool); // Implements the --descriptor_set_out option. bool WriteDescriptorSet( const std::vector& parsed_files); // Implements the --dependency_out option bool GenerateDependencyManifestFile( const std::vector& parsed_files, const GeneratorContextMap& output_directories, DiskSourceTree* source_tree); // Get all transitive dependencies of the given file (including the file // itself), adding them to the given list of FileDescriptorProtos. The // protos will be ordered such that every file is listed before any file that // depends on it, so that you can call DescriptorPool::BuildFile() on them // in order. Any files in *already_seen will not be added, and each file // added will be inserted into *already_seen. If include_source_code_info is // true then include the source code information in the FileDescriptorProtos. // If include_json_name is true, populate the json_name field of // FieldDescriptorProto for all fields. static void GetTransitiveDependencies( const FileDescriptor* file, bool include_json_name, bool include_source_code_info, std::set* already_seen, RepeatedPtrField* output); // Implements the --print_free_field_numbers. This function prints free field // numbers into stdout for the message and it's nested message types in // post-order, i.e. nested types first. Printed range are left-right // inclusive, i.e. [a, b]. // // Groups: // For historical reasons, groups are considered to share the same // field number space with the parent message, thus it will not print free // field numbers for groups. The field numbers used in the groups are // excluded in the free field numbers of the parent message. // // Extension Ranges: // Extension ranges are considered ocuppied field numbers and they will not be // listed as free numbers in the output. void PrintFreeFieldNumbers(const Descriptor* descriptor); // ----------------------------------------------------------------- // The name of the executable as invoked (i.e. argv[0]). string executable_name_; // Version info set with SetVersionInfo(). string version_info_; // Registered generators. struct GeneratorInfo { string flag_name; string option_flag_name; CodeGenerator* generator; string help_text; }; typedef std::map GeneratorMap; GeneratorMap generators_by_flag_name_; GeneratorMap generators_by_option_name_; // A map from generator names to the parameters specified using the option // flag. For example, if the user invokes the compiler with: // protoc --foo_out=outputdir --foo_opt=enable_bar ... // Then there will be an entry ("--foo_out", "enable_bar") in this map. std::map generator_parameters_; // Similar to generator_parameters_, but stores the parameters for plugins. std::map plugin_parameters_; // See AllowPlugins(). If this is empty, plugins aren't allowed. string plugin_prefix_; // Maps specific plugin names to files. When executing a plugin, this map // is searched first to find the plugin executable. If not found here, the // PATH (or other OS-specific search strategy) is searched. std::map plugins_; // Stuff parsed from command line. enum Mode { MODE_COMPILE, // Normal mode: parse .proto files and compile them. MODE_ENCODE, // --encode: read text from stdin, write binary to stdout. MODE_DECODE, // --decode: read binary from stdin, write text to stdout. MODE_PRINT, // Print mode: print info of the given .proto files and exit. }; Mode mode_; enum PrintMode { PRINT_NONE, // Not in MODE_PRINT PRINT_FREE_FIELDS, // --print_free_fields }; PrintMode print_mode_; enum ErrorFormat { ERROR_FORMAT_GCC, // GCC error output format (default). ERROR_FORMAT_MSVS // Visual Studio output (--error_format=msvs). }; ErrorFormat error_format_; std::vector > proto_path_; // Search path for proto files. std::vector input_files_; // Names of the input proto files. // Names of proto files which are allowed to be imported. Used by build // systems to enforce depend-on-what-you-import. std::set direct_dependencies_; bool direct_dependencies_explicitly_set_; // If there's a violation of depend-on-what-you-import, this string will be // presented to the user. "%s" will be replaced with the violating import. string direct_dependencies_violation_msg_; // output_directives_ lists all the files we are supposed to output and what // generator to use for each. struct OutputDirective { string name; // E.g. "--foo_out" CodeGenerator* generator; // NULL for plugins string parameter; string output_location; }; std::vector output_directives_; // When using --encode or --decode, this names the type we are encoding or // decoding. (Empty string indicates --decode_raw.) string codec_type_; // If --descriptor_set_in was given, these are filenames containing // parsed FileDescriptorSets to be used for loading protos. Otherwise, empty. std::vector descriptor_set_in_names_; // If --descriptor_set_out was given, this is the filename to which the // FileDescriptorSet should be written. Otherwise, empty. string descriptor_set_out_name_; // If --dependency_out was given, this is the path to the file where the // dependency file will be written. Otherwise, empty. string dependency_out_name_; // Path to a file that contains serialized AccessInfo which provides // relative hotness of fields per message. This helps protoc to generate // better code. string profile_path_; // True if --include_imports was given, meaning that we should // write all transitive dependencies to the DescriptorSet. Otherwise, only // the .proto files listed on the command-line are added. bool imports_in_descriptor_set_; // True if --include_source_info was given, meaning that we should not strip // SourceCodeInfo from the DescriptorSet. bool source_info_in_descriptor_set_; // Was the --disallow_services flag used? bool disallow_services_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CommandLineInterface); }; } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__ command_line_interface_unittest.cc000066400000000000000000002414001334102242000357400ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler// 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 #include #include #ifndef _MSC_VER #include #endif #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { #if defined(_WIN32) // DO NOT include , instead create functions in io_win32.{h,cc} and import // them like we do below. using google::protobuf::internal::win32::access; using google::protobuf::internal::win32::dup; using google::protobuf::internal::win32::dup2; using google::protobuf::internal::win32::close; using google::protobuf::internal::win32::open; using google::protobuf::internal::win32::write; #endif // Disable the whole test when we use tcmalloc for "draconian" heap checks, in // which case tcmalloc will print warnings that fail the plugin tests. #if !GOOGLE_PROTOBUF_HEAP_CHECK_DRACONIAN namespace { bool FileExists(const string& path) { return File::Exists(path); } class CommandLineInterfaceTest : public testing::Test { protected: virtual void SetUp(); virtual void TearDown(); // Runs the CommandLineInterface with the given command line. The // command is automatically split on spaces, and the string "$tmpdir" // is replaced with TestTempDir(). void Run(const string& command); void RunWithArgs(std::vector args); // ----------------------------------------------------------------- // Methods to set up the test (called before Run()). class NullCodeGenerator; // Normally plugins are allowed for all tests. Call this to explicitly // disable them. void DisallowPlugins() { disallow_plugins_ = true; } // Create a temp file within temp_directory_ with the given name. // The containing directory is also created if necessary. void CreateTempFile(const string& name, const string& contents); // Create a subdirectory within temp_directory_. void CreateTempDir(const string& name); #ifdef PROTOBUF_OPENSOURCE // Change working directory to temp directory. void SwitchToTempDirectory() { File::ChangeWorkingDirectory(temp_directory_); } #else // !PROTOBUF_OPENSOURCE // TODO(teboring): Figure out how to change and get working directory in // google3. #endif // !PROTOBUF_OPENSOURCE // ----------------------------------------------------------------- // Methods to check the test results (called after Run()). // Checks that no text was written to stderr during Run(), and Run() // returned 0. void ExpectNoErrors(); // Checks that Run() returned non-zero and the stderr output is exactly // the text given. expected_test may contain references to "$tmpdir", // which will be replaced by the temporary directory path. void ExpectErrorText(const string& expected_text); // Checks that Run() returned non-zero and the stderr contains the given // substring. void ExpectErrorSubstring(const string& expected_substring); // Like ExpectErrorSubstring, but checks that Run() returned zero. void ExpectErrorSubstringWithZeroReturnCode( const string& expected_substring); // Checks that the captured stdout is the same as the expected_text. void ExpectCapturedStdout(const string& expected_text); // Checks that Run() returned zero and the stdout contains the given // substring. void ExpectCapturedStdoutSubstringWithZeroReturnCode( const string& expected_substring); // Returns true if ExpectErrorSubstring(expected_substring) would pass, but // does not fail otherwise. bool HasAlternateErrorSubstring(const string& expected_substring); // Checks that MockCodeGenerator::Generate() was called in the given // context (or the generator in test_plugin.cc, which produces the same // output). That is, this tests if the generator with the given name // was called with the given parameter and proto file and produced the // given output file. This is checked by reading the output file and // checking that it contains the content that MockCodeGenerator would // generate given these inputs. message_name is the name of the first // message that appeared in the proto file; this is just to make extra // sure that the correct file was parsed. void ExpectGenerated(const string& generator_name, const string& parameter, const string& proto_name, const string& message_name); void ExpectGenerated(const string& generator_name, const string& parameter, const string& proto_name, const string& message_name, const string& output_directory); void ExpectGeneratedWithMultipleInputs(const string& generator_name, const string& all_proto_names, const string& proto_name, const string& message_name); void ExpectGeneratedWithInsertions(const string& generator_name, const string& parameter, const string& insertions, const string& proto_name, const string& message_name); void CheckGeneratedAnnotations(const string& name, const string& file); void ExpectNullCodeGeneratorCalled(const string& parameter); void ReadDescriptorSet(const string& filename, FileDescriptorSet* descriptor_set); void WriteDescriptorSet(const string& filename, const FileDescriptorSet* descriptor_set); void ExpectFileContent(const string& filename, const string& content); private: // The object we are testing. CommandLineInterface cli_; // Was DisallowPlugins() called? bool disallow_plugins_; // We create a directory within TestTempDir() in order to add extra // protection against accidentally deleting user files (since we recursively // delete this directory during the test). This is the full path of that // directory. string temp_directory_; // The result of Run(). int return_code_; // The captured stderr output. string error_text_; // The captured stdout. string captured_stdout_; // Pointers which need to be deleted later. std::vector mock_generators_to_delete_; NullCodeGenerator* null_generator_; }; class CommandLineInterfaceTest::NullCodeGenerator : public CodeGenerator { public: NullCodeGenerator() : called_(false) {} ~NullCodeGenerator() {} mutable bool called_; mutable string parameter_; // implements CodeGenerator ---------------------------------------- bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const { called_ = true; parameter_ = parameter; return true; } }; // =================================================================== void CommandLineInterfaceTest::SetUp() { temp_directory_ = TestTempDir() + "/proto2_cli_test_temp"; // If the temp directory already exists, it must be left over from a // previous run. Delete it. if (FileExists(temp_directory_)) { File::DeleteRecursively(temp_directory_, NULL, NULL); } // Create the temp directory. GOOGLE_CHECK_OK(File::CreateDir(temp_directory_, 0777)); // Register generators. CodeGenerator* generator = new MockCodeGenerator("test_generator"); mock_generators_to_delete_.push_back(generator); cli_.RegisterGenerator("--test_out", "--test_opt", generator, "Test output."); cli_.RegisterGenerator("-t", generator, "Test output."); generator = new MockCodeGenerator("alt_generator"); mock_generators_to_delete_.push_back(generator); cli_.RegisterGenerator("--alt_out", generator, "Alt output."); generator = null_generator_ = new NullCodeGenerator(); mock_generators_to_delete_.push_back(generator); cli_.RegisterGenerator("--null_out", generator, "Null output."); disallow_plugins_ = false; } void CommandLineInterfaceTest::TearDown() { // Delete the temp directory. if (FileExists(temp_directory_)) { File::DeleteRecursively(temp_directory_, NULL, NULL); } // Delete all the MockCodeGenerators. for (int i = 0; i < mock_generators_to_delete_.size(); i++) { delete mock_generators_to_delete_[i]; } mock_generators_to_delete_.clear(); } void CommandLineInterfaceTest::Run(const string& command) { RunWithArgs(Split(command, " ", true)); } void CommandLineInterfaceTest::RunWithArgs(std::vector args) { if (!disallow_plugins_) { cli_.AllowPlugins("prefix-"); #ifndef GOOGLE_THIRD_PARTY_PROTOBUF string plugin_path; #ifdef GOOGLE_PROTOBUF_TEST_PLUGIN_PATH plugin_path = GOOGLE_PROTOBUF_TEST_PLUGIN_PATH; #else const char* possible_paths[] = { // When building with shared libraries, libtool hides the real executable // in .libs and puts a fake wrapper in the current directory. // Unfortunately, due to an apparent bug on Cygwin/MinGW, if one program // wrapped in this way (e.g. protobuf-tests.exe) tries to execute another // program wrapped in this way (e.g. test_plugin.exe), the latter fails // with error code 127 and no explanation message. Presumably the problem // is that the wrapper for protobuf-tests.exe set some environment // variables that confuse the wrapper for test_plugin.exe. Luckily, it // turns out that if we simply invoke the wrapped test_plugin.exe // directly, it works -- I guess the environment variables set by the // protobuf-tests.exe wrapper happen to be correct for it too. So we do // that. ".libs/test_plugin.exe", // Win32 w/autotool (Cygwin / MinGW) "test_plugin.exe", // Other Win32 (MSVC) "test_plugin", // Unix }; for (int i = 0; i < GOOGLE_ARRAYSIZE(possible_paths); i++) { if (access(possible_paths[i], F_OK) == 0) { plugin_path = possible_paths[i]; break; } } #endif if (plugin_path.empty()) { #else string plugin_path = "third_party/protobuf/test_plugin"; if (access(plugin_path.c_str(), F_OK) != 0) { #endif // GOOGLE_THIRD_PARTY_PROTOBUF GOOGLE_LOG(ERROR) << "Plugin executable not found. Plugin tests are likely to fail."; } else { args.push_back("--plugin=prefix-gen-plug=" + plugin_path); } } google::protobuf::scoped_array argv(new const char* [args.size()]); for (int i = 0; i < args.size(); i++) { args[i] = StringReplace(args[i], "$tmpdir", temp_directory_, true); argv[i] = args[i].c_str(); } // TODO(jieluo): Cygwin doesn't work well if we try to capture stderr and // stdout at the same time. Need to figure out why and add this capture back // for Cygwin. #if !defined(__CYGWIN__) CaptureTestStdout(); #endif CaptureTestStderr(); return_code_ = cli_.Run(args.size(), argv.get()); error_text_ = GetCapturedTestStderr(); #if !defined(__CYGWIN__) captured_stdout_ = GetCapturedTestStdout(); #endif } // ------------------------------------------------------------------- void CommandLineInterfaceTest::CreateTempFile( const string& name, const string& contents) { // Create parent directory, if necessary. string::size_type slash_pos = name.find_last_of('/'); if (slash_pos != string::npos) { string dir = name.substr(0, slash_pos); if (!FileExists(temp_directory_ + "/" + dir)) { GOOGLE_CHECK_OK(File::RecursivelyCreateDir(temp_directory_ + "/" + dir, 0777)); } } // Write file. string full_name = temp_directory_ + "/" + name; GOOGLE_CHECK_OK(File::SetContents( full_name, StringReplace(contents, "$tmpdir", temp_directory_, true), true)); } void CommandLineInterfaceTest::CreateTempDir(const string& name) { GOOGLE_CHECK_OK(File::RecursivelyCreateDir(temp_directory_ + "/" + name, 0777)); } // ------------------------------------------------------------------- void CommandLineInterfaceTest::ExpectNoErrors() { EXPECT_EQ(0, return_code_); EXPECT_EQ("", error_text_); } void CommandLineInterfaceTest::ExpectErrorText(const string& expected_text) { EXPECT_NE(0, return_code_); EXPECT_EQ(StringReplace(expected_text, "$tmpdir", temp_directory_, true), error_text_); } void CommandLineInterfaceTest::ExpectErrorSubstring( const string& expected_substring) { EXPECT_NE(0, return_code_); EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_substring, error_text_); } void CommandLineInterfaceTest::ExpectErrorSubstringWithZeroReturnCode( const string& expected_substring) { EXPECT_EQ(0, return_code_); EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_substring, error_text_); } bool CommandLineInterfaceTest::HasAlternateErrorSubstring( const string& expected_substring) { EXPECT_NE(0, return_code_); return error_text_.find(expected_substring) != string::npos; } void CommandLineInterfaceTest::ExpectGenerated( const string& generator_name, const string& parameter, const string& proto_name, const string& message_name) { MockCodeGenerator::ExpectGenerated( generator_name, parameter, "", proto_name, message_name, proto_name, temp_directory_); } void CommandLineInterfaceTest::ExpectGenerated( const string& generator_name, const string& parameter, const string& proto_name, const string& message_name, const string& output_directory) { MockCodeGenerator::ExpectGenerated( generator_name, parameter, "", proto_name, message_name, proto_name, temp_directory_ + "/" + output_directory); } void CommandLineInterfaceTest::ExpectGeneratedWithMultipleInputs( const string& generator_name, const string& all_proto_names, const string& proto_name, const string& message_name) { MockCodeGenerator::ExpectGenerated( generator_name, "", "", proto_name, message_name, all_proto_names, temp_directory_); } void CommandLineInterfaceTest::ExpectGeneratedWithInsertions( const string& generator_name, const string& parameter, const string& insertions, const string& proto_name, const string& message_name) { MockCodeGenerator::ExpectGenerated( generator_name, parameter, insertions, proto_name, message_name, proto_name, temp_directory_); } void CommandLineInterfaceTest::CheckGeneratedAnnotations(const string& name, const string& file) { MockCodeGenerator::CheckGeneratedAnnotations(name, file, temp_directory_); } void CommandLineInterfaceTest::ExpectNullCodeGeneratorCalled( const string& parameter) { EXPECT_TRUE(null_generator_->called_); EXPECT_EQ(parameter, null_generator_->parameter_); } void CommandLineInterfaceTest::ReadDescriptorSet( const string& filename, FileDescriptorSet* descriptor_set) { string path = temp_directory_ + "/" + filename; string file_contents; GOOGLE_CHECK_OK(File::GetContents(path, &file_contents, true)); if (!descriptor_set->ParseFromString(file_contents)) { FAIL() << "Could not parse file contents: " << path; } } void CommandLineInterfaceTest::WriteDescriptorSet( const string& filename, const FileDescriptorSet* descriptor_set) { string binary_proto; GOOGLE_CHECK(descriptor_set->SerializeToString(&binary_proto)); CreateTempFile(filename, binary_proto); } void CommandLineInterfaceTest::ExpectCapturedStdout( const string& expected_text) { EXPECT_EQ(expected_text, captured_stdout_); } void CommandLineInterfaceTest::ExpectCapturedStdoutSubstringWithZeroReturnCode( const string& expected_substring) { EXPECT_EQ(0, return_code_); EXPECT_PRED_FORMAT2( testing::IsSubstring, expected_substring, captured_stdout_); } void CommandLineInterfaceTest::ExpectFileContent( const string& filename, const string& content) { string path = temp_directory_ + "/" + filename; string file_contents; GOOGLE_CHECK_OK(File::GetContents(path, &file_contents, true)); EXPECT_EQ(StringReplace(content, "$tmpdir", temp_directory_, true), file_contents); } // =================================================================== TEST_F(CommandLineInterfaceTest, BasicOutput) { // Test that the common case works. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, BasicOutput_DescriptorSetIn) { // Test that the common case works. FileDescriptorSet file_descriptor_set; FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("foo.proto"); file_descriptor_proto->add_message_type()->set_name("Foo"); WriteDescriptorSet("foo.bin", &file_descriptor_set); Run("protocol_compiler --test_out=$tmpdir " "--descriptor_set_in=$tmpdir/foo.bin foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, BasicPlugin) { // Test that basic plugins work. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --plug_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated("test_plugin", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, BasicPlugin_DescriptorSetIn) { // Test that basic plugins work. FileDescriptorSet file_descriptor_set; FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("foo.proto"); file_descriptor_proto->add_message_type()->set_name("Foo"); WriteDescriptorSet("foo.bin", &file_descriptor_set); Run("protocol_compiler --plug_out=$tmpdir " "--descriptor_set_in=$tmpdir/foo.bin foo.proto"); ExpectNoErrors(); ExpectGenerated("test_plugin", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, GeneratorAndPlugin) { // Invoke a generator and a plugin at the same time. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); ExpectGenerated("test_plugin", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, GeneratorAndPlugin_DescriptorSetIn) { // Invoke a generator and a plugin at the same time. FileDescriptorSet file_descriptor_set; FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("foo.proto"); file_descriptor_proto->add_message_type()->set_name("Foo"); WriteDescriptorSet("foo.bin", &file_descriptor_set); Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir " "--descriptor_set_in=$tmpdir/foo.bin foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); ExpectGenerated("test_plugin", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, MultipleInputs) { // Test parsing multiple input files. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "message Bar {}\n"); Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir " "--proto_path=$tmpdir foo.proto bar.proto"); ExpectNoErrors(); ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", "foo.proto", "Foo"); ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", "bar.proto", "Bar"); ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", "foo.proto", "Foo"); ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", "bar.proto", "Bar"); } TEST_F(CommandLineInterfaceTest, MultipleInputs_DescriptorSetIn) { // Test parsing multiple input files. FileDescriptorSet file_descriptor_set; FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("foo.proto"); file_descriptor_proto->add_message_type()->set_name("Foo"); file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("bar.proto"); file_descriptor_proto->add_message_type()->set_name("Bar"); WriteDescriptorSet("foo.bin", &file_descriptor_set); Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir " "--descriptor_set_in=$tmpdir/foo.bin foo.proto bar.proto"); ExpectNoErrors(); ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", "foo.proto", "Foo"); ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", "bar.proto", "Bar"); ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", "foo.proto", "Foo"); ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", "bar.proto", "Bar"); } TEST_F(CommandLineInterfaceTest, MultipleInputsWithImport) { // Test parsing multiple input files with an import of a separate file. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "import \"baz.proto\";\n" "message Bar {\n" " optional Baz a = 1;\n" "}\n"); CreateTempFile("baz.proto", "syntax = \"proto2\";\n" "message Baz {}\n"); Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir " "--proto_path=$tmpdir foo.proto bar.proto"); ExpectNoErrors(); ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", "foo.proto", "Foo"); ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", "bar.proto", "Bar"); ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", "foo.proto", "Foo"); ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", "bar.proto", "Bar"); } TEST_F(CommandLineInterfaceTest, MultipleInputsWithImport_DescriptorSetIn) { // Test parsing multiple input files with an import of a separate file. FileDescriptorSet file_descriptor_set; FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("foo.proto"); file_descriptor_proto->add_message_type()->set_name("Foo"); file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("bar.proto"); file_descriptor_proto->add_dependency("baz.proto"); DescriptorProto* message = file_descriptor_proto->add_message_type(); message->set_name("Bar"); FieldDescriptorProto* field = message->add_field(); field->set_type_name("Baz"); field->set_name("a"); field->set_number(1); WriteDescriptorSet("foo_and_bar.bin", &file_descriptor_set); file_descriptor_set.clear_file(); file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("baz.proto"); file_descriptor_proto->add_message_type()->set_name("Baz"); file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("bat.proto"); file_descriptor_proto->add_dependency("baz.proto"); message = file_descriptor_proto->add_message_type(); message->set_name("Bat"); field = message->add_field(); field->set_type_name("Baz"); field->set_name("a"); field->set_number(1); WriteDescriptorSet("baz_and_bat.bin", &file_descriptor_set); Run(strings::Substitute( "protocol_compiler --test_out=$$tmpdir --plug_out=$$tmpdir " "--descriptor_set_in=$0 foo.proto bar.proto", string("$tmpdir/foo_and_bar.bin") + CommandLineInterface::kPathSeparator + "$tmpdir/baz_and_bat.bin")); ExpectNoErrors(); ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", "foo.proto", "Foo"); ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", "bar.proto", "Bar"); ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", "foo.proto", "Foo"); ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", "bar.proto", "Bar"); Run(strings::Substitute( "protocol_compiler --test_out=$$tmpdir --plug_out=$$tmpdir " "--descriptor_set_in=$0 baz.proto bat.proto", string("$tmpdir/foo_and_bar.bin") + CommandLineInterface::kPathSeparator + "$tmpdir/baz_and_bat.bin")); ExpectNoErrors(); ExpectGeneratedWithMultipleInputs("test_generator", "baz.proto,bat.proto", "baz.proto", "Baz"); ExpectGeneratedWithMultipleInputs("test_generator", "baz.proto,bat.proto", "bat.proto", "Bat"); ExpectGeneratedWithMultipleInputs("test_plugin", "baz.proto,bat.proto", "baz.proto", "Baz"); ExpectGeneratedWithMultipleInputs("test_plugin", "baz.proto,bat.proto", "bat.proto", "Bat"); } TEST_F(CommandLineInterfaceTest, MultipleInputsWithImport_DescriptorSetIn_DuplicateFileDescriptor) { // Test parsing multiple input files with an import of a separate file. FileDescriptorSet file_descriptor_set; FileDescriptorProto foo_file_descriptor_proto; foo_file_descriptor_proto.set_name("foo.proto"); foo_file_descriptor_proto.add_message_type()->set_name("Foo"); file_descriptor_set.add_file()->CopyFrom(foo_file_descriptor_proto); FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("bar.proto"); file_descriptor_proto->add_dependency("baz.proto"); file_descriptor_proto->add_dependency("foo.proto"); DescriptorProto* message = file_descriptor_proto->add_message_type(); message->set_name("Bar"); FieldDescriptorProto* field = message->add_field(); field->set_type_name("Baz"); field->set_name("a"); field->set_number(1); field = message->add_field(); field->set_type_name("Foo"); field->set_name("f"); field->set_number(2); WriteDescriptorSet("foo_and_bar.bin", &file_descriptor_set); file_descriptor_set.clear_file(); file_descriptor_set.add_file()->CopyFrom(foo_file_descriptor_proto); file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("baz.proto"); file_descriptor_proto->add_dependency("foo.proto"); message = file_descriptor_proto->add_message_type(); message->set_name("Baz"); field = message->add_field(); field->set_type_name("Foo"); field->set_name("f"); field->set_number(1); WriteDescriptorSet("foo_and_baz.bin", &file_descriptor_set); Run(strings::Substitute( "protocol_compiler --test_out=$$tmpdir --plug_out=$$tmpdir " "--descriptor_set_in=$0 bar.proto", string("$tmpdir/foo_and_bar.bin") + CommandLineInterface::kPathSeparator + "$tmpdir/foo_and_baz.bin")); ExpectNoErrors(); ExpectGenerated("test_generator", "", "bar.proto", "Bar"); ExpectGenerated("test_plugin", "", "bar.proto", "Bar"); } TEST_F(CommandLineInterfaceTest, MultipleInputsWithImport_DescriptorSetIn_MissingImport) { // Test parsing multiple input files with an import of a separate file. FileDescriptorSet file_descriptor_set; FileDescriptorProto* file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("foo.proto"); file_descriptor_proto->add_message_type()->set_name("Foo"); file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("bar.proto"); file_descriptor_proto->add_dependency("baz.proto"); DescriptorProto* message = file_descriptor_proto->add_message_type(); message->set_name("Bar"); FieldDescriptorProto* field = message->add_field(); field->set_type_name("Baz"); field->set_name("a"); field->set_number(1); WriteDescriptorSet("foo_and_bar.bin", &file_descriptor_set); file_descriptor_set.clear_file(); file_descriptor_proto = file_descriptor_set.add_file(); file_descriptor_proto->set_name("baz.proto"); file_descriptor_proto->add_message_type()->set_name("Baz"); WriteDescriptorSet("baz.bin", &file_descriptor_set); Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir " "--descriptor_set_in=$tmpdir/foo_and_bar.bin " "foo.proto bar.proto"); ExpectErrorSubstring( "bar.proto: Import \"baz.proto\" was not found or had errors."); ExpectErrorSubstring("bar.proto: \"Baz\" is not defined."); } TEST_F(CommandLineInterfaceTest, CreateDirectory) { // Test that when we output to a sub-directory, it is created. CreateTempFile("bar/baz/foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempDir("out"); CreateTempDir("plugout"); Run("protocol_compiler --test_out=$tmpdir/out --plug_out=$tmpdir/plugout " "--proto_path=$tmpdir bar/baz/foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "bar/baz/foo.proto", "Foo", "out"); ExpectGenerated("test_plugin", "", "bar/baz/foo.proto", "Foo", "plugout"); } TEST_F(CommandLineInterfaceTest, GeneratorParameters) { // Test that generator parameters are correctly parsed from the command line. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --test_out=TestParameter:$tmpdir " "--plug_out=TestPluginParameter:$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "TestParameter", "foo.proto", "Foo"); ExpectGenerated("test_plugin", "TestPluginParameter", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, ExtraGeneratorParameters) { // Test that generator parameters specified with the option flag are // correctly passed to the code generator. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); // Create the "a" and "b" sub-directories. CreateTempDir("a"); CreateTempDir("b"); Run("protocol_compiler " "--test_opt=foo1 " "--test_out=bar:$tmpdir/a " "--test_opt=foo2 " "--test_out=baz:$tmpdir/b " "--test_opt=foo3 " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated( "test_generator", "bar,foo1,foo2,foo3", "foo.proto", "Foo", "a"); ExpectGenerated( "test_generator", "baz,foo1,foo2,foo3", "foo.proto", "Foo", "b"); } TEST_F(CommandLineInterfaceTest, ExtraPluginParameters) { // Test that generator parameters specified with the option flag are // correctly passed to the code generator. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); // Create the "a" and "b" sub-directories. CreateTempDir("a"); CreateTempDir("b"); Run("protocol_compiler " "--plug_opt=foo1 " "--plug_out=bar:$tmpdir/a " "--plug_opt=foo2 " "--plug_out=baz:$tmpdir/b " "--plug_opt=foo3 " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated( "test_plugin", "bar,foo1,foo2,foo3", "foo.proto", "Foo", "a"); ExpectGenerated( "test_plugin", "baz,foo1,foo2,foo3", "foo.proto", "Foo", "b"); } TEST_F(CommandLineInterfaceTest, UnrecognizedExtraParameters) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --plug_out=TestParameter:$tmpdir " "--unknown_plug_a_opt=Foo " "--unknown_plug_b_opt=Bar " "--proto_path=$tmpdir foo.proto"); ExpectErrorSubstring("Unknown flag: --unknown_plug_a_opt"); ExpectErrorSubstring("Unknown flag: --unknown_plug_b_opt"); } TEST_F(CommandLineInterfaceTest, ExtraPluginParametersForOutParameters) { // This doesn't rely on the plugin having been registred and instead that // the existence of --[name]_out is enough to make the --[name]_opt valid. // However, running out of process plugins found via the search path (i.e. - // not pre registered with --plugin) isn't support in this test suite, so we // list the options pre/post the _out directive, and then include _opt that // will be unknown, and confirm the failure output is about the expected // unknown directive, which means the other were accepted. // NOTE: UnrecognizedExtraParameters confirms that if two unknown _opt // directives appear, they both are reported. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --plug_out=TestParameter:$tmpdir " "--xyz_opt=foo=bar --xyz_out=$tmpdir " "--abc_out=$tmpdir --abc_opt=foo=bar " "--unknown_plug_opt=Foo " "--proto_path=$tmpdir foo.proto"); ExpectErrorText("Unknown flag: --unknown_plug_opt\n"); } TEST_F(CommandLineInterfaceTest, Insert) { // Test running a generator that inserts code into another's output. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler " "--test_out=TestParameter:$tmpdir " "--plug_out=TestPluginParameter:$tmpdir " "--test_out=insert=test_generator,test_plugin:$tmpdir " "--plug_out=insert=test_generator,test_plugin:$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGeneratedWithInsertions( "test_generator", "TestParameter", "test_generator,test_plugin", "foo.proto", "Foo"); ExpectGeneratedWithInsertions( "test_plugin", "TestPluginParameter", "test_generator,test_plugin", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, InsertWithAnnotationFixup) { // Check that annotation spans are updated after insertions. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message MockCodeGenerator_Annotate {}\n"); Run("protocol_compiler " "--test_out=TestParameter:$tmpdir " "--plug_out=TestPluginParameter:$tmpdir " "--test_out=insert=test_generator,test_plugin:$tmpdir " "--plug_out=insert=test_generator,test_plugin:$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); CheckGeneratedAnnotations("test_generator", "foo.proto"); CheckGeneratedAnnotations("test_plugin", "foo.proto"); } #if defined(_WIN32) TEST_F(CommandLineInterfaceTest, WindowsOutputPath) { // Test that the output path can be a Windows-style path. CreateTempFile("foo.proto", "syntax = \"proto2\";\n"); Run("protocol_compiler --null_out=C:\\ " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectNullCodeGeneratorCalled(""); } TEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) { // Test that we can have a windows-style output path and a parameter. CreateTempFile("foo.proto", "syntax = \"proto2\";\n"); Run("protocol_compiler --null_out=bar:C:\\ " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectNullCodeGeneratorCalled("bar"); } TEST_F(CommandLineInterfaceTest, TrailingBackslash) { // Test that the directories can end in backslashes. Some users claim this // doesn't work on their system. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --test_out=$tmpdir\\ " "--proto_path=$tmpdir\\ foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, Win32ErrorMessage) { EXPECT_EQ("The system cannot find the file specified.\r\n", Subprocess::Win32ErrorMessage(ERROR_FILE_NOT_FOUND)); } #endif // defined(_WIN32) || defined(__CYGWIN__) TEST_F(CommandLineInterfaceTest, PathLookup) { // Test that specifying multiple directories in the proto search path works. CreateTempFile("b/bar.proto", "syntax = \"proto2\";\n" "message Bar {}\n"); CreateTempFile("a/foo.proto", "syntax = \"proto2\";\n" "import \"bar.proto\";\n" "message Foo {\n" " optional Bar a = 1;\n" "}\n"); CreateTempFile("b/foo.proto", "this should not be parsed\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir/a --proto_path=$tmpdir/b foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, ColonDelimitedPath) { // Same as PathLookup, but we provide the proto_path in a single flag. CreateTempFile("b/bar.proto", "syntax = \"proto2\";\n" "message Bar {}\n"); CreateTempFile("a/foo.proto", "syntax = \"proto2\";\n" "import \"bar.proto\";\n" "message Foo {\n" " optional Bar a = 1;\n" "}\n"); CreateTempFile("b/foo.proto", "this should not be parsed\n"); Run(strings::Substitute( "protocol_compiler --test_out=$$tmpdir --proto_path=$0 foo.proto", string("$tmpdir/a") + CommandLineInterface::kPathSeparator + "$tmpdir/b")); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, NonRootMapping) { // Test setting up a search path mapping a directory to a non-root location. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=bar=$tmpdir bar/foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "bar/foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, PathWithEqualsSign) { // Test setting up a search path which happens to have '=' in it. CreateTempDir("with=sign"); CreateTempFile("with=sign/foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir/with=sign foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, MultipleGenerators) { // Test that we can have multiple generators and use both in one invocation, // each with a different output directory. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); // Create the "a" and "b" sub-directories. CreateTempDir("a"); CreateTempDir("b"); Run("protocol_compiler " "--test_out=$tmpdir/a " "--alt_out=$tmpdir/b " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo", "a"); ExpectGenerated("alt_generator", "", "foo.proto", "Foo", "b"); } TEST_F(CommandLineInterfaceTest, DisallowServicesNoServices) { // Test that --disallow_services doesn't cause a problem when there are no // services. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --disallow_services --test_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, DisallowServicesHasService) { // Test that --disallow_services produces an error when there are services. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n" "service Bar {}\n"); Run("protocol_compiler --disallow_services --test_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectErrorSubstring("foo.proto: This file contains services"); } TEST_F(CommandLineInterfaceTest, AllowServicesHasService) { // Test that services work fine as long as --disallow_services is not used. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n" "service Bar {}\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, DirectDependencies_Missing_EmptyList) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "import \"bar.proto\";\n" "message Foo { optional Bar bar = 1; }"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "message Bar { optional string text = 1; }"); Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir " "--direct_dependencies= foo.proto"); ExpectErrorText( "foo.proto: File is imported but not declared in --direct_dependencies: " "bar.proto\n"); } TEST_F(CommandLineInterfaceTest, DirectDependencies_Missing) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "import \"bar.proto\";\n" "import \"bla.proto\";\n" "message Foo { optional Bar bar = 1; optional Bla bla = 2; }"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "message Bar { optional string text = 1; }"); CreateTempFile("bla.proto", "syntax = \"proto2\";\n" "message Bla { optional int64 number = 1; }"); Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir " "--direct_dependencies=bla.proto foo.proto"); ExpectErrorText( "foo.proto: File is imported but not declared in --direct_dependencies: " "bar.proto\n"); } TEST_F(CommandLineInterfaceTest, DirectDependencies_NoViolation) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "import \"bar.proto\";\n" "message Foo { optional Bar bar = 1; }"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "message Bar { optional string text = 1; }"); Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir " "--direct_dependencies=bar.proto foo.proto"); ExpectNoErrors(); } TEST_F(CommandLineInterfaceTest, DirectDependencies_NoViolation_MultiImports) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "import \"bar.proto\";\n" "import \"bla.proto\";\n" "message Foo { optional Bar bar = 1; optional Bla bla = 2; }"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "message Bar { optional string text = 1; }"); CreateTempFile("bla.proto", "syntax = \"proto2\";\n" "message Bla { optional int64 number = 1; }"); Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir " "--direct_dependencies=bar.proto:bla.proto foo.proto"); ExpectNoErrors(); } TEST_F(CommandLineInterfaceTest, DirectDependencies_ProvidedMultipleTimes) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n"); Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir " "--direct_dependencies=bar.proto --direct_dependencies=bla.proto " "foo.proto"); ExpectErrorText( "--direct_dependencies may only be passed once. To specify multiple " "direct dependencies, pass them all as a single parameter separated by " "':'.\n"); } TEST_F(CommandLineInterfaceTest, DirectDependencies_CustomErrorMessage) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "import \"bar.proto\";\n" "message Foo { optional Bar bar = 1; }"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "message Bar { optional string text = 1; }"); std::vector commands; commands.push_back("protocol_compiler"); commands.push_back("--test_out=$tmpdir"); commands.push_back("--proto_path=$tmpdir"); commands.push_back("--direct_dependencies="); commands.push_back("--direct_dependencies_violation_msg=Bla \"%s\" Bla"); commands.push_back("foo.proto"); RunWithArgs(commands); ExpectErrorText("foo.proto: Bla \"bar.proto\" Bla\n"); } TEST_F(CommandLineInterfaceTest, CwdRelativeInputs) { // Test that we can accept working-directory-relative input files. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir $tmpdir/foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, WriteDescriptorSet) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "import \"foo.proto\";\n" "message Bar {\n" " optional Foo foo = 1;\n" "}\n"); Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set " "--proto_path=$tmpdir bar.proto"); ExpectNoErrors(); FileDescriptorSet descriptor_set; ReadDescriptorSet("descriptor_set", &descriptor_set); if (HasFatalFailure()) return; EXPECT_EQ(1, descriptor_set.file_size()); EXPECT_EQ("bar.proto", descriptor_set.file(0).name()); // Descriptor set should not have source code info. EXPECT_FALSE(descriptor_set.file(0).has_source_code_info()); // Descriptor set should have json_name. EXPECT_EQ("Bar", descriptor_set.file(0).message_type(0).name()); EXPECT_EQ("foo", descriptor_set.file(0).message_type(0).field(0).name()); EXPECT_TRUE(descriptor_set.file(0).message_type(0).field(0).has_json_name()); } TEST_F(CommandLineInterfaceTest, WriteDescriptorSetWithDuplicates) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "import \"foo.proto\";\n" "message Bar {\n" " optional Foo foo = 1;\n" "}\n"); CreateTempFile("baz.proto", "syntax = \"proto2\";\n" "import \"foo.proto\";\n" "message Baz {\n" " optional Foo foo = 1;\n" "}\n"); Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set " "--proto_path=$tmpdir bar.proto foo.proto bar.proto baz.proto"); ExpectNoErrors(); FileDescriptorSet descriptor_set; ReadDescriptorSet("descriptor_set", &descriptor_set); if (HasFatalFailure()) return; EXPECT_EQ(3, descriptor_set.file_size()); // foo should come first since the output is in dependency order. // since bar and baz are unordered, they should be in command line order. EXPECT_EQ("foo.proto", descriptor_set.file(0).name()); EXPECT_EQ("bar.proto", descriptor_set.file(1).name()); EXPECT_EQ("baz.proto", descriptor_set.file(2).name()); // Descriptor set should not have source code info. EXPECT_FALSE(descriptor_set.file(0).has_source_code_info()); // Descriptor set should have json_name. EXPECT_EQ("Bar", descriptor_set.file(1).message_type(0).name()); EXPECT_EQ("foo", descriptor_set.file(1).message_type(0).field(0).name()); EXPECT_TRUE(descriptor_set.file(1).message_type(0).field(0).has_json_name()); } TEST_F(CommandLineInterfaceTest, WriteDescriptorSetWithSourceInfo) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "import \"foo.proto\";\n" "message Bar {\n" " optional Foo foo = 1;\n" "}\n"); Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set " "--include_source_info --proto_path=$tmpdir bar.proto"); ExpectNoErrors(); FileDescriptorSet descriptor_set; ReadDescriptorSet("descriptor_set", &descriptor_set); if (HasFatalFailure()) return; EXPECT_EQ(1, descriptor_set.file_size()); EXPECT_EQ("bar.proto", descriptor_set.file(0).name()); // Source code info included. EXPECT_TRUE(descriptor_set.file(0).has_source_code_info()); } TEST_F(CommandLineInterfaceTest, WriteTransitiveDescriptorSet) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "import \"foo.proto\";\n" "message Bar {\n" " optional Foo foo = 1;\n" "}\n"); Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set " "--include_imports --proto_path=$tmpdir bar.proto"); ExpectNoErrors(); FileDescriptorSet descriptor_set; ReadDescriptorSet("descriptor_set", &descriptor_set); if (HasFatalFailure()) return; EXPECT_EQ(2, descriptor_set.file_size()); if (descriptor_set.file(0).name() == "bar.proto") { std::swap(descriptor_set.mutable_file()->mutable_data()[0], descriptor_set.mutable_file()->mutable_data()[1]); } EXPECT_EQ("foo.proto", descriptor_set.file(0).name()); EXPECT_EQ("bar.proto", descriptor_set.file(1).name()); // Descriptor set should not have source code info. EXPECT_FALSE(descriptor_set.file(0).has_source_code_info()); EXPECT_FALSE(descriptor_set.file(1).has_source_code_info()); } TEST_F(CommandLineInterfaceTest, WriteTransitiveDescriptorSetWithSourceInfo) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "import \"foo.proto\";\n" "message Bar {\n" " optional Foo foo = 1;\n" "}\n"); Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set " "--include_imports --include_source_info --proto_path=$tmpdir bar.proto"); ExpectNoErrors(); FileDescriptorSet descriptor_set; ReadDescriptorSet("descriptor_set", &descriptor_set); if (HasFatalFailure()) return; EXPECT_EQ(2, descriptor_set.file_size()); if (descriptor_set.file(0).name() == "bar.proto") { std::swap(descriptor_set.mutable_file()->mutable_data()[0], descriptor_set.mutable_file()->mutable_data()[1]); } EXPECT_EQ("foo.proto", descriptor_set.file(0).name()); EXPECT_EQ("bar.proto", descriptor_set.file(1).name()); // Source code info included. EXPECT_TRUE(descriptor_set.file(0).has_source_code_info()); EXPECT_TRUE(descriptor_set.file(1).has_source_code_info()); } #ifdef _WIN32 // TODO(teboring): Figure out how to write test on windows. #else TEST_F(CommandLineInterfaceTest, WriteDependencyManifestFileGivenTwoInputs) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "import \"foo.proto\";\n" "message Bar {\n" " optional Foo foo = 1;\n" "}\n"); Run("protocol_compiler --dependency_out=$tmpdir/manifest " "--test_out=$tmpdir --proto_path=$tmpdir bar.proto foo.proto"); ExpectErrorText( "Can only process one input file when using --dependency_out=FILE.\n"); } #ifdef PROTOBUF_OPENSOURCE TEST_F(CommandLineInterfaceTest, WriteDependencyManifestFile) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "import \"foo.proto\";\n" "message Bar {\n" " optional Foo foo = 1;\n" "}\n"); string current_working_directory = getcwd(NULL, 0); SwitchToTempDirectory(); Run("protocol_compiler --dependency_out=manifest --test_out=. " "bar.proto"); ExpectNoErrors(); ExpectFileContent("manifest", "bar.proto.MockCodeGenerator.test_generator: " "foo.proto\\\n bar.proto"); File::ChangeWorkingDirectory(current_working_directory); } #else // !PROTOBUF_OPENSOURCE // TODO(teboring): Figure out how to change and get working directory in // google3. #endif // !PROTOBUF_OPENSOURCE TEST_F(CommandLineInterfaceTest, WriteDependencyManifestFileForAbsolutePath) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "import \"foo.proto\";\n" "message Bar {\n" " optional Foo foo = 1;\n" "}\n"); Run("protocol_compiler --dependency_out=$tmpdir/manifest " "--test_out=$tmpdir --proto_path=$tmpdir bar.proto"); ExpectNoErrors(); ExpectFileContent("manifest", "$tmpdir/bar.proto.MockCodeGenerator.test_generator: " "$tmpdir/foo.proto\\\n $tmpdir/bar.proto"); } #endif // !_WIN32 TEST_F(CommandLineInterfaceTest, TestArgumentFile) { // Test parsing multiple input files using an argument file. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "message Bar {}\n"); CreateTempFile("arguments.txt", "--test_out=$tmpdir\n" "--plug_out=$tmpdir\n" "--proto_path=$tmpdir\n" "--direct_dependencies_violation_msg=%s is not imported\n" "foo.proto\n" "bar.proto"); Run("protocol_compiler @$tmpdir/arguments.txt"); ExpectNoErrors(); ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", "foo.proto", "Foo"); ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", "bar.proto", "Bar"); ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", "foo.proto", "Foo"); ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", "bar.proto", "Bar"); } // ------------------------------------------------------------------- TEST_F(CommandLineInterfaceTest, ParseErrors) { // Test that parse errors are reported. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "badsyntax\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectErrorText( "foo.proto:2:1: Expected top-level statement (e.g. \"message\").\n"); } TEST_F(CommandLineInterfaceTest, ParseErrors_DescriptorSetIn) { // Test that parse errors are reported. CreateTempFile("foo.bin", "not a FileDescriptorSet"); Run("protocol_compiler --test_out=$tmpdir " "--descriptor_set_in=$tmpdir/foo.bin foo.proto"); ExpectErrorText( "$tmpdir/foo.bin: Unable to parse.\n"); } TEST_F(CommandLineInterfaceTest, ParseErrorsMultipleFiles) { // Test that parse errors are reported from multiple files. // We set up files such that foo.proto actually depends on bar.proto in // two ways: Directly and through baz.proto. bar.proto's errors should // only be reported once. CreateTempFile("bar.proto", "syntax = \"proto2\";\n" "badsyntax\n"); CreateTempFile("baz.proto", "syntax = \"proto2\";\n" "import \"bar.proto\";\n"); CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "import \"bar.proto\";\n" "import \"baz.proto\";\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectErrorText( "bar.proto:2:1: Expected top-level statement (e.g. \"message\").\n" "baz.proto: Import \"bar.proto\" was not found or had errors.\n" "foo.proto: Import \"bar.proto\" was not found or had errors.\n" "foo.proto: Import \"baz.proto\" was not found or had errors.\n"); } TEST_F(CommandLineInterfaceTest, RecursiveImportFails) { // Create a proto file that imports itself. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "import \"foo.proto\";\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectErrorSubstring( "foo.proto: File recursively imports itself: foo.proto -> foo.proto\n"); } TEST_F(CommandLineInterfaceTest, InputNotFoundError) { // Test what happens if the input file is not found. Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectErrorText("foo.proto: No such file or directory\n"); } TEST_F(CommandLineInterfaceTest, InputNotFoundError_DescriptorSetIn) { // Test what happens if the input file is not found. Run("protocol_compiler --test_out=$tmpdir " "--descriptor_set_in=$tmpdir/foo.bin foo.proto"); ExpectErrorText( "$tmpdir/foo.bin: No such file or directory\n"); } TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotFoundError) { // Test what happens when a working-directory-relative input file is not // found. Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir $tmpdir/foo.proto"); ExpectErrorText( "$tmpdir/foo.proto: No such file or directory\n"); } TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotMappedError) { // Test what happens when a working-directory-relative input file is not // mapped to a virtual path. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); // Create a directory called "bar" so that we can point --proto_path at it. CreateTempFile("bar/dummy", ""); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir/bar $tmpdir/foo.proto"); ExpectErrorText( "$tmpdir/foo.proto: File does not reside within any path " "specified using --proto_path (or -I). You must specify a " "--proto_path which encompasses this file. Note that the " "proto_path must be an exact prefix of the .proto file " "names -- protoc is too dumb to figure out when two paths " "(e.g. absolute and relative) are equivalent (it's harder " "than you think).\n"); } TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotFoundAndNotMappedError) { // Check what happens if the input file is not found *and* is not mapped // in the proto_path. // Create a directory called "bar" so that we can point --proto_path at it. CreateTempFile("bar/dummy", ""); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir/bar $tmpdir/foo.proto"); ExpectErrorText( "$tmpdir/foo.proto: No such file or directory\n"); } TEST_F(CommandLineInterfaceTest, CwdRelativeInputShadowedError) { // Test what happens when a working-directory-relative input file is shadowed // by another file in the virtual path. CreateTempFile("foo/foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); CreateTempFile("bar/foo.proto", "syntax = \"proto2\";\n" "message Bar {}\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir/foo --proto_path=$tmpdir/bar " "$tmpdir/bar/foo.proto"); ExpectErrorText( "$tmpdir/bar/foo.proto: Input is shadowed in the --proto_path " "by \"$tmpdir/foo/foo.proto\". Either use the latter " "file as your input or reorder the --proto_path so that the " "former file's location comes first.\n"); } TEST_F(CommandLineInterfaceTest, ProtoPathNotFoundError) { // Test what happens if the input file is not found. Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir/foo foo.proto"); ExpectErrorText( "$tmpdir/foo: warning: directory does not exist.\n" "foo.proto: No such file or directory\n"); } TEST_F(CommandLineInterfaceTest, ProtoPathAndDescriptorSetIn) { Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir --descriptor_set_in=$tmpdir/foo.bin foo.proto"); ExpectErrorText( "Only one of --descriptor_set_in and --proto_path can be specified.\n"); Run("protocol_compiler --test_out=$tmpdir " "--descriptor_set_in=$tmpdir/foo.bin --proto_path=$tmpdir foo.proto"); ExpectErrorText( "Only one of --proto_path and --descriptor_set_in can be specified.\n"); } TEST_F(CommandLineInterfaceTest, ProtoPathAndDependencyOut) { Run("protocol_compiler --test_out=$tmpdir " "--dependency_out=$tmpdir/manifest " "--descriptor_set_in=$tmpdir/foo.bin foo.proto"); ExpectErrorText( "--descriptor_set_in cannot be used with --dependency_out.\n"); Run("protocol_compiler --test_out=$tmpdir " "--descriptor_set_in=$tmpdir/foo.bin " "--dependency_out=$tmpdir/manifest foo.proto"); ExpectErrorText( "--dependency_out cannot be used with --descriptor_set_in.\n"); } TEST_F(CommandLineInterfaceTest, MissingInputError) { // Test that we get an error if no inputs are given. Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir"); ExpectErrorText("Missing input file.\n"); } TEST_F(CommandLineInterfaceTest, MissingOutputError) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --proto_path=$tmpdir foo.proto"); ExpectErrorText("Missing output directives.\n"); } TEST_F(CommandLineInterfaceTest, OutputWriteError) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); string output_file = MockCodeGenerator::GetOutputFileName("test_generator", "foo.proto"); // Create a directory blocking our output location. CreateTempDir(output_file); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); // MockCodeGenerator no longer detects an error because we actually write to // an in-memory location first, then dump to disk at the end. This is no // big deal. // ExpectErrorSubstring("MockCodeGenerator detected write error."); #if defined(_WIN32) && !defined(__CYGWIN__) // Windows with MSVCRT.dll produces EPERM instead of EISDIR. if (HasAlternateErrorSubstring(output_file + ": Permission denied")) { return; } #endif ExpectErrorSubstring(output_file + ": Is a directory"); } TEST_F(CommandLineInterfaceTest, PluginOutputWriteError) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); string output_file = MockCodeGenerator::GetOutputFileName("test_plugin", "foo.proto"); // Create a directory blocking our output location. CreateTempDir(output_file); Run("protocol_compiler --plug_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); #if defined(_WIN32) && !defined(__CYGWIN__) // Windows with MSVCRT.dll produces EPERM instead of EISDIR. if (HasAlternateErrorSubstring(output_file + ": Permission denied")) { return; } #endif ExpectErrorSubstring(output_file + ": Is a directory"); } TEST_F(CommandLineInterfaceTest, OutputDirectoryNotFoundError) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --test_out=$tmpdir/nosuchdir " "--proto_path=$tmpdir foo.proto"); ExpectErrorSubstring("nosuchdir/: No such file or directory"); } TEST_F(CommandLineInterfaceTest, PluginOutputDirectoryNotFoundError) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --plug_out=$tmpdir/nosuchdir " "--proto_path=$tmpdir foo.proto"); ExpectErrorSubstring("nosuchdir/: No such file or directory"); } TEST_F(CommandLineInterfaceTest, OutputDirectoryIsFileError) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --test_out=$tmpdir/foo.proto " "--proto_path=$tmpdir foo.proto"); #if defined(_WIN32) && !defined(__CYGWIN__) // Windows with MSVCRT.dll produces EINVAL instead of ENOTDIR. if (HasAlternateErrorSubstring("foo.proto/: Invalid argument")) { return; } #endif ExpectErrorSubstring("foo.proto/: Not a directory"); } TEST_F(CommandLineInterfaceTest, GeneratorError) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message MockCodeGenerator_Error {}\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectErrorSubstring( "--test_out: foo.proto: Saw message type MockCodeGenerator_Error."); } TEST_F(CommandLineInterfaceTest, GeneratorPluginError) { // Test a generator plugin that returns an error. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message MockCodeGenerator_Error {}\n"); Run("protocol_compiler --plug_out=TestParameter:$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectErrorSubstring( "--plug_out: foo.proto: Saw message type MockCodeGenerator_Error."); } TEST_F(CommandLineInterfaceTest, GeneratorPluginFail) { // Test a generator plugin that exits with an error code. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message MockCodeGenerator_Exit {}\n"); Run("protocol_compiler --plug_out=TestParameter:$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectErrorSubstring("Saw message type MockCodeGenerator_Exit."); ExpectErrorSubstring( "--plug_out: prefix-gen-plug: Plugin failed with status code 123."); } TEST_F(CommandLineInterfaceTest, GeneratorPluginCrash) { // Test a generator plugin that crashes. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message MockCodeGenerator_Abort {}\n"); Run("protocol_compiler --plug_out=TestParameter:$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectErrorSubstring("Saw message type MockCodeGenerator_Abort."); #ifdef _WIN32 // Windows doesn't have signals. It looks like abort()ing causes the process // to exit with status code 3, but let's not depend on the exact number here. ExpectErrorSubstring( "--plug_out: prefix-gen-plug: Plugin failed with status code"); #else // Don't depend on the exact signal number. ExpectErrorSubstring( "--plug_out: prefix-gen-plug: Plugin killed by signal"); #endif } TEST_F(CommandLineInterfaceTest, PluginReceivesSourceCodeInfo) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message MockCodeGenerator_HasSourceCodeInfo {}\n"); Run("protocol_compiler --plug_out=$tmpdir --proto_path=$tmpdir foo.proto"); ExpectErrorSubstring( "Saw message type MockCodeGenerator_HasSourceCodeInfo: 1."); } TEST_F(CommandLineInterfaceTest, PluginReceivesJsonName) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message MockCodeGenerator_HasJsonName {\n" " optional int32 value = 1;\n" "}\n"); Run("protocol_compiler --plug_out=$tmpdir --proto_path=$tmpdir foo.proto"); ExpectErrorSubstring("Saw json_name: 1"); } TEST_F(CommandLineInterfaceTest, PluginReceivesCompilerVersion) { CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message MockCodeGenerator_ShowVersionNumber {\n" " optional int32 value = 1;\n" "}\n"); 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)); } TEST_F(CommandLineInterfaceTest, GeneratorPluginNotFound) { // Test what happens if the plugin isn't found. CreateTempFile("error.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --badplug_out=TestParameter:$tmpdir " "--plugin=prefix-gen-badplug=no_such_file " "--proto_path=$tmpdir error.proto"); #ifdef _WIN32 ExpectErrorSubstring("--badplug_out: prefix-gen-badplug: " + Subprocess::Win32ErrorMessage(ERROR_FILE_NOT_FOUND)); #else // Error written to stdout by child process after exec() fails. ExpectErrorSubstring( "no_such_file: program not found or is not executable"); // Error written by parent process when child fails. ExpectErrorSubstring( "--badplug_out: prefix-gen-badplug: Plugin failed with status code 1."); #endif } TEST_F(CommandLineInterfaceTest, GeneratorPluginNotAllowed) { // Test what happens if plugins aren't allowed. CreateTempFile("error.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); DisallowPlugins(); Run("protocol_compiler --plug_out=TestParameter:$tmpdir " "--proto_path=$tmpdir error.proto"); ExpectErrorSubstring("Unknown flag: --plug_out"); } TEST_F(CommandLineInterfaceTest, HelpText) { Run("test_exec_name --help"); ExpectCapturedStdoutSubstringWithZeroReturnCode("Usage: test_exec_name "); ExpectCapturedStdoutSubstringWithZeroReturnCode("--test_out=OUT_DIR"); ExpectCapturedStdoutSubstringWithZeroReturnCode("Test output."); ExpectCapturedStdoutSubstringWithZeroReturnCode("--alt_out=OUT_DIR"); ExpectCapturedStdoutSubstringWithZeroReturnCode("Alt output."); } TEST_F(CommandLineInterfaceTest, GccFormatErrors) { // Test --error_format=gcc (which is the default, but we want to verify // that it can be set explicitly). CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "badsyntax\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir --error_format=gcc foo.proto"); ExpectErrorText( "foo.proto:2:1: Expected top-level statement (e.g. \"message\").\n"); } TEST_F(CommandLineInterfaceTest, MsvsFormatErrors) { // Test --error_format=msvs CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "badsyntax\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir --error_format=msvs foo.proto"); ExpectErrorText( "$tmpdir/foo.proto(2) : error in column=1: Expected top-level statement " "(e.g. \"message\").\n"); } TEST_F(CommandLineInterfaceTest, InvalidErrorFormat) { // Test --error_format=msvs CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "badsyntax\n"); Run("protocol_compiler --test_out=$tmpdir " "--proto_path=$tmpdir --error_format=invalid foo.proto"); ExpectErrorText( "Unknown error format: invalid\n"); } // ------------------------------------------------------------------- // Flag parsing tests TEST_F(CommandLineInterfaceTest, ParseSingleCharacterFlag) { // Test that a single-character flag works. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler -t$tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, ParseSpaceDelimitedValue) { // Test that separating the flag value with a space works. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler --test_out $tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, ParseSingleCharacterSpaceDelimitedValue) { // Test that separating the flag value with a space works for // single-character flags. CreateTempFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); Run("protocol_compiler -t $tmpdir " "--proto_path=$tmpdir foo.proto"); ExpectNoErrors(); ExpectGenerated("test_generator", "", "foo.proto", "Foo"); } TEST_F(CommandLineInterfaceTest, MissingValueError) { // Test that we get an error if a flag is missing its value. Run("protocol_compiler --test_out --proto_path=$tmpdir foo.proto"); ExpectErrorText("Missing value for flag: --test_out\n"); } TEST_F(CommandLineInterfaceTest, MissingValueAtEndError) { // Test that we get an error if the last argument is a flag requiring a // value. Run("protocol_compiler --test_out"); ExpectErrorText("Missing value for flag: --test_out\n"); } TEST_F(CommandLineInterfaceTest, PrintFreeFieldNumbers) { CreateTempFile( "foo.proto", "syntax = \"proto2\";\n" "package foo;\n" "message Foo {\n" " optional int32 a = 2;\n" " optional string b = 4;\n" " optional string c = 5;\n" " optional int64 d = 8;\n" " optional double e = 10;\n" "}\n"); CreateTempFile( "bar.proto", "syntax = \"proto2\";\n" "message Bar {\n" " optional int32 a = 2;\n" " extensions 4 to 5;\n" " optional int64 d = 8;\n" " extensions 10;\n" "}\n"); CreateTempFile( "baz.proto", "syntax = \"proto2\";\n" "message Baz {\n" " optional int32 a = 2;\n" " optional int64 d = 8;\n" " extensions 15 to max;\n" // unordered. " extensions 13;\n" " extensions 10 to 12;\n" " extensions 5;\n" " extensions 4;\n" "}\n"); CreateTempFile( "quz.proto", "syntax = \"proto2\";\n" "message Quz {\n" " message Foo {}\n" // nested message " optional int32 a = 2;\n" " optional group C = 4 {\n" " optional int32 d = 5;\n" " }\n" " extensions 8 to 10;\n" " optional group E = 11 {\n" " optional int32 f = 9;\n" // explicitly reuse extension range 8-10 " optional group G = 15 {\n" // nested group " message Foo {}\n" // nested message inside nested group " }\n" " }\n" "}\n"); Run("protocol_compiler --print_free_field_numbers --proto_path=$tmpdir " "foo.proto bar.proto baz.proto quz.proto"); ExpectNoErrors(); // TODO(jieluo): Cygwin doesn't work well if we try to capture stderr and // stdout at the same time. Need to figure out why and add this test back // for Cygwin. #if !defined(__CYGWIN__) ExpectCapturedStdout( "foo.Foo free: 1 3 6-7 9 11-INF\n" "Bar free: 1 3 6-7 9 11-INF\n" "Baz free: 1 3 6-7 9 14\n" "Quz.Foo free: 1-INF\n" "Quz.E.G.Foo free: 1-INF\n" "Quz free: 1 3 6-7 12-14 16-INF\n"); #endif } // =================================================================== // Test for --encode and --decode. Note that it would be easier to do this // test as a shell script, but we'd like to be able to run the test on // platforms that don't have a Bourne-compatible shell available (especially // Windows/MSVC). enum EncodeDecodeTestMode { PROTO_PATH, DESCRIPTOR_SET_IN }; class EncodeDecodeTest : public testing::TestWithParam { protected: virtual void SetUp() { WriteUnittestProtoDescriptorSet(); duped_stdin_ = dup(STDIN_FILENO); } virtual void TearDown() { dup2(duped_stdin_, STDIN_FILENO); close(duped_stdin_); } void RedirectStdinFromText(const string& input) { string filename = TestTempDir() + "/test_stdin"; GOOGLE_CHECK_OK(File::SetContents(filename, input, true)); GOOGLE_CHECK(RedirectStdinFromFile(filename)); } bool RedirectStdinFromFile(const string& filename) { int fd = open(filename.c_str(), O_RDONLY); if (fd < 0) return false; dup2(fd, STDIN_FILENO); close(fd); return true; } // Remove '\r' characters from text. string StripCR(const string& text) { string result; for (int i = 0; i < text.size(); i++) { if (text[i] != '\r') { result.push_back(text[i]); } } return result; } enum Type { TEXT, BINARY }; enum ReturnCode { SUCCESS, ERROR }; bool Run(const string& command) { std::vector args; args.push_back("protoc"); SplitStringUsing(command, " ", &args); switch (GetParam()) { case PROTO_PATH: args.push_back("--proto_path=" + TestSourceDir()); break; case DESCRIPTOR_SET_IN: args.push_back(StrCat( "--descriptor_set_in=", unittest_proto_descriptor_set_filename_)); break; default: ADD_FAILURE() << "unexpected EncodeDecodeTestMode: " << GetParam(); } google::protobuf::scoped_array argv(new const char* [args.size()]); for (int i = 0; i < args.size(); i++) { argv[i] = args[i].c_str(); } CommandLineInterface cli; CaptureTestStdout(); CaptureTestStderr(); int result = cli.Run(args.size(), argv.get()); captured_stdout_ = GetCapturedTestStdout(); captured_stderr_ = GetCapturedTestStderr(); return result == 0; } void ExpectStdoutMatchesBinaryFile(const string& filename) { string expected_output; GOOGLE_CHECK_OK(File::GetContents(filename, &expected_output, true)); // Don't use EXPECT_EQ because we don't want to print raw binary data to // stdout on failure. EXPECT_TRUE(captured_stdout_ == expected_output); } void ExpectStdoutMatchesTextFile(const string& filename) { string expected_output; GOOGLE_CHECK_OK(File::GetContents(filename, &expected_output, true)); ExpectStdoutMatchesText(expected_output); } void ExpectStdoutMatchesText(const string& expected_text) { EXPECT_EQ(StripCR(expected_text), StripCR(captured_stdout_)); } void ExpectStderrMatchesText(const string& expected_text) { EXPECT_EQ(StripCR(expected_text), StripCR(captured_stderr_)); } private: void WriteUnittestProtoDescriptorSet() { unittest_proto_descriptor_set_filename_ = TestTempDir() + "/unittest_proto_descriptor_set.bin"; FileDescriptorSet file_descriptor_set; protobuf_unittest::TestAllTypes test_all_types; test_all_types.descriptor()->file()->CopyTo(file_descriptor_set.add_file()); protobuf_unittest_import::ImportMessage import_message; import_message.descriptor()->file()->CopyTo(file_descriptor_set.add_file()); protobuf_unittest_import::PublicImportMessage public_import_message; public_import_message.descriptor()->file()->CopyTo( file_descriptor_set.add_file()); GOOGLE_DCHECK(file_descriptor_set.IsInitialized()); string binary_proto; GOOGLE_CHECK(file_descriptor_set.SerializeToString(&binary_proto)); GOOGLE_CHECK_OK(File::SetContents( unittest_proto_descriptor_set_filename_, binary_proto, true)); } int duped_stdin_; string captured_stdout_; string captured_stderr_; string unittest_proto_descriptor_set_filename_; }; TEST_P(EncodeDecodeTest, Encode) { RedirectStdinFromFile(TestSourceDir() + "/google/protobuf/" "testdata/text_format_unittest_data_oneof_implemented.txt"); EXPECT_TRUE(Run("google/protobuf/unittest.proto " "--encode=protobuf_unittest.TestAllTypes")); ExpectStdoutMatchesBinaryFile(TestSourceDir() + "/google/protobuf/testdata/golden_message_oneof_implemented"); ExpectStderrMatchesText(""); } TEST_P(EncodeDecodeTest, Decode) { RedirectStdinFromFile(TestSourceDir() + "/google/protobuf/testdata/golden_message_oneof_implemented"); EXPECT_TRUE(Run("google/protobuf/unittest.proto " "--decode=protobuf_unittest.TestAllTypes")); ExpectStdoutMatchesTextFile(TestSourceDir() + "/google/protobuf/" "testdata/text_format_unittest_data_oneof_implemented.txt"); ExpectStderrMatchesText(""); } TEST_P(EncodeDecodeTest, Partial) { RedirectStdinFromText(""); EXPECT_TRUE(Run("google/protobuf/unittest.proto " "--encode=protobuf_unittest.TestRequired")); ExpectStdoutMatchesText(""); ExpectStderrMatchesText( "warning: Input message is missing required fields: a, b, c\n"); } TEST_P(EncodeDecodeTest, DecodeRaw) { protobuf_unittest::TestAllTypes message; message.set_optional_int32(123); message.set_optional_string("foo"); string data; message.SerializeToString(&data); RedirectStdinFromText(data); EXPECT_TRUE(Run("--decode_raw")); ExpectStdoutMatchesText("1: 123\n" "14: \"foo\"\n"); ExpectStderrMatchesText(""); } TEST_P(EncodeDecodeTest, UnknownType) { EXPECT_FALSE(Run("google/protobuf/unittest.proto " "--encode=NoSuchType")); ExpectStdoutMatchesText(""); ExpectStderrMatchesText("Type not defined: NoSuchType\n"); } TEST_P(EncodeDecodeTest, ProtoParseError) { EXPECT_FALSE(Run("google/protobuf/no_such_file.proto " "--encode=NoSuchType")); ExpectStdoutMatchesText(""); ExpectStderrMatchesText( "google/protobuf/no_such_file.proto: No such file or directory\n"); } INSTANTIATE_TEST_CASE_P(FileDescriptorSetSource, EncodeDecodeTest, testing::Values(PROTO_PATH, DESCRIPTOR_SET_IN)); } // anonymous namespace #endif // !GOOGLE_PROTOBUF_HEAP_CHECK_DRACONIAN } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/000077500000000000000000000000001334102242000276655ustar00rootroot00000000000000cpp_bootstrap_unittest.cc000066400000000000000000000136671334102242000347500ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp// 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. // // This test insures that google/protobuf/descriptor.pb.{h,cc} match exactly // what would be generated by the protocol compiler. These files are not // generated automatically at build time because they are compiled into the // protocol compiler itself. So, if they were auto-generated, you'd have a // chicken-and-egg problem. // // If this test fails, run the script // "generate_descriptor_proto.sh" and add // descriptor.pb.{h,cc} to your changelist. #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { namespace { class MockErrorCollector : public MultiFileErrorCollector { public: MockErrorCollector() {} ~MockErrorCollector() {} string text_; // implements ErrorCollector --------------------------------------- void AddError(const string& filename, int line, int column, const string& message) { strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line, column, message); } }; class MockGeneratorContext : public GeneratorContext { public: MockGeneratorContext() {} ~MockGeneratorContext() { STLDeleteValues(&files_); } void ExpectFileMatches(const string& virtual_filename, const string& physical_filename) { string* expected_contents = FindPtrOrNull(files_, virtual_filename); ASSERT_TRUE(expected_contents != NULL) << "Generator failed to generate file: " << virtual_filename; string actual_contents; GOOGLE_CHECK_OK( File::GetContents(TestSourceDir() + "/" + physical_filename, &actual_contents, true)); EXPECT_TRUE(actual_contents == *expected_contents) << physical_filename << " needs to be regenerated. Please run " "generate_descriptor_proto.sh. Then add this file " "to your CL."; } // implements GeneratorContext -------------------------------------- virtual io::ZeroCopyOutputStream* Open(const string& filename) { string** map_slot = &files_[filename]; delete *map_slot; *map_slot = new string; return new io::StringOutputStream(*map_slot); } private: std::map files_; }; TEST(BootstrapTest, GeneratedDescriptorMatches) { MockErrorCollector error_collector; DiskSourceTree source_tree; source_tree.MapPath("", TestSourceDir()); Importer importer(&source_tree, &error_collector); const FileDescriptor* proto_file = importer.Import("google/protobuf/descriptor.proto"); const FileDescriptor* plugin_proto_file = importer.Import("google/protobuf/compiler/plugin.proto"); EXPECT_EQ("", error_collector.text_); ASSERT_TRUE(proto_file != NULL); ASSERT_TRUE(plugin_proto_file != NULL); CppGenerator generator; MockGeneratorContext context; string error; string parameter = "dllexport_decl=LIBPROTOBUF_EXPORT"; ASSERT_TRUE(generator.Generate(proto_file, parameter, &context, &error)); parameter = "dllexport_decl=LIBPROTOC_EXPORT"; ASSERT_TRUE(generator.Generate(plugin_proto_file, parameter, &context, &error)); context.ExpectFileMatches("google/protobuf/descriptor.pb.h", "google/protobuf/descriptor.pb.h"); context.ExpectFileMatches("google/protobuf/descriptor.pb.cc", "google/protobuf/descriptor.pb.cc"); context.ExpectFileMatches("google/protobuf/compiler/plugin.pb.h", "google/protobuf/compiler/plugin.pb.h"); context.ExpectFileMatches("google/protobuf/compiler/plugin.pb.cc", "google/protobuf/compiler/plugin.pb.cc"); } } // namespace } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc000066400000000000000000000303311334102242000320020ustar00rootroot00000000000000// 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 #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { namespace { // The GOOGLE_ARRAYSIZE constant is the max enum value plus 1. If the max enum value // is ::google::protobuf::kint32max, GOOGLE_ARRAYSIZE will overflow. In such cases we should omit the // generation of the GOOGLE_ARRAYSIZE constant. bool ShouldGenerateArraySize(const EnumDescriptor* descriptor) { int32 max_value = descriptor->value(0)->number(); for (int i = 0; i < descriptor->value_count(); i++) { if (descriptor->value(i)->number() > max_value) { max_value = descriptor->value(i)->number(); } } return max_value != ::google::protobuf::kint32max; } } // namespace EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor, const Options& options) : descriptor_(descriptor), classname_(ClassName(descriptor, false)), options_(options), generate_array_size_(ShouldGenerateArraySize(descriptor)) { } EnumGenerator::~EnumGenerator() {} void EnumGenerator::FillForwardDeclaration( std::map* enum_names) { if (!options_.proto_h) { return; } (*enum_names)[classname_] = descriptor_; } void EnumGenerator::GenerateDefinition(io::Printer* printer) { std::map vars; vars["classname"] = classname_; vars["short_name"] = descriptor_->name(); vars["enumbase"] = options_.proto_h ? " : int" : ""; // These variables are placeholders to pick out the beginning and ends of // identifiers for annotations (when doing so with existing variables would // be ambiguous or impossible). They should never be set to anything but the // empty string. vars["{"] = ""; vars["}"] = ""; printer->Print(vars, "enum $classname$$enumbase$ {\n"); printer->Annotate("classname", descriptor_); printer->Indent(); const EnumValueDescriptor* min_value = descriptor_->value(0); const EnumValueDescriptor* max_value = descriptor_->value(0); for (int i = 0; i < descriptor_->value_count(); i++) { vars["name"] = EnumValueName(descriptor_->value(i)); // In C++, an value of -2147483648 gets interpreted as the negative of // 2147483648, and since 2147483648 can't fit in an integer, this produces a // compiler warning. This works around that issue. vars["number"] = Int32ToString(descriptor_->value(i)->number()); vars["prefix"] = (descriptor_->containing_type() == NULL) ? "" : classname_ + "_"; vars["deprecation"] = descriptor_->value(i)->options().deprecated() ? " PROTOBUF_DEPRECATED" : ""; if (i > 0) printer->Print(",\n"); printer->Print(vars, "${$$prefix$$name$$}$$deprecation$ = $number$"); printer->Annotate("{", "}", 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 (HasPreservingUnknownEnumSemantics(descriptor_->file())) { // For new enum semantics: generate min and max sentinel values equal to // INT32_MIN and INT32_MAX if (descriptor_->value_count() > 0) printer->Print(",\n"); printer->Print(vars, "$classname$_$prefix$INT_MIN_SENTINEL_DO_NOT_USE_ = ::google::protobuf::kint32min,\n" "$classname$_$prefix$INT_MAX_SENTINEL_DO_NOT_USE_ = ::google::protobuf::kint32max"); } printer->Outdent(); printer->Print("\n};\n"); vars["min_name"] = EnumValueName(min_value); vars["max_name"] = EnumValueName(max_value); if (options_.dllexport_decl.empty()) { vars["dllexport"] = ""; } else { vars["dllexport"] = options_.dllexport_decl + " "; } printer->Print(vars, "$dllexport$bool $classname$_IsValid(int value);\n" "const $classname$ ${$$prefix$$short_name$_MIN$}$ = " "$prefix$$min_name$;\n"); printer->Annotate("{", "}", descriptor_); printer->Print(vars, "const $classname$ ${$$prefix$$short_name$_MAX$}$ = " "$prefix$$max_name$;\n"); printer->Annotate("{", "}", descriptor_); if (generate_array_size_) { printer->Print(vars, "const int ${$$prefix$$short_name$_ARRAYSIZE$}$ = " "$prefix$$short_name$_MAX + 1;\n\n"); printer->Annotate("{", "}", descriptor_); } if (HasDescriptorMethods(descriptor_->file(), options_)) { printer->Print(vars, "$dllexport$const ::google::protobuf::EnumDescriptor* $classname$_descriptor();\n"); // The _Name and _Parse methods printer->Print( vars, "inline const ::std::string& $classname$_Name($classname$ value) {\n" " return ::google::protobuf::internal::NameOfEnum(\n" " $classname$_descriptor(), value);\n" "}\n"); printer->Print(vars, "inline bool $classname$_Parse(\n" " const ::std::string& name, $classname$* value) {\n" " return ::google::protobuf::internal::ParseNamedEnum<$classname$>(\n" " $classname$_descriptor(), name, value);\n" "}\n"); } } void EnumGenerator:: GenerateGetEnumDescriptorSpecializations(io::Printer* printer) { printer->Print( "template <> struct is_proto_enum< $classname$> : ::google::protobuf::internal::true_type " "{};\n", "classname", ClassName(descriptor_, true)); if (HasDescriptorMethods(descriptor_->file(), options_)) { printer->Print( "template <>\n" "inline const EnumDescriptor* GetEnumDescriptor< $classname$>() {\n" " return $classname$_descriptor();\n" "}\n", "classname", ClassName(descriptor_, true)); } } void EnumGenerator::GenerateSymbolImports(io::Printer* printer) { std::map vars; vars["nested_name"] = descriptor_->name(); vars["classname"] = classname_; vars["constexpr"] = options_.proto_h ? "constexpr " : ""; vars["{"] = ""; vars["}"] = ""; printer->Print(vars, "typedef $classname$ $nested_name$;\n"); for (int j = 0; j < descriptor_->value_count(); j++) { vars["tag"] = EnumValueName(descriptor_->value(j)); vars["deprecated_attr"] = descriptor_->value(j)->options().deprecated() ? "GOOGLE_PROTOBUF_DEPRECATED_ATTR " : ""; printer->Print(vars, "$deprecated_attr$static $constexpr$const $nested_name$ ${$$tag$$}$ =\n" " $classname$_$tag$;\n"); printer->Annotate("{", "}", descriptor_->value(j)); } printer->Print(vars, "static inline bool $nested_name$_IsValid(int value) {\n" " return $classname$_IsValid(value);\n" "}\n" "static const $nested_name$ ${$$nested_name$_MIN$}$ =\n" " $classname$_$nested_name$_MIN;\n"); printer->Annotate("{", "}", descriptor_); printer->Print(vars, "static const $nested_name$ ${$$nested_name$_MAX$}$ =\n" " $classname$_$nested_name$_MAX;\n"); printer->Annotate("{", "}", descriptor_); if (generate_array_size_) { printer->Print(vars, "static const int ${$$nested_name$_ARRAYSIZE$}$ =\n" " $classname$_$nested_name$_ARRAYSIZE;\n"); printer->Annotate("{", "}", descriptor_); } if (HasDescriptorMethods(descriptor_->file(), options_)) { printer->Print(vars, "static inline const ::google::protobuf::EnumDescriptor*\n" "$nested_name$_descriptor() {\n" " return $classname$_descriptor();\n" "}\n"); printer->Print(vars, "static inline const ::std::string& " "$nested_name$_Name($nested_name$ value) {" "\n" " return $classname$_Name(value);\n" "}\n"); printer->Print(vars, "static inline bool $nested_name$_Parse(const ::std::string& name,\n" " $nested_name$* value) {\n" " return $classname$_Parse(name, value);\n" "}\n"); } } void EnumGenerator::GenerateMethods(int idx, io::Printer* printer) { std::map vars; vars["classname"] = classname_; vars["index_in_metadata"] = SimpleItoa(idx); vars["constexpr"] = options_.proto_h ? "constexpr " : ""; vars["file_namespace"] = FileLevelNamespace(descriptor_->file()->name()); if (HasDescriptorMethods(descriptor_->file(), options_)) { printer->Print( vars, "const ::google::protobuf::EnumDescriptor* $classname$_descriptor() {\n" " $file_namespace$::protobuf_AssignDescriptorsOnce();\n" " return " "$file_namespace$::file_level_enum_descriptors[$index_in_metadata$];\n" "}\n"); } printer->Print(vars, "bool $classname$_IsValid(int value) {\n" " switch (value) {\n"); // Multiple values may have the same number. Make sure we only cover // each number once by first constructing a set containing all valid // numbers, then printing a case statement for each element. std::set numbers; for (int j = 0; j < descriptor_->value_count(); j++) { const EnumValueDescriptor* value = descriptor_->value(j); numbers.insert(value->number()); } for (std::set::iterator iter = numbers.begin(); iter != numbers.end(); ++iter) { printer->Print( " case $number$:\n", "number", Int32ToString(*iter)); } printer->Print(vars, " return true;\n" " default:\n" " return false;\n" " }\n" "}\n" "\n"); if (descriptor_->containing_type() != NULL) { // We need to "define" the static constants which were declared in the // header, to give the linker a place to put them. Or at least the C++ // standard says we have to. MSVC actually insists that we do _not_ define // them again in the .cc file, prior to VC++ 2015. printer->Print("#if !defined(_MSC_VER) || _MSC_VER >= 1900\n"); vars["parent"] = ClassName(descriptor_->containing_type(), false); vars["nested_name"] = descriptor_->name(); for (int i = 0; i < descriptor_->value_count(); i++) { vars["value"] = EnumValueName(descriptor_->value(i)); printer->Print(vars, "$constexpr$const $classname$ $parent$::$value$;\n"); } printer->Print(vars, "const $classname$ $parent$::$nested_name$_MIN;\n" "const $classname$ $parent$::$nested_name$_MAX;\n"); if (generate_array_size_) { printer->Print(vars, "const int $parent$::$nested_name$_ARRAYSIZE;\n"); } printer->Print("#endif // !defined(_MSC_VER) || _MSC_VER >= 1900\n"); } } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h000066400000000000000000000104131334102242000316430ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_H__ #include #include #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace cpp { class EnumGenerator { public: // See generator.cc for the meaning of dllexport_decl. EnumGenerator(const EnumDescriptor* descriptor, const Options& options); ~EnumGenerator(); // Header stuff. // Fills the name to use when declaring the enum. This is for use when // generating other .proto.h files. This code should be placed within the // enum's package namespace, but NOT within any class, even for nested // enums. A given key in enum_names will map from an enum class name to the // EnumDescriptor that was responsible for its inclusion in the map. This can // be used to associate the descriptor with the code generated for it. void FillForwardDeclaration( std::map* enum_names); // Generate header code defining the enum. This code should be placed // within the enum's package namespace, but NOT within any class, even for // nested enums. void GenerateDefinition(io::Printer* printer); // Generate specialization of GetEnumDescriptor(). // Precondition: in ::google::protobuf namespace. void GenerateGetEnumDescriptorSpecializations(io::Printer* printer); // For enums nested within a message, generate code to import all the enum's // symbols (e.g. the enum type name, all its values, etc.) into the class's // namespace. This should be placed inside the class definition in the // header. void GenerateSymbolImports(io::Printer* printer); // Source file stuff. // Generate non-inline methods related to the enum, such as IsValidValue(). // Goes in the .cc file. EnumDescriptors are stored in an array, idx is // the index in this array that corresponds with this enum. void GenerateMethods(int idx, io::Printer* printer); private: const EnumDescriptor* descriptor_; const string classname_; const Options& options_; // whether to generate the *_ARRAYSIZE constant. const bool generate_array_size_; friend class FileGenerator; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc000066400000000000000000000457751334102242000331670ustar00rootroot00000000000000// 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 #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { namespace { void SetEnumVariables(const FieldDescriptor* descriptor, std::map* variables, const Options& options) { SetCommonFieldVariables(descriptor, variables, options); const EnumValueDescriptor* default_value = descriptor->default_value_enum(); (*variables)["type"] = ClassName(descriptor->enum_type(), true); (*variables)["default"] = Int32ToString(default_value->number()); (*variables)["full_name"] = descriptor->full_name(); } } // namespace // =================================================================== EnumFieldGenerator::EnumFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : FieldGenerator(options), descriptor_(descriptor) { SetEnumVariables(descriptor, &variables_, options); } EnumFieldGenerator::~EnumFieldGenerator() {} void EnumFieldGenerator:: GeneratePrivateMembers(io::Printer* printer) const { printer->Print(variables_, "int $name$_;\n"); } void EnumFieldGenerator:: GenerateAccessorDeclarations(io::Printer* printer) const { printer->Print(variables_, "$deprecated_attr$$type$ $name$() const;\n"); printer->Annotate("name", descriptor_); printer->Print(variables_, "$deprecated_attr$void ${$set_$name$$}$($type$ value);\n"); printer->Annotate("{", "}", descriptor_); } void EnumFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { printer->Print(variables_, "inline $type$ $classname$::$name$() const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " return static_cast< $type$ >($name$_);\n" "}\n" "inline void $classname$::set_$name$($type$ value) {\n"); if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) { printer->Print(variables_, " assert($type$_IsValid(value));\n"); } printer->Print(variables_, " $set_hasbit$\n" " $name$_ = value;\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" "}\n"); } void EnumFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default$;\n"); } void EnumFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "set_$name$(from.$name$());\n"); } void EnumFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { printer->Print(variables_, "swap($name$_, other->$name$_);\n"); } void EnumFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default$;\n"); } void EnumFieldGenerator:: GenerateCopyConstructorCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = from.$name$_;\n"); } void EnumFieldGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) const { printer->Print(variables_, "int value;\n" "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n" " input, &value)));\n"); if (HasPreservingUnknownEnumSemantics(descriptor_->file())) { printer->Print(variables_, "set_$name$(static_cast< $type$ >(value));\n"); } else { printer->Print(variables_, "if ($type$_IsValid(value)) {\n" " set_$name$(static_cast< $type$ >(value));\n"); if (UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print(variables_, "} else {\n" " mutable_unknown_fields()->AddVarint(\n" " $number$, static_cast< ::google::protobuf::uint64>(value));\n"); } else { printer->Print( "} else {\n" " unknown_fields_stream.WriteVarint32($tag$u);\n" " unknown_fields_stream.WriteVarint32(\n" " static_cast< ::google::protobuf::uint32>(value));\n", "tag", SimpleItoa(internal::WireFormat::MakeTag(descriptor_))); } printer->Print(variables_, "}\n"); } } void EnumFieldGenerator:: GenerateSerializeWithCachedSizes(io::Printer* printer) const { printer->Print(variables_, "::google::protobuf::internal::WireFormatLite::WriteEnum(\n" " $number$, this->$name$(), output);\n"); } void EnumFieldGenerator:: GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { printer->Print(variables_, "target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n" " $number$, this->$name$(), target);\n"); } void EnumFieldGenerator:: GenerateByteSize(io::Printer* printer) const { printer->Print(variables_, "total_size += $tag_size$ +\n" " ::google::protobuf::internal::WireFormatLite::EnumSize(this->$name$());\n"); } // =================================================================== EnumOneofFieldGenerator:: EnumOneofFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : EnumFieldGenerator(descriptor, options) { SetCommonOneofFieldVariables(descriptor, &variables_); } EnumOneofFieldGenerator::~EnumOneofFieldGenerator() {} void EnumOneofFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { printer->Print(variables_, "inline $type$ $classname$::$name$() const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " if (has_$name$()) {\n" " return static_cast< $type$ >($oneof_prefix$$name$_);\n" " }\n" " return static_cast< $type$ >($default$);\n" "}\n" "inline void $classname$::set_$name$($type$ value) {\n"); if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) { printer->Print(variables_, " assert($type$_IsValid(value));\n"); } printer->Print(variables_, " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " }\n" " $oneof_prefix$$name$_ = value;\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" "}\n"); } void EnumOneofFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { printer->Print(variables_, "$oneof_prefix$$name$_ = $default$;\n"); } void EnumOneofFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { // Don't print any swapping code. Swapping the union will swap this field. } void EnumOneofFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { printer->Print(variables_, "$ns$::_$classname$_default_instance_.$name$_ = $default$;\n"); } // =================================================================== RepeatedEnumFieldGenerator::RepeatedEnumFieldGenerator( const FieldDescriptor* descriptor, const Options& options) : FieldGenerator(options), descriptor_(descriptor) { SetEnumVariables(descriptor, &variables_, options); } RepeatedEnumFieldGenerator::~RepeatedEnumFieldGenerator() {} void RepeatedEnumFieldGenerator:: GeneratePrivateMembers(io::Printer* printer) const { printer->Print(variables_, "::google::protobuf::RepeatedField $name$_;\n"); if (descriptor_->is_packed() && HasGeneratedMethods(descriptor_->file(), options_)) { printer->Print(variables_, "mutable int _$name$_cached_byte_size_;\n"); } } void RepeatedEnumFieldGenerator:: GenerateAccessorDeclarations(io::Printer* printer) const { printer->Print(variables_, "$deprecated_attr$$type$ $name$(int index) const;\n"); printer->Annotate("name", descriptor_); printer->Print( variables_, "$deprecated_attr$void ${$set_$name$$}$(int index, $type$ value);\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "$deprecated_attr$void ${$add_$name$$}$($type$ value);\n"); printer->Annotate("{", "}", descriptor_); printer->Print( variables_, "$deprecated_attr$const ::google::protobuf::RepeatedField& $name$() const;\n"); printer->Annotate("name", descriptor_); printer->Print(variables_, "$deprecated_attr$::google::protobuf::RepeatedField* " "${$mutable_$name$$}$();\n"); printer->Annotate("{", "}", descriptor_); } void RepeatedEnumFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { printer->Print(variables_, "inline $type$ $classname$::$name$(int index) const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " return static_cast< $type$ >($name$_.Get(index));\n" "}\n" "inline void $classname$::set_$name$(int index, $type$ value) {\n"); if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) { printer->Print(variables_, " assert($type$_IsValid(value));\n"); } printer->Print(variables_, " $name$_.Set(index, value);\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" "}\n" "inline void $classname$::add_$name$($type$ value) {\n"); if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) { printer->Print(variables_, " assert($type$_IsValid(value));\n"); } printer->Print(variables_, " $name$_.Add(value);\n" " // @@protoc_insertion_point(field_add:$full_name$)\n" "}\n" "inline const ::google::protobuf::RepeatedField&\n" "$classname$::$name$() const {\n" " // @@protoc_insertion_point(field_list:$full_name$)\n" " return $name$_;\n" "}\n" "inline ::google::protobuf::RepeatedField*\n" "$classname$::mutable_$name$() {\n" " // @@protoc_insertion_point(field_mutable_list:$full_name$)\n" " return &$name$_;\n" "}\n"); } void RepeatedEnumFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.Clear();\n"); } void RepeatedEnumFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); } void RepeatedEnumFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.InternalSwap(&other->$name$_);\n"); } void RepeatedEnumFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { // Not needed for repeated fields. } void RepeatedEnumFieldGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) const { // Don't use ReadRepeatedPrimitive here so that the enum can be validated. printer->Print(variables_, "int value;\n" "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n" " input, &value)));\n"); if (HasPreservingUnknownEnumSemantics(descriptor_->file())) { printer->Print(variables_, "add_$name$(static_cast< $type$ >(value));\n"); } else { printer->Print(variables_, "if ($type$_IsValid(value)) {\n" " add_$name$(static_cast< $type$ >(value));\n"); if (UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print(variables_, "} else {\n" " mutable_unknown_fields()->AddVarint(\n" " $number$, static_cast< ::google::protobuf::uint64>(value));\n"); } else { printer->Print( "} else {\n" " unknown_fields_stream.WriteVarint32(tag);\n" " unknown_fields_stream.WriteVarint32(\n" " static_cast< ::google::protobuf::uint32>(value));\n"); } printer->Print("}\n"); } } void RepeatedEnumFieldGenerator:: GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const { if (!descriptor_->is_packed()) { // This path is rarely executed, so we use a non-inlined implementation. if (HasPreservingUnknownEnumSemantics(descriptor_->file())) { printer->Print(variables_, "DO_((::google::protobuf::internal::" "WireFormatLite::ReadPackedEnumPreserveUnknowns(\n" " input,\n" " $number$,\n" " NULL,\n" " NULL,\n" " this->mutable_$name$())));\n"); } else if (UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print(variables_, "DO_((::google::protobuf::internal::WireFormat::ReadPackedEnumPreserveUnknowns(\n" " input,\n" " $number$,\n" " $type$_IsValid,\n" " mutable_unknown_fields(),\n" " this->mutable_$name$())));\n"); } else { printer->Print(variables_, "DO_((::google::protobuf::internal::" "WireFormatLite::ReadPackedEnumPreserveUnknowns(\n" " input,\n" " $number$,\n" " $type$_IsValid,\n" " &unknown_fields_stream,\n" " this->mutable_$name$())));\n"); } } else { printer->Print(variables_, "::google::protobuf::uint32 length;\n" "DO_(input->ReadVarint32(&length));\n" "::google::protobuf::io::CodedInputStream::Limit limit = " "input->PushLimit(static_cast(length));\n" "while (input->BytesUntilLimit() > 0) {\n" " int value;\n" " DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n" " input, &value)));\n"); if (HasPreservingUnknownEnumSemantics(descriptor_->file())) { printer->Print(variables_, " add_$name$(static_cast< $type$ >(value));\n"); } else { printer->Print(variables_, " if ($type$_IsValid(value)) {\n" " add_$name$(static_cast< $type$ >(value));\n" " } else {\n"); if (UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print(variables_, " mutable_unknown_fields()->AddVarint(\n" " $number$, static_cast< ::google::protobuf::uint64>(value));\n"); } else { printer->Print(variables_, " unknown_fields_stream.WriteVarint32(tag);\n" " unknown_fields_stream.WriteVarint32(\n" " static_cast< ::google::protobuf::uint32>(value));\n"); } printer->Print( " }\n"); } printer->Print(variables_, "}\n" "input->PopLimit(limit);\n"); } } void RepeatedEnumFieldGenerator:: GenerateSerializeWithCachedSizes(io::Printer* printer) const { if (descriptor_->is_packed()) { // Write the tag and the size. printer->Print(variables_, "if (this->$name$_size() > 0) {\n" " ::google::protobuf::internal::WireFormatLite::WriteTag(\n" " $number$,\n" " ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n" " output);\n" " output->WriteVarint32(\n" " static_cast< ::google::protobuf::uint32>(_$name$_cached_byte_size_));\n" "}\n"); } printer->Print(variables_, "for (int i = 0, n = this->$name$_size(); i < n; i++) {\n"); if (descriptor_->is_packed()) { printer->Print(variables_, " ::google::protobuf::internal::WireFormatLite::WriteEnumNoTag(\n" " this->$name$(i), output);\n"); } else { printer->Print(variables_, " ::google::protobuf::internal::WireFormatLite::WriteEnum(\n" " $number$, this->$name$(i), output);\n"); } printer->Print("}\n"); } void RepeatedEnumFieldGenerator:: GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { if (descriptor_->is_packed()) { // Write the tag and the size. printer->Print(variables_, "if (this->$name$_size() > 0) {\n" " target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(\n" " $number$,\n" " ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n" " target);\n" " target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(" " static_cast< ::google::protobuf::uint32>(\n" " _$name$_cached_byte_size_), target);\n" " target = ::google::protobuf::internal::WireFormatLite::WriteEnumNoTagToArray(\n" " this->$name$_, target);\n" "}\n"); } else { printer->Print(variables_, "target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n" " $number$, this->$name$_, target);\n"); } } void RepeatedEnumFieldGenerator:: GenerateByteSize(io::Printer* printer) const { printer->Print(variables_, "{\n" " size_t data_size = 0;\n" " unsigned int count = static_cast(this->$name$_size());"); printer->Indent(); printer->Print(variables_, "for (unsigned int i = 0; i < count; i++) {\n" " data_size += ::google::protobuf::internal::WireFormatLite::EnumSize(\n" " this->$name$(static_cast(i)));\n" "}\n"); if (descriptor_->is_packed()) { printer->Print(variables_, "if (data_size > 0) {\n" " total_size += $tag_size$ +\n" " ::google::protobuf::internal::WireFormatLite::Int32Size(\n" " static_cast< ::google::protobuf::int32>(data_size));\n" "}\n" "int cached_size = ::google::protobuf::internal::ToCachedSize(data_size);\n" "GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n" "_$name$_cached_byte_size_ = cached_size;\n" "GOOGLE_SAFE_CONCURRENT_WRITES_END();\n" "total_size += data_size;\n"); } else { printer->Print(variables_, "total_size += ($tag_size$UL * count) + data_size;\n"); } printer->Outdent(); printer->Print("}\n"); } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h000066400000000000000000000122011334102242000330030ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { class EnumFieldGenerator : public FieldGenerator { public: EnumFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~EnumFieldGenerator(); // implements FieldGenerator --------------------------------------- void GeneratePrivateMembers(io::Printer* printer) const; void GenerateAccessorDeclarations(io::Printer* printer) const; void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; void GenerateCopyConstructorCode(io::Printer* printer) const; void GenerateMergeFromCodedStream(io::Printer* printer) const; void GenerateSerializeWithCachedSizes(io::Printer* printer) const; void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; void GenerateByteSize(io::Printer* printer) const; protected: const FieldDescriptor* descriptor_; std::map variables_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator); }; class EnumOneofFieldGenerator : public EnumFieldGenerator { public: EnumOneofFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~EnumOneofFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumOneofFieldGenerator); }; class RepeatedEnumFieldGenerator : public FieldGenerator { public: RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~RepeatedEnumFieldGenerator(); // implements FieldGenerator --------------------------------------- void GeneratePrivateMembers(io::Printer* printer) const; void GenerateAccessorDeclarations(io::Printer* printer) const; void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; void GenerateCopyConstructorCode(io::Printer* printer) const {} void GenerateMergeFromCodedStream(io::Printer* printer) const; void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const; void GenerateSerializeWithCachedSizes(io::Printer* printer) const; void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; void GenerateByteSize(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc000066400000000000000000000154561334102242000330650ustar00rootroot00000000000000// 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 #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { namespace { // Returns the fully-qualified class name of the message that this field // extends. This function is used in the Google-internal code to handle some // legacy cases. string ExtendeeClassName(const FieldDescriptor* descriptor) { const Descriptor* extendee = descriptor->containing_type(); return ClassName(extendee, true); } } // anonymous namespace ExtensionGenerator::ExtensionGenerator(const FieldDescriptor* descriptor, const Options& options) : descriptor_(descriptor), options_(options) { // Construct type_traits_. if (descriptor_->is_repeated()) { type_traits_ = "Repeated"; } switch (descriptor_->cpp_type()) { case FieldDescriptor::CPPTYPE_ENUM: type_traits_.append("EnumTypeTraits< "); type_traits_.append(ClassName(descriptor_->enum_type(), true)); type_traits_.append(", "); type_traits_.append(ClassName(descriptor_->enum_type(), true)); type_traits_.append("_IsValid>"); break; case FieldDescriptor::CPPTYPE_STRING: type_traits_.append("StringTypeTraits"); break; case FieldDescriptor::CPPTYPE_MESSAGE: type_traits_.append("MessageTypeTraits< "); type_traits_.append(ClassName(descriptor_->message_type(), true)); type_traits_.append(" >"); break; default: type_traits_.append("PrimitiveTypeTraits< "); type_traits_.append(PrimitiveTypeName(descriptor_->cpp_type())); type_traits_.append(" >"); break; } } ExtensionGenerator::~ExtensionGenerator() {} void ExtensionGenerator::GenerateDeclaration(io::Printer* printer) { std::map vars; vars["extendee" ] = ExtendeeClassName(descriptor_); vars["number" ] = SimpleItoa(descriptor_->number()); vars["type_traits" ] = type_traits_; vars["name" ] = descriptor_->name(); vars["field_type" ] = SimpleItoa(static_cast(descriptor_->type())); vars["packed" ] = descriptor_->options().packed() ? "true" : "false"; vars["constant_name"] = FieldConstantName(descriptor_); // If this is a class member, it needs to be declared "static". Otherwise, // it needs to be "extern". In the latter case, it also needs the DLL // export/import specifier. if (descriptor_->extension_scope() == NULL) { vars["qualifier"] = "extern"; if (!options_.dllexport_decl.empty()) { vars["qualifier"] = options_.dllexport_decl + " " + vars["qualifier"]; } } else { vars["qualifier"] = "static"; } printer->Print(vars, "static const int $constant_name$ = $number$;\n" "$qualifier$ ::google::protobuf::internal::ExtensionIdentifier< $extendee$,\n" " ::google::protobuf::internal::$type_traits$, $field_type$, $packed$ >\n" " $name$;\n" ); } void ExtensionGenerator::GenerateDefinition(io::Printer* printer) { // If this is a class member, it needs to be declared in its class scope. string scope = (descriptor_->extension_scope() == NULL) ? "" : ClassName(descriptor_->extension_scope(), false) + "::"; string name = scope + descriptor_->name(); std::map vars; vars["extendee" ] = ExtendeeClassName(descriptor_); vars["type_traits" ] = type_traits_; vars["name" ] = name; vars["constant_name"] = FieldConstantName(descriptor_); vars["default" ] = DefaultValue(descriptor_); vars["field_type" ] = SimpleItoa(static_cast(descriptor_->type())); vars["packed" ] = descriptor_->options().packed() ? "true" : "false"; vars["scope" ] = scope; if (descriptor_->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { // We need to declare a global string which will contain the default value. // We cannot declare it at class scope because that would require exposing // it in the header which would be annoying for other reasons. So we // replace :: with _ in the name and declare it as a global. string global_name = StringReplace(name, "::", "_", true); vars["global_name"] = global_name; printer->Print(vars, "const ::std::string $global_name$_default($default$);\n"); // Update the default to refer to the string global. vars["default"] = global_name + "_default"; } // Likewise, class members need to declare the field constant variable. if (descriptor_->extension_scope() != NULL) { printer->Print(vars, "#if !defined(_MSC_VER) || _MSC_VER >= 1900\n" "const int $scope$$constant_name$;\n" "#endif\n"); } printer->Print(vars, "::google::protobuf::internal::ExtensionIdentifier< $extendee$,\n" " ::google::protobuf::internal::$type_traits$, $field_type$, $packed$ >\n" " $name$($constant_name$, $default$);\n"); } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h000066400000000000000000000061001334102242000327110ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_EXTENSION_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_EXTENSION_H__ #include #include #include namespace google { namespace protobuf { class FieldDescriptor; // descriptor.h namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace cpp { // Generates code for an extension, which may be within the scope of some // message or may be at file scope. This is much simpler than FieldGenerator // since extensions are just simple identifiers with interesting types. class ExtensionGenerator { public: // See generator.cc for the meaning of dllexport_decl. explicit ExtensionGenerator(const FieldDescriptor* descriptor, const Options& options); ~ExtensionGenerator(); // Header stuff. void GenerateDeclaration(io::Printer* printer); // Source file stuff. void GenerateDefinition(io::Printer* printer); private: const FieldDescriptor* descriptor_; string type_traits_; Options options_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc000066400000000000000000000205661334102242000321320ustar00rootroot00000000000000// 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 #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { using internal::WireFormat; void SetCommonFieldVariables(const FieldDescriptor* descriptor, std::map* variables, const Options& options) { (*variables)["ns"] = Namespace(descriptor); (*variables)["name"] = FieldName(descriptor); (*variables)["index"] = SimpleItoa(descriptor->index()); (*variables)["number"] = SimpleItoa(descriptor->number()); (*variables)["classname"] = ClassName(FieldScope(descriptor), false); (*variables)["declared_type"] = DeclaredTypeMethodName(descriptor->type()); // non_null_ptr_to_name is usable only if has_$name$ is true. It yields a // pointer that will not be NULL. Subclasses of FieldGenerator may set // (*variables)["non_null_ptr_to_name"] differently. (*variables)["non_null_ptr_to_name"] = StrCat("&this->", FieldName(descriptor), "()"); (*variables)["tag_size"] = SimpleItoa( WireFormat::TagSize(descriptor->number(), descriptor->type())); (*variables)["deprecation"] = descriptor->options().deprecated() ? " PROTOBUF_DEPRECATED" : ""; (*variables)["deprecated_attr"] = descriptor->options().deprecated() ? "GOOGLE_PROTOBUF_DEPRECATED_ATTR " : ""; (*variables)["cppget"] = "Get"; if (HasFieldPresence(descriptor->file())) { (*variables)["set_hasbit"] = "set_has_" + FieldName(descriptor) + "();"; (*variables)["clear_hasbit"] = "clear_has_" + FieldName(descriptor) + "();"; } else { (*variables)["set_hasbit"] = ""; (*variables)["clear_hasbit"] = ""; } // By default, empty string, so that generic code used for both oneofs and // singular fields can be written. (*variables)["oneof_prefix"] = ""; // These variables are placeholders to pick out the beginning and ends of // identifiers for annotations (when doing so with existing variables would // be ambiguous or impossible). They should never be set to anything but the // empty string. (*variables)["{"] = ""; (*variables)["}"] = ""; } void SetCommonOneofFieldVariables(const FieldDescriptor* descriptor, std::map* variables) { const string prefix = descriptor->containing_oneof()->name() + "_."; (*variables)["oneof_prefix"] = prefix; (*variables)["oneof_name"] = descriptor->containing_oneof()->name(); (*variables)["non_null_ptr_to_name"] = StrCat(prefix, (*variables)["name"], "_"); } FieldGenerator::~FieldGenerator() {} void FieldGenerator:: GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const { // Reaching here indicates a bug. Cases are: // - This FieldGenerator should support packing, but this method should be // overridden. // - This FieldGenerator doesn't support packing, and this method should // never have been called. GOOGLE_LOG(FATAL) << "GenerateMergeFromCodedStreamWithPacking() " << "called on field generator that does not support packing."; } FieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor, const Options& options) : descriptor_(descriptor), options_(options), field_generators_( new google::protobuf::scoped_ptr[descriptor->field_count()]) { // Construct all the FieldGenerators. for (int i = 0; i < descriptor->field_count(); i++) { field_generators_[i].reset(MakeGenerator(descriptor->field(i), options)); } } FieldGenerator* FieldGeneratorMap::MakeGenerator(const FieldDescriptor* field, const Options& options) { if (field->is_repeated()) { switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_MESSAGE: if (field->is_map()) { return new MapFieldGenerator(field, options); } else { return new RepeatedMessageFieldGenerator(field, options); } case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: // RepeatedStringFieldGenerator handles unknown ctypes. case FieldOptions::STRING: return new RepeatedStringFieldGenerator(field, options); } case FieldDescriptor::CPPTYPE_ENUM: return new RepeatedEnumFieldGenerator(field, options); default: return new RepeatedPrimitiveFieldGenerator(field, options); } } else if (field->containing_oneof()) { switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_MESSAGE: return new MessageOneofFieldGenerator(field, options); case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: // StringOneofFieldGenerator handles unknown ctypes. case FieldOptions::STRING: return new StringOneofFieldGenerator(field, options); } case FieldDescriptor::CPPTYPE_ENUM: return new EnumOneofFieldGenerator(field, options); default: return new PrimitiveOneofFieldGenerator(field, options); } } else { switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_MESSAGE: return new MessageFieldGenerator(field, options); case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: // StringFieldGenerator handles unknown ctypes. case FieldOptions::STRING: return new StringFieldGenerator(field, options); } case FieldDescriptor::CPPTYPE_ENUM: return new EnumFieldGenerator(field, options); default: return new PrimitiveFieldGenerator(field, options); } } } FieldGeneratorMap::~FieldGeneratorMap() {} const FieldGenerator& FieldGeneratorMap::get( const FieldDescriptor* field) const { GOOGLE_CHECK_EQ(field->containing_type(), descriptor_); return *field_generators_[field->index()]; } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h000066400000000000000000000242221334102242000317650ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__ #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace cpp { // Helper function: set variables in the map that are the same for all // field code generators. // ['name', 'index', 'number', 'classname', 'declared_type', 'tag_size', // 'deprecation']. void SetCommonFieldVariables(const FieldDescriptor* descriptor, std::map* variables, const Options& options); void SetCommonOneofFieldVariables(const FieldDescriptor* descriptor, std::map* variables); class FieldGenerator { public: explicit FieldGenerator(const Options& options) : options_(options) {} virtual ~FieldGenerator(); // Generate lines of code declaring members fields of the message class // needed to represent this field. These are placed inside the message // class. virtual void GeneratePrivateMembers(io::Printer* printer) const = 0; // Generate static default variable for this field. These are placed inside // the message class. Most field types don't need this, so the default // implementation is empty. virtual void GenerateStaticMembers(io::Printer* /*printer*/) const {} // Generate prototypes for accessors that will manipulate imported // messages inline. These are for .proto.h headers. // // In .proto.h mode, the headers of imports are not #included. However, // functions that manipulate the imported message types need access to // the class definition of the imported message, meaning that the headers // must be #included. To get around this, functions that manipulate // imported message objects are defined as dependent functions in a base // template class. By making them dependent template functions, the // function templates will not be instantiated until they are called, so // we can defer to those translation units to #include the necessary // generated headers. // // See: // http://en.cppreference.com/w/cpp/language/class_template#Implicit_instantiation // // Most field types don't need this, so the default implementation is empty. virtual void GenerateDependentAccessorDeclarations( io::Printer* printer) const {} // Generate prototypes for all of the accessor functions related to this // field. These are placed inside the class definition. virtual void GenerateAccessorDeclarations(io::Printer* printer) const = 0; // Generate inline definitions of depenent accessor functions for this field. // These are placed inside the header after all class definitions. virtual void GenerateDependentInlineAccessorDefinitions( io::Printer* printer) const {} // Generate inline definitions of accessor functions for this field. // These are placed inside the header after all class definitions. // In non-.proto.h mode, this generates dependent accessor functions as well. virtual void GenerateInlineAccessorDefinitions( io::Printer* printer) const = 0; // Generate definitions of accessors that aren't inlined. These are // placed somewhere in the .cc file. // Most field types don't need this, so the default implementation is empty. virtual void GenerateNonInlineAccessorDefinitions( io::Printer* /*printer*/) const {} // Generate lines of code (statements, not declarations) which clear the // field. This is used to define the clear_$name$() method virtual void GenerateClearingCode(io::Printer* printer) const = 0; // Generate lines of code (statements, not declarations) which clear the field // as part of the Clear() method for the whole message. For message types // which have field presence bits, MessageGenerator::GenerateClear will have // already checked the presence bits. // // Since most field types can re-use GenerateClearingCode, this method is not // pure virtual. virtual void GenerateMessageClearingCode(io::Printer* printer) const { GenerateClearingCode(printer); } // Generate lines of code (statements, not declarations) which merges the // contents of the field from the current message to the target message, // which is stored in the generated code variable "from". // This is used to fill in the MergeFrom method for the whole message. // Details of this usage can be found in message.cc under the // GenerateMergeFrom method. virtual void GenerateMergingCode(io::Printer* printer) const = 0; // Generates a copy constructor virtual void GenerateCopyConstructorCode(io::Printer* printer) const = 0; // Generate lines of code (statements, not declarations) which swaps // this field and the corresponding field of another message, which // is stored in the generated code variable "other". This is used to // define the Swap method. Details of usage can be found in // message.cc under the GenerateSwap method. virtual void GenerateSwappingCode(io::Printer* printer) const = 0; // Generate initialization code for private members declared by // GeneratePrivateMembers(). These go into the message class's SharedCtor() // method, invoked by each of the generated constructors. virtual void GenerateConstructorCode(io::Printer* printer) const = 0; // 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. virtual void GenerateDestructorCode(io::Printer* /*printer*/) const {} // Generate a manual destructor invocation for use when the message is on an // arena. The code that this method generates will be executed inside a // shared-for-the-whole-message-class method registered with OwnDestructor(). // The method should return |true| if it generated any code that requires a // call; this allows the message generator to eliminate the OwnDestructor() // registration if no fields require it. virtual bool GenerateArenaDestructorCode(io::Printer* printer) const { return false; } // Generate code that allocates the fields's default instance. virtual void GenerateDefaultInstanceAllocator(io::Printer* /*printer*/) const {} // Generate lines to decode this field, which will be placed inside the // message's MergeFromCodedStream() method. virtual void GenerateMergeFromCodedStream(io::Printer* printer) const = 0; // Generate lines to decode this field from a packed value, which will be // placed inside the message's MergeFromCodedStream() method. virtual void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const; // Generate lines to serialize this field, which are placed within the // message's SerializeWithCachedSizes() method. virtual void GenerateSerializeWithCachedSizes(io::Printer* printer) const = 0; // Generate lines to serialize this field directly to the array "target", // which are placed within the message's SerializeWithCachedSizesToArray() // method. This must also advance "target" past the written bytes. virtual void GenerateSerializeWithCachedSizesToArray( io::Printer* printer) const = 0; // Generate lines to compute the serialized size of this field, which // are placed in the message's ByteSize() method. virtual void GenerateByteSize(io::Printer* printer) const = 0; protected: const Options& options_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGenerator); }; // Convenience class which constructs FieldGenerators for a Descriptor. class FieldGeneratorMap { public: FieldGeneratorMap(const Descriptor* descriptor, const Options& options); ~FieldGeneratorMap(); const FieldGenerator& get(const FieldDescriptor* field) const; private: const Descriptor* descriptor_; const Options& options_; google::protobuf::scoped_array > field_generators_; static FieldGenerator* MakeGenerator(const FieldDescriptor* field, const Options& options); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc000066400000000000000000001421201334102242000317550ustar00rootroot00000000000000// 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 #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options) : file_(file), options_(options), scc_analyzer_(options), enum_generators_owner_( new google::protobuf::scoped_ptr[file->enum_type_count()]), service_generators_owner_( new google::protobuf::scoped_ptr[file->service_count()]), extension_generators_owner_( new google::protobuf::scoped_ptr[file->extension_count()]) { std::vector msgs = FlattenMessagesInFile(file); for (int i = 0; i < msgs.size(); i++) { // Deleted in destructor MessageGenerator* msg_gen = new MessageGenerator(msgs[i], i, options, &scc_analyzer_); message_generators_.push_back(msg_gen); msg_gen->AddGenerators(&enum_generators_, &extension_generators_); } for (int i = 0; i < file->enum_type_count(); i++) { enum_generators_owner_[i].reset( new EnumGenerator(file->enum_type(i), options)); enum_generators_.push_back(enum_generators_owner_[i].get()); } for (int i = 0; i < file->service_count(); i++) { service_generators_owner_[i].reset( new ServiceGenerator(file->service(i), options)); service_generators_.push_back(service_generators_owner_[i].get()); } if (HasGenericServices(file_, options_)) { 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_owner_[i].reset( new ExtensionGenerator(file->extension(i), options)); extension_generators_.push_back(extension_generators_owner_[i].get()); } package_parts_ = Split(file_->package(), ".", true); } FileGenerator::~FileGenerator() { for (int i = 0; i < message_generators_.size(); i++) { delete message_generators_[i]; } } void FileGenerator::GenerateMacroUndefs(io::Printer* printer) { // 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. if (file_->name() != "google/protobuf/compiler/plugin.proto") { return; } std::vector names_to_undef; std::vector fields; ListAllFields(file_, &fields); for (int i = 0; i < fields.size(); i++) { const string& name = fields[i]->name(); static const char* kMacroNames[] = {"major", "minor"}; for (int i = 0; i < GOOGLE_ARRAYSIZE(kMacroNames); ++i) { if (name == kMacroNames[i]) { names_to_undef.push_back(name); break; } } } for (int i = 0; i < names_to_undef.size(); ++i) { printer->Print( "#ifdef $name$\n" "#undef $name$\n" "#endif\n", "name", names_to_undef[i]); } } void FileGenerator::GenerateHeader(io::Printer* printer) { printer->Print( "// @@protoc_insertion_point(includes)\n"); GenerateMacroUndefs(printer); GenerateGlobalStateFunctionDeclarations(printer); GenerateForwardDeclarations(printer); { NamespaceOpener ns(Namespace(file_), printer); printer->Print("\n"); GenerateEnumDefinitions(printer); printer->Print(kThickSeparator); printer->Print("\n"); GenerateMessageDefinitions(printer); printer->Print("\n"); printer->Print(kThickSeparator); printer->Print("\n"); GenerateServiceDefinitions(printer); GenerateExtensionIdentifiers(printer); printer->Print("\n"); printer->Print(kThickSeparator); printer->Print("\n"); GenerateInlineFunctionDefinitions(printer); printer->Print( "\n" "// @@protoc_insertion_point(namespace_scope)\n" "\n"); } // We need to specialize some templates in the ::google::protobuf namespace: GenerateProto2NamespaceEnumSpecializations(printer); printer->Print( "\n" "// @@protoc_insertion_point(global_scope)\n" "\n"); } void FileGenerator::GenerateProtoHeader(io::Printer* printer, const string& info_path) { if (!options_.proto_h) { return; } string filename_identifier = FilenameIdentifier(file_->name()); GenerateTopHeaderGuard(printer, filename_identifier); GenerateLibraryIncludes(printer); for (int i = 0; i < file_->public_dependency_count(); i++) { const FileDescriptor* dep = file_->public_dependency(i); const char* extension = ".proto.h"; string dependency = StripProto(dep->name()) + extension; printer->Print( "#include \"$dependency$\" // IWYU pragma: export\n", "dependency", dependency); } GenerateMetadataPragma(printer, info_path); GenerateHeader(printer); GenerateBottomHeaderGuard(printer, filename_identifier); } void FileGenerator::GeneratePBHeader(io::Printer* printer, const string& info_path) { string filename_identifier = FilenameIdentifier(file_->name() + (options_.proto_h ? ".pb.h" : "")); GenerateTopHeaderGuard(printer, filename_identifier); if (options_.proto_h) { printer->Print("#include \"$basename$.proto.h\" // IWYU pragma: export\n", "basename", StripProto(file_->name())); } else { GenerateLibraryIncludes(printer); } GenerateDependencyIncludes(printer); GenerateMetadataPragma(printer, info_path); if (!options_.proto_h) { GenerateHeader(printer); } else { // This is unfortunately necessary for some plugins. I don't see why we // need two of the same insertion points. // TODO(gerbens) remove this. printer->Print( "// @@protoc_insertion_point(includes)\n"); { NamespaceOpener ns(Namespace(file_), printer); printer->Print( "\n" "// @@protoc_insertion_point(namespace_scope)\n"); } printer->Print( "\n" "// @@protoc_insertion_point(global_scope)\n" "\n"); } GenerateBottomHeaderGuard(printer, filename_identifier); } void FileGenerator::GenerateSourceIncludes(io::Printer* printer) { const bool use_system_include = IsWellKnownMessage(file_); string header = StripProto(file_->name()) + (options_.proto_h ? ".proto.h" : ".pb.h"); printer->Print( "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" "// source: $filename$\n" "\n" "#include $left$$header$$right$\n" "\n" "#include \n" // for swap() "\n" "#include \n" "#include \n" "#include \n" "#include \n" "#include \n", "filename", file_->name(), "header", header, "left", use_system_include ? "<" : "\"", "right", use_system_include ? ">" : "\""); // Unknown fields implementation in lite mode uses StringOutputStream if (!UseUnknownFieldSet(file_, options_) && !message_generators_.empty()) { printer->Print( "#include \n"); } if (HasDescriptorMethods(file_, options_)) { printer->Print( "#include \n" "#include \n" "#include \n" "#include \n"); } if (options_.proto_h) { // Use the smaller .proto.h files. for (int i = 0; i < file_->dependency_count(); i++) { const FileDescriptor* dep = file_->dependency(i); const char* extension = ".proto.h"; string dependency = StripProto(dep->name()) + extension; printer->Print( "#include \"$dependency$\"\n", "dependency", dependency); } } // TODO(gerbens) Remove this when all code in google is using the same // proto library. This is a temporary hack to force build errors if // the proto library is compiled with GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS // and is also linking internal proto2. This is to prevent regressions while // we work cleaning up the code base. After this is completed and we have // one proto lib all code uses this should be removed. printer->Print( "// This is a temporary google only hack\n" "#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS\n" "#include \"third_party/protobuf/version.h\"\n" "#endif\n"); printer->Print( "// @@protoc_insertion_point(includes)\n"); } void FileGenerator::GenerateSourceDefaultInstance(int idx, io::Printer* printer) { printer->Print( "class $classname$DefaultTypeInternal {\n" " public:\n" " ::google::protobuf::internal::ExplicitlyConstructed<$classname$>\n" " _instance;\n", "classname", message_generators_[idx]->classname_); printer->Indent(); message_generators_[idx]->GenerateExtraDefaultFields(printer); printer->Outdent(); printer->Print("} _$classname$_default_instance_;\n", "classname", message_generators_[idx]->classname_); } namespace { // Generates weak symbol declarations for types that are to be considered weakly // referenced. void GenerateWeakDeclarations( const FileDescriptor* file, const Options& options, SCCAnalyzer* scc_analyzer, io::Printer* printer) { std::vector fields; ListAllFields(file, &fields); // To ensure determinism and minimize the number of namespace statements, // we output the forward declarations sorted on namespace and type / function // name. std::set > messages; std::set > inits; for (int i = 0; i < fields.size(); ++i) { const FieldDescriptor* field = fields[i]; bool is_weak = IsImplicitWeakField(field, options); if (is_weak) { const Descriptor* msg = field->message_type(); string flns = FileLevelNamespace(msg); string repr = ClassName(scc_analyzer->GetSCC(msg)->GetRepresentative()); inits.insert(std::make_pair(flns, "InitDefaults" + repr)); inits.insert(std::make_pair(flns, "AddDescriptors")); messages.insert(std::make_pair(Namespace(msg), ClassName(msg))); } } if (messages.empty()) { return; } printer->Print("\n"); NamespaceOpener ns(printer); for (std::set >::const_iterator it = messages.begin(); it != messages.end(); ++it) { ns.ChangeTo(it->first); printer->Print( "extern __attribute__((weak)) $classname$DefaultTypeInternal " "_$classname$_default_instance_;\n", "classname", it->second); } for (std::set >::const_iterator it = inits.begin(); it != inits.end(); ++it) { ns.ChangeTo(it->first); printer->Print("void $name$() __attribute__((weak));\n", "name", it->second); } } } // namespace void FileGenerator::GenerateSourceForMessage(int idx, io::Printer* printer) { GenerateSourceIncludes(printer); GenerateWeakDeclarations(file_, options_, &scc_analyzer_, printer); { // package namespace NamespaceOpener ns(Namespace(file_), printer); // Define default instances GenerateSourceDefaultInstance(idx, printer); if (UsingImplicitWeakFields(file_, options_)) { printer->Print("void $classname$_ReferenceStrong() {}\n", "classname", message_generators_[idx]->classname_); } // Generate classes. printer->Print("\n"); message_generators_[idx]->GenerateClassMethods(printer); printer->Print( "\n" "// @@protoc_insertion_point(namespace_scope)\n"); } // end package namespace if (IsSCCRepresentative(message_generators_[idx]->descriptor_)) { NamespaceOpener ns(FileLevelNamespace(file_), printer); GenerateInitForSCC(GetSCC(message_generators_[idx]->descriptor_), printer); } printer->Print( "\n" "// @@protoc_insertion_point(global_scope)\n"); } void FileGenerator::GenerateGlobalSource(io::Printer* printer) { GenerateSourceIncludes(printer); GenerateWeakDeclarations(file_, options_, &scc_analyzer_, printer); // TODO(gerbens) Generate tables here // 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_)) { NamespaceOpener ns(FileLevelNamespace(file_), printer); GenerateReflectionInitializationCode(printer); } NamespaceOpener ns(Namespace(file_), printer); // Generate enums. for (int i = 0; i < enum_generators_.size(); i++) { enum_generators_[i]->GenerateMethods(i, printer); } // Define extensions. for (int i = 0; i < extension_generators_.size(); i++) { extension_generators_[i]->GenerateDefinition(printer); } if (HasGenericServices(file_, options_)) { // Generate services. for (int i = 0; i < service_generators_.size(); i++) { if (i == 0) printer->Print("\n"); printer->Print(kThickSeparator); printer->Print("\n"); service_generators_[i]->GenerateImplementation(printer); } } } void FileGenerator::GenerateSource(io::Printer* printer) { GenerateSourceIncludes(printer); GenerateWeakDeclarations(file_, options_, &scc_analyzer_, printer); { NamespaceOpener ns(Namespace(file_), printer); // Define default instances for (int i = 0; i < message_generators_.size(); i++) { GenerateSourceDefaultInstance(i, printer); if (UsingImplicitWeakFields(file_, options_)) { printer->Print("void $classname$_ReferenceStrong() {}\n", "classname", message_generators_[i]->classname_); } } } { NamespaceOpener ns(FileLevelNamespace(file_), printer); // Define the initialization code to initialize the default instances. // This code doesn't use a global constructor. GenerateInitializationCode(printer); // 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); } } { NamespaceOpener ns(Namespace(file_), printer); // Actually implement the protos // Generate enums. for (int i = 0; i < enum_generators_.size(); i++) { enum_generators_[i]->GenerateMethods(i, printer); } // Generate classes. for (int i = 0; i < message_generators_.size(); i++) { printer->Print("\n"); printer->Print(kThickSeparator); printer->Print("\n"); message_generators_[i]->GenerateClassMethods(printer); } if (HasGenericServices(file_, options_)) { // Generate services. for (int i = 0; i < service_generators_.size(); i++) { if (i == 0) printer->Print("\n"); printer->Print(kThickSeparator); printer->Print("\n"); service_generators_[i]->GenerateImplementation(printer); } } // Define extensions. for (int i = 0; i < extension_generators_.size(); i++) { extension_generators_[i]->GenerateDefinition(printer); } printer->Print( "\n" "// @@protoc_insertion_point(namespace_scope)\n"); } printer->Print( "\n" "// @@protoc_insertion_point(global_scope)\n"); } class FileGenerator::ForwardDeclarations { public: ~ForwardDeclarations() { for (std::map::iterator it = namespaces_.begin(), end = namespaces_.end(); it != end; ++it) { delete it->second; } namespaces_.clear(); } ForwardDeclarations* AddOrGetNamespace(const string& ns_name) { ForwardDeclarations*& ns = namespaces_[ns_name]; if (ns == NULL) { ns = new ForwardDeclarations; } return ns; } std::map& classes() { return classes_; } std::map& enums() { return enums_; } void Print(io::Printer* printer, const Options& options) const { for (std::map::const_iterator it = enums_.begin(), end = enums_.end(); it != end; ++it) { printer->Print("enum $enumname$ : int;\n", "enumname", it->first); printer->Annotate("enumname", it->second); printer->Print("bool $enumname$_IsValid(int value);\n", "enumname", it->first); } for (std::map::const_iterator it = classes_.begin(), end = classes_.end(); it != end; ++it) { printer->Print("class $classname$;\n", "classname", it->first); printer->Annotate("classname", it->second); printer->Print( "class $classname$DefaultTypeInternal;\n" "$dllexport_decl$" "extern $classname$DefaultTypeInternal " "_$classname$_default_instance_;\n", // NOLINT "dllexport_decl", options.dllexport_decl.empty() ? "" : options.dllexport_decl + " ", "classname", it->first); if (options.lite_implicit_weak_fields) { printer->Print("void $classname$_ReferenceStrong();\n", "classname", it->first); } } for (std::map::const_iterator it = namespaces_.begin(), end = namespaces_.end(); it != end; ++it) { printer->Print("namespace $nsname$ {\n", "nsname", it->first); it->second->Print(printer, options); printer->Print("} // namespace $nsname$\n", "nsname", it->first); } } private: std::map namespaces_; std::map classes_; std::map enums_; }; void FileGenerator::GenerateReflectionInitializationCode(io::Printer* printer) { // AddDescriptors() is a file-level procedure which adds the encoded // FileDescriptorProto for this .proto file to the global DescriptorPool for // generated files (DescriptorPool::generated_pool()). It ordinarily runs at // static initialization time, but is not used at all in LITE_RUNTIME mode. // // Its sibling, AssignDescriptors(), actually 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 called the first time // anyone calls descriptor() or GetReflection() on one of the types defined // in the file. if (!message_generators_.empty()) { printer->Print("::google::protobuf::Metadata file_level_metadata[$size$];\n", "size", SimpleItoa(message_generators_.size())); } if (!enum_generators_.empty()) { printer->Print( "const ::google::protobuf::EnumDescriptor* " "file_level_enum_descriptors[$size$];\n", "size", SimpleItoa(enum_generators_.size())); } if (HasGenericServices(file_, options_) && file_->service_count() > 0) { printer->Print( "const ::google::protobuf::ServiceDescriptor* " "file_level_service_descriptors[$size$];\n", "size", SimpleItoa(file_->service_count())); } if (!message_generators_.empty()) { printer->Print( "\n" "const ::google::protobuf::uint32 TableStruct::offsets[] " "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {\n"); printer->Indent(); std::vector > pairs; pairs.reserve(message_generators_.size()); for (int i = 0; i < message_generators_.size(); i++) { pairs.push_back(message_generators_[i]->GenerateOffsets(printer)); } printer->Outdent(); printer->Print( "};\n" "static const ::google::protobuf::internal::MigrationSchema schemas[] " "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {\n"); printer->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; } } printer->Outdent(); printer->Print( "};\n" "\nstatic " "::google::protobuf::Message const * const file_default_instances[] = {\n"); printer->Indent(); for (int i = 0; i < message_generators_.size(); i++) { const Descriptor* descriptor = message_generators_[i]->descriptor_; printer->Print( "reinterpret_cast(&$ns$::_$classname$_default_instance_),\n", "classname", ClassName(descriptor), "ns", Namespace(descriptor)); } printer->Outdent(); printer->Print( "};\n" "\n"); } else { // we still need these symbols to exist printer->Print( // MSVC doesn't like empty arrays, so we add a dummy. "const ::google::protobuf::uint32 TableStruct::offsets[1] = {};\n" "static const ::google::protobuf::internal::MigrationSchema* schemas = NULL;\n" "static const ::google::protobuf::Message* const* " "file_default_instances = NULL;\n" "\n"); } // --------------------------------------------------------------- // protobuf_AssignDescriptorsOnce(): The first time it is called, calls // AssignDescriptors(). All later times, waits for the first call to // complete and then returns. string message_factory = "NULL"; printer->Print( "void protobuf_AssignDescriptors() {\n" // Make sure the file has found its way into the pool. If a descriptor // is requested *during* static init then AddDescriptors() may not have // been called yet, so we call it manually. Note that it's fine if // AddDescriptors() is called multiple times. " AddDescriptors();\n" " ::google::protobuf::MessageFactory* factory = $factory$;\n" " AssignDescriptors(\n" " \"$filename$\", schemas, file_default_instances, " "TableStruct::offsets, factory,\n" " $metadata$, $enum_descriptors$, $service_descriptors$);\n", "filename", file_->name(), "metadata", !message_generators_.empty() ? "file_level_metadata" : "NULL", "enum_descriptors", !enum_generators_.empty() ? "file_level_enum_descriptors" : "NULL", "service_descriptors", HasGenericServices(file_, options_) && file_->service_count() > 0 ? "file_level_service_descriptors" : "NULL", "factory", message_factory); printer->Print( "}\n" "\n" "void protobuf_AssignDescriptorsOnce() {\n" " static GOOGLE_PROTOBUF_DECLARE_ONCE(once);\n" " ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors);\n" "}\n" "\n", "filename", file_->name(), "metadata", !message_generators_.empty() ? "file_level_metadata" : "NULL", "enum_descriptors", !enum_generators_.empty() ? "file_level_enum_descriptors" : "NULL", "service_descriptors", HasGenericServices(file_, options_) && file_->service_count() > 0 ? "file_level_service_descriptors" : "NULL", "factory", message_factory); // Only here because of useless string reference that we don't want in // protobuf_AssignDescriptorsOnce, because that is called from all the // GetMetadata member methods. printer->Print( "void protobuf_RegisterTypes(const ::std::string&) " "GOOGLE_PROTOBUF_ATTRIBUTE_COLD;\n" "void protobuf_RegisterTypes(const ::std::string&) {\n" " protobuf_AssignDescriptorsOnce();\n"); printer->Indent(); // All normal messages can be done generically if (!message_generators_.empty()) { printer->Print( "::google::protobuf::internal::RegisterAllTypes(file_level_metadata, $size$);\n", "size", SimpleItoa(message_generators_.size())); } printer->Outdent(); printer->Print( "}\n" "\n"); // Now generate the AddDescriptors() function. printer->Print( "void AddDescriptorsImpl() {\n" " InitDefaults();\n"); printer->Indent(); // 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. FileDescriptorProto file_proto; file_->CopyTo(&file_proto); string file_data; file_proto.SerializeToString(&file_data); printer->Print("static const char descriptor[] " "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) " "= {\n"); printer->Indent(); if (file_data.size() > 65535) { // Workaround for MSVC: "Error C1091: compiler limit: string exceeds 65535 // bytes in length". Declare a static array of characters rather than use // a string literal. Only write 25 bytes per line. static const int kBytesPerLine = 25; for (int i = 0; i < file_data.size();) { for (int j = 0; j < kBytesPerLine && i < file_data.size(); ++i, ++j) { printer->Print("'$char$', ", "char", CEscape(file_data.substr(i, 1))); } printer->Print("\n"); } } else { // Only write 40 bytes per line. static const int kBytesPerLine = 40; for (int i = 0; i < file_data.size(); i += kBytesPerLine) { printer->Print(" \"$data$\"\n", "data", EscapeTrigraphs(CEscape( file_data.substr(i, kBytesPerLine)))); } } printer->Outdent(); printer->Print("};\n"); printer->Print( "::google::protobuf::DescriptorPool::InternalAddGeneratedFile(\n" " descriptor, $size$);\n", "size", SimpleItoa(file_data.size())); // Call MessageFactory::InternalRegisterGeneratedFile(). printer->Print( "::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(\n" " \"$filename$\", &protobuf_RegisterTypes);\n", "filename", file_->name()); // Call the AddDescriptors() methods for all of our dependencies, to make // sure they get added first. for (int i = 0; i < file_->dependency_count(); i++) { const FileDescriptor* dependency = file_->dependency(i); // Print the namespace prefix for the dependency. string file_namespace = FileLevelNamespace(dependency); // Call its AddDescriptors function. printer->Print("::$file_namespace$::AddDescriptors();\n", "file_namespace", file_namespace); } printer->Outdent(); printer->Print( "}\n" "\n" "void AddDescriptors() {\n" " static GOOGLE_PROTOBUF_DECLARE_ONCE(once);\n" " ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl);\n" "}\n"); printer->Print( "// Force AddDescriptors() to be called at dynamic initialization " "time.\n" "struct StaticDescriptorInitializer {\n" " StaticDescriptorInitializer() {\n" " AddDescriptors();\n" " }\n" "} static_descriptor_initializer;\n"); } void FileGenerator::GenerateInitForSCC(const SCC* scc, io::Printer* printer) { const string scc_name = ClassName(scc->GetRepresentative()); printer->Print( "void InitDefaults$scc_name$Impl() {\n" " GOOGLE_PROTOBUF_VERIFY_VERSION;\n\n" "#ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS\n" " ::google::protobuf::internal::InitProtobufDefaultsForceUnique();\n" "#else\n" " ::google::protobuf::internal::InitProtobufDefaults();\n" "#endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS\n", // Force initialization of primitive values we depend on. "scc_name", scc_name); printer->Indent(); // Call the InitDefaults() methods for all of our dependencies, to make // sure they get added first. for (int i = 0; i < scc->children.size(); i++) { const SCC* child_scc = scc->children[i]; const FileDescriptor* dependency = child_scc->GetRepresentative()->file(); // Print the namespace prefix for the dependency. string file_namespace = FileLevelNamespace(dependency); std::map variables; variables["file_namespace"] = file_namespace; variables["scc_name"] = ClassName(child_scc->GetRepresentative(), false); bool using_weak_fields = UsingImplicitWeakFields(file_, options_); if (using_weak_fields) { // We're building for lite with implicit weak fields, so we need to handle // the possibility that this InitDefaults function is not linked into the // binary. Some of these might actually be guaranteed to be non-null since // we might have a strong reference to the dependency (via a required // field, for example), but it's simplest to just assume that any of them // could be null. printer->Print( variables, "if (&$file_namespace$::InitDefaults$scc_name$ != NULL) {\n" " $file_namespace$::InitDefaults$scc_name$();\n" "}\n"); } else { printer->Print(variables, "$file_namespace$::InitDefaults$scc_name$();\n"); } } // First construct all the necessary default instances. for (int i = 0; i < message_generators_.size(); i++) { if (scc_analyzer_.GetSCC(message_generators_[i]->descriptor_) != scc) { continue; } // TODO(gerbens) This requires this function to be friend. Remove // the need for this. message_generators_[i]->GenerateFieldDefaultInstances(printer); printer->Print( "{\n" " void* ptr = &$ns$::_$classname$_default_instance_;\n" " new (ptr) $ns$::$classname$();\n", "ns", Namespace(message_generators_[i]->descriptor_), "classname", ClassName(message_generators_[i]->descriptor_)); if (!IsMapEntryMessage(message_generators_[i]->descriptor_)) { printer->Print( " ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);\n"); } printer->Print("}\n"); } // TODO(gerbens) make default instances be the same as normal instances. // Default instances differ from normal instances because they have cross // linked message fields. for (int i = 0; i < message_generators_.size(); i++) { if (scc_analyzer_.GetSCC(message_generators_[i]->descriptor_) != scc) { continue; } printer->Print("$classname$::InitAsDefaultInstance();\n", "classname", QualifiedClassName(message_generators_[i]->descriptor_)); } printer->Outdent(); printer->Print("}\n\n"); printer->Print( "void InitDefaults$scc_name$() {\n" " static GOOGLE_PROTOBUF_DECLARE_ONCE(once);\n" " ::google::protobuf::GoogleOnceInit(&once, " "&InitDefaults$scc_name$Impl);\n" "}\n\n", "scc_name", scc_name); } void FileGenerator::GenerateInitializationCode(io::Printer* printer) { // Messages depend on the existence of a default instance, which has to // initialized properly. The default instances are allocated in the data // segment, but we can't quite allocate the type directly. The destructors // cannot run at program exit as this could lead to segfaults in a threaded // environment. Hence these instances must be inplace constructed at first // use. if (options_.table_driven_parsing) { // TODO(ckennelly): Gate this with the same options flag to enable // table-driven parsing. printer->Print( "PROTOBUF_CONSTEXPR_VAR ::google::protobuf::internal::ParseTableField\n" " const TableStruct::entries[] " "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {\n"); printer->Indent(); std::vector entries; size_t count = 0; for (int i = 0; i < message_generators_.size(); i++) { size_t value = message_generators_[i]->GenerateParseOffsets(printer); entries.push_back(value); count += value; } // We need these arrays to exist, and MSVC does not like empty arrays. if (count == 0) { printer->Print("{0, 0, 0, ::google::protobuf::internal::kInvalidMask, 0, 0},\n"); } printer->Outdent(); printer->Print( "};\n" "\n" "PROTOBUF_CONSTEXPR_VAR ::google::protobuf::internal::AuxillaryParseTableField\n" " const TableStruct::aux[] " "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {\n"); printer->Indent(); std::vector aux_entries; count = 0; for (int i = 0; i < message_generators_.size(); i++) { size_t value = message_generators_[i]->GenerateParseAuxTable(printer); aux_entries.push_back(value); count += value; } if (count == 0) { printer->Print("::google::protobuf::internal::AuxillaryParseTableField(),\n"); } printer->Outdent(); printer->Print( "};\n" "PROTOBUF_CONSTEXPR_VAR ::google::protobuf::internal::ParseTable const\n" " TableStruct::schema[] " "GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = {\n"); printer->Indent(); size_t offset = 0; size_t aux_offset = 0; for (int i = 0; i < message_generators_.size(); i++) { message_generators_[i]->GenerateParseTable(printer, offset, aux_offset); offset += entries[i]; aux_offset += aux_entries[i]; } if (message_generators_.empty()) { printer->Print("{ NULL, NULL, 0, -1, -1, false },\n"); } printer->Outdent(); printer->Print( "};\n" "\n"); } if (!message_generators_.empty() && options_.table_driven_serialization) { printer->Print( "const ::google::protobuf::internal::FieldMetadata TableStruct::field_metadata[] " "= {\n"); printer->Indent(); std::vector field_metadata_offsets; int idx = 0; for (int i = 0; i < message_generators_.size(); i++) { field_metadata_offsets.push_back(idx); idx += message_generators_[i]->GenerateFieldMetadata(printer); } field_metadata_offsets.push_back(idx); printer->Outdent(); printer->Print( "};\n" "const ::google::protobuf::internal::SerializationTable " "TableStruct::serialization_table[] = {\n"); printer->Indent(); // We rely on the order we layout the tables to match the order we // calculate them with FlattenMessagesInFile, so we check here that // these match exactly. std::vector calculated_order = FlattenMessagesInFile(file_); GOOGLE_CHECK_EQ(calculated_order.size(), message_generators_.size()); for (int i = 0; i < message_generators_.size(); i++) { GOOGLE_CHECK_EQ(calculated_order[i], message_generators_[i]->descriptor_); printer->Print( "{$num_fields$, TableStruct::field_metadata + $index$},\n", "classname", message_generators_[i]->classname_, "num_fields", SimpleItoa(field_metadata_offsets[i + 1] - field_metadata_offsets[i]), "index", SimpleItoa(field_metadata_offsets[i])); } printer->Outdent(); printer->Print( "};\n" "\n"); } // ----------------------------------------------------------------- // All functionality that need private access. // Now generate the InitDefaults for each SCC. for (int i = 0; i < message_generators_.size(); i++) { if (IsSCCRepresentative(message_generators_[i]->descriptor_)) { GenerateInitForSCC(GetSCC(message_generators_[i]->descriptor_), printer); } } } void FileGenerator::GenerateForwardDeclarations(io::Printer* printer) { ForwardDeclarations decls; FillForwardDeclarations(&decls); decls.Print(printer, options_); } void FileGenerator::FillForwardDeclarations(ForwardDeclarations* decls) { for (int i = 0; i < package_parts_.size(); i++) { decls = decls->AddOrGetNamespace(package_parts_[i]); } // Generate enum definitions. for (int i = 0; i < enum_generators_.size(); i++) { enum_generators_[i]->FillForwardDeclaration(&decls->enums()); } // Generate forward declarations of classes. for (int i = 0; i < message_generators_.size(); i++) { message_generators_[i]->FillMessageForwardDeclarations( &decls->classes()); } } void FileGenerator::GenerateTopHeaderGuard(io::Printer* printer, const string& filename_identifier) { // Generate top of header. printer->Print( "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" "// source: $filename$\n" "\n" "#ifndef PROTOBUF_$filename_identifier$__INCLUDED\n" "#define PROTOBUF_$filename_identifier$__INCLUDED\n" "\n" "#include \n", "filename", file_->name(), "filename_identifier", filename_identifier); printer->Print("\n"); } void FileGenerator::GenerateBottomHeaderGuard( io::Printer* printer, const string& filename_identifier) { printer->Print( "#endif // PROTOBUF_$filename_identifier$__INCLUDED\n", "filename_identifier", filename_identifier); } void FileGenerator::GenerateLibraryIncludes(io::Printer* printer) { if (UsingImplicitWeakFields(file_, options_)) { printer->Print("#include \n"); } printer->Print( "#include \n" "\n"); // Verify the protobuf library header version is compatible with the protoc // version before going any further. printer->Print( "#if GOOGLE_PROTOBUF_VERSION < $min_header_version$\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 $protoc_version$ < GOOGLE_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", "min_header_version", SimpleItoa(protobuf::internal::kMinHeaderVersionForProtoc), "protoc_version", SimpleItoa(GOOGLE_PROTOBUF_VERSION)); // OK, it's now safe to #include other files. printer->Print( "#include \n" "#include \n" "#include \n" "#include \n" "#include \n"); if (HasDescriptorMethods(file_, options_)) { printer->Print( "#include \n"); } else { printer->Print( "#include \n"); } if (!message_generators_.empty()) { if (HasDescriptorMethods(file_, options_)) { printer->Print( "#include \n"); } else { printer->Print( "#include \n"); } } printer->Print( "#include " " // IWYU pragma: export\n" "#include " " // IWYU pragma: export\n"); if (HasMapFields(file_)) { printer->Print( "#include " " // IWYU pragma: export\n"); if (HasDescriptorMethods(file_, options_)) { printer->Print("#include \n"); printer->Print("#include \n"); } else { printer->Print("#include \n"); printer->Print("#include \n"); } } if (HasEnumDefinitions(file_)) { if (HasDescriptorMethods(file_, options_)) { printer->Print( "#include \n"); } else { printer->Print( "#include \n"); } } if (HasGenericServices(file_, options_)) { printer->Print( "#include \n"); } if (UseUnknownFieldSet(file_, options_) && !message_generators_.empty()) { printer->Print( "#include \n"); } if (IsAnyMessage(file_)) { printer->Print( "#include \n"); } } void FileGenerator::GenerateMetadataPragma(io::Printer* printer, const string& info_path) { if (!info_path.empty() && !options_.annotation_pragma_name.empty() && !options_.annotation_guard_name.empty()) { printer->Print( "#ifdef $guard$\n" "#pragma $pragma$ \"$info_path$\"\n" "#endif // $guard$\n", "guard", options_.annotation_guard_name, "pragma", options_.annotation_pragma_name, "info_path", info_path); } } void FileGenerator::GenerateDependencyIncludes(io::Printer* printer) { std::set public_import_names; for (int i = 0; i < file_->public_dependency_count(); i++) { public_import_names.insert(file_->public_dependency(i)->name()); } for (int i = 0; i < file_->dependency_count(); i++) { const bool use_system_include = IsWellKnownMessage(file_->dependency(i)); const string& name = file_->dependency(i)->name(); bool public_import = (public_import_names.count(name) != 0); printer->Print( "#include $left$$dependency$.pb.h$right$$iwyu$\n", "dependency", StripProto(name), "iwyu", (public_import) ? " // IWYU pragma: export" : "", "left", use_system_include ? "<" : "\"", "right", use_system_include ? ">" : "\""); } } void FileGenerator::GenerateGlobalStateFunctionDeclarations( io::Printer* printer) { // Forward-declare the AddDescriptors, InitDefaults because these are called // by .pb.cc files depending on this file. printer->Print( "\n" "namespace $file_namespace$ {\n" "// Internal implementation detail -- do not use these members.\n" "struct $dllexport_decl$TableStruct {\n" // These tables describe how to serialize and parse messages. Used // for table driven code. " static const ::google::protobuf::internal::ParseTableField entries[];\n" " static const ::google::protobuf::internal::AuxillaryParseTableField aux[];\n" " static const ::google::protobuf::internal::ParseTable schema[$num$];\n" " static const ::google::protobuf::internal::FieldMetadata field_metadata[];\n" " static const ::google::protobuf::internal::SerializationTable " "serialization_table[];\n" " static const ::google::protobuf::uint32 offsets[];\n" "};\n", "file_namespace", FileLevelNamespace(file_), "dllexport_decl", options_.dllexport_decl.empty() ? "" : options_.dllexport_decl + " ", "num", SimpleItoa(std::max(size_t(1), message_generators_.size()))); if (HasDescriptorMethods(file_, options_)) { printer->Print( "void $dllexport_decl$AddDescriptors();\n", "dllexport_decl", options_.dllexport_decl.empty() ? "" : options_.dllexport_decl + " "); } for (int i = 0; i < message_generators_.size(); i++) { if (!IsSCCRepresentative(message_generators_[i]->descriptor_)) continue; string scc_name = ClassName(message_generators_[i]->descriptor_); // TODO(gerbens) Remove the Impl from header. This is solely because // it currently still needs to be a friend of the protos. printer->Print( "void $dllexport_decl$InitDefaults$scc_name$Impl();\n" "void $dllexport_decl$InitDefaults$scc_name$();\n", "scc_name", scc_name, "dllexport_decl", options_.dllexport_decl.empty() ? "" : options_.dllexport_decl + " "); } // TODO(gerbens) This is for proto1 interoperability. Remove when proto1 // is gone. printer->Print( "inline void $dllexport_decl$InitDefaults() {\n", "dllexport_decl", options_.dllexport_decl.empty() ? "" : options_.dllexport_decl + " "); for (int i = 0; i < message_generators_.size(); i++) { if (!IsSCCRepresentative(message_generators_[i]->descriptor_)) continue; string scc_name = ClassName(message_generators_[i]->descriptor_); printer->Print(" InitDefaults$scc_name$();\n", "scc_name", scc_name); } printer->Print("}\n"); printer->Print( "} // namespace $file_namespace$\n", "file_namespace", FileLevelNamespace(file_)); } void FileGenerator::GenerateMessageDefinitions(io::Printer* printer) { // Generate class definitions. for (int i = 0; i < message_generators_.size(); i++) { if (i > 0) { printer->Print("\n"); printer->Print(kThinSeparator); printer->Print("\n"); } message_generators_[i]->GenerateClassDefinition(printer); } } 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::GenerateServiceDefinitions(io::Printer* printer) { if (HasGenericServices(file_, options_)) { // Generate service definitions. for (int i = 0; i < service_generators_.size(); i++) { if (i > 0) { printer->Print("\n"); printer->Print(kThinSeparator); printer->Print("\n"); } service_generators_[i]->GenerateDeclarations(printer); } printer->Print("\n"); printer->Print(kThickSeparator); printer->Print("\n"); } } void FileGenerator::GenerateExtensionIdentifiers(io::Printer* printer) { // Declare extension identifiers. These are in global scope and so only // the global scope extensions. for (int i = 0; i < file_->extension_count(); i++) { extension_generators_owner_[i]->GenerateDeclaration(printer); } } void FileGenerator::GenerateInlineFunctionDefinitions(io::Printer* printer) { // TODO(gerbens) remove pragmas when gcc is no longer used. Current version // of gcc fires a bogus error when compiled with strict-aliasing. printer->Print( "#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) { printer->Print(kThinSeparator); printer->Print("\n"); } message_generators_[i]->GenerateInlineMethods(printer); } printer->Print( "#ifdef __GNUC__\n" " #pragma GCC diagnostic pop\n" "#endif // __GNUC__\n"); for (int i = 0; i < message_generators_.size(); i++) { if (i > 0) { printer->Print(kThinSeparator); printer->Print("\n"); } // Methods of the dependent base class must always be inline in the header. message_generators_[i]->GenerateDependentInlineMethods(printer); } } void FileGenerator::GenerateProto2NamespaceEnumSpecializations( io::Printer* printer) { // Emit GetEnumDescriptor specializations into google::protobuf namespace: if (HasEnumDefinitions(file_)) { printer->Print( "\n" "namespace google {\nnamespace protobuf {\n" "\n"); for (int i = 0; i < enum_generators_.size(); i++) { enum_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer); } printer->Print( "\n" "} // namespace protobuf\n} // namespace google\n"); } } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h000066400000000000000000000173211334102242000316230ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__ #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include namespace google { namespace protobuf { class FileDescriptor; // descriptor.h namespace io { class Printer; // printer.h } } 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); // 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 string& 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 string& info_path); void GenerateSource(io::Printer* printer); int NumMessages() const { return message_generators_.size(); } // Similar to GenerateSource but generates only one message void GenerateSourceForMessage(int idx, io::Printer* printer); void GenerateGlobalSource(io::Printer* printer); private: // Internal type used by GenerateForwardDeclarations (defined in file.cc). class ForwardDeclarations; void GenerateSourceIncludes(io::Printer* printer); void GenerateSourceDefaultInstance(int idx, io::Printer* printer); void GenerateInitForSCC(const SCC* scc, io::Printer* printer); void GenerateInitializationCode(io::Printer* printer); void GenerateReflectionInitializationCode(io::Printer* printer); // For other imports, generates their forward-declarations. void GenerateForwardDeclarations(io::Printer* printer); // Internal helper used by GenerateForwardDeclarations: fills 'decls' // with all necessary forward-declarations for this file and its // transient depednencies. void FillForwardDeclarations(ForwardDeclarations* decls); // Generates top or bottom of a header file. void GenerateTopHeaderGuard(io::Printer* printer, const string& filename_identifier); void GenerateBottomHeaderGuard(io::Printer* printer, const string& filename_identifier); // Generates #include directives. void GenerateLibraryIncludes(io::Printer* printer); void GenerateDependencyIncludes(io::Printer* printer); // 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 string& info_path); // Generates a couple of different pieces before definitions: void GenerateGlobalStateFunctionDeclarations(io::Printer* printer); // Generates types for classes. void GenerateMessageDefinitions(io::Printer* printer); void GenerateEnumDefinitions(io::Printer* printer); // Generates generic service definitions. void GenerateServiceDefinitions(io::Printer* printer); // Generates extension identifiers. void GenerateExtensionIdentifiers(io::Printer* printer); // Generates inline function defintions. void GenerateInlineFunctionDefinitions(io::Printer* printer); void GenerateProto2NamespaceEnumSpecializations(io::Printer* printer); // 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 defined as // macros in sys/types.h on FreeBSD and a few other platforms). To make the // generated code compile on these platforms, we either have to 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); bool IsSCCRepresentative(const Descriptor* d) { return GetSCCRepresentative(d) == d; } const Descriptor* GetSCCRepresentative(const Descriptor* d) { return GetSCC(d)->GetRepresentative(); } const SCC* GetSCC(const Descriptor* d) { return scc_analyzer_.GetSCC(d); } const FileDescriptor* file_; const Options options_; SCCAnalyzer scc_analyzer_; // Contains the post-order walk of all the messages (and child messages) in // this file. If you need a pre-order walk just reverse iterate. std::vector message_generators_; std::vector enum_generators_; std::vector service_generators_; std::vector extension_generators_; // These members are just for owning (and thus proper deleting). // Nested (enum/extension)_generators are owned by child messages. google::protobuf::scoped_array > enum_generators_owner_; google::protobuf::scoped_array > service_generators_owner_; google::protobuf::scoped_array > extension_generators_owner_; // E.g. if the package is foo.bar, package_parts_ is {"foo", "bar"}. std::vector package_parts_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc000066400000000000000000000175011334102242000330300ustar00rootroot00000000000000// 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 #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { CppGenerator::CppGenerator() {} CppGenerator::~CppGenerator() {} bool CppGenerator::Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* generator_context, string* error) const { std::vector > options; ParseGeneratorParameter(parameter, &options); // ----------------------------------------------------------------- // parse generator options // TODO(kenton): If we ever have more options, we may want to create a // class that encapsulates them which we can pass down to all the // generator classes. Currently we pass dllexport_decl down to all of // them via the constructors, but we don't want to have to add another // constructor parameter for every option. // If the dllexport_decl option is passed to the compiler, we need to write // it in front of every symbol that should be exported if this .proto is // compiled into a Windows DLL. E.g., if the user invokes the protocol // compiler as: // protoc --cpp_out=dllexport_decl=FOO_EXPORT:outdir foo.proto // then we'll define classes like this: // class FOO_EXPORT Foo { // ... // } // FOO_EXPORT is a macro which should expand to __declspec(dllexport) or // __declspec(dllimport) depending on what is being compiled. // Options file_options; bool split_source = false; 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") { file_options.safe_boundary_check = true; } else if (options[i].first == "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 == "lite") { file_options.enforce_lite = true; } else if (options[i].first == "lite_implicit_weak_fields") { file_options.lite_implicit_weak_fields = true; } else if (options[i].first == "table_driven_parsing") { file_options.table_driven_parsing = true; } else if (options[i].first == "table_driven_serialization") { file_options.table_driven_serialization = true; } else if (options[i].first == "split_source") { split_source = true; } else { *error = "Unknown generator option: " + options[i].first; return false; } } // ----------------------------------------------------------------- string basename = StripProto(file->name()); FileGenerator file_generator(file, file_options); // Generate header(s). if (file_options.proto_h) { google::protobuf::scoped_ptr output( generator_context->Open(basename + ".proto.h")); GeneratedCodeInfo annotations; io::AnnotationProtoCollector annotation_collector( &annotations); string info_path = basename + ".proto.h.meta"; io::Printer printer(output.get(), '$', file_options.annotate_headers ? &annotation_collector : NULL); file_generator.GenerateProtoHeader( &printer, file_options.annotate_headers ? info_path : ""); if (file_options.annotate_headers) { google::protobuf::scoped_ptr info_output( generator_context->Open(info_path)); annotations.SerializeToZeroCopyStream(info_output.get()); } } { google::protobuf::scoped_ptr output( generator_context->Open(basename + ".pb.h")); GeneratedCodeInfo annotations; io::AnnotationProtoCollector annotation_collector( &annotations); string info_path = basename + ".pb.h.meta"; io::Printer printer(output.get(), '$', file_options.annotate_headers ? &annotation_collector : NULL); file_generator.GeneratePBHeader( &printer, file_options.annotate_headers ? info_path : ""); if (file_options.annotate_headers) { google::protobuf::scoped_ptr info_output( generator_context->Open(info_path)); annotations.SerializeToZeroCopyStream(info_output.get()); } } // Generate cc file. if (split_source) { { // This is the global .cc file, containing enum/services/tables/reflection google::protobuf::scoped_ptr output( generator_context->Open(basename + ".pb.cc")); io::Printer printer(output.get(), '$'); file_generator.GenerateGlobalSource(&printer); } for (int i = 0; i < file_generator.NumMessages(); i++) { // TODO(gerbens) Agree on naming scheme. google::protobuf::scoped_ptr output( generator_context->Open(basename + "." + SimpleItoa(i) + ".cc")); io::Printer printer(output.get(), '$'); file_generator.GenerateSourceForMessage(i, &printer); } } else { google::protobuf::scoped_ptr output( generator_context->Open(basename + ".pb.cc")); io::Printer printer(output.get(), '$'); file_generator.GenerateSource(&printer); } return true; } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h000066400000000000000000000056231334102242000326740ustar00rootroot00000000000000// 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. // // Generates C++ code for a given .proto file. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_GENERATOR_H__ #include #include 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 LIBPROTOC_EXPORT CppGenerator : public CodeGenerator { public: CppGenerator(); ~CppGenerator(); // implements CodeGenerator ---------------------------------------- bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* generator_context, string* error) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CppGenerator); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_GENERATOR_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc000066400000000000000000001000121334102242000324720ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { namespace { static const char kAnyMessageName[] = "Any"; static const char kAnyProtoFile[] = "google/protobuf/any.proto"; static const char kGoogleProtobufPrefix[] = "google/protobuf/"; string DotsToUnderscores(const string& name) { return StringReplace(name, ".", "_", true); } string DotsToColons(const string& name) { return StringReplace(name, ".", "::", true); } const char* const kKeywordList[] = { "alignas", "alignof", "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "class", "compl", "const", "constexpr", "const_cast", "continue", "decltype", "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "explicit", "export", "extern", "false", "float", "for", "friend", "goto", "if", "inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq", "NULL", "operator", "or", "or_eq", "private", "protected", "public", "register", "reinterpret_cast", "return", "short", "signed", "sizeof", "static", "static_assert", "static_cast", "struct", "switch", "template", "this", "thread_local", "throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq" }; hash_set MakeKeywordsMap() { hash_set result; for (int i = 0; i < GOOGLE_ARRAYSIZE(kKeywordList); i++) { result.insert(kKeywordList[i]); } return result; } hash_set kKeywords = MakeKeywordsMap(); // Returns whether the provided descriptor has an extension. This includes its // nested types. bool HasExtension(const Descriptor* descriptor) { if (descriptor->extension_count() > 0) { return true; } for (int i = 0; i < descriptor->nested_type_count(); ++i) { if (HasExtension(descriptor->nested_type(i))) { return true; } } return false; } // Encode [0..63] as 'A'-'Z', 'a'-'z', '0'-'9', '_' char Base63Char(int value) { GOOGLE_CHECK_GE(value, 0); if (value < 26) return 'A' + value; value -= 26; if (value < 26) return 'a' + value; value -= 26; if (value < 10) return '0' + value; GOOGLE_CHECK_EQ(value, 10); return '_'; } // Given a c identifier has 63 legal characters we can't implement base64 // encoding. So we return the k least significant "digits" in base 63. template string Base63(I n, int k) { string res; while (k-- > 0) { res += Base63Char(static_cast(n % 63)); n /= 63; } return res; } } // namespace string UnderscoresToCamelCase(const string& input, bool cap_next_letter) { 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') { // Capital letters 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; } } return result; } const char kThickSeparator[] = "// ===================================================================\n"; const char kThinSeparator[] = "// -------------------------------------------------------------------\n"; bool CanInitializeByZeroing(const FieldDescriptor* field) { if (field->is_repeated() || field->is_extension()) return false; switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_ENUM: return field->default_value_enum()->number() == 0; case FieldDescriptor::CPPTYPE_INT32: return field->default_value_int32() == 0; case FieldDescriptor::CPPTYPE_INT64: return field->default_value_int64() == 0; case FieldDescriptor::CPPTYPE_UINT32: return field->default_value_uint32() == 0; case FieldDescriptor::CPPTYPE_UINT64: return field->default_value_uint64() == 0; case FieldDescriptor::CPPTYPE_FLOAT: return field->default_value_float() == 0; case FieldDescriptor::CPPTYPE_DOUBLE: return field->default_value_double() == 0; case FieldDescriptor::CPPTYPE_BOOL: return field->default_value_bool() == false; default: return false; } } string ClassName(const Descriptor* descriptor) { const Descriptor* parent = descriptor->containing_type(); string res; if (parent) res += ClassName(parent) + "_"; res += descriptor->name(); if (IsMapEntryMessage(descriptor)) res += "_DoNotUse"; return res; } string ClassName(const EnumDescriptor* enum_descriptor) { if (enum_descriptor->containing_type() == NULL) { return enum_descriptor->name(); } else { return ClassName(enum_descriptor->containing_type()) + "_" + enum_descriptor->name(); } } string Namespace(const string& package) { if (package.empty()) return ""; return "::" + DotsToColons(package); } string DefaultInstanceName(const Descriptor* descriptor) { string prefix = descriptor->file()->package().empty() ? "" : "::"; return prefix + DotsToColons(descriptor->file()->package()) + "::_" + ClassName(descriptor, false) + "_default_instance_"; } string ReferenceFunctionName(const Descriptor* descriptor) { return QualifiedClassName(descriptor) + "_ReferenceStrong"; } string DependentBaseClassTemplateName(const Descriptor* descriptor) { return ClassName(descriptor, false) + "_InternalBase"; } string SuperClassName(const Descriptor* descriptor, const Options& options) { return HasDescriptorMethods(descriptor->file(), options) ? "::google::protobuf::Message" : "::google::protobuf::MessageLite"; } string DependentBaseDownCast() { return "reinterpret_cast(this)->"; } string DependentBaseConstDownCast() { return "reinterpret_cast(this)->"; } string FieldName(const FieldDescriptor* field) { string result = field->name(); LowerString(&result); if (kKeywords.count(result) > 0) { result.append("_"); } return result; } string EnumValueName(const EnumValueDescriptor* enum_value) { string result = enum_value->name(); if (kKeywords.count(result) > 0) { result.append("_"); } return result; } int EstimateAlignmentSize(const FieldDescriptor* field) { if (field == NULL) return 0; if (field->is_repeated()) return 8; switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_BOOL: return 1; case FieldDescriptor::CPPTYPE_INT32: case FieldDescriptor::CPPTYPE_UINT32: case FieldDescriptor::CPPTYPE_ENUM: case FieldDescriptor::CPPTYPE_FLOAT: return 4; case FieldDescriptor::CPPTYPE_INT64: case FieldDescriptor::CPPTYPE_UINT64: case FieldDescriptor::CPPTYPE_DOUBLE: case FieldDescriptor::CPPTYPE_STRING: case FieldDescriptor::CPPTYPE_MESSAGE: return 8; } GOOGLE_LOG(FATAL) << "Can't get here."; return -1; // Make compiler happy. } string FieldConstantName(const FieldDescriptor *field) { string field_name = UnderscoresToCamelCase(field->name(), true); string result = "k" + field_name + "FieldNumber"; if (!field->is_extension() && field->containing_type()->FindFieldByCamelcaseName( field->camelcase_name()) != field) { // 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 += "_" + SimpleItoa(field->number()); } return result; } bool IsFieldDependent(const FieldDescriptor* field) { if (field->containing_oneof() != NULL && field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { return true; } if (field->is_map()) { const Descriptor* map_descriptor = field->message_type(); for (int i = 0; i < map_descriptor->field_count(); i++) { if (IsFieldDependent(map_descriptor->field(i))) { return true; } } return false; } if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { return false; } if (field->containing_oneof() != NULL) { // Oneof fields will always be dependent. // // This is a unique case for field codegen. Field generators are // responsible for generating all the field-specific accessor // functions, except for the clear_*() function; instead, field // generators produce inline clearing code. // // For non-oneof fields, the Message class uses the inline clearing // code to define the field's clear_*() function, as well as in the // destructor. For oneof fields, the Message class generates a much // more complicated clear_*() function, which clears only the oneof // member that is set, in addition to clearing methods for each of the // oneof members individually. // // Since oneofs do not have their own generator class, the Message code // generation logic would be significantly complicated in order to // split dependent and non-dependent manipulation logic based on // whether the oneof truly needs to be dependent; so, for oneof fields, // we just assume it (and its constituents) should be manipulated by a // dependent base class function. // // This is less precise than how dependent message-typed fields are // handled, but the cost is limited to only the generated code for the // oneof field, which seems like an acceptable tradeoff. return true; } if (field->file() == field->message_type()->file()) { return false; } return true; } string DependentTypeName(const FieldDescriptor* field) { return "InternalBase_" + field->name() + "_T"; } string FieldMessageTypeName(const FieldDescriptor* field) { // Note: The Google-internal version of Protocol Buffers uses this function // as a hook point for hacks to support legacy code. return ClassName(field->message_type(), true); } string StripProto(const string& filename) { if (HasSuffixString(filename, ".protodevel")) { return StripSuffixString(filename, ".protodevel"); } else { return StripSuffixString(filename, ".proto"); } } const char* PrimitiveTypeName(FieldDescriptor::CppType type) { switch (type) { case FieldDescriptor::CPPTYPE_INT32 : return "::google::protobuf::int32"; case FieldDescriptor::CPPTYPE_INT64 : return "::google::protobuf::int64"; case FieldDescriptor::CPPTYPE_UINT32 : return "::google::protobuf::uint32"; case FieldDescriptor::CPPTYPE_UINT64 : return "::google::protobuf::uint64"; case FieldDescriptor::CPPTYPE_DOUBLE : return "double"; case FieldDescriptor::CPPTYPE_FLOAT : return "float"; case FieldDescriptor::CPPTYPE_BOOL : return "bool"; case FieldDescriptor::CPPTYPE_ENUM : return "int"; case FieldDescriptor::CPPTYPE_STRING : return "::std::string"; case FieldDescriptor::CPPTYPE_MESSAGE: return NULL; // No default because we want the compiler to complain if any new // CppTypes are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } const char* DeclaredTypeMethodName(FieldDescriptor::Type type) { switch (type) { case FieldDescriptor::TYPE_INT32 : return "Int32"; case FieldDescriptor::TYPE_INT64 : return "Int64"; case FieldDescriptor::TYPE_UINT32 : return "UInt32"; case FieldDescriptor::TYPE_UINT64 : return "UInt64"; case FieldDescriptor::TYPE_SINT32 : return "SInt32"; case FieldDescriptor::TYPE_SINT64 : return "SInt64"; case FieldDescriptor::TYPE_FIXED32 : return "Fixed32"; case FieldDescriptor::TYPE_FIXED64 : return "Fixed64"; case FieldDescriptor::TYPE_SFIXED32: return "SFixed32"; case FieldDescriptor::TYPE_SFIXED64: return "SFixed64"; case FieldDescriptor::TYPE_FLOAT : return "Float"; case FieldDescriptor::TYPE_DOUBLE : return "Double"; case FieldDescriptor::TYPE_BOOL : return "Bool"; case FieldDescriptor::TYPE_ENUM : return "Enum"; case FieldDescriptor::TYPE_STRING : return "String"; case FieldDescriptor::TYPE_BYTES : return "Bytes"; case FieldDescriptor::TYPE_GROUP : return "Group"; case FieldDescriptor::TYPE_MESSAGE : return "Message"; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } string Int32ToString(int number) { // gcc rejects the decimal form of kint32min. if (number == kint32min) { GOOGLE_COMPILE_ASSERT(kint32min == (~0x7fffffff), kint32min_value_error); return "(~0x7fffffff)"; } else { return SimpleItoa(number); } } string Int64ToString(int64 number) { // gcc rejects the decimal form of kint64min if (number == kint64min) { // Make sure we are in a 2's complement system. GOOGLE_COMPILE_ASSERT(kint64min == GOOGLE_LONGLONG(~0x7fffffffffffffff), kint64min_value_error); return "GOOGLE_LONGLONG(~0x7fffffffffffffff)"; } return "GOOGLE_LONGLONG(" + SimpleItoa(number) + ")"; } string DefaultValue(const FieldDescriptor* field) { switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: return Int32ToString(field->default_value_int32()); case FieldDescriptor::CPPTYPE_UINT32: return SimpleItoa(field->default_value_uint32()) + "u"; case FieldDescriptor::CPPTYPE_INT64: return Int64ToString(field->default_value_int64()); case FieldDescriptor::CPPTYPE_UINT64: return "GOOGLE_ULONGLONG(" + SimpleItoa(field->default_value_uint64())+ ")"; case FieldDescriptor::CPPTYPE_DOUBLE: { double value = field->default_value_double(); if (value == std::numeric_limits::infinity()) { return "::google::protobuf::internal::Infinity()"; } else if (value == -std::numeric_limits::infinity()) { return "-::google::protobuf::internal::Infinity()"; } else if (value != value) { return "::google::protobuf::internal::NaN()"; } else { return SimpleDtoa(value); } } case FieldDescriptor::CPPTYPE_FLOAT: { float value = field->default_value_float(); if (value == std::numeric_limits::infinity()) { return "static_cast(::google::protobuf::internal::Infinity())"; } else if (value == -std::numeric_limits::infinity()) { return "static_cast(-::google::protobuf::internal::Infinity())"; } else if (value != value) { return "static_cast(::google::protobuf::internal::NaN())"; } else { string float_value = SimpleFtoa(value); // If floating point value contains a period (.) or an exponent // (either E or e), then append suffix 'f' to make it a float // literal. if (float_value.find_first_of(".eE") != string::npos) { float_value.push_back('f'); } return float_value; } } case FieldDescriptor::CPPTYPE_BOOL: return field->default_value_bool() ? "true" : "false"; 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( "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())) + "\""; case FieldDescriptor::CPPTYPE_MESSAGE: return "*" + FieldMessageTypeName(field) + "::internal_default_instance()"; } // Can't actually get here; make compiler happy. (We could add a default // case above but then we wouldn't get the nice compiler warning when a // new type is added.) GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } // Convert a file name into a valid identifier. string FilenameIdentifier(const string& filename) { string result; for (int i = 0; i < filename.size(); i++) { if (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(filename[i]))); } } return result; } string FileLevelNamespace(const string& filename) { return "protobuf_" + FilenameIdentifier(filename); } // Return the qualified C++ name for a file level symbol. string QualifiedFileLevelSymbol(const string& package, const string& name) { if (package.empty()) { return StrCat("::", name); } return StrCat("::", DotsToColons(package), "::", name); } // Escape C++ trigraphs by escaping question marks to \? string EscapeTrigraphs(const string& to_escape) { return StringReplace(to_escape, "?", "\\?", true); } // Escaped function name to eliminate naming conflict. string SafeFunctionName(const Descriptor* descriptor, const FieldDescriptor* field, const string& prefix) { // Do not use FieldName() since it will escape keywords. string name = field->name(); LowerString(&name); 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) { // If the field name is a keyword, we append the underscore back to keep it // consistent with other function names. function_name.append("_"); } return function_name; } static bool HasMapFields(const Descriptor* descriptor) { for (int i = 0; i < descriptor->field_count(); ++i) { if (descriptor->field(i)->is_map()) { return true; } } for (int i = 0; i < descriptor->nested_type_count(); ++i) { if (HasMapFields(descriptor->nested_type(i))) return true; } return false; } bool HasMapFields(const FileDescriptor* file) { for (int i = 0; i < file->message_type_count(); ++i) { if (HasMapFields(file->message_type(i))) return true; } return false; } static bool HasEnumDefinitions(const Descriptor* message_type) { if (message_type->enum_type_count() > 0) return true; for (int i = 0; i < message_type->nested_type_count(); ++i) { if (HasEnumDefinitions(message_type->nested_type(i))) return true; } return false; } bool HasEnumDefinitions(const FileDescriptor* file) { if (file->enum_type_count() > 0) return true; for (int i = 0; i < file->message_type_count(); ++i) { if (HasEnumDefinitions(file->message_type(i))) return true; } return false; } bool IsStringOrMessage(const FieldDescriptor* field) { switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: case FieldDescriptor::CPPTYPE_INT64: case FieldDescriptor::CPPTYPE_UINT32: case FieldDescriptor::CPPTYPE_UINT64: case FieldDescriptor::CPPTYPE_DOUBLE: case FieldDescriptor::CPPTYPE_FLOAT: case FieldDescriptor::CPPTYPE_BOOL: case FieldDescriptor::CPPTYPE_ENUM: return false; case FieldDescriptor::CPPTYPE_STRING: case FieldDescriptor::CPPTYPE_MESSAGE: return true; } GOOGLE_LOG(FATAL) << "Can't get here."; return false; } FieldOptions::CType EffectiveStringCType(const FieldDescriptor* field) { GOOGLE_DCHECK(field->cpp_type() == FieldDescriptor::CPPTYPE_STRING); // Open-source protobuf release only supports STRING ctype. return FieldOptions::STRING; } bool IsAnyMessage(const FileDescriptor* descriptor) { return descriptor->name() == kAnyProtoFile; } bool IsAnyMessage(const Descriptor* descriptor) { return descriptor->name() == kAnyMessageName && descriptor->file()->name() == kAnyProtoFile; } bool IsWellKnownMessage(const FileDescriptor* descriptor) { return !descriptor->name().compare(0, 16, kGoogleProtobufPrefix); } enum Utf8CheckMode { STRICT = 0, // Parsing will fail if non UTF-8 data is in string fields. VERIFY = 1, // Only log an error but parsing will succeed. NONE = 2, // No UTF-8 check. }; // Which level of UTF-8 enforcemant is placed on this file. static Utf8CheckMode GetUtf8CheckMode(const FieldDescriptor* field, const Options& options) { if (field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3) { return STRICT; } else if (GetOptimizeFor(field->file(), options) != FileOptions::LITE_RUNTIME) { return VERIFY; } else { return NONE; } } static void GenerateUtf8CheckCode(const FieldDescriptor* field, const Options& options, bool for_parse, const std::map& variables, const char* parameters, const char* strict_function, const char* verify_function, io::Printer* printer) { switch (GetUtf8CheckMode(field, options)) { case STRICT: { if (for_parse) { printer->Print("DO_("); } printer->Print( "::google::protobuf::internal::WireFormatLite::$function$(\n", "function", strict_function); printer->Indent(); printer->Print(variables, parameters); if (for_parse) { printer->Print("::google::protobuf::internal::WireFormatLite::PARSE,\n"); } else { printer->Print("::google::protobuf::internal::WireFormatLite::SERIALIZE,\n"); } printer->Print("\"$full_name$\")", "full_name", field->full_name()); if (for_parse) { printer->Print(")"); } printer->Print(";\n"); printer->Outdent(); break; } case VERIFY: { printer->Print( "::google::protobuf::internal::WireFormat::$function$(\n", "function", verify_function); printer->Indent(); printer->Print(variables, parameters); if (for_parse) { printer->Print("::google::protobuf::internal::WireFormat::PARSE,\n"); } else { printer->Print("::google::protobuf::internal::WireFormat::SERIALIZE,\n"); } printer->Print("\"$full_name$\");\n", "full_name", field->full_name()); printer->Outdent(); break; } case NONE: break; } } void GenerateUtf8CheckCodeForString(const FieldDescriptor* field, const Options& options, bool for_parse, const std::map& variables, const char* parameters, io::Printer* printer) { GenerateUtf8CheckCode(field, options, for_parse, variables, parameters, "VerifyUtf8String", "VerifyUTF8StringNamedField", printer); } void GenerateUtf8CheckCodeForCord(const FieldDescriptor* field, const Options& options, bool for_parse, const std::map& variables, const char* parameters, io::Printer* printer) { GenerateUtf8CheckCode(field, options, for_parse, variables, parameters, "VerifyUtf8Cord", "VerifyUTF8CordNamedField", printer); } namespace { void Flatten(const Descriptor* descriptor, std::vector* flatten) { for (int i = 0; i < descriptor->nested_type_count(); i++) Flatten(descriptor->nested_type(i), flatten); flatten->push_back(descriptor); } } // namespace void FlattenMessagesInFile(const FileDescriptor* file, std::vector* result) { for (int i = 0; i < file->message_type_count(); i++) { Flatten(file->message_type(i), result); } } bool HasWeakFields(const Descriptor* descriptor) { return false; } bool HasWeakFields(const FileDescriptor* file) { return false; } bool UsingImplicitWeakFields(const FileDescriptor* file, const Options& options) { return options.lite_implicit_weak_fields && GetOptimizeFor(file, options) == FileOptions::LITE_RUNTIME; } bool IsImplicitWeakField(const FieldDescriptor* field, const Options& options) { return UsingImplicitWeakFields(field->file(), options) && field->type() == FieldDescriptor::TYPE_MESSAGE && !field->is_required() && !field->is_repeated() && !field->is_map() && field->containing_oneof() == NULL; } struct CompareDescriptors { bool operator()(const Descriptor* a, const Descriptor* b) { return a->full_name() < b->full_name(); } }; SCCAnalyzer::NodeData SCCAnalyzer::DFS(const Descriptor* descriptor) { // Must not have visited already. GOOGLE_DCHECK_EQ(cache_.count(descriptor), 0); // Mark visited by inserting in map. NodeData& result = cache_[descriptor]; // Initialize data structures. result.index = result.lowlink = index_++; stack_.push_back(descriptor); // Recurse the fields / nodes in graph for (int i = 0; i < descriptor->field_count(); i++) { const Descriptor* child = descriptor->field(i)->message_type(); if (child) { if (cache_.count(child) == 0) { // unexplored node NodeData child_data = DFS(child); result.lowlink = std::min(result.lowlink, child_data.lowlink); } else { NodeData child_data = cache_[child]; if (child_data.scc == NULL) { // Still in the stack_ so we found a back edge result.lowlink = std::min(result.lowlink, child_data.index); } } } } if (result.index == result.lowlink) { // This is the root of a strongly connected component SCC* scc = CreateSCC(); while (true) { const Descriptor* scc_desc = stack_.back(); scc->descriptors.push_back(scc_desc); // Remove from stack stack_.pop_back(); cache_[scc_desc].scc = scc; if (scc_desc == descriptor) break; } // The order of descriptors is random and depends how this SCC was // discovered. In-order to ensure maximum stability we sort it by name. std::sort(scc->descriptors.begin(), scc->descriptors.end(), CompareDescriptors()); AddChildren(scc); } return result; } void SCCAnalyzer::AddChildren(SCC* scc) { std::set seen; for (int i = 0; i < scc->descriptors.size(); i++) { const Descriptor* descriptor = scc->descriptors[i]; for (int j = 0; j < descriptor->field_count(); j++) { const Descriptor* child_msg = descriptor->field(j)->message_type(); if (child_msg) { const SCC* child = GetSCC(child_msg); if (child == scc) continue; if (seen.insert(child).second) { scc->children.push_back(child); } } } } } MessageAnalysis SCCAnalyzer::GetSCCAnalysis(const SCC* scc) { if (analysis_cache_.count(scc)) return analysis_cache_[scc]; MessageAnalysis result = MessageAnalysis(); for (int i = 0; i < scc->descriptors.size(); i++) { const Descriptor* descriptor = scc->descriptors[i]; if (descriptor->extension_range_count() > 0) { result.contains_extension = true; } for (int i = 0; i < descriptor->field_count(); i++) { const FieldDescriptor* field = descriptor->field(i); if (field->is_required()) { result.contains_required = true; } switch (field->type()) { case FieldDescriptor::TYPE_STRING: case FieldDescriptor::TYPE_BYTES: { if (field->options().ctype() == FieldOptions::CORD) { result.contains_cord = true; } break; } case FieldDescriptor::TYPE_GROUP: case FieldDescriptor::TYPE_MESSAGE: { const SCC* child = GetSCC(field->message_type()); if (child != scc) { MessageAnalysis analysis = GetSCCAnalysis(child); result.contains_cord |= analysis.contains_cord; result.contains_extension |= analysis.contains_extension; if (!ShouldIgnoreRequiredFieldCheck(field, options_)) { result.contains_required |= analysis.contains_required; } } else { // This field points back into the same SCC hence the messages // in the SCC are recursive. Note if SCC contains more than two // nodes it has to be recursive, however this test also works for // a single node that is recursive. result.is_recursive = true; } break; } default: break; } } } // We deliberately only insert the result here. After we contracted the SCC // in the graph, the graph should be a DAG. Hence we shouldn't need to mark // nodes visited as we can never return to them. By inserting them here // we will go in an infinite loop if the SCC is not correct. return analysis_cache_[scc] = result; } void ListAllFields(const Descriptor* d, std::vector* fields) { // Collect sub messages for (int i = 0; i < d->nested_type_count(); i++) { ListAllFields(d->nested_type(i), fields); } // Collect message level extensions. for (int i = 0; i < d->extension_count(); i++) { fields->push_back(d->extension(i)); } // Add types of fields necessary for (int i = 0; i < d->field_count(); i++) { fields->push_back(d->field(i)); } } void ListAllFields(const FileDescriptor* d, std::vector* fields) { // Collect file level message. for (int i = 0; i < d->message_type_count(); i++) { ListAllFields(d->message_type(i), fields); } // Collect message level extensions. for (int i = 0; i < d->extension_count(); i++) { fields->push_back(d->extension(i)); } } void ListAllTypesForServices(const FileDescriptor* fd, std::vector* types) { for (int i = 0; i < fd->service_count(); i++) { const ServiceDescriptor* sd = fd->service(i); for (int j = 0; j < sd->method_count(); j++) { const MethodDescriptor* method = sd->method(j); types->push_back(method->input_type()); types->push_back(method->output_type()); } } } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h000066400000000000000000000440641334102242000323520ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__ #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { // Commonly-used separator comments. Thick is a line of '=', thin is a line // of '-'. extern const char kThickSeparator[]; extern const char kThinSeparator[]; // Name space of the proto file. This namespace is such that the string // "::some_name" is the correct fully qualified namespace. // This means if the package is empty the namespace is "", and otherwise // the namespace is "::foo::bar::...::baz" without trailing semi-colons. string Namespace(const string& package); inline string Namespace(const FileDescriptor* d) { return Namespace(d->package()); } template string Namespace(const Desc* d) { return Namespace(d->file()); } // Returns true if it's safe to reset "field" to zero. bool CanInitializeByZeroing(const FieldDescriptor* field); string ClassName(const Descriptor* descriptor); string ClassName(const EnumDescriptor* enum_descriptor); template string QualifiedClassName(const Desc* d) { return Namespace(d) + "::" + ClassName(d); } // DEPRECATED just use ClassName or QualifiedClassName, a boolean is very // unreadable at the callsite. // Returns the non-nested type name for the given type. If "qualified" is // true, prefix the type with the full namespace. For example, if you had: // package foo.bar; // message Baz { message Qux {} } // Then the qualified ClassName for Qux would be: // ::foo::bar::Baz_Qux // While the non-qualified version would be: // Baz_Qux inline string ClassName(const Descriptor* descriptor, bool qualified) { return qualified ? QualifiedClassName(descriptor) : ClassName(descriptor); } inline string ClassName(const EnumDescriptor* descriptor, bool qualified) { return qualified ? QualifiedClassName(descriptor) : ClassName(descriptor); } // Fully qualified name of the default_instance of this message. string DefaultInstanceName(const Descriptor* descriptor); // Returns the name of a no-op function that we can call to introduce a linker // dependency on the given message type. This is used to implement implicit weak // fields. string ReferenceFunctionName(const Descriptor* descriptor); // Name of the CRTP class template (for use with proto_h). // This is a class name, like "ProtoName_InternalBase". string DependentBaseClassTemplateName(const Descriptor* descriptor); // Name of the base class: either the dependent base class (for use with // proto_h) or google::protobuf::Message. string SuperClassName(const Descriptor* descriptor, const Options& options); // Returns a string that down-casts from the dependent base class to the // derived class. string DependentBaseDownCast(); string DependentBaseConstDownCast(); // Get the (unqualified) name that should be used for this field in C++ code. // The name is coerced to lower-case to emulate proto1 behavior. People // should be using lowercase-with-underscores style for proto field names // anyway, so normally this just returns field->name(). string FieldName(const FieldDescriptor* field); // Get the sanitized name that should be used for the given enum in C++ code. string EnumValueName(const EnumValueDescriptor* enum_value); // Returns an estimate of the compiler's alignment for the field. This // can't guarantee to be correct because the generated code could be compiled on // different systems with different alignment rules. The estimates below assume // 64-bit pointers. int EstimateAlignmentSize(const FieldDescriptor* field); // Get the unqualified name that should be used for a field's field // number constant. string FieldConstantName(const FieldDescriptor *field); // Returns the scope where the field was defined (for extensions, this is // different from the message type to which the field applies). inline const Descriptor* FieldScope(const FieldDescriptor* field) { return field->is_extension() ? field->extension_scope() : field->containing_type(); } // Returns true if the given 'field_descriptor' has a message type that is // a dependency of the file where the field is defined (i.e., the field // type is defined in a different file than the message holding the field). // // This only applies to Message-typed fields. Enum-typed fields may refer // to an enum in a dependency; however, enums are specified and // forward-declared with an enum-base, so the definition is not required to // manipulate the field value. bool IsFieldDependent(const FieldDescriptor* field_descriptor); // Returns the name that should be used for forcing dependent lookup from a // dependent base class. string DependentTypeName(const FieldDescriptor* field); // Returns the fully-qualified type name field->message_type(). Usually this // is just ClassName(field->message_type(), true); string FieldMessageTypeName(const FieldDescriptor* field); // Strips ".proto" or ".protodevel" from the end of a filename. LIBPROTOC_EXPORT string StripProto(const string& filename); // Get the C++ type name for a primitive type (e.g. "double", "::google::protobuf::int32", etc.). // Note: non-built-in type names will be qualified, meaning they will start // with a ::. If you are using the type as a template parameter, you will // need to insure there is a space between the < and the ::, because the // ridiculous C++ standard defines "<:" to be a synonym for "[". const char* PrimitiveTypeName(FieldDescriptor::CppType type); // Get the declared type name in CamelCase format, as is used e.g. for the // methods of WireFormat. For example, TYPE_INT32 becomes "Int32". const char* DeclaredTypeMethodName(FieldDescriptor::Type type); // Return the code that evaluates to the number when compiled. string Int32ToString(int number); // Return the code that evaluates to the number when compiled. string Int64ToString(int64 number); // Get code that evaluates to the field's default value. string DefaultValue(const FieldDescriptor* field); // Convert a file name into a valid identifier. string FilenameIdentifier(const string& filename); // For each .proto file generates a unique namespace. In this namespace global // definitions are put to prevent collisions. string FileLevelNamespace(const string& filename); inline string FileLevelNamespace(const FileDescriptor* file) { return FileLevelNamespace(file->name()); } inline string FileLevelNamespace(const Descriptor* d) { return FileLevelNamespace(d->file()); } // Return the qualified C++ name for a file level symbol. string QualifiedFileLevelSymbol(const string& package, const string& name); // Escape C++ trigraphs by escaping question marks to \? string EscapeTrigraphs(const string& to_escape); // Escaped function name to eliminate naming conflict. string SafeFunctionName(const Descriptor* descriptor, const FieldDescriptor* field, const string& prefix); // Returns true if unknown fields are always preserved after parsing. inline bool AlwaysPreserveUnknownFields(const FileDescriptor* file) { return file->syntax() != FileDescriptor::SYNTAX_PROTO3; } // Returns true if unknown fields are preserved after parsing. inline bool AlwaysPreserveUnknownFields(const Descriptor* message) { return AlwaysPreserveUnknownFields(message->file()); } // Returns true if generated messages have public unknown fields accessors inline bool PublicUnknownFieldsAccessors(const Descriptor* message) { return message->file()->syntax() != FileDescriptor::SYNTAX_PROTO3; } // Returns the optimize mode for , respecting . ::google::protobuf::FileOptions_OptimizeMode GetOptimizeFor( const FileDescriptor* file, const Options& options); // Determines whether unknown fields will be stored in an UnknownFieldSet or // a string. inline bool UseUnknownFieldSet(const FileDescriptor* file, const Options& options) { return GetOptimizeFor(file, options) != FileOptions::LITE_RUNTIME; } // Does the file have any map fields, necessitating the file to include // map_field_inl.h and map.h. bool HasMapFields(const FileDescriptor* file); // Does this file have any enum type definitions? bool HasEnumDefinitions(const FileDescriptor* file); // Does this file have generated parsing, serialization, and other // standard methods for which reflection-based fallback implementations exist? inline bool HasGeneratedMethods(const FileDescriptor* file, const Options& options) { return GetOptimizeFor(file, options) != FileOptions::CODE_SIZE; } // Do message classes in this file have descriptor and reflection methods? inline bool HasDescriptorMethods(const FileDescriptor* file, const Options& options) { return GetOptimizeFor(file, options) != FileOptions::LITE_RUNTIME; } // Should we generate generic services for this file? inline bool HasGenericServices(const FileDescriptor* file, const Options& options) { return file->service_count() > 0 && GetOptimizeFor(file, options) != FileOptions::LITE_RUNTIME && file->options().cc_generic_services(); } // Should we generate a separate, super-optimized code path for serializing to // flat arrays? We don't do this in Lite mode because we'd rather reduce code // size. inline bool HasFastArraySerialization(const FileDescriptor* file, const Options& options) { return GetOptimizeFor(file, options) == FileOptions::SPEED; } inline bool IsMapEntryMessage(const Descriptor* descriptor) { return descriptor->options().map_entry(); } // Returns true if the field's CPPTYPE is string or message. bool IsStringOrMessage(const FieldDescriptor* field); // For a string field, returns the effective ctype. If the actual ctype is // not supported, returns the default of STRING. FieldOptions::CType EffectiveStringCType(const FieldDescriptor* field); string UnderscoresToCamelCase(const string& input, bool cap_next_letter); inline bool HasFieldPresence(const FileDescriptor* file) { return file->syntax() != FileDescriptor::SYNTAX_PROTO3; } // 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 FileDescriptor* file) { return file->syntax() == FileDescriptor::SYNTAX_PROTO3; } inline bool SupportsArenas(const FileDescriptor* file) { return file->options().cc_enable_arenas(); } inline bool SupportsArenas(const Descriptor* desc) { return SupportsArenas(desc->file()); } inline bool SupportsArenas(const FieldDescriptor* field) { return SupportsArenas(field->file()); } inline bool IsCrossFileMessage(const FieldDescriptor* field) { return field->type() == FieldDescriptor::TYPE_MESSAGE && field->message_type()->file() != field->file(); } bool IsAnyMessage(const FileDescriptor* descriptor); bool IsAnyMessage(const Descriptor* descriptor); bool IsWellKnownMessage(const FileDescriptor* descriptor); void GenerateUtf8CheckCodeForString(const FieldDescriptor* field, const Options& options, bool for_parse, const std::map& variables, const char* parameters, io::Printer* printer); void GenerateUtf8CheckCodeForCord(const FieldDescriptor* field, const Options& options, bool for_parse, const std::map& variables, const char* parameters, io::Printer* printer); inline ::google::protobuf::FileOptions_OptimizeMode GetOptimizeFor( const FileDescriptor* file, const Options& options) { return options.enforce_lite ? FileOptions::LITE_RUNTIME : file->options().optimize_for(); } // This orders the messages in a .pb.cc as it's outputted by file.cc void FlattenMessagesInFile(const FileDescriptor* file, std::vector* result); inline std::vector FlattenMessagesInFile( const FileDescriptor* file) { std::vector result; FlattenMessagesInFile(file, &result); return result; } bool HasWeakFields(const Descriptor* desc); bool HasWeakFields(const FileDescriptor* desc); // Indicates whether we should use implicit weak fields for this file. bool UsingImplicitWeakFields(const FileDescriptor* file, const Options& options); // Indicates whether to treat this field as implicitly weak. bool IsImplicitWeakField(const FieldDescriptor* field, const Options& options); // Returns true if the "required" restriction check should be ignored for the // given field. inline static bool ShouldIgnoreRequiredFieldCheck(const FieldDescriptor* field, const Options& options) { return false; } class LIBPROTOC_EXPORT NamespaceOpener { public: explicit NamespaceOpener(io::Printer* printer) : printer_(printer) {} NamespaceOpener(const string& name, io::Printer* printer) : printer_(printer) { ChangeTo(name); } ~NamespaceOpener() { ChangeTo(""); } void ChangeTo(const string& name) { std::vector new_stack_ = Split(name, "::", true); int len = std::min(name_stack_.size(), new_stack_.size()); int common_idx = 0; while (common_idx < len) { if (name_stack_[common_idx] != new_stack_[common_idx]) break; common_idx++; } for (int i = name_stack_.size() - 1; i >= common_idx; i--) { printer_->Print("} // namespace $ns$\n", "ns", name_stack_[i]); } name_stack_.swap(new_stack_); for (int i = common_idx; i < name_stack_.size(); i++) { printer_->Print("namespace $ns$ {\n", "ns", name_stack_[i]); } } private: io::Printer* printer_; std::vector name_stack_; }; // Description of each strongly connected component. Note that the order // of both the descriptors in this SCC and the order of children is // deterministic. struct SCC { std::vector descriptors; std::vector children; const Descriptor* GetRepresentative() const { return descriptors[0]; } }; struct MessageAnalysis { bool is_recursive; bool contains_cord; bool contains_extension; bool contains_required; }; // This class is used in FileGenerator, to ensure linear instead of // quadratic performance, if we do this per message we would get O(V*(V+E)). // Logically this is just only used in message.cc, but in the header for // FileGenerator to help share it. class LIBPROTOC_EXPORT SCCAnalyzer { public: explicit SCCAnalyzer(const Options& options) : options_(options), index_(0) {} ~SCCAnalyzer() { for (int i = 0; i < garbage_bin_.size(); i++) delete garbage_bin_[i]; } const SCC* GetSCC(const Descriptor* descriptor) { if (cache_.count(descriptor)) return cache_[descriptor].scc; return DFS(descriptor).scc; } MessageAnalysis GetSCCAnalysis(const SCC* scc); bool HasRequiredFields(const Descriptor* descriptor) { MessageAnalysis result = GetSCCAnalysis(GetSCC(descriptor)); return result.contains_required || result.contains_extension; } private: struct NodeData { const SCC* scc; // if null it means its still on the stack int index; int lowlink; }; Options options_; std::map cache_; std::map analysis_cache_; std::vector stack_; int index_; std::vector garbage_bin_; SCC* CreateSCC() { garbage_bin_.push_back(new SCC()); return garbage_bin_.back(); } // Tarjan's Strongly Connected Components algo NodeData DFS(const Descriptor* descriptor); // Add the SCC's that are children of this SCC to its children. void AddChildren(SCC* scc); }; void ListAllFields(const FileDescriptor* d, std::vector* fields); void ListAllTypesForServices(const FileDescriptor* fd, std::vector* types); } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_map_field.cc000066400000000000000000000411371334102242000327640ustar00rootroot00000000000000// 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 #include #include #include #include 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* variables, const Options& options) { SetCommonFieldVariables(descriptor, variables, options); (*variables)["type"] = ClassName(descriptor->message_type(), false); (*variables)["file_namespace"] = FileLevelNamespace(descriptor->file()->name()); (*variables)["stream_writer"] = (*variables)["declared_type"] + (HasFastArraySerialization(descriptor->message_type()->file(), options) ? "MaybeToArray" : ""); (*variables)["full_name"] = descriptor->full_name(); const FieldDescriptor* key = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* val = descriptor->message_type()->FindFieldByName("value"); (*variables)["key_cpp"] = PrimitiveTypeName(key->cpp_type()); switch (val->cpp_type()) { case FieldDescriptor::CPPTYPE_MESSAGE: (*variables)["val_cpp"] = FieldMessageTypeName(val); (*variables)["wrapper"] = "EntryWrapper"; break; case FieldDescriptor::CPPTYPE_ENUM: (*variables)["val_cpp"] = ClassName(val->enum_type(), true); (*variables)["wrapper"] = "EnumEntryWrapper"; break; default: (*variables)["val_cpp"] = PrimitiveTypeName(val->cpp_type()); (*variables)["wrapper"] = "EntryWrapper"; } (*variables)["key_wire_type"] = "::google::protobuf::internal::WireFormatLite::TYPE_" + ToUpper(DeclaredTypeMethodName(key->type())); (*variables)["val_wire_type"] = "::google::protobuf::internal::WireFormatLite::TYPE_" + ToUpper(DeclaredTypeMethodName(val->type())); (*variables)["map_classname"] = ClassName(descriptor->message_type(), false); (*variables)["number"] = SimpleItoa(descriptor->number()); (*variables)["tag"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor)); if (HasDescriptorMethods(descriptor->file(), options)) { (*variables)["lite"] = ""; } else { (*variables)["lite"] = "Lite"; } if (!IsProto3Field(descriptor) && val->type() == FieldDescriptor::TYPE_ENUM) { const EnumValueDescriptor* default_value = val->default_value_enum(); (*variables)["default_enum_value"] = Int32ToString(default_value->number()); } else { (*variables)["default_enum_value"] = "0"; } } MapFieldGenerator::MapFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : FieldGenerator(options), descriptor_(descriptor), dependent_field_(options.proto_h && IsFieldDependent(descriptor)) { SetMessageVariables(descriptor, &variables_, options); } MapFieldGenerator::~MapFieldGenerator() {} void MapFieldGenerator:: GeneratePrivateMembers(io::Printer* printer) const { printer->Print(variables_, "::google::protobuf::internal::MapField$lite$<\n" " $map_classname$,\n" " $key_cpp$, $val_cpp$,\n" " $key_wire_type$,\n" " $val_wire_type$,\n" " $default_enum_value$ > $name$_;\n"); } void MapFieldGenerator:: GenerateAccessorDeclarations(io::Printer* printer) const { printer->Print( variables_, "$deprecated_attr$const ::google::protobuf::Map< $key_cpp$, $val_cpp$ >&\n" " $name$() const;\n"); printer->Annotate("name", descriptor_); printer->Print(variables_, "$deprecated_attr$::google::protobuf::Map< $key_cpp$, $val_cpp$ >*\n" " ${$mutable_$name$$}$();\n"); printer->Annotate("{", "}", descriptor_); } void MapFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { printer->Print(variables_, "inline const ::google::protobuf::Map< $key_cpp$, $val_cpp$ >&\n" "$classname$::$name$() const {\n" " // @@protoc_insertion_point(field_map:$full_name$)\n" " return $name$_.GetMap();\n" "}\n" "inline ::google::protobuf::Map< $key_cpp$, $val_cpp$ >*\n" "$classname$::mutable_$name$() {\n" " // @@protoc_insertion_point(field_mutable_map:$full_name$)\n" " return $name$_.MutableMap();\n" "}\n"); } void MapFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.Clear();\n"); } void MapFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); } void MapFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n"); } void MapFieldGenerator:: GenerateCopyConstructorCode(io::Printer* printer) const { GenerateConstructorCode(printer); GenerateMergingCode(printer); } void MapFieldGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) const { const FieldDescriptor* key_field = descriptor_->message_type()->FindFieldByName("key"); const FieldDescriptor* value_field = descriptor_->message_type()->FindFieldByName("value"); bool using_entry = false; string key; string value; if (IsProto3Field(descriptor_) || value_field->type() != FieldDescriptor::TYPE_ENUM) { printer->Print( variables_, "$map_classname$::Parser< ::google::protobuf::internal::MapField$lite$<\n" " $map_classname$,\n" " $key_cpp$, $val_cpp$,\n" " $key_wire_type$,\n" " $val_wire_type$,\n" " $default_enum_value$ >,\n" " ::google::protobuf::Map< $key_cpp$, $val_cpp$ > >" " parser(&$name$_);\n" "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n" " input, &parser));\n"); key = "parser.key()"; value = "parser.value()"; } else { using_entry = true; key = "entry->key()"; value = "entry->value()"; printer->Print(variables_, "::google::protobuf::scoped_ptr<$map_classname$> entry($name$_.NewEntry());\n"); printer->Print(variables_, "{\n" " ::std::string data;\n" " DO_(::google::protobuf::internal::WireFormatLite::ReadString(input, &data));\n" " DO_(entry->ParseFromString(data));\n" " if ($val_cpp$_IsValid(*entry->mutable_value())) {\n" " (*mutable_$name$())[entry->key()] =\n" " static_cast< $val_cpp$ >(*entry->mutable_value());\n" " } else {\n"); if (HasDescriptorMethods(descriptor_->file(), options_)) { printer->Print(variables_, " mutable_unknown_fields()" "->AddLengthDelimited($number$, data);\n"); } else { printer->Print(variables_, " unknown_fields_stream.WriteVarint32($tag$u);\n" " unknown_fields_stream.WriteVarint32(\n" " static_cast< ::google::protobuf::uint32>(data.size()));\n" " unknown_fields_stream.WriteString(data);\n"); } printer->Print(variables_, " }\n" "}\n"); } if (key_field->type() == FieldDescriptor::TYPE_STRING) { GenerateUtf8CheckCodeForString( key_field, options_, true, variables_, StrCat(key, ".data(), static_cast(", key, ".length()),\n").data(), printer); } if (value_field->type() == FieldDescriptor::TYPE_STRING) { GenerateUtf8CheckCodeForString( value_field, options_, true, variables_, StrCat(value, ".data(), static_cast(", value, ".length()),\n") .data(), printer); } // If entry is allocated by arena, its desctructor should be avoided. if (using_entry && SupportsArenas(descriptor_)) { printer->Print(variables_, "if (entry->GetArena() != NULL) entry.release();\n"); } } static void GenerateSerializationLoop(io::Printer* printer, const std::map& variables, bool supports_arenas, const string& utf8_check, const string& loop_header, const string& ptr, bool loop_via_iterators) { printer->Print(variables, StrCat("::google::protobuf::scoped_ptr<$map_classname$> entry;\n", loop_header, " {\n").c_str()); printer->Indent(); printer->Print(variables, StrCat( "entry.reset($name$_.New$wrapper$(\n" " ", ptr, "->first, ", ptr, "->second));\n" "$write_entry$;\n").c_str()); // If entry is allocated by arena, its desctructor should be avoided. if (supports_arenas) { printer->Print( "if (entry->GetArena() != NULL) {\n" " entry.release();\n" "}\n"); } if (!utf8_check.empty()) { // If loop_via_iterators is true then ptr is actually an iterator, and we // create a pointer by prefixing it with "&*". printer->Print( StrCat(utf8_check, "(", (loop_via_iterators ? "&*" : ""), ptr, ");\n") .c_str()); } printer->Outdent(); printer->Print( "}\n"); } void MapFieldGenerator:: GenerateSerializeWithCachedSizes(io::Printer* printer) const { std::map variables(variables_); variables["write_entry"] = "::google::protobuf::internal::WireFormatLite::Write" + variables["stream_writer"] + "(\n " + variables["number"] + ", *entry, output)"; variables["deterministic"] = "output->IsSerializationDeterministic()"; GenerateSerializeWithCachedSizes(printer, variables); } void MapFieldGenerator:: GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { std::map variables(variables_); variables["write_entry"] = "target = ::google::protobuf::internal::WireFormatLite::\n" " InternalWrite" + variables["declared_type"] + "NoVirtualToArray(\n " + variables["number"] + ", *entry, deterministic, target);\n"; variables["deterministic"] = "deterministic"; GenerateSerializeWithCachedSizes(printer, variables); } void MapFieldGenerator::GenerateSerializeWithCachedSizes( io::Printer* printer, const std::map& variables) const { printer->Print(variables, "if (!this->$name$().empty()) {\n"); printer->Indent(); const FieldDescriptor* key_field = descriptor_->message_type()->FindFieldByName("key"); const FieldDescriptor* value_field = descriptor_->message_type()->FindFieldByName("value"); const bool string_key = key_field->type() == FieldDescriptor::TYPE_STRING; const bool string_value = value_field->type() == FieldDescriptor::TYPE_STRING; printer->Print(variables, "typedef ::google::protobuf::Map< $key_cpp$, $val_cpp$ >::const_pointer\n" " ConstPtr;\n"); if (string_key) { printer->Print(variables, "typedef ConstPtr SortItem;\n" "typedef ::google::protobuf::internal::" "CompareByDerefFirst Less;\n"); } else { printer->Print(variables, "typedef ::google::protobuf::internal::SortItem< $key_cpp$, ConstPtr > " "SortItem;\n" "typedef ::google::protobuf::internal::CompareByFirstField Less;\n"); } string utf8_check; if (string_key || string_value) { printer->Print( "struct Utf8Check {\n" " static void Check(ConstPtr p) {\n"); printer->Indent(); printer->Indent(); if (string_key) { GenerateUtf8CheckCodeForString( key_field, options_, false, variables, "p->first.data(), static_cast(p->first.length()),\n", printer); } if (string_value) { GenerateUtf8CheckCodeForString( value_field, options_, false, variables, "p->second.data(), static_cast(p->second.length()),\n", printer); } printer->Outdent(); printer->Outdent(); printer->Print( " }\n" "};\n"); utf8_check = "Utf8Check::Check"; } printer->Print(variables, "\n" "if ($deterministic$ &&\n" " this->$name$().size() > 1) {\n" " ::google::protobuf::scoped_array items(\n" " new SortItem[this->$name$().size()]);\n" " typedef ::google::protobuf::Map< $key_cpp$, $val_cpp$ >::size_type size_type;\n" " size_type n = 0;\n" " for (::google::protobuf::Map< $key_cpp$, $val_cpp$ >::const_iterator\n" " it = this->$name$().begin();\n" " it != this->$name$().end(); ++it, ++n) {\n" " items[static_cast(n)] = SortItem(&*it);\n" " }\n" " ::std::sort(&items[0], &items[static_cast(n)], Less());\n"); printer->Indent(); GenerateSerializationLoop(printer, variables, SupportsArenas(descriptor_), utf8_check, "for (size_type i = 0; i < n; i++)", string_key ? "items[static_cast(i)]" : "items[static_cast(i)].second", false); printer->Outdent(); printer->Print( "} else {\n"); printer->Indent(); GenerateSerializationLoop( printer, variables, SupportsArenas(descriptor_), utf8_check, "for (::google::protobuf::Map< $key_cpp$, $val_cpp$ >::const_iterator\n" " it = this->$name$().begin();\n" " it != this->$name$().end(); ++it)", "it", true); printer->Outdent(); printer->Print("}\n"); printer->Outdent(); printer->Print("}\n"); } void MapFieldGenerator:: GenerateByteSize(io::Printer* printer) const { printer->Print(variables_, "total_size += $tag_size$ *\n" " ::google::protobuf::internal::FromIntSize(this->$name$_size());\n" "{\n" " ::google::protobuf::scoped_ptr<$map_classname$> entry;\n" " for (::google::protobuf::Map< $key_cpp$, $val_cpp$ >::const_iterator\n" " it = this->$name$().begin();\n" " it != this->$name$().end(); ++it) {\n"); // If entry is allocated by arena, its desctructor should be avoided. if (SupportsArenas(descriptor_)) { printer->Print(variables_, " if (entry.get() != NULL && entry->GetArena() != NULL) {\n" " entry.release();\n" " }\n"); } printer->Print(variables_, " entry.reset($name$_.New$wrapper$(it->first, it->second));\n" " total_size += ::google::protobuf::internal::WireFormatLite::\n" " $declared_type$SizeNoVirtual(*entry);\n" " }\n"); // If entry is allocated by arena, its desctructor should be avoided. if (SupportsArenas(descriptor_)) { printer->Print(variables_, " if (entry.get() != NULL && entry->GetArena() != NULL) {\n" " entry.release();\n" " }\n"); } printer->Print("}\n"); } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_map_field.h000066400000000000000000000065521334102242000326300ustar00rootroot00000000000000// 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_CPP_MAP_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_MAP_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { class MapFieldGenerator : public FieldGenerator { public: MapFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~MapFieldGenerator(); // implements FieldGenerator --------------------------------------- void GeneratePrivateMembers(io::Printer* printer) const; void GenerateAccessorDeclarations(io::Printer* printer) const; void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const {} void GenerateCopyConstructorCode(io::Printer* printer) const; void GenerateMergeFromCodedStream(io::Printer* printer) const; void GenerateSerializeWithCachedSizes(io::Printer* printer) const; void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; void GenerateByteSize(io::Printer* printer) const; private: // A helper for GenerateSerializeWithCachedSizes{,ToArray}. void GenerateSerializeWithCachedSizes( io::Printer* printer, const std::map& variables) const; const FieldDescriptor* descriptor_; const bool dependent_field_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapFieldGenerator); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_MAP_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc000066400000000000000000004624131334102242000324740ustar00rootroot00000000000000// 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 #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { using internal::WireFormat; using internal::WireFormatLite; namespace { template void PrintFieldComment(io::Printer* printer, const T* field) { // Print the field's (or oneof's) proto-syntax definition as a comment. // We don't want to print group bodies so we cut off after the first // line. DebugStringOptions options; options.elide_group_body = true; options.elide_oneof_body = true; string def = field->DebugStringWithOptions(options); printer->Print("// $def$\n", "def", def.substr(0, def.find_first_of('\n'))); } struct FieldOrderingByNumber { inline bool operator()(const FieldDescriptor* a, const FieldDescriptor* b) const { return a->number() < b->number(); } }; // Sort the fields of the given Descriptor by number into a new[]'d array // and return it. std::vector SortFieldsByNumber( const Descriptor* descriptor) { std::vector fields(descriptor->field_count()); for (int i = 0; i < descriptor->field_count(); i++) { fields[i] = descriptor->field(i); } std::sort(fields.begin(), fields.end(), FieldOrderingByNumber()); return fields; } // Functor for sorting extension ranges by their "start" field number. struct ExtensionRangeSorter { bool operator()(const Descriptor::ExtensionRange* left, const Descriptor::ExtensionRange* right) const { return left->start < right->start; } }; bool IsPOD(const FieldDescriptor* field) { if (field->is_repeated() || field->is_extension()) return false; switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_ENUM: case FieldDescriptor::CPPTYPE_INT32: case FieldDescriptor::CPPTYPE_INT64: case FieldDescriptor::CPPTYPE_UINT32: case FieldDescriptor::CPPTYPE_UINT64: case FieldDescriptor::CPPTYPE_FLOAT: case FieldDescriptor::CPPTYPE_DOUBLE: case FieldDescriptor::CPPTYPE_BOOL: return true; case FieldDescriptor::CPPTYPE_STRING: return false; default: return false; } } // Helper for the code that emits the SharedCtor() method. bool CanConstructByZeroing(const FieldDescriptor* field, const Options& options) { bool ret = CanInitializeByZeroing(field); // Non-repeated, non-lazy message fields are simply raw pointers, so we can // use memset to initialize these in SharedCtor. We cannot use this in // Clear, as we need to potentially delete the existing value. ret = ret || (!field->is_repeated() && field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE); return ret; } // Emits an if-statement with a condition that evaluates to true if |field| is // considered non-default (will be sent over the wire), for message types // without true field presence. Should only be called if // !HasFieldPresence(message_descriptor). bool EmitFieldNonDefaultCondition(io::Printer* printer, const string& prefix, const FieldDescriptor* field) { // Merge and serialize semantics: primitive fields are merged/serialized only // if non-zero (numeric) or non-empty (string). if (!field->is_repeated() && !field->containing_oneof()) { if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { printer->Print( "if ($prefix$$name$().size() > 0) {\n", "prefix", prefix, "name", FieldName(field)); } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { // Message fields still have has_$name$() methods. printer->Print( "if ($prefix$has_$name$()) {\n", "prefix", prefix, "name", FieldName(field)); } else { printer->Print( "if ($prefix$$name$() != 0) {\n", "prefix", prefix, "name", FieldName(field)); } printer->Indent(); return true; } else if (field->containing_oneof()) { printer->Print( "if (has_$name$()) {\n", "name", FieldName(field)); printer->Indent(); return true; } return false; } // Does the given field have a has_$name$() method? bool HasHasMethod(const FieldDescriptor* field) { if (HasFieldPresence(field->file())) { // In proto1/proto2, every field has a has_$name$() method. return true; } // For message types without true field presence, only fields with a message // type have a has_$name$() method. return field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE; } // Collects map entry message type information. void CollectMapInfo(const Descriptor* descriptor, std::map* variables) { GOOGLE_CHECK(IsMapEntryMessage(descriptor)); std::map& vars = *variables; const FieldDescriptor* key = descriptor->FindFieldByName("key"); const FieldDescriptor* val = descriptor->FindFieldByName("value"); vars["key_cpp"] = PrimitiveTypeName(key->cpp_type()); switch (val->cpp_type()) { case FieldDescriptor::CPPTYPE_MESSAGE: vars["val_cpp"] = FieldMessageTypeName(val); break; case FieldDescriptor::CPPTYPE_ENUM: vars["val_cpp"] = ClassName(val->enum_type(), true); break; default: vars["val_cpp"] = PrimitiveTypeName(val->cpp_type()); } vars["key_wire_type"] = "::google::protobuf::internal::WireFormatLite::TYPE_" + ToUpper(DeclaredTypeMethodName(key->type())); vars["val_wire_type"] = "::google::protobuf::internal::WireFormatLite::TYPE_" + ToUpper(DeclaredTypeMethodName(val->type())); if (descriptor->file()->syntax() != FileDescriptor::SYNTAX_PROTO3 && val->type() == FieldDescriptor::TYPE_ENUM) { const EnumValueDescriptor* default_value = val->default_value_enum(); vars["default_enum_value"] = Int32ToString(default_value->number()); } else { vars["default_enum_value"] = "0"; } } // Does the given field have a private (internal helper only) has_$name$() // method? bool HasPrivateHasMethod(const FieldDescriptor* field) { // Only for oneofs in message types with no field presence. has_$name$(), // based on the oneof case, is still useful internally for generated code. return (!HasFieldPresence(field->file()) && field->containing_oneof() != NULL); } bool TableDrivenParsingEnabled( const Descriptor* descriptor, const Options& options) { if (!options.table_driven_parsing) { return false; } // Consider table-driven parsing. We only do this if: // - We have has_bits for fields. This avoids a check on every field we set // when are present (the common case). if (!HasFieldPresence(descriptor->file())) { return false; } const double table_sparseness = 0.5; int max_field_number = 0; for (int i = 0; i < descriptor->field_count(); i++) { const FieldDescriptor* field = descriptor->field(i); if (max_field_number < field->number()) { max_field_number = field->number(); } // - There are no weak fields. if (field->options().weak()) { return false; } } // - There range of field numbers is "small" if (max_field_number >= (2 << 14)) { return false; } // - Field numbers are relatively dense within the actual number of fields. // We check for strictly greater than in the case where there are no fields // (only extensions) so max_field_number == descriptor->field_count() == 0. if (max_field_number * table_sparseness > descriptor->field_count()) { return false; } // - This is not a MapEntryMessage. if (IsMapEntryMessage(descriptor)) { return false; } return true; } void SetUnknkownFieldsVariable(const Descriptor* descriptor, const Options& options, std::map* variables) { if (UseUnknownFieldSet(descriptor->file(), options)) { (*variables)["unknown_fields_type"] = "::google::protobuf::UnknownFieldSet"; } else { (*variables)["unknown_fields_type"] = "::std::string"; } if (AlwaysPreserveUnknownFields(descriptor)) { (*variables)["have_unknown_fields"] = "_internal_metadata_.have_unknown_fields()"; (*variables)["unknown_fields"] = "_internal_metadata_.unknown_fields()"; } else { (*variables)["have_unknown_fields"] = "(_internal_metadata_.have_unknown_fields() && " " ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())"; (*variables)["unknown_fields"] = "(::google::protobuf::internal::GetProto3PreserveUnknownsDefault()" " ? _internal_metadata_.unknown_fields()" " : _internal_metadata_.default_instance())"; } (*variables)["mutable_unknown_fields"] = "_internal_metadata_.mutable_unknown_fields()"; } bool IsCrossFileMapField(const FieldDescriptor* field) { if (!field->is_map()) { return false; } const Descriptor* d = field->message_type(); const FieldDescriptor* value = d->FindFieldByNumber(2); return IsCrossFileMessage(value); } bool IsCrossFileMaybeMap(const FieldDescriptor* field) { if (IsCrossFileMapField(field)) { return true; } return IsCrossFileMessage(field); } } // anonymous namespace // =================================================================== MessageGenerator::MessageGenerator(const Descriptor* descriptor, int index_in_file_messages, const Options& options, SCCAnalyzer* scc_analyzer) : descriptor_(descriptor), index_in_file_messages_(index_in_file_messages), classname_(ClassName(descriptor, false)), options_(options), field_generators_(descriptor, options), max_has_bit_index_(0), enum_generators_( new google::protobuf::scoped_ptr[descriptor->enum_type_count()]), extension_generators_(new google::protobuf::scoped_ptr< ExtensionGenerator>[descriptor->extension_count()]), use_dependent_base_(false), num_weak_fields_(0), message_layout_helper_(new PaddingOptimizer()), scc_analyzer_(scc_analyzer) { // Compute optimized field order to be used for layout and initialization // purposes. for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->options().weak()) { num_weak_fields_++; } else if (!field->containing_oneof()) { optimized_order_.push_back(field); } } message_layout_helper_->OptimizeLayout(&optimized_order_, options_); if (HasFieldPresence(descriptor_->file())) { // We use -1 as a sentinel. has_bit_indices_.resize(descriptor_->field_count(), -1); for (int i = 0; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; // Skip fields that do not have has bits. if (field->is_repeated()) { continue; } has_bit_indices_[field->index()] = max_has_bit_index_++; } } for (int i = 0; i < descriptor->enum_type_count(); i++) { enum_generators_[i].reset( new EnumGenerator(descriptor->enum_type(i), options)); } for (int i = 0; i < descriptor->extension_count(); i++) { extension_generators_[i].reset( new ExtensionGenerator(descriptor->extension(i), options)); } num_required_fields_ = 0; for (int i = 0; i < descriptor->field_count(); i++) { if (descriptor->field(i)->is_required()) { ++num_required_fields_; } if (options.proto_h && IsFieldDependent(descriptor->field(i))) { use_dependent_base_ = true; } } if (options.proto_h && descriptor->oneof_decl_count() > 0) { // Always make oneofs dependent. use_dependent_base_ = true; } table_driven_ = TableDrivenParsingEnabled(descriptor_, options_); scc_name_ = ClassName(scc_analyzer_->GetSCC(descriptor_)->GetRepresentative(), false); } MessageGenerator::~MessageGenerator() {} size_t MessageGenerator::HasBitsSize() const { size_t sizeof_has_bits = (max_has_bit_index_ + 31) / 32 * 4; if (sizeof_has_bits == 0) { // Zero-size arrays aren't technically allowed, and MSVC in particular // doesn't like them. We still need to declare these arrays to make // other code compile. Since this is an uncommon case, we'll just declare // them with size 1 and waste some space. Oh well. sizeof_has_bits = 4; } return sizeof_has_bits; } void MessageGenerator::AddGenerators( std::vector* enum_generators, std::vector* extension_generators) { for (int i = 0; i < descriptor_->enum_type_count(); i++) { enum_generators->push_back(enum_generators_[i].get()); } for (int i = 0; i < descriptor_->extension_count(); i++) { extension_generators->push_back(extension_generators_[i].get()); } } void MessageGenerator::FillMessageForwardDeclarations( std::map* class_names) { (*class_names)[classname_] = descriptor_; } void MessageGenerator:: GenerateDependentFieldAccessorDeclarations(io::Printer* printer) { for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); PrintFieldComment(printer, field); std::map vars; SetCommonFieldVariables(field, &vars, options_); // Generate type-specific accessor declarations. field_generators_.get(field).GenerateDependentAccessorDeclarations(printer); printer->Print("\n"); } } void MessageGenerator:: GenerateFieldAccessorDeclarations(io::Printer* printer) { // optimized_fields_ does not contain fields where // field->containing_oneof() != NULL // so we need to iterate over those as well. // // We place the non-oneof fields in optimized_order_, as that controls the // order of the _has_bits_ entries and we want GDB's pretty printers to be // able to infer these indices from the k[FIELDNAME]FieldNumber order. std::vector ordered_fields; ordered_fields.reserve(descriptor_->field_count()); ordered_fields.insert( ordered_fields.begin(), optimized_order_.begin(), optimized_order_.end()); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->containing_oneof() == NULL && !field->options().weak()) { continue; } ordered_fields.push_back(field); } for (int i = 0; i < ordered_fields.size(); i++) { const FieldDescriptor* field = ordered_fields[i]; PrintFieldComment(printer, field); std::map vars; SetCommonFieldVariables(field, &vars, options_); vars["constant_name"] = FieldConstantName(field); bool dependent_field = use_dependent_base_ && IsFieldDependent(field); if (dependent_field && field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && !field->is_map()) { // If this field is dependent, the dependent base class determines // the message type from the derived class (which is a template // parameter). This typedef is for that: printer->Print( "private:\n" "typedef $field_type$ $dependent_type$;\n" "public:\n", "field_type", FieldMessageTypeName(field), "dependent_type", DependentTypeName(field)); } if (field->is_repeated()) { printer->Print(vars, "$deprecated_attr$int ${$$name$_size$}$() const;\n"); printer->Annotate("{", "}", field); } else if (HasHasMethod(field)) { printer->Print(vars, "$deprecated_attr$bool ${$has_$name$$}$() const;\n"); printer->Annotate("{", "}", field); } else if (HasPrivateHasMethod(field)) { printer->Print(vars, "private:\n" "bool ${$has_$name$$}$() const;\n" "public:\n"); printer->Annotate("{", "}", field); } printer->Print(vars, "$deprecated_attr$void ${$clear_$name$$}$();\n"); printer->Annotate("{", "}", field); printer->Print(vars, "$deprecated_attr$static const int $constant_name$ = " "$number$;\n"); printer->Annotate("constant_name", field); // Generate type-specific accessor declarations. field_generators_.get(field).GenerateAccessorDeclarations(printer); printer->Print("\n"); } if (descriptor_->extension_range_count() > 0) { // Generate accessors for extensions. We just call a macro located in // extension_set.h since the accessors about 80 lines of static code. printer->Print( "GOOGLE_PROTOBUF_EXTENSION_ACCESSORS($classname$)\n", "classname", classname_); } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "$camel_oneof_name$Case $oneof_name$_case() const;\n", "camel_oneof_name", UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true), "oneof_name", descriptor_->oneof_decl(i)->name()); } } void MessageGenerator:: GenerateDependentFieldAccessorDefinitions(io::Printer* printer) { if (!use_dependent_base_) return; printer->Print("// $classname$\n\n", "classname", DependentBaseClassTemplateName(descriptor_)); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->options().weak()) continue; PrintFieldComment(printer, field); // Generate type-specific accessors. field_generators_.get(field) .GenerateDependentInlineAccessorDefinitions(printer); printer->Print("\n"); } // Generate has_$name$() and clear_has_$name$() functions for oneofs // Similar to other has-bits, these must always be in the header if we // are using a dependent base class. GenerateOneofHasBits(printer); } void MessageGenerator:: GenerateSingularFieldHasBits(const FieldDescriptor* field, std::map vars, io::Printer* printer) { if (field->options().weak()) { printer->Print( vars, "inline bool $classname$::has_$name$() const {\n" " return _weak_field_map_.Has($number$);\n" "}\n"); return; } if (HasFieldPresence(descriptor_->file())) { // N.B.: without field presence, we do not use has-bits or generate // has_$name$() methods. int has_bit_index = has_bit_indices_[field->index()]; GOOGLE_CHECK_GE(has_bit_index, 0); vars["has_array_index"] = SimpleItoa(has_bit_index / 32); vars["has_mask"] = StrCat(strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8)); printer->Print(vars, "inline bool $classname$::has_$name$() const {\n" " return (_has_bits_[$has_array_index$] & 0x$has_mask$u) != 0;\n" "}\n" "inline void $classname$::set_has_$name$() {\n" " _has_bits_[$has_array_index$] |= 0x$has_mask$u;\n" "}\n" "inline void $classname$::clear_has_$name$() {\n" " _has_bits_[$has_array_index$] &= ~0x$has_mask$u;\n" "}\n"); } else { // Message fields have a has_$name$() method. if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { bool is_lazy = false; if (is_lazy) { printer->Print(vars, "inline bool $classname$::has_$name$() const {\n" " return !$name$_.IsCleared();\n" "}\n"); } else { printer->Print( vars, "inline bool $classname$::has_$name$() const {\n" " return this != internal_default_instance() && $name$_ != NULL;\n" "}\n"); } } } } void MessageGenerator:: GenerateOneofHasBits(io::Printer* printer) { for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { std::map vars; vars["oneof_name"] = descriptor_->oneof_decl(i)->name(); vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index()); vars["cap_oneof_name"] = ToUpper(descriptor_->oneof_decl(i)->name()); vars["classname"] = classname_; printer->Print( vars, "inline bool $classname$::has_$oneof_name$() const {\n" " return $oneof_name$_case() != $cap_oneof_name$_NOT_SET;\n" "}\n" "inline void $classname$::clear_has_$oneof_name$() {\n" " _oneof_case_[$oneof_index$] = $cap_oneof_name$_NOT_SET;\n" "}\n"); } } void MessageGenerator:: GenerateOneofMemberHasBits(const FieldDescriptor* field, const std::map& vars, io::Printer* printer) { // Singular field in a oneof // N.B.: Without field presence, we do not use has-bits or generate // has_$name$() methods, but oneofs still have set_has_$name$(). // Oneofs also have has_$name$() but only as a private helper // method, so that generated code is slightly cleaner (vs. comparing // _oneof_case_[index] against a constant everywhere). printer->Print(vars, "inline bool $classname$::has_$name$() const {\n" " return $oneof_name$_case() == k$field_name$;\n" "}\n"); printer->Print(vars, "inline void $classname$::set_has_$name$() {\n" " _oneof_case_[$oneof_index$] = k$field_name$;\n" "}\n"); } void MessageGenerator:: GenerateFieldClear(const FieldDescriptor* field, const std::map& vars, bool is_inline, io::Printer* printer) { // Generate clear_$name$(). if (is_inline) { printer->Print("inline "); } printer->Print(vars, "void $classname$::clear_$name$() {\n"); printer->Indent(); if (field->containing_oneof()) { // Clear this field only if it is the active field in this oneof, // otherwise ignore printer->Print(vars, "if (has_$name$()) {\n"); printer->Indent(); field_generators_.get(field) .GenerateClearingCode(printer); printer->Print(vars, "clear_has_$oneof_name$();\n"); printer->Outdent(); printer->Print("}\n"); } else { field_generators_.get(field) .GenerateClearingCode(printer); if (HasFieldPresence(descriptor_->file())) { if (!field->is_repeated() && !field->options().weak()) { printer->Print(vars, "clear_has_$name$();\n"); } } } printer->Outdent(); printer->Print("}\n"); } void MessageGenerator:: GenerateFieldAccessorDefinitions(io::Printer* printer) { printer->Print("// $classname$\n\n", "classname", classname_); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); PrintFieldComment(printer, field); std::map vars; SetCommonFieldVariables(field, &vars, options_); if (use_dependent_base_ && IsFieldDependent(field)) { vars["tmpl"] = "template\n"; vars["dependent_classname"] = DependentBaseClassTemplateName(descriptor_) + ""; vars["this_message"] = "reinterpret_cast(this)->"; vars["this_const_message"] = "reinterpret_cast(this)->"; } else { vars["tmpl"] = ""; vars["dependent_classname"] = vars["classname"]; vars["this_message"] = ""; vars["this_const_message"] = ""; } // Generate has_$name$() or $name$_size(). if (field->is_repeated()) { printer->Print(vars, "inline int $classname$::$name$_size() const {\n" " return $name$_.size();\n" "}\n"); } else if (field->containing_oneof()) { vars["field_name"] = UnderscoresToCamelCase(field->name(), true); vars["oneof_name"] = field->containing_oneof()->name(); vars["oneof_index"] = SimpleItoa(field->containing_oneof()->index()); GenerateOneofMemberHasBits(field, vars, printer); } else { // Singular field. GenerateSingularFieldHasBits(field, vars, printer); } if (!IsCrossFileMaybeMap(field)) { GenerateFieldClear(field, vars, true, printer); } // Generate type-specific accessors. field_generators_.get(field).GenerateInlineAccessorDefinitions(printer); printer->Print("\n"); } if (!use_dependent_base_) { // Generate has_$name$() and clear_has_$name$() functions for oneofs // If we aren't using a dependent base, they can be with the other functions // that are #ifdef-guarded. GenerateOneofHasBits(printer); } } void MessageGenerator:: GenerateDependentBaseClassDefinition(io::Printer* printer) { if (!use_dependent_base_) { return; } std::map vars; vars["classname"] = DependentBaseClassTemplateName(descriptor_); vars["full_name"] = descriptor_->full_name(); vars["superclass"] = SuperClassName(descriptor_, options_); printer->Print(vars, "template \n" "class $classname$ : public $superclass$ " "/* @@protoc_insertion_point(dep_base_class_definition:$full_name$) */ {\n" " public:\n"); printer->Indent(); printer->Print(vars, "$classname$() {}\n" "virtual ~$classname$() {}\n" "\n"); // Generate dependent accessor methods for all fields. GenerateDependentFieldAccessorDeclarations(printer); printer->Outdent(); printer->Print("};\n"); } void MessageGenerator:: GenerateClassDefinition(io::Printer* printer) { if (IsMapEntryMessage(descriptor_)) { std::map vars; vars["classname"] = classname_; CollectMapInfo(descriptor_, &vars); vars["lite"] = HasDescriptorMethods(descriptor_->file(), options_) ? "" : "Lite"; printer->Print( vars, "class $classname$ : public " "::google::protobuf::internal::MapEntry$lite$<$classname$, \n" " $key_cpp$, $val_cpp$,\n" " $key_wire_type$,\n" " $val_wire_type$,\n" " $default_enum_value$ > {\n" "public:\n" " typedef ::google::protobuf::internal::MapEntry$lite$<$classname$, \n" " $key_cpp$, $val_cpp$,\n" " $key_wire_type$,\n" " $val_wire_type$,\n" " $default_enum_value$ > SuperType;\n" " $classname$();\n" " $classname$(::google::protobuf::Arena* arena);\n" " void MergeFrom(const $classname$& other);\n" " static const $classname$* internal_default_instance() { return " "reinterpret_cast(&_$classname$_default_instance_); }\n"); if (HasDescriptorMethods(descriptor_->file(), options_)) { printer->Print( " void MergeFrom(const ::google::protobuf::Message& other) PROTOBUF_FINAL;\n" " ::google::protobuf::Metadata GetMetadata() const;\n" "};\n"); } else { printer->Print("};\n"); } return; } if (use_dependent_base_) { GenerateDependentBaseClassDefinition(printer); printer->Print("\n"); } std::map vars; vars["classname"] = classname_; vars["full_name"] = descriptor_->full_name(); vars["field_count"] = SimpleItoa(descriptor_->field_count()); vars["oneof_decl_count"] = SimpleItoa(descriptor_->oneof_decl_count()); if (options_.dllexport_decl.empty()) { vars["dllexport"] = ""; } else { vars["dllexport"] = options_.dllexport_decl + " "; } if (use_dependent_base_) { vars["superclass"] = DependentBaseClassTemplateName(descriptor_) + "<" + classname_ + ">"; } else { vars["superclass"] = SuperClassName(descriptor_, options_); } printer->Print(vars, "class $dllexport$$classname$ : public $superclass$ " "/* @@protoc_insertion_point(class_definition:$full_name$) */ " "{\n"); printer->Annotate("classname", descriptor_); if (use_dependent_base_) { printer->Print(vars, " friend class $superclass$;\n"); } printer->Print(" public:\n"); printer->Indent(); printer->Print( vars, "$classname$();\n" "virtual ~$classname$();\n" "\n" "$classname$(const $classname$& from);\n" "\n" "inline $classname$& operator=(const $classname$& from) {\n" " CopyFrom(from);\n" " return *this;\n" "}\n"); if (options_.table_driven_serialization) { printer->Print( "private:\n" "const void* InternalGetTable() const;\n" "public:\n" "\n"); } // Generate move constructor and move assignment operator. printer->Print(vars, "#if LANG_CXX11\n" "$classname$($classname$&& from) noexcept\n" " : $classname$() {\n" " *this = ::std::move(from);\n" "}\n" "\n" "inline $classname$& operator=($classname$&& from) noexcept {\n" " if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {\n" " if (this != &from) InternalSwap(&from);\n" " } else {\n" " CopyFrom(from);\n" " }\n" " return *this;\n" "}\n" "#endif\n"); SetUnknkownFieldsVariable(descriptor_, options_, &vars); if (PublicUnknownFieldsAccessors(descriptor_)) { printer->Print(vars, "inline const $unknown_fields_type$& unknown_fields() const {\n" " return $unknown_fields$;\n" "}\n" "inline $unknown_fields_type$* mutable_unknown_fields() {\n" " return $mutable_unknown_fields$;\n" "}\n" "\n"); } // N.B.: We exclude GetArena() when arena support is disabled, falling back on // MessageLite's implementation which returns NULL rather than generating our // own method which returns NULL, in order to reduce code size. if (SupportsArenas(descriptor_)) { // virtual method version of GetArenaNoVirtual(), required for generic dispatch given a // MessageLite* (e.g., in RepeatedField::AddAllocated()). printer->Print( "inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL {\n" " return GetArenaNoVirtual();\n" "}\n" "inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL {\n" " return MaybeArenaPtr();\n" "}\n"); } // Only generate this member if it's not disabled. if (HasDescriptorMethods(descriptor_->file(), options_) && !descriptor_->options().no_standard_descriptor_accessor()) { printer->Print(vars, "static const ::google::protobuf::Descriptor* descriptor();\n"); } printer->Print(vars, "static const $classname$& default_instance();\n" "\n"); // Generate enum values for every field in oneofs. One list is generated for // each oneof with an additional *_NOT_SET value. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "enum $camel_oneof_name$Case {\n", "camel_oneof_name", UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true)); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { printer->Print( "k$field_name$ = $field_number$,\n", "field_name", UnderscoresToCamelCase( descriptor_->oneof_decl(i)->field(j)->name(), true), "field_number", SimpleItoa(descriptor_->oneof_decl(i)->field(j)->number())); } printer->Print( "$cap_oneof_name$_NOT_SET = 0,\n", "cap_oneof_name", ToUpper(descriptor_->oneof_decl(i)->name())); printer->Outdent(); printer->Print( "};\n" "\n"); } // TODO(gerbens) make this private, while still granting other protos access. vars["message_index"] = SimpleItoa(index_in_file_messages_); printer->Print( vars, "static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY\n" "static inline const $classname$* internal_default_instance() {\n" " return reinterpret_cast(\n" " &_$classname$_default_instance_);\n" "}\n" "static PROTOBUF_CONSTEXPR int const kIndexInFileMessages =\n" " $message_index$;\n" "\n"); if (SupportsArenas(descriptor_)) { printer->Print(vars, "void UnsafeArenaSwap($classname$* other);\n"); } if (IsAnyMessage(descriptor_)) { printer->Print(vars, "// implements Any -----------------------------------------------\n" "\n" "void PackFrom(const ::google::protobuf::Message& message);\n" "void PackFrom(const ::google::protobuf::Message& message,\n" " const ::std::string& type_url_prefix);\n" "bool UnpackTo(::google::protobuf::Message* message) const;\n" "template bool Is() const {\n" " return _any_metadata_.Is();\n" "}\n" "\n"); } vars["new_final"] = " PROTOBUF_FINAL"; printer->Print(vars, "void Swap($classname$* other);\n" "friend void swap($classname$& a, $classname$& b) {\n" " a.Swap(&b);\n" "}\n" "\n" "// implements Message ----------------------------------------------\n" "\n" "inline $classname$* New() const$new_final$ { return New(NULL); }\n" "\n" "$classname$* New(::google::protobuf::Arena* arena) const$new_final$;\n"); // For instances that derive from Message (rather than MessageLite), some // methods are virtual and should be marked as final. string use_final = HasDescriptorMethods(descriptor_->file(), options_) ? " PROTOBUF_FINAL" : ""; if (HasGeneratedMethods(descriptor_->file(), options_)) { if (HasDescriptorMethods(descriptor_->file(), options_)) { printer->Print(vars, "void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;\n" "void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL;\n"); } else { printer->Print(vars, "void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from)\n" " PROTOBUF_FINAL;\n"); } vars["clear_final"] = " PROTOBUF_FINAL"; vars["is_initialized_final"] = " PROTOBUF_FINAL"; vars["merge_partial_final"] = " PROTOBUF_FINAL"; printer->Print( vars, "void CopyFrom(const $classname$& from);\n" "void MergeFrom(const $classname$& from);\n" "void Clear()$clear_final$;\n" "bool IsInitialized() const$is_initialized_final$;\n" "\n" "size_t ByteSizeLong() const PROTOBUF_FINAL;\n" "bool MergePartialFromCodedStream(\n" " ::google::protobuf::io::CodedInputStream* input)$merge_partial_final$;\n"); if (!options_.table_driven_serialization || descriptor_->options().message_set_wire_format()) { printer->Print( "void SerializeWithCachedSizes(\n" " ::google::protobuf::io::CodedOutputStream* output) const " "PROTOBUF_FINAL;\n"); } // DiscardUnknownFields() is implemented in message.cc using reflections. We // need to implement this function in generated code for messages. if (!UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print( "void DiscardUnknownFields()$final$;\n", "final", use_final); } if (HasFastArraySerialization(descriptor_->file(), options_)) { printer->Print( "::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(\n" " bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL;\n"); } } printer->Print( "int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; }\n" "private:\n" "void SharedCtor();\n" "void SharedDtor();\n" "void SetCachedSize(int size) const$final$;\n" "void InternalSwap($classname$* other);\n", "classname", classname_, "final", use_final); if (SupportsArenas(descriptor_)) { printer->Print( // TODO(gerbens) Make this private! Currently people are deriving from // protos to give access to this constructor, breaking the invariants // we rely on. "protected:\n" "explicit $classname$(::google::protobuf::Arena* arena);\n" "private:\n" "static void ArenaDtor(void* object);\n" "inline void RegisterArenaDtor(::google::protobuf::Arena* arena);\n", "classname", classname_); } if (SupportsArenas(descriptor_)) { printer->Print( "private:\n" "inline ::google::protobuf::Arena* GetArenaNoVirtual() const {\n" " return _internal_metadata_.arena();\n" "}\n" "inline void* MaybeArenaPtr() const {\n" " return _internal_metadata_.raw_arena_ptr();\n" "}\n"); } else { printer->Print( "private:\n" "inline ::google::protobuf::Arena* GetArenaNoVirtual() const {\n" " return NULL;\n" "}\n" "inline void* MaybeArenaPtr() const {\n" " return NULL;\n" "}\n"); } printer->Print( "public:\n" "\n"); if (HasDescriptorMethods(descriptor_->file(), options_)) { printer->Print( "::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL;\n" "\n"); } else { printer->Print( "::std::string GetTypeName() const PROTOBUF_FINAL;\n" "\n"); } printer->Print( "// nested types ----------------------------------------------------\n" "\n"); // Import all nested message classes into this class's scope with typedefs. for (int i = 0; i < descriptor_->nested_type_count(); i++) { const Descriptor* nested_type = descriptor_->nested_type(i); if (!IsMapEntryMessage(nested_type)) { printer->Print("typedef $nested_full_name$ $nested_name$;\n", "nested_name", nested_type->name(), "nested_full_name", ClassName(nested_type, false)); printer->Annotate("nested_full_name", nested_type); printer->Annotate("nested_name", nested_type); } } if (descriptor_->nested_type_count() > 0) { printer->Print("\n"); } // Import all nested enums and their values into this class's scope with // typedefs and constants. for (int i = 0; i < descriptor_->enum_type_count(); i++) { enum_generators_[i]->GenerateSymbolImports(printer); printer->Print("\n"); } printer->Print( "// accessors -------------------------------------------------------\n" "\n"); // Generate accessor methods for all fields. GenerateFieldAccessorDeclarations(printer); // Declare extension identifiers. for (int i = 0; i < descriptor_->extension_count(); i++) { extension_generators_[i]->GenerateDeclaration(printer); } printer->Print( "// @@protoc_insertion_point(class_scope:$full_name$)\n", "full_name", descriptor_->full_name()); // Generate private members. printer->Outdent(); printer->Print(" private:\n"); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { if (!descriptor_->field(i)->is_repeated() && !descriptor_->field(i)->options().weak()) { // set_has_***() generated in all proto1/2 code and in oneofs (only) for // messages without true field presence. if (HasFieldPresence(descriptor_->file()) || descriptor_->field(i)->containing_oneof()) { printer->Print("void set_has_$name$();\n", "name", FieldName(descriptor_->field(i))); } // clear_has_***() generated only for non-oneof fields // in proto1/2. if (!descriptor_->field(i)->containing_oneof() && HasFieldPresence(descriptor_->file())) { printer->Print("void clear_has_$name$();\n", "name", FieldName(descriptor_->field(i))); } } } printer->Print("\n"); // Generate oneof function declarations for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "inline bool has_$oneof_name$() const;\n" "void clear_$oneof_name$();\n" "inline void clear_has_$oneof_name$();\n\n", "oneof_name", descriptor_->oneof_decl(i)->name()); } if (HasGeneratedMethods(descriptor_->file(), options_) && !descriptor_->options().message_set_wire_format() && num_required_fields_ > 1) { printer->Print( "// helper for ByteSizeLong()\n" "size_t RequiredFieldsByteSizeFallback() const;\n\n"); } // Prepare decls for _cached_size_ and _has_bits_. Their position in the // output will be determined later. bool need_to_emit_cached_size = true; // TODO(kenton): Make _cached_size_ an atomic when C++ supports it. const string cached_size_decl = "mutable int _cached_size_;\n"; const size_t sizeof_has_bits = HasBitsSize(); const string has_bits_decl = sizeof_has_bits == 0 ? "" : "::google::protobuf::internal::HasBits<" + SimpleItoa(sizeof_has_bits / 4) + "> _has_bits_;\n"; // To minimize padding, data members are divided into three sections: // (1) members assumed to align to 8 bytes // (2) members corresponding to message fields, re-ordered to optimize // alignment. // (3) members assumed to align to 4 bytes. // Members assumed to align to 8 bytes: if (descriptor_->extension_range_count() > 0) { printer->Print( "::google::protobuf::internal::ExtensionSet _extensions_;\n" "\n"); } if (UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print( "::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;\n"); } else { printer->Print( "::google::protobuf::internal::InternalMetadataWithArenaLite " "_internal_metadata_;\n"); } if (SupportsArenas(descriptor_)) { printer->Print( "template friend class ::google::protobuf::Arena::InternalHelper;\n" "typedef void InternalArenaConstructable_;\n" "typedef void DestructorSkippable_;\n"); } if (HasFieldPresence(descriptor_->file())) { // _has_bits_ is frequently accessed, so to reduce code size and improve // speed, it should be close to the start of the object. But, try not to // waste space:_has_bits_ by itself always makes sense if its size is a // multiple of 8, but, otherwise, maybe _has_bits_ and cached_size_ together // will work well. printer->Print(has_bits_decl.c_str()); if ((sizeof_has_bits % 8) != 0) { printer->Print(cached_size_decl.c_str()); need_to_emit_cached_size = false; } } // Field members: // Emit some private and static members for (int i = 0; i < optimized_order_.size(); ++i) { const FieldDescriptor* field = optimized_order_[i]; const FieldGenerator& generator = field_generators_.get(field); generator.GenerateStaticMembers(printer); generator.GeneratePrivateMembers(printer); } // For each oneof generate a union for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "union $camel_oneof_name$Union {\n" // explicit empty constructor is needed when union contains // ArenaStringPtr members for string fields. " $camel_oneof_name$Union() {}\n", "camel_oneof_name", UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true)); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { field_generators_.get(descriptor_->oneof_decl(i)-> field(j)).GeneratePrivateMembers(printer); } printer->Outdent(); printer->Print( "} $oneof_name$_;\n", "oneof_name", descriptor_->oneof_decl(i)->name()); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { field_generators_.get(descriptor_->oneof_decl(i)-> field(j)).GenerateStaticMembers(printer); } } // Members assumed to align to 4 bytes: if (need_to_emit_cached_size) { printer->Print(cached_size_decl.c_str()); need_to_emit_cached_size = false; } // Generate _oneof_case_. if (descriptor_->oneof_decl_count() > 0) { printer->Print(vars, "::google::protobuf::uint32 _oneof_case_[$oneof_decl_count$];\n" "\n"); } if (num_weak_fields_) { printer->Print( "::google::protobuf::internal::WeakFieldMap _weak_field_map_;\n"); } // Generate _any_metadata_ for the Any type. if (IsAnyMessage(descriptor_)) { printer->Print(vars, "::google::protobuf::internal::AnyMetadata _any_metadata_;\n"); } // The TableStruct struct needs access to the private parts, in order to // construct the offsets of all members. // TODO(gerbens) Remove the friend for InitDefaults. printer->Print( "friend struct ::$file_namespace$::TableStruct;\n" "friend void ::$file_namespace$::InitDefaults$scc_name$Impl();\n", // Vars. "scc_name", scc_name_, "file_namespace", FileLevelNamespace(descriptor_)); printer->Outdent(); printer->Print("};"); GOOGLE_DCHECK(!need_to_emit_cached_size); } void MessageGenerator:: GenerateDependentInlineMethods(io::Printer* printer) { if (IsMapEntryMessage(descriptor_)) return; for (int i = 0; i < descriptor_->field_count(); i++) { if (descriptor_->field(i)->options().weak()) { field_generators_.get(descriptor_->field(i)) .GenerateDependentInlineAccessorDefinitions(printer); } } GenerateDependentFieldAccessorDefinitions(printer); } void MessageGenerator:: GenerateInlineMethods(io::Printer* printer) { if (IsMapEntryMessage(descriptor_)) return; GenerateFieldAccessorDefinitions(printer); // Generate oneof_case() functions. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { std::map vars; vars["class_name"] = classname_; vars["camel_oneof_name"] = UnderscoresToCamelCase( descriptor_->oneof_decl(i)->name(), true); vars["oneof_name"] = descriptor_->oneof_decl(i)->name(); vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index()); printer->Print( vars, "inline $class_name$::$camel_oneof_name$Case $class_name$::" "$oneof_name$_case() const {\n" " return $class_name$::$camel_oneof_name$Case(" "_oneof_case_[$oneof_index$]);\n" "}\n"); } } void MessageGenerator:: GenerateExtraDefaultFields(io::Printer* printer) { // Generate oneof default instance and weak field instances for reflection // usage. if (descriptor_->oneof_decl_count() > 0 || num_weak_fields_ > 0) { for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE || (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING && EffectiveStringCType(field) != FieldOptions::STRING)) { printer->Print("const "); } field_generators_.get(field).GeneratePrivateMembers(printer); } } for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->options().weak()) { printer->Print( " const ::google::protobuf::Message* $name$_;\n", "name", FieldName(field)); } } } } bool MessageGenerator::GenerateParseTable(io::Printer* printer, size_t offset, size_t aux_offset) { if (!table_driven_) { printer->Print("{ NULL, NULL, 0, -1, -1, -1, -1, NULL, false },\n"); return false; } std::map vars; vars["classname"] = ClassName(descriptor_); vars["classtype"] = QualifiedClassName(descriptor_); vars["offset"] = SimpleItoa(offset); vars["aux_offset"] = SimpleItoa(aux_offset); int max_field_number = 0; for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (max_field_number < field->number()) { max_field_number = field->number(); } } vars["max_field_number"] = SimpleItoa(max_field_number); printer->Print("{\n"); printer->Indent(); printer->Print(vars, "TableStruct::entries + $offset$,\n" "TableStruct::aux + $aux_offset$,\n" "$max_field_number$,\n"); if (!HasFieldPresence(descriptor_->file())) { // If we don't have field presence, then _has_bits_ does not exist. printer->Print(vars, "-1,\n"); } else { printer->Print(vars, "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(\n" " $classtype$, _has_bits_),\n"); } if (descriptor_->oneof_decl_count() > 0) { printer->Print(vars, "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(\n" " $classtype$, _oneof_case_),\n"); } else { printer->Print("-1, // no _oneof_case_\n"); } if (descriptor_->extension_range_count() > 0) { printer->Print(vars, "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classtype$, " "_extensions_),\n"); } else { printer->Print("-1, // no _extensions_\n"); } // TODO(ckennelly): Consolidate this with the calculation for // AuxillaryParseTableField. vars["ns"] = Namespace(descriptor_); printer->Print(vars, "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(\n" " $classtype$, _internal_metadata_),\n" "&$ns$::_$classname$_default_instance_,\n"); if (UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print(vars, "true,\n"); } else { printer->Print(vars, "false,\n"); } printer->Outdent(); printer->Print("},\n"); return true; } void MessageGenerator::GenerateSchema(io::Printer* printer, int offset, int has_offset) { std::map vars; vars["classname"] = QualifiedClassName(descriptor_); vars["offset"] = SimpleItoa(offset); vars["has_bits_offsets"] = HasFieldPresence(descriptor_->file()) || IsMapEntryMessage(descriptor_) ? SimpleItoa(offset + has_offset) : "-1"; printer->Print(vars, "{ $offset$, $has_bits_offsets$, sizeof($classname$)},\n"); } namespace { // TODO(gerbens) remove this after the next sync with GitHub code base. // Then the opensource testing has gained the functionality to compile // the CalcFieldNum given the symbols defined in generated-message-util. #ifdef OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP // We need a clean version of CalcFieldNum that doesn't use new functionality // in the runtime, because this functionality is not yet in the opensource // runtime uint32 CalculateType(uint32 type, uint32 type_class) { return (type - 1) + type_class * 20; } uint32 CalcFieldNum(const FieldDescriptor* field, const Options& options) { bool is_a_map = IsMapEntryMessage(field->containing_type()); int type = field->type(); if (field->containing_oneof()) { return CalculateType(type, 4); } if (field->is_packed()) { return CalculateType(type, 3); } else if (field->is_repeated()) { return CalculateType(type, 2); } else if (!HasFieldPresence(field->file()) && field->containing_oneof() == NULL && !is_a_map) { return CalculateType(type, 1); } else { return CalculateType(type, 0); } } #else // We need to calculate for each field what function the table driven code // should use to serialize it. This returns the index in a lookup table. uint32 CalcFieldNum(const FieldDescriptor* field, const Options& options) { bool is_a_map = IsMapEntryMessage(field->containing_type()); int type = field->type(); if (field->containing_oneof()) { return internal::FieldMetadata::CalculateType( type, internal::FieldMetadata::kOneOf); } if (field->is_packed()) { return internal::FieldMetadata::CalculateType( type, internal::FieldMetadata::kPacked); } else if (field->is_repeated()) { return internal::FieldMetadata::CalculateType( type, internal::FieldMetadata::kRepeated); } else if (!HasFieldPresence(field->file()) && field->containing_oneof() == NULL && !is_a_map) { return internal::FieldMetadata::CalculateType( type, internal::FieldMetadata::kNoPresence); } else { return internal::FieldMetadata::CalculateType( type, internal::FieldMetadata::kPresence); } } #endif int FindMessageIndexInFile(const Descriptor* descriptor) { std::vector flatten = FlattenMessagesInFile(descriptor->file()); return std::find(flatten.begin(), flatten.end(), descriptor) - flatten.begin(); } } // namespace int MessageGenerator::GenerateFieldMetadata(io::Printer* printer) { if (!options_.table_driven_serialization) { return 0; } string full_classname = QualifiedClassName(descriptor_); std::vector sorted = SortFieldsByNumber(descriptor_); if (IsMapEntryMessage(descriptor_)) { for (int i = 0; i < 2; i++) { const FieldDescriptor* field = sorted[i]; uint32 tag = internal::WireFormatLite::MakeTag( field->number(), WireFormat::WireTypeForFieldType(field->type())); std::map vars; vars["classname"] = QualifiedClassName(descriptor_); vars["field_name"] = FieldName(field); vars["tag"] = SimpleItoa(tag); vars["hasbit"] = SimpleItoa(i); vars["type"] = SimpleItoa(CalcFieldNum(field, options_)); vars["ptr"] = "NULL"; if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { GOOGLE_CHECK(!IsMapEntryMessage(field->message_type())); { vars["ptr"] = "::" + FileLevelNamespace(field->message_type()) + "::TableStruct::serialization_table + " + SimpleItoa(FindMessageIndexInFile(field->message_type())); } } printer->Print(vars, "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(" "::google::protobuf::internal::MapEntryHelper<$classname$::" "SuperType>, $field_name$_), $tag$," "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(" "::google::protobuf::internal::MapEntryHelper<$classname$::" "SuperType>, _has_bits_) * 8 + $hasbit$, $type$, " "$ptr$},\n"); } return 2; } printer->Print( "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, " "_cached_size_), 0, 0, 0, NULL},\n", "classname", full_classname); std::vector sorted_extensions; 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(), ExtensionRangeSorter()); for (int i = 0, extension_idx = 0; /* no range */; i++) { for (; extension_idx < sorted_extensions.size() && (i == sorted.size() || sorted_extensions[extension_idx]->start < sorted[i]->number()); extension_idx++) { const Descriptor::ExtensionRange* range = sorted_extensions[extension_idx]; printer->Print( "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, " "_extensions_), $start$, $end$, " "::google::protobuf::internal::FieldMetadata::kSpecial, " "reinterpret_cast(::google::protobuf::internal::ExtensionSerializer)},\n", "classname", full_classname, "start", SimpleItoa(range->start), "end", SimpleItoa(range->end)); } if (i == sorted.size()) break; const FieldDescriptor* field = sorted[i]; uint32 tag = internal::WireFormatLite::MakeTag( field->number(), WireFormat::WireTypeForFieldType(field->type())); if (field->is_packed()) { tag = internal::WireFormatLite::MakeTag( field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED); } string classfieldname = FieldName(field); if (field->containing_oneof()) { classfieldname = field->containing_oneof()->name(); } std::map vars; vars["classname"] = full_classname; vars["field_name"] = classfieldname; vars["tag"] = SimpleItoa(tag); vars["ptr"] = "NULL"; if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { if (IsMapEntryMessage(field->message_type())) { vars["idx"] = SimpleItoa(FindMessageIndexInFile(field->message_type())); vars["fieldclassname"] = QualifiedClassName(field->message_type()); printer->Print(vars, "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($" "classname$, $field_name$_), $tag$, $idx$, " "::google::protobuf::internal::FieldMetadata::kSpecial, " "reinterpret_cast(static_cast< " "::google::protobuf::internal::SpecialSerializer>(" "::google::protobuf::internal::MapFieldSerializer< " "::google::protobuf::internal::MapEntryToMapField<" "$fieldclassname$>::MapFieldType, " "TableStruct::serialization_table>))},\n"); continue; } else { vars["ptr"] = "::" + FileLevelNamespace(field->message_type()) + "::TableStruct::serialization_table + " + SimpleItoa(FindMessageIndexInFile(field->message_type())); } } vars["type"] = SimpleItoa(CalcFieldNum(field, options_)); if (field->options().weak()) { // TODO(gerbens) merge weak fields into ranges printer->Print(vars, "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($" "classname$, _weak_field_map_), $tag$, $tag$, " "::google::protobuf::internal::FieldMetadata::kSpecial, " "reinterpret_cast(::google::protobuf::internal::WeakFieldSerializer)},\n"); } else if (field->containing_oneof()) { vars["oneofoffset"] = SimpleItoa(sizeof(uint32) * field->containing_oneof()->index()); printer->Print(vars, "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($" "classname$, $field_name$_), $tag$, " "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($" "classname$, _oneof_case_) + $oneofoffset$, " "$type$, $ptr$},\n"); } else if (HasFieldPresence(descriptor_->file()) && has_bit_indices_[field->index()] != -1) { vars["hasbitsoffset"] = SimpleItoa(has_bit_indices_[field->index()]); printer->Print(vars, "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($" "classname$, $field_name$_), $tag$, " "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($" "classname$, _has_bits_) * 8 + $hasbitsoffset$, $type$, " "$ptr$},\n"); } else { printer->Print(vars, "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($" "classname$, $field_name$_), $tag$, ~0u, $type$, " "$ptr$},\n"); } } int num_field_metadata = 1 + sorted.size() + sorted_extensions.size(); num_field_metadata++; string serializer = UseUnknownFieldSet(descriptor_->file(), options_) ? "::google::protobuf::internal::UnknownFieldSetSerializer" : "::google::protobuf::internal::UnknownFieldSerializerLite"; printer->Print( "{GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, " "_internal_metadata_), 0, ~0u, " "::google::protobuf::internal::FieldMetadata::kSpecial, reinterpret_cast($serializer$)},\n", "classname", full_classname, "serializer", serializer); return num_field_metadata; } void MessageGenerator::GenerateFieldDefaultInstances(io::Printer* printer) { // Construct the default instances for all fields that need one. for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(descriptor_->field(i)) .GenerateDefaultInstanceAllocator(printer); } } void MessageGenerator:: GenerateDefaultInstanceInitializer(io::Printer* printer) { // The default instance needs all of its embedded message pointers // cross-linked to other default instances. We can't do this initialization // in the constructor because some other default instances may not have been // constructed yet at that time. // TODO(kenton): Maybe all message fields (even for non-default messages) // should be initialized to point at default instances rather than NULL? for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (!field->is_repeated() && field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && (field->containing_oneof() == NULL || HasDescriptorMethods(descriptor_->file(), options_))) { string name; if (field->containing_oneof() || field->options().weak()) { name = "_" + classname_ + "_default_instance_."; } else { name = "_" + classname_ + "_default_instance_._instance.get_mutable()->"; } name += FieldName(field); printer->Print( "$ns$::$name$_ = const_cast< $type$*>(\n" " $type$::internal_default_instance());\n", // Vars. "name", name, "type", FieldMessageTypeName(field), "ns", Namespace(descriptor_)); } else if (field->containing_oneof() && HasDescriptorMethods(descriptor_->file(), options_)) { field_generators_.get(descriptor_->field(i)) .GenerateConstructorCode(printer); } } } void MessageGenerator:: GenerateClassMethods(io::Printer* printer) { if (IsMapEntryMessage(descriptor_)) { printer->Print( "$classname$::$classname$() {}\n" "$classname$::$classname$(::google::protobuf::Arena* arena) : " "SuperType(arena) {}\n" "void $classname$::MergeFrom(const $classname$& other) {\n" " MergeFromInternal(other);\n" "}\n", "classname", classname_); if (HasDescriptorMethods(descriptor_->file(), options_)) { printer->Print( "::google::protobuf::Metadata $classname$::GetMetadata() const {\n" " ::$file_namespace$::protobuf_AssignDescriptorsOnce();\n" " return ::$file_namespace$::file_level_metadata[$index$];\n" "}\n" "void $classname$::MergeFrom(\n" " const ::google::protobuf::Message& other) {\n" " ::google::protobuf::Message::MergeFrom(other);\n" "}\n" "\n", "file_namespace", FileLevelNamespace(descriptor_), "classname", classname_, "index", SimpleItoa(index_in_file_messages_)); } return; } // TODO(gerbens) Remove this function. With a little bit of cleanup and // refactoring this is superfluous. printer->Print("void $classname$::InitAsDefaultInstance() {\n", "classname", classname_); printer->Indent(); GenerateDefaultInstanceInitializer(printer); printer->Outdent(); printer->Print("}\n"); if (IsAnyMessage(descriptor_)) { printer->Print( "void $classname$::PackFrom(const ::google::protobuf::Message& message) {\n" " _any_metadata_.PackFrom(message);\n" "}\n" "\n" "void $classname$::PackFrom(const ::google::protobuf::Message& message,\n" " const ::std::string& type_url_prefix) {\n" " _any_metadata_.PackFrom(message, type_url_prefix);\n" "}\n" "\n" "bool $classname$::UnpackTo(::google::protobuf::Message* message) const {\n" " return _any_metadata_.UnpackTo(message);\n" "}\n" "\n", "classname", classname_); } // Generate non-inline field definitions. for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); field_generators_.get(field) .GenerateNonInlineAccessorDefinitions(printer); if (IsCrossFileMaybeMap(field)) { std::map vars; SetCommonFieldVariables(field, &vars, options_); if (field->containing_oneof()) { SetCommonOneofFieldVariables(field, &vars); } GenerateFieldClear(field, vars, false, printer); } } // Generate field number constants. printer->Print("#if !defined(_MSC_VER) || _MSC_VER >= 1900\n"); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor *field = descriptor_->field(i); printer->Print( "const int $classname$::$constant_name$;\n", "classname", ClassName(FieldScope(field), false), "constant_name", FieldConstantName(field)); } printer->Print( "#endif // !defined(_MSC_VER) || _MSC_VER >= 1900\n" "\n"); GenerateStructors(printer); printer->Print("\n"); if (descriptor_->oneof_decl_count() > 0) { GenerateOneofClear(printer); printer->Print("\n"); } if (HasGeneratedMethods(descriptor_->file(), options_)) { GenerateClear(printer); printer->Print("\n"); GenerateMergeFromCodedStream(printer); printer->Print("\n"); GenerateSerializeWithCachedSizes(printer); printer->Print("\n"); if (HasFastArraySerialization(descriptor_->file(), options_)) { GenerateSerializeWithCachedSizesToArray(printer); printer->Print("\n"); } GenerateByteSize(printer); printer->Print("\n"); GenerateMergeFrom(printer); printer->Print("\n"); GenerateCopyFrom(printer); printer->Print("\n"); GenerateIsInitialized(printer); printer->Print("\n"); } GenerateSwap(printer); printer->Print("\n"); if (options_.table_driven_serialization) { printer->Print( "const void* $classname$::InternalGetTable() const {\n" " return ::$file_namespace$::TableStruct::serialization_table + " "$index$;\n" "}\n" "\n", "classname", classname_, "index", SimpleItoa(index_in_file_messages_), "file_namespace", FileLevelNamespace(descriptor_)); } if (HasDescriptorMethods(descriptor_->file(), options_)) { printer->Print( "::google::protobuf::Metadata $classname$::GetMetadata() const {\n" " $file_namespace$::protobuf_AssignDescriptorsOnce();\n" " return ::" "$file_namespace$::file_level_metadata[kIndexInFileMessages];\n" "}\n" "\n", "classname", classname_, "file_namespace", FileLevelNamespace(descriptor_)); } else { printer->Print( "::std::string $classname$::GetTypeName() const {\n" " return \"$type_name$\";\n" "}\n" "\n", "classname", classname_, "type_name", descriptor_->full_name()); } } size_t MessageGenerator::GenerateParseOffsets(io::Printer* printer) { if (!table_driven_) { return 0; } // Field "0" is special: We use it in our switch statement of processing // types to handle the successful end tag case. printer->Print("{0, 0, 0, ::google::protobuf::internal::kInvalidMask, 0, 0},\n"); int last_field_number = 1; std::vector ordered_fields = SortFieldsByNumber(descriptor_); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = ordered_fields[i]; GOOGLE_CHECK_GE(field->number(), last_field_number); for (; last_field_number < field->number(); last_field_number++) { printer->Print( "{ 0, 0, ::google::protobuf::internal::kInvalidMask,\n" " ::google::protobuf::internal::kInvalidMask, 0, 0 },\n"); } last_field_number++; unsigned char normal_wiretype, packed_wiretype, processing_type; normal_wiretype = WireFormat::WireTypeForFieldType(field->type()); if (field->is_packable()) { packed_wiretype = WireFormatLite::WIRETYPE_LENGTH_DELIMITED; } else { packed_wiretype = internal::kNotPackedMask; } processing_type = static_cast(field->type()); if (field->type() == FieldDescriptor::TYPE_STRING) { switch (EffectiveStringCType(field)) { case FieldOptions::STRING: default: break; } } else if (field->type() == FieldDescriptor::TYPE_BYTES) { switch (EffectiveStringCType(field)) { case FieldOptions::STRING: default: break; } } processing_type |= static_cast( field->is_repeated() ? internal::kRepeatedMask : 0); processing_type |= static_cast( field->containing_oneof() ? internal::kOneofMask : 0); if (field->is_map()) { processing_type = internal::TYPE_MAP; } const unsigned char tag_size = WireFormat::TagSize(field->number(), field->type()); std::map vars; vars["classname"] = QualifiedClassName(descriptor_); if (field->containing_oneof() != NULL) { vars["name"] = field->containing_oneof()->name(); vars["presence"] = SimpleItoa(field->containing_oneof()->index()); } else { vars["name"] = FieldName(field); vars["presence"] = SimpleItoa(has_bit_indices_[field->index()]); } vars["nwtype"] = SimpleItoa(normal_wiretype); vars["pwtype"] = SimpleItoa(packed_wiretype); vars["ptype"] = SimpleItoa(processing_type); vars["tag_size"] = SimpleItoa(tag_size); printer->Print(vars, "{\n" " GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(\n" " $classname$, $name$_),\n" " static_cast< ::google::protobuf::uint32>($presence$),\n" " $nwtype$, $pwtype$, $ptype$, $tag_size$\n" "},\n"); } return last_field_number; } size_t MessageGenerator::GenerateParseAuxTable(io::Printer* printer) { if (!table_driven_) { return 0; } std::vector ordered_fields = SortFieldsByNumber(descriptor_); printer->Print("::google::protobuf::internal::AuxillaryParseTableField(),\n"); int last_field_number = 1; for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = ordered_fields[i]; GOOGLE_CHECK_GE(field->number(), last_field_number); for (; last_field_number < field->number(); last_field_number++) { printer->Print("::google::protobuf::internal::AuxillaryParseTableField(),\n"); } std::map vars; SetCommonFieldVariables(field, &vars, options_); switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_ENUM: vars["type"] = ClassName(field->enum_type(), true); printer->Print( vars, "{::google::protobuf::internal::AuxillaryParseTableField::enum_aux{" "$type$_IsValid}},\n"); last_field_number++; break; case FieldDescriptor::CPPTYPE_MESSAGE: { if (field->is_map()) { vars["classname"] = QualifiedClassName(field->message_type()); printer->Print(vars, "{::google::protobuf::internal::AuxillaryParseTableField::map_" "aux{&::google::protobuf::internal::ParseMap<$classname$>}},\n"); last_field_number++; break; } else { vars["classname"] = ClassName(field->message_type(), false); } vars["ns"] = Namespace(field->message_type()); vars["type"] = FieldMessageTypeName(field); vars["file_namespace"] = FileLevelNamespace(field->message_type()); printer->Print( vars, "{::google::protobuf::internal::AuxillaryParseTableField::message_aux{\n" " &$ns$::_$classname$_default_instance_,\n"); bool dont_emit_table = !TableDrivenParsingEnabled(field->message_type(), options_); if (dont_emit_table) { printer->Print(" NULL,\n"); } else { printer->Print(vars, " ::$file_namespace$::TableStruct::schema +\n" " $ns$::$classname$::kIndexInFileMessages,\n"); } printer->Print("}},\n"); last_field_number++; break; } case FieldDescriptor::CPPTYPE_STRING: switch (EffectiveStringCType(field)) { case FieldOptions::STRING: vars["default"] = field->default_value_string().empty() ? "&::google::protobuf::internal::fixed_address_empty_string" : "&" + Namespace(field) + " ::" + classname_ + "::_default_" + FieldName(field) + "_"; break; case FieldOptions::CORD: case FieldOptions::STRING_PIECE: vars["default"] = "\"" + CEscape(field->default_value_string()) + "\""; break; } vars["full_name"] = field->full_name(); printer->Print(vars, "{::google::protobuf::internal::AuxillaryParseTableField::string_aux{\n" " $default$,\n" " \"$full_name$\"\n" "}},\n"); last_field_number++; break; default: break; } } return last_field_number; } std::pair MessageGenerator::GenerateOffsets( io::Printer* printer) { std::map variables; string full_classname = QualifiedClassName(descriptor_); variables["classname"] = full_classname; if (HasFieldPresence(descriptor_->file()) || IsMapEntryMessage(descriptor_)) { printer->Print( variables, "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, " "_has_bits_),\n"); } else { printer->Print("~0u, // no _has_bits_\n"); } printer->Print(variables, "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, " "_internal_metadata_),\n"); if (descriptor_->extension_range_count() > 0) { printer->Print( variables, "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, " "_extensions_),\n"); } else { printer->Print("~0u, // no _extensions_\n"); } if (descriptor_->oneof_decl_count() > 0) { printer->Print(variables, "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(" "$classname$, _oneof_case_[0]),\n"); } else { printer->Print("~0u, // no _oneof_case_\n"); } if (num_weak_fields_ > 0) { printer->Print(variables, "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$," " _weak_field_map_),\n"); } else { printer->Print("~0u, // no _weak_field_map_\n"); } const int kNumGenericOffsets = 5; // the number of fixed offsets above const size_t offsets = kNumGenericOffsets + descriptor_->field_count() + descriptor_->oneof_decl_count(); size_t entries = offsets; for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->containing_oneof() || field->options().weak()) { printer->Print("offsetof($classname$DefaultTypeInternal, $name$_),\n", "classname", full_classname, "name", FieldName(field)); } else { printer->Print( "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, " "$name$_),\n", "classname", full_classname, "name", FieldName(field)); } } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { const OneofDescriptor* oneof = descriptor_->oneof_decl(i); printer->Print( "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, $name$_),\n", "classname", full_classname, "name", oneof->name()); } if (IsMapEntryMessage(descriptor_)) { entries += 2; printer->Print( "0,\n" "1,\n"); } else if (HasFieldPresence(descriptor_->file())) { entries += has_bit_indices_.size(); for (int i = 0; i < has_bit_indices_.size(); i++) { const string index = has_bit_indices_[i] >= 0 ? SimpleItoa(has_bit_indices_[i]) : "~0u"; printer->Print("$index$,\n", "index", index); } } return std::make_pair(entries, offsets); } void MessageGenerator:: GenerateSharedConstructorCode(io::Printer* printer) { printer->Print( "void $classname$::SharedCtor() {\n", "classname", classname_); printer->Indent(); bool need_to_clear_cached_size = true; // We reproduce the logic used for laying out _cached_sized_ in the class // definition, as to initialize it in-order. if (HasFieldPresence(descriptor_->file()) && (HasBitsSize() % 8) != 0) { printer->Print("_cached_size_ = 0;\n"); need_to_clear_cached_size = false; } std::vector processed(optimized_order_.size(), false); GenerateConstructorBody(printer, processed, false); for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "clear_has_$oneof_name$();\n", "oneof_name", descriptor_->oneof_decl(i)->name()); } if (need_to_clear_cached_size) { printer->Print("_cached_size_ = 0;\n"); } printer->Outdent(); printer->Print("}\n\n"); } void MessageGenerator:: GenerateSharedDestructorCode(io::Printer* printer) { printer->Print( "void $classname$::SharedDtor() {\n", "classname", classname_); printer->Indent(); if (SupportsArenas(descriptor_)) { printer->Print( "GOOGLE_DCHECK(GetArenaNoVirtual() == NULL);\n"); } // Write the destructors for each field except oneof members. // optimized_order_ does not contain oneof fields. for (int i = 0; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; field_generators_.get(field).GenerateDestructorCode(printer); } // Generate code to destruct oneofs. Clearing should do the work. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "if (has_$oneof_name$()) {\n" " clear_$oneof_name$();\n" "}\n", "oneof_name", descriptor_->oneof_decl(i)->name()); } if (num_weak_fields_) { printer->Print("_weak_field_map_.ClearAll();\n"); } printer->Outdent(); printer->Print( "}\n" "\n"); } void MessageGenerator:: GenerateArenaDestructorCode(io::Printer* printer) { // Generate the ArenaDtor() method. Track whether any fields actually produced // code that needs to be called. printer->Print( "void $classname$::ArenaDtor(void* object) {\n", "classname", classname_); printer->Indent(); // This code is placed inside a static method, rather than an ordinary one, // since that simplifies Arena's destructor list (ordinary function pointers // rather than member function pointers). _this is the object being // destructed. printer->Print( "$classname$* _this = reinterpret_cast< $classname$* >(object);\n" // avoid an "unused variable" warning in case no fields have dtor code. "(void)_this;\n", "classname", classname_); bool need_registration = false; // Process non-oneof fields first. for (int i = 0; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; if (field_generators_.get(field) .GenerateArenaDestructorCode(printer)) { need_registration = true; } } // Process oneof fields. // // Note: As of 10/5/2016, GenerateArenaDestructorCode does not emit anything // and returns false for oneof fields. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { const OneofDescriptor* oneof = descriptor_->oneof_decl(i); for (int j = 0; j < oneof->field_count(); j++) { const FieldDescriptor* field = oneof->field(j); if (field_generators_.get(field) .GenerateArenaDestructorCode(printer)) { need_registration = true; } } } if (num_weak_fields_) { // _this is the object being destructed (we are inside a static method // here). printer->Print("_this->_weak_field_map_.ClearAll();\n"); need_registration = true; } printer->Outdent(); printer->Print( "}\n"); if (need_registration) { printer->Print( "inline void $classname$::RegisterArenaDtor(::google::protobuf::Arena* arena) {\n" " if (arena != NULL) {\n" " arena->OwnCustomDestructor(this, &$classname$::ArenaDtor);\n" " }\n" "}\n", "classname", classname_); } else { printer->Print( "void $classname$::RegisterArenaDtor(::google::protobuf::Arena* arena) {\n" "}\n", "classname", classname_); } } void MessageGenerator::GenerateConstructorBody(io::Printer* printer, std::vector processed, bool copy_constructor) const { const FieldDescriptor* last_start = NULL; // RunMap maps from fields that start each run to the number of fields in that // run. This is optimized for the common case that there are very few runs in // a message and that most of the eligible fields appear together. typedef hash_map RunMap; RunMap runs; for (int i = 0; i < optimized_order_.size(); ++i) { const FieldDescriptor* field = optimized_order_[i]; if ((copy_constructor && IsPOD(field)) || (!copy_constructor && CanConstructByZeroing(field, options_))) { if (last_start == NULL) { last_start = field; } runs[last_start]++; } else { last_start = NULL; } } string pod_template; if (copy_constructor) { pod_template = "::memcpy(&$first$_, &from.$first$_,\n" " static_cast(reinterpret_cast(&$last$_) -\n" " reinterpret_cast(&$first$_)) + sizeof($last$_));\n"; } else { pod_template = "::memset(&$first$_, 0, static_cast(\n" " reinterpret_cast(&$last$_) -\n" " reinterpret_cast(&$first$_)) + sizeof($last$_));\n"; } for (int i = 0; i < optimized_order_.size(); ++i) { if (processed[i]) { continue; } const FieldDescriptor* field = optimized_order_[i]; RunMap::const_iterator it = runs.find(field); // We only apply the memset technique to runs of more than one field, as // assignment is better than memset for generated code clarity. if (it != runs.end() && it->second > 1) { // Use a memset, then skip run_length fields. const size_t run_length = it->second; const string first_field_name = FieldName(field); const string last_field_name = FieldName(optimized_order_[i + run_length - 1]); printer->Print(pod_template.c_str(), "first", first_field_name, "last", last_field_name); i += run_length - 1; // ++i at the top of the loop. } else { if (copy_constructor) { field_generators_.get(field).GenerateCopyConstructorCode(printer); } else { field_generators_.get(field).GenerateConstructorCode(printer); } } } } void MessageGenerator:: GenerateStructors(io::Printer* printer) { string superclass; if (use_dependent_base_) { superclass = DependentBaseClassTemplateName(descriptor_) + "<" + classname_ + ">"; } else { superclass = SuperClassName(descriptor_, options_); } string initializer_with_arena = superclass + "()"; if (descriptor_->extension_range_count() > 0) { initializer_with_arena += ",\n _extensions_(arena)"; } initializer_with_arena += ",\n _internal_metadata_(arena)"; // Initialize member variables with arena constructor. for (int i = 0; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; bool has_arena_constructor = field->is_repeated(); if (has_arena_constructor) { initializer_with_arena += string(",\n ") + FieldName(field) + string("_(arena)"); } } if (IsAnyMessage(descriptor_)) { initializer_with_arena += ",\n _any_metadata_(&type_url_, &value_)"; } if (num_weak_fields_ > 0) { initializer_with_arena += ", _weak_field_map_(arena)"; } string initializer_null = superclass + "(), _internal_metadata_(NULL)"; if (IsAnyMessage(descriptor_)) { initializer_null += ", _any_metadata_(&type_url_, &value_)"; } if (num_weak_fields_ > 0) { initializer_null += ", _weak_field_map_(NULL)"; } printer->Print( "$classname$::$classname$()\n" " : $initializer$ {\n" " if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) {\n" " ::$file_namespace$::InitDefaults$scc_name$();\n" " }\n" " SharedCtor();\n" " // @@protoc_insertion_point(constructor:$full_name$)\n" "}\n", "classname", classname_, "full_name", descriptor_->full_name(), "scc_name", scc_name_, "initializer", initializer_null, "file_namespace", FileLevelNamespace(descriptor_)); if (SupportsArenas(descriptor_)) { printer->Print( "$classname$::$classname$(::google::protobuf::Arena* arena)\n" " : $initializer$ {\n" " ::$file_namespace$::InitDefaults$scc_name$();\n" " SharedCtor();\n" " RegisterArenaDtor(arena);\n" " // @@protoc_insertion_point(arena_constructor:$full_name$)\n" "}\n", "initializer", initializer_with_arena, "classname", classname_, "superclass", superclass, "full_name", descriptor_->full_name(), "scc_name", scc_name_, "file_namespace", FileLevelNamespace(descriptor_)); } // Generate the copy constructor. printer->Print( "$classname$::$classname$(const $classname$& from)\n" " : $superclass$()", "classname", classname_, "superclass", superclass, "full_name", descriptor_->full_name()); printer->Indent(); printer->Indent(); printer->Indent(); printer->Print( ",\n_internal_metadata_(NULL)"); if (HasFieldPresence(descriptor_->file())) { printer->Print(",\n_has_bits_(from._has_bits_)"); } bool need_to_emit_cached_size = true; const string cached_size_decl = ",\n_cached_size_(0)"; // We reproduce the logic used for laying out _cached_sized_ in the class // definition, as to initialize it in-order. if (HasFieldPresence(descriptor_->file()) && (HasBitsSize() % 8) != 0) { printer->Print(cached_size_decl.c_str()); need_to_emit_cached_size = false; } std::vector processed(optimized_order_.size(), false); for (int i = 0; i < optimized_order_.size(); ++i) { const FieldDescriptor* field = optimized_order_[i]; if (!(field->is_repeated() && !(field->is_map())) ) { continue; } processed[i] = true; printer->Print(",\n$name$_(from.$name$_)", "name", FieldName(field)); } if (need_to_emit_cached_size) { printer->Print(cached_size_decl.c_str()); need_to_emit_cached_size = false; } if (IsAnyMessage(descriptor_)) { printer->Print(",\n_any_metadata_(&type_url_, &value_)"); } if (num_weak_fields_ > 0) { printer->Print(",\n_weak_field_map_(from._weak_field_map_)"); } printer->Outdent(); printer->Outdent(); printer->Print(" {\n"); printer->Print( "_internal_metadata_.MergeFrom(from._internal_metadata_);\n"); if (descriptor_->extension_range_count() > 0) { printer->Print("_extensions_.MergeFrom(from._extensions_);\n"); } GenerateConstructorBody(printer, processed, true); // Copy oneof fields. Oneof field requires oneof case check. for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) { printer->Print( "clear_has_$oneofname$();\n" "switch (from.$oneofname$_case()) {\n", "oneofname", descriptor_->oneof_decl(i)->name()); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); printer->Print( "case k$field_name$: {\n", "field_name", UnderscoresToCamelCase(field->name(), true)); printer->Indent(); field_generators_.get(field).GenerateMergingCode(printer); printer->Print( "break;\n"); printer->Outdent(); printer->Print( "}\n"); } printer->Print( "case $cap_oneof_name$_NOT_SET: {\n" " break;\n" "}\n", "oneof_index", SimpleItoa(descriptor_->oneof_decl(i)->index()), "cap_oneof_name", ToUpper(descriptor_->oneof_decl(i)->name())); printer->Outdent(); printer->Print( "}\n"); } printer->Outdent(); printer->Print( " // @@protoc_insertion_point(copy_constructor:$full_name$)\n" "}\n" "\n", "full_name", descriptor_->full_name()); // Generate the shared constructor code. GenerateSharedConstructorCode(printer); // Generate the destructor. printer->Print( "$classname$::~$classname$() {\n" " // @@protoc_insertion_point(destructor:$full_name$)\n" " SharedDtor();\n" "}\n" "\n", "classname", classname_, "full_name", descriptor_->full_name()); // Generate the shared destructor code. GenerateSharedDestructorCode(printer); // Generate the arena-specific destructor code. if (SupportsArenas(descriptor_)) { GenerateArenaDestructorCode(printer); } // Generate SetCachedSize. printer->Print( "void $classname$::SetCachedSize(int size) const {\n" " GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n" " _cached_size_ = size;\n" " GOOGLE_SAFE_CONCURRENT_WRITES_END();\n" "}\n", "classname", classname_); // Only generate this member if it's not disabled. if (HasDescriptorMethods(descriptor_->file(), options_) && !descriptor_->options().no_standard_descriptor_accessor()) { printer->Print( "const ::google::protobuf::Descriptor* $classname$::descriptor() {\n" " ::$file_namespace$::protobuf_AssignDescriptorsOnce();\n" " return ::" "$file_namespace$::file_level_metadata[kIndexInFileMessages]." "descriptor;\n" "}\n" "\n", "classname", classname_, "file_namespace", FileLevelNamespace(descriptor_)); } printer->Print( "const $classname$& $classname$::default_instance() {\n" " ::$file_namespace$::InitDefaults$scc_name$();\n" " return *internal_default_instance();\n" "}\n\n", "classname", classname_, "scc_name", scc_name_, "file_namespace", FileLevelNamespace(descriptor_)); if (SupportsArenas(descriptor_)) { printer->Print( "$classname$* $classname$::New(::google::protobuf::Arena* arena) const {\n" " return ::google::protobuf::Arena::CreateMessage<$classname$>(arena);\n" "}\n", "classname", classname_); } else { printer->Print( "$classname$* $classname$::New(::google::protobuf::Arena* arena) const {\n" " $classname$* n = new $classname$;\n" " if (arena != NULL) {\n" " arena->Own(n);\n" " }\n" " return n;\n" "}\n", "classname", classname_); } } // Return the number of bits set in n, a non-negative integer. static int popcnt(uint32 n) { int result = 0; while (n != 0) { result += (n & 1); n = n / 2; } return result; } bool MessageGenerator::MaybeGenerateOptionalFieldCondition( io::Printer* printer, const FieldDescriptor* field, int expected_has_bits_index) { int has_bit_index = has_bit_indices_[field->index()]; if (!field->options().weak() && expected_has_bits_index == has_bit_index / 32) { const string mask = StrCat(strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8)); printer->Print( "if (cached_has_bits & 0x$mask$u) {\n", "mask", mask); return true; } return false; } void MessageGenerator:: GenerateClear(io::Printer* printer) { // Performance tuning parameters const int kMaxUnconditionalPrimitiveBytesClear = 4; printer->Print( "void $classname$::Clear() {\n" "// @@protoc_insertion_point(message_clear_start:$full_name$)\n", "classname", classname_, "full_name", descriptor_->full_name()); printer->Indent(); printer->Print( // TODO(jwb): It would be better to avoid emitting this if it is not used, // rather than emitting a workaround for the resulting warning. "::google::protobuf::uint32 cached_has_bits = 0;\n" "// Prevent compiler warnings about cached_has_bits being unused\n" "(void) cached_has_bits;\n\n"); int cached_has_bit_index = -1; // Step 1: Extensions if (descriptor_->extension_range_count() > 0) { printer->Print("_extensions_.Clear();\n"); } int last_i = -1; int unconditional_budget = kMaxUnconditionalPrimitiveBytesClear; for (int i = 0; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; if (!CanInitializeByZeroing(field)) { continue; } unconditional_budget -= EstimateAlignmentSize(field); } for (int i = 0; i < optimized_order_.size(); ) { // Detect infinite loops. GOOGLE_CHECK_NE(i, last_i); last_i = i; // Step 2: Repeated fields don't use _has_bits_; emit code to clear them // here. for (; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; const FieldGenerator& generator = field_generators_.get(field); if (!field->is_repeated()) { break; } generator.GenerateMessageClearingCode(printer); } // Step 3: Greedily seek runs of fields that can be cleared by // memset-to-0. int last_chunk = -1; int last_chunk_start = -1; int last_chunk_end = -1; uint32 last_chunk_mask = 0; int memset_run_start = -1; int memset_run_end = -1; for (; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; if (!CanInitializeByZeroing(field)) { break; } // "index" defines where in the _has_bits_ the field appears. // "i" is our loop counter within optimized_order_. int index = HasFieldPresence(descriptor_->file()) ? has_bit_indices_[field->index()] : 0; int chunk = index / 8; if (last_chunk == -1) { last_chunk = chunk; last_chunk_start = i; } else if (chunk != last_chunk) { // Emit the fields for this chunk so far. break; } if (memset_run_start == -1) { memset_run_start = i; } memset_run_end = i; last_chunk_end = i; last_chunk_mask |= static_cast(1) << (index % 32); } if (memset_run_start != memset_run_end && unconditional_budget >= 0) { // Flush the memset fields. goto flush; } // Step 4: Non-repeated, non-zero initializable fields. for (; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; if (field->is_repeated() || CanInitializeByZeroing(field)) { break; } // "index" defines where in the _has_bits_ the field appears. // "i" is our loop counter within optimized_order_. int index = HasFieldPresence(descriptor_->file()) ? has_bit_indices_[field->index()] : 0; int chunk = index / 8; if (last_chunk == -1) { last_chunk = chunk; last_chunk_start = i; } else if (chunk != last_chunk) { // Emit the fields for this chunk so far. break; } last_chunk_end = i; last_chunk_mask |= static_cast(1) << (index % 32); } flush: if (last_chunk != -1) { GOOGLE_DCHECK_NE(-1, last_chunk_start); GOOGLE_DCHECK_NE(-1, last_chunk_end); GOOGLE_DCHECK_NE(0, last_chunk_mask); const int count = popcnt(last_chunk_mask); const bool have_outer_if = HasFieldPresence(descriptor_->file()) && (last_chunk_start != last_chunk_end) && (memset_run_start != last_chunk_start || memset_run_end != last_chunk_end || unconditional_budget < 0); if (have_outer_if) { // 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 // _has_bits_[last_chunk * 8 / 32] multiple times. GOOGLE_DCHECK_LE(2, count); GOOGLE_DCHECK_GE(8, count); if (cached_has_bit_index != last_chunk / 4) { cached_has_bit_index = last_chunk / 4; printer->Print( "cached_has_bits = _has_bits_[$idx$];\n", "idx", SimpleItoa(cached_has_bit_index)); } printer->Print( "if (cached_has_bits & $mask$u) {\n", "mask", SimpleItoa(last_chunk_mask)); printer->Indent(); } if (memset_run_start != -1) { if (memset_run_start == memset_run_end) { // For clarity, do not memset a single field. const FieldGenerator& generator = field_generators_.get(optimized_order_[memset_run_start]); generator.GenerateMessageClearingCode(printer); } else { const string first_field_name = FieldName(optimized_order_[memset_run_start]); const string last_field_name = FieldName(optimized_order_[memset_run_end]); printer->Print( "::memset(&$first$_, 0, static_cast(\n" " reinterpret_cast(&$last$_) -\n" " reinterpret_cast(&$first$_)) + sizeof($last$_));\n", "first", first_field_name, "last", last_field_name); } // Advance last_chunk_start to skip over the fields we zeroed/memset. last_chunk_start = memset_run_end + 1; } // Go back and emit clears for each of the fields we processed. for (int j = last_chunk_start; j <= last_chunk_end; j++) { const FieldDescriptor* field = optimized_order_[j]; const string fieldname = FieldName(field); const FieldGenerator& generator = field_generators_.get(field); // It's faster to just overwrite primitive types, but we should only // clear strings and messages if they were set. // // TODO(kenton): Let the CppFieldGenerator decide this somehow. bool should_check_bit = field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE || field->cpp_type() == FieldDescriptor::CPPTYPE_STRING; bool have_enclosing_if = false; if (should_check_bit && // If no field presence, then always clear strings/messages as well. HasFieldPresence(descriptor_->file())) { if (!field->options().weak() && cached_has_bit_index != (has_bit_indices_[field->index()] / 32)) { cached_has_bit_index = (has_bit_indices_[field->index()] / 32); printer->Print("cached_has_bits = _has_bits_[$new_index$];\n", "new_index", SimpleItoa(cached_has_bit_index)); } if (!MaybeGenerateOptionalFieldCondition(printer, field, cached_has_bit_index)) { printer->Print( "if (has_$name$()) {\n", "name", fieldname); } printer->Indent(); have_enclosing_if = true; } generator.GenerateMessageClearingCode(printer); if (have_enclosing_if) { printer->Outdent(); printer->Print("}\n"); } } if (have_outer_if) { printer->Outdent(); printer->Print("}\n"); } } } // Step 4: Unions. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "clear_$oneof_name$();\n", "oneof_name", descriptor_->oneof_decl(i)->name()); } if (num_weak_fields_) { printer->Print("_weak_field_map_.ClearAll();\n"); } if (HasFieldPresence(descriptor_->file())) { // Step 5: Everything else. printer->Print("_has_bits_.Clear();\n"); } printer->Print("_internal_metadata_.Clear();\n"); printer->Outdent(); printer->Print("}\n"); } void MessageGenerator:: GenerateOneofClear(io::Printer* printer) { // Generated function clears the active field and union case (e.g. foo_case_). for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { std::map oneof_vars; oneof_vars["classname"] = classname_; oneof_vars["oneofname"] = descriptor_->oneof_decl(i)->name(); oneof_vars["full_name"] = descriptor_->full_name(); string message_class; printer->Print(oneof_vars, "void $classname$::clear_$oneofname$() {\n" "// @@protoc_insertion_point(one_of_clear_start:" "$full_name$)\n"); printer->Indent(); printer->Print(oneof_vars, "switch ($oneofname$_case()) {\n"); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); printer->Print( "case k$field_name$: {\n", "field_name", UnderscoresToCamelCase(field->name(), true)); printer->Indent(); // We clear only allocated objects in oneofs if (!IsStringOrMessage(field)) { printer->Print( "// No need to clear\n"); } else { field_generators_.get(field).GenerateClearingCode(printer); } printer->Print( "break;\n"); printer->Outdent(); printer->Print( "}\n"); } printer->Print( "case $cap_oneof_name$_NOT_SET: {\n" " break;\n" "}\n", "cap_oneof_name", ToUpper(descriptor_->oneof_decl(i)->name())); printer->Outdent(); printer->Print( "}\n" "_oneof_case_[$oneof_index$] = $cap_oneof_name$_NOT_SET;\n", "oneof_index", SimpleItoa(i), "cap_oneof_name", ToUpper(descriptor_->oneof_decl(i)->name())); printer->Outdent(); printer->Print( "}\n" "\n"); } } void MessageGenerator:: GenerateSwap(io::Printer* printer) { if (SupportsArenas(descriptor_)) { // Generate the Swap member function. This is a lightweight wrapper around // UnsafeArenaSwap() / MergeFrom() with temporaries, depending on the memory // ownership situation: swapping across arenas or between an arena and a // heap requires copying. printer->Print( "void $classname$::Swap($classname$* other) {\n" " if (other == this) return;\n" " if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {\n" " InternalSwap(other);\n" " } else {\n" " $classname$* temp = New(GetArenaNoVirtual());\n" " temp->MergeFrom(*other);\n" " other->CopyFrom(*this);\n" " InternalSwap(temp);\n" " if (GetArenaNoVirtual() == NULL) {\n" " delete temp;\n" " }\n" " }\n" "}\n" "void $classname$::UnsafeArenaSwap($classname$* other) {\n" " if (other == this) return;\n" " GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());\n" " InternalSwap(other);\n" "}\n", "classname", classname_); } else { printer->Print( "void $classname$::Swap($classname$* other) {\n" " if (other == this) return;\n" " InternalSwap(other);\n" "}\n", "classname", classname_); } // Generate the UnsafeArenaSwap member function. printer->Print("void $classname$::InternalSwap($classname$* other) {\n", "classname", classname_); printer->Indent(); printer->Print("using std::swap;\n"); if (HasGeneratedMethods(descriptor_->file(), options_)) { for (int i = 0; i < optimized_order_.size(); i++) { // optimized_order_ does not contain oneof fields, but the field // generators for these fields do not emit swapping code on their own. const FieldDescriptor* field = optimized_order_[i]; field_generators_.get(field).GenerateSwappingCode(printer); } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "swap($oneof_name$_, other->$oneof_name$_);\n" "swap(_oneof_case_[$i$], other->_oneof_case_[$i$]);\n", "oneof_name", descriptor_->oneof_decl(i)->name(), "i", SimpleItoa(i)); } if (HasFieldPresence(descriptor_->file())) { for (int i = 0; i < HasBitsSize() / 4; ++i) { printer->Print("swap(_has_bits_[$i$], other->_has_bits_[$i$]);\n", "i", SimpleItoa(i)); } } printer->Print("_internal_metadata_.Swap(&other->_internal_metadata_);\n"); printer->Print("swap(_cached_size_, other->_cached_size_);\n"); if (descriptor_->extension_range_count() > 0) { printer->Print("_extensions_.Swap(&other->_extensions_);\n"); } if (num_weak_fields_) { printer->Print( "_weak_field_map_.UnsafeArenaSwap(&other->_weak_field_map_);\n"); } } else { printer->Print("GetReflection()->Swap(this, other);"); } printer->Outdent(); printer->Print("}\n"); } void MessageGenerator:: GenerateMergeFrom(io::Printer* printer) { if (HasDescriptorMethods(descriptor_->file(), options_)) { // Generate the generalized MergeFrom (aka that which takes in the Message // base class as a parameter). printer->Print( "void $classname$::MergeFrom(const ::google::protobuf::Message& from) {\n" "// @@protoc_insertion_point(generalized_merge_from_start:" "$full_name$)\n" " GOOGLE_DCHECK_NE(&from, this);\n", "classname", classname_, "full_name", descriptor_->full_name()); printer->Indent(); // Cast the message to the proper type. If we find that the message is // *not* of the proper type, we can still call Merge via the reflection // system, as the GOOGLE_CHECK above ensured that we have the same descriptor // for each message. printer->Print( "const $classname$* source =\n" " ::google::protobuf::internal::DynamicCastToGenerated(\n" " &from);\n" "if (source == NULL) {\n" "// @@protoc_insertion_point(generalized_merge_from_cast_fail:" "$full_name$)\n" " ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n" "} else {\n" "// @@protoc_insertion_point(generalized_merge_from_cast_success:" "$full_name$)\n" " MergeFrom(*source);\n" "}\n", "classname", classname_, "full_name", descriptor_->full_name()); printer->Outdent(); printer->Print("}\n\n"); } else { // Generate CheckTypeAndMergeFrom(). printer->Print( "void $classname$::CheckTypeAndMergeFrom(\n" " const ::google::protobuf::MessageLite& from) {\n" " MergeFrom(*::google::protobuf::down_cast(&from));\n" "}\n" "\n", "classname", classname_); } // Generate the class-specific MergeFrom, which avoids the GOOGLE_CHECK and cast. printer->Print( "void $classname$::MergeFrom(const $classname$& from) {\n" "// @@protoc_insertion_point(class_specific_merge_from_start:" "$full_name$)\n" " GOOGLE_DCHECK_NE(&from, this);\n", "classname", classname_, "full_name", descriptor_->full_name()); printer->Indent(); if (descriptor_->extension_range_count() > 0) { printer->Print("_extensions_.MergeFrom(from._extensions_);\n"); } printer->Print( "_internal_metadata_.MergeFrom(from._internal_metadata_);\n" "::google::protobuf::uint32 cached_has_bits = 0;\n" "(void) cached_has_bits;\n\n"); // cached_has_bit_index maintains that: // cached_has_bits = from._has_bits_[cached_has_bit_index] // for cached_has_bit_index >= 0 int cached_has_bit_index = -1; int last_i = -1; for (int i = 0; i < optimized_order_.size(); ) { // Detect infinite loops. GOOGLE_CHECK_NE(i, last_i); last_i = i; // Merge Repeated fields. These fields do not require a // check as we can simply iterate over them. for (; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; if (!field->is_repeated()) { break; } const FieldGenerator& generator = field_generators_.get(field); generator.GenerateMergingCode(printer); } // Merge Optional and Required fields (after a _has_bit_ check). int last_chunk = -1; int last_chunk_start = -1; int last_chunk_end = -1; uint32 last_chunk_mask = 0; for (; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; if (field->is_repeated()) { break; } // "index" defines where in the _has_bits_ the field appears. // "i" is our loop counter within optimized_order_. int index = HasFieldPresence(descriptor_->file()) ? has_bit_indices_[field->index()] : 0; int chunk = index / 8; if (last_chunk == -1) { last_chunk = chunk; last_chunk_start = i; } else if (chunk != last_chunk) { // Emit the fields for this chunk so far. break; } last_chunk_end = i; last_chunk_mask |= static_cast(1) << (index % 32); } if (last_chunk != -1) { GOOGLE_DCHECK_NE(-1, last_chunk_start); GOOGLE_DCHECK_NE(-1, last_chunk_end); GOOGLE_DCHECK_NE(0, last_chunk_mask); const int count = popcnt(last_chunk_mask); const bool have_outer_if = HasFieldPresence(descriptor_->file()) && (last_chunk_start != last_chunk_end); if (have_outer_if) { // 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 // _has_bits_[last_chunk * 8 / 32] multiple times. GOOGLE_DCHECK_LE(2, count); GOOGLE_DCHECK_GE(8, count); if (cached_has_bit_index != last_chunk / 4) { int new_index = last_chunk / 4; printer->Print("cached_has_bits = from._has_bits_[$new_index$];\n", "new_index", SimpleItoa(new_index)); cached_has_bit_index = new_index; } printer->Print( "if (cached_has_bits & $mask$u) {\n", "mask", SimpleItoa(last_chunk_mask)); printer->Indent(); } // Go back and emit clears for each of the fields we processed. bool deferred_has_bit_changes = false; for (int j = last_chunk_start; j <= last_chunk_end; j++) { const FieldDescriptor* field = optimized_order_[j]; const FieldGenerator& generator = field_generators_.get(field); bool have_enclosing_if = false; if (HasFieldPresence(descriptor_->file())) { // Attempt to use the state of cached_has_bits, if possible. int has_bit_index = has_bit_indices_[field->index()]; if (!field->options().weak() && cached_has_bit_index == has_bit_index / 32) { const string mask = StrCat( strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8)); printer->Print( "if (cached_has_bits & 0x$mask$u) {\n", "mask", mask); } else { printer->Print( "if (from.has_$name$()) {\n", "name", FieldName(field)); } printer->Indent(); have_enclosing_if = true; } else { // Merge semantics without true field presence: primitive fields are // merged only if non-zero (numeric) or non-empty (string). have_enclosing_if = EmitFieldNonDefaultCondition( printer, "from.", field); } if (have_outer_if && IsPOD(field)) { // GenerateCopyConstructorCode for enum and primitive scalar fields // does not do _has_bits_ modifications. We defer _has_bits_ // manipulation until the end of the outer if. // // This can reduce the number of loads/stores by up to 7 per 8 fields. deferred_has_bit_changes = true; generator.GenerateCopyConstructorCode(printer); } else { generator.GenerateMergingCode(printer); } if (have_enclosing_if) { printer->Outdent(); printer->Print("}\n"); } } if (have_outer_if) { if (deferred_has_bit_changes) { // Flush the has bits for the primitives we deferred. GOOGLE_CHECK_LE(0, cached_has_bit_index); printer->Print( "_has_bits_[$index$] |= cached_has_bits;\n", "index", SimpleItoa(cached_has_bit_index)); } printer->Outdent(); printer->Print("}\n"); } } } // Merge oneof fields. Oneof field requires oneof case check. for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) { printer->Print( "switch (from.$oneofname$_case()) {\n", "oneofname", descriptor_->oneof_decl(i)->name()); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); printer->Print( "case k$field_name$: {\n", "field_name", UnderscoresToCamelCase(field->name(), true)); printer->Indent(); field_generators_.get(field).GenerateMergingCode(printer); printer->Print( "break;\n"); printer->Outdent(); printer->Print( "}\n"); } printer->Print( "case $cap_oneof_name$_NOT_SET: {\n" " break;\n" "}\n", "cap_oneof_name", ToUpper(descriptor_->oneof_decl(i)->name())); printer->Outdent(); printer->Print( "}\n"); } if (num_weak_fields_) { printer->Print("_weak_field_map_.MergeFrom(from._weak_field_map_);\n"); } printer->Outdent(); printer->Print("}\n"); } void MessageGenerator:: GenerateCopyFrom(io::Printer* printer) { if (HasDescriptorMethods(descriptor_->file(), options_)) { // Generate the generalized CopyFrom (aka that which takes in the Message // base class as a parameter). printer->Print( "void $classname$::CopyFrom(const ::google::protobuf::Message& from) {\n" "// @@protoc_insertion_point(generalized_copy_from_start:" "$full_name$)\n", "classname", classname_, "full_name", descriptor_->full_name()); printer->Indent(); printer->Print( "if (&from == this) return;\n" "Clear();\n" "MergeFrom(from);\n"); printer->Outdent(); printer->Print("}\n\n"); } // Generate the class-specific CopyFrom. printer->Print( "void $classname$::CopyFrom(const $classname$& from) {\n" "// @@protoc_insertion_point(class_specific_copy_from_start:" "$full_name$)\n", "classname", classname_, "full_name", descriptor_->full_name()); printer->Indent(); printer->Print( "if (&from == this) return;\n" "Clear();\n" "MergeFrom(from);\n"); printer->Outdent(); printer->Print("}\n"); } void MessageGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) { std::map vars; SetUnknkownFieldsVariable(descriptor_, options_, &vars); if (descriptor_->options().message_set_wire_format()) { // Special-case MessageSet. vars["classname"] = classname_; printer->Print(vars, "bool $classname$::MergePartialFromCodedStream(\n" " ::google::protobuf::io::CodedInputStream* input) {\n" " return _extensions_.ParseMessageSet(input,\n" " internal_default_instance(), $mutable_unknown_fields$);\n" "}\n"); return; } std::vector ordered_fields = SortFieldsByNumber(descriptor_); printer->Print( "bool $classname$::MergePartialFromCodedStream(\n" " ::google::protobuf::io::CodedInputStream* input) {\n", "classname", classname_); if (table_driven_) { printer->Indent(); const string lite = UseUnknownFieldSet(descriptor_->file(), options_) ? "" : "Lite"; printer->Print( "return ::google::protobuf::internal::MergePartialFromCodedStream$lite$(\n" " this,\n" " ::$file_namespace$::TableStruct::schema[\n" " $classname$::kIndexInFileMessages],\n" " input);\n", "classname", classname_, "file_namespace", FileLevelNamespace(descriptor_), "lite", lite); printer->Outdent(); printer->Print("}\n"); return; } printer->Print( "#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure\n" " ::google::protobuf::uint32 tag;\n"); if (!UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print( " ::google::protobuf::internal::LiteUnknownFieldSetter unknown_fields_setter(\n" " &_internal_metadata_);\n" " ::google::protobuf::io::StringOutputStream unknown_fields_output(\n" " unknown_fields_setter.buffer());\n" " ::google::protobuf::io::CodedOutputStream unknown_fields_stream(\n" " &unknown_fields_output, false);\n", "classname", classname_); } printer->Print( " // @@protoc_insertion_point(parse_start:$full_name$)\n", "full_name", descriptor_->full_name()); printer->Indent(); printer->Print("for (;;) {\n"); printer->Indent(); uint32 maxtag = descriptor_->field_count() == 0 ? 0 : WireFormat::MakeTag(ordered_fields[descriptor_->field_count() - 1]); const int kCutoff0 = 127; // fits in 1-byte varint const int kCutoff1 = (127 << 7) + 127; // fits in 2-byte varint // We need to capture the last tag when parsing if this is a Group type, as // our caller will verify (via CodedInputStream::LastTagWas) that the correct // closing tag was received. bool capture_last_tag = false; const Descriptor* parent = descriptor_->containing_type(); if (parent) { for (int i = 0; i < parent->field_count(); i++) { const FieldDescriptor* field = parent->field(i); if (field->type() == FieldDescriptor::TYPE_GROUP && field->message_type() == descriptor_) { capture_last_tag = true; break; } } } for (int i = 0; i < descriptor_->file()->extension_count(); i++) { const FieldDescriptor* field = descriptor_->file()->extension(i); if (field->type() == FieldDescriptor::TYPE_GROUP && field->message_type() == descriptor_) { capture_last_tag = true; break; } } printer->Print("::std::pair< ::google::protobuf::uint32, bool> p = " "input->ReadTagWithCutoffNoLastTag($max$u);\n" "tag = p.first;\n" "if (!p.second) goto handle_unusual;\n", "max", SimpleItoa(maxtag <= kCutoff0 ? kCutoff0 : (maxtag <= kCutoff1 ? kCutoff1 : maxtag))); if (descriptor_->field_count() > 0) { // We don't even want to print the switch() if we have no fields because // MSVC dislikes switch() statements that contain only a default value. // Note: If we just switched on the tag rather than the field number, we // could avoid the need for the if() to check the wire type at the beginning // of each case. However, this is actually a bit slower in practice as it // creates a jump table that is 8x larger and sparser, and meanwhile the // if()s are highly predictable. // // Historically, we inserted checks to peek at the next tag on the wire and // jump directly to the next case statement. While this avoids the jump // table that the switch uses, it greatly increases code size (20-60%) and // inserts branches that may fail (especially for real world protos that // interleave--in field number order--hot and cold fields). Loadtests // confirmed that removing this optimization is performance neutral. printer->Print("switch (::google::protobuf::internal::WireFormatLite::" "GetTagFieldNumber(tag)) {\n"); printer->Indent(); for (int i = 0; i < ordered_fields.size(); i++) { const FieldDescriptor* field = ordered_fields[i]; PrintFieldComment(printer, field); printer->Print( "case $number$: {\n", "number", SimpleItoa(field->number())); printer->Indent(); const FieldGenerator& field_generator = field_generators_.get(field); // Emit code to parse the common, expected case. printer->Print( "if (static_cast< ::google::protobuf::uint8>(tag) ==\n" " static_cast< ::google::protobuf::uint8>($truncated$u /* $full$ & 0xFF */)) {\n", "truncated", SimpleItoa(WireFormat::MakeTag(field) & 0xFF), "full", SimpleItoa(WireFormat::MakeTag(field))); printer->Indent(); if (field->is_packed()) { field_generator.GenerateMergeFromCodedStreamWithPacking(printer); } else { field_generator.GenerateMergeFromCodedStream(printer); } printer->Outdent(); // Emit code to parse unexpectedly packed or unpacked values. if (field->is_packed()) { internal::WireFormatLite::WireType wiretype = WireFormat::WireTypeForFieldType(field->type()); const uint32 tag = internal::WireFormatLite::MakeTag( field->number(), wiretype); printer->Print( "} else if (\n" " static_cast< ::google::protobuf::uint8>(tag) ==\n" " static_cast< ::google::protobuf::uint8>($truncated$u /* $full$ & 0xFF */)) {\n", "truncated", SimpleItoa(tag & 0xFF), "full", SimpleItoa(tag)); printer->Indent(); field_generator.GenerateMergeFromCodedStream(printer); printer->Outdent(); } else if (field->is_packable() && !field->is_packed()) { internal::WireFormatLite::WireType wiretype = internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED; const uint32 tag = internal::WireFormatLite::MakeTag( field->number(), wiretype); printer->Print( "} else if (\n" " static_cast< ::google::protobuf::uint8>(tag) ==\n" " static_cast< ::google::protobuf::uint8>($truncated$u /* $full$ & 0xFF */)) {\n", "truncated", SimpleItoa(tag & 0xFF), "full", SimpleItoa(tag)); printer->Indent(); field_generator.GenerateMergeFromCodedStreamWithPacking(printer); printer->Outdent(); } printer->Print( "} else {\n" " goto handle_unusual;\n" "}\n"); printer->Print( "break;\n"); printer->Outdent(); printer->Print("}\n\n"); } printer->Print("default: {\n"); printer->Indent(); } printer->Outdent(); printer->Print("handle_unusual:\n"); printer->Indent(); // If tag is 0 or an end-group tag then this must be the end of the message. if (capture_last_tag) { printer->Print( "if (tag == 0 ||\n" " ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n" " ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n" " input->SetLastTag(tag);\n" " goto success;\n" "}\n"); } else { printer->Print( "if (tag == 0) {\n" " goto success;\n" "}\n"); } // Handle extension ranges. if (descriptor_->extension_range_count() > 0) { printer->Print( "if ("); for (int i = 0; i < descriptor_->extension_range_count(); i++) { const Descriptor::ExtensionRange* range = descriptor_->extension_range(i); if (i > 0) printer->Print(" ||\n "); uint32 start_tag = WireFormatLite::MakeTag( range->start, static_cast(0)); uint32 end_tag = WireFormatLite::MakeTag( range->end, static_cast(0)); if (range->end > FieldDescriptor::kMaxNumber) { printer->Print( "($start$u <= tag)", "start", SimpleItoa(start_tag)); } else { printer->Print( "($start$u <= tag && tag < $end$u)", "start", SimpleItoa(start_tag), "end", SimpleItoa(end_tag)); } } printer->Print(") {\n"); if (UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print(vars, " DO_(_extensions_.ParseField(tag, input,\n" " internal_default_instance(),\n" " $mutable_unknown_fields$));\n"); } else { printer->Print( " DO_(_extensions_.ParseField(tag, input,\n" " internal_default_instance(),\n" " &unknown_fields_stream));\n"); } printer->Print( " continue;\n" "}\n"); } // We really don't recognize this tag. Skip it. if (UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print(vars, "DO_(::google::protobuf::internal::WireFormat::SkipField(\n" " input, tag, $mutable_unknown_fields$));\n"); } else { printer->Print( "DO_(::google::protobuf::internal::WireFormatLite::SkipField(\n" " input, tag, &unknown_fields_stream));\n"); } if (descriptor_->field_count() > 0) { printer->Print("break;\n"); printer->Outdent(); printer->Print("}\n"); // default: printer->Outdent(); printer->Print("}\n"); // switch } printer->Outdent(); printer->Outdent(); printer->Print( " }\n" // for (;;) "success:\n" " // @@protoc_insertion_point(parse_success:$full_name$)\n" " return true;\n" "failure:\n" " // @@protoc_insertion_point(parse_failure:$full_name$)\n" " return false;\n" "#undef DO_\n" "}\n", "full_name", descriptor_->full_name()); } void MessageGenerator::GenerateSerializeOneofFields( io::Printer* printer, const std::vector& fields, bool to_array) { GOOGLE_CHECK(!fields.empty()); if (fields.size() == 1) { GenerateSerializeOneField(printer, fields[0], to_array, -1); return; } // We have multiple mutually exclusive choices. Emit a switch statement. const OneofDescriptor* oneof = fields[0]->containing_oneof(); printer->Print( "switch ($oneofname$_case()) {\n", "oneofname", oneof->name()); printer->Indent(); for (int i = 0; i < fields.size(); i++) { const FieldDescriptor* field = fields[i]; printer->Print( "case k$field_name$:\n", "field_name", UnderscoresToCamelCase(field->name(), true)); printer->Indent(); if (to_array) { field_generators_.get(field).GenerateSerializeWithCachedSizesToArray( printer); } else { field_generators_.get(field).GenerateSerializeWithCachedSizes(printer); } printer->Print( "break;\n"); printer->Outdent(); } printer->Outdent(); // Doing nothing is an option. printer->Print( " default: ;\n" "}\n"); } void MessageGenerator::GenerateSerializeOneField( io::Printer* printer, const FieldDescriptor* field, bool to_array, int cached_has_bits_index) { if (!field->options().weak()) { // For weakfields, PrintFieldComment is called during iteration. PrintFieldComment(printer, field); } bool have_enclosing_if = false; if (field->options().weak()) { } else if (!field->is_repeated() && HasFieldPresence(descriptor_->file())) { // Attempt to use the state of cached_has_bits, if possible. int has_bit_index = has_bit_indices_[field->index()]; if (cached_has_bits_index == has_bit_index / 32) { const string mask = StrCat( strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8)); printer->Print( "if (cached_has_bits & 0x$mask$u) {\n", "mask", mask); } else { printer->Print( "if (has_$name$()) {\n", "name", FieldName(field)); } printer->Indent(); have_enclosing_if = true; } else if (!HasFieldPresence(descriptor_->file())) { have_enclosing_if = EmitFieldNonDefaultCondition(printer, "this->", field); } if (to_array) { field_generators_.get(field).GenerateSerializeWithCachedSizesToArray( printer); } else { field_generators_.get(field).GenerateSerializeWithCachedSizes(printer); } if (have_enclosing_if) { printer->Outdent(); printer->Print("}\n"); } printer->Print("\n"); } void MessageGenerator::GenerateSerializeOneExtensionRange( io::Printer* printer, const Descriptor::ExtensionRange* range, bool to_array) { std::map vars; vars["start"] = SimpleItoa(range->start); vars["end"] = SimpleItoa(range->end); printer->Print(vars, "// Extension range [$start$, $end$)\n"); if (to_array) { printer->Print(vars, "target = _extensions_.InternalSerializeWithCachedSizesToArray(\n" " $start$, $end$, deterministic, target);\n\n"); } else { printer->Print(vars, "_extensions_.SerializeWithCachedSizes(\n" " $start$, $end$, output);\n\n"); } } void MessageGenerator:: GenerateSerializeWithCachedSizes(io::Printer* printer) { if (descriptor_->options().message_set_wire_format()) { // Special-case MessageSet. printer->Print( "void $classname$::SerializeWithCachedSizes(\n" " ::google::protobuf::io::CodedOutputStream* output) const {\n" " _extensions_.SerializeMessageSetWithCachedSizes(output);\n", "classname", classname_); GOOGLE_CHECK(UseUnknownFieldSet(descriptor_->file(), options_)); std::map vars; SetUnknkownFieldsVariable(descriptor_, options_, &vars); printer->Print(vars, " ::google::protobuf::internal::WireFormat::SerializeUnknownMessageSetItems(\n" " $unknown_fields$, output);\n"); printer->Print( "}\n"); return; } if (options_.table_driven_serialization) return; printer->Print( "void $classname$::SerializeWithCachedSizes(\n" " ::google::protobuf::io::CodedOutputStream* output) const {\n", "classname", classname_); printer->Indent(); printer->Print( "// @@protoc_insertion_point(serialize_start:$full_name$)\n", "full_name", descriptor_->full_name()); GenerateSerializeWithCachedSizesBody(printer, false); printer->Print( "// @@protoc_insertion_point(serialize_end:$full_name$)\n", "full_name", descriptor_->full_name()); printer->Outdent(); printer->Print( "}\n"); } void MessageGenerator:: GenerateSerializeWithCachedSizesToArray(io::Printer* printer) { if (descriptor_->options().message_set_wire_format()) { // Special-case MessageSet. printer->Print( "::google::protobuf::uint8* $classname$::InternalSerializeWithCachedSizesToArray(\n" " bool deterministic, ::google::protobuf::uint8* target) const {\n" " target = _extensions_." "InternalSerializeMessageSetWithCachedSizesToArray(\n" " deterministic, target);\n", "classname", classname_); GOOGLE_CHECK(UseUnknownFieldSet(descriptor_->file(), options_)); std::map vars; SetUnknkownFieldsVariable(descriptor_, options_, &vars); printer->Print(vars, " target = ::google::protobuf::internal::WireFormat::\n" " SerializeUnknownMessageSetItemsToArray(\n" " $unknown_fields$, target);\n"); printer->Print( " return target;\n" "}\n"); return; } printer->Print( "::google::protobuf::uint8* $classname$::InternalSerializeWithCachedSizesToArray(\n" " bool deterministic, ::google::protobuf::uint8* target) const {\n", "classname", classname_); printer->Indent(); printer->Print("(void)deterministic; // Unused\n"); printer->Print( "// @@protoc_insertion_point(serialize_to_array_start:$full_name$)\n", "full_name", descriptor_->full_name()); GenerateSerializeWithCachedSizesBody(printer, true); printer->Print( "// @@protoc_insertion_point(serialize_to_array_end:$full_name$)\n", "full_name", descriptor_->full_name()); printer->Outdent(); printer->Print( " return target;\n" "}\n"); } void MessageGenerator:: GenerateSerializeWithCachedSizesBody(io::Printer* printer, bool to_array) { // If there are multiple fields in a row from the same oneof then we // coalesce them and emit a switch statement. This is more efficient // because it lets the C++ compiler know this is a "at most one can happen" // situation. If we emitted "if (has_x()) ...; if (has_y()) ..." the C++ // compiler's emitted code might check has_y() even when has_x() is true. class LazySerializerEmitter { public: LazySerializerEmitter(MessageGenerator* mg, io::Printer* printer, bool to_array) : mg_(mg), printer_(printer), to_array_(to_array), eager_(!HasFieldPresence(mg->descriptor_->file())), cached_has_bit_index_(-1) {} ~LazySerializerEmitter() { Flush(); } // If conditions allow, try to accumulate a run of fields from the same // oneof, and handle them at the next Flush(). void Emit(const FieldDescriptor* field) { if (eager_ || MustFlush(field)) { Flush(); } if (field->containing_oneof() == NULL) { // TODO(ckennelly): Defer non-oneof fields similarly to oneof fields. if (!field->options().weak() && !field->is_repeated() && !eager_) { // We speculatively load the entire _has_bits_[index] contents, even // if it is for only one field. Deferring non-oneof emitting would // allow us to determine whether this is going to be useful. int has_bit_index = mg_->has_bit_indices_[field->index()]; if (cached_has_bit_index_ != has_bit_index / 32) { // Reload. int new_index = has_bit_index / 32; printer_->Print( "cached_has_bits = _has_bits_[$new_index$];\n", "new_index", SimpleItoa(new_index)); cached_has_bit_index_ = new_index; } } mg_->GenerateSerializeOneField( printer_, field, to_array_, cached_has_bit_index_); } else { v_.push_back(field); } } void Flush() { if (!v_.empty()) { mg_->GenerateSerializeOneofFields(printer_, v_, to_array_); v_.clear(); } } private: // If we have multiple fields in v_ then they all must be from the same // oneof. Would adding field to v_ break that invariant? bool MustFlush(const FieldDescriptor* field) { return !v_.empty() && v_[0]->containing_oneof() != field->containing_oneof(); } MessageGenerator* mg_; io::Printer* printer_; const bool to_array_; const bool eager_; std::vector v_; // cached_has_bit_index_ maintains that: // cached_has_bits = from._has_bits_[cached_has_bit_index_] // for cached_has_bit_index_ >= 0 int cached_has_bit_index_; }; std::vector ordered_fields = SortFieldsByNumber(descriptor_); std::vector sorted_extensions; 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(), ExtensionRangeSorter()); if (num_weak_fields_) { printer->Print( "::google::protobuf::internal::WeakFieldMap::FieldWriter field_writer(" "_weak_field_map_);\n"); } printer->Print( "::google::protobuf::uint32 cached_has_bits = 0;\n" "(void) cached_has_bits;\n\n"); // Merge the fields and the extension ranges, both sorted by field number. { LazySerializerEmitter e(this, printer, to_array); const FieldDescriptor* last_weak_field = NULL; int i, j; for (i = 0, j = 0; i < ordered_fields.size() || j < sorted_extensions.size();) { if ((j == sorted_extensions.size()) || (i < descriptor_->field_count() && ordered_fields[i]->number() < sorted_extensions[j]->start)) { const FieldDescriptor* field = ordered_fields[i++]; if (field->options().weak()) { last_weak_field = field; PrintFieldComment(printer, field); } else { if (last_weak_field != NULL) { e.Emit(last_weak_field); last_weak_field = NULL; } e.Emit(field); } } else { if (last_weak_field != NULL) { e.Emit(last_weak_field); last_weak_field = NULL; } e.Flush(); GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++], to_array); } } if (last_weak_field != NULL) { e.Emit(last_weak_field); } } std::map vars; SetUnknkownFieldsVariable(descriptor_, options_, &vars); if (UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print(vars, "if ($have_unknown_fields$) {\n"); printer->Indent(); if (to_array) { printer->Print(vars, "target = " "::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n" " $unknown_fields$, target);\n"); } else { printer->Print(vars, "::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n" " $unknown_fields$, output);\n"); } printer->Outdent(); printer->Print("}\n"); } else { printer->Print(vars, "output->WriteRaw($unknown_fields$.data(),\n" " static_cast($unknown_fields$.size()));\n"); } } std::vector MessageGenerator::RequiredFieldsBitMask() const { const int array_size = HasBitsSize(); std::vector masks(array_size, 0); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (!field->is_required()) { continue; } const int has_bit_index = has_bit_indices_[field->index()]; masks[has_bit_index / 32] |= static_cast(1) << (has_bit_index % 32); } return masks; } // Create an expression that evaluates to // "for all i, (_has_bits_[i] & masks[i]) == masks[i]" // masks is allowed to be shorter than _has_bits_, but at least one element of // masks must be non-zero. static string ConditionalToCheckBitmasks(const std::vector& masks) { std::vector parts; for (int i = 0; i < masks.size(); i++) { if (masks[i] == 0) continue; string m = StrCat("0x", strings::Hex(masks[i], strings::ZERO_PAD_8)); // Each xor evaluates to 0 if the expected bits are present. parts.push_back(StrCat("((_has_bits_[", i, "] & ", m, ") ^ ", m, ")")); } GOOGLE_CHECK(!parts.empty()); // If we have multiple parts, each expected to be 0, then bitwise-or them. string result = parts.size() == 1 ? parts[0] : StrCat("(", Join(parts, "\n | "), ")"); return result + " == 0"; } void MessageGenerator:: GenerateByteSize(io::Printer* printer) { if (descriptor_->options().message_set_wire_format()) { // Special-case MessageSet. GOOGLE_CHECK(UseUnknownFieldSet(descriptor_->file(), options_)); std::map vars; SetUnknkownFieldsVariable(descriptor_, options_, &vars); vars["classname"] = classname_; vars["full_name"] = descriptor_->full_name(); printer->Print(vars, "size_t $classname$::ByteSizeLong() const {\n" "// @@protoc_insertion_point(message_set_byte_size_start:$full_name$)\n" " size_t total_size = _extensions_.MessageSetByteSize();\n" " if ($have_unknown_fields$) {\n" " total_size += ::google::protobuf::internal::WireFormat::\n" " ComputeUnknownMessageSetItemsSize($unknown_fields$);\n" " }\n" " int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);\n" " GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n" " _cached_size_ = cached_size;\n" " GOOGLE_SAFE_CONCURRENT_WRITES_END();\n" " return total_size;\n" "}\n"); return; } if (num_required_fields_ > 1 && HasFieldPresence(descriptor_->file())) { // Emit a function (rarely used, we hope) that handles the required fields // by checking for each one individually. printer->Print( "size_t $classname$::RequiredFieldsByteSizeFallback() const {\n" "// @@protoc_insertion_point(required_fields_byte_size_fallback_start:" "$full_name$)\n", "classname", classname_, "full_name", descriptor_->full_name()); printer->Indent(); printer->Print("size_t total_size = 0;\n"); for (int i = 0; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; if (field->is_required()) { printer->Print("\n" "if (has_$name$()) {\n", "name", FieldName(field)); printer->Indent(); PrintFieldComment(printer, field); field_generators_.get(field).GenerateByteSize(printer); printer->Outdent(); printer->Print("}\n"); } } printer->Print("\n" "return total_size;\n"); printer->Outdent(); printer->Print("}\n"); } printer->Print( "size_t $classname$::ByteSizeLong() const {\n" "// @@protoc_insertion_point(message_byte_size_start:$full_name$)\n", "classname", classname_, "full_name", descriptor_->full_name()); printer->Indent(); printer->Print( "size_t total_size = 0;\n" "\n"); if (descriptor_->extension_range_count() > 0) { printer->Print( "total_size += _extensions_.ByteSize();\n" "\n"); } std::map vars; SetUnknkownFieldsVariable(descriptor_, options_, &vars); if (UseUnknownFieldSet(descriptor_->file(), options_)) { printer->Print(vars, "if ($have_unknown_fields$) {\n" " total_size +=\n" " ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n" " $unknown_fields$);\n" "}\n"); } else { printer->Print(vars, "total_size += $unknown_fields$.size();\n" "\n"); } // Handle required fields (if any). We expect all of them to be // present, so emit one conditional that checks for that. If they are all // present then the fast path executes; otherwise the slow path executes. if (num_required_fields_ > 1 && HasFieldPresence(descriptor_->file())) { // The fast path works if all required fields are present. const std::vector masks_for_has_bits = RequiredFieldsBitMask(); printer->Print((string("if (") + ConditionalToCheckBitmasks(masks_for_has_bits) + ") { // All required fields are present.\n").c_str()); printer->Indent(); // Oneof fields cannot be required, so optimized_order_ contains all of the // fields that we need to potentially emit. for (int i = 0; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; if (!field->is_required()) continue; PrintFieldComment(printer, field); field_generators_.get(field).GenerateByteSize(printer); printer->Print("\n"); } printer->Outdent(); printer->Print("} else {\n" // the slow path " total_size += RequiredFieldsByteSizeFallback();\n" "}\n"); } else { // num_required_fields_ <= 1: no need to be tricky for (int i = 0; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; if (!field->is_required()) continue; PrintFieldComment(printer, field); printer->Print("if (has_$name$()) {\n", "name", FieldName(field)); printer->Indent(); field_generators_.get(field).GenerateByteSize(printer); printer->Outdent(); printer->Print("}\n"); } } int last_i = -1; for (int i = 0; i < optimized_order_.size(); ) { // Detect infinite loops. GOOGLE_CHECK_NE(i, last_i); last_i = i; // Skip required fields. for (; i < optimized_order_.size() && optimized_order_[i]->is_required(); i++) { } // Handle repeated fields. for (; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; if (!field->is_repeated()) { break; } PrintFieldComment(printer, field); const FieldGenerator& generator = field_generators_.get(field); generator.GenerateByteSize(printer); printer->Print("\n"); } // Handle optional (non-repeated/oneof) fields. // // These are handled in chunks of 8. The first chunk is // the non-requireds-non-repeateds-non-unions-non-extensions in // descriptor_->field(0), descriptor_->field(1), ... descriptor_->field(7), // and the second chunk is the same for // descriptor_->field(8), descriptor_->field(9), ... // descriptor_->field(15), // etc. int last_chunk = -1; int last_chunk_start = -1; int last_chunk_end = -1; uint32 last_chunk_mask = 0; for (; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; if (field->is_repeated() || field->is_required()) { break; } // "index" defines where in the _has_bits_ the field appears. // "i" is our loop counter within optimized_order_. int index = HasFieldPresence(descriptor_->file()) ? has_bit_indices_[field->index()] : 0; int chunk = index / 8; if (last_chunk == -1) { last_chunk = chunk; last_chunk_start = i; } else if (chunk != last_chunk) { // Emit the fields for this chunk so far. break; } last_chunk_end = i; last_chunk_mask |= static_cast(1) << (index % 32); } if (last_chunk != -1) { GOOGLE_DCHECK_NE(-1, last_chunk_start); GOOGLE_DCHECK_NE(-1, last_chunk_end); GOOGLE_DCHECK_NE(0, last_chunk_mask); const int count = popcnt(last_chunk_mask); const bool have_outer_if = HasFieldPresence(descriptor_->file()) && (last_chunk_start != last_chunk_end); if (have_outer_if) { // 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 // _has_bits_[last_chunk * 8 / 32] multiple times. GOOGLE_DCHECK_LE(2, count); GOOGLE_DCHECK_GE(8, count); printer->Print( "if (_has_bits_[$index$ / 32] & $mask$u) {\n", "index", SimpleItoa(last_chunk * 8), "mask", SimpleItoa(last_chunk_mask)); printer->Indent(); } // Go back and emit checks for each of the fields we processed. for (int j = last_chunk_start; j <= last_chunk_end; j++) { const FieldDescriptor* field = optimized_order_[j]; const FieldGenerator& generator = field_generators_.get(field); PrintFieldComment(printer, field); bool have_enclosing_if = false; if (HasFieldPresence(descriptor_->file())) { printer->Print( "if (has_$name$()) {\n", "name", FieldName(field)); printer->Indent(); have_enclosing_if = true; } else { // Without field presence: field is serialized only if it has a // non-default value. have_enclosing_if = EmitFieldNonDefaultCondition( printer, "this->", field); } generator.GenerateByteSize(printer); if (have_enclosing_if) { printer->Outdent(); printer->Print( "}\n" "\n"); } } if (have_outer_if) { printer->Outdent(); printer->Print("}\n"); } } } // Fields inside a oneof don't use _has_bits_ so we count them in a separate // pass. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "switch ($oneofname$_case()) {\n", "oneofname", descriptor_->oneof_decl(i)->name()); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); PrintFieldComment(printer, field); printer->Print( "case k$field_name$: {\n", "field_name", UnderscoresToCamelCase(field->name(), true)); printer->Indent(); field_generators_.get(field).GenerateByteSize(printer); printer->Print( "break;\n"); printer->Outdent(); printer->Print( "}\n"); } printer->Print( "case $cap_oneof_name$_NOT_SET: {\n" " break;\n" "}\n", "cap_oneof_name", ToUpper(descriptor_->oneof_decl(i)->name())); printer->Outdent(); printer->Print( "}\n"); } if (num_weak_fields_) { // TagSize + MessageSize printer->Print("total_size += _weak_field_map_.ByteSizeLong();\n"); } // We update _cached_size_ even though this is a const method. In theory, // this is not thread-compatible, because concurrent writes have undefined // results. In practice, since any concurrent writes will be writing the // exact same value, it works on all common processors. In a future version // of C++, _cached_size_ should be made into an atomic. printer->Print( "int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);\n" "GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n" "_cached_size_ = cached_size;\n" "GOOGLE_SAFE_CONCURRENT_WRITES_END();\n" "return total_size;\n"); printer->Outdent(); printer->Print("}\n"); } void MessageGenerator:: GenerateIsInitialized(io::Printer* printer) { printer->Print( "bool $classname$::IsInitialized() const {\n", "classname", classname_); printer->Indent(); if (descriptor_->extension_range_count() > 0) { printer->Print( "if (!_extensions_.IsInitialized()) {\n" " return false;\n" "}\n\n"); } if (HasFieldPresence(descriptor_->file())) { // Check that all required fields in this message are set. We can do this // most efficiently by checking 32 "has bits" at a time. const std::vector masks = RequiredFieldsBitMask(); for (int i = 0; i < masks.size(); i++) { uint32 mask = masks[i]; if (mask == 0) { continue; } // TODO(ckennelly): Consider doing something similar to ByteSizeLong(), // where we check all of the required fields in a single branch (assuming // that we aren't going to benefit from early termination). printer->Print( "if ((_has_bits_[$i$] & 0x$mask$) != 0x$mask$) return false;\n", "i", SimpleItoa(i), "mask", StrCat(strings::Hex(mask, strings::ZERO_PAD_8))); } } // Now check that all non-oneof embedded messages are initialized. for (int i = 0; i < optimized_order_.size(); i++) { const FieldDescriptor* field = optimized_order_[i]; // TODO(ckennelly): Push this down into a generator? if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && !ShouldIgnoreRequiredFieldCheck(field, options_) && scc_analyzer_->HasRequiredFields(field->message_type())) { if (field->is_repeated()) { printer->Print( "if (!::google::protobuf::internal::AllAreInitialized(this->$name$()))" " return false;\n", "name", FieldName(field)); } else if (field->options().weak()) { continue; } else { GOOGLE_CHECK(!field->containing_oneof()); printer->Print( "if (has_$name$()) {\n" " if (!this->$name$_->IsInitialized()) return false;\n" "}\n", "name", FieldName(field)); } } } if (num_weak_fields_) { // For Weak fields. printer->Print("if (!_weak_field_map_.IsInitialized()) return false;\n"); } // Go through the oneof fields, emitting a switch if any might have required // fields. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { const OneofDescriptor* oneof = descriptor_->oneof_decl(i); bool has_required_fields = false; for (int j = 0; j < oneof->field_count(); j++) { const FieldDescriptor* field = oneof->field(j); if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && !ShouldIgnoreRequiredFieldCheck(field, options_) && scc_analyzer_->HasRequiredFields(field->message_type())) { has_required_fields = true; break; } } if (!has_required_fields) { continue; } printer->Print( "switch ($oneofname$_case()) {\n", "oneofname", oneof->name()); printer->Indent(); for (int j = 0; j < oneof->field_count(); j++) { const FieldDescriptor* field = oneof->field(j); printer->Print( "case k$field_name$: {\n", "field_name", UnderscoresToCamelCase(field->name(), true)); printer->Indent(); if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && !ShouldIgnoreRequiredFieldCheck(field, options_) && scc_analyzer_->HasRequiredFields(field->message_type())) { GOOGLE_CHECK(!(field->options().weak() || !field->containing_oneof())); if (field->options().weak()) { // Just skip. } else { printer->Print( "if (has_$name$()) {\n" " if (!this->$name$().IsInitialized()) return false;\n" "}\n", "name", FieldName(field)); } } printer->Print( "break;\n"); printer->Outdent(); printer->Print( "}\n"); } printer->Print( "case $cap_oneof_name$_NOT_SET: {\n" " break;\n" "}\n", "cap_oneof_name", ToUpper(oneof->name())); printer->Outdent(); printer->Print( "}\n"); } printer->Outdent(); printer->Print( " return true;\n" "}\n"); } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h000066400000000000000000000245631334102242000323360ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__ #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace cpp { class EnumGenerator; // enum.h class ExtensionGenerator; // extension.h class MessageGenerator { public: // See generator.cc for the meaning of dllexport_decl. MessageGenerator(const Descriptor* descriptor, int index_in_file_messages, const Options& options, SCCAnalyzer* scc_analyzer); ~MessageGenerator(); // Append the two types of nested generators to the corresponding vector. void AddGenerators(std::vector* enum_generators, std::vector* extension_generators); // Header stuff. // Return names for forward declarations of this class and all its nested // types. A given key in {class,enum}_names will map from a class name to the // descriptor that was responsible for its inclusion in the map. This can be // used to associate the descriptor with the code generated for it. void FillMessageForwardDeclarations( std::map* class_names); // Generate definitions for this class and all its nested types. void GenerateClassDefinition(io::Printer* printer); // Generate definitions of inline methods (placed at the end of the header // file). void GenerateInlineMethods(io::Printer* printer); // Dependent methods are always inline. void GenerateDependentInlineMethods(io::Printer* printer); // Source file stuff. // Generate extra fields void GenerateExtraDefaultFields(io::Printer* printer); // Generates code that creates default instances for fields. void GenerateFieldDefaultInstances(io::Printer* printer); // Generates code that initializes the message's default instance. This // is separate from allocating because all default instances must be // allocated before any can be initialized. void GenerateDefaultInstanceInitializer(io::Printer* printer); // Generate all non-inline methods for this class. void GenerateClassMethods(io::Printer* printer); private: // Generate declarations and definitions of accessors for fields. void GenerateDependentBaseClassDefinition(io::Printer* printer); void GenerateDependentFieldAccessorDeclarations(io::Printer* printer); void GenerateFieldAccessorDeclarations(io::Printer* printer); void GenerateDependentFieldAccessorDefinitions(io::Printer* printer); void GenerateFieldAccessorDefinitions(io::Printer* printer); // Generate the table-driven parsing array. Returns the number of entries // generated. size_t GenerateParseOffsets(io::Printer* printer); size_t GenerateParseAuxTable(io::Printer* printer); // Generates a ParseTable entry. Returns whether the proto uses table-driven // parsing. bool GenerateParseTable(io::Printer* printer, size_t offset, size_t aux_offset); // Generate the field offsets array. Returns the a pair of the total numer // of entries generated and the index of the first has_bit entry. std::pair GenerateOffsets(io::Printer* printer); void GenerateSchema(io::Printer* printer, int offset, int has_offset); // For each field generates a table entry describing the field for the // table driven serializer. int GenerateFieldMetadata(io::Printer* printer); // Generate constructors and destructor. void GenerateStructors(io::Printer* printer); // The compiler typically generates multiple copies of each constructor and // destructor: http://gcc.gnu.org/bugs.html#nonbugs_cxx // Placing common code in a separate method reduces the generated code size. // // Generate the shared constructor code. void GenerateSharedConstructorCode(io::Printer* printer); // Generate the shared destructor code. void GenerateSharedDestructorCode(io::Printer* printer); // Generate the arena-specific destructor code. void GenerateArenaDestructorCode(io::Printer* printer); // Helper for GenerateClear and others. Optionally emits a condition that // assumes the existence of the cached_has_bits variable, and returns true if // the condition was printed. bool MaybeGenerateOptionalFieldCondition(io::Printer* printer, const FieldDescriptor* field, int expected_has_bits_index); // Generate standard Message methods. void GenerateClear(io::Printer* printer); void GenerateOneofClear(io::Printer* printer); void GenerateMergeFromCodedStream(io::Printer* printer); void GenerateSerializeWithCachedSizes(io::Printer* printer); void GenerateSerializeWithCachedSizesToArray(io::Printer* printer); void GenerateSerializeWithCachedSizesBody(io::Printer* printer, bool to_array); void GenerateByteSize(io::Printer* printer); void GenerateMergeFrom(io::Printer* printer); void GenerateCopyFrom(io::Printer* printer); void GenerateSwap(io::Printer* printer); void GenerateIsInitialized(io::Printer* printer); // Helpers for GenerateSerializeWithCachedSizes(). // // cached_has_bit_index maintains that: // cached_has_bits = _has_bits_[cached_has_bit_index] // for cached_has_bit_index >= 0 void GenerateSerializeOneField(io::Printer* printer, const FieldDescriptor* field, bool unbounded, int cached_has_bits_index); // Generate a switch statement to serialize 2+ fields from the same oneof. // Or, if fields.size() == 1, just call GenerateSerializeOneField(). void GenerateSerializeOneofFields( io::Printer* printer, const std::vector& fields, bool to_array); void GenerateSerializeOneExtensionRange( io::Printer* printer, const Descriptor::ExtensionRange* range, bool unbounded); // Generates has_foo() functions and variables for singular field has-bits. void GenerateSingularFieldHasBits(const FieldDescriptor* field, std::map vars, io::Printer* printer); // Generates has_foo() functions and variables for oneof field has-bits. void GenerateOneofHasBits(io::Printer* printer); // Generates has_foo_bar() functions for oneof members. void GenerateOneofMemberHasBits(const FieldDescriptor* field, const std::map& vars, io::Printer* printer); // Generates the clear_foo() method for a field. void GenerateFieldClear(const FieldDescriptor* field, const std::map& vars, bool is_inline, io::Printer* printer); void GenerateConstructorBody(io::Printer* printer, std::vector already_processed, bool copy_constructor) const; size_t HasBitsSize() const; std::vector RequiredFieldsBitMask() const; const Descriptor* descriptor_; int index_in_file_messages_; string classname_; Options options_; FieldGeneratorMap field_generators_; // optimized_order_ is the order we layout the message's fields in the class. // This is reused to initialize the fields in-order for cache efficiency. // // optimized_order_ excludes oneof fields and weak fields. std::vector optimized_order_; std::vector has_bit_indices_; int max_has_bit_index_; google::protobuf::scoped_array > enum_generators_; google::protobuf::scoped_array > extension_generators_; int num_required_fields_; bool use_dependent_base_; int num_weak_fields_; // table_driven_ indicates the generated message uses table-driven parsing. bool table_driven_; google::protobuf::scoped_ptr message_layout_helper_; SCCAnalyzer* scc_analyzer_; string scc_name_; friend class FileGenerator; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc000066400000000000000000001161301334102242000336270ustar00rootroot00000000000000// 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 #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { namespace { // When we are generating code for implicit weak fields, we need to insert some // additional casts. These functions return the casted expression if // implicit_weak_field is true but otherwise return the original expression. // Ordinarily a static_cast is enough to cast google::protobuf::MessageLite* to a class // deriving from it, but we need a reinterpret_cast in cases where the generated // message is forward-declared but its full definition is not visible. string StaticCast(const string& type, const string& expression, bool implicit_weak_field) { if (implicit_weak_field) { return "static_cast< " + type + " >(" + expression + ")"; } else { return expression; } } string ReinterpretCast(const string& type, const string& expression, bool implicit_weak_field) { if (implicit_weak_field) { return "reinterpret_cast< " + type + " >(" + expression + ")"; } else { return expression; } } void SetMessageVariables(const FieldDescriptor* descriptor, std::map* variables, const Options& options) { SetCommonFieldVariables(descriptor, variables, options); (*variables)["type"] = FieldMessageTypeName(descriptor); (*variables)["casted_member"] = ReinterpretCast((*variables)["type"] + "*", (*variables)["name"] + "_", IsImplicitWeakField(descriptor, options)); (*variables)["type_default_instance"] = DefaultInstanceName(descriptor->message_type()); (*variables)["type_reference_function"] = ReferenceFunctionName(descriptor->message_type()); if (descriptor->options().weak() || !descriptor->containing_oneof()) { (*variables)["non_null_ptr_to_name"] = StrCat("this->", (*variables)["name"], "_"); } (*variables)["stream_writer"] = (*variables)["declared_type"] + (HasFastArraySerialization(descriptor->message_type()->file(), options) ? "MaybeToArray" : ""); // NOTE: Escaped here to unblock proto1->proto2 migration. // TODO(liujisi): Extend this to apply for other conflicting methods. (*variables)["release_name"] = SafeFunctionName(descriptor->containing_type(), descriptor, "release_"); (*variables)["full_name"] = descriptor->full_name(); if (options.proto_h && IsFieldDependent(descriptor)) { (*variables)["dependent_type"] = "T::" + DependentTypeName(descriptor); (*variables)["dependent_typename"] = "typename T::" + DependentTypeName(descriptor); } else { (*variables)["dependent_type"] = FieldMessageTypeName(descriptor); (*variables)["dependent_typename"] = FieldMessageTypeName(descriptor); } } } // namespace // =================================================================== MessageFieldGenerator::MessageFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : FieldGenerator(options), descriptor_(descriptor), dependent_field_(options.proto_h && IsFieldDependent(descriptor)), implicit_weak_field_(IsImplicitWeakField(descriptor, options)) { SetMessageVariables(descriptor, &variables_, options); } MessageFieldGenerator::~MessageFieldGenerator() {} void MessageFieldGenerator:: GeneratePrivateMembers(io::Printer* printer) const { if (implicit_weak_field_) { printer->Print(variables_, "google::protobuf::MessageLite* $name$_;\n"); } else { printer->Print(variables_, "$type$* $name$_;\n"); } } void MessageFieldGenerator:: GenerateDependentAccessorDeclarations(io::Printer* printer) const { if (!dependent_field_) { return; } printer->Print(variables_, "$deprecated_attr$$type$* ${$mutable_$name$$}$();\n"); printer->Annotate("{", "}", descriptor_); } void MessageFieldGenerator:: GenerateAccessorDeclarations(io::Printer* printer) const { if (SupportsArenas(descriptor_) && !implicit_weak_field_) { printer->Print(variables_, "private:\n" "void _slow_mutable_$name$();\n" "public:\n"); } if (implicit_weak_field_) { // These private accessors are used by MergeFrom and // MergePartialFromCodedStream, and their purpose is to provide access to // the field without creating a strong dependency on the message type. printer->Print(variables_, "private:\n" "const google::protobuf::MessageLite& _internal_$name$() const;\n" "google::protobuf::MessageLite* _internal_mutable_$name$();\n" "public:\n"); } printer->Print(variables_, "$deprecated_attr$const $type$& $name$() const;\n"); printer->Annotate("name", descriptor_); printer->Print(variables_, "$deprecated_attr$$type$* $release_name$();\n"); printer->Annotate("release_name", descriptor_); if (!dependent_field_) { printer->Print(variables_, "$deprecated_attr$$type$* ${$mutable_$name$$}$();\n"); printer->Annotate("{", "}", descriptor_); } printer->Print(variables_, "$deprecated_attr$void ${$set_allocated_$name$$}$" "($type$* $name$);\n"); printer->Annotate("{", "}", descriptor_); if (SupportsArenas(descriptor_)) { printer->Print(variables_, "$deprecated_attr$void " "${$unsafe_arena_set_allocated_$name$$}$(\n" " $type$* $name$);\n"); printer->Annotate("{", "}", descriptor_); printer->Print( variables_, "$deprecated_attr$$type$* ${$unsafe_arena_release_$name$$}$();\n"); printer->Annotate("{", "}", descriptor_); } } void MessageFieldGenerator::GenerateNonInlineAccessorDefinitions( io::Printer* printer) const { if (implicit_weak_field_) { printer->Print(variables_, "const google::protobuf::MessageLite& $classname$::_internal_$name$() const {\n" " if ($name$_ != NULL) {\n" " return *$name$_;\n" " } else if (&$type_default_instance$ != NULL) {\n" " return *reinterpret_cast(\n" " &$type_default_instance$);\n" " } else {\n" " return *reinterpret_cast(\n" " &::google::protobuf::internal::implicit_weak_message_default_instance);\n" " }\n" "}\n"); } if (SupportsArenas(descriptor_)) { if (implicit_weak_field_) { printer->Print(variables_, "google::protobuf::MessageLite* $classname$::_internal_mutable_$name$() {\n" " $set_hasbit$\n" " if ($name$_ == NULL) {\n" " if (&$type_default_instance$ == NULL) {\n" " $name$_ = ::google::protobuf::Arena::CreateMessage<\n" " ::google::protobuf::internal::ImplicitWeakMessage>(\n" " GetArenaNoVirtual());\n" " } else {\n" " $name$_ = reinterpret_cast(\n" " &$type_default_instance$)->New(GetArenaNoVirtual());\n" " }\n" " }\n" " return $name$_;\n"); } else { printer->Print(variables_, "void $classname$::_slow_mutable_$name$() {\n"); if (SupportsArenas(descriptor_->message_type())) { printer->Print(variables_, " $name$_ = ::google::protobuf::Arena::CreateMessage< $type$ >(\n" " GetArenaNoVirtual());\n"); } else { printer->Print(variables_, " $name$_ = ::google::protobuf::Arena::Create< $type$ >(\n" " GetArenaNoVirtual());\n"); } } printer->Print(variables_, "}\n"); printer->Print(variables_, "void $classname$::unsafe_arena_set_allocated_$name$(\n" " $type$* $name$) {\n" // If we're not on an arena, free whatever we were holding before. // (If we are on arena, we can just forget the earlier pointer.) " if (GetArenaNoVirtual() == NULL) {\n" " delete $name$_;\n" " }\n" " $name$_ = $name$;\n" " if ($name$) {\n" " $set_hasbit$\n" " } else {\n" " $clear_hasbit$\n" " }\n" " // @@protoc_insertion_point(field_unsafe_arena_set_allocated" ":$full_name$)\n" "}\n"); } else if (implicit_weak_field_) { printer->Print(variables_, "google::protobuf::MessageLite* $classname$::_internal_mutable_$name$() {\n" " $set_hasbit$\n" " if ($name$_ == NULL) {\n" " if (&$type_default_instance$ == NULL) {\n" " $name$_ = new ::google::protobuf::internal::ImplicitWeakMessage;\n" " } else {\n" " $name$_ = reinterpret_cast(\n" " &$type_default_instance$)->New();\n" " }\n" " }\n" " return $name$_;\n" "}\n"); } } void MessageFieldGenerator:: GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { if (!dependent_field_) { return; } std::map variables(variables_); // For the CRTP base class, all mutation methods are dependent, and so // they must be in the header. variables["dependent_classname"] = DependentBaseClassTemplateName(descriptor_->containing_type()) + ""; variables["this_message"] = DependentBaseDownCast(); variables["casted_reference"] = ReinterpretCast(variables["dependent_typename"] + "*&", variables["this_message"] + variables["name"] + "_", implicit_weak_field_); if (!variables["set_hasbit"].empty()) { variables["set_hasbit"] = variables["this_message"] + variables["set_hasbit"]; } if (!variables["clear_hasbit"].empty()) { variables["clear_hasbit"] = variables["this_message"] + variables["clear_hasbit"]; } if (SupportsArenas(descriptor_)) { printer->Print(variables, "template \n" "inline $type$* $dependent_classname$::mutable_$name$() {\n"); if (implicit_weak_field_) { printer->Print(variables, " $type_reference_function$();\n"); } printer->Print(variables, " $set_hasbit$\n" " $dependent_typename$*& $name$_ = $casted_reference$;\n" " if ($name$_ == NULL) {\n"); if (implicit_weak_field_) { printer->Print(variables, " $name$_ = reinterpret_cast<$dependent_typename$*>(\n" " reinterpret_cast(\n" " &$type_default_instance$)->New(\n" " $this_message$GetArenaNoVirtual()));\n"); } else { printer->Print(variables, " $this_message$_slow_mutable_$name$();\n"); } printer->Print(variables, " }\n" " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $name$_;\n" "}\n"); } else { printer->Print(variables, "template \n" "inline $type$* $dependent_classname$::mutable_$name$() {\n" " $set_hasbit$\n" " $dependent_typename$*& $name$_ = $casted_reference$;\n" " if ($name$_ == NULL) {\n" " $name$_ = new $dependent_typename$;\n" " }\n" " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $name$_;\n" "}\n"); } } void MessageFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { std::map variables(variables_); variables["const_member"] = ReinterpretCast( "const " + variables["type"] + "*", variables["name"] + "_", implicit_weak_field_); printer->Print(variables, "inline const $type$& $classname$::$name$() const {\n"); if (implicit_weak_field_) { printer->Print(variables, " $type_reference_function$();\n"); } printer->Print(variables, " const $type$* p = $const_member$;\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " return p != NULL ? *p : *reinterpret_cast(\n" " &$type_default_instance$);\n" "}\n"); printer->Print(variables, "inline $type$* $classname$::$release_name$() {\n" " // @@protoc_insertion_point(field_release:$full_name$)\n"); if (implicit_weak_field_) { printer->Print(variables, " $type_reference_function$();\n"); } printer->Print(variables, " $clear_hasbit$\n" " $type$* temp = $casted_member$;\n"); if (SupportsArenas(descriptor_)) { printer->Print(variables, " if (GetArenaNoVirtual() != NULL) {\n" " temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);\n" " }\n"); } printer->Print(variables, " $name$_ = NULL;\n" " return temp;\n" "}\n"); if (SupportsArenas(descriptor_)) { printer->Print(variables, "inline $type$* $classname$::unsafe_arena_release_$name$() {\n" " // @@protoc_insertion_point(" "field_unsafe_arena_release:$full_name$)\n"); if (implicit_weak_field_) { printer->Print(variables, " $type_reference_function$();\n"); } printer->Print(variables, " $clear_hasbit$\n" " $type$* temp = $casted_member$;\n" " $name$_ = NULL;\n" " return temp;\n" "}\n"); } if (!dependent_field_) { if (SupportsArenas(descriptor_)) { printer->Print(variables, "inline $type$* $classname$::mutable_$name$() {\n" " $set_hasbit$\n" " if ($name$_ == NULL) {\n"); if (implicit_weak_field_) { printer->Print(variables, " _internal_mutable_$name$();\n"); } else { printer->Print(variables, " _slow_mutable_$name$();\n"); } printer->Print(variables, " }\n" " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $casted_member$;\n" "}\n"); } else { printer->Print(variables, "inline $type$* $classname$::mutable_$name$() {\n" " $set_hasbit$\n" " if ($name$_ == NULL) {\n" " $name$_ = new $type$;\n" " }\n" " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $casted_member$;\n" "}\n"); } } // We handle the most common case inline, and delegate less common cases to // the slow fallback function. printer->Print(variables, "inline void $classname$::set_allocated_$name$($type$* $name$) {\n" " ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();\n"); printer->Print(variables, " if (message_arena == NULL) {\n"); if (IsCrossFileMessage(descriptor_)) { printer->Print(variables, " delete reinterpret_cast< ::google::protobuf::MessageLite*>($name$_);\n"); } else { printer->Print(variables, " delete $name$_;\n"); } printer->Print(variables, " }\n" " if ($name$) {\n"); if (SupportsArenas(descriptor_->message_type()) && IsCrossFileMessage(descriptor_)) { // We have to read the arena through the virtual method, because the type // isn't defined in this file. printer->Print(variables, " ::google::protobuf::Arena* submessage_arena =\n" " reinterpret_cast< ::google::protobuf::MessageLite*>($name$)->GetArena();\n"); } else if (!SupportsArenas(descriptor_->message_type())) { printer->Print(variables, " ::google::protobuf::Arena* submessage_arena = NULL;\n"); } else { printer->Print(variables, " ::google::protobuf::Arena* submessage_arena =\n" " ::google::protobuf::Arena::GetArena($name$);\n"); } printer->Print(variables, " if (message_arena != submessage_arena) {\n" " $name$ = ::google::protobuf::internal::GetOwnedMessage(\n" " message_arena, $name$, submessage_arena);\n" " }\n" " $set_hasbit$\n" " } else {\n" " $clear_hasbit$\n" " }\n"); if (implicit_weak_field_) { printer->Print(variables, " $name$_ = reinterpret_cast($name$);\n"); } else { printer->Print(variables, " $name$_ = $name$;\n"); } printer->Print(variables, " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" "}\n"); } void MessageFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { if (!HasFieldPresence(descriptor_->file())) { // If we don't have has-bits, message presence is indicated only by ptr != // NULL. Thus on clear, we need to delete the object. printer->Print(variables_, "if (GetArenaNoVirtual() == NULL && $name$_ != NULL) {\n" " delete $name$_;\n" "}\n" "$name$_ = NULL;\n"); } else { printer->Print(variables_, "if ($name$_ != NULL) $name$_->Clear();\n"); } } void MessageFieldGenerator:: GenerateMessageClearingCode(io::Printer* printer) const { if (!HasFieldPresence(descriptor_->file())) { // If we don't have has-bits, message presence is indicated only by ptr != // NULL. Thus on clear, we need to delete the object. printer->Print(variables_, "if (GetArenaNoVirtual() == NULL && $name$_ != NULL) {\n" " delete $name$_;\n" "}\n" "$name$_ = NULL;\n"); } else { printer->Print(variables_, "GOOGLE_DCHECK($name$_ != NULL);\n" "$name$_->Clear();\n"); } } void MessageFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { if (implicit_weak_field_) { printer->Print(variables_, "_internal_mutable_$name$()->CheckTypeAndMergeFrom(\n" " from._internal_$name$());\n"); } else { printer->Print(variables_, "mutable_$name$()->$type$::MergeFrom(from.$name$());\n"); } } void MessageFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { printer->Print(variables_, "swap($name$_, other->$name$_);\n"); } void MessageFieldGenerator:: GenerateDestructorCode(io::Printer* printer) const { // TODO(gerbens) Remove this when we don't need to destruct default instances. // In google3 a default instance will never get deleted so we don't need to // worry about that but in opensource protobuf default instances are deleted // in shutdown process and we need to take special care when handling them. printer->Print(variables_, "if (this != internal_default_instance()) "); printer->Print(variables_, "delete $name$_;\n"); } void MessageFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = NULL;\n"); } void MessageFieldGenerator:: GenerateCopyConstructorCode(io::Printer* printer) const { // For non-Arena enabled messages, everything always goes on the heap. // // For Arena enabled messages, the logic is a bit more convoluted. // // In the copy constructor, we call InternalMetadataWithArena::MergeFrom, // which does *not* copy the Arena pointer. In the generated MergeFrom // (see MessageFieldGenerator::GenerateMergingCode), we: // -> copy the has bits (but this is done in bulk by a memcpy in the copy // constructor) // -> check whether the destination field pointer is NULL (it will be, since // we're initializing it and would have called SharedCtor) and if so: // -> call _slow_mutable_$name$(), which calls either // ::google::protobuf::Arena::CreateMessage<>(GetArenaNoVirtual()), or // ::google::protobuf::Arena::Create<>(GetArenaNoVirtual()) // // At this point, GetArenaNoVirtual returns NULL since the Arena pointer // wasn't copied, so both of these methods allocate the submessage on the // heap. string new_expression = (implicit_weak_field_ ? "from.$name$_->New()" : "new $type$(*from.$name$_)"); string output = "if (from.has_$name$()) {\n" " $name$_ = " + new_expression + ";\n" "} else {\n" " $name$_ = NULL;\n" "}\n"; printer->Print(variables_, output.c_str()); } void MessageFieldGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) const { if (implicit_weak_field_) { printer->Print(variables_, "DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(\n" " input, _internal_mutable_$name$()));\n"); } else if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) { printer->Print(variables_, "DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(\n" " input, mutable_$name$()));\n"); } else { printer->Print(variables_, "DO_(::google::protobuf::internal::WireFormatLite::ReadGroup(\n" " $number$, input, mutable_$name$()));\n"); } } void MessageFieldGenerator:: GenerateSerializeWithCachedSizes(io::Printer* printer) const { printer->Print(variables_, "::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n" " $number$, *$non_null_ptr_to_name$, output);\n"); } void MessageFieldGenerator:: GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { printer->Print(variables_, "target = ::google::protobuf::internal::WireFormatLite::\n" " InternalWrite$declared_type$ToArray(\n" " $number$, *$non_null_ptr_to_name$, deterministic, target);\n"); } void MessageFieldGenerator:: GenerateByteSize(io::Printer* printer) const { printer->Print(variables_, "total_size += $tag_size$ +\n" " ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n" " *$non_null_ptr_to_name$);\n"); } // =================================================================== MessageOneofFieldGenerator:: MessageOneofFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : MessageFieldGenerator(descriptor, options), dependent_base_(options.proto_h) { SetCommonOneofFieldVariables(descriptor, &variables_); } MessageOneofFieldGenerator::~MessageOneofFieldGenerator() {} void MessageOneofFieldGenerator::GenerateNonInlineAccessorDefinitions( io::Printer* printer) const { printer->Print(variables_, "void $classname$::set_allocated_$name$($type$* $name$) {\n" " ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();\n" " clear_$oneof_name$();\n" " if ($name$) {\n"); if (SupportsArenas(descriptor_->message_type()) && descriptor_->file() != descriptor_->message_type()->file()) { // We have to read the arena through the virtual method, because the type // isn't defined in this file. printer->Print(variables_, " ::google::protobuf::Arena* submessage_arena =\n" " reinterpret_cast< ::google::protobuf::MessageLite*>($name$)->GetArena();\n"); } else if (!SupportsArenas(descriptor_->message_type())) { printer->Print(variables_, " ::google::protobuf::Arena* submessage_arena = NULL;\n"); } else { printer->Print(variables_, " ::google::protobuf::Arena* submessage_arena =\n" " ::google::protobuf::Arena::GetArena($name$);\n"); } printer->Print(variables_, " if (message_arena != submessage_arena) {\n" " $name$ = ::google::protobuf::internal::GetOwnedMessage(\n" " message_arena, $name$, submessage_arena);\n" " }\n" " set_has_$name$();\n" " $oneof_prefix$$name$_ = $name$;\n" " }\n" " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" "}\n"); } void MessageOneofFieldGenerator:: GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { // For the CRTP base class, all mutation methods are dependent, and so // they must be in the header. if (!dependent_base_) { return; } std::map variables(variables_); variables["dependent_classname"] = DependentBaseClassTemplateName(descriptor_->containing_type()) + ""; variables["this_message"] = "reinterpret_cast(this)->"; // Const message access is needed for the dependent getter. variables["this_const_message"] = "reinterpret_cast(this)->"; variables["tmpl"] = "template \n"; variables["field_member"] = variables["this_message"] + variables["oneof_prefix"] + variables["name"] + "_"; InternalGenerateInlineAccessorDefinitions(variables, printer); } void MessageOneofFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { std::map variables(variables_); variables["dependent_classname"] = variables["classname"]; variables["this_message"] = ""; variables["this_const_message"] = ""; variables["tmpl"] = ""; variables["field_member"] = variables["oneof_prefix"] + variables["name"] + "_"; variables["dependent_type"] = variables["type"]; printer->Print(variables, "inline $type$* $classname$::$release_name$() {\n" " // @@protoc_insertion_point(field_release:$full_name$)\n" " if ($this_message$has_$name$()) {\n" " $this_message$clear_has_$oneof_name$();\n" " $type$* temp = $field_member$;\n"); if (SupportsArenas(descriptor_)) { printer->Print(variables, " if ($this_message$GetArenaNoVirtual() != NULL) {\n" " temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL);\n" " }\n"); } printer->Print(variables, " $field_member$ = NULL;\n" " return temp;\n" " } else {\n" " return NULL;\n" " }\n" "}\n"); printer->Print(variables, "inline const $type$& $classname$::$name$() const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " return $this_const_message$has_$name$()\n" " ? *$this_const_message$$oneof_prefix$$name$_\n" " : *reinterpret_cast< $type$*>(&$type_default_instance$);\n" "}\n"); if (SupportsArenas(descriptor_)) { printer->Print(variables, "inline $type$* $dependent_classname$::unsafe_arena_release_$name$() {\n" " // @@protoc_insertion_point(field_unsafe_arena_release" ":$full_name$)\n" " if ($this_message$has_$name$()) {\n" " $this_message$clear_has_$oneof_name$();\n" " $type$* temp = $this_message$$oneof_prefix$$name$_;\n" " $this_message$$oneof_prefix$$name$_ = NULL;\n" " return temp;\n" " } else {\n" " return NULL;\n" " }\n" "}\n" "inline void $classname$::unsafe_arena_set_allocated_$name$" "($type$* $name$) {\n" // We rely on the oneof clear method to free the earlier contents of this // oneof. We can directly use the pointer we're given to set the new // value. " clear_$oneof_name$();\n" " if ($name$) {\n" " set_has_$name$();\n" " $oneof_prefix$$name$_ = $name$;\n" " }\n" " // @@protoc_insertion_point(field_unsafe_arena_set_allocated:" "$full_name$)\n" "}\n"); } if (dependent_base_) { return; } InternalGenerateInlineAccessorDefinitions(variables, printer); } void MessageOneofFieldGenerator::InternalGenerateInlineAccessorDefinitions( const std::map& variables, io::Printer* printer) const { if (SupportsArenas(descriptor_)) { printer->Print(variables, "$tmpl$" "inline $type$* $dependent_classname$::mutable_$name$() {\n" " if (!$this_message$has_$name$()) {\n" " $this_message$clear_$oneof_name$();\n" " $this_message$set_has_$name$();\n"); if (SupportsArenas(descriptor_->message_type())) { printer->Print(variables, " $field_member$ = \n" " ::google::protobuf::Arena::CreateMessage< $dependent_typename$ >(\n" " $this_message$GetArenaNoVirtual());\n"); } else { printer->Print(variables, " $this_message$$oneof_prefix$$name$_ = \n" " ::google::protobuf::Arena::Create< $dependent_typename$ >(\n" " $this_message$GetArenaNoVirtual());\n"); } printer->Print(variables, " }\n" " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $field_member$;\n" "}\n"); } else { printer->Print(variables, "$tmpl$" "inline $type$* $dependent_classname$::mutable_$name$() {\n" " if (!$this_message$has_$name$()) {\n" " $this_message$clear_$oneof_name$();\n" " $this_message$set_has_$name$();\n" " $field_member$ = new $dependent_typename$;\n" " }\n" " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $field_member$;\n" "}\n"); } } void MessageOneofFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { if (SupportsArenas(descriptor_)) { printer->Print(variables_, "if (GetArenaNoVirtual() == NULL) {\n" " delete $oneof_prefix$$name$_;\n" "}\n"); } else { printer->Print(variables_, "delete $oneof_prefix$$name$_;\n"); } } void MessageOneofFieldGenerator:: GenerateMessageClearingCode(io::Printer* printer) const { GenerateClearingCode(printer); } void MessageOneofFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { // Don't print any swapping code. Swapping the union will swap this field. } void MessageOneofFieldGenerator:: GenerateDestructorCode(io::Printer* printer) const { // We inherit from MessageFieldGenerator, so we need to override the default // behavior. } void MessageOneofFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { // Don't print any constructor code. The field is in a union. We allocate // space only when this field is used. } // =================================================================== RepeatedMessageFieldGenerator::RepeatedMessageFieldGenerator( const FieldDescriptor* descriptor, const Options& options) : FieldGenerator(options), descriptor_(descriptor), dependent_field_(options.proto_h && IsFieldDependent(descriptor)), dependent_getter_(dependent_field_ && options.safe_boundary_check) { SetMessageVariables(descriptor, &variables_, options); } RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {} void RepeatedMessageFieldGenerator:: GeneratePrivateMembers(io::Printer* printer) const { printer->Print(variables_, "::google::protobuf::RepeatedPtrField< $type$ > $name$_;\n"); } void RepeatedMessageFieldGenerator:: InternalGenerateTypeDependentAccessorDeclarations(io::Printer* printer) const { printer->Print(variables_, "$deprecated_attr$$type$* ${$mutable_$name$$}$(int index);\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "$deprecated_attr$$type$* ${$add_$name$$}$();\n"); printer->Annotate("{", "}", descriptor_); if (dependent_getter_) { printer->Print(variables_, "$deprecated_attr$const ::google::protobuf::RepeatedPtrField< $type$ >&\n" " $name$() const;\n"); printer->Annotate("name", descriptor_); } printer->Print(variables_, "$deprecated_attr$::google::protobuf::RepeatedPtrField< $type$ >*\n" " ${$mutable_$name$$}$();\n"); printer->Annotate("{", "}", descriptor_); } void RepeatedMessageFieldGenerator:: GenerateDependentAccessorDeclarations(io::Printer* printer) const { if (dependent_getter_) { printer->Print(variables_, "$deprecated_attr$const $type$& $name$(int index) const;\n"); printer->Annotate("name", descriptor_); } if (dependent_field_) { InternalGenerateTypeDependentAccessorDeclarations(printer); } } void RepeatedMessageFieldGenerator:: GenerateAccessorDeclarations(io::Printer* printer) const { if (!dependent_getter_) { printer->Print(variables_, "$deprecated_attr$const $type$& $name$(int index) const;\n"); printer->Annotate("name", descriptor_); } if (!dependent_field_) { InternalGenerateTypeDependentAccessorDeclarations(printer); } if (!dependent_getter_) { printer->Print(variables_, "$deprecated_attr$const ::google::protobuf::RepeatedPtrField< $type$ >&\n" " $name$() const;\n"); printer->Annotate("name", descriptor_); } } void RepeatedMessageFieldGenerator:: GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { if (!dependent_field_) { return; } std::map variables(variables_); // For the CRTP base class, all mutation methods are dependent, and so // they must be in the header. variables["dependent_classname"] = DependentBaseClassTemplateName(descriptor_->containing_type()) + ""; variables["this_message"] = DependentBaseDownCast(); variables["this_const_message"] = DependentBaseConstDownCast(); if (dependent_getter_) { printer->Print(variables, "template \n" "inline const $type$& $dependent_classname$::$name$(int index) const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " return $this_const_message$$name$_.$cppget$(index);\n" "}\n"); } // Generate per-element accessors: printer->Print(variables, "template \n" "inline $type$* $dependent_classname$::mutable_$name$(int index) {\n" // TODO(dlj): move insertion points " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $this_message$$name$_.Mutable(index);\n" "}\n" "template \n" "inline $type$* $dependent_classname$::add_$name$() {\n" " // @@protoc_insertion_point(field_add:$full_name$)\n" " return $this_message$$name$_.Add();\n" "}\n"); if (dependent_getter_) { printer->Print(variables, "template \n" "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n" "$dependent_classname$::$name$() const {\n" " // @@protoc_insertion_point(field_list:$full_name$)\n" " return $this_const_message$$name$_;\n" "}\n"); } // Generate mutable access to the entire list: printer->Print(variables, "template \n" "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n" "$dependent_classname$::mutable_$name$() {\n" " // @@protoc_insertion_point(field_mutable_list:$full_name$)\n" " return &$this_message$$name$_;\n" "}\n"); } void RepeatedMessageFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { if (!dependent_getter_) { printer->Print(variables_, "inline const $type$& $classname$::$name$(int index) const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " return $name$_.$cppget$(index);\n" "}\n"); } if (!dependent_field_) { printer->Print(variables_, "inline $type$* $classname$::mutable_$name$(int index) {\n" // TODO(dlj): move insertion points " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $name$_.Mutable(index);\n" "}\n" "inline $type$* $classname$::add_$name$() {\n" " // @@protoc_insertion_point(field_add:$full_name$)\n" " return $name$_.Add();\n" "}\n"); } if (!dependent_field_) { printer->Print(variables_, "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n" "$classname$::mutable_$name$() {\n" " // @@protoc_insertion_point(field_mutable_list:$full_name$)\n" " return &$name$_;\n" "}\n"); } if (!dependent_getter_) { printer->Print(variables_, "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n" "$classname$::$name$() const {\n" " // @@protoc_insertion_point(field_list:$full_name$)\n" " return $name$_;\n" "}\n"); } } void RepeatedMessageFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.Clear();\n"); } void RepeatedMessageFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); } void RepeatedMessageFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.InternalSwap(&other->$name$_);\n"); } void RepeatedMessageFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { // Not needed for repeated fields. } void RepeatedMessageFieldGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) const { if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) { printer->Print(variables_, "DO_(::google::protobuf::internal::WireFormatLite::" "ReadMessage(input, add_$name$()));\n"); } else { printer->Print(variables_, "DO_(::google::protobuf::internal::WireFormatLite::" "ReadGroup($number$, input, add_$name$()));\n"); } } void RepeatedMessageFieldGenerator:: GenerateSerializeWithCachedSizes(io::Printer* printer) const { printer->Print(variables_, "for (unsigned int i = 0,\n" " n = static_cast(this->$name$_size()); i < n; i++) {\n" " ::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n" " $number$, this->$name$(static_cast(i)), output);\n" "}\n"); } void RepeatedMessageFieldGenerator:: GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { printer->Print(variables_, "for (unsigned int i = 0,\n" " n = static_cast(this->$name$_size()); i < n; i++) {\n" " target = ::google::protobuf::internal::WireFormatLite::\n" " InternalWrite$declared_type$ToArray(\n" " $number$, this->$name$(static_cast(i)), deterministic, target);\n" "}\n"); } void RepeatedMessageFieldGenerator:: GenerateByteSize(io::Printer* printer) const { printer->Print(variables_, "{\n" " unsigned int count = static_cast(this->$name$_size());\n"); printer->Indent(); printer->Print(variables_, "total_size += $tag_size$UL * count;\n" "for (unsigned int i = 0; i < count; i++) {\n" " total_size +=\n" " ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n" " this->$name$(static_cast(i)));\n" "}\n"); printer->Outdent(); printer->Print("}\n"); } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h000066400000000000000000000147061334102242000334770ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { bool IsImplicitWeakField(const FieldDescriptor* field, const Options& options); class MessageFieldGenerator : public FieldGenerator { public: MessageFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~MessageFieldGenerator(); // implements FieldGenerator --------------------------------------- void GeneratePrivateMembers(io::Printer* printer) const; void GenerateDependentAccessorDeclarations(io::Printer* printer) const; void GenerateAccessorDeclarations(io::Printer* printer) const; void GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const; void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateNonInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; void GenerateMessageClearingCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateDestructorCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; void GenerateCopyConstructorCode(io::Printer* printer) const; void GenerateMergeFromCodedStream(io::Printer* printer) const; void GenerateSerializeWithCachedSizes(io::Printer* printer) const; void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; void GenerateByteSize(io::Printer* printer) const; protected: const FieldDescriptor* descriptor_; const bool dependent_field_; const bool implicit_weak_field_; std::map variables_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator); }; class MessageOneofFieldGenerator : public MessageFieldGenerator { public: MessageOneofFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~MessageOneofFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const; void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateNonInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; // MessageFieldGenerator, from which we inherit, overrides this so we need to // override it as well. void GenerateMessageClearingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateDestructorCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; private: void InternalGenerateInlineAccessorDefinitions( const std::map& variables, io::Printer* printer) const; const bool dependent_base_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageOneofFieldGenerator); }; class RepeatedMessageFieldGenerator : public FieldGenerator { public: RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~RepeatedMessageFieldGenerator(); // implements FieldGenerator --------------------------------------- void GeneratePrivateMembers(io::Printer* printer) const; void GenerateDependentAccessorDeclarations(io::Printer* printer) const; void GenerateAccessorDeclarations(io::Printer* printer) const; void GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const; void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; void GenerateCopyConstructorCode(io::Printer* printer) const {} void GenerateMergeFromCodedStream(io::Printer* printer) const; void GenerateSerializeWithCachedSizes(io::Printer* printer) const; void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; void GenerateByteSize(io::Printer* printer) const; private: void InternalGenerateTypeDependentAccessorDeclarations( io::Printer* printer) const; const FieldDescriptor* descriptor_; const bool dependent_field_; const bool dependent_getter_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_FIELD_H__ cpp_message_layout_helper.h000066400000000000000000000050221334102242000352000ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp// 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: seongkim@google.com (Seong Beom Kim) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_LAYOUT_HELPER_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_LAYOUT_HELPER_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { // Provides an abstract interface to optimize message layout // by rearranging the fields of a message. class MessageLayoutHelper { public: virtual ~MessageLayoutHelper() {} virtual void OptimizeLayout(std::vector* fields, const Options& options) = 0; }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_LAYOUT_HELPER_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_move_unittest.cc000066400000000000000000000140761334102242000337530ustar00rootroot00000000000000// 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 #include #include #include #if LANG_CXX11 #include #endif namespace google { namespace protobuf { namespace compiler { namespace cpp { // Can't use an anonymous namespace here due to brokenness of Tru64 compiler. namespace cpp_unittest { // Moves are enabled only when compiling with a C++11 compiler or newer. #if LANG_CXX11 TEST(MovableMessageTest, MoveConstructor) { protobuf_unittest::TestAllTypes message1; TestUtil::SetAllFields(&message1); const auto* nested = &message1.optional_nested_message(); protobuf_unittest::TestAllTypes message2(std::move(message1)); TestUtil::ExpectAllFieldsSet(message2); // Check if the optional_nested_message was actually moved (and not just // copied). EXPECT_EQ(nested, &message2.optional_nested_message()); EXPECT_NE(nested, &message1.optional_nested_message()); } TEST(MovableMessageTest, MoveAssignmentOperator) { protobuf_unittest::TestAllTypes message1; TestUtil::SetAllFields(&message1); const auto* nested = &message1.optional_nested_message(); protobuf_unittest::TestAllTypes message2; message2 = std::move(message1); TestUtil::ExpectAllFieldsSet(message2); // Check if the optional_nested_message was actually moved (and not just // copied). EXPECT_EQ(nested, &message2.optional_nested_message()); EXPECT_NE(nested, &message1.optional_nested_message()); } TEST(MovableMessageTest, SelfMoveAssignment) { // The `self` reference is necessary to defeat -Wself-move. protobuf_unittest::TestAllTypes message, &self = message; TestUtil::SetAllFields(&message); message = std::move(self); TestUtil::ExpectAllFieldsSet(message); } TEST(MovableMessageTest, MoveSameArena) { Arena arena; auto* message1_on_arena = Arena::CreateMessage(&arena); TestUtil::SetAllFields(message1_on_arena); const auto* nested = &message1_on_arena->optional_nested_message(); auto* message2_on_arena = Arena::CreateMessage(&arena); // Moving messages on the same arena should lead to swapped pointers. *message2_on_arena = std::move(*message1_on_arena); EXPECT_EQ(nested, &message2_on_arena->optional_nested_message()); } TEST(MovableMessageTest, MoveDifferentArenas) { Arena arena1, arena2; auto* message1_on_arena = Arena::CreateMessage(&arena1); TestUtil::SetAllFields(message1_on_arena); const auto* nested = &message1_on_arena->optional_nested_message(); auto* message2_on_arena = Arena::CreateMessage(&arena2); // Moving messages on two different arenas should lead to a copy. *message2_on_arena = std::move(*message1_on_arena); EXPECT_NE(nested, &message2_on_arena->optional_nested_message()); TestUtil::ExpectAllFieldsSet(*message1_on_arena); TestUtil::ExpectAllFieldsSet(*message2_on_arena); } TEST(MovableMessageTest, MoveFromArena) { Arena arena; auto* message1_on_arena = Arena::CreateMessage(&arena); TestUtil::SetAllFields(message1_on_arena); const auto* nested = &message1_on_arena->optional_nested_message(); protobuf_unittest::TestAllTypes message2; // Moving from a message on the arena should lead to a copy. message2 = std::move(*message1_on_arena); EXPECT_NE(nested, &message2.optional_nested_message()); TestUtil::ExpectAllFieldsSet(*message1_on_arena); TestUtil::ExpectAllFieldsSet(message2); } TEST(MovableMessageTest, MoveToArena) { Arena arena; protobuf_unittest::TestAllTypes message1; TestUtil::SetAllFields(&message1); const auto* nested = &message1.optional_nested_message(); auto* message2_on_arena = Arena::CreateMessage(&arena); // Moving to a message on the arena should lead to a copy. *message2_on_arena = std::move(message1); EXPECT_NE(nested, &message2_on_arena->optional_nested_message()); TestUtil::ExpectAllFieldsSet(message1); TestUtil::ExpectAllFieldsSet(*message2_on_arena); } TEST(MovableMessageTest, Noexcept) { EXPECT_TRUE( std::is_nothrow_move_constructible()); EXPECT_TRUE(std::is_nothrow_move_assignable()); } #endif // LANG_CXX11 } // namespace cpp_unittest } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_options.h000066400000000000000000000054611334102242000324010ustar00rootroot00000000000000// 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: rennie@google.com (Jeffrey Rennie) #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_OPTIONS_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_OPTIONS_H__ #include #include namespace google { namespace protobuf { namespace compiler { class AccessInfoMap; namespace cpp { // Generator options (see generator.cc for a description of each): struct Options { Options() : safe_boundary_check(false), proto_h(false), transitive_pb_h(true), annotate_headers(false), enforce_lite(false), table_driven_parsing(false), table_driven_serialization(false), lite_implicit_weak_fields(false), access_info_map(NULL) {} string dllexport_decl; bool safe_boundary_check; bool proto_h; bool transitive_pb_h; bool annotate_headers; bool enforce_lite; bool table_driven_parsing; bool table_driven_serialization; bool lite_implicit_weak_fields; string annotation_pragma_name; string annotation_guard_name; const AccessInfoMap* access_info_map; }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_OPTIONS_H__ cpp_padding_optimizer.cc000066400000000000000000000212151334102242000344700ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp// 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 #include namespace google { namespace protobuf { namespace compiler { namespace cpp { namespace { // FieldGroup is just a helper for PaddingOptimizer below. It holds a vector of // fields that are grouped together because they have compatible alignment, and // a preferred location in the final field ordering. class FieldGroup { public: FieldGroup() : preferred_location_(0) {} // A group with a single field. FieldGroup(float preferred_location, const FieldDescriptor* field) : preferred_location_(preferred_location), fields_(1, field) {} // Append the fields in 'other' to this group. void Append(const FieldGroup& other) { if (other.fields_.empty()) { return; } // Preferred location is the average among all the fields, so we weight by // the number of fields on each FieldGroup object. preferred_location_ = (preferred_location_ * fields_.size() + (other.preferred_location_ * other.fields_.size())) / (fields_.size() + other.fields_.size()); fields_.insert(fields_.end(), other.fields_.begin(), other.fields_.end()); } void SetPreferredLocation(float location) { preferred_location_ = location; } const std::vector& fields() const { return fields_; } // FieldGroup objects sort by their preferred location. bool operator<(const FieldGroup& other) const { return preferred_location_ < other.preferred_location_; } private: // "preferred_location_" is an estimate of where this group should go in the // final list of fields. We compute this by taking the average index of each // field in this group in the original ordering of fields. This is very // approximate, but should put this group close to where its member fields // originally went. float preferred_location_; std::vector fields_; // We rely on the default copy constructor and operator= so this type can be // used in a vector. }; } // 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. // // // 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* fields, const Options& options) { // The sorted numeric order of Family determines the declaration order in the // memory layout. enum Family { REPEATED = 0, STRING = 1, MESSAGE = 3, ZERO_INITIALIZABLE = 4, OTHER = 5, kMaxFamily }; // First divide fields into those that align to 1 byte, 4 bytes or 8 bytes. std::vector aligned_to_1[kMaxFamily]; std::vector aligned_to_4[kMaxFamily]; std::vector aligned_to_8[kMaxFamily]; for (int i = 0; i < fields->size(); ++i) { const FieldDescriptor* field = (*fields)[i]; Family f = OTHER; if (field->is_repeated()) { f = REPEATED; } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { f = STRING; } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { f = MESSAGE; } else if (CanInitializeByZeroing(field)) { f = ZERO_INITIALIZABLE; } const int j = field->number(); switch (EstimateAlignmentSize(field)) { case 1: aligned_to_1[f].push_back(FieldGroup(j, field)); break; case 4: aligned_to_4[f].push_back(FieldGroup(j, field)); break; case 8: aligned_to_8[f].push_back(FieldGroup(j, field)); break; default: GOOGLE_LOG(FATAL) << "Unknown alignment size " << EstimateAlignmentSize(field) << "for a field " << field->full_name() << "."; } } // For each family, group fields to optimize padding. for (int f = 0; f < kMaxFamily; f++) { // Now group fields aligned to 1 byte into sets of 4, and treat those like a // single field aligned to 4 bytes. for (int i = 0; i < aligned_to_1[f].size(); i += 4) { FieldGroup field_group; for (int j = i; j < aligned_to_1[f].size() && j < i + 4; ++j) { field_group.Append(aligned_to_1[f][j]); } aligned_to_4[f].push_back(field_group); } // Sort by preferred location to keep fields as close to their field number // order as possible. Using stable_sort ensures that the output is // consistent across runs. std::stable_sort(aligned_to_4[f].begin(), aligned_to_4[f].end()); // Now group fields aligned to 4 bytes (or the 4-field groups created above) // into pairs, and treat those like a single field aligned to 8 bytes. for (int i = 0; i < aligned_to_4[f].size(); i += 2) { FieldGroup field_group; for (int j = i; j < aligned_to_4[f].size() && j < i + 2; ++j) { field_group.Append(aligned_to_4[f][j]); } if (i == aligned_to_4[f].size() - 1) { if (f == OTHER) { // Move incomplete 4-byte block to the beginning. This is done to // pair with the (possible) leftover blocks from the // ZERO_INITIALIZABLE family. field_group.SetPreferredLocation(-1); } else { // Move incomplete 4-byte block to the end. field_group.SetPreferredLocation(fields->size() + 1); } } aligned_to_8[f].push_back(field_group); } // Sort by preferred location. std::stable_sort(aligned_to_8[f].begin(), aligned_to_8[f].end()); } // Now pull out all the FieldDescriptors in order. fields->clear(); for (int f = 0; f < kMaxFamily; ++f) { for (int i = 0; i < aligned_to_8[f].size(); ++i) { fields->insert(fields->end(), aligned_to_8[f][i].fields().begin(), aligned_to_8[f][i].fields().end()); } } } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google cpp_padding_optimizer.h000066400000000000000000000052251334102242000343350ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp// 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: seongkim@google.com (Seong Beom Kim) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_PADDING_OPTIMIZER_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_PADDING_OPTIMIZER_H__ #include namespace google { namespace protobuf { namespace compiler { namespace cpp { // Rearranges the fields of a message to minimize padding. // Fields are grouped by the type and the size. // For example, grouping four boolean fields and one int32 // field results in zero padding overhead. See OptimizeLayout's // comment for details. class PaddingOptimizer : public MessageLayoutHelper { public: PaddingOptimizer() {} ~PaddingOptimizer() {} void OptimizeLayout(std::vector* fields, const Options& options); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_PADDING_OPTIMIZER_H__ cpp_plugin_unittest.cc000066400000000000000000000270601334102242000342210ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp// 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) // // TODO(kenton): Share code with the versions of this test in other languages? // It seemed like parameterizing it would add more complexity than it is // worth. #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { namespace { class TestGenerator : public CodeGenerator { public: TestGenerator() {} ~TestGenerator() {} virtual bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const { TryInsert("test.pb.h", "includes", context); TryInsert("test.pb.h", "namespace_scope", context); TryInsert("test.pb.h", "global_scope", context); TryInsert("test.pb.h", "class_scope:foo.Bar", context); TryInsert("test.pb.h", "class_scope:foo.Bar.Baz", context); TryInsert("test.pb.cc", "includes", context); TryInsert("test.pb.cc", "namespace_scope", context); TryInsert("test.pb.cc", "global_scope", context); // Check field accessors for an optional int32: TryInsert("test.pb.h", "field_get:foo.Bar.optInt", context); TryInsert("test.pb.h", "field_set:foo.Bar.optInt", context); // Check field accessors for a repeated int32: TryInsert("test.pb.h", "field_get:foo.Bar.repeatedInt", context); TryInsert("test.pb.h", "field_set:foo.Bar.repeatedInt", context); // Check field accessors for a required string: TryInsert("test.pb.h", "field_get:foo.Bar.requiredString", context); TryInsert("test.pb.h", "field_set:foo.Bar.requiredString", context); TryInsert("test.pb.h", "field_set_char:foo.Bar.requiredString", context); TryInsert("test.pb.h", "field_set_pointer:foo.Bar.requiredString", context); TryInsert("test.pb.h", "field_mutable:foo.Bar.requiredString", context); TryInsert("test.pb.h", "field_set_allocated:foo.Bar.requiredString", context); TryInsert("test.pb.h", "field_set_char:foo.Bar.requiredString", context); TryInsert("test.pb.h", "field_set_pointer:foo.Bar.requiredString", context); // Check field accessors for a repeated string: TryInsert("test.pb.h", "field_get:foo.Bar.repeatedString", context); TryInsert("test.pb.h", "field_set:foo.Bar.repeatedString", context); TryInsert("test.pb.h", "field_set_char:foo.Bar.repeatedString", context); TryInsert("test.pb.h", "field_set_pointer:foo.Bar.repeatedString", context); TryInsert("test.pb.h", "field_mutable:foo.Bar.repeatedString", context); TryInsert("test.pb.h", "field_set_char:foo.Bar.repeatedString", context); TryInsert("test.pb.h", "field_set_pointer:foo.Bar.repeatedString", context); // Check field accessors for an int inside oneof{}: TryInsert("test.pb.h", "field_get:foo.Bar.oneOfInt", context); TryInsert("test.pb.h", "field_set:foo.Bar.oneOfInt", context); // Check field accessors for a string inside oneof{}: TryInsert("test.pb.h", "field_get:foo.Bar.oneOfString", context); TryInsert("test.pb.h", "field_set:foo.Bar.oneOfString", context); TryInsert("test.pb.h", "field_set_char:foo.Bar.oneOfString", context); TryInsert("test.pb.h", "field_set_pointer:foo.Bar.oneOfString", context); TryInsert("test.pb.h", "field_mutable:foo.Bar.oneOfString", context); TryInsert("test.pb.h", "field_set_allocated:foo.Bar.oneOfString", context); TryInsert("test.pb.h", "field_set_char:foo.Bar.oneOfString", context); TryInsert("test.pb.h", "field_set_pointer:foo.Bar.oneOfString", context); // Check field accessors for an optional message: TryInsert("test.pb.h", "field_get:foo.Bar.optMessage", context); TryInsert("test.pb.h", "field_mutable:foo.Bar.optMessage", context); TryInsert("test.pb.h", "field_set_allocated:foo.Bar.optMessage", context); // Check field accessors for a repeated message: TryInsert("test.pb.h", "field_add:foo.Bar.repeatedMessage", context); TryInsert("test.pb.h", "field_get:foo.Bar.repeatedMessage", context); TryInsert("test.pb.h", "field_list:foo.Bar.repeatedMessage", context); TryInsert("test.pb.h", "field_mutable:foo.Bar.repeatedMessage", context); TryInsert("test.pb.h", "field_mutable_list:foo.Bar.repeatedMessage", context); // Check field accessors for a message inside oneof{}: TryInsert("test.pb.h", "field_get:foo.Bar.oneOfMessage", context); TryInsert("test.pb.h", "field_mutable:foo.Bar.oneOfMessage", context); TryInsert("test.pb.cc", "field_set_allocated:foo.Bar.oneOfMessage", context); // Check field accessors for an optional enum: TryInsert("test.pb.h", "field_get:foo.Bar.optEnum", context); TryInsert("test.pb.h", "field_set:foo.Bar.optEnum", context); // Check field accessors for a repeated enum: TryInsert("test.pb.h", "field_get:foo.Bar.repeatedEnum", context); TryInsert("test.pb.h", "field_set:foo.Bar.repeatedEnum", context); TryInsert("test.pb.h", "field_add:foo.Bar.repeatedEnum", context); TryInsert("test.pb.h", "field_list:foo.Bar.repeatedEnum", context); TryInsert("test.pb.h", "field_mutable_list:foo.Bar.repeatedEnum", context); // Check field accessors for an enum inside oneof{}: TryInsert("test.pb.h", "field_get:foo.Bar.oneOfEnum", context); TryInsert("test.pb.h", "field_set:foo.Bar.oneOfEnum", context); // Check field accessors for a required cord: TryInsert("test.pb.h", "field_get:foo.Bar.requiredCord", context); TryInsert("test.pb.h", "field_set:foo.Bar.requiredCord", context); TryInsert("test.pb.h", "field_mutable:foo.Bar.requiredCord", context); // Check field accessors for a repeated cord: TryInsert("test.pb.h", "field_get:foo.Bar.repeatedCord", context); TryInsert("test.pb.h", "field_set:foo.Bar.repeatedCord", context); TryInsert("test.pb.h", "field_add:foo.Bar.repeatedCord", context); TryInsert("test.pb.h", "field_list:foo.Bar.repeatedCord", context); TryInsert("test.pb.h", "field_mutable:foo.Bar.repeatedCord", context); TryInsert("test.pb.h", "field_mutable_list:foo.Bar.repeatedCord", context); // Check field accessors for a cord inside oneof{}: TryInsert("test.pb.h", "field_get:foo.Bar.oneOfCord", context); TryInsert("test.pb.h", "field_set:foo.Bar.oneOfCord", context); TryInsert("test.pb.h", "field_mutable:foo.Bar.oneOfCord", context); return true; } void TryInsert(const string& filename, const string& insertion_point, GeneratorContext* context) const { google::protobuf::scoped_ptr output( context->OpenForInsert(filename, insertion_point)); io::Printer printer(output.get(), '$'); printer.Print("// inserted $name$\n", "name", insertion_point); } }; // This test verifies that all the expected insertion points exist. It does // not verify that they are correctly-placed; that would require actually // compiling the output which is a bit more than I care to do for this test. TEST(CppPluginTest, PluginTest) { GOOGLE_CHECK_OK(File::SetContents(TestTempDir() + "/test.proto", "syntax = \"proto2\";\n" "package foo;\n" "\n" "enum Thud { VALUE = 0; }\n" "\n" "message Bar {\n" " message Baz {}\n" " optional int32 optInt = 1;\n" " repeated int32 repeatedInt = 2;\n" "\n" " required string requiredString = 3;\n" " repeated string repeatedString = 4;\n" "\n" " optional Baz optMessage = 6;\n" " repeated Baz repeatedMessage = 7;\n" "\n" " optional Thud optEnum = 8;\n" " repeated Thud repeatedEnum = 9;\n" "\n" " required string requiredCord = 10 [\n" " ctype = CORD\n" " ];\n" " repeated string repeatedCord = 11 [\n" " ctype = CORD\n" " ];\n" "\n" " oneof Qux {\n" " int64 oneOfInt = 20;\n" " string oneOfString = 21;\n" " Baz oneOfMessage = 22;\n" " Thud oneOfEnum = 23;" " string oneOfCord = 24 [\n" " ctype = CORD\n" " ];\n" " }\n" "}\n", true)); google::protobuf::compiler::CommandLineInterface cli; cli.SetInputsAreProtoPathRelative(true); CppGenerator cpp_generator; TestGenerator test_generator; cli.RegisterGenerator("--cpp_out", &cpp_generator, ""); cli.RegisterGenerator("--test_out", &test_generator, ""); string proto_path = "-I" + TestTempDir(); string cpp_out = "--cpp_out=" + TestTempDir(); string test_out = "--test_out=" + TestTempDir(); const char* argv[] = { "protoc", proto_path.c_str(), cpp_out.c_str(), test_out.c_str(), "test.proto" }; EXPECT_EQ(0, cli.Run(5, argv)); } } // namespace } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google cpp_primitive_field.cc000066400000000000000000000436041334102242000341410ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp// 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 #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { using internal::WireFormatLite; namespace { // For encodings with fixed sizes, returns that size in bytes. Otherwise // returns -1. int FixedSize(FieldDescriptor::Type type) { switch (type) { case FieldDescriptor::TYPE_INT32 : return -1; case FieldDescriptor::TYPE_INT64 : return -1; case FieldDescriptor::TYPE_UINT32 : return -1; case FieldDescriptor::TYPE_UINT64 : return -1; case FieldDescriptor::TYPE_SINT32 : return -1; case FieldDescriptor::TYPE_SINT64 : return -1; case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size; case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size; case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size; case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size; case FieldDescriptor::TYPE_FLOAT : return WireFormatLite::kFloatSize; case FieldDescriptor::TYPE_DOUBLE : return WireFormatLite::kDoubleSize; case FieldDescriptor::TYPE_BOOL : return WireFormatLite::kBoolSize; case FieldDescriptor::TYPE_ENUM : return -1; case FieldDescriptor::TYPE_STRING : return -1; case FieldDescriptor::TYPE_BYTES : return -1; case FieldDescriptor::TYPE_GROUP : return -1; case FieldDescriptor::TYPE_MESSAGE : return -1; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return -1; } void SetPrimitiveVariables(const FieldDescriptor* descriptor, std::map* variables, const Options& options) { SetCommonFieldVariables(descriptor, variables, options); (*variables)["type"] = PrimitiveTypeName(descriptor->cpp_type()); (*variables)["default"] = DefaultValue(descriptor); (*variables)["tag"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor)); int fixed_size = FixedSize(descriptor->type()); if (fixed_size != -1) { (*variables)["fixed_size"] = SimpleItoa(fixed_size); } (*variables)["wire_format_field_type"] = "::google::protobuf::internal::WireFormatLite::" + FieldDescriptorProto_Type_Name( static_cast(descriptor->type())); (*variables)["full_name"] = descriptor->full_name(); } } // namespace // =================================================================== PrimitiveFieldGenerator::PrimitiveFieldGenerator( const FieldDescriptor* descriptor, const Options& options) : FieldGenerator(options), descriptor_(descriptor) { SetPrimitiveVariables(descriptor, &variables_, options); } PrimitiveFieldGenerator::~PrimitiveFieldGenerator() {} void PrimitiveFieldGenerator:: GeneratePrivateMembers(io::Printer* printer) const { printer->Print(variables_, "$type$ $name$_;\n"); } void PrimitiveFieldGenerator:: GenerateAccessorDeclarations(io::Printer* printer) const { printer->Print(variables_, "$deprecated_attr$$type$ $name$() const;\n"); printer->Annotate("name", descriptor_); printer->Print(variables_, "$deprecated_attr$void ${$set_$name$$}$($type$ value);\n"); printer->Annotate("{", "}", descriptor_); } void PrimitiveFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { printer->Print(variables_, "inline $type$ $classname$::$name$() const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " return $name$_;\n" "}\n" "inline void $classname$::set_$name$($type$ value) {\n" " $set_hasbit$\n" " $name$_ = value;\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" "}\n"); } void PrimitiveFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default$;\n"); } void PrimitiveFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "set_$name$(from.$name$());\n"); } void PrimitiveFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { printer->Print(variables_, "swap($name$_, other->$name$_);\n"); } void PrimitiveFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default$;\n"); } void PrimitiveFieldGenerator:: GenerateCopyConstructorCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = from.$name$_;\n"); } void PrimitiveFieldGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) const { printer->Print(variables_, "$set_hasbit$\n" "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" " $type$, $wire_format_field_type$>(\n" " input, &$name$_)));\n"); } void PrimitiveFieldGenerator:: GenerateSerializeWithCachedSizes(io::Printer* printer) const { printer->Print(variables_, "::google::protobuf::internal::WireFormatLite::Write$declared_type$(" "$number$, this->$name$(), output);\n"); } void PrimitiveFieldGenerator:: GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { printer->Print(variables_, "target = ::google::protobuf::internal::WireFormatLite::Write$declared_type$ToArray(" "$number$, this->$name$(), target);\n"); } void PrimitiveFieldGenerator:: GenerateByteSize(io::Printer* printer) const { int fixed_size = FixedSize(descriptor_->type()); if (fixed_size == -1) { printer->Print(variables_, "total_size += $tag_size$ +\n" " ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n" " this->$name$());\n"); } else { printer->Print(variables_, "total_size += $tag_size$ + $fixed_size$;\n"); } } // =================================================================== PrimitiveOneofFieldGenerator:: PrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : PrimitiveFieldGenerator(descriptor, options) { SetCommonOneofFieldVariables(descriptor, &variables_); } PrimitiveOneofFieldGenerator::~PrimitiveOneofFieldGenerator() {} void PrimitiveOneofFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { printer->Print(variables_, "inline $type$ $classname$::$name$() const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " if (has_$name$()) {\n" " return $oneof_prefix$$name$_;\n" " }\n" " return $default$;\n" "}\n" "inline void $classname$::set_$name$($type$ value) {\n" " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " }\n" " $oneof_prefix$$name$_ = value;\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" "}\n"); } void PrimitiveOneofFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { printer->Print(variables_, "$oneof_prefix$$name$_ = $default$;\n"); } void PrimitiveOneofFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { // Don't print any swapping code. Swapping the union will swap this field. } void PrimitiveOneofFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { printer->Print(variables_, "$ns$::_$classname$_default_instance_.$name$_ = $default$;\n"); } void PrimitiveOneofFieldGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) const { printer->Print(variables_, "clear_$oneof_name$();\n" "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" " $type$, $wire_format_field_type$>(\n" " input, &$oneof_prefix$$name$_)));\n" "set_has_$name$();\n"); } // =================================================================== RepeatedPrimitiveFieldGenerator::RepeatedPrimitiveFieldGenerator( const FieldDescriptor* descriptor, const Options& options) : FieldGenerator(options), descriptor_(descriptor) { SetPrimitiveVariables(descriptor, &variables_, options); if (descriptor->is_packed()) { variables_["packed_reader"] = "ReadPackedPrimitive"; variables_["repeated_reader"] = "ReadRepeatedPrimitiveNoInline"; } else { variables_["packed_reader"] = "ReadPackedPrimitiveNoInline"; variables_["repeated_reader"] = "ReadRepeatedPrimitive"; } } RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {} void RepeatedPrimitiveFieldGenerator:: GeneratePrivateMembers(io::Printer* printer) const { printer->Print(variables_, "::google::protobuf::RepeatedField< $type$ > $name$_;\n"); if (descriptor_->is_packed() && HasGeneratedMethods(descriptor_->file(), options_)) { printer->Print(variables_, "mutable int _$name$_cached_byte_size_;\n"); } } void RepeatedPrimitiveFieldGenerator:: GenerateAccessorDeclarations(io::Printer* printer) const { printer->Print(variables_, "$deprecated_attr$$type$ $name$(int index) const;\n"); printer->Annotate("name", descriptor_); printer->Print( variables_, "$deprecated_attr$void ${$set_$name$$}$(int index, $type$ value);\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "$deprecated_attr$void ${$add_$name$$}$($type$ value);\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "$deprecated_attr$const ::google::protobuf::RepeatedField< $type$ >&\n" " $name$() const;\n"); printer->Annotate("name", descriptor_); printer->Print(variables_, "$deprecated_attr$::google::protobuf::RepeatedField< $type$ >*\n" " ${$mutable_$name$$}$();\n"); printer->Annotate("{", "}", descriptor_); } void RepeatedPrimitiveFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { printer->Print(variables_, "inline $type$ $classname$::$name$(int index) const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " return $name$_.Get(index);\n" "}\n" "inline void $classname$::set_$name$(int index, $type$ value) {\n" " $name$_.Set(index, value);\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" "}\n" "inline void $classname$::add_$name$($type$ value) {\n" " $name$_.Add(value);\n" " // @@protoc_insertion_point(field_add:$full_name$)\n" "}\n" "inline const ::google::protobuf::RepeatedField< $type$ >&\n" "$classname$::$name$() const {\n" " // @@protoc_insertion_point(field_list:$full_name$)\n" " return $name$_;\n" "}\n" "inline ::google::protobuf::RepeatedField< $type$ >*\n" "$classname$::mutable_$name$() {\n" " // @@protoc_insertion_point(field_mutable_list:$full_name$)\n" " return &$name$_;\n" "}\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.Clear();\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.InternalSwap(&other->$name$_);\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { // Not needed for repeated fields. } void RepeatedPrimitiveFieldGenerator:: GenerateCopyConstructorCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.CopyFrom(from.$name$_);\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) const { printer->Print(variables_, "DO_((::google::protobuf::internal::WireFormatLite::$repeated_reader$<\n" " $type$, $wire_format_field_type$>(\n" " $tag_size$, $tag$u, input, this->mutable_$name$())));\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const { printer->Print(variables_, "DO_((::google::protobuf::internal::WireFormatLite::$packed_reader$<\n" " $type$, $wire_format_field_type$>(\n" " input, this->mutable_$name$())));\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateSerializeWithCachedSizes(io::Printer* printer) const { bool array_written = false; if (descriptor_->is_packed()) { // Write the tag and the size. printer->Print(variables_, "if (this->$name$_size() > 0) {\n" " ::google::protobuf::internal::WireFormatLite::WriteTag(" "$number$, " "::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, " "output);\n" " output->WriteVarint32(static_cast< ::google::protobuf::uint32>(\n" " _$name$_cached_byte_size_));\n"); if (FixedSize(descriptor_->type()) > 0) { // TODO(ckennelly): Use RepeatedField::unsafe_data() via // WireFormatLite to access the contents of this->$name$_ to save a branch // here. printer->Print(variables_, " ::google::protobuf::internal::WireFormatLite::Write$declared_type$Array(\n" " this->$name$().data(), this->$name$_size(), output);\n"); array_written = true; // Wrote array all at once } printer->Print(variables_, "}\n"); } if (!array_written) { printer->Print(variables_, "for (int i = 0, n = this->$name$_size(); i < n; i++) {\n"); if (descriptor_->is_packed()) { printer->Print(variables_, " ::google::protobuf::internal::WireFormatLite::Write$declared_type$NoTag(\n" " this->$name$(i), output);\n"); } else { printer->Print(variables_, " ::google::protobuf::internal::WireFormatLite::Write$declared_type$(\n" " $number$, this->$name$(i), output);\n"); } printer->Print("}\n"); } } void RepeatedPrimitiveFieldGenerator:: GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { if (descriptor_->is_packed()) { // Write the tag and the size. printer->Print(variables_, "if (this->$name$_size() > 0) {\n" " target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(\n" " $number$,\n" " ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n" " target);\n" " target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(\n" " static_cast< ::google::protobuf::int32>(\n" " _$name$_cached_byte_size_), target);\n" " target = ::google::protobuf::internal::WireFormatLite::\n" " Write$declared_type$NoTagToArray(this->$name$_, target);\n" "}\n"); } else { printer->Print(variables_, "target = ::google::protobuf::internal::WireFormatLite::\n" " Write$declared_type$ToArray($number$, this->$name$_, target);\n"); } } void RepeatedPrimitiveFieldGenerator:: GenerateByteSize(io::Printer* printer) const { printer->Print(variables_, "{\n"); printer->Indent(); int fixed_size = FixedSize(descriptor_->type()); if (fixed_size == -1) { printer->Print(variables_, "size_t data_size = ::google::protobuf::internal::WireFormatLite::\n" " $declared_type$Size(this->$name$_);\n"); } else { printer->Print(variables_, "unsigned int count = static_cast(this->$name$_size());\n" "size_t data_size = $fixed_size$UL * count;\n"); } if (descriptor_->is_packed()) { printer->Print(variables_, "if (data_size > 0) {\n" " total_size += $tag_size$ +\n" " ::google::protobuf::internal::WireFormatLite::Int32Size(\n" " static_cast< ::google::protobuf::int32>(data_size));\n" "}\n" "int cached_size = ::google::protobuf::internal::ToCachedSize(data_size);\n" "GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n" "_$name$_cached_byte_size_ = cached_size;\n" "GOOGLE_SAFE_CONCURRENT_WRITES_END();\n" "total_size += data_size;\n"); } else { printer->Print(variables_, "total_size += $tag_size$ *\n" " ::google::protobuf::internal::FromIntSize(this->$name$_size());\n" "total_size += data_size;\n"); } printer->Outdent(); printer->Print("}\n"); } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h000066400000000000000000000124641334102242000340620ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_PRIMITIVE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_PRIMITIVE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { class PrimitiveFieldGenerator : public FieldGenerator { public: PrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~PrimitiveFieldGenerator(); // implements FieldGenerator --------------------------------------- void GeneratePrivateMembers(io::Printer* printer) const; void GenerateAccessorDeclarations(io::Printer* printer) const; void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; void GenerateCopyConstructorCode(io::Printer* printer) const; void GenerateMergeFromCodedStream(io::Printer* printer) const; void GenerateSerializeWithCachedSizes(io::Printer* printer) const; void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; void GenerateByteSize(io::Printer* printer) const; protected: const FieldDescriptor* descriptor_; std::map variables_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator); }; class PrimitiveOneofFieldGenerator : public PrimitiveFieldGenerator { public: PrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~PrimitiveOneofFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; void GenerateMergeFromCodedStream(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveOneofFieldGenerator); }; class RepeatedPrimitiveFieldGenerator : public FieldGenerator { public: RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~RepeatedPrimitiveFieldGenerator(); // implements FieldGenerator --------------------------------------- void GeneratePrivateMembers(io::Printer* printer) const; void GenerateAccessorDeclarations(io::Printer* printer) const; void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; void GenerateCopyConstructorCode(io::Printer* printer) const; void GenerateMergeFromCodedStream(io::Printer* printer) const; void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const; void GenerateSerializeWithCachedSizes(io::Printer* printer) const; void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; void GenerateByteSize(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_PRIMITIVE_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc000066400000000000000000000313411334102242000325000ustar00rootroot00000000000000// 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 #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { ServiceGenerator::ServiceGenerator(const ServiceDescriptor* descriptor, const Options& options) : descriptor_(descriptor) { vars_["classname"] = descriptor_->name(); vars_["file_namespace"] = FileLevelNamespace(descriptor_->file()->name()); vars_["full_name"] = descriptor_->full_name(); if (options.dllexport_decl.empty()) { vars_["dllexport"] = ""; } else { vars_["dllexport"] = options.dllexport_decl + " "; } } ServiceGenerator::~ServiceGenerator() {} void ServiceGenerator::GenerateDeclarations(io::Printer* printer) { // Forward-declare the stub type. printer->Print(vars_, "class $classname$_Stub;\n" "\n"); GenerateInterface(printer); GenerateStubDefinition(printer); } void ServiceGenerator::GenerateInterface(io::Printer* printer) { printer->Print(vars_, "class $dllexport$$classname$ : public ::google::protobuf::Service {\n" " protected:\n" " // This class should be treated as an abstract interface.\n" " inline $classname$() {};\n" " public:\n" " virtual ~$classname$();\n"); printer->Indent(); printer->Print(vars_, "\n" "typedef $classname$_Stub Stub;\n" "\n" "static const ::google::protobuf::ServiceDescriptor* descriptor();\n" "\n"); GenerateMethodSignatures(VIRTUAL, printer); printer->Print( "\n" "// implements Service ----------------------------------------------\n" "\n" "const ::google::protobuf::ServiceDescriptor* GetDescriptor();\n" "void CallMethod(const ::google::protobuf::MethodDescriptor* method,\n" " ::google::protobuf::RpcController* controller,\n" " const ::google::protobuf::Message* request,\n" " ::google::protobuf::Message* response,\n" " ::google::protobuf::Closure* done);\n" "const ::google::protobuf::Message& GetRequestPrototype(\n" " const ::google::protobuf::MethodDescriptor* method) const;\n" "const ::google::protobuf::Message& GetResponsePrototype(\n" " const ::google::protobuf::MethodDescriptor* method) const;\n"); printer->Outdent(); printer->Print(vars_, "\n" " private:\n" " GOOGLE_DISALLOW_EVIL_CONSTRUCTORS($classname$);\n" "};\n" "\n"); } void ServiceGenerator::GenerateStubDefinition(io::Printer* printer) { printer->Print(vars_, "class $dllexport$$classname$_Stub : public $classname$ {\n" " public:\n"); printer->Indent(); printer->Print(vars_, "$classname$_Stub(::google::protobuf::RpcChannel* channel);\n" "$classname$_Stub(::google::protobuf::RpcChannel* channel,\n" " ::google::protobuf::Service::ChannelOwnership ownership);\n" "~$classname$_Stub();\n" "\n" "inline ::google::protobuf::RpcChannel* channel() { return channel_; }\n" "\n" "// implements $classname$ ------------------------------------------\n" "\n"); GenerateMethodSignatures(NON_VIRTUAL, printer); printer->Outdent(); printer->Print(vars_, " private:\n" " ::google::protobuf::RpcChannel* channel_;\n" " bool owns_channel_;\n" " GOOGLE_DISALLOW_EVIL_CONSTRUCTORS($classname$_Stub);\n" "};\n" "\n"); } void ServiceGenerator::GenerateMethodSignatures( VirtualOrNon virtual_or_non, io::Printer* printer) { for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); std::map sub_vars; sub_vars["name"] = method->name(); sub_vars["input_type"] = ClassName(method->input_type(), true); sub_vars["output_type"] = ClassName(method->output_type(), true); sub_vars["virtual"] = virtual_or_non == VIRTUAL ? "virtual " : ""; printer->Print(sub_vars, "$virtual$void $name$(::google::protobuf::RpcController* controller,\n" " const $input_type$* request,\n" " $output_type$* response,\n" " ::google::protobuf::Closure* done);\n"); } } // =================================================================== void ServiceGenerator::GenerateDescriptorInitializer( io::Printer* printer, int index) { std::map vars; vars["classname"] = descriptor_->name(); vars["index"] = SimpleItoa(index); printer->Print(vars, "$classname$_descriptor_ = file->service($index$);\n"); } // =================================================================== void ServiceGenerator::GenerateImplementation(io::Printer* printer) { vars_["index"] = SimpleItoa(index_in_metadata_); printer->Print( vars_, "$classname$::~$classname$() {}\n" "\n" "const ::google::protobuf::ServiceDescriptor* $classname$::descriptor() {\n" " $file_namespace$::protobuf_AssignDescriptorsOnce();\n" " return $file_namespace$::file_level_service_descriptors[$index$];\n" "}\n" "\n" "const ::google::protobuf::ServiceDescriptor* $classname$::GetDescriptor() {\n" " return descriptor();\n" "}\n" "\n"); // Generate methods of the interface. GenerateNotImplementedMethods(printer); GenerateCallMethod(printer); GenerateGetPrototype(REQUEST, printer); GenerateGetPrototype(RESPONSE, printer); // Generate stub implementation. printer->Print(vars_, "$classname$_Stub::$classname$_Stub(::google::protobuf::RpcChannel* channel)\n" " : channel_(channel), owns_channel_(false) {}\n" "$classname$_Stub::$classname$_Stub(\n" " ::google::protobuf::RpcChannel* channel,\n" " ::google::protobuf::Service::ChannelOwnership ownership)\n" " : channel_(channel),\n" " owns_channel_(ownership == ::google::protobuf::Service::STUB_OWNS_CHANNEL) {}\n" "$classname$_Stub::~$classname$_Stub() {\n" " if (owns_channel_) delete channel_;\n" "}\n" "\n"); GenerateStubMethods(printer); } void ServiceGenerator::GenerateNotImplementedMethods(io::Printer* printer) { for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); std::map sub_vars; sub_vars["classname"] = descriptor_->name(); sub_vars["name"] = method->name(); sub_vars["index"] = SimpleItoa(i); sub_vars["input_type"] = ClassName(method->input_type(), true); sub_vars["output_type"] = ClassName(method->output_type(), true); printer->Print(sub_vars, "void $classname$::$name$(::google::protobuf::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"); } } void ServiceGenerator::GenerateCallMethod(io::Printer* printer) { printer->Print( vars_, "void $classname$::CallMethod(const ::google::protobuf::MethodDescriptor* method,\n" " ::google::protobuf::RpcController* controller,\n" " const ::google::protobuf::Message* request,\n" " ::google::protobuf::Message* response,\n" " ::google::protobuf::Closure* done) {\n" " GOOGLE_DCHECK_EQ(method->service(), " "$file_namespace$::file_level_service_descriptors[$index$]);\n" " switch(method->index()) {\n"); for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); std::map sub_vars; sub_vars["name"] = method->name(); sub_vars["index"] = SimpleItoa(i); sub_vars["input_type"] = ClassName(method->input_type(), true); sub_vars["output_type"] = ClassName(method->output_type(), true); // Note: down_cast does not work here because it only works on pointers, // not references. printer->Print(sub_vars, " case $index$:\n" " $name$(controller,\n" " ::google::protobuf::down_cast(request),\n" " ::google::protobuf::down_cast< $output_type$*>(response),\n" " done);\n" " break;\n"); } printer->Print(vars_, " default:\n" " GOOGLE_LOG(FATAL) << \"Bad method index; this should never happen.\";\n" " break;\n" " }\n" "}\n" "\n"); } void ServiceGenerator::GenerateGetPrototype(RequestOrResponse which, io::Printer* printer) { if (which == REQUEST) { printer->Print(vars_, "const ::google::protobuf::Message& $classname$::GetRequestPrototype(\n"); } else { printer->Print(vars_, "const ::google::protobuf::Message& $classname$::GetResponsePrototype(\n"); } printer->Print(vars_, " const ::google::protobuf::MethodDescriptor* method) const {\n" " GOOGLE_DCHECK_EQ(method->service(), descriptor());\n" " switch(method->index()) {\n"); 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(); std::map sub_vars; sub_vars["index"] = SimpleItoa(i); sub_vars["type"] = ClassName(type, true); printer->Print(sub_vars, " case $index$:\n" " return $type$::default_instance();\n"); } printer->Print( " default:\n" " GOOGLE_LOG(FATAL) << \"Bad method index; this should never happen.\";\n" " return *::google::protobuf::MessageFactory::generated_factory()\n" " ->GetPrototype(method->$input_or_output$_type());\n" " }\n" "}\n" "\n", "input_or_output", which == REQUEST ? "input" : "output"); } void ServiceGenerator::GenerateStubMethods(io::Printer* printer) { for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); std::map sub_vars; sub_vars["classname"] = descriptor_->name(); sub_vars["name"] = method->name(); sub_vars["index"] = SimpleItoa(i); sub_vars["input_type"] = ClassName(method->input_type(), true); sub_vars["output_type"] = ClassName(method->output_type(), true); printer->Print(sub_vars, "void $classname$_Stub::$name$(::google::protobuf::RpcController* controller,\n" " const $input_type$* request,\n" " $output_type$* response,\n" " ::google::protobuf::Closure* done) {\n" " channel_->CallMethod(descriptor()->method($index$),\n" " controller, request, response, done);\n" "}\n"); } } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h000066400000000000000000000103031334102242000323350ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_SERVICE_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_SERVICE_H__ #include #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace cpp { class ServiceGenerator { public: // See generator.cc for the meaning of dllexport_decl. explicit ServiceGenerator(const ServiceDescriptor* descriptor, const Options& options); ~ServiceGenerator(); // Header stuff. // Generate the class definitions for the service's interface and the // stub implementation. void GenerateDeclarations(io::Printer* printer); // Source file stuff. // Generate code that initializes the global variable storing the service's // descriptor. void GenerateDescriptorInitializer(io::Printer* printer, int index); // 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); // Prints signatures for all methods in the void GenerateMethodSignatures(VirtualOrNon virtual_or_non, 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); // Generate the CallMethod() method of the service. void GenerateCallMethod(io::Printer* printer); // Generate the Get{Request,Response}Prototype() methods. void GenerateGetPrototype(RequestOrResponse which, io::Printer* printer); // Generate the stub's implementations of the service methods. void GenerateStubMethods(io::Printer* printer); const ServiceDescriptor* descriptor_; std::map vars_; int index_in_metadata_; friend class FileGenerator; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceGenerator); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_SERVICE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc000066400000000000000000001236421334102242000335170ustar00rootroot00000000000000// 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 #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { namespace { void SetStringVariables(const FieldDescriptor* descriptor, std::map* variables, const Options& options) { SetCommonFieldVariables(descriptor, variables, options); (*variables)["default"] = DefaultValue(descriptor); (*variables)["default_length"] = SimpleItoa(descriptor->default_value_string().length()); string default_variable_string = "_default_" + FieldName(descriptor) + "_"; (*variables)["default_variable_name"] = default_variable_string; (*variables)["default_variable"] = descriptor->default_value_string().empty() ? "&::google::protobuf::internal::GetEmptyStringAlreadyInited()" : "&" + Namespace(descriptor) + "::" + (*variables)["classname"] + "::" + default_variable_string + ".get()"; (*variables)["pointer_type"] = descriptor->type() == FieldDescriptor::TYPE_BYTES ? "void" : "char"; (*variables)["null_check"] = "GOOGLE_DCHECK(value != NULL);\n"; // NOTE: Escaped here to unblock proto1->proto2 migration. // TODO(liujisi): Extend this to apply for other conflicting methods. (*variables)["release_name"] = SafeFunctionName(descriptor->containing_type(), descriptor, "release_"); (*variables)["full_name"] = descriptor->full_name(); (*variables)["string_piece"] = "::std::string"; (*variables)["lite"] = HasDescriptorMethods(descriptor->file(), options) ? "" : "Lite"; } } // namespace // =================================================================== StringFieldGenerator::StringFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : FieldGenerator(options), descriptor_(descriptor), lite_(!HasDescriptorMethods(descriptor->file(), options)) { SetStringVariables(descriptor, &variables_, options); } StringFieldGenerator::~StringFieldGenerator() {} void StringFieldGenerator:: GeneratePrivateMembers(io::Printer* printer) const { // N.B. that we continue to use |ArenaStringPtr| instead of |string*| for // string fields, even when SupportArenas(descriptor_) == false. Why? // The simple answer is to avoid unmaintainable complexity. The reflection // code assumes ArenaStringPtrs. These are *almost* in-memory-compatible with // string*, except for the pointer tags and related ownership semantics. We // could modify the runtime code to use string* for the not-supporting-arenas // case, but this would require a way to detect which type of class was // generated (adding overhead and complexity to GeneratedMessageReflection) // and littering the runtime code paths with conditionals. It's simpler to // stick with this but use lightweight accessors that assume arena == NULL. // There should be very little overhead anyway because it's just a tagged // pointer in-memory. printer->Print(variables_, "::google::protobuf::internal::ArenaStringPtr $name$_;\n"); } void StringFieldGenerator:: GenerateStaticMembers(io::Printer* printer) const { if (!descriptor_->default_value_string().empty()) { printer->Print(variables_, "static ::google::protobuf::internal::ExplicitlyConstructed< ::std::string>" " $default_variable_name$;\n"); } } void StringFieldGenerator:: GenerateAccessorDeclarations(io::Printer* printer) const { // If we're using StringFieldGenerator for a field with a ctype, it's // because that ctype isn't actually implemented. In particular, this is // true of ctype=CORD and ctype=STRING_PIECE in the open source release. // We aren't releasing Cord because it has too many Google-specific // dependencies and we aren't releasing StringPiece because it's hardly // useful outside of Google and because it would get confusing to have // multiple instances of the StringPiece class in different libraries (PCRE // already includes it for their C++ bindings, which came from Google). // // In any case, we make all the accessors private while still actually // using a string to represent the field internally. This way, we can // guarantee that if we do ever implement the ctype, it won't break any // existing users who might be -- for whatever reason -- already using .proto // files that applied the ctype. The field can still be accessed via the // reflection interface since the reflection interface is independent of // the string's underlying representation. bool unknown_ctype = descriptor_->options().ctype() != EffectiveStringCType(descriptor_); if (unknown_ctype) { printer->Outdent(); printer->Print( " private:\n" " // Hidden due to unknown ctype option.\n"); printer->Indent(); } printer->Print(variables_, "$deprecated_attr$const ::std::string& $name$() const;\n"); printer->Annotate("name", descriptor_); printer->Print( variables_, "$deprecated_attr$void ${$set_$name$$}$(const ::std::string& value);\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "#if LANG_CXX11\n" "$deprecated_attr$void ${$set_$name$$}$(::std::string&& value);\n" "#endif\n"); printer->Annotate("{", "}", descriptor_); printer->Print( variables_, "$deprecated_attr$void ${$set_$name$$}$(const char* value);\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "$deprecated_attr$void ${$set_$name$$}$(const $pointer_type$* " "value, size_t size)" ";\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "$deprecated_attr$::std::string* ${$mutable_$name$$}$();\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "$deprecated_attr$::std::string* $release_name$();\n"); printer->Annotate("release_name", descriptor_); printer->Print( variables_, "$deprecated_attr$void ${$set_allocated_$name$$}$(::std::string* $name$);\n"); printer->Annotate("{", "}", descriptor_); if (SupportsArenas(descriptor_)) { printer->Print( variables_, "PROTOBUF_RUNTIME_DEPRECATED(\"The unsafe_arena_ accessors for\"\n" "\" string fields are deprecated and will be removed in a\"\n" "\" future release.\")\n" "::std::string* ${$unsafe_arena_release_$name$$}$();\n"); printer->Annotate("{", "}", descriptor_); printer->Print( variables_, "PROTOBUF_RUNTIME_DEPRECATED(\"The unsafe_arena_ accessors for\"\n" "\" string fields are deprecated and will be removed in a\"\n" "\" future release.\")\n" "void ${$unsafe_arena_set_allocated_$name$$}$(\n" " ::std::string* $name$);\n"); printer->Annotate("{", "}", descriptor_); } if (unknown_ctype) { printer->Outdent(); printer->Print(" public:\n"); printer->Indent(); } } void StringFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { if (SupportsArenas(descriptor_)) { printer->Print( variables_, "inline const ::std::string& $classname$::$name$() const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " return $name$_.Get();\n" "}\n" "inline void $classname$::set_$name$(const ::std::string& value) {\n" " $set_hasbit$\n" " $name$_.Set$lite$($default_variable$, value, GetArenaNoVirtual());\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" "}\n" "#if LANG_CXX11\n" "inline void $classname$::set_$name$(::std::string&& value) {\n" " $set_hasbit$\n" " $name$_.Set$lite$(\n" " $default_variable$, ::std::move(value), GetArenaNoVirtual());\n" " // @@protoc_insertion_point(field_set_rvalue:$full_name$)\n" "}\n" "#endif\n" "inline void $classname$::set_$name$(const char* value) {\n" " $null_check$" " $set_hasbit$\n" " $name$_.Set$lite$($default_variable$, $string_piece$(value),\n" " GetArenaNoVirtual());\n" " // @@protoc_insertion_point(field_set_char:$full_name$)\n" "}\n" "inline " "void $classname$::set_$name$(const $pointer_type$* value,\n" " size_t size) {\n" " $set_hasbit$\n" " $name$_.Set$lite$($default_variable$, $string_piece$(\n" " reinterpret_cast(value), size), " "GetArenaNoVirtual());\n" " // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" "}\n" "inline ::std::string* $classname$::mutable_$name$() {\n" " $set_hasbit$\n" " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $name$_.Mutable($default_variable$, GetArenaNoVirtual());\n" "}\n" "inline ::std::string* $classname$::$release_name$() {\n" " // @@protoc_insertion_point(field_release:$full_name$)\n" " $clear_hasbit$\n" " return $name$_.Release($default_variable$, GetArenaNoVirtual());\n" "}\n" "inline void $classname$::set_allocated_$name$(::std::string* $name$) {\n" " if ($name$ != NULL) {\n" " $set_hasbit$\n" " } else {\n" " $clear_hasbit$\n" " }\n" " $name$_.SetAllocated($default_variable$, $name$,\n" " GetArenaNoVirtual());\n" " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" "}\n" "inline ::std::string* $classname$::unsafe_arena_release_$name$() {\n" " // " "@@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n" " GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" " $clear_hasbit$\n" " return $name$_.UnsafeArenaRelease($default_variable$,\n" " GetArenaNoVirtual());\n" "}\n" "inline void $classname$::unsafe_arena_set_allocated_$name$(\n" " ::std::string* $name$) {\n" " GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" " if ($name$ != NULL) {\n" " $set_hasbit$\n" " } else {\n" " $clear_hasbit$\n" " }\n" " $name$_.UnsafeArenaSetAllocated($default_variable$,\n" " $name$, GetArenaNoVirtual());\n" " // @@protoc_insertion_point(field_unsafe_arena_set_allocated:" "$full_name$)\n" "}\n"); } else { // No-arena case. printer->Print( variables_, "inline const ::std::string& $classname$::$name$() const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " return $name$_.GetNoArena();\n" "}\n" "inline void $classname$::set_$name$(const ::std::string& value) {\n" " $set_hasbit$\n" " $name$_.SetNoArena($default_variable$, value);\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" "}\n" "#if LANG_CXX11\n" "inline void $classname$::set_$name$(::std::string&& value) {\n" " $set_hasbit$\n" " $name$_.SetNoArena(\n" " $default_variable$, ::std::move(value));\n" " // @@protoc_insertion_point(field_set_rvalue:$full_name$)\n" "}\n" "#endif\n" "inline void $classname$::set_$name$(const char* value) {\n" " $null_check$" " $set_hasbit$\n" " $name$_.SetNoArena($default_variable$, $string_piece$(value));\n" " // @@protoc_insertion_point(field_set_char:$full_name$)\n" "}\n" "inline " "void $classname$::set_$name$(const $pointer_type$* value, " "size_t size) {\n" " $set_hasbit$\n" " $name$_.SetNoArena($default_variable$,\n" " $string_piece$(reinterpret_cast(value), size));\n" " // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" "}\n" "inline ::std::string* $classname$::mutable_$name$() {\n" " $set_hasbit$\n" " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $name$_.MutableNoArena($default_variable$);\n" "}\n" "inline ::std::string* $classname$::$release_name$() {\n" " // @@protoc_insertion_point(field_release:$full_name$)\n" " $clear_hasbit$\n" " return $name$_.ReleaseNoArena($default_variable$);\n" "}\n" "inline void $classname$::set_allocated_$name$(::std::string* $name$) {\n" " if ($name$ != NULL) {\n" " $set_hasbit$\n" " } else {\n" " $clear_hasbit$\n" " }\n" " $name$_.SetAllocatedNoArena($default_variable$, $name$);\n" " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" "}\n"); } } void StringFieldGenerator:: GenerateNonInlineAccessorDefinitions(io::Printer* printer) const { if (!descriptor_->default_value_string().empty()) { // Initialized in GenerateDefaultInstanceAllocator. printer->Print(variables_, "::google::protobuf::internal::ExplicitlyConstructed< ::std::string> " "$classname$::$default_variable_name$;\n"); } } void StringFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { // Two-dimension specialization here: supporting arenas or not, and default // value is the empty string or not. Complexity here ensures the minimal // number of branches / amount of extraneous code at runtime (given that the // below methods are inlined one-liners)! if (SupportsArenas(descriptor_)) { if (descriptor_->default_value_string().empty()) { printer->Print(variables_, "$name$_.ClearToEmpty($default_variable$, GetArenaNoVirtual());\n"); } else { printer->Print(variables_, "$name$_.ClearToDefault($default_variable$, GetArenaNoVirtual());\n"); } } else { if (descriptor_->default_value_string().empty()) { printer->Print(variables_, "$name$_.ClearToEmptyNoArena($default_variable$);\n"); } else { printer->Print(variables_, "$name$_.ClearToDefaultNoArena($default_variable$);\n"); } } } void StringFieldGenerator:: GenerateMessageClearingCode(io::Printer* printer) const { // Two-dimension specialization here: supporting arenas, field presence, or // not, and default value is the empty string or not. Complexity here ensures // the minimal number of branches / amount of extraneous code at runtime // (given that the below methods are inlined one-liners)! // If we have field presence, then the Clear() method of the protocol buffer // will have checked that this field is set. If so, we can avoid redundant // checks against default_variable. const bool must_be_present = HasFieldPresence(descriptor_->file()); if (must_be_present) { printer->Print(variables_, "GOOGLE_DCHECK(!$name$_.IsDefault($default_variable$));\n"); } if (SupportsArenas(descriptor_)) { if (descriptor_->default_value_string().empty()) { printer->Print(variables_, "$name$_.ClearToEmpty($default_variable$, GetArenaNoVirtual());\n"); } else { printer->Print(variables_, "$name$_.ClearToDefault($default_variable$, GetArenaNoVirtual());\n"); } } else if (must_be_present) { // When Arenas are disabled and field presence has been checked, we can // safely treat the ArenaStringPtr as a string*. if (descriptor_->default_value_string().empty()) { printer->Print(variables_, "(*$name$_.UnsafeRawStringPointer())->clear();\n"); } else { printer->Print(variables_, "(*$name$_.UnsafeRawStringPointer())->assign(*$default_variable$);\n"); } } else { if (descriptor_->default_value_string().empty()) { printer->Print(variables_, "$name$_.ClearToEmptyNoArena($default_variable$);\n"); } else { printer->Print(variables_, "$name$_.ClearToDefaultNoArena($default_variable$);\n"); } } } void StringFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { if (SupportsArenas(descriptor_) || descriptor_->containing_oneof() != NULL) { // TODO(gpike): improve this printer->Print(variables_, "set_$name$(from.$name$());\n"); } else { printer->Print(variables_, "$set_hasbit$\n" "$name$_.AssignWithDefault($default_variable$, from.$name$_);\n"); } } void StringFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n"); } void StringFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.UnsafeSetDefault($default_variable$);\n"); } void StringFieldGenerator:: GenerateCopyConstructorCode(io::Printer* printer) const { GenerateConstructorCode(printer); if (HasFieldPresence(descriptor_->file())) { printer->Print(variables_, "if (from.has_$name$()) {\n"); } else { printer->Print(variables_, "if (from.$name$().size() > 0) {\n"); } printer->Indent(); if (SupportsArenas(descriptor_) || descriptor_->containing_oneof() != NULL) { // TODO(gpike): improve this printer->Print(variables_, "$name$_.Set$lite$($default_variable$, from.$name$(),\n" " GetArenaNoVirtual());\n"); } else { printer->Print(variables_, "$name$_.AssignWithDefault($default_variable$, from.$name$_);\n"); } printer->Outdent(); printer->Print("}\n"); } void StringFieldGenerator:: GenerateDestructorCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.DestroyNoArena($default_variable$);\n"); } void StringFieldGenerator:: GenerateDefaultInstanceAllocator(io::Printer* printer) const { if (!descriptor_->default_value_string().empty()) { printer->Print( variables_, "$ns$::$classname$::$default_variable_name$.DefaultConstruct();\n" "*$ns$::$classname$::$default_variable_name$.get_mutable() = " "::std::string($default$, $default_length$);\n" "::google::protobuf::internal::OnShutdownDestroyString(\n" " $ns$::$classname$::$default_variable_name$.get_mutable());\n" ); } } void StringFieldGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) const { printer->Print(variables_, "DO_(::google::protobuf::internal::WireFormatLite::Read$declared_type$(\n" " input, this->mutable_$name$()));\n"); if (descriptor_->type() == FieldDescriptor::TYPE_STRING) { GenerateUtf8CheckCodeForString( descriptor_, options_, true, variables_, "this->$name$().data(), static_cast(this->$name$().length()),\n", printer); } } void StringFieldGenerator:: GenerateSerializeWithCachedSizes(io::Printer* printer) const { if (descriptor_->type() == FieldDescriptor::TYPE_STRING) { GenerateUtf8CheckCodeForString( descriptor_, options_, false, variables_, "this->$name$().data(), static_cast(this->$name$().length()),\n", printer); } printer->Print(variables_, "::google::protobuf::internal::WireFormatLite::Write$declared_type$MaybeAliased(\n" " $number$, this->$name$(), output);\n"); } void StringFieldGenerator:: GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { if (descriptor_->type() == FieldDescriptor::TYPE_STRING) { GenerateUtf8CheckCodeForString( descriptor_, options_, false, variables_, "this->$name$().data(), static_cast(this->$name$().length()),\n", printer); } printer->Print(variables_, "target =\n" " ::google::protobuf::internal::WireFormatLite::Write$declared_type$ToArray(\n" " $number$, this->$name$(), target);\n"); } void StringFieldGenerator:: GenerateByteSize(io::Printer* printer) const { printer->Print(variables_, "total_size += $tag_size$ +\n" " ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n" " this->$name$());\n"); } // =================================================================== StringOneofFieldGenerator:: StringOneofFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : StringFieldGenerator(descriptor, options), dependent_field_(options.proto_h) { SetCommonOneofFieldVariables(descriptor, &variables_); } StringOneofFieldGenerator::~StringOneofFieldGenerator() {} void StringOneofFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { if (SupportsArenas(descriptor_)) { printer->Print( variables_, "inline const ::std::string& $classname$::$name$() const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " if (has_$name$()) {\n" " return $oneof_prefix$$name$_.Get();\n" " }\n" " return *$default_variable$;\n" "}\n" "inline void $classname$::set_$name$(const ::std::string& value) {\n" " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " $oneof_prefix$$name$_.Set$lite$($default_variable$, value,\n" " GetArenaNoVirtual());\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" "}\n" "#if LANG_CXX11\n" "inline void $classname$::set_$name$(::std::string&& value) {\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " $oneof_prefix$$name$_.Set$lite$(\n" " $default_variable$, ::std::move(value), GetArenaNoVirtual());\n" " // @@protoc_insertion_point(field_set_rvalue:$full_name$)\n" "}\n" "#endif\n" "inline void $classname$::set_$name$(const char* value) {\n" " $null_check$" " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " $oneof_prefix$$name$_.Set$lite$($default_variable$,\n" " $string_piece$(value), GetArenaNoVirtual());\n" " // @@protoc_insertion_point(field_set_char:$full_name$)\n" "}\n" "inline " "void $classname$::set_$name$(const $pointer_type$* value,\n" " size_t size) {\n" " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " $oneof_prefix$$name$_.Set$lite$(\n" " $default_variable$, $string_piece$(\n" " reinterpret_cast(value), size),\n" " GetArenaNoVirtual());\n" " // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" "}\n" "inline ::std::string* $classname$::mutable_$name$() {\n" " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " return $oneof_prefix$$name$_.Mutable($default_variable$,\n" " GetArenaNoVirtual());\n" " // @@protoc_insertion_point(field_mutable:$full_name$)\n" "}\n" "inline ::std::string* $classname$::$release_name$() {\n" " // @@protoc_insertion_point(field_release:$full_name$)\n" " if (has_$name$()) {\n" " clear_has_$oneof_name$();\n" " return $oneof_prefix$$name$_.Release($default_variable$,\n" " GetArenaNoVirtual());\n" " } else {\n" " return NULL;\n" " }\n" "}\n" "inline void $classname$::set_allocated_$name$(::std::string* $name$) {\n" " if (!has_$name$()) {\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " clear_$oneof_name$();\n" " if ($name$ != NULL) {\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.SetAllocated($default_variable$, $name$,\n" " GetArenaNoVirtual());\n" " }\n" " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" "}\n" "inline ::std::string* $classname$::unsafe_arena_release_$name$() {\n" " // " "@@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n" " GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" " if (has_$name$()) {\n" " clear_has_$oneof_name$();\n" " return $oneof_prefix$$name$_.UnsafeArenaRelease(\n" " $default_variable$, GetArenaNoVirtual());\n" " } else {\n" " return NULL;\n" " }\n" "}\n" "inline void $classname$::unsafe_arena_set_allocated_$name$(" "::std::string* $name$) {\n" " GOOGLE_DCHECK(GetArenaNoVirtual() != NULL);\n" " if (!has_$name$()) {\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " clear_$oneof_name$();\n" " if ($name$) {\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.UnsafeArenaSetAllocated($default_variable$, " "$name$, GetArenaNoVirtual());\n" " }\n" " // @@protoc_insertion_point(field_unsafe_arena_set_allocated:" "$full_name$)\n" "}\n"); } else { // No-arena case. printer->Print( variables_, "inline const ::std::string& $classname$::$name$() const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " if (has_$name$()) {\n" " return $oneof_prefix$$name$_.GetNoArena();\n" " }\n" " return *$default_variable$;\n" "}\n" "inline void $classname$::set_$name$(const ::std::string& value) {\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " $oneof_prefix$$name$_.SetNoArena($default_variable$, value);\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" "}\n" "#if LANG_CXX11\n" "inline void $classname$::set_$name$(::std::string&& value) {\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " $oneof_prefix$$name$_.SetNoArena(\n" " $default_variable$, ::std::move(value));\n" " // @@protoc_insertion_point(field_set_rvalue:$full_name$)\n" "}\n" "#endif\n" "inline void $classname$::set_$name$(const char* value) {\n" " $null_check$" " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " $oneof_prefix$$name$_.SetNoArena($default_variable$,\n" " $string_piece$(value));\n" " // @@protoc_insertion_point(field_set_char:$full_name$)\n" "}\n" "inline " "void $classname$::set_$name$(const $pointer_type$* value, size_t " "size) {\n" " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " $oneof_prefix$$name$_.SetNoArena($default_variable$, " "$string_piece$(\n" " reinterpret_cast(value), size));\n" " // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" "}\n" "inline ::std::string* $classname$::mutable_$name$() {\n" " if (!has_$name$()) {\n" " clear_$oneof_name$();\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $oneof_prefix$$name$_.MutableNoArena($default_variable$);\n" "}\n" "inline ::std::string* $classname$::$release_name$() {\n" " // @@protoc_insertion_point(field_release:$full_name$)\n" " if (has_$name$()) {\n" " clear_has_$oneof_name$();\n" " return $oneof_prefix$$name$_.ReleaseNoArena($default_variable$);\n" " } else {\n" " return NULL;\n" " }\n" "}\n" "inline void $classname$::set_allocated_$name$(::std::string* $name$) {\n" " if (!has_$name$()) {\n" " $oneof_prefix$$name$_.UnsafeSetDefault($default_variable$);\n" " }\n" " clear_$oneof_name$();\n" " if ($name$ != NULL) {\n" " set_has_$name$();\n" " $oneof_prefix$$name$_.SetAllocatedNoArena($default_variable$,\n" " $name$);\n" " }\n" " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" "}\n"); } } void StringOneofFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { if (SupportsArenas(descriptor_)) { printer->Print(variables_, "$oneof_prefix$$name$_.Destroy($default_variable$,\n" " GetArenaNoVirtual());\n"); } else { printer->Print(variables_, "$oneof_prefix$$name$_." "DestroyNoArena($default_variable$);\n"); } } void StringOneofFieldGenerator:: GenerateMessageClearingCode(io::Printer* printer) const { return GenerateClearingCode(printer); } void StringOneofFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { // Don't print any swapping code. Swapping the union will swap this field. } void StringOneofFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { printer->Print( variables_, "$ns$::_$classname$_default_instance_.$name$_.UnsafeSetDefault(\n" " $default_variable$);\n"); } void StringOneofFieldGenerator:: GenerateDestructorCode(io::Printer* printer) const { printer->Print(variables_, "if (has_$name$()) {\n" " $oneof_prefix$$name$_.DestroyNoArena($default_variable$);\n" "}\n"); } void StringOneofFieldGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) const { printer->Print(variables_, "DO_(::google::protobuf::internal::WireFormatLite::Read$declared_type$(\n" " input, this->mutable_$name$()));\n"); if (descriptor_->type() == FieldDescriptor::TYPE_STRING) { GenerateUtf8CheckCodeForString( descriptor_, options_, true, variables_, "this->$name$().data(), static_cast(this->$name$().length()),\n", printer); } } // =================================================================== RepeatedStringFieldGenerator::RepeatedStringFieldGenerator( const FieldDescriptor* descriptor, const Options& options) : FieldGenerator(options), descriptor_(descriptor) { SetStringVariables(descriptor, &variables_, options); } RepeatedStringFieldGenerator::~RepeatedStringFieldGenerator() {} void RepeatedStringFieldGenerator:: GeneratePrivateMembers(io::Printer* printer) const { printer->Print(variables_, "::google::protobuf::RepeatedPtrField< ::std::string> $name$_;\n"); } void RepeatedStringFieldGenerator:: GenerateAccessorDeclarations(io::Printer* printer) const { // See comment above about unknown ctypes. bool unknown_ctype = descriptor_->options().ctype() != EffectiveStringCType(descriptor_); if (unknown_ctype) { printer->Outdent(); printer->Print( " private:\n" " // Hidden due to unknown ctype option.\n"); printer->Indent(); } printer->Print(variables_, "$deprecated_attr$const ::std::string& $name$(int index) const;\n"); printer->Annotate("name", descriptor_); printer->Print( variables_, "$deprecated_attr$::std::string* ${$mutable_$name$$}$(int index);\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "$deprecated_attr$void ${$set_$name$$}$(int index, const " "::std::string& value);\n"); printer->Annotate("{", "}", descriptor_); printer->Print( variables_, "#if LANG_CXX11\n" "$deprecated_attr$void ${$set_$name$$}$(int index, ::std::string&& value);\n" "#endif\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "$deprecated_attr$void ${$set_$name$$}$(int index, const " "char* value);\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "" "$deprecated_attr$void ${$set_$name$$}$(" "int index, const $pointer_type$* value, size_t size);\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "$deprecated_attr$::std::string* ${$add_$name$$}$();\n"); printer->Annotate("{", "}", descriptor_); printer->Print( variables_, "$deprecated_attr$void ${$add_$name$$}$(const ::std::string& value);\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "#if LANG_CXX11\n" "$deprecated_attr$void ${$add_$name$$}$(::std::string&& value);\n" "#endif\n"); printer->Annotate("{", "}", descriptor_); printer->Print( variables_, "$deprecated_attr$void ${$add_$name$$}$(const char* value);\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "$deprecated_attr$void ${$add_$name$$}$(const $pointer_type$* " "value, size_t size)" ";\n"); printer->Annotate("{", "}", descriptor_); printer->Print( variables_, "$deprecated_attr$const ::google::protobuf::RepeatedPtrField< ::std::string>& $name$() " "const;\n"); printer->Annotate("name", descriptor_); printer->Print(variables_, "$deprecated_attr$::google::protobuf::RepeatedPtrField< ::std::string>* " "${$mutable_$name$$}$()" ";\n"); printer->Annotate("{", "}", descriptor_); if (unknown_ctype) { printer->Outdent(); printer->Print(" public:\n"); printer->Indent(); } } void RepeatedStringFieldGenerator:: GenerateInlineAccessorDefinitions(io::Printer* printer) const { printer->Print(variables_, "inline const ::std::string& $classname$::$name$(int index) const {\n" " // @@protoc_insertion_point(field_get:$full_name$)\n" " return $name$_.$cppget$(index);\n" "}\n" "inline ::std::string* $classname$::mutable_$name$(int index) {\n" " // @@protoc_insertion_point(field_mutable:$full_name$)\n" " return $name$_.Mutable(index);\n" "}\n" "inline void $classname$::set_$name$(int index, const ::std::string& value) {\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" " $name$_.Mutable(index)->assign(value);\n" "}\n" "#if LANG_CXX11\n" "inline void $classname$::set_$name$(int index, ::std::string&& value) {\n" " // @@protoc_insertion_point(field_set:$full_name$)\n" " $name$_.Mutable(index)->assign(std::move(value));\n" "}\n" "#endif\n" "inline void $classname$::set_$name$(int index, const char* value) {\n" " $null_check$" " $name$_.Mutable(index)->assign(value);\n" " // @@protoc_insertion_point(field_set_char:$full_name$)\n" "}\n" "inline void " "$classname$::set_$name$" "(int index, const $pointer_type$* value, size_t size) {\n" " $name$_.Mutable(index)->assign(\n" " reinterpret_cast(value), size);\n" " // @@protoc_insertion_point(field_set_pointer:$full_name$)\n" "}\n" "inline ::std::string* $classname$::add_$name$() {\n" " // @@protoc_insertion_point(field_add_mutable:$full_name$)\n" " return $name$_.Add();\n" "}\n" "inline void $classname$::add_$name$(const ::std::string& value) {\n" " $name$_.Add()->assign(value);\n" " // @@protoc_insertion_point(field_add:$full_name$)\n" "}\n" "#if LANG_CXX11\n" "inline void $classname$::add_$name$(::std::string&& value) {\n" " $name$_.Add(std::move(value));\n" " // @@protoc_insertion_point(field_add:$full_name$)\n" "}\n" "#endif\n" "inline void $classname$::add_$name$(const char* value) {\n" " $null_check$" " $name$_.Add()->assign(value);\n" " // @@protoc_insertion_point(field_add_char:$full_name$)\n" "}\n" "inline void " "$classname$::add_$name$(const $pointer_type$* value, size_t size) {\n" " $name$_.Add()->assign(reinterpret_cast(value), size);\n" " // @@protoc_insertion_point(field_add_pointer:$full_name$)\n" "}\n" "inline const ::google::protobuf::RepeatedPtrField< ::std::string>&\n" "$classname$::$name$() const {\n" " // @@protoc_insertion_point(field_list:$full_name$)\n" " return $name$_;\n" "}\n" "inline ::google::protobuf::RepeatedPtrField< ::std::string>*\n" "$classname$::mutable_$name$() {\n" " // @@protoc_insertion_point(field_mutable_list:$full_name$)\n" " return &$name$_;\n" "}\n"); } void RepeatedStringFieldGenerator:: GenerateClearingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.Clear();\n"); } void RepeatedStringFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); } void RepeatedStringFieldGenerator:: GenerateSwappingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.InternalSwap(&other->$name$_);\n"); } void RepeatedStringFieldGenerator:: GenerateConstructorCode(io::Printer* printer) const { // Not needed for repeated fields. } void RepeatedStringFieldGenerator:: GenerateCopyConstructorCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.CopyFrom(from.$name$_);"); } void RepeatedStringFieldGenerator:: GenerateMergeFromCodedStream(io::Printer* printer) const { printer->Print(variables_, "DO_(::google::protobuf::internal::WireFormatLite::Read$declared_type$(\n" " input, this->add_$name$()));\n"); if (descriptor_->type() == FieldDescriptor::TYPE_STRING) { GenerateUtf8CheckCodeForString( descriptor_, options_, true, variables_, "this->$name$(this->$name$_size() - 1).data(),\n" "static_cast(this->$name$(this->$name$_size() - 1).length()),\n", printer); } } void RepeatedStringFieldGenerator:: GenerateSerializeWithCachedSizes(io::Printer* printer) const { printer->Print(variables_, "for (int i = 0, n = this->$name$_size(); i < n; i++) {\n"); printer->Indent(); if (descriptor_->type() == FieldDescriptor::TYPE_STRING) { GenerateUtf8CheckCodeForString( descriptor_, options_, false, variables_, "this->$name$(i).data(), static_cast(this->$name$(i).length()),\n", printer); } printer->Outdent(); printer->Print(variables_, " ::google::protobuf::internal::WireFormatLite::Write$declared_type$(\n" " $number$, this->$name$(i), output);\n" "}\n"); } void RepeatedStringFieldGenerator:: GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { printer->Print(variables_, "for (int i = 0, n = this->$name$_size(); i < n; i++) {\n"); printer->Indent(); if (descriptor_->type() == FieldDescriptor::TYPE_STRING) { GenerateUtf8CheckCodeForString( descriptor_, options_, false, variables_, "this->$name$(i).data(), static_cast(this->$name$(i).length()),\n", printer); } printer->Outdent(); printer->Print(variables_, " target = ::google::protobuf::internal::WireFormatLite::\n" " Write$declared_type$ToArray($number$, this->$name$(i), target);\n" "}\n"); } void RepeatedStringFieldGenerator:: GenerateByteSize(io::Printer* printer) const { printer->Print(variables_, "total_size += $tag_size$ *\n" " ::google::protobuf::internal::FromIntSize(this->$name$_size());\n" "for (int i = 0, n = this->$name$_size(); i < n; i++) {\n" " total_size += ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n" " this->$name$(i));\n" "}\n"); } } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h000066400000000000000000000134121334102242000333520ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_STRING_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_STRING_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { class StringFieldGenerator : public FieldGenerator { public: StringFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~StringFieldGenerator(); // implements FieldGenerator --------------------------------------- void GeneratePrivateMembers(io::Printer* printer) const; void GenerateStaticMembers(io::Printer* printer) const; void GenerateAccessorDeclarations(io::Printer* printer) const; void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateNonInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; void GenerateMessageClearingCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; void GenerateCopyConstructorCode(io::Printer* printer) const; void GenerateDestructorCode(io::Printer* printer) const; void GenerateDefaultInstanceAllocator(io::Printer* printer) const; void GenerateMergeFromCodedStream(io::Printer* printer) const; void GenerateSerializeWithCachedSizes(io::Printer* printer) const; void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; void GenerateByteSize(io::Printer* printer) const; protected: const FieldDescriptor* descriptor_; std::map variables_; const bool lite_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringFieldGenerator); }; class StringOneofFieldGenerator : public StringFieldGenerator { public: StringOneofFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~StringOneofFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; // StringFieldGenerator, from which we inherit, overrides this so we need to // override it as well. void GenerateMessageClearingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; void GenerateDestructorCode(io::Printer* printer) const; void GenerateMergeFromCodedStream(io::Printer* printer) const; private: const bool dependent_field_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringOneofFieldGenerator); }; class RepeatedStringFieldGenerator : public FieldGenerator { public: RepeatedStringFieldGenerator(const FieldDescriptor* descriptor, const Options& options); ~RepeatedStringFieldGenerator(); // implements FieldGenerator --------------------------------------- void GeneratePrivateMembers(io::Printer* printer) const; void GenerateAccessorDeclarations(io::Printer* printer) const; void GenerateInlineAccessorDefinitions(io::Printer* printer) const; void GenerateClearingCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSwappingCode(io::Printer* printer) const; void GenerateConstructorCode(io::Printer* printer) const; void GenerateCopyConstructorCode(io::Printer* printer) const; void GenerateMergeFromCodedStream(io::Printer* printer) const; void GenerateSerializeWithCachedSizes(io::Printer* printer) const; void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; void GenerateByteSize(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedStringFieldGenerator); }; } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_STRING_FIELD_H__ cpp_test_bad_identifiers.proto000066400000000000000000000136731334102242000357210ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp// 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. // // This file tests that various identifiers work as field and type names even // though the same identifiers are used internally by the C++ code generator. syntax = "proto2"; // Some generic_services option(s) added automatically. // See: http://go/proto2-generic-services-default option cc_generic_services = true; // auto-added // We don't put this in a package within proto2 because we need to make sure // that the generated code doesn't depend on being in the proto2 namespace. package protobuf_unittest; // Test that fields can have names like "input" and "i" which are also used // internally by the code generator for local variables. message TestConflictingSymbolNames { message BuildDescriptors {} message TypeTraits {} optional int32 input = 1; optional int32 output = 2; optional string length = 3; repeated int32 i = 4; repeated string new_element = 5 [ctype=STRING_PIECE]; optional int32 total_size = 6; optional int32 tag = 7; enum TestEnum { FOO = 0; } message Data1 { repeated int32 data = 1; } message Data2 { repeated TestEnum data = 1; } message Data3 { repeated string data = 1; } message Data4 { repeated Data4 data = 1; } message Data5 { repeated string data = 1 [ctype=STRING_PIECE]; } message Data6 { repeated string data = 1 [ctype=CORD]; } optional int32 source = 8; optional int32 value = 9; optional int32 file = 10; optional int32 from = 11; optional int32 handle_uninterpreted = 12; repeated int32 index = 13; optional int32 controller = 14; optional int32 already_here = 15; optional uint32 uint32 = 16; optional uint64 uint64 = 17; optional string string = 18; optional int32 memset = 19; optional int32 int32 = 20; optional int64 int64 = 21; optional uint32 cached_size = 22; optional uint32 extensions = 23; optional uint32 bit = 24; optional uint32 bits = 25; optional uint32 offsets = 26; optional uint32 reflection = 27; message Cord {} optional string some_cord = 28 [ctype=CORD]; message StringPiece {} optional string some_string_piece = 29 [ctype=STRING_PIECE]; // Some keywords. optional uint32 int = 30; optional uint32 friend = 31; optional uint32 class = 37; optional uint32 typedecl = 39; optional uint32 auto = 40; // The generator used to #define a macro called "DO" inside the .cc file. message DO {} optional DO do = 32; // Some template parameter names for extensions. optional int32 field_type = 33; optional bool is_packed = 34; // test conflicting release_$name$. "length" and "do" field in this message // must remain string or message fields to make the test valid. optional string release_length = 35; // A more extreme case, the field name "do" here is a keyword, which will be // escaped to "do_" already. Test there is no conflict even with escaped field // names. optional DO release_do = 36; // For clashing local variables in Serialize and ByteSize calculation. optional string target = 38; extensions 1000 to max; // NO_PROTO3 } message TestConflictingSymbolNamesExtension { // NO_PROTO3 extend TestConflictingSymbolNames { // NO_PROTO3 repeated int32 repeated_int32_ext = 20423638 [packed=true]; // NO_PROTO3 } // NO_PROTO3 } // NO_PROTO3 message TestConflictingEnumNames { // NO_PROTO3 enum NestedConflictingEnum { // NO_PROTO3 and = 1; // NO_PROTO3 class = 2; // NO_PROTO3 int = 3; // NO_PROTO3 typedef = 4; // NO_PROTO3 XOR = 5; // NO_PROTO3 } // NO_PROTO3 optional NestedConflictingEnum conflicting_enum = 1; // NO_PROTO3 } // NO_PROTO3 enum ConflictingEnum { // NO_PROTO3 NOT_EQ = 1; // NO_PROTO3 volatile = 2; // NO_PROTO3 return = 3; // NO_PROTO3 } // NO_PROTO3 message DummyMessage {} // Message names that could conflict. message Shutdown {} message TableStruct {} service TestConflictingMethodNames { rpc Closure(DummyMessage) returns (DummyMessage); } cpp_test_large_enum_value.proto000066400000000000000000000037131334102242000361120ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp// 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 proto2 compiler can generate valid code when the enum value // is INT_MAX. Note that this is a compile-only test and this proto is not // referenced in any C++ code. syntax = "proto2"; package protobuf_unittest; message TestLargeEnumValue { enum EnumWithLargeValue { VALUE_1 = 1; VALUE_MAX = 0x7fffffff; } } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc000066400000000000000000002346451334102242000327330ustar00rootroot00000000000000// 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. // // To test the code generator, we actually use it to generate code for // google/protobuf/unittest.proto, then test that. This means that we // are actually testing the parser and other parts of the system at the same // time, and that problems in the generator may show up as compile-time errors // rather than unittest failures, which may be surprising. However, testing // the output of the C++ generator directly would be very hard. We can't very // well just check it against golden files since those files would have to be // updated for any small change; such a test would be very brittle and probably // not very helpful. What we really want to test is that the code compiles // correctly and produces the interfaces we expect, which is why this test // is written this way. #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #if !defined(GOOGLE_PROTOBUF_CMAKE_BUILD) && !defined(_MSC_VER) // We exclude this large proto from cmake build because it's too large for // visual studio to compile (report internal errors). #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace cpp { // Can't use an anonymous namespace here due to brokenness of Tru64 compiler. namespace cpp_unittest { namespace protobuf_unittest = ::protobuf_unittest; class MockErrorCollector : public MultiFileErrorCollector { public: MockErrorCollector() {} ~MockErrorCollector() {} string text_; // implements ErrorCollector --------------------------------------- void AddError(const string& filename, int line, int column, const string& message) { strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line, column, message); } }; #ifndef PROTOBUF_TEST_NO_DESCRIPTORS // Test that generated code has proper descriptors: // Parse a descriptor directly (using google::protobuf::compiler::Importer) and // compare it to the one that was produced by generated code. TEST(GeneratedDescriptorTest, IdenticalDescriptors) { const FileDescriptor* generated_descriptor = unittest::TestAllTypes::descriptor()->file(); // Set up the Importer. MockErrorCollector error_collector; DiskSourceTree source_tree; source_tree.MapPath("", TestSourceDir()); Importer importer(&source_tree, &error_collector); // Import (parse) unittest.proto. const FileDescriptor* parsed_descriptor = importer.Import("google/protobuf/unittest.proto"); EXPECT_EQ("", error_collector.text_); ASSERT_TRUE(parsed_descriptor != NULL); // Test that descriptors are generated correctly by converting them to // FileDescriptorProtos and comparing. FileDescriptorProto generated_descriptor_proto, parsed_descriptor_proto; generated_descriptor->CopyTo(&generated_descriptor_proto); parsed_descriptor->CopyTo(&parsed_descriptor_proto); EXPECT_EQ(parsed_descriptor_proto.DebugString(), generated_descriptor_proto.DebugString()); } #if !defined(GOOGLE_PROTOBUF_CMAKE_BUILD) && !defined(_MSC_VER) // Test that generated code has proper descriptors: // Touch a descriptor generated from an enormous message to validate special // handling for descriptors exceeding the C++ standard's recommended minimum // limit for string literal size TEST(GeneratedDescriptorTest, EnormousDescriptor) { const Descriptor* generated_descriptor = TestEnormousDescriptor::descriptor(); EXPECT_TRUE(generated_descriptor != NULL); } #endif #endif // !PROTOBUF_TEST_NO_DESCRIPTORS // =================================================================== TEST(GeneratedMessageTest, Defaults) { // Check that all default values are set correctly in the initial message. unittest::TestAllTypes message; TestUtil::ExpectClear(message); // Messages should return pointers to default instances until first use. // (This is not checked by ExpectClear() since it is not actually true after // the fields have been set and then cleared.) EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(), &message.optionalgroup()); EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), &message.optional_nested_message()); EXPECT_EQ(&unittest::ForeignMessage::default_instance(), &message.optional_foreign_message()); EXPECT_EQ(&unittest_import::ImportMessage::default_instance(), &message.optional_import_message()); } #ifndef PROTOBUF_USE_DLLS TEST(GeneratedMessageTest, Int32StringConversion) { EXPECT_EQ("971", Int32ToString(971)); EXPECT_EQ("(~0x7fffffff)", Int32ToString(kint32min)); EXPECT_EQ("2147483647", Int32ToString(kint32max)); } TEST(GeneratedMessageTest, Int64StringConversion) { EXPECT_EQ("GOOGLE_LONGLONG(971)", Int64ToString(971)); EXPECT_EQ("GOOGLE_LONGLONG(-2147483648)", Int64ToString(kint32min)); EXPECT_EQ("GOOGLE_LONGLONG(~0x7fffffffffffffff)", Int64ToString(kint64min)); EXPECT_EQ("GOOGLE_LONGLONG(9223372036854775807)", Int64ToString(kint64max)); } #endif // !PROTOBUF_USE_DLLS TEST(GeneratedMessageTest, FloatingPointDefaults) { const unittest::TestExtremeDefaultValues& extreme_default = unittest::TestExtremeDefaultValues::default_instance(); EXPECT_EQ(0.0f, extreme_default.zero_float()); EXPECT_EQ(1.0f, extreme_default.one_float()); EXPECT_EQ(1.5f, extreme_default.small_float()); EXPECT_EQ(-1.0f, extreme_default.negative_one_float()); EXPECT_EQ(-1.5f, extreme_default.negative_float()); EXPECT_EQ(2.0e8f, extreme_default.large_float()); EXPECT_EQ(-8e-28f, extreme_default.small_negative_float()); EXPECT_EQ(std::numeric_limits::infinity(), extreme_default.inf_double()); EXPECT_EQ(-std::numeric_limits::infinity(), extreme_default.neg_inf_double()); EXPECT_TRUE(extreme_default.nan_double() != extreme_default.nan_double()); EXPECT_EQ(std::numeric_limits::infinity(), extreme_default.inf_float()); EXPECT_EQ(-std::numeric_limits::infinity(), extreme_default.neg_inf_float()); EXPECT_TRUE(extreme_default.nan_float() != extreme_default.nan_float()); } TEST(GeneratedMessageTest, Trigraph) { const unittest::TestExtremeDefaultValues& extreme_default = unittest::TestExtremeDefaultValues::default_instance(); EXPECT_EQ("? ? ?? ?? ??? ?\?/ ?\?-", extreme_default.cpp_trigraph()); } TEST(GeneratedMessageTest, ExtremeSmallIntegerDefault) { const unittest::TestExtremeDefaultValues& extreme_default = unittest::TestExtremeDefaultValues::default_instance(); EXPECT_EQ(~0x7fffffff, kint32min); EXPECT_EQ(GOOGLE_LONGLONG(~0x7fffffffffffffff), kint64min); EXPECT_EQ(kint32min, extreme_default.really_small_int32()); EXPECT_EQ(kint64min, extreme_default.really_small_int64()); } TEST(GeneratedMessageTest, Accessors) { // Set every field to a unique value then go back and check all those // values. unittest::TestAllTypes message; TestUtil::SetAllFields(&message); TestUtil::ExpectAllFieldsSet(message); TestUtil::ModifyRepeatedFields(&message); TestUtil::ExpectRepeatedFieldsModified(message); } TEST(GeneratedMessageTest, MutableStringDefault) { // mutable_foo() for a string should return a string initialized to its // default value. unittest::TestAllTypes message; EXPECT_EQ("hello", *message.mutable_default_string()); // Note that the first time we call mutable_foo(), we get a newly-allocated // string, but if we clear it and call it again, we get the same object again. // We should verify that it has its default value in both cases. message.set_default_string("blah"); message.Clear(); EXPECT_EQ("hello", *message.mutable_default_string()); } TEST(GeneratedMessageTest, StringDefaults) { unittest::TestExtremeDefaultValues message; // Check if '\000' can be used in default string value. EXPECT_EQ(string("hel\000lo", 6), message.string_with_zero()); EXPECT_EQ(string("wor\000ld", 6), message.bytes_with_zero()); } TEST(GeneratedMessageTest, ReleaseString) { // Check that release_foo() starts out NULL, and gives us a value // that we can delete after it's been set. unittest::TestAllTypes message; EXPECT_EQ(NULL, message.release_default_string()); EXPECT_FALSE(message.has_default_string()); EXPECT_EQ("hello", message.default_string()); message.set_default_string("blah"); EXPECT_TRUE(message.has_default_string()); google::protobuf::scoped_ptr str(message.release_default_string()); EXPECT_FALSE(message.has_default_string()); ASSERT_TRUE(str != NULL); EXPECT_EQ("blah", *str); EXPECT_EQ(NULL, message.release_default_string()); EXPECT_FALSE(message.has_default_string()); EXPECT_EQ("hello", message.default_string()); } TEST(GeneratedMessageTest, ReleaseMessage) { // Check that release_foo() starts out NULL, and gives us a value // that we can delete after it's been set. unittest::TestAllTypes message; EXPECT_EQ(NULL, message.release_optional_nested_message()); EXPECT_FALSE(message.has_optional_nested_message()); message.mutable_optional_nested_message()->set_bb(1); google::protobuf::scoped_ptr nest( message.release_optional_nested_message()); EXPECT_FALSE(message.has_optional_nested_message()); ASSERT_TRUE(nest != NULL); EXPECT_EQ(1, nest->bb()); EXPECT_EQ(NULL, message.release_optional_nested_message()); EXPECT_FALSE(message.has_optional_nested_message()); } TEST(GeneratedMessageTest, SetAllocatedString) { // Check that set_allocated_foo() works for strings. unittest::TestAllTypes message; EXPECT_FALSE(message.has_optional_string()); const string kHello("hello"); message.set_optional_string(kHello); EXPECT_TRUE(message.has_optional_string()); message.set_allocated_optional_string(NULL); EXPECT_FALSE(message.has_optional_string()); EXPECT_EQ("", message.optional_string()); message.set_allocated_optional_string(new string(kHello)); EXPECT_TRUE(message.has_optional_string()); EXPECT_EQ(kHello, message.optional_string()); } TEST(GeneratedMessageTest, SetAllocatedMessage) { // Check that set_allocated_foo() can be called in all cases. unittest::TestAllTypes message; EXPECT_FALSE(message.has_optional_nested_message()); message.mutable_optional_nested_message()->set_bb(1); EXPECT_TRUE(message.has_optional_nested_message()); message.set_allocated_optional_nested_message(NULL); EXPECT_FALSE(message.has_optional_nested_message()); EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), &message.optional_nested_message()); message.mutable_optional_nested_message()->set_bb(1); unittest::TestAllTypes::NestedMessage* nest = message.release_optional_nested_message(); ASSERT_TRUE(nest != NULL); EXPECT_FALSE(message.has_optional_nested_message()); message.set_allocated_optional_nested_message(nest); EXPECT_TRUE(message.has_optional_nested_message()); EXPECT_EQ(1, message.optional_nested_message().bb()); } TEST(GeneratedMessageTest, Clear) { // Set every field to a unique value, clear the message, then check that // it is cleared. unittest::TestAllTypes message; TestUtil::SetAllFields(&message); message.Clear(); TestUtil::ExpectClear(message); // Unlike with the defaults test, we do NOT expect that requesting embedded // messages will return a pointer to the default instance. Instead, they // should return the objects that were created when mutable_blah() was // called. EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(), &message.optionalgroup()); EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), &message.optional_nested_message()); EXPECT_NE(&unittest::ForeignMessage::default_instance(), &message.optional_foreign_message()); EXPECT_NE(&unittest_import::ImportMessage::default_instance(), &message.optional_import_message()); } TEST(GeneratedMessageTest, EmbeddedNullsInBytesCharStar) { unittest::TestAllTypes message; const char* value = "\0lalala\0\0"; message.set_optional_bytes(value, 9); ASSERT_EQ(9, message.optional_bytes().size()); EXPECT_EQ(0, memcmp(value, message.optional_bytes().data(), 9)); message.add_repeated_bytes(value, 9); ASSERT_EQ(9, message.repeated_bytes(0).size()); EXPECT_EQ(0, memcmp(value, message.repeated_bytes(0).data(), 9)); } TEST(GeneratedMessageTest, ClearOneField) { // Set every field to a unique value, then clear one value and insure that // only that one value is cleared. unittest::TestAllTypes message; TestUtil::SetAllFields(&message); int64 original_value = message.optional_int64(); // Clear the field and make sure it shows up as cleared. message.clear_optional_int64(); EXPECT_FALSE(message.has_optional_int64()); EXPECT_EQ(0, message.optional_int64()); // Other adjacent fields should not be cleared. EXPECT_TRUE(message.has_optional_int32()); EXPECT_TRUE(message.has_optional_uint32()); // Make sure if we set it again, then all fields are set. message.set_optional_int64(original_value); TestUtil::ExpectAllFieldsSet(message); } TEST(GeneratedMessageTest, StringCharStarLength) { // Verify that we can use a char*,length to set one of the string fields. unittest::TestAllTypes message; message.set_optional_string("abcdef", 3); EXPECT_EQ("abc", message.optional_string()); // Verify that we can use a char*,length to add to a repeated string field. message.add_repeated_string("abcdef", 3); EXPECT_EQ(1, message.repeated_string_size()); EXPECT_EQ("abc", message.repeated_string(0)); // Verify that we can use a char*,length to set a repeated string field. message.set_repeated_string(0, "wxyz", 2); EXPECT_EQ("wx", message.repeated_string(0)); } #if LANG_CXX11 TEST(GeneratedMessageTest, StringMove) { // Verify that we trigger the move behavior on a scalar setter. protobuf_unittest_no_arena::TestAllTypes message; { string tmp(32, 'a'); const char* old_data = tmp.data(); message.set_optional_string(std::move(tmp)); const char* new_data = message.optional_string().data(); EXPECT_EQ(old_data, new_data); EXPECT_EQ(string(32, 'a'), message.optional_string()); string tmp2(32, 'b'); old_data = tmp2.data(); message.set_optional_string(std::move(tmp2)); new_data = message.optional_string().data(); EXPECT_EQ(old_data, new_data); EXPECT_EQ(string(32, 'b'), message.optional_string()); } // Verify that we trigger the move behavior on a oneof setter. { string tmp(32, 'a'); const char* old_data = tmp.data(); message.set_oneof_string(std::move(tmp)); const char* new_data = message.oneof_string().data(); EXPECT_EQ(old_data, new_data); EXPECT_EQ(string(32, 'a'), message.oneof_string()); string tmp2(32, 'b'); old_data = tmp2.data(); message.set_oneof_string(std::move(tmp2)); new_data = message.oneof_string().data(); EXPECT_EQ(old_data, new_data); EXPECT_EQ(string(32, 'b'), message.oneof_string()); } // Verify that we trigger the move behavior on a repeated setter. { string tmp(32, 'a'); const char* old_data = tmp.data(); message.add_repeated_string(std::move(tmp)); const char* new_data = message.repeated_string(0).data(); EXPECT_EQ(old_data, new_data); EXPECT_EQ(string(32, 'a'), message.repeated_string(0)); string tmp2(32, 'b'); old_data = tmp2.data(); message.set_repeated_string(0, std::move(tmp2)); new_data = message.repeated_string(0).data(); EXPECT_EQ(old_data, new_data); EXPECT_EQ(string(32, 'b'), message.repeated_string(0)); } } #endif TEST(GeneratedMessageTest, CopyFrom) { unittest::TestAllTypes message1, message2; TestUtil::SetAllFields(&message1); message2.CopyFrom(message1); TestUtil::ExpectAllFieldsSet(message2); // Copying from self should be a no-op. message2.CopyFrom(message2); TestUtil::ExpectAllFieldsSet(message2); } TEST(GeneratedMessageTest, SwapWithEmpty) { unittest::TestAllTypes message1, message2; TestUtil::SetAllFields(&message1); TestUtil::ExpectAllFieldsSet(message1); TestUtil::ExpectClear(message2); message1.Swap(&message2); TestUtil::ExpectAllFieldsSet(message2); TestUtil::ExpectClear(message1); } TEST(GeneratedMessageTest, SwapWithSelf) { unittest::TestAllTypes message; TestUtil::SetAllFields(&message); TestUtil::ExpectAllFieldsSet(message); message.Swap(&message); TestUtil::ExpectAllFieldsSet(message); } TEST(GeneratedMessageTest, SwapWithOther) { unittest::TestAllTypes message1, message2; message1.set_optional_int32(123); message1.set_optional_string("abc"); message1.mutable_optional_nested_message()->set_bb(1); message1.set_optional_nested_enum(unittest::TestAllTypes::FOO); message1.add_repeated_int32(1); message1.add_repeated_int32(2); message1.add_repeated_string("a"); message1.add_repeated_string("b"); message1.add_repeated_nested_message()->set_bb(7); message1.add_repeated_nested_message()->set_bb(8); message1.add_repeated_nested_enum(unittest::TestAllTypes::FOO); message1.add_repeated_nested_enum(unittest::TestAllTypes::BAR); message2.set_optional_int32(456); message2.set_optional_string("def"); message2.mutable_optional_nested_message()->set_bb(2); message2.set_optional_nested_enum(unittest::TestAllTypes::BAR); message2.add_repeated_int32(3); message2.add_repeated_string("c"); message2.add_repeated_nested_message()->set_bb(9); message2.add_repeated_nested_enum(unittest::TestAllTypes::BAZ); message1.Swap(&message2); EXPECT_EQ(456, message1.optional_int32()); EXPECT_EQ("def", message1.optional_string()); EXPECT_EQ(2, message1.optional_nested_message().bb()); EXPECT_EQ(unittest::TestAllTypes::BAR, message1.optional_nested_enum()); ASSERT_EQ(1, message1.repeated_int32_size()); EXPECT_EQ(3, message1.repeated_int32(0)); ASSERT_EQ(1, message1.repeated_string_size()); EXPECT_EQ("c", message1.repeated_string(0)); ASSERT_EQ(1, message1.repeated_nested_message_size()); EXPECT_EQ(9, message1.repeated_nested_message(0).bb()); ASSERT_EQ(1, message1.repeated_nested_enum_size()); EXPECT_EQ(unittest::TestAllTypes::BAZ, message1.repeated_nested_enum(0)); EXPECT_EQ(123, message2.optional_int32()); EXPECT_EQ("abc", message2.optional_string()); EXPECT_EQ(1, message2.optional_nested_message().bb()); EXPECT_EQ(unittest::TestAllTypes::FOO, message2.optional_nested_enum()); ASSERT_EQ(2, message2.repeated_int32_size()); EXPECT_EQ(1, message2.repeated_int32(0)); EXPECT_EQ(2, message2.repeated_int32(1)); ASSERT_EQ(2, message2.repeated_string_size()); EXPECT_EQ("a", message2.repeated_string(0)); EXPECT_EQ("b", message2.repeated_string(1)); ASSERT_EQ(2, message2.repeated_nested_message_size()); EXPECT_EQ(7, message2.repeated_nested_message(0).bb()); EXPECT_EQ(8, message2.repeated_nested_message(1).bb()); ASSERT_EQ(2, message2.repeated_nested_enum_size()); EXPECT_EQ(unittest::TestAllTypes::FOO, message2.repeated_nested_enum(0)); EXPECT_EQ(unittest::TestAllTypes::BAR, message2.repeated_nested_enum(1)); } TEST(GeneratedMessageTest, ADLSwap) { unittest::TestAllTypes message1, message2; TestUtil::SetAllFields(&message1); // Note the address of one of the repeated fields, to verify it was swapped // rather than copied. const int32* addr = &message1.repeated_int32().Get(0); using std::swap; swap(message1, message2); TestUtil::ExpectAllFieldsSet(message2); TestUtil::ExpectClear(message1); EXPECT_EQ(addr, &message2.repeated_int32().Get(0)); } TEST(GeneratedMessageTest, CopyConstructor) { // All set. { unittest::TestAllTypes message1; TestUtil::SetAllFields(&message1); unittest::TestAllTypes message2(message1); TestUtil::ExpectAllFieldsSet(message2); } // None set. { unittest::TestAllTypes message1; unittest::TestAllTypes message2(message1); EXPECT_FALSE(message1.has_optional_string()); EXPECT_FALSE(message2.has_optional_string()); EXPECT_EQ(&message1.optional_string(), &message2.optional_string()); EXPECT_FALSE(message1.has_optional_bytes()); EXPECT_FALSE(message2.has_optional_bytes()); EXPECT_EQ(&message1.optional_bytes(), &message2.optional_bytes()); EXPECT_FALSE(message1.has_optional_nested_message()); EXPECT_FALSE(message2.has_optional_nested_message()); EXPECT_EQ(&message1.optional_nested_message(), &message2.optional_nested_message()); EXPECT_FALSE(message1.has_optional_foreign_message()); EXPECT_FALSE(message2.has_optional_foreign_message()); EXPECT_EQ(&message1.optional_foreign_message(), &message2.optional_foreign_message()); EXPECT_FALSE(message1.has_optional_import_message()); EXPECT_FALSE(message2.has_optional_import_message()); EXPECT_EQ(&message1.optional_import_message(), &message2.optional_import_message()); EXPECT_FALSE(message1.has_optional_public_import_message()); EXPECT_FALSE(message2.has_optional_public_import_message()); EXPECT_EQ(&message1.optional_public_import_message(), &message2.optional_public_import_message()); EXPECT_FALSE(message1.has_optional_lazy_message()); EXPECT_FALSE(message2.has_optional_lazy_message()); EXPECT_EQ(&message1.optional_lazy_message(), &message2.optional_lazy_message()); } } TEST(GeneratedMessageTest, CopyConstructorWithArenas) { Arena arena; unittest::TestAllTypes* message1 = Arena::CreateMessage(&arena); TestUtil::SetAllFields(message1); unittest::TestAllTypes message2_stack(*message1); TestUtil::ExpectAllFieldsSet(message2_stack); google::protobuf::scoped_ptr message2_heap( new unittest::TestAllTypes(*message1)); TestUtil::ExpectAllFieldsSet(*message2_heap); arena.Reset(); // Verify that the copies are still intact. TestUtil::ExpectAllFieldsSet(message2_stack); TestUtil::ExpectAllFieldsSet(*message2_heap); } TEST(GeneratedMessageTest, CopyAssignmentOperator) { unittest::TestAllTypes message1; TestUtil::SetAllFields(&message1); unittest::TestAllTypes message2; message2 = message1; TestUtil::ExpectAllFieldsSet(message2); // Make sure that self-assignment does something sane. message2.operator=(message2); TestUtil::ExpectAllFieldsSet(message2); } #if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || \ !defined(GOOGLE_PROTOBUF_NO_RTTI) TEST(GeneratedMessageTest, UpcastCopyFrom) { // Test the CopyFrom method that takes in the generic const Message& // parameter. unittest::TestAllTypes message1, message2; TestUtil::SetAllFields(&message1); const Message* source = implicit_cast(&message1); message2.CopyFrom(*source); TestUtil::ExpectAllFieldsSet(message2); } #endif #ifndef PROTOBUF_TEST_NO_DESCRIPTORS TEST(GeneratedMessageTest, DynamicMessageCopyFrom) { // Test copying from a DynamicMessage, which must fall back to using // reflection. unittest::TestAllTypes message2; // Construct a new version of the dynamic message via the factory. DynamicMessageFactory factory; google::protobuf::scoped_ptr message1; message1.reset(factory.GetPrototype( unittest::TestAllTypes::descriptor())->New()); TestUtil::ReflectionTester reflection_tester( unittest::TestAllTypes::descriptor()); reflection_tester.SetAllFieldsViaReflection(message1.get()); message2.CopyFrom(*message1); TestUtil::ExpectAllFieldsSet(message2); } #endif // !PROTOBUF_TEST_NO_DESCRIPTORS TEST(GeneratedMessageTest, NonEmptyMergeFrom) { // Test merging with a non-empty message. Code is a modified form // of that found in google/protobuf/reflection_ops_unittest.cc. unittest::TestAllTypes message1, message2; TestUtil::SetAllFields(&message1); // This field will test merging into an empty spot. message2.set_optional_int32(message1.optional_int32()); message1.clear_optional_int32(); // This tests overwriting. message2.set_optional_string(message1.optional_string()); message1.set_optional_string("something else"); // This tests concatenating. message2.add_repeated_int32(message1.repeated_int32(1)); int32 i = message1.repeated_int32(0); message1.clear_repeated_int32(); message1.add_repeated_int32(i); message1.MergeFrom(message2); TestUtil::ExpectAllFieldsSet(message1); } // Test the generated SerializeWithCachedSizesToArray(), TEST(GeneratedMessageTest, SerializationToArray) { unittest::TestAllTypes message1, message2; string data; TestUtil::SetAllFields(&message1); int size = message1.ByteSize(); data.resize(size); uint8* start = reinterpret_cast(string_as_array(&data)); uint8* end = message1.SerializeWithCachedSizesToArray(start); EXPECT_EQ(size, end - start); EXPECT_TRUE(message2.ParseFromString(data)); TestUtil::ExpectAllFieldsSet(message2); } TEST(GeneratedMessageTest, PackedFieldsSerializationToArray) { unittest::TestPackedTypes packed_message1, packed_message2; string packed_data; TestUtil::SetPackedFields(&packed_message1); int packed_size = packed_message1.ByteSize(); packed_data.resize(packed_size); uint8* start = reinterpret_cast(string_as_array(&packed_data)); uint8* end = packed_message1.SerializeWithCachedSizesToArray(start); EXPECT_EQ(packed_size, end - start); EXPECT_TRUE(packed_message2.ParseFromString(packed_data)); TestUtil::ExpectPackedFieldsSet(packed_message2); } // Test the generated SerializeWithCachedSizes() by forcing the buffer to write // one byte at a time. TEST(GeneratedMessageTest, SerializationToStream) { unittest::TestAllTypes message1, message2; TestUtil::SetAllFields(&message1); int size = message1.ByteSize(); string data; data.resize(size); { // Allow the output stream to buffer only one byte at a time. io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); io::CodedOutputStream output_stream(&array_stream); message1.SerializeWithCachedSizes(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); } EXPECT_TRUE(message2.ParseFromString(data)); TestUtil::ExpectAllFieldsSet(message2); } TEST(GeneratedMessageTest, PackedFieldsSerializationToStream) { unittest::TestPackedTypes message1, message2; TestUtil::SetPackedFields(&message1); int size = message1.ByteSize(); string data; data.resize(size); { // Allow the output stream to buffer only one byte at a time. io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); io::CodedOutputStream output_stream(&array_stream); message1.SerializeWithCachedSizes(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); } EXPECT_TRUE(message2.ParseFromString(data)); TestUtil::ExpectPackedFieldsSet(message2); } TEST(GeneratedMessageTest, Required) { // Test that IsInitialized() returns false if required fields are missing. unittest::TestRequired message; EXPECT_FALSE(message.IsInitialized()); message.set_a(1); EXPECT_FALSE(message.IsInitialized()); message.set_b(2); EXPECT_FALSE(message.IsInitialized()); message.set_c(3); EXPECT_TRUE(message.IsInitialized()); } TEST(GeneratedMessageTest, RequiredForeign) { // Test that IsInitialized() returns false if required fields in nested // messages are missing. unittest::TestRequiredForeign message; EXPECT_TRUE(message.IsInitialized()); message.mutable_optional_message(); EXPECT_FALSE(message.IsInitialized()); message.mutable_optional_message()->set_a(1); message.mutable_optional_message()->set_b(2); message.mutable_optional_message()->set_c(3); EXPECT_TRUE(message.IsInitialized()); message.add_repeated_message(); EXPECT_FALSE(message.IsInitialized()); message.mutable_repeated_message(0)->set_a(1); message.mutable_repeated_message(0)->set_b(2); message.mutable_repeated_message(0)->set_c(3); EXPECT_TRUE(message.IsInitialized()); } TEST(GeneratedMessageTest, ForeignNested) { // Test that TestAllTypes::NestedMessage can be embedded directly into // another message. unittest::TestForeignNested message; // If this compiles and runs without crashing, it must work. We have // nothing more to test. unittest::TestAllTypes::NestedMessage* nested = message.mutable_foreign_nested(); nested->set_bb(1); } TEST(GeneratedMessageTest, ReallyLargeTagNumber) { // Test that really large tag numbers don't break anything. unittest::TestReallyLargeTagNumber message1, message2; string data; // For the most part, if this compiles and runs then we're probably good. // (The most likely cause for failure would be if something were attempting // to allocate a lookup table of some sort using tag numbers as the index.) // We'll try serializing just for fun. message1.set_a(1234); message1.set_bb(5678); message1.SerializeToString(&data); EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(1234, message2.a()); EXPECT_EQ(5678, message2.bb()); } TEST(GeneratedMessageTest, MutualRecursion) { // Test that mutually-recursive message types work. unittest::TestMutualRecursionA message; unittest::TestMutualRecursionA* nested = message.mutable_bb()->mutable_a(); unittest::TestMutualRecursionA* nested2 = nested->mutable_bb()->mutable_a(); // Again, if the above compiles and runs, that's all we really have to // test, but just for run we'll check that the system didn't somehow come // up with a pointer loop... EXPECT_NE(&message, nested); EXPECT_NE(&message, nested2); EXPECT_NE(nested, nested2); } TEST(GeneratedMessageTest, CamelCaseFieldNames) { // This test is mainly checking that the following compiles, which verifies // that the field names were coerced to lower-case. // // Protocol buffers standard style is to use lowercase-with-underscores for // field names. Some old proto1 .protos unfortunately used camel-case field // names. In proto1, these names were forced to lower-case. So, we do the // same thing in proto2. unittest::TestCamelCaseFieldNames message; message.set_primitivefield(2); message.set_stringfield("foo"); message.set_enumfield(unittest::FOREIGN_FOO); message.mutable_messagefield()->set_c(6); message.add_repeatedprimitivefield(8); message.add_repeatedstringfield("qux"); message.add_repeatedenumfield(unittest::FOREIGN_BAR); message.add_repeatedmessagefield()->set_c(15); EXPECT_EQ(2, message.primitivefield()); EXPECT_EQ("foo", message.stringfield()); EXPECT_EQ(unittest::FOREIGN_FOO, message.enumfield()); EXPECT_EQ(6, message.messagefield().c()); EXPECT_EQ(8, message.repeatedprimitivefield(0)); EXPECT_EQ("qux", message.repeatedstringfield(0)); EXPECT_EQ(unittest::FOREIGN_BAR, message.repeatedenumfield(0)); EXPECT_EQ(15, message.repeatedmessagefield(0).c()); } TEST(GeneratedMessageTest, TestConflictingSymbolNames) { // test_bad_identifiers.proto successfully compiled, then it works. The // following is just a token usage to insure that the code is, in fact, // being compiled and linked. protobuf_unittest::TestConflictingSymbolNames message; message.set_uint32(1); EXPECT_EQ(3, message.ByteSize()); message.set_friend_(5); EXPECT_EQ(5, message.friend_()); message.set_class_(6); EXPECT_EQ(6, message.class_()); // Instantiate extension template functions to test conflicting template // parameter names. typedef protobuf_unittest::TestConflictingSymbolNamesExtension ExtensionMessage; message.AddExtension(ExtensionMessage::repeated_int32_ext, 123); EXPECT_EQ(123, message.GetExtension(ExtensionMessage::repeated_int32_ext, 0)); } TEST(GeneratedMessageTest, TestConflictingEnumNames) { protobuf_unittest::TestConflictingEnumNames message; message.set_conflicting_enum(protobuf_unittest::TestConflictingEnumNames_NestedConflictingEnum_and_); EXPECT_EQ(1, message.conflicting_enum()); message.set_conflicting_enum(protobuf_unittest::TestConflictingEnumNames_NestedConflictingEnum_XOR); EXPECT_EQ(5, message.conflicting_enum()); protobuf_unittest::ConflictingEnum conflicting_enum; conflicting_enum = protobuf_unittest::NOT_EQ; EXPECT_EQ(1, conflicting_enum); conflicting_enum = protobuf_unittest::return_; EXPECT_EQ(3, conflicting_enum); } #ifndef PROTOBUF_TEST_NO_DESCRIPTORS TEST(GeneratedMessageTest, TestOptimizedForSize) { // We rely on the tests in reflection_ops_unittest and wire_format_unittest // to really test that reflection-based methods work. Here we are mostly // just making sure that TestOptimizedForSize actually builds and seems to // function. protobuf_unittest::TestOptimizedForSize message, message2; message.set_i(1); message.mutable_msg()->set_c(2); message2.CopyFrom(message); EXPECT_EQ(1, message2.i()); EXPECT_EQ(2, message2.msg().c()); } TEST(GeneratedMessageTest, TestEmbedOptimizedForSize) { // Verifies that something optimized for speed can contain something optimized // for size. protobuf_unittest::TestEmbedOptimizedForSize message, message2; message.mutable_optional_message()->set_i(1); message.add_repeated_message()->mutable_msg()->set_c(2); string data; message.SerializeToString(&data); ASSERT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(1, message2.optional_message().i()); EXPECT_EQ(2, message2.repeated_message(0).msg().c()); } TEST(GeneratedMessageTest, TestSpaceUsed) { unittest::TestAllTypes message1; // sizeof provides a lower bound on SpaceUsed(). EXPECT_LE(sizeof(unittest::TestAllTypes), message1.SpaceUsed()); const int empty_message_size = message1.SpaceUsed(); // Setting primitive types shouldn't affect the space used. message1.set_optional_int32(123); message1.set_optional_int64(12345); message1.set_optional_uint32(123); message1.set_optional_uint64(12345); EXPECT_EQ(empty_message_size, message1.SpaceUsed()); // On some STL implementations, setting the string to a small value should // only increase SpaceUsed() by the size of a string object, though this is // not true everywhere. message1.set_optional_string("abc"); EXPECT_LE(empty_message_size + sizeof(string), message1.SpaceUsed()); // Setting a string to a value larger than the string object itself should // increase SpaceUsed(), because it cannot store the value internally. message1.set_optional_string(string(sizeof(string) + 1, 'x')); int min_expected_increase = message1.optional_string().capacity() + sizeof(string); EXPECT_LE(empty_message_size + min_expected_increase, message1.SpaceUsed()); int previous_size = message1.SpaceUsed(); // Adding an optional message should increase the size by the size of the // nested message type. NestedMessage is simple enough (1 int field) that it // is equal to sizeof(NestedMessage) message1.mutable_optional_nested_message(); ASSERT_EQ(sizeof(unittest::TestAllTypes::NestedMessage), message1.optional_nested_message().SpaceUsed()); EXPECT_EQ(previous_size + sizeof(unittest::TestAllTypes::NestedMessage), message1.SpaceUsed()); } TEST(GeneratedMessageTest, TestOneofSpaceUsed) { unittest::TestOneof2 message1; EXPECT_LE(sizeof(unittest::TestOneof2), message1.SpaceUsed()); const int empty_message_size = message1.SpaceUsed(); // Setting primitive types shouldn't affect the space used. message1.set_foo_int(123); message1.set_bar_int(12345); EXPECT_EQ(empty_message_size, message1.SpaceUsed()); // Setting a string in oneof to a small value should only increase SpaceUsed() // by the size of a string object. message1.set_foo_string("abc"); EXPECT_LE(empty_message_size + sizeof(string), message1.SpaceUsed()); // Setting a string in oneof to a value larger than the string object itself // should increase SpaceUsed(), because it cannot store the value internally. message1.set_foo_string(string(sizeof(string) + 1, 'x')); int min_expected_increase = message1.foo_string().capacity() + sizeof(string); EXPECT_LE(empty_message_size + min_expected_increase, message1.SpaceUsed()); // Setting a message in oneof should delete the other fields and increase the // size by the size of the nested message type. NestedMessage is simple enough // that it is equal to sizeof(NestedMessage) message1.mutable_foo_message(); ASSERT_EQ(sizeof(unittest::TestOneof2::NestedMessage), message1.foo_message().SpaceUsed()); EXPECT_EQ(empty_message_size + sizeof(unittest::TestOneof2::NestedMessage), message1.SpaceUsed()); } #endif // !PROTOBUF_TEST_NO_DESCRIPTORS TEST(GeneratedMessageTest, FieldConstantValues) { unittest::TestRequired message; EXPECT_EQ(unittest::TestAllTypes_NestedMessage::kBbFieldNumber, 1); EXPECT_EQ(unittest::TestAllTypes::kOptionalInt32FieldNumber, 1); EXPECT_EQ(unittest::TestAllTypes::kOptionalgroupFieldNumber, 16); EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedMessageFieldNumber, 18); EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedEnumFieldNumber, 21); EXPECT_EQ(unittest::TestAllTypes::kRepeatedInt32FieldNumber, 31); EXPECT_EQ(unittest::TestAllTypes::kRepeatedgroupFieldNumber, 46); EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedMessageFieldNumber, 48); EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedEnumFieldNumber, 51); } TEST(GeneratedMessageTest, ExtensionConstantValues) { EXPECT_EQ(unittest::TestRequired::kSingleFieldNumber, 1000); EXPECT_EQ(unittest::TestRequired::kMultiFieldNumber, 1001); EXPECT_EQ(unittest::kOptionalInt32ExtensionFieldNumber, 1); EXPECT_EQ(unittest::kOptionalgroupExtensionFieldNumber, 16); EXPECT_EQ(unittest::kOptionalNestedMessageExtensionFieldNumber, 18); EXPECT_EQ(unittest::kOptionalNestedEnumExtensionFieldNumber, 21); EXPECT_EQ(unittest::kRepeatedInt32ExtensionFieldNumber, 31); EXPECT_EQ(unittest::kRepeatedgroupExtensionFieldNumber, 46); EXPECT_EQ(unittest::kRepeatedNestedMessageExtensionFieldNumber, 48); EXPECT_EQ(unittest::kRepeatedNestedEnumExtensionFieldNumber, 51); } TEST(GeneratedMessageTest, ParseFromTruncated) { const string long_string = string(128, 'q'); FileDescriptorProto p; p.add_extension()->set_name(long_string); const string msg = p.SerializeAsString(); int successful_count = 0; for (int i = 0; i <= msg.size(); i++) { if (p.ParseFromArray(msg.c_str(), i)) { ++successful_count; } } // We don't really care about how often we succeeded. // As long as we didn't crash, we're happy. EXPECT_GE(successful_count, 1); } // =================================================================== TEST(GeneratedEnumTest, EnumValuesAsSwitchCases) { // Test that our nested enum values can be used as switch cases. This test // doesn't actually do anything, the proof that it works is that it // compiles. int i =0; unittest::TestAllTypes::NestedEnum a = unittest::TestAllTypes::BAR; switch (a) { case unittest::TestAllTypes::FOO: i = 1; break; case unittest::TestAllTypes::BAR: i = 2; break; case unittest::TestAllTypes::BAZ: i = 3; break; case unittest::TestAllTypes::NEG: i = -1; break; // no default case: We want to make sure the compiler recognizes that // all cases are covered. (GCC warns if you do not cover all cases of // an enum in a switch.) } // Token check just for fun. EXPECT_EQ(2, i); } TEST(GeneratedEnumTest, IsValidValue) { // Test enum IsValidValue. EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(1)); EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(2)); EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(3)); EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(0)); EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(4)); // Make sure it also works when there are dups. EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(1)); EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(2)); EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(3)); EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(0)); EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(4)); } TEST(GeneratedEnumTest, MinAndMax) { EXPECT_EQ(unittest::TestAllTypes::NEG, unittest::TestAllTypes::NestedEnum_MIN); EXPECT_EQ(unittest::TestAllTypes::BAZ, unittest::TestAllTypes::NestedEnum_MAX); EXPECT_EQ(4, unittest::TestAllTypes::NestedEnum_ARRAYSIZE); EXPECT_EQ(unittest::FOREIGN_FOO, unittest::ForeignEnum_MIN); EXPECT_EQ(unittest::FOREIGN_BAZ, unittest::ForeignEnum_MAX); EXPECT_EQ(7, unittest::ForeignEnum_ARRAYSIZE); EXPECT_EQ(1, unittest::TestEnumWithDupValue_MIN); EXPECT_EQ(3, unittest::TestEnumWithDupValue_MAX); EXPECT_EQ(4, unittest::TestEnumWithDupValue_ARRAYSIZE); EXPECT_EQ(unittest::SPARSE_E, unittest::TestSparseEnum_MIN); EXPECT_EQ(unittest::SPARSE_C, unittest::TestSparseEnum_MAX); EXPECT_EQ(12589235, unittest::TestSparseEnum_ARRAYSIZE); // Make sure we can take the address of _MIN, _MAX and _ARRAYSIZE. void* null_pointer = 0; // NULL may be integer-type, not pointer-type. EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_MIN); EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_MAX); EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_ARRAYSIZE); EXPECT_NE(null_pointer, &unittest::ForeignEnum_MIN); EXPECT_NE(null_pointer, &unittest::ForeignEnum_MAX); EXPECT_NE(null_pointer, &unittest::ForeignEnum_ARRAYSIZE); // Make sure we can use _MIN and _MAX as switch cases. switch (unittest::SPARSE_A) { case unittest::TestSparseEnum_MIN: case unittest::TestSparseEnum_MAX: break; default: break; } } #ifndef PROTOBUF_TEST_NO_DESCRIPTORS TEST(GeneratedEnumTest, Name) { // "Names" in the presence of dup values are a bit arbitrary. EXPECT_EQ("FOO1", unittest::TestEnumWithDupValue_Name(unittest::FOO1)); EXPECT_EQ("FOO1", unittest::TestEnumWithDupValue_Name(unittest::FOO2)); EXPECT_EQ("SPARSE_A", unittest::TestSparseEnum_Name(unittest::SPARSE_A)); EXPECT_EQ("SPARSE_B", unittest::TestSparseEnum_Name(unittest::SPARSE_B)); EXPECT_EQ("SPARSE_C", unittest::TestSparseEnum_Name(unittest::SPARSE_C)); EXPECT_EQ("SPARSE_D", unittest::TestSparseEnum_Name(unittest::SPARSE_D)); EXPECT_EQ("SPARSE_E", unittest::TestSparseEnum_Name(unittest::SPARSE_E)); EXPECT_EQ("SPARSE_F", unittest::TestSparseEnum_Name(unittest::SPARSE_F)); EXPECT_EQ("SPARSE_G", unittest::TestSparseEnum_Name(unittest::SPARSE_G)); } TEST(GeneratedEnumTest, Parse) { unittest::TestEnumWithDupValue dup_value = unittest::FOO1; EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse("FOO1", &dup_value)); EXPECT_EQ(unittest::FOO1, dup_value); EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse("FOO2", &dup_value)); EXPECT_EQ(unittest::FOO2, dup_value); EXPECT_FALSE(unittest::TestEnumWithDupValue_Parse("FOO", &dup_value)); } TEST(GeneratedEnumTest, GetEnumDescriptor) { EXPECT_EQ(unittest::TestAllTypes::NestedEnum_descriptor(), GetEnumDescriptor()); EXPECT_EQ(unittest::ForeignEnum_descriptor(), GetEnumDescriptor()); EXPECT_EQ(unittest::TestEnumWithDupValue_descriptor(), GetEnumDescriptor()); EXPECT_EQ(unittest::TestSparseEnum_descriptor(), GetEnumDescriptor()); } enum NonProtoEnum { kFoo = 1, }; TEST(GeneratedEnumTest, IsProtoEnumTypeTrait) { EXPECT_TRUE(is_proto_enum::value); EXPECT_TRUE(is_proto_enum::value); EXPECT_TRUE(is_proto_enum::value); EXPECT_TRUE(is_proto_enum::value); EXPECT_FALSE(is_proto_enum::value); EXPECT_FALSE(is_proto_enum::value); } #endif // PROTOBUF_TEST_NO_DESCRIPTORS // =================================================================== #ifndef PROTOBUF_TEST_NO_DESCRIPTORS // Support code for testing services. class GeneratedServiceTest : public testing::Test { protected: class MockTestService : public unittest::TestService { public: MockTestService() : called_(false), method_(""), controller_(NULL), request_(NULL), response_(NULL), done_(NULL) {} ~MockTestService() {} void Reset() { called_ = false; } // implements TestService ---------------------------------------- void Foo(RpcController* controller, const unittest::FooRequest* request, unittest::FooResponse* response, Closure* done) { ASSERT_FALSE(called_); called_ = true; method_ = "Foo"; controller_ = controller; request_ = request; response_ = response; done_ = done; } void Bar(RpcController* controller, const unittest::BarRequest* request, unittest::BarResponse* response, Closure* done) { ASSERT_FALSE(called_); called_ = true; method_ = "Bar"; controller_ = controller; request_ = request; response_ = response; done_ = done; } // --------------------------------------------------------------- bool called_; string method_; RpcController* controller_; const Message* request_; Message* response_; Closure* done_; }; class MockRpcChannel : public RpcChannel { public: MockRpcChannel() : called_(false), method_(NULL), controller_(NULL), request_(NULL), response_(NULL), done_(NULL), destroyed_(NULL) {} ~MockRpcChannel() { if (destroyed_ != NULL) *destroyed_ = true; } void Reset() { called_ = false; } // implements TestService ---------------------------------------- void CallMethod(const MethodDescriptor* method, RpcController* controller, const Message* request, Message* response, Closure* done) { ASSERT_FALSE(called_); called_ = true; method_ = method; controller_ = controller; request_ = request; response_ = response; done_ = done; } // --------------------------------------------------------------- bool called_; const MethodDescriptor* method_; RpcController* controller_; const Message* request_; Message* response_; Closure* done_; bool* destroyed_; }; class MockController : public RpcController { public: void Reset() { ADD_FAILURE() << "Reset() not expected during this test."; } bool Failed() const { ADD_FAILURE() << "Failed() not expected during this test."; return false; } string ErrorText() const { ADD_FAILURE() << "ErrorText() not expected during this test."; return ""; } void StartCancel() { ADD_FAILURE() << "StartCancel() not expected during this test."; } void SetFailed(const string& reason) { ADD_FAILURE() << "SetFailed() not expected during this test."; } bool IsCanceled() const { ADD_FAILURE() << "IsCanceled() not expected during this test."; return false; } void NotifyOnCancel(Closure* callback) { ADD_FAILURE() << "NotifyOnCancel() not expected during this test."; } }; GeneratedServiceTest() : descriptor_(unittest::TestService::descriptor()), foo_(descriptor_->FindMethodByName("Foo")), bar_(descriptor_->FindMethodByName("Bar")), stub_(&mock_channel_), done_(::google::protobuf::NewPermanentCallback(&DoNothing)) {} virtual void SetUp() { ASSERT_TRUE(foo_ != NULL); ASSERT_TRUE(bar_ != NULL); } const ServiceDescriptor* descriptor_; const MethodDescriptor* foo_; const MethodDescriptor* bar_; MockTestService mock_service_; MockController mock_controller_; MockRpcChannel mock_channel_; unittest::TestService::Stub stub_; // Just so we don't have to re-define these with every test. unittest::FooRequest foo_request_; unittest::FooResponse foo_response_; unittest::BarRequest bar_request_; unittest::BarResponse bar_response_; google::protobuf::scoped_ptr done_; }; TEST_F(GeneratedServiceTest, GetDescriptor) { // Test that GetDescriptor() works. EXPECT_EQ(descriptor_, mock_service_.GetDescriptor()); } TEST_F(GeneratedServiceTest, GetChannel) { EXPECT_EQ(&mock_channel_, stub_.channel()); } TEST_F(GeneratedServiceTest, OwnsChannel) { MockRpcChannel* channel = new MockRpcChannel; bool destroyed = false; channel->destroyed_ = &destroyed; { unittest::TestService::Stub owning_stub(channel, Service::STUB_OWNS_CHANNEL); EXPECT_FALSE(destroyed); } EXPECT_TRUE(destroyed); } TEST_F(GeneratedServiceTest, CallMethod) { // Test that CallMethod() works. // Call Foo() via CallMethod(). mock_service_.CallMethod(foo_, &mock_controller_, &foo_request_, &foo_response_, done_.get()); ASSERT_TRUE(mock_service_.called_); EXPECT_EQ("Foo" , mock_service_.method_ ); EXPECT_EQ(&mock_controller_, mock_service_.controller_); EXPECT_EQ(&foo_request_ , mock_service_.request_ ); EXPECT_EQ(&foo_response_ , mock_service_.response_ ); EXPECT_EQ(done_.get() , mock_service_.done_ ); // Try again, but call Bar() instead. mock_service_.Reset(); mock_service_.CallMethod(bar_, &mock_controller_, &bar_request_, &bar_response_, done_.get()); ASSERT_TRUE(mock_service_.called_); EXPECT_EQ("Bar", mock_service_.method_); } TEST_F(GeneratedServiceTest, CallMethodTypeFailure) { // Verify death if we call Foo() with Bar's message types. #ifdef PROTOBUF_HAS_DEATH_TEST // death tests do not work on Windows yet EXPECT_DEBUG_DEATH( mock_service_.CallMethod(foo_, &mock_controller_, &foo_request_, &bar_response_, done_.get()), "dynamic_cast"); mock_service_.Reset(); EXPECT_DEBUG_DEATH( mock_service_.CallMethod(foo_, &mock_controller_, &bar_request_, &foo_response_, done_.get()), "dynamic_cast"); #endif // PROTOBUF_HAS_DEATH_TEST } TEST_F(GeneratedServiceTest, GetPrototypes) { // Test Get{Request,Response}Prototype() methods. EXPECT_EQ(&unittest::FooRequest::default_instance(), &mock_service_.GetRequestPrototype(foo_)); EXPECT_EQ(&unittest::BarRequest::default_instance(), &mock_service_.GetRequestPrototype(bar_)); EXPECT_EQ(&unittest::FooResponse::default_instance(), &mock_service_.GetResponsePrototype(foo_)); EXPECT_EQ(&unittest::BarResponse::default_instance(), &mock_service_.GetResponsePrototype(bar_)); } TEST_F(GeneratedServiceTest, Stub) { // Test that the stub class works. // Call Foo() via the stub. stub_.Foo(&mock_controller_, &foo_request_, &foo_response_, done_.get()); ASSERT_TRUE(mock_channel_.called_); EXPECT_EQ(foo_ , mock_channel_.method_ ); EXPECT_EQ(&mock_controller_, mock_channel_.controller_); EXPECT_EQ(&foo_request_ , mock_channel_.request_ ); EXPECT_EQ(&foo_response_ , mock_channel_.response_ ); EXPECT_EQ(done_.get() , mock_channel_.done_ ); // Call Bar() via the stub. mock_channel_.Reset(); stub_.Bar(&mock_controller_, &bar_request_, &bar_response_, done_.get()); ASSERT_TRUE(mock_channel_.called_); EXPECT_EQ(bar_, mock_channel_.method_); } TEST_F(GeneratedServiceTest, NotImplemented) { // Test that failing to implement a method of a service causes it to fail // with a "not implemented" error message. // A service which doesn't implement any methods. class UnimplementedService : public unittest::TestService { public: UnimplementedService() {} }; UnimplementedService unimplemented_service; // And a controller which expects to get a "not implemented" error. class ExpectUnimplementedController : public MockController { public: ExpectUnimplementedController() : called_(false) {} void SetFailed(const string& reason) { EXPECT_FALSE(called_); called_ = true; EXPECT_EQ("Method Foo() not implemented.", reason); } bool called_; }; ExpectUnimplementedController controller; // Call Foo. unimplemented_service.Foo(&controller, &foo_request_, &foo_response_, done_.get()); EXPECT_TRUE(controller.called_); } // =================================================================== class OneofTest : public testing::Test { protected: virtual void SetUp() { } void ExpectEnumCasesWork(const unittest::TestOneof2 &message) { switch (message.foo_case()) { case unittest::TestOneof2::kFooInt: EXPECT_TRUE(message.has_foo_int()); break; case unittest::TestOneof2::kFooString: EXPECT_TRUE(message.has_foo_string()); break; case unittest::TestOneof2::kFooCord: EXPECT_TRUE(message.has_foo_cord()); break; case unittest::TestOneof2::kFooStringPiece: EXPECT_TRUE(message.has_foo_string_piece()); break; case unittest::TestOneof2::kFooBytes: EXPECT_TRUE(message.has_foo_bytes()); break; case unittest::TestOneof2::kFooEnum: EXPECT_TRUE(message.has_foo_enum()); break; case unittest::TestOneof2::kFooMessage: EXPECT_TRUE(message.has_foo_message()); break; case unittest::TestOneof2::kFoogroup: EXPECT_TRUE(message.has_foogroup()); break; case unittest::TestOneof2::kFooLazyMessage: EXPECT_TRUE(message.has_foo_lazy_message()); break; case unittest::TestOneof2::FOO_NOT_SET: break; } } }; TEST_F(OneofTest, SettingOneFieldClearsOthers) { unittest::TestOneof2 message; message.set_foo_int(123); EXPECT_TRUE(message.has_foo_int()); TestUtil::ExpectAtMostOneFieldSetInOneof(message); message.set_foo_string("foo"); EXPECT_TRUE(message.has_foo_string()); TestUtil::ExpectAtMostOneFieldSetInOneof(message); message.set_foo_bytes("qux"); EXPECT_TRUE(message.has_foo_bytes()); TestUtil::ExpectAtMostOneFieldSetInOneof(message); message.set_foo_enum(unittest::TestOneof2::FOO); EXPECT_TRUE(message.has_foo_enum()); TestUtil::ExpectAtMostOneFieldSetInOneof(message); message.mutable_foo_message()->set_qux_int(234); EXPECT_TRUE(message.has_foo_message()); TestUtil::ExpectAtMostOneFieldSetInOneof(message); message.mutable_foogroup()->set_a(345); EXPECT_TRUE(message.has_foogroup()); TestUtil::ExpectAtMostOneFieldSetInOneof(message); // we repeat this because we didn't test if this properly clears other fields // at the beginning. message.set_foo_int(123); EXPECT_TRUE(message.has_foo_int()); TestUtil::ExpectAtMostOneFieldSetInOneof(message); } TEST_F(OneofTest, EnumCases) { unittest::TestOneof2 message; message.set_foo_int(123); ExpectEnumCasesWork(message); message.set_foo_string("foo"); ExpectEnumCasesWork(message); message.set_foo_bytes("qux"); ExpectEnumCasesWork(message); message.set_foo_enum(unittest::TestOneof2::FOO); ExpectEnumCasesWork(message); message.mutable_foo_message()->set_qux_int(234); ExpectEnumCasesWork(message); message.mutable_foogroup()->set_a(345); ExpectEnumCasesWork(message); } TEST_F(OneofTest, PrimitiveType) { unittest::TestOneof2 message; // Unset field returns default value EXPECT_EQ(message.foo_int(), 0); message.set_foo_int(123); EXPECT_TRUE(message.has_foo_int()); EXPECT_EQ(message.foo_int(), 123); message.clear_foo_int(); EXPECT_FALSE(message.has_foo_int()); } TEST_F(OneofTest, EnumType) { unittest::TestOneof2 message; // Unset field returns default value EXPECT_EQ(message.foo_enum(), 1); message.set_foo_enum(unittest::TestOneof2::FOO); EXPECT_TRUE(message.has_foo_enum()); EXPECT_EQ(message.foo_enum(), unittest::TestOneof2::FOO); message.clear_foo_enum(); EXPECT_FALSE(message.has_foo_enum()); } TEST_F(OneofTest, SetString) { // Check that setting a string field in various ways works unittest::TestOneof2 message; // Unset field returns default value EXPECT_EQ(message.foo_string(), ""); message.set_foo_string("foo"); EXPECT_TRUE(message.has_foo_string()); EXPECT_EQ(message.foo_string(), "foo"); message.clear_foo_string(); EXPECT_FALSE(message.has_foo_string()); message.set_foo_string(string("bar")); EXPECT_TRUE(message.has_foo_string()); EXPECT_EQ(message.foo_string(), "bar"); message.clear_foo_string(); EXPECT_FALSE(message.has_foo_string()); message.set_foo_string("qux", 3); EXPECT_TRUE(message.has_foo_string()); EXPECT_EQ(message.foo_string(), "qux"); message.clear_foo_string(); EXPECT_FALSE(message.has_foo_string()); message.mutable_foo_string()->assign("quux"); EXPECT_TRUE(message.has_foo_string()); EXPECT_EQ(message.foo_string(), "quux"); message.clear_foo_string(); EXPECT_FALSE(message.has_foo_string()); message.set_foo_string("corge"); EXPECT_TRUE(message.has_foo_string()); EXPECT_EQ(message.foo_string(), "corge"); message.clear_foo_string(); EXPECT_FALSE(message.has_foo_string()); } TEST_F(OneofTest, ReleaseString) { // Check that release_foo() starts out NULL, and gives us a value // that we can delete after it's been set. unittest::TestOneof2 message; EXPECT_EQ(NULL, message.release_foo_string()); EXPECT_FALSE(message.has_foo_string()); message.set_foo_string("blah"); EXPECT_TRUE(message.has_foo_string()); google::protobuf::scoped_ptr str(message.release_foo_string()); EXPECT_FALSE(message.has_foo_string()); ASSERT_TRUE(str != NULL); EXPECT_EQ("blah", *str); EXPECT_EQ(NULL, message.release_foo_string()); EXPECT_FALSE(message.has_foo_string()); } TEST_F(OneofTest, SetAllocatedString) { // Check that set_allocated_foo() works for strings. unittest::TestOneof2 message; EXPECT_FALSE(message.has_foo_string()); const string kHello("hello"); message.set_foo_string(kHello); EXPECT_TRUE(message.has_foo_string()); message.set_allocated_foo_string(NULL); EXPECT_FALSE(message.has_foo_string()); EXPECT_EQ("", message.foo_string()); message.set_allocated_foo_string(new string(kHello)); EXPECT_TRUE(message.has_foo_string()); EXPECT_EQ(kHello, message.foo_string()); } TEST_F(OneofTest, SetMessage) { // Check that setting a message field works unittest::TestOneof2 message; // Unset field returns default instance EXPECT_EQ(&message.foo_message(), &unittest::TestOneof2_NestedMessage::default_instance()); EXPECT_EQ(message.foo_message().qux_int(), 0); message.mutable_foo_message()->set_qux_int(234); EXPECT_TRUE(message.has_foo_message()); EXPECT_EQ(message.foo_message().qux_int(), 234); message.clear_foo_message(); EXPECT_FALSE(message.has_foo_message()); } TEST_F(OneofTest, ReleaseMessage) { // Check that release_foo() starts out NULL, and gives us a value // that we can delete after it's been set. unittest::TestOneof2 message; EXPECT_EQ(NULL, message.release_foo_message()); EXPECT_FALSE(message.has_foo_message()); message.mutable_foo_message()->set_qux_int(1); EXPECT_TRUE(message.has_foo_message()); google::protobuf::scoped_ptr mes( message.release_foo_message()); EXPECT_FALSE(message.has_foo_message()); ASSERT_TRUE(mes != NULL); EXPECT_EQ(1, mes->qux_int()); EXPECT_EQ(NULL, message.release_foo_message()); EXPECT_FALSE(message.has_foo_message()); } TEST_F(OneofTest, SetAllocatedMessage) { // Check that set_allocated_foo() works for messages. unittest::TestOneof2 message; EXPECT_FALSE(message.has_foo_message()); message.mutable_foo_message()->set_qux_int(1); EXPECT_TRUE(message.has_foo_message()); message.set_allocated_foo_message(NULL); EXPECT_FALSE(message.has_foo_message()); EXPECT_EQ(&message.foo_message(), &unittest::TestOneof2_NestedMessage::default_instance()); message.mutable_foo_message()->set_qux_int(1); unittest::TestOneof2_NestedMessage* mes = message.release_foo_message(); ASSERT_TRUE(mes != NULL); EXPECT_FALSE(message.has_foo_message()); message.set_allocated_foo_message(mes); EXPECT_TRUE(message.has_foo_message()); EXPECT_EQ(1, message.foo_message().qux_int()); } TEST_F(OneofTest, Clear) { unittest::TestOneof2 message; message.set_foo_int(1); EXPECT_TRUE(message.has_foo_int()); message.clear_foo_int(); EXPECT_FALSE(message.has_foo_int()); } TEST_F(OneofTest, Defaults) { unittest::TestOneof2 message; EXPECT_FALSE(message.has_foo_int()); EXPECT_EQ(message.foo_int(), 0); EXPECT_FALSE(message.has_foo_string()); EXPECT_EQ(message.foo_string(), ""); EXPECT_FALSE(message.has_foo_bytes()); EXPECT_EQ(message.foo_bytes(), ""); EXPECT_FALSE(message.has_foo_enum()); EXPECT_EQ(message.foo_enum(), 1); EXPECT_FALSE(message.has_foo_message()); EXPECT_EQ(message.foo_message().qux_int(), 0); EXPECT_FALSE(message.has_foogroup()); EXPECT_EQ(message.foogroup().a(), 0); EXPECT_FALSE(message.has_bar_int()); EXPECT_EQ(message.bar_int(), 5); EXPECT_FALSE(message.has_bar_string()); EXPECT_EQ(message.bar_string(), "STRING"); EXPECT_FALSE(message.has_bar_bytes()); EXPECT_EQ(message.bar_bytes(), "BYTES"); EXPECT_FALSE(message.has_bar_enum()); EXPECT_EQ(message.bar_enum(), 2); } TEST_F(OneofTest, SwapWithEmpty) { unittest::TestOneof2 message1, message2; message1.set_foo_string("FOO"); EXPECT_TRUE(message1.has_foo_string()); message1.Swap(&message2); EXPECT_FALSE(message1.has_foo_string()); EXPECT_TRUE(message2.has_foo_string()); EXPECT_EQ(message2.foo_string(), "FOO"); } TEST_F(OneofTest, SwapWithSelf) { unittest::TestOneof2 message; message.set_foo_string("FOO"); EXPECT_TRUE(message.has_foo_string()); message.Swap(&message); EXPECT_TRUE(message.has_foo_string()); EXPECT_EQ(message.foo_string(), "FOO"); } TEST_F(OneofTest, SwapBothHasFields) { unittest::TestOneof2 message1, message2; message1.set_foo_string("FOO"); EXPECT_TRUE(message1.has_foo_string()); message2.mutable_foo_message()->set_qux_int(1); EXPECT_TRUE(message2.has_foo_message()); message1.Swap(&message2); EXPECT_FALSE(message1.has_foo_string()); EXPECT_FALSE(message2.has_foo_message()); EXPECT_TRUE(message1.has_foo_message()); EXPECT_EQ(message1.foo_message().qux_int(), 1); EXPECT_TRUE(message2.has_foo_string()); EXPECT_EQ(message2.foo_string(), "FOO"); } TEST_F(OneofTest, CopyConstructor) { unittest::TestOneof2 message1; message1.set_foo_bytes("FOO"); unittest::TestOneof2 message2(message1); EXPECT_TRUE(message2.has_foo_bytes()); EXPECT_EQ(message2.foo_bytes(), "FOO"); } TEST_F(OneofTest, CopyFrom) { unittest::TestOneof2 message1, message2; message1.set_foo_enum(unittest::TestOneof2::BAR); EXPECT_TRUE(message1.has_foo_enum()); message2.CopyFrom(message1); EXPECT_TRUE(message2.has_foo_enum()); EXPECT_EQ(message2.foo_enum(), unittest::TestOneof2::BAR); // Copying from self should be a no-op. message2.CopyFrom(message2); EXPECT_TRUE(message2.has_foo_enum()); EXPECT_EQ(message2.foo_enum(), unittest::TestOneof2::BAR); } TEST_F(OneofTest, CopyAssignmentOperator) { unittest::TestOneof2 message1; message1.mutable_foo_message()->set_qux_int(123); EXPECT_TRUE(message1.has_foo_message()); unittest::TestOneof2 message2; message2 = message1; EXPECT_EQ(message2.foo_message().qux_int(), 123); // Make sure that self-assignment does something sane. message2 = message2; EXPECT_EQ(message2.foo_message().qux_int(), 123); } TEST_F(OneofTest, UpcastCopyFrom) { // Test the CopyFrom method that takes in the generic const Message& // parameter. unittest::TestOneof2 message1, message2; message1.mutable_foogroup()->set_a(123); EXPECT_TRUE(message1.has_foogroup()); const Message* source = implicit_cast(&message1); message2.CopyFrom(*source); EXPECT_TRUE(message2.has_foogroup()); EXPECT_EQ(message2.foogroup().a(), 123); } // Test the generated SerializeWithCachedSizesToArray(), // This indirectly tests MergePartialFromCodedStream() // We have to test each field type separately because we cannot set them at the // same time TEST_F(OneofTest, SerializationToArray) { // Primitive type { unittest::TestOneof2 message1, message2; string data; message1.set_foo_int(123); int size = message1.ByteSize(); data.resize(size); uint8* start = reinterpret_cast(string_as_array(&data)); uint8* end = message1.SerializeWithCachedSizesToArray(start); EXPECT_EQ(size, end - start); EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foo_int(), 123); } // String { unittest::TestOneof2 message1, message2; string data; message1.set_foo_string("foo"); int size = message1.ByteSize(); data.resize(size); uint8* start = reinterpret_cast(string_as_array(&data)); uint8* end = message1.SerializeWithCachedSizesToArray(start); EXPECT_EQ(size, end - start); EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foo_string(), "foo"); } // Bytes { unittest::TestOneof2 message1, message2; string data; message1.set_foo_bytes("qux"); int size = message1.ByteSize(); data.resize(size); uint8* start = reinterpret_cast(string_as_array(&data)); uint8* end = message1.SerializeWithCachedSizesToArray(start); EXPECT_EQ(size, end - start); EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foo_bytes(), "qux"); } // Enum { unittest::TestOneof2 message1, message2; string data; message1.set_foo_enum(unittest::TestOneof2::FOO); int size = message1.ByteSize(); data.resize(size); uint8* start = reinterpret_cast(string_as_array(&data)); uint8* end = message1.SerializeWithCachedSizesToArray(start); EXPECT_EQ(size, end - start); EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foo_enum(), unittest::TestOneof2::FOO); } // Message { unittest::TestOneof2 message1, message2; string data; message1.mutable_foo_message()->set_qux_int(234); int size = message1.ByteSize(); data.resize(size); uint8* start = reinterpret_cast(string_as_array(&data)); uint8* end = message1.SerializeWithCachedSizesToArray(start); EXPECT_EQ(size, end - start); EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foo_message().qux_int(), 234); } // Group { unittest::TestOneof2 message1, message2; string data; message1.mutable_foogroup()->set_a(345); int size = message1.ByteSize(); data.resize(size); uint8* start = reinterpret_cast(string_as_array(&data)); uint8* end = message1.SerializeWithCachedSizesToArray(start); EXPECT_EQ(size, end - start); EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foogroup().a(), 345); } } // Test the generated SerializeWithCachedSizes() by forcing the buffer to write // one byte at a time. // This indirectly tests MergePartialFromCodedStream() // We have to test each field type separately because we cannot set them at the // same time TEST_F(OneofTest, SerializationToStream) { // Primitive type { unittest::TestOneof2 message1, message2; string data; message1.set_foo_int(123); int size = message1.ByteSize(); data.resize(size); { // Allow the output stream to buffer only one byte at a time. io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); io::CodedOutputStream output_stream(&array_stream); message1.SerializeWithCachedSizes(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); } EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foo_int(), 123); } // String { unittest::TestOneof2 message1, message2; string data; message1.set_foo_string("foo"); int size = message1.ByteSize(); data.resize(size); { // Allow the output stream to buffer only one byte at a time. io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); io::CodedOutputStream output_stream(&array_stream); message1.SerializeWithCachedSizes(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); } EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foo_string(), "foo"); } // Bytes { unittest::TestOneof2 message1, message2; string data; message1.set_foo_bytes("qux"); int size = message1.ByteSize(); data.resize(size); { // Allow the output stream to buffer only one byte at a time. io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); io::CodedOutputStream output_stream(&array_stream); message1.SerializeWithCachedSizes(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); } EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foo_bytes(), "qux"); } // Enum { unittest::TestOneof2 message1, message2; string data; message1.set_foo_enum(unittest::TestOneof2::FOO); int size = message1.ByteSize(); data.resize(size); { // Allow the output stream to buffer only one byte at a time. io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); io::CodedOutputStream output_stream(&array_stream); message1.SerializeWithCachedSizes(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); } EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foo_enum(), unittest::TestOneof2::FOO); } // Message { unittest::TestOneof2 message1, message2; string data; message1.mutable_foo_message()->set_qux_int(234); int size = message1.ByteSize(); data.resize(size); { // Allow the output stream to buffer only one byte at a time. io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); io::CodedOutputStream output_stream(&array_stream); message1.SerializeWithCachedSizes(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); } EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foo_message().qux_int(), 234); } // Group { unittest::TestOneof2 message1, message2; string data; message1.mutable_foogroup()->set_a(345); int size = message1.ByteSize(); data.resize(size); { // Allow the output stream to buffer only one byte at a time. io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); io::CodedOutputStream output_stream(&array_stream); message1.SerializeWithCachedSizes(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); } EXPECT_TRUE(message2.ParseFromString(data)); EXPECT_EQ(message2.foogroup().a(), 345); } } TEST_F(OneofTest, MergeFrom) { unittest::TestOneof2 message1, message2; message1.set_foo_int(123); message2.MergeFrom(message1); TestUtil::ExpectAtMostOneFieldSetInOneof(message2); EXPECT_TRUE(message2.has_foo_int()); EXPECT_EQ(message2.foo_int(), 123); message1.set_foo_string("foo"); message2.MergeFrom(message1); TestUtil::ExpectAtMostOneFieldSetInOneof(message2); EXPECT_TRUE(message2.has_foo_string()); EXPECT_EQ(message2.foo_string(), "foo"); message1.set_foo_bytes("qux"); message2.MergeFrom(message1); TestUtil::ExpectAtMostOneFieldSetInOneof(message2); EXPECT_TRUE(message2.has_foo_bytes()); EXPECT_EQ(message2.foo_bytes(), "qux"); message1.set_foo_enum(unittest::TestOneof2::FOO); message2.MergeFrom(message1); TestUtil::ExpectAtMostOneFieldSetInOneof(message2); EXPECT_TRUE(message2.has_foo_enum()); EXPECT_EQ(message2.foo_enum(), unittest::TestOneof2::FOO); message1.mutable_foo_message()->set_qux_int(234); message2.MergeFrom(message1); TestUtil::ExpectAtMostOneFieldSetInOneof(message2); EXPECT_TRUE(message2.has_foo_message()); EXPECT_EQ(message2.foo_message().qux_int(), 234); message1.mutable_foogroup()->set_a(345); message2.MergeFrom(message1); TestUtil::ExpectAtMostOneFieldSetInOneof(message2); EXPECT_TRUE(message2.has_foogroup()); EXPECT_EQ(message2.foogroup().a(), 345); } TEST(HelpersTest, TestSCC) { protobuf_unittest::TestMutualRecursionA a; SCCAnalyzer scc_analyzer((Options())); const SCC* scc = scc_analyzer.GetSCC(a.GetDescriptor()); std::vector names; for (int i = 0; i < scc->descriptors.size(); i++) { names.push_back(scc->descriptors[i]->full_name()); } ASSERT_EQ(names.size(), 4); std::sort(names.begin(), names.end()); EXPECT_EQ(names[0], "protobuf_unittest.TestMutualRecursionA"); EXPECT_EQ(names[1], "protobuf_unittest.TestMutualRecursionA.SubGroup"); EXPECT_EQ(names[2], "protobuf_unittest.TestMutualRecursionA.SubMessage"); EXPECT_EQ(names[3], "protobuf_unittest.TestMutualRecursionB"); MessageAnalysis result = scc_analyzer.GetSCCAnalysis(scc); EXPECT_EQ(result.is_recursive, true); EXPECT_EQ(result.contains_required, false); EXPECT_EQ(result.contains_cord, true); // TestAllTypes EXPECT_EQ(result.contains_extension, false); // TestAllTypes } TEST(HelpersTest, TestSCCAnalysis) { { protobuf_unittest::TestRecursiveMessage msg; SCCAnalyzer scc_analyzer((Options())); const SCC* scc = scc_analyzer.GetSCC(msg.GetDescriptor()); MessageAnalysis result = scc_analyzer.GetSCCAnalysis(scc); EXPECT_EQ(result.is_recursive, true); EXPECT_EQ(result.contains_required, false); EXPECT_EQ(result.contains_cord, false); EXPECT_EQ(result.contains_extension, false); } { protobuf_unittest::TestAllExtensions msg; SCCAnalyzer scc_analyzer((Options())); const SCC* scc = scc_analyzer.GetSCC(msg.GetDescriptor()); MessageAnalysis result = scc_analyzer.GetSCCAnalysis(scc); EXPECT_EQ(result.is_recursive, false); EXPECT_EQ(result.contains_required, false); EXPECT_EQ(result.contains_cord, false); EXPECT_EQ(result.contains_extension, true); } { protobuf_unittest::TestRequired msg; SCCAnalyzer scc_analyzer((Options())); const SCC* scc = scc_analyzer.GetSCC(msg.GetDescriptor()); MessageAnalysis result = scc_analyzer.GetSCCAnalysis(scc); EXPECT_EQ(result.is_recursive, false); EXPECT_EQ(result.contains_required, true); EXPECT_EQ(result.contains_cord, false); EXPECT_EQ(result.contains_extension, false); } } } // namespace cpp_unittest } // namespace cpp } // namespace compiler namespace no_generic_services_test { // Verify that no class called "TestService" was defined in // unittest_no_generic_services.pb.h by defining a different type by the same // name. If such a service was generated, this will not compile. struct TestService { int i; }; } namespace compiler { namespace cpp { namespace cpp_unittest { TEST_F(GeneratedServiceTest, NoGenericServices) { // Verify that non-services in unittest_no_generic_services.proto were // generated. no_generic_services_test::TestMessage message; message.set_a(1); message.SetExtension(no_generic_services_test::test_extension, 123); no_generic_services_test::TestEnum e = no_generic_services_test::FOO; EXPECT_EQ(e, 1); // Verify that a ServiceDescriptor is generated for the service even if the // class itself is not. const FileDescriptor* file = no_generic_services_test::TestMessage::descriptor()->file(); ASSERT_EQ(1, file->service_count()); EXPECT_EQ("TestService", file->service(0)->name()); ASSERT_EQ(1, file->service(0)->method_count()); EXPECT_EQ("Foo", file->service(0)->method(0)->name()); } #endif // !PROTOBUF_TEST_NO_DESCRIPTORS // =================================================================== // This test must run last. It verifies that descriptors were or were not // initialized depending on whether PROTOBUF_TEST_NO_DESCRIPTORS was defined. // When this is defined, we skip all tests which are expected to trigger // descriptor initialization. This verifies that everything else still works // if descriptors are not initialized. TEST(DescriptorInitializationTest, Initialized) { #ifdef PROTOBUF_TEST_NO_DESCRIPTORS bool should_have_descriptors = false; #else bool should_have_descriptors = true; #endif EXPECT_EQ(should_have_descriptors, DescriptorPool::generated_pool()->InternalIsFileLoaded( "google/protobuf/unittest.proto")); } } // namespace cpp_unittest } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.h000066400000000000000000000047201334102242000325620ustar00rootroot00000000000000// 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 header declares the namespace google::protobuf::protobuf_unittest in order to expose // any problems with the generated class names. We use this header to ensure // unittest.cc will declare the namespace prior to other includes, while obeying // normal include ordering. // // When generating a class name of "foo.Bar" we must ensure we prefix the class // name with "::", in case the namespace google::protobuf::foo exists. We intentionally // trigger that case here by declaring google::protobuf::protobuf_unittest. // // See ClassName in helpers.h for more details. #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_UNITTEST_H__ #define GOOGLE_PROTOBUF_COMPILER_CPP_UNITTEST_H__ namespace google { namespace protobuf { namespace protobuf_unittest {} } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CPP_UNITTEST_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/cpp/metadata_test.cc000066400000000000000000000142501334102242000330150ustar00rootroot00000000000000// 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 #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include namespace google { namespace atu = ::google::protobuf::compiler::annotation_test_util; namespace protobuf { namespace compiler { namespace cpp { namespace { class CppMetadataTest : public ::testing::Test { public: // Tries to capture a FileDescriptorProto, GeneratedCodeInfo, and output // code from the previously added file with name `filename`. Returns true on // success. If pb_h is non-null, expects a .pb.h and a .pb.h.meta (copied to // pb_h and pb_h_info respecfively); similarly for proto_h and proto_h_info. bool CaptureMetadata(const string& filename, FileDescriptorProto* file, string* pb_h, GeneratedCodeInfo* pb_h_info, string* proto_h, GeneratedCodeInfo* proto_h_info, string* pb_cc) { google::protobuf::compiler::CommandLineInterface cli; CppGenerator cpp_generator; cli.RegisterGenerator("--cpp_out", &cpp_generator, ""); string cpp_out = "--cpp_out=annotate_headers=true," "annotation_pragma_name=pragma_name," "annotation_guard_name=guard_name:" + TestTempDir(); const bool result = atu::CaptureMetadata(filename, cpp_out, /* meta_file_suffix */ "", &cli, file, /* outputs */ NULL); if (!result) { return result; } string output_base = TestTempDir() + "/" + StripProto(filename); if (pb_cc != NULL) { GOOGLE_CHECK_OK( File::GetContents(output_base + ".pb.cc", pb_cc, true)); } if (pb_h != NULL && pb_h_info != NULL) { GOOGLE_CHECK_OK( File::GetContents(output_base + ".pb.h", pb_h, true)); if (!atu::DecodeMetadata(output_base + ".pb.h.meta", pb_h_info)) { return false; } } if (proto_h != NULL && proto_h_info != NULL) { GOOGLE_CHECK_OK(File::GetContents(output_base + ".proto.h", proto_h, true)); if (!atu::DecodeMetadata(output_base + ".proto.h.meta", proto_h_info)) { return false; } } return true; } }; const char kSmallTestFile[] = "syntax = \"proto2\";\n" "package foo;\n" "enum Enum { VALUE = 0; }\n" "message Message { }\n"; TEST_F(CppMetadataTest, CapturesEnumNames) { FileDescriptorProto file; GeneratedCodeInfo info; string pb_h; atu::AddFile("test.proto", kSmallTestFile); EXPECT_TRUE( CaptureMetadata("test.proto", &file, &pb_h, &info, NULL, NULL, NULL)); EXPECT_EQ("Enum", file.enum_type(0).name()); std::vector enum_path; enum_path.push_back(FileDescriptorProto::kEnumTypeFieldNumber); enum_path.push_back(0); const GeneratedCodeInfo::Annotation* enum_annotation = atu::FindAnnotationOnPath(info, "test.proto", enum_path); EXPECT_TRUE(NULL != enum_annotation); EXPECT_TRUE(atu::AnnotationMatchesSubstring(pb_h, enum_annotation, "Enum")); } TEST_F(CppMetadataTest, AddsPragma) { FileDescriptorProto file; GeneratedCodeInfo info; string pb_h; atu::AddFile("test.proto", kSmallTestFile); EXPECT_TRUE( CaptureMetadata("test.proto", &file, &pb_h, &info, NULL, NULL, NULL)); EXPECT_TRUE(pb_h.find("#ifdef guard_name") != string::npos); EXPECT_TRUE(pb_h.find("#pragma pragma_name \"test.pb.h.meta\"") != string::npos); } TEST_F(CppMetadataTest, CapturesMessageNames) { FileDescriptorProto file; GeneratedCodeInfo info; string pb_h; atu::AddFile("test.proto", kSmallTestFile); EXPECT_TRUE( CaptureMetadata("test.proto", &file, &pb_h, &info, NULL, NULL, NULL)); EXPECT_EQ("Message", file.message_type(0).name()); std::vector message_path; message_path.push_back(FileDescriptorProto::kMessageTypeFieldNumber); message_path.push_back(0); const GeneratedCodeInfo::Annotation* message_annotation = atu::FindAnnotationOnPath(info, "test.proto", message_path); EXPECT_TRUE(NULL != message_annotation); EXPECT_TRUE( atu::AnnotationMatchesSubstring(pb_h, message_annotation, "Message")); } } // namespace } // namespace cpp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp/000077500000000000000000000000001334102242000303635ustar00rootroot00000000000000csharp_bootstrap_unittest.cc000066400000000000000000000176521334102242000361420ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 test insures that // csharp/src/Google.Protobuf/Reflection/Descriptor.cs match exactly // what would be generated by the protocol compiler. The file is not // generated automatically at build time. // // If this test fails, run the script // "generate_descriptor_proto.sh" and add the changed files under // csharp/src/ to your changelist. #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { namespace { class MockErrorCollector : public MultiFileErrorCollector { public: MockErrorCollector() {} ~MockErrorCollector() {} string text_; // implements ErrorCollector --------------------------------------- void AddError(const string& filename, int line, int column, const string& message) { strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line, column, message); } }; class MockGeneratorContext : public GeneratorContext { public: MockGeneratorContext() {} ~MockGeneratorContext() { STLDeleteValues(&files_); } void ExpectFileMatches(const string& virtual_filename, const string& physical_filename) { string* expected_contents = FindPtrOrNull(files_, virtual_filename); ASSERT_TRUE(expected_contents != NULL) << "Generator failed to generate file: " << virtual_filename; string actual_contents; GOOGLE_CHECK_OK( File::GetContents(TestSourceDir() + "/" + physical_filename, &actual_contents, true)) << "Unable to get " << physical_filename; EXPECT_TRUE(actual_contents == *expected_contents) << physical_filename << " needs to be regenerated. Please run " "generate_descriptor_proto.sh. Then add this file " "to your CL."; } // implements GeneratorContext -------------------------------------- virtual io::ZeroCopyOutputStream* Open(const string& filename) { string** map_slot = &files_[filename]; delete *map_slot; *map_slot = new string; return new io::StringOutputStream(*map_slot); } private: std::map files_; }; class GenerateAndTest { public: GenerateAndTest() {} void Run(const FileDescriptor* proto_file, string file1, string file2) { ASSERT_TRUE(proto_file != NULL) << TestSourceDir(); ASSERT_TRUE(generator_.Generate(proto_file, parameter_, &context_, &error_)); context_.ExpectFileMatches(file1, file2); } void SetParameter(string parameter) { parameter_ = parameter; } private: Generator generator_; MockGeneratorContext context_; string error_; string parameter_; }; TEST(CsharpBootstrapTest, GeneratedCsharpDescriptorMatches) { // Skip this whole test if the csharp directory doesn't exist (i.e., a C++11 // only distribution). string descriptor_file_name = "../csharp/src/Google.Protobuf/Reflection/Descriptor.cs"; if (!File::Exists(TestSourceDir() + "/" + descriptor_file_name)) { return; } MockErrorCollector error_collector; DiskSourceTree source_tree; Importer importer(&source_tree, &error_collector); GenerateAndTest generate_test; generate_test.SetParameter("base_namespace=Google.Protobuf"); source_tree.MapPath("", TestSourceDir()); generate_test.Run(importer.Import("google/protobuf/descriptor.proto"), "Reflection/Descriptor.cs", "../csharp/src/Google.Protobuf/Reflection/Descriptor.cs"); generate_test.Run(importer.Import("google/protobuf/any.proto"), "WellKnownTypes/Any.cs", "../csharp/src/Google.Protobuf/WellKnownTypes/Any.cs"); generate_test.Run(importer.Import("google/protobuf/api.proto"), "WellKnownTypes/Api.cs", "../csharp/src/Google.Protobuf/WellKnownTypes/Api.cs"); generate_test.Run(importer.Import("google/protobuf/duration.proto"), "WellKnownTypes/Duration.cs", "../csharp/src/Google.Protobuf/WellKnownTypes/Duration.cs"); generate_test.Run(importer.Import("google/protobuf/empty.proto"), "WellKnownTypes/Empty.cs", "../csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs"); generate_test.Run(importer.Import("google/protobuf/field_mask.proto"), "WellKnownTypes/FieldMask.cs", "../csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs"); generate_test.Run(importer.Import("google/protobuf/source_context.proto"), "WellKnownTypes/SourceContext.cs", "../csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs"); generate_test.Run(importer.Import("google/protobuf/struct.proto"), "WellKnownTypes/Struct.cs", "../csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs"); generate_test.Run(importer.Import("google/protobuf/timestamp.proto"), "WellKnownTypes/Timestamp.cs", "../csharp/src/Google.Protobuf/WellKnownTypes/Timestamp.cs"); generate_test.Run(importer.Import("google/protobuf/type.proto"), "WellKnownTypes/Type.cs", "../csharp/src/Google.Protobuf/WellKnownTypes/Type.cs"); generate_test.Run(importer.Import("google/protobuf/wrappers.proto"), "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_); } } // namespace } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_doc_comment.cc000066400000000000000000000117071334102242000344500ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { // Functions to create C# XML documentation comments. // Currently this only includes documentation comments containing text specified as comments // in the .proto file; documentation comments generated just from field/message/enum/proto names // is inlined in the relevant code. If more control is required, that code can be moved here. void WriteDocCommentBodyImpl(io::Printer* printer, SourceLocation location) { string comments = location.leading_comments.empty() ? location.trailing_comments : location.leading_comments; if (comments.empty()) { return; } // 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); vector lines = Split(comments, "\n", false /* skip_empty */); // 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("/// \n"); bool last_was_empty = false; // We squash multiple blank lines down to one, and remove any trailing blank lines. We need // to preserve the blank lines themselves, as this is relevant in the markdown. // Note that we can't remove leading or trailing whitespace as *that's* relevant in markdown too. // (We don't skip "just whitespace" lines, either.) for (std::vector::iterator it = lines.begin(); it != lines.end(); ++it) { string line = *it; if (line.empty()) { last_was_empty = true; } else { if (last_was_empty) { printer->Print("///\n"); } last_was_empty = false; printer->Print("///$line$\n", "line", *it); } } printer->Print("/// \n"); } template static void WriteDocCommentBody( io::Printer* printer, const DescriptorType* descriptor) { SourceLocation location; if (descriptor->GetSourceLocation(&location)) { WriteDocCommentBodyImpl(printer, location); } } void WriteMessageDocComment(io::Printer* printer, const Descriptor* message) { WriteDocCommentBody(printer, message); } void WritePropertyDocComment(io::Printer* printer, const FieldDescriptor* field) { WriteDocCommentBody(printer, field); } void WriteEnumDocComment(io::Printer* printer, const EnumDescriptor* enumDescriptor) { WriteDocCommentBody(printer, enumDescriptor); } void WriteEnumValueDocComment(io::Printer* printer, const EnumValueDescriptor* value) { WriteDocCommentBody(printer, value); } void WriteMethodDocComment(io::Printer* printer, const MethodDescriptor* method) { WriteDocCommentBody(printer, method); } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_doc_comment.h000066400000000000000000000047351334102242000343150ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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_CSHARP_DOC_COMMENT_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_DOC_COMMENT_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { void WriteMessageDocComment(io::Printer* printer, const Descriptor* message); void WritePropertyDocComment(io::Printer* printer, const FieldDescriptor* field); void WriteEnumDocComment(io::Printer* printer, const EnumDescriptor* enumDescriptor); void WriteEnumValueDocComment(io::Printer* printer, const EnumValueDescriptor* value); void WriteMethodDocComment(io::Printer* printer, const MethodDescriptor* method); } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_DOC_COMMENT_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_enum.cc000066400000000000000000000104061334102242000331770ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include #include using google::protobuf::internal::scoped_ptr; namespace google { namespace protobuf { namespace compiler { namespace csharp { EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor, const Options* options) : SourceGeneratorBase(descriptor->file(), options), descriptor_(descriptor) { } EnumGenerator::~EnumGenerator() { } void EnumGenerator::Generate(io::Printer* printer) { WriteEnumDocComment(printer, descriptor_); printer->Print("$access_level$ enum $name$ {\n", "access_level", class_access_level(), "name", descriptor_->name()); printer->Indent(); std::set used_names; std::set used_number; for (int i = 0; i < descriptor_->value_count(); i++) { WriteEnumValueDocComment(printer, descriptor_->value(i)); string original_name = descriptor_->value(i)->name(); string name = GetEnumValueName(descriptor_->name(), descriptor_->value(i)->name()); // Make sure we don't get any duplicate names due to prefix removal. while (!used_names.insert(name).second) { // It's possible we'll end up giving this warning multiple times, but that's better than not at all. GOOGLE_LOG(WARNING) << "Duplicate enum value " << name << " (originally " << original_name << ") in " << descriptor_->name() << "; adding underscore to distinguish"; name += "_"; } int number = descriptor_->value(i)->number(); if (!used_number.insert(number).second) { printer->Print("[pbr::OriginalName(\"$original_name$\", PreferredAlias = false)] $name$ = $number$,\n", "original_name", original_name, "name", name, "number", SimpleItoa(number)); } else { printer->Print("[pbr::OriginalName(\"$original_name$\")] $name$ = $number$,\n", "original_name", original_name, "name", name, "number", SimpleItoa(number)); } } printer->Outdent(); printer->Print("}\n"); printer->Print("\n"); } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_enum.h000066400000000000000000000046051334102242000330450ustar00rootroot00000000000000// 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_CSHARP_ENUM_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_ENUM_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { class EnumGenerator : public SourceGeneratorBase { public: EnumGenerator(const EnumDescriptor* descriptor, const Options* options); ~EnumGenerator(); void Generate(io::Printer* printer); private: const EnumDescriptor* descriptor_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_ENUM_H__ csharp_enum_field.cc000066400000000000000000000110571334102242000342660ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { EnumFieldGenerator::EnumFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) : PrimitiveFieldGenerator(descriptor, fieldOrdinal, options) { } EnumFieldGenerator::~EnumFieldGenerator() { } void EnumFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print(variables_, "$name$_ = ($type_name$) input.ReadEnum();\n"); } void EnumFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print(variables_, "if ($has_property_check$) {\n" " output.WriteRawTag($tag_bytes$);\n" " output.WriteEnum((int) $property_name$);\n" "}\n"); } void EnumFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n" " size += $tag_size$ + pb::CodedOutputStream.ComputeEnumSize((int) $property_name$);\n" "}\n"); } void EnumFieldGenerator::GenerateCodecCode(io::Printer* printer) { printer->Print( variables_, "pb::FieldCodec.ForEnum($tag$, x => (int) x, x => ($type_name$) x)"); } EnumOneofFieldGenerator::EnumOneofFieldGenerator( const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) : PrimitiveOneofFieldGenerator(descriptor, fieldOrdinal, options) { } EnumOneofFieldGenerator::~EnumOneofFieldGenerator() { } void EnumOneofFieldGenerator::GenerateMergingCode(io::Printer* printer) { printer->Print(variables_, "$property_name$ = other.$property_name$;\n"); } void EnumOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) { // TODO(jonskeet): What about if we read the default value? printer->Print( variables_, "$oneof_name$_ = input.ReadEnum();\n" "$oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n"); } void EnumOneofFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n" " output.WriteRawTag($tag_bytes$);\n" " output.WriteEnum((int) $property_name$);\n" "}\n"); } void EnumOneofFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n" " size += $tag_size$ + pb::CodedOutputStream.ComputeEnumSize((int) $property_name$);\n" "}\n"); } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_enum_field.h000066400000000000000000000063301334102242000341260ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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_CSHARP_ENUM_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_ENUM_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { class EnumFieldGenerator : public PrimitiveFieldGenerator { public: EnumFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options); ~EnumFieldGenerator(); virtual void GenerateCodecCode(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); virtual void GenerateSerializationCode(io::Printer* printer); virtual void GenerateSerializedSizeCode(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator); }; class EnumOneofFieldGenerator : public PrimitiveOneofFieldGenerator { public: EnumOneofFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options); ~EnumOneofFieldGenerator(); virtual void GenerateMergingCode(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); virtual void GenerateSerializationCode(io::Printer* printer); virtual void GenerateSerializedSizeCode(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumOneofFieldGenerator); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_ENUM_FIELD_H__ csharp_field_base.cc000066400000000000000000000366731334102242000342470ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include using google::protobuf::internal::scoped_ptr; namespace google { namespace protobuf { namespace compiler { namespace csharp { void FieldGeneratorBase::SetCommonFieldVariables( std::map* variables) { // Note: this will be valid even though the tag emitted for packed and unpacked versions of // repeated fields varies by wire format. The wire format is encoded in the bottom 3 bits, which // never effects the tag size. int tag_size = internal::WireFormat::TagSize(descriptor_->number(), descriptor_->type()); uint tag = internal::WireFormat::MakeTag(descriptor_); uint8 tag_array[5]; io::CodedOutputStream::WriteTagToArray(tag, tag_array); string tag_bytes = SimpleItoa(tag_array[0]); for (int i = 1; i < tag_size; i++) { tag_bytes += ", " + SimpleItoa(tag_array[i]); } (*variables)["access_level"] = "public"; (*variables)["tag"] = SimpleItoa(tag); (*variables)["tag_size"] = SimpleItoa(tag_size); (*variables)["tag_bytes"] = tag_bytes; (*variables)["property_name"] = property_name(); (*variables)["type_name"] = type_name(); (*variables)["name"] = name(); (*variables)["descriptor_name"] = descriptor_->name(); (*variables)["default_value"] = default_value(); if (has_default_value()) { (*variables)["name_def_message"] = (*variables)["name"] + "_ = " + (*variables)["default_value"]; } else { (*variables)["name_def_message"] = (*variables)["name"] + "_"; } (*variables)["capitalized_type_name"] = capitalized_type_name(); (*variables)["number"] = number(); (*variables)["has_property_check"] = (*variables)["property_name"] + " != " + (*variables)["default_value"]; (*variables)["other_has_property_check"] = "other." + (*variables)["property_name"] + " != " + (*variables)["default_value"]; } void FieldGeneratorBase::SetCommonOneofFieldVariables( std::map* variables) { (*variables)["oneof_name"] = oneof_name(); (*variables)["has_property_check"] = oneof_name() + "Case_ == " + oneof_property_name() + "OneofCase." + property_name(); (*variables)["oneof_property_name"] = oneof_property_name(); } FieldGeneratorBase::FieldGeneratorBase(const FieldDescriptor* descriptor, int fieldOrdinal, const Options* options) : SourceGeneratorBase(descriptor->file(), options), descriptor_(descriptor), fieldOrdinal_(fieldOrdinal) { SetCommonFieldVariables(&variables_); } FieldGeneratorBase::~FieldGeneratorBase() { } void FieldGeneratorBase::GenerateFreezingCode(io::Printer* printer) { // No-op: only message fields and repeated fields need // special handling for freezing, so default to not generating any code. } void FieldGeneratorBase::GenerateCodecCode(io::Printer* printer) { // No-op: expect this to be overridden by appropriate types. // Could fail if we get called here though... } void FieldGeneratorBase::AddDeprecatedFlag(io::Printer* printer) { if (descriptor_->options().deprecated()) { printer->Print("[global::System.ObsoleteAttribute]\n"); } else if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE && descriptor_->message_type()->options().deprecated()) { printer->Print("[global::System.ObsoleteAttribute]\n"); } } void FieldGeneratorBase::AddPublicMemberAttributes(io::Printer* printer) { AddDeprecatedFlag(printer); WriteGeneratedCodeAttributes(printer); } std::string FieldGeneratorBase::oneof_property_name() { return UnderscoresToCamelCase(descriptor_->containing_oneof()->name(), true); } std::string FieldGeneratorBase::oneof_name() { return UnderscoresToCamelCase(descriptor_->containing_oneof()->name(), false); } std::string FieldGeneratorBase::property_name() { return GetPropertyName(descriptor_); } std::string FieldGeneratorBase::name() { return UnderscoresToCamelCase(GetFieldName(descriptor_), false); } std::string FieldGeneratorBase::type_name() { return type_name(descriptor_); } std::string FieldGeneratorBase::type_name(const FieldDescriptor* descriptor) { switch (descriptor->type()) { case FieldDescriptor::TYPE_ENUM: return GetClassName(descriptor->enum_type()); case FieldDescriptor::TYPE_MESSAGE: case FieldDescriptor::TYPE_GROUP: if (IsWrapperType(descriptor)) { const FieldDescriptor* wrapped_field = descriptor->message_type()->field(0); string wrapped_field_type_name = type_name(wrapped_field); // String and ByteString go to the same type; other wrapped types // go to the nullable equivalent. if (wrapped_field->type() == FieldDescriptor::TYPE_STRING || wrapped_field->type() == FieldDescriptor::TYPE_BYTES) { return wrapped_field_type_name; } else { return wrapped_field_type_name + "?"; } } return GetClassName(descriptor->message_type()); case FieldDescriptor::TYPE_DOUBLE: return "double"; case FieldDescriptor::TYPE_FLOAT: return "float"; case FieldDescriptor::TYPE_INT64: return "long"; case FieldDescriptor::TYPE_UINT64: return "ulong"; case FieldDescriptor::TYPE_INT32: return "int"; case FieldDescriptor::TYPE_FIXED64: return "ulong"; case FieldDescriptor::TYPE_FIXED32: return "uint"; case FieldDescriptor::TYPE_BOOL: return "bool"; case FieldDescriptor::TYPE_STRING: return "string"; case FieldDescriptor::TYPE_BYTES: return "pb::ByteString"; case FieldDescriptor::TYPE_UINT32: return "uint"; case FieldDescriptor::TYPE_SFIXED32: return "int"; case FieldDescriptor::TYPE_SFIXED64: return "long"; case FieldDescriptor::TYPE_SINT32: return "int"; case FieldDescriptor::TYPE_SINT64: return "long"; default: GOOGLE_LOG(FATAL)<< "Unknown field type."; return ""; } } bool FieldGeneratorBase::has_default_value() { switch (descriptor_->type()) { case FieldDescriptor::TYPE_ENUM: case FieldDescriptor::TYPE_MESSAGE: case FieldDescriptor::TYPE_GROUP: return true; case FieldDescriptor::TYPE_DOUBLE: return descriptor_->default_value_double() != 0.0; case FieldDescriptor::TYPE_FLOAT: return descriptor_->default_value_float() != 0.0; case FieldDescriptor::TYPE_INT64: return descriptor_->default_value_int64() != 0L; case FieldDescriptor::TYPE_UINT64: return descriptor_->default_value_uint64() != 0L; case FieldDescriptor::TYPE_INT32: return descriptor_->default_value_int32() != 0; case FieldDescriptor::TYPE_FIXED64: return descriptor_->default_value_uint64() != 0L; case FieldDescriptor::TYPE_FIXED32: return descriptor_->default_value_uint32() != 0; case FieldDescriptor::TYPE_BOOL: return descriptor_->default_value_bool(); case FieldDescriptor::TYPE_STRING: return true; case FieldDescriptor::TYPE_BYTES: return true; case FieldDescriptor::TYPE_UINT32: return descriptor_->default_value_uint32() != 0; case FieldDescriptor::TYPE_SFIXED32: return descriptor_->default_value_int32() != 0; case FieldDescriptor::TYPE_SFIXED64: return descriptor_->default_value_int64() != 0L; case FieldDescriptor::TYPE_SINT32: return descriptor_->default_value_int32() != 0; case FieldDescriptor::TYPE_SINT64: return descriptor_->default_value_int64() != 0L; default: GOOGLE_LOG(FATAL)<< "Unknown field type."; return true; } } bool FieldGeneratorBase::is_nullable_type() { switch (descriptor_->type()) { case FieldDescriptor::TYPE_ENUM: case FieldDescriptor::TYPE_DOUBLE: case FieldDescriptor::TYPE_FLOAT: case FieldDescriptor::TYPE_INT64: case FieldDescriptor::TYPE_UINT64: case FieldDescriptor::TYPE_INT32: case FieldDescriptor::TYPE_FIXED64: case FieldDescriptor::TYPE_FIXED32: case FieldDescriptor::TYPE_BOOL: case FieldDescriptor::TYPE_UINT32: case FieldDescriptor::TYPE_SFIXED32: case FieldDescriptor::TYPE_SFIXED64: case FieldDescriptor::TYPE_SINT32: case FieldDescriptor::TYPE_SINT64: return false; case FieldDescriptor::TYPE_MESSAGE: case FieldDescriptor::TYPE_GROUP: case FieldDescriptor::TYPE_STRING: case FieldDescriptor::TYPE_BYTES: return true; default: GOOGLE_LOG(FATAL)<< "Unknown field type."; return true; } } bool AllPrintableAscii(const std::string& text) { for(int i = 0; i < text.size(); i++) { if (text[i] < 0x20 || text[i] > 0x7e) { return false; } } return true; } std::string FieldGeneratorBase::GetStringDefaultValueInternal() { // No other default values needed for proto3... return "\"\""; } std::string FieldGeneratorBase::GetBytesDefaultValueInternal() { // No other default values needed for proto3... return "pb::ByteString.Empty"; } std::string FieldGeneratorBase::default_value() { return default_value(descriptor_); } std::string FieldGeneratorBase::default_value(const FieldDescriptor* descriptor) { switch (descriptor->type()) { case FieldDescriptor::TYPE_ENUM: // All proto3 enums have a default value of 0, and there's an implicit conversion from the constant 0 to // any C# enum. This means we don't need to work out what we actually mapped the enum value name to. return "0"; case FieldDescriptor::TYPE_MESSAGE: case FieldDescriptor::TYPE_GROUP: if (IsWrapperType(descriptor)) { const FieldDescriptor* wrapped_field = descriptor->message_type()->field(0); return default_value(wrapped_field); } else { return "null"; } case FieldDescriptor::TYPE_DOUBLE: { double value = descriptor->default_value_double(); if (value == std::numeric_limits::infinity()) { return "double.PositiveInfinity"; } else if (value == -std::numeric_limits::infinity()) { return "double.NegativeInfinity"; } else if (MathLimits::IsNaN(value)) { return "double.NaN"; } return SimpleDtoa(value) + "D"; } case FieldDescriptor::TYPE_FLOAT: { float value = descriptor->default_value_float(); if (value == std::numeric_limits::infinity()) { return "float.PositiveInfinity"; } else if (value == -std::numeric_limits::infinity()) { return "float.NegativeInfinity"; } else if (MathLimits::IsNaN(value)) { return "float.NaN"; } return SimpleFtoa(value) + "F"; } case FieldDescriptor::TYPE_INT64: return SimpleItoa(descriptor->default_value_int64()) + "L"; case FieldDescriptor::TYPE_UINT64: return SimpleItoa(descriptor->default_value_uint64()) + "UL"; case FieldDescriptor::TYPE_INT32: return SimpleItoa(descriptor->default_value_int32()); case FieldDescriptor::TYPE_FIXED64: return SimpleItoa(descriptor->default_value_uint64()) + "UL"; case FieldDescriptor::TYPE_FIXED32: return SimpleItoa(descriptor->default_value_uint32()); case FieldDescriptor::TYPE_BOOL: if (descriptor->default_value_bool()) { return "true"; } else { return "false"; } case FieldDescriptor::TYPE_STRING: return GetStringDefaultValueInternal(); case FieldDescriptor::TYPE_BYTES: return GetBytesDefaultValueInternal(); case FieldDescriptor::TYPE_UINT32: return SimpleItoa(descriptor->default_value_uint32()); case FieldDescriptor::TYPE_SFIXED32: return SimpleItoa(descriptor->default_value_int32()); case FieldDescriptor::TYPE_SFIXED64: return SimpleItoa(descriptor->default_value_int64()) + "L"; case FieldDescriptor::TYPE_SINT32: return SimpleItoa(descriptor->default_value_int32()); case FieldDescriptor::TYPE_SINT64: return SimpleItoa(descriptor->default_value_int64()) + "L"; default: GOOGLE_LOG(FATAL)<< "Unknown field type."; return ""; } } std::string FieldGeneratorBase::number() { return SimpleItoa(descriptor_->number()); } std::string FieldGeneratorBase::capitalized_type_name() { switch (descriptor_->type()) { case FieldDescriptor::TYPE_ENUM: return "Enum"; case FieldDescriptor::TYPE_MESSAGE: return "Message"; case FieldDescriptor::TYPE_GROUP: return "Group"; case FieldDescriptor::TYPE_DOUBLE: return "Double"; case FieldDescriptor::TYPE_FLOAT: return "Float"; case FieldDescriptor::TYPE_INT64: return "Int64"; case FieldDescriptor::TYPE_UINT64: return "UInt64"; case FieldDescriptor::TYPE_INT32: return "Int32"; case FieldDescriptor::TYPE_FIXED64: return "Fixed64"; case FieldDescriptor::TYPE_FIXED32: return "Fixed32"; case FieldDescriptor::TYPE_BOOL: return "Bool"; case FieldDescriptor::TYPE_STRING: return "String"; case FieldDescriptor::TYPE_BYTES: return "Bytes"; case FieldDescriptor::TYPE_UINT32: return "UInt32"; case FieldDescriptor::TYPE_SFIXED32: return "SFixed32"; case FieldDescriptor::TYPE_SFIXED64: return "SFixed64"; case FieldDescriptor::TYPE_SINT32: return "SInt32"; case FieldDescriptor::TYPE_SINT64: return "SInt64"; default: GOOGLE_LOG(FATAL)<< "Unknown field type."; return ""; } } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_field_base.h000066400000000000000000000101641334102242000340740ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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_CSHARP_FIELD_BASE_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_FIELD_BASE_H__ #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { class FieldGeneratorBase : public SourceGeneratorBase { public: FieldGeneratorBase(const FieldDescriptor* descriptor, int fieldOrdinal, const Options* options); ~FieldGeneratorBase(); virtual void GenerateCloningCode(io::Printer* printer) = 0; virtual void GenerateFreezingCode(io::Printer* printer); virtual void GenerateCodecCode(io::Printer* printer); virtual void GenerateMembers(io::Printer* printer) = 0; virtual void GenerateMergingCode(io::Printer* printer) = 0; virtual void GenerateParsingCode(io::Printer* printer) = 0; virtual void GenerateSerializationCode(io::Printer* printer) = 0; virtual void GenerateSerializedSizeCode(io::Printer* printer) = 0; virtual void WriteHash(io::Printer* printer) = 0; virtual void WriteEquals(io::Printer* printer) = 0; // Currently unused, as we use reflection to generate JSON virtual void WriteToString(io::Printer* printer) = 0; protected: const FieldDescriptor* descriptor_; const int fieldOrdinal_; std::map variables_; void AddDeprecatedFlag(io::Printer* printer); void AddNullCheck(io::Printer* printer); void AddNullCheck(io::Printer* printer, const std::string& name); void AddPublicMemberAttributes(io::Printer* printer); void SetCommonOneofFieldVariables(std::map* variables); std::string oneof_property_name(); std::string oneof_name(); std::string property_name(); std::string name(); std::string type_name(); std::string type_name(const FieldDescriptor* descriptor); bool has_default_value(); bool is_nullable_type(); std::string default_value(); std::string default_value(const FieldDescriptor* descriptor); std::string number(); std::string capitalized_type_name(); private: void SetCommonFieldVariables(std::map* variables); std::string GetStringDefaultValueInternal(); std::string GetBytesDefaultValueInternal(); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorBase); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_FIELD_BASE_H__ csharp_generator.cc000066400000000000000000000103351334102242000341430ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include #include #include #include #include #include #include #include #include #include using google::protobuf::internal::scoped_ptr; namespace google { namespace protobuf { namespace compiler { namespace csharp { void GenerateFile(const google::protobuf::FileDescriptor* file, io::Printer* printer, const Options* options) { ReflectionClassGenerator reflectionClassGenerator(file, options); reflectionClassGenerator.Generate(printer); } bool Generator::Generate( const FileDescriptor* file, const string& parameter, GeneratorContext* generator_context, string* error) const { vector > options; ParseGeneratorParameter(parameter, &options); // We only support proto3 - but we make an exception for descriptor.proto. if (file->syntax() != FileDescriptor::SYNTAX_PROTO3 && !IsDescriptorProto(file)) { *error = "C# code generation only supports proto3 syntax"; return false; } struct Options cli_options; for (int i = 0; i < options.size(); i++) { if (options[i].first == "file_extension") { cli_options.file_extension = options[i].second; } else if (options[i].first == "base_namespace") { cli_options.base_namespace = options[i].second; cli_options.base_namespace_specified = true; } else if (options[i].first == "internal_access") { cli_options.internal_access = true; } else { *error = "Unknown generator option: " + options[i].first; return false; } } string filename_error = ""; std::string filename = GetOutputFile(file, cli_options.file_extension, cli_options.base_namespace_specified, cli_options.base_namespace, &filename_error); if (filename.empty()) { *error = filename_error; return false; } scoped_ptr output( generator_context->Open(filename)); io::Printer printer(output.get(), '$'); GenerateFile(file, &printer, &cli_options); return true; } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_generator.h000066400000000000000000000051661334102242000340720ustar00rootroot00000000000000// 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. // Generates C# code for a given .proto file. #ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_GENERATOR_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { // 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 LIBPROTOC_EXPORT Generator : public google::protobuf::compiler::CodeGenerator { public: virtual bool Generate( const FileDescriptor* file, const string& parameter, GeneratorContext* generator_context, string* error) const; }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_GENERATOR_H__ csharp_generator_unittest.cc000066400000000000000000000060401334102242000361000ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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. #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { namespace { TEST(CSharpEnumValue, PascalCasedPrefixStripping) { EXPECT_EQ("Bar", GetEnumValueName("Foo", "BAR")); EXPECT_EQ("BarBaz", GetEnumValueName("Foo", "BAR_BAZ")); EXPECT_EQ("Bar", GetEnumValueName("Foo", "FOO_BAR")); EXPECT_EQ("Bar", GetEnumValueName("Foo", "FOO__BAR")); EXPECT_EQ("BarBaz", GetEnumValueName("Foo", "FOO_BAR_BAZ")); EXPECT_EQ("BarBaz", GetEnumValueName("Foo", "Foo_BarBaz")); EXPECT_EQ("Bar", GetEnumValueName("FO_O", "FOO_BAR")); EXPECT_EQ("Bar", GetEnumValueName("FOO", "F_O_O_BAR")); EXPECT_EQ("Bar", GetEnumValueName("Foo", "BAR")); EXPECT_EQ("BarBaz", GetEnumValueName("Foo", "BAR_BAZ")); EXPECT_EQ("Foo", GetEnumValueName("Foo", "FOO")); EXPECT_EQ("Foo", GetEnumValueName("Foo", "FOO___")); // Identifiers can't start with digits EXPECT_EQ("_2Bar", GetEnumValueName("Foo", "FOO_2_BAR")); EXPECT_EQ("_2", GetEnumValueName("Foo", "FOO___2")); } } // namespace } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_helpers.cc000066400000000000000000000451441334102242000337040ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { CSharpType GetCSharpType(FieldDescriptor::Type type) { switch (type) { case FieldDescriptor::TYPE_INT32: return CSHARPTYPE_INT32; case FieldDescriptor::TYPE_INT64: return CSHARPTYPE_INT64; case FieldDescriptor::TYPE_UINT32: return CSHARPTYPE_UINT32; case FieldDescriptor::TYPE_UINT64: return CSHARPTYPE_UINT32; case FieldDescriptor::TYPE_SINT32: return CSHARPTYPE_INT32; case FieldDescriptor::TYPE_SINT64: return CSHARPTYPE_INT64; case FieldDescriptor::TYPE_FIXED32: return CSHARPTYPE_UINT32; case FieldDescriptor::TYPE_FIXED64: return CSHARPTYPE_UINT64; case FieldDescriptor::TYPE_SFIXED32: return CSHARPTYPE_INT32; case FieldDescriptor::TYPE_SFIXED64: return CSHARPTYPE_INT64; case FieldDescriptor::TYPE_FLOAT: return CSHARPTYPE_FLOAT; case FieldDescriptor::TYPE_DOUBLE: return CSHARPTYPE_DOUBLE; case FieldDescriptor::TYPE_BOOL: return CSHARPTYPE_BOOL; case FieldDescriptor::TYPE_ENUM: return CSHARPTYPE_ENUM; case FieldDescriptor::TYPE_STRING: return CSHARPTYPE_STRING; case FieldDescriptor::TYPE_BYTES: return CSHARPTYPE_BYTESTRING; case FieldDescriptor::TYPE_GROUP: return CSHARPTYPE_MESSAGE; case FieldDescriptor::TYPE_MESSAGE: return CSHARPTYPE_MESSAGE; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL)<< "Can't get here."; 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"; } // TODO(jtattermusch): can we reuse a utility function? std::string UnderscoresToCamelCase(const std::string& input, bool cap_next_letter, bool preserve_period) { 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[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: // Previous input character Current character Case // Any Non-alphanumeric Skipped // None - first char of input Alphanumeric Upper // Non-letter (e.g. _ or 1) Alphanumeric Upper // Numeric Alphanumeric Upper // Lower letter Alphanumeric Same as current // Upper letter Alphanumeric Lower std::string ShoutyToPascalCase(const std::string& input) { string result; // Simple way of implementing "always start with upper" char previous = '_'; for (int i = 0; i < input.size(); i++) { char current = input[i]; if (!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)) { result += current; } else { result += ascii_tolower(current); } previous = current; } return result; } // Attempt to remove a prefix from a value, ignoring casing and skipping underscores. // (foo, foo_bar) => bar - underscore after prefix is skipped // (FOO, foo_bar) => bar - casing is ignored // (foo_bar, foobarbaz) => baz - underscore in prefix is ignored // (foobar, foo_barbaz) => baz - underscore in value is ignored // (foo, bar) => bar - prefix isn't matched; return original value std::string TryRemovePrefix(const std::string& prefix, const std::string& value) { // First normalize to a lower-case no-underscores prefix to match against std::string prefix_to_match = ""; for (size_t i = 0; i < prefix.size(); i++) { if (prefix[i] != '_') { prefix_to_match += ascii_tolower(prefix[i]); } } // This keeps track of how much of value we've consumed size_t prefix_index, value_index; for (prefix_index = 0, value_index = 0; prefix_index < prefix_to_match.size() && value_index < value.size(); value_index++) { // Skip over underscores in the value if (value[value_index] == '_') { continue; } if (ascii_tolower(value[value_index]) != prefix_to_match[prefix_index++]) { // Failed to match the prefix - bail out early. return value; } } // If we didn't finish looking through the prefix, we can't strip it. if (prefix_index < prefix_to_match.size()) { return value; } // Step over any underscores after the prefix while (value_index < value.size() && value[value_index] == '_') { value_index++; } // If there's nothing left (e.g. it was a prefix with only underscores afterwards), don't strip. if (value_index == value.size()) { return value; } return value.substr(value_index); } // Format the enum value name in a pleasant way for C#: // - Strip the enum name as a prefix if possible // - Convert to PascalCase. // For example, an enum called Color with a value of COLOR_BLUE should // result in an enum value in C# called just Blue std::string GetEnumValueName(const std::string& enum_name, const std::string& enum_value_name) { std::string stripped = TryRemovePrefix(enum_name, enum_value_name); 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])) { result = "_" + result; } return result; } std::string ToCSharpName(const std::string& name, const FileDescriptor* file) { std::string result = GetFileNamespace(file); if (result != "") { result += '.'; } 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 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. std::string GetFieldName(const FieldDescriptor* descriptor) { if (descriptor->type() == FieldDescriptor::TYPE_GROUP) { return descriptor->message_type()->name(); } else { return descriptor->name(); } } std::string GetFieldConstantName(const FieldDescriptor* field) { return GetPropertyName(field) + "FieldNumber"; } std::string GetPropertyName(const FieldDescriptor* descriptor) { // 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. // There are various ways of ending up with naming collisions, but we try to avoid obvious // ones. if (property_name == descriptor->containing_type()->name() || property_name == "Types" || property_name == "Descriptor") { property_name += "_"; } return property_name; } std::string GetOutputFile( const google::protobuf::FileDescriptor* descriptor, const std::string file_extension, const bool generate_directories, const std::string base_namespace, string* error) { string relative_filename = GetFileNameBase(descriptor) + file_extension; if (!generate_directories) { return relative_filename; } string ns = GetFileNamespace(descriptor); 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. 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); } } 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. int GetFixedSize(FieldDescriptor::Type type) { switch (type) { case FieldDescriptor::TYPE_INT32 : return -1; case FieldDescriptor::TYPE_INT64 : return -1; case FieldDescriptor::TYPE_UINT32 : return -1; case FieldDescriptor::TYPE_UINT64 : return -1; case FieldDescriptor::TYPE_SINT32 : return -1; case FieldDescriptor::TYPE_SINT64 : return -1; case FieldDescriptor::TYPE_FIXED32 : return internal::WireFormatLite::kFixed32Size; case FieldDescriptor::TYPE_FIXED64 : return internal::WireFormatLite::kFixed64Size; case FieldDescriptor::TYPE_SFIXED32: return internal::WireFormatLite::kSFixed32Size; case FieldDescriptor::TYPE_SFIXED64: return internal::WireFormatLite::kSFixed64Size; case FieldDescriptor::TYPE_FLOAT : return internal::WireFormatLite::kFloatSize; case FieldDescriptor::TYPE_DOUBLE : return internal::WireFormatLite::kDoubleSize; case FieldDescriptor::TYPE_BOOL : return internal::WireFormatLite::kBoolSize; case FieldDescriptor::TYPE_ENUM : return -1; case FieldDescriptor::TYPE_STRING : return -1; case FieldDescriptor::TYPE_BYTES : return -1; case FieldDescriptor::TYPE_GROUP : return -1; case FieldDescriptor::TYPE_MESSAGE : return -1; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return -1; } static const char base64_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; std::string StringToBase64(const std::string& input) { std::string result; size_t remaining = input.size(); const unsigned char *src = (const unsigned char*) input.c_str(); while (remaining > 2) { result += base64_chars[src[0] >> 2]; result += base64_chars[((src[0] & 0x3) << 4) | (src[1] >> 4)]; result += base64_chars[((src[1] & 0xf) << 2) | (src[2] >> 6)]; result += base64_chars[src[2] & 0x3f]; remaining -= 3; src += 3; } switch (remaining) { case 2: result += base64_chars[src[0] >> 2]; result += base64_chars[((src[0] & 0x3) << 4) | (src[1] >> 4)]; result += base64_chars[(src[1] & 0xf) << 2]; result += '='; src += 2; break; case 1: result += base64_chars[src[0] >> 2]; result += base64_chars[((src[0] & 0x3) << 4)]; result += '='; result += '='; src += 1; break; } return result; } std::string FileDescriptorToBase64(const FileDescriptor* descriptor) { std::string fdp_bytes; FileDescriptorProto fdp; descriptor->CopyTo(&fdp); fdp.SerializeToString(&fdp_bytes); return StringToBase64(fdp_bytes); } FieldGeneratorBase* CreateFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options* options) { switch (descriptor->type()) { case FieldDescriptor::TYPE_GROUP: case FieldDescriptor::TYPE_MESSAGE: if (descriptor->is_repeated()) { if (descriptor->is_map()) { return new MapFieldGenerator(descriptor, fieldOrdinal, options); } else { return new RepeatedMessageFieldGenerator(descriptor, fieldOrdinal, options); } } else { if (IsWrapperType(descriptor)) { if (descriptor->containing_oneof()) { return new WrapperOneofFieldGenerator(descriptor, fieldOrdinal, options); } else { return new WrapperFieldGenerator(descriptor, fieldOrdinal, options); } } else { if (descriptor->containing_oneof()) { return new MessageOneofFieldGenerator(descriptor, fieldOrdinal, options); } else { return new MessageFieldGenerator(descriptor, fieldOrdinal, options); } } } case FieldDescriptor::TYPE_ENUM: if (descriptor->is_repeated()) { return new RepeatedEnumFieldGenerator(descriptor, fieldOrdinal, options); } else { if (descriptor->containing_oneof()) { return new EnumOneofFieldGenerator(descriptor, fieldOrdinal, options); } else { return new EnumFieldGenerator(descriptor, fieldOrdinal, options); } } default: if (descriptor->is_repeated()) { return new RepeatedPrimitiveFieldGenerator(descriptor, fieldOrdinal, options); } else { if (descriptor->containing_oneof()) { return new PrimitiveOneofFieldGenerator(descriptor, fieldOrdinal, options); } else { return new PrimitiveFieldGenerator(descriptor, fieldOrdinal, options); } } } } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_helpers.h000066400000000000000000000134141334102242000335410ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_HELPERS_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_HELPERS_H__ #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { struct Options; class FieldGeneratorBase; // TODO: start using this enum. enum CSharpType { CSHARPTYPE_INT32 = 1, CSHARPTYPE_INT64 = 2, CSHARPTYPE_UINT32 = 3, CSHARPTYPE_UINT64 = 4, CSHARPTYPE_FLOAT = 5, CSHARPTYPE_DOUBLE = 6, CSHARPTYPE_BOOL = 7, CSHARPTYPE_STRING = 8, CSHARPTYPE_BYTESTRING = 9, CSHARPTYPE_MESSAGE = 10, CSHARPTYPE_ENUM = 11, MAX_CSHARPTYPE = 11 }; // 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); std::string GetClassName(const EnumDescriptor* descriptor); std::string GetFieldName(const FieldDescriptor* descriptor); std::string GetFieldConstantName(const FieldDescriptor* field); std::string GetPropertyName(const FieldDescriptor* descriptor); 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 LIBPROTOBUF_EXPORT GetEnumValueName(const std::string& enum_name, const std::string& enum_value_name); // TODO(jtattermusch): perhaps we could move this to strutil std::string StringToBase64(const std::string& input); std::string FileDescriptorToBase64(const FileDescriptor* descriptor); FieldGeneratorBase* CreateFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options* options); // Determines whether the given message is a map entry message, // i.e. one implicitly created by protoc due to a map field. inline bool IsMapEntryMessage(const Descriptor* descriptor) { return descriptor->options().map_entry(); } // Determines whether we're generating code for the proto representation of // descriptors etc, for use in the runtime. This is the only type which is // allowed to use proto2 syntax, and it generates internal classes. inline bool IsDescriptorProto(const FileDescriptor* descriptor) { return descriptor->name() == "google/protobuf/descriptor.proto"; } // Determines whether the given message is an options message within descriptor.proto. inline bool IsDescriptorOptionMessage(const Descriptor* descriptor) { if (!IsDescriptorProto(descriptor->file())) { return false; } const string name = descriptor->full_name(); return name == "google.protobuf.FileOptions" || name == "google.protobuf.MessageOptions" || name == "google.protobuf.FieldOptions" || name == "google.protobuf.OneofOptions" || name == "google.protobuf.EnumOptions" || name == "google.protobuf.EnumValueOptions" || name == "google.protobuf.ServiceOptions" || name == "google.protobuf.MethodOptions"; } inline bool IsWrapperType(const FieldDescriptor* descriptor) { return descriptor->type() == FieldDescriptor::TYPE_MESSAGE && descriptor->message_type()->file()->name() == "google/protobuf/wrappers.proto"; } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_HELPERS_H__ csharp_map_field.cc000066400000000000000000000124201334102242000340720ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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. #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { MapFieldGenerator::MapFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options* options) : FieldGeneratorBase(descriptor, fieldOrdinal, options) { } MapFieldGenerator::~MapFieldGenerator() { } void MapFieldGenerator::GenerateMembers(io::Printer* printer) { const FieldDescriptor* key_descriptor = descriptor_->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor_->message_type()->FindFieldByName("value"); variables_["key_type_name"] = type_name(key_descriptor); variables_["value_type_name"] = type_name(value_descriptor); scoped_ptr key_generator( CreateFieldGenerator(key_descriptor, 1, this->options())); scoped_ptr value_generator( CreateFieldGenerator(value_descriptor, 2, this->options())); printer->Print( variables_, "private static readonly pbc::MapField<$key_type_name$, $value_type_name$>.Codec _map_$name$_codec\n" " = new pbc::MapField<$key_type_name$, $value_type_name$>.Codec("); key_generator->GenerateCodecCode(printer); printer->Print(", "); value_generator->GenerateCodecCode(printer); printer->Print( variables_, ", $tag$);\n" "private readonly pbc::MapField<$key_type_name$, $value_type_name$> $name$_ = new pbc::MapField<$key_type_name$, $value_type_name$>();\n"); WritePropertyDocComment(printer, descriptor_); AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ pbc::MapField<$key_type_name$, $value_type_name$> $property_name$ {\n" " get { return $name$_; }\n" "}\n"); } void MapFieldGenerator::GenerateMergingCode(io::Printer* printer) { printer->Print( variables_, "$name$_.Add(other.$name$_);\n"); } void MapFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print( variables_, "$name$_.AddEntriesFrom(input, _map_$name$_codec);\n"); } void MapFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print( variables_, "$name$_.WriteTo(output, _map_$name$_codec);\n"); } void MapFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { printer->Print( variables_, "size += $name$_.CalculateSize(_map_$name$_codec);\n"); } void MapFieldGenerator::WriteHash(io::Printer* printer) { printer->Print( variables_, "hash ^= $property_name$.GetHashCode();\n"); } void MapFieldGenerator::WriteEquals(io::Printer* printer) { printer->Print( variables_, "if (!$property_name$.Equals(other.$property_name$)) return false;\n"); } void MapFieldGenerator::WriteToString(io::Printer* printer) { // TODO: If we ever actually use ToString, we'll need to impleme this... } void MapFieldGenerator::GenerateCloningCode(io::Printer* printer) { printer->Print(variables_, "$name$_ = other.$name$_.Clone();\n"); } void MapFieldGenerator::GenerateFreezingCode(io::Printer* printer) { } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_map_field.h000066400000000000000000000056751334102242000340310ustar00rootroot00000000000000// 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_CSHARP_MAP_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_MAP_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { class MapFieldGenerator : public FieldGeneratorBase { public: MapFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options* options); ~MapFieldGenerator(); virtual void GenerateCloningCode(io::Printer* printer); virtual void GenerateFreezingCode(io::Printer* printer); virtual void GenerateMembers(io::Printer* printer); virtual void GenerateMergingCode(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); virtual void GenerateSerializationCode(io::Printer* printer); virtual void GenerateSerializedSizeCode(io::Printer* printer); virtual void WriteHash(io::Printer* printer); virtual void WriteEquals(io::Printer* printer); virtual void WriteToString(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapFieldGenerator); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_MAP_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_message.cc000066400000000000000000000502531334102242000336630ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using google::protobuf::internal::scoped_ptr; namespace google { namespace protobuf { namespace compiler { namespace csharp { bool CompareFieldNumbers(const FieldDescriptor* d1, const FieldDescriptor* d2) { return d1->number() < d2->number(); } MessageGenerator::MessageGenerator(const Descriptor* descriptor, const Options* options) : SourceGeneratorBase(descriptor->file(), options), descriptor_(descriptor) { // sorted field names for (int i = 0; i < descriptor_->field_count(); i++) { field_names_.push_back(descriptor_->field(i)->name()); } std::sort(field_names_.begin(), field_names_.end()); // fields by number for (int i = 0; i < descriptor_->field_count(); i++) { fields_by_number_.push_back(descriptor_->field(i)); } std::sort(fields_by_number_.begin(), fields_by_number_.end(), CompareFieldNumbers); } MessageGenerator::~MessageGenerator() { } std::string MessageGenerator::class_name() { return descriptor_->name(); } std::string MessageGenerator::full_class_name() { return GetClassName(descriptor_); } const std::vector& MessageGenerator::field_names() { return field_names_; } const std::vector& MessageGenerator::fields_by_number() { return fields_by_number_; } void MessageGenerator::AddDeprecatedFlag(io::Printer* printer) { if (descriptor_->options().deprecated()) { printer->Print("[global::System.ObsoleteAttribute]\n"); } } void MessageGenerator::Generate(io::Printer* printer) { std::map vars; vars["class_name"] = class_name(); vars["access_level"] = class_access_level(); WriteMessageDocComment(printer, descriptor_); AddDeprecatedFlag(printer); printer->Print( vars, "$access_level$ sealed partial class $class_name$ : pb::IMessage<$class_name$> {\n"); printer->Indent(); // All static fields and properties printer->Print( vars, "private static readonly pb::MessageParser<$class_name$> _parser = new pb::MessageParser<$class_name$>(() => new $class_name$());\n"); printer->Print( "private pb::UnknownFieldSet _unknownFields;\n"); WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public static pb::MessageParser<$class_name$> Parser { get { return _parser; } }\n\n"); // 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[" + SimpleItoa(descriptor_->index()) + "]"; } else { vars["descriptor_accessor"] = GetClassName(descriptor_->containing_type()) + ".Descriptor.NestedTypes[" + SimpleItoa(descriptor_->index()) + "]"; } WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public static pbr::MessageDescriptor Descriptor {\n" " get { return $descriptor_accessor$; }\n" "}\n" "\n"); WriteGeneratedCodeAttributes(printer); printer->Print( vars, "pbr::MessageDescriptor pb::IMessage.Descriptor {\n" " get { return Descriptor; }\n" "}\n" "\n"); // CustomOptions property, only for options messages if (IsDescriptorOptionMessage(descriptor_)) { printer->Print( "internal CustomOptions CustomOptions{ get; private set; } = CustomOptions.Empty;\n" "\n"); } // Parameterless constructor and partial OnConstruction method. WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public $class_name$() {\n" " OnConstruction();\n" "}\n\n" "partial void OnConstruction();\n\n"); GenerateCloningCode(printer); GenerateFreezingCode(printer); // Fields/properties for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* fieldDescriptor = descriptor_->field(i); // Rats: we lose the debug comment here :( printer->Print( "/// Field number for the \"$field_name$\" field.\n" "public const int $field_constant_name$ = $index$;\n", "field_name", fieldDescriptor->name(), "field_constant_name", GetFieldConstantName(fieldDescriptor), "index", SimpleItoa(fieldDescriptor->number())); scoped_ptr generator( CreateFieldGeneratorInternal(fieldDescriptor)); generator->GenerateMembers(printer); printer->Print("\n"); } // oneof properties for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { vars["name"] = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false); vars["property_name"] = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true); vars["original_name"] = descriptor_->oneof_decl(i)->name(); printer->Print( vars, "private object $name$_;\n" "/// Enum of possible cases for the \"$original_name$\" oneof.\n" "public enum $property_name$OneofCase {\n"); printer->Indent(); printer->Print("None = 0,\n"); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); printer->Print("$field_property_name$ = $index$,\n", "field_property_name", GetPropertyName(field), "index", SimpleItoa(field->number())); } printer->Outdent(); printer->Print("}\n"); // TODO: Should we put the oneof .proto comments here? // It's unclear exactly where they should go. printer->Print( vars, "private $property_name$OneofCase $name$Case_ = $property_name$OneofCase.None;\n"); WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public $property_name$OneofCase $property_name$Case {\n" " get { return $name$Case_; }\n" "}\n\n"); WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public void Clear$property_name$() {\n" " $name$Case_ = $property_name$OneofCase.None;\n" " $name$_ = null;\n" "}\n\n"); } // Standard methods GenerateFrameworkMethods(printer); GenerateMessageSerializationMethods(printer); GenerateMergingMethods(printer); // Nested messages and enums if (HasNestedGeneratedTypes()) { printer->Print( vars, "#region Nested types\n" "/// Container for nested types declared in the $class_name$ message type.\n"); WriteGeneratedCodeAttributes(printer); printer->Print("public static partial class Types {\n"); printer->Indent(); for (int i = 0; i < descriptor_->enum_type_count(); i++) { EnumGenerator enumGenerator(descriptor_->enum_type(i), this->options()); enumGenerator.Generate(printer); } for (int i = 0; i < descriptor_->nested_type_count(); i++) { // Don't generate nested types for maps... if (!IsMapEntryMessage(descriptor_->nested_type(i))) { MessageGenerator messageGenerator( descriptor_->nested_type(i), this->options()); messageGenerator.Generate(printer); } } printer->Outdent(); printer->Print("}\n" "#endregion\n" "\n"); } printer->Outdent(); printer->Print("}\n"); printer->Print("\n"); } // Helper to work out whether we need to generate a class to hold nested types/enums. // Only tricky because we don't want to generate map entry types. bool MessageGenerator::HasNestedGeneratedTypes() { if (descriptor_->enum_type_count() > 0) { return true; } for (int i = 0; i < descriptor_->nested_type_count(); i++) { if (!IsMapEntryMessage(descriptor_->nested_type(i))) { return true; } } return false; } void MessageGenerator::GenerateCloningCode(io::Printer* printer) { std::map vars; WriteGeneratedCodeAttributes(printer); vars["class_name"] = class_name(); printer->Print( vars, "public $class_name$($class_name$ other) : this() {\n"); printer->Indent(); // Clone non-oneof fields first for (int i = 0; i < descriptor_->field_count(); i++) { if (!descriptor_->field(i)->containing_oneof()) { scoped_ptr generator( CreateFieldGeneratorInternal(descriptor_->field(i))); generator->GenerateCloningCode(printer); } } // Clone just the right field for each oneof for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) { vars["name"] = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false); vars["property_name"] = UnderscoresToCamelCase( descriptor_->oneof_decl(i)->name(), true); printer->Print(vars, "switch (other.$property_name$Case) {\n"); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); scoped_ptr generator(CreateFieldGeneratorInternal(field)); vars["field_property_name"] = GetPropertyName(field); printer->Print( vars, "case $property_name$OneofCase.$field_property_name$:\n"); printer->Indent(); generator->GenerateCloningCode(printer); printer->Print("break;\n"); printer->Outdent(); } printer->Outdent(); printer->Print("}\n\n"); } // Clone unknown fields printer->Print( "_unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);\n"); printer->Outdent(); printer->Print("}\n\n"); WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public $class_name$ Clone() {\n" " return new $class_name$(this);\n" "}\n\n"); } void MessageGenerator::GenerateFreezingCode(io::Printer* printer) { } void MessageGenerator::GenerateFrameworkMethods(io::Printer* printer) { std::map vars; vars["class_name"] = class_name(); // Equality WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public override bool Equals(object other) {\n" " return Equals(other as $class_name$);\n" "}\n\n"); WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public bool Equals($class_name$ other) {\n" " if (ReferenceEquals(other, null)) {\n" " return false;\n" " }\n" " if (ReferenceEquals(other, this)) {\n" " return true;\n" " }\n"); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { scoped_ptr generator( CreateFieldGeneratorInternal(descriptor_->field(i))); generator->WriteEquals(printer); } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print("if ($property_name$Case != other.$property_name$Case) return false;\n", "property_name", UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true)); } printer->Outdent(); printer->Print( " return Equals(_unknownFields, other._unknownFields);\n" "}\n\n"); // GetHashCode // Start with a non-zero value to easily distinguish between null and "empty" messages. WriteGeneratedCodeAttributes(printer); printer->Print( "public override int GetHashCode() {\n" " int hash = 1;\n"); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { scoped_ptr generator( CreateFieldGeneratorInternal(descriptor_->field(i))); generator->WriteHash(printer); } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print("hash ^= (int) $name$Case_;\n", "name", UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false)); } printer->Print( "if (_unknownFields != null) {\n" " hash ^= _unknownFields.GetHashCode();\n" "}\n" "return hash;\n"); printer->Outdent(); printer->Print("}\n\n"); WriteGeneratedCodeAttributes(printer); printer->Print( "public override string ToString() {\n" " return pb::JsonFormatter.ToDiagnosticString(this);\n" "}\n\n"); } void MessageGenerator::GenerateMessageSerializationMethods(io::Printer* printer) { WriteGeneratedCodeAttributes(printer); printer->Print( "public void WriteTo(pb::CodedOutputStream output) {\n"); printer->Indent(); // Serialize all the fields for (int i = 0; i < fields_by_number().size(); i++) { scoped_ptr generator( CreateFieldGeneratorInternal(fields_by_number()[i])); generator->GenerateSerializationCode(printer); } // Serialize unknown fields printer->Print( "if (_unknownFields != null) {\n" " _unknownFields.WriteTo(output);\n" "}\n"); // TODO(jonskeet): Memoize size of frozen messages? printer->Outdent(); printer->Print( "}\n" "\n"); WriteGeneratedCodeAttributes(printer); printer->Print( "public int CalculateSize() {\n"); printer->Indent(); printer->Print("int size = 0;\n"); for (int i = 0; i < descriptor_->field_count(); i++) { scoped_ptr generator( CreateFieldGeneratorInternal(descriptor_->field(i))); generator->GenerateSerializedSizeCode(printer); } printer->Print( "if (_unknownFields != null) {\n" " size += _unknownFields.CalculateSize();\n" "}\n"); printer->Print("return size;\n"); printer->Outdent(); printer->Print("}\n\n"); } void MessageGenerator::GenerateMergingMethods(io::Printer* printer) { // Note: These are separate from GenerateMessageSerializationMethods() // because they need to be generated even for messages that are optimized // for code size. std::map vars; vars["class_name"] = class_name(); WriteGeneratedCodeAttributes(printer); printer->Print( vars, "public void MergeFrom($class_name$ other) {\n"); printer->Indent(); printer->Print( "if (other == null) {\n" " return;\n" "}\n"); // Merge non-oneof fields for (int i = 0; i < descriptor_->field_count(); i++) { if (!descriptor_->field(i)->containing_oneof()) { scoped_ptr generator( CreateFieldGeneratorInternal(descriptor_->field(i))); generator->GenerateMergingCode(printer); } } // Merge oneof fields for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) { vars["name"] = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), false); vars["property_name"] = UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true); printer->Print(vars, "switch (other.$property_name$Case) {\n"); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); vars["field_property_name"] = GetPropertyName(field); printer->Print( vars, "case $property_name$OneofCase.$field_property_name$:\n"); printer->Indent(); scoped_ptr generator(CreateFieldGeneratorInternal(field)); generator->GenerateMergingCode(printer); printer->Print("break;\n"); printer->Outdent(); } printer->Outdent(); printer->Print("}\n\n"); } // Merge unknown fields. printer->Print( "_unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);\n"); printer->Outdent(); printer->Print("}\n\n"); WriteGeneratedCodeAttributes(printer); printer->Print("public void MergeFrom(pb::CodedInputStream input) {\n"); printer->Indent(); printer->Print( "uint tag;\n" "while ((tag = input.ReadTag()) != 0) {\n" " switch(tag) {\n"); printer->Indent(); printer->Indent(); // Option messages need to store unknown fields so that options can be parsed later. if (IsDescriptorOptionMessage(descriptor_)) { printer->Print( "default:\n" " CustomOptions = CustomOptions.ReadOrSkipUnknownField(input);\n" " break;\n"); } else { printer->Print( "default:\n" " _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);\n" " break;\n"); } for (int i = 0; i < fields_by_number().size(); i++) { const FieldDescriptor* field = fields_by_number()[i]; internal::WireFormatLite::WireType wt = internal::WireFormat::WireTypeForFieldType(field->type()); uint32 tag = internal::WireFormatLite::MakeTag(field->number(), wt); // Handle both packed and unpacked repeated fields with the same Read*Array call; // the two generated cases are the packed and unpacked tags. // TODO(jonskeet): Check that is_packable is equivalent to // is_repeated && wt in { VARINT, FIXED32, FIXED64 }. // It looks like it is... if (field->is_packable()) { printer->Print( "case $packed_tag$:\n", "packed_tag", SimpleItoa( internal::WireFormatLite::MakeTag( field->number(), internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED))); } printer->Print("case $tag$: {\n", "tag", SimpleItoa(tag)); printer->Indent(); scoped_ptr generator( CreateFieldGeneratorInternal(field)); generator->GenerateParsingCode(printer); printer->Print("break;\n"); printer->Outdent(); printer->Print("}\n"); } printer->Outdent(); printer->Print("}\n"); // switch printer->Outdent(); printer->Print("}\n"); // while printer->Outdent(); printer->Print("}\n\n"); // method } int MessageGenerator::GetFieldOrdinal(const FieldDescriptor* descriptor) { for (int i = 0; i < field_names().size(); i++) { if (field_names()[i] == descriptor->name()) { return i; } } GOOGLE_LOG(DFATAL)<< "Could not find ordinal for field " << descriptor->name(); return -1; } FieldGeneratorBase* MessageGenerator::CreateFieldGeneratorInternal( const FieldDescriptor* descriptor) { return CreateFieldGenerator(descriptor, GetFieldOrdinal(descriptor), this->options()); } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_message.h000066400000000000000000000065401334102242000335250ustar00rootroot00000000000000// 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_CSHARP_MESSAGE_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_MESSAGE_H__ #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { class FieldGeneratorBase; class MessageGenerator : public SourceGeneratorBase { public: MessageGenerator(const Descriptor* descriptor, const Options* options); ~MessageGenerator(); void GenerateCloningCode(io::Printer* printer); void GenerateFreezingCode(io::Printer* printer); void GenerateFrameworkMethods(io::Printer* printer); void Generate(io::Printer* printer); private: const Descriptor* descriptor_; std::vector field_names_; std::vector fields_by_number_; void GenerateMessageSerializationMethods(io::Printer* printer); void GenerateMergingMethods(io::Printer* printer); int GetFieldOrdinal(const FieldDescriptor* descriptor); FieldGeneratorBase* CreateFieldGeneratorInternal( const FieldDescriptor* descriptor); bool HasNestedGeneratedTypes(); void AddDeprecatedFlag(io::Printer* printer); std::string class_name(); std::string full_class_name(); // field names sorted alphabetically const std::vector& field_names(); // field descriptors sorted by number const std::vector& fields_by_number(); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_MESSAGE_H__ csharp_message_field.cc000066400000000000000000000163771334102242000347600ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { MessageFieldGenerator::MessageFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) : FieldGeneratorBase(descriptor, fieldOrdinal, options) { variables_["has_property_check"] = name() + "_ != null"; variables_["has_not_property_check"] = name() + "_ == null"; } MessageFieldGenerator::~MessageFieldGenerator() { } void MessageFieldGenerator::GenerateMembers(io::Printer* printer) { printer->Print( variables_, "private $type_name$ $name$_;\n"); WritePropertyDocComment(printer, descriptor_); AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n" " get { return $name$_; }\n" " set {\n" " $name$_ = value;\n" " }\n" "}\n"); } void MessageFieldGenerator::GenerateMergingCode(io::Printer* printer) { printer->Print( variables_, "if (other.$has_property_check$) {\n" " if ($has_not_property_check$) {\n" " $name$_ = new $type_name$();\n" " }\n" " $property_name$.MergeFrom(other.$property_name$);\n" "}\n"); } void MessageFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print( variables_, "if ($has_not_property_check$) {\n" " $name$_ = new $type_name$();\n" "}\n" // TODO(jonskeet): Do we really need merging behaviour like this? "input.ReadMessage($name$_);\n"); // No need to support TYPE_GROUP... } void MessageFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n" " output.WriteRawTag($tag_bytes$);\n" " output.WriteMessage($property_name$);\n" "}\n"); } void MessageFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n" " size += $tag_size$ + pb::CodedOutputStream.ComputeMessageSize($property_name$);\n" "}\n"); } void MessageFieldGenerator::WriteHash(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) hash ^= $property_name$.GetHashCode();\n"); } void MessageFieldGenerator::WriteEquals(io::Printer* printer) { printer->Print( variables_, "if (!object.Equals($property_name$, other.$property_name$)) return false;\n"); } void MessageFieldGenerator::WriteToString(io::Printer* printer) { variables_["field_name"] = GetFieldName(descriptor_); printer->Print( variables_, "PrintField(\"$field_name$\", has$property_name$, $name$_, writer);\n"); } void MessageFieldGenerator::GenerateCloningCode(io::Printer* printer) { printer->Print(variables_, "$property_name$ = other.$has_property_check$ ? other.$property_name$.Clone() : null;\n"); } void MessageFieldGenerator::GenerateFreezingCode(io::Printer* printer) { } void MessageFieldGenerator::GenerateCodecCode(io::Printer* printer) { printer->Print( variables_, "pb::FieldCodec.ForMessage($tag$, $type_name$.Parser)"); } MessageOneofFieldGenerator::MessageOneofFieldGenerator( const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) : MessageFieldGenerator(descriptor, fieldOrdinal, options) { SetCommonOneofFieldVariables(&variables_); } MessageOneofFieldGenerator::~MessageOneofFieldGenerator() { } void MessageOneofFieldGenerator::GenerateMembers(io::Printer* printer) { WritePropertyDocComment(printer, descriptor_); AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n" " get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : null; }\n" " set {\n" " $oneof_name$_ = value;\n" " $oneof_name$Case_ = value == null ? $oneof_property_name$OneofCase.None : $oneof_property_name$OneofCase.$property_name$;\n" " }\n" "}\n"); } void MessageOneofFieldGenerator::GenerateMergingCode(io::Printer* printer) { printer->Print(variables_, "if ($property_name$ == null) {\n" " $property_name$ = new $type_name$();\n" "}\n" "$property_name$.MergeFrom(other.$property_name$);\n"); } void MessageOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) { // TODO(jonskeet): We may be able to do better than this printer->Print( variables_, "$type_name$ subBuilder = new $type_name$();\n" "if ($has_property_check$) {\n" " subBuilder.MergeFrom($property_name$);\n" "}\n" "input.ReadMessage(subBuilder);\n" // No support of TYPE_GROUP "$property_name$ = subBuilder;\n"); } void MessageOneofFieldGenerator::WriteToString(io::Printer* printer) { printer->Print( variables_, "PrintField(\"$descriptor_name$\", $has_property_check$, $oneof_name$_, writer);\n"); } void MessageOneofFieldGenerator::GenerateCloningCode(io::Printer* printer) { printer->Print(variables_, "$property_name$ = other.$property_name$.Clone();\n"); } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_message_field.h000066400000000000000000000072231334102242000346100ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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_CSHARP_MESSAGE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_MESSAGE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { class MessageFieldGenerator : public FieldGeneratorBase { public: MessageFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options); ~MessageFieldGenerator(); virtual void GenerateCodecCode(io::Printer* printer); virtual void GenerateCloningCode(io::Printer* printer); virtual void GenerateFreezingCode(io::Printer* printer); virtual void GenerateMembers(io::Printer* printer); virtual void GenerateMergingCode(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); virtual void GenerateSerializationCode(io::Printer* printer); virtual void GenerateSerializedSizeCode(io::Printer* printer); virtual void WriteHash(io::Printer* printer); virtual void WriteEquals(io::Printer* printer); virtual void WriteToString(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator); }; class MessageOneofFieldGenerator : public MessageFieldGenerator { public: MessageOneofFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options); ~MessageOneofFieldGenerator(); virtual void GenerateCloningCode(io::Printer* printer); virtual void GenerateMembers(io::Printer* printer); virtual void GenerateMergingCode(io::Printer* printer); virtual void WriteToString(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageOneofFieldGenerator); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_MESSAGE_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_names.h000066400000000000000000000075141334102242000332060ustar00rootroot00000000000000// 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. // // Provides a mechanism for mapping a descriptor to the // fully-qualified name of the corresponding C# class. #ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_NAMES_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_NAMES_H__ #include #include namespace google { namespace protobuf { class Descriptor; class EnumDescriptor; class FileDescriptor; class ServiceDescriptor; namespace compiler { namespace csharp { // Requires: // descriptor != NULL // // Returns: // The namespace to use for given file descriptor. string LIBPROTOC_EXPORT GetFileNamespace(const FileDescriptor* descriptor); // Requires: // descriptor != NULL // // Returns: // The fully-qualified C# class name. string LIBPROTOC_EXPORT GetClassName(const Descriptor* 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. string LIBPROTOC_EXPORT GetReflectionClassName(const FileDescriptor* descriptor); // Generates output file name for given file descriptor. If generate_directories // is true, the output file will be put under directory corresponding to file's // namespace. base_namespace can be used to strip some of the top level // directories. E.g. for file with namespace "Bar.Foo" and base_namespace="Bar", // the resulting file will be put under directory "Foo" (and not "Bar/Foo"). // // Requires: // descriptor != NULL // error != NULL // // Returns: // The file name to use as output file for given file descriptor. In case // of failure, this function will return empty string and error parameter // will contain the error message. string LIBPROTOC_EXPORT GetOutputFile( const google::protobuf::FileDescriptor* descriptor, const string file_extension, const bool generate_directories, const string base_namespace, string* error); } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_NAMES_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp/csharp_options.h000066400000000000000000000066041334102242000335750ustar00rootroot00000000000000// 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_CSHARP_OPTIONS_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_OPTIONS_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { // Generator options (used by csharp_generator.cc): struct Options { Options() : file_extension(".cs"), base_namespace(""), base_namespace_specified(false), internal_access(false) { } // Extension of the generated file. Defaults to ".cs" string file_extension; // Base namespace to use to create directory hierarchy. Defaults to "". // This option allows the simple creation of a conventional C# file layout, // where directories are created relative to a project-specific base // namespace. For example, in a project with a base namespace of PetShop, a // proto of user.proto with a C# namespace of PetShop.Model.Shared would // generate Model/Shared/User.cs underneath the specified --csharp_out // directory. // // If no base namespace is specified, all files are generated in the // --csharp_out directory, with no subdirectories created automatically. string base_namespace; // Whether the base namespace has been explicitly specified by the user. // This is required as the base namespace can be explicitly set to the empty // string, meaning "create a full directory hierarchy, starting from the first // segment of the namespace." bool base_namespace_specified; // Whether the generated classes should have accessibility level of "internal". // Defaults to false that generates "public" classes. bool internal_access; }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_OPTIONS_H__ csharp_primitive_field.cc000066400000000000000000000213001334102242000353220ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { PrimitiveFieldGenerator::PrimitiveFieldGenerator( const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) : FieldGeneratorBase(descriptor, fieldOrdinal, options) { // TODO(jonskeet): Make this cleaner... is_value_type = descriptor->type() != FieldDescriptor::TYPE_STRING && descriptor->type() != FieldDescriptor::TYPE_BYTES; if (!is_value_type) { variables_["has_property_check"] = variables_["property_name"] + ".Length != 0"; variables_["other_has_property_check"] = "other." + variables_["property_name"] + ".Length != 0"; } } PrimitiveFieldGenerator::~PrimitiveFieldGenerator() { } void PrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) { // TODO(jonskeet): Work out whether we want to prevent the fields from ever being // null, or whether we just handle it, in the cases of bytes and string. // (Basically, should null-handling code be in the getter or the setter?) printer->Print( variables_, "private $type_name$ $name_def_message$;\n"); WritePropertyDocComment(printer, descriptor_); AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n" " get { return $name$_; }\n" " set {\n"); if (is_value_type) { printer->Print( variables_, " $name$_ = value;\n"); } else { printer->Print( variables_, " $name$_ = pb::ProtoPreconditions.CheckNotNull(value, \"value\");\n"); } printer->Print( " }\n" "}\n"); } void PrimitiveFieldGenerator::GenerateMergingCode(io::Printer* printer) { printer->Print( variables_, "if ($other_has_property_check$) {\n" " $property_name$ = other.$property_name$;\n" "}\n"); } void PrimitiveFieldGenerator::GenerateParsingCode(io::Printer* printer) { // Note: invoke the property setter rather than writing straight to the field, // so that we can normalize "null to empty" for strings and bytes. printer->Print( variables_, "$property_name$ = input.Read$capitalized_type_name$();\n"); } void PrimitiveFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n" " output.WriteRawTag($tag_bytes$);\n" " output.Write$capitalized_type_name$($property_name$);\n" "}\n"); } void PrimitiveFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n"); printer->Indent(); int fixedSize = GetFixedSize(descriptor_->type()); if (fixedSize == -1) { printer->Print( variables_, "size += $tag_size$ + pb::CodedOutputStream.Compute$capitalized_type_name$Size($property_name$);\n"); } else { printer->Print( "size += $tag_size$ + $fixed_size$;\n", "fixed_size", SimpleItoa(fixedSize), "tag_size", variables_["tag_size"]); } printer->Outdent(); printer->Print("}\n"); } void PrimitiveFieldGenerator::WriteHash(io::Printer* printer) { const char *text = "if ($has_property_check$) hash ^= $property_name$.GetHashCode();\n"; if (descriptor_->type() == FieldDescriptor::TYPE_FLOAT) { text = "if ($has_property_check$) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode($property_name$);\n"; } else if (descriptor_->type() == FieldDescriptor::TYPE_DOUBLE) { text = "if ($has_property_check$) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode($property_name$);\n"; } printer->Print(variables_, text); } void PrimitiveFieldGenerator::WriteEquals(io::Printer* printer) { const char *text = "if ($property_name$ != other.$property_name$) return false;\n"; if (descriptor_->type() == FieldDescriptor::TYPE_FLOAT) { text = "if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals($property_name$, other.$property_name$)) return false;\n"; } else if (descriptor_->type() == FieldDescriptor::TYPE_DOUBLE) { text = "if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals($property_name$, other.$property_name$)) return false;\n"; } printer->Print(variables_, text); } void PrimitiveFieldGenerator::WriteToString(io::Printer* printer) { printer->Print( variables_, "PrintField(\"$descriptor_name$\", $has_property_check$, $property_name$, writer);\n"); } void PrimitiveFieldGenerator::GenerateCloningCode(io::Printer* printer) { printer->Print(variables_, "$name$_ = other.$name$_;\n"); } void PrimitiveFieldGenerator::GenerateCodecCode(io::Printer* printer) { printer->Print( variables_, "pb::FieldCodec.For$capitalized_type_name$($tag$)"); } PrimitiveOneofFieldGenerator::PrimitiveOneofFieldGenerator( const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) : PrimitiveFieldGenerator(descriptor, fieldOrdinal, options) { SetCommonOneofFieldVariables(&variables_); } PrimitiveOneofFieldGenerator::~PrimitiveOneofFieldGenerator() { } void PrimitiveOneofFieldGenerator::GenerateMembers(io::Printer* printer) { WritePropertyDocComment(printer, descriptor_); AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n" " get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : $default_value$; }\n" " set {\n"); if (is_value_type) { printer->Print( variables_, " $oneof_name$_ = value;\n"); } else { printer->Print( variables_, " $oneof_name$_ = pb::ProtoPreconditions.CheckNotNull(value, \"value\");\n"); } printer->Print( variables_, " $oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n" " }\n" "}\n"); } void PrimitiveOneofFieldGenerator::GenerateMergingCode(io::Printer* printer) { printer->Print(variables_, "$property_name$ = other.$property_name$;\n"); } void PrimitiveOneofFieldGenerator::WriteToString(io::Printer* printer) { printer->Print(variables_, "PrintField(\"$descriptor_name$\", $has_property_check$, $oneof_name$_, writer);\n"); } void PrimitiveOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print( variables_, "$property_name$ = input.Read$capitalized_type_name$();\n"); } void PrimitiveOneofFieldGenerator::GenerateCloningCode(io::Printer* printer) { printer->Print(variables_, "$property_name$ = other.$property_name$;\n"); } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_primitive_field.h000066400000000000000000000072541334102242000352000ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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_CSHARP_PRIMITIVE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_PRIMITIVE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { struct Options; class PrimitiveFieldGenerator : public FieldGeneratorBase { public: PrimitiveFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options); ~PrimitiveFieldGenerator(); virtual void GenerateCodecCode(io::Printer* printer); virtual void GenerateCloningCode(io::Printer* printer); virtual void GenerateMembers(io::Printer* printer); virtual void GenerateMergingCode(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); virtual void GenerateSerializationCode(io::Printer* printer); virtual void GenerateSerializedSizeCode(io::Printer* printer); virtual void WriteHash(io::Printer* printer); virtual void WriteEquals(io::Printer* printer); virtual void WriteToString(io::Printer* printer); protected: bool is_value_type; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator); }; class PrimitiveOneofFieldGenerator : public PrimitiveFieldGenerator { public: PrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options); ~PrimitiveOneofFieldGenerator(); virtual void GenerateCloningCode(io::Printer* printer); virtual void GenerateMembers(io::Printer* printer); virtual void GenerateMergingCode(io::Printer* printer); virtual void WriteToString(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveOneofFieldGenerator); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_PRIMITIVE_FIELD_H__ csharp_reflection_class.cc000066400000000000000000000256131334102242000355010ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { ReflectionClassGenerator::ReflectionClassGenerator(const FileDescriptor* file, const Options* options) : SourceGeneratorBase(file, options), file_(file) { namespace_ = GetFileNamespace(file); reflectionClassname_ = GetReflectionClassUnqualifiedName(file); } ReflectionClassGenerator::~ReflectionClassGenerator() { } void ReflectionClassGenerator::Generate(io::Printer* printer) { WriteIntroduction(printer); WriteDescriptor(printer); // Close the class declaration. printer->Outdent(); printer->Print("}\n"); // write children: Enums if (file_->enum_type_count() > 0) { printer->Print("#region Enums\n"); for (int i = 0; i < file_->enum_type_count(); i++) { EnumGenerator enumGenerator(file_->enum_type(i), this->options()); enumGenerator.Generate(printer); } printer->Print("#endregion\n"); printer->Print("\n"); } // write children: Messages if (file_->message_type_count() > 0) { printer->Print("#region Messages\n"); for (int i = 0; i < file_->message_type_count(); i++) { MessageGenerator messageGenerator(file_->message_type(i), this->options()); messageGenerator.Generate(printer); } printer->Print("#endregion\n"); printer->Print("\n"); } // TODO(jtattermusch): add insertion point for services. if (!namespace_.empty()) { printer->Outdent(); printer->Print("}\n"); } printer->Print("\n"); printer->Print("#endregion Designer generated code\n"); } void ReflectionClassGenerator::WriteIntroduction(io::Printer* printer) { printer->Print( "// \n" "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" "// source: $file_name$\n" "// \n" "#pragma warning disable 1591, 0612, 3021\n" "#region Designer generated code\n" "\n" "using pb = global::Google.Protobuf;\n" "using pbc = global::Google.Protobuf.Collections;\n" "using pbr = global::Google.Protobuf.Reflection;\n" "using scg = global::System.Collections.Generic;\n", "file_name", file_->name()); if (!namespace_.empty()) { printer->Print("namespace $namespace$ {\n", "namespace", namespace_); printer->Indent(); printer->Print("\n"); } printer->Print( "/// Holder for reflection information generated from $file_name$\n" "$access_level$ static partial class $reflection_class_name$ {\n" "\n", "file_name", file_->name(), "access_level", class_access_level(), "reflection_class_name", reflectionClassname_); printer->Indent(); } void ReflectionClassGenerator::WriteDescriptor(io::Printer* printer) { printer->Print( "#region Descriptor\n" "/// File descriptor for $file_name$\n" "public static pbr::FileDescriptor Descriptor {\n" " get { return descriptor; }\n" "}\n" "private static pbr::FileDescriptor descriptor;\n" "\n" "static $reflection_class_name$() {\n", "file_name", file_->name(), "reflection_class_name", reflectionClassname_); printer->Indent(); printer->Print( "byte[] descriptorData = global::System.Convert.FromBase64String(\n"); printer->Indent(); printer->Indent(); printer->Print("string.Concat(\n"); printer->Indent(); // TODO(jonskeet): Consider a C#-escaping format here instead of just Base64. std::string base64 = FileDescriptorToBase64(file_); while (base64.size() > 60) { printer->Print("\"$base64$\",\n", "base64", base64.substr(0, 60)); base64 = base64.substr(60); } printer->Print("\"$base64$\"));\n", "base64", base64); printer->Outdent(); printer->Outdent(); printer->Outdent(); // ----------------------------------------------------------------- // Invoke InternalBuildGeneratedFileFrom() to build the file. printer->Print( "descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,\n"); printer->Print(" new pbr::FileDescriptor[] { "); for (int i = 0; i < file_->dependency_count(); i++) { // descriptor.proto is special: we don't allow access to the generated code, but there's // a separately-exposed property to get at the file descriptor, specifically to allow this // kind of dependency. if (IsDescriptorProto(file_->dependency(i))) { printer->Print("pbr::FileDescriptor.DescriptorProtoFileDescriptor, "); } else { printer->Print( "$full_reflection_class_name$.Descriptor, ", "full_reflection_class_name", GetReflectionClassName(file_->dependency(i))); } } printer->Print("},\n" " new pbr::GeneratedClrTypeInfo("); // Specify all the generated code information, recursively. if (file_->enum_type_count() > 0) { printer->Print("new[] {"); for (int i = 0; i < file_->enum_type_count(); i++) { printer->Print("typeof($type_name$), ", "type_name", GetClassName(file_->enum_type(i))); } printer->Print("}, "); } else { printer->Print("null, "); } if (file_->message_type_count() > 0) { printer->Print("new pbr::GeneratedClrTypeInfo[] {\n"); printer->Indent(); printer->Indent(); printer->Indent(); for (int i = 0; i < file_->message_type_count(); i++) { WriteGeneratedCodeInfo(file_->message_type(i), printer, i == file_->message_type_count() - 1); } printer->Outdent(); printer->Print("\n}));\n"); printer->Outdent(); printer->Outdent(); } else { printer->Print("null));\n"); } printer->Outdent(); printer->Print("}\n"); printer->Print("#endregion\n\n"); } // Write out the generated code for a particular message. This consists of the CLR type, property names // corresponding to fields, names corresponding to oneofs, nested enums, and nested types. Each array part // can be specified as null if it would be empty, to make the generated code somewhat simpler to read. // We write a line break at the end of each generated code info, so that in the final file we'll see all // the types, pre-ordered depth first, one per line. The indentation will be slightly unusual, // in that it will look like a single array when it's actually constructing a tree, but it'll be easy to // read even with multiple levels of nesting. // The "last" parameter indicates whether this message descriptor is the last one being printed in this immediate // context. It governs whether or not a trailing comma and newline is written after the constructor, effectively // just controlling the formatting in the generated code. void ReflectionClassGenerator::WriteGeneratedCodeInfo(const Descriptor* descriptor, io::Printer* printer, bool last) { if (IsMapEntryMessage(descriptor)) { printer->Print("null, "); return; } // Generated message type printer->Print("new pbr::GeneratedClrTypeInfo(typeof($type_name$), $type_name$.Parser, ", "type_name", GetClassName(descriptor)); // Fields if (descriptor->field_count() > 0) { std::vector fields; for (int i = 0; i < descriptor->field_count(); i++) { fields.push_back(GetPropertyName(descriptor->field(i))); } printer->Print("new[]{ \"$fields$\" }, ", "fields", JoinStrings(fields, "\", \"")); } else { printer->Print("null, "); } // Oneofs if (descriptor->oneof_decl_count() > 0) { std::vector oneofs; 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", JoinStrings(oneofs, "\", \"")); } else { printer->Print("null, "); } // Nested enums if (descriptor->enum_type_count() > 0) { std::vector enums; for (int i = 0; i < descriptor->enum_type_count(); i++) { enums.push_back(GetClassName(descriptor->enum_type(i))); } printer->Print("new[]{ typeof($enums$) }, ", "enums", JoinStrings(enums, "), typeof(")); } else { printer->Print("null, "); } // Nested types if (descriptor->nested_type_count() > 0) { // Need to specify array type explicitly here, as all elements may be null. printer->Print("new pbr::GeneratedClrTypeInfo[] { "); for (int i = 0; i < descriptor->nested_type_count(); i++) { WriteGeneratedCodeInfo(descriptor->nested_type(i), printer, i == descriptor->nested_type_count() - 1); } printer->Print("}"); } else { printer->Print("null"); } printer->Print(last ? ")" : "),\n"); } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_reflection_class.h000066400000000000000000000054001334102242000353330ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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_CSHARP_REFLECTION_CLASS_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_REFLECTION_CLASS_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { class ReflectionClassGenerator : public SourceGeneratorBase { public: ReflectionClassGenerator(const FileDescriptor* file, const Options* options); ~ReflectionClassGenerator(); void Generate(io::Printer* printer); private: const FileDescriptor* file_; std::string namespace_; std::string reflectionClassname_; void WriteIntroduction(io::Printer* printer); void WriteDescriptor(io::Printer* printer); void WriteGeneratedCodeInfo(const Descriptor* descriptor, io::Printer* printer, bool last); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionClassGenerator); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_REFLECTION_CLASS_H__ csharp_repeated_enum_field.cc000066400000000000000000000111231334102242000361310ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { RepeatedEnumFieldGenerator::RepeatedEnumFieldGenerator( const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) : FieldGeneratorBase(descriptor, fieldOrdinal, options) { } RepeatedEnumFieldGenerator::~RepeatedEnumFieldGenerator() { } void RepeatedEnumFieldGenerator::GenerateMembers(io::Printer* printer) { printer->Print( variables_, "private static readonly pb::FieldCodec<$type_name$> _repeated_$name$_codec\n" " = pb::FieldCodec.ForEnum($tag$, x => (int) x, x => ($type_name$) x);\n"); printer->Print(variables_, "private readonly pbc::RepeatedField<$type_name$> $name$_ = new pbc::RepeatedField<$type_name$>();\n"); WritePropertyDocComment(printer, descriptor_); AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ pbc::RepeatedField<$type_name$> $property_name$ {\n" " get { return $name$_; }\n" "}\n"); } void RepeatedEnumFieldGenerator::GenerateMergingCode(io::Printer* printer) { printer->Print( variables_, "$name$_.Add(other.$name$_);\n"); } void RepeatedEnumFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print( variables_, "$name$_.AddEntriesFrom(input, _repeated_$name$_codec);\n"); } void RepeatedEnumFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print( variables_, "$name$_.WriteTo(output, _repeated_$name$_codec);\n"); } void RepeatedEnumFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { printer->Print( variables_, "size += $name$_.CalculateSize(_repeated_$name$_codec);\n"); } void RepeatedEnumFieldGenerator::WriteHash(io::Printer* printer) { printer->Print( variables_, "hash ^= $name$_.GetHashCode();\n"); } void RepeatedEnumFieldGenerator::WriteEquals(io::Printer* printer) { printer->Print( variables_, "if(!$name$_.Equals(other.$name$_)) return false;\n"); } void RepeatedEnumFieldGenerator::WriteToString(io::Printer* printer) { printer->Print(variables_, "PrintField(\"$descriptor_name$\", $name$_, writer);\n"); } void RepeatedEnumFieldGenerator::GenerateCloningCode(io::Printer* printer) { printer->Print(variables_, "$name$_ = other.$name$_.Clone();\n"); } void RepeatedEnumFieldGenerator::GenerateFreezingCode(io::Printer* printer) { } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_repeated_enum_field.h000066400000000000000000000062541334102242000360040ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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_CSHARP_REPEATED_ENUM_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_ENUM_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { // TODO(jonskeet): Refactor repeated field support; all the implementations are *really* similar. We // should probably have a RepeatedFieldGeneratorBase. class RepeatedEnumFieldGenerator : public FieldGeneratorBase { public: RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options); ~RepeatedEnumFieldGenerator(); virtual void GenerateCloningCode(io::Printer* printer); virtual void GenerateFreezingCode(io::Printer* printer); virtual void GenerateMembers(io::Printer* printer); virtual void GenerateMergingCode(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); virtual void GenerateSerializationCode(io::Printer* printer); virtual void GenerateSerializedSizeCode(io::Printer* printer); virtual void WriteHash(io::Printer* printer); virtual void WriteEquals(io::Printer* printer); virtual void WriteToString(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_ENUM_FIELD_H__ csharp_repeated_message_field.cc000066400000000000000000000125151334102242000366170ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { RepeatedMessageFieldGenerator::RepeatedMessageFieldGenerator( const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) : FieldGeneratorBase(descriptor, fieldOrdinal, options) { } RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() { } void RepeatedMessageFieldGenerator::GenerateMembers(io::Printer* printer) { printer->Print( variables_, "private static readonly pb::FieldCodec<$type_name$> _repeated_$name$_codec\n" " = "); // Don't want to duplicate the codec code here... maybe we should have a // "create single field generator for this repeated field" // function, but it doesn't seem worth it for just this. if (IsWrapperType(descriptor_)) { scoped_ptr single_generator( new WrapperFieldGenerator(descriptor_, fieldOrdinal_, this->options())); single_generator->GenerateCodecCode(printer); } else { scoped_ptr single_generator( new MessageFieldGenerator(descriptor_, fieldOrdinal_, this->options())); single_generator->GenerateCodecCode(printer); } printer->Print(";\n"); printer->Print( variables_, "private readonly pbc::RepeatedField<$type_name$> $name$_ = new pbc::RepeatedField<$type_name$>();\n"); WritePropertyDocComment(printer, descriptor_); AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ pbc::RepeatedField<$type_name$> $property_name$ {\n" " get { return $name$_; }\n" "}\n"); } void RepeatedMessageFieldGenerator::GenerateMergingCode(io::Printer* printer) { printer->Print( variables_, "$name$_.Add(other.$name$_);\n"); } void RepeatedMessageFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print( variables_, "$name$_.AddEntriesFrom(input, _repeated_$name$_codec);\n"); } void RepeatedMessageFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print( variables_, "$name$_.WriteTo(output, _repeated_$name$_codec);\n"); } void RepeatedMessageFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { printer->Print( variables_, "size += $name$_.CalculateSize(_repeated_$name$_codec);\n"); } void RepeatedMessageFieldGenerator::WriteHash(io::Printer* printer) { printer->Print( variables_, "hash ^= $name$_.GetHashCode();\n"); } void RepeatedMessageFieldGenerator::WriteEquals(io::Printer* printer) { printer->Print( variables_, "if(!$name$_.Equals(other.$name$_)) return false;\n"); } void RepeatedMessageFieldGenerator::WriteToString(io::Printer* printer) { variables_["field_name"] = GetFieldName(descriptor_); printer->Print( variables_, "PrintField(\"$field_name$\", $name$_, writer);\n"); } void RepeatedMessageFieldGenerator::GenerateCloningCode(io::Printer* printer) { printer->Print(variables_, "$name$_ = other.$name$_.Clone();\n"); } void RepeatedMessageFieldGenerator::GenerateFreezingCode(io::Printer* printer) { } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_repeated_message_field.h000066400000000000000000000060751334102242000364650ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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_CSHARP_REPEATED_MESSAGE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_MESSAGE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { struct Options; class RepeatedMessageFieldGenerator : public FieldGeneratorBase { public: RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options); ~RepeatedMessageFieldGenerator(); virtual void GenerateCloningCode(io::Printer* printer); virtual void GenerateFreezingCode(io::Printer* printer); virtual void GenerateMembers(io::Printer* printer); virtual void GenerateMergingCode(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); virtual void GenerateSerializationCode(io::Printer* printer); virtual void GenerateSerializedSizeCode(io::Printer* printer); virtual void WriteHash(io::Printer* printer); virtual void WriteEquals(io::Printer* printer); virtual void WriteToString(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_MESSAGE_FIELD_H__ csharp_repeated_primitive_field.cc000066400000000000000000000112111334102242000371730ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { RepeatedPrimitiveFieldGenerator::RepeatedPrimitiveFieldGenerator( const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) : FieldGeneratorBase(descriptor, fieldOrdinal, options) { } RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() { } void RepeatedPrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) { printer->Print( variables_, "private static readonly pb::FieldCodec<$type_name$> _repeated_$name$_codec\n" " = pb::FieldCodec.For$capitalized_type_name$($tag$);\n"); printer->Print(variables_, "private readonly pbc::RepeatedField<$type_name$> $name$_ = new pbc::RepeatedField<$type_name$>();\n"); WritePropertyDocComment(printer, descriptor_); AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ pbc::RepeatedField<$type_name$> $property_name$ {\n" " get { return $name$_; }\n" "}\n"); } void RepeatedPrimitiveFieldGenerator::GenerateMergingCode(io::Printer* printer) { printer->Print( variables_, "$name$_.Add(other.$name$_);\n"); } void RepeatedPrimitiveFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print( variables_, "$name$_.AddEntriesFrom(input, _repeated_$name$_codec);\n"); } void RepeatedPrimitiveFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print( variables_, "$name$_.WriteTo(output, _repeated_$name$_codec);\n"); } void RepeatedPrimitiveFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { printer->Print( variables_, "size += $name$_.CalculateSize(_repeated_$name$_codec);\n"); } void RepeatedPrimitiveFieldGenerator::WriteHash(io::Printer* printer) { printer->Print( variables_, "hash ^= $name$_.GetHashCode();\n"); } void RepeatedPrimitiveFieldGenerator::WriteEquals(io::Printer* printer) { printer->Print( variables_, "if(!$name$_.Equals(other.$name$_)) return false;\n"); } void RepeatedPrimitiveFieldGenerator::WriteToString(io::Printer* printer) { printer->Print(variables_, "PrintField(\"$descriptor_name$\", $name$_, writer);\n"); } void RepeatedPrimitiveFieldGenerator::GenerateCloningCode(io::Printer* printer) { printer->Print(variables_, "$name$_ = other.$name$_.Clone();\n"); } void RepeatedPrimitiveFieldGenerator::GenerateFreezingCode(io::Printer* printer) { } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_repeated_primitive_field.h000066400000000000000000000057721334102242000370540ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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_CSHARP_REPEATED_PRIMITIVE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_PRIMITIVE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { class RepeatedPrimitiveFieldGenerator : public FieldGeneratorBase { public: RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options); ~RepeatedPrimitiveFieldGenerator(); virtual void GenerateCloningCode(io::Printer* printer); virtual void GenerateFreezingCode(io::Printer* printer); virtual void GenerateMembers(io::Printer* printer); virtual void GenerateMergingCode(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); virtual void GenerateSerializationCode(io::Printer* printer); virtual void GenerateSerializedSizeCode(io::Printer* printer); virtual void WriteHash(io::Printer* printer); virtual void WriteEquals(io::Printer* printer); virtual void WriteToString(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_REPEATED_PRIMITIVE_FIELD_H__ csharp_source_generator_base.cc000066400000000000000000000057211334102242000365200ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { SourceGeneratorBase::SourceGeneratorBase(const FileDescriptor* descriptor, const Options *options) : descriptor_(descriptor), options_(options) { } SourceGeneratorBase::~SourceGeneratorBase() { } void SourceGeneratorBase::WriteGeneratedCodeAttributes(io::Printer* printer) { printer->Print("[global::System.Diagnostics.DebuggerNonUserCodeAttribute]\n"); } std::string SourceGeneratorBase::class_access_level() { return (IsDescriptorProto(descriptor_) || this->options()->internal_access) ? "internal" : "public"; } const Options* SourceGeneratorBase::options() { return this->options_; } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_source_generator_base.h000066400000000000000000000052001334102242000363520ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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_CSHARP_SOURCE_GENERATOR_BASE_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_SOURCE_GENERATOR_BASE_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { struct Options; class SourceGeneratorBase { protected: SourceGeneratorBase(const FileDescriptor* descriptor, const Options* options); virtual ~SourceGeneratorBase(); std::string class_access_level(); const Options* options(); // Write any attributes used to decorate generated function members (methods and properties). // Should not be used to decorate types. void WriteGeneratedCodeAttributes(io::Printer* printer); private: const FileDescriptor* descriptor_; const Options *options_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SourceGeneratorBase); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_SOURCE_GENERATOR_BASE_H__ csharp_wrapper_field.cc000066400000000000000000000210771334102242000350050ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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 #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { WrapperFieldGenerator::WrapperFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) : FieldGeneratorBase(descriptor, fieldOrdinal, options) { variables_["has_property_check"] = name() + "_ != null"; variables_["has_not_property_check"] = name() + "_ == null"; const FieldDescriptor* wrapped_field = descriptor->message_type()->field(0); is_value_type = wrapped_field->type() != FieldDescriptor::TYPE_STRING && wrapped_field->type() != FieldDescriptor::TYPE_BYTES; if (is_value_type) { variables_["nonnullable_type_name"] = type_name(wrapped_field); } } WrapperFieldGenerator::~WrapperFieldGenerator() { } void WrapperFieldGenerator::GenerateMembers(io::Printer* printer) { printer->Print( variables_, "private static readonly pb::FieldCodec<$type_name$> _single_$name$_codec = "); GenerateCodecCode(printer); printer->Print( variables_, ";\n" "private $type_name$ $name$_;\n"); WritePropertyDocComment(printer, descriptor_); AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n" " get { return $name$_; }\n" " set {\n" " $name$_ = value;\n" " }\n" "}\n"); } void WrapperFieldGenerator::GenerateMergingCode(io::Printer* printer) { printer->Print( variables_, "if (other.$has_property_check$) {\n" " if ($has_not_property_check$ || other.$property_name$ != $default_value$) {\n" " $property_name$ = other.$property_name$;\n" " }\n" "}\n"); } void WrapperFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print( variables_, "$type_name$ value = _single_$name$_codec.Read(input);\n" "if ($has_not_property_check$ || value != $default_value$) {\n" " $property_name$ = value;\n" "}\n"); } void WrapperFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n" " _single_$name$_codec.WriteTagAndValue(output, $property_name$);\n" "}\n"); } void WrapperFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n" " size += _single_$name$_codec.CalculateSizeWithTag($property_name$);\n" "}\n"); } void WrapperFieldGenerator::WriteHash(io::Printer* printer) { const char *text = "if ($has_property_check$) hash ^= $property_name$.GetHashCode();\n"; if (descriptor_->message_type()->field(0)->type() == FieldDescriptor::TYPE_FLOAT) { text = "if ($has_property_check$) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.GetHashCode($property_name$);\n"; } else if (descriptor_->message_type()->field(0)->type() == FieldDescriptor::TYPE_DOUBLE) { text = "if ($has_property_check$) hash ^= pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.GetHashCode($property_name$);\n"; } printer->Print(variables_, text); } void WrapperFieldGenerator::WriteEquals(io::Printer* printer) { const char *text = "if ($property_name$ != other.$property_name$) return false;\n"; if (descriptor_->message_type()->field(0)->type() == FieldDescriptor::TYPE_FLOAT) { text = "if (!pbc::ProtobufEqualityComparers.BitwiseNullableSingleEqualityComparer.Equals($property_name$, other.$property_name$)) return false;\n"; } else if (descriptor_->message_type()->field(0)->type() == FieldDescriptor::TYPE_DOUBLE) { text = "if (!pbc::ProtobufEqualityComparers.BitwiseNullableDoubleEqualityComparer.Equals($property_name$, other.$property_name$)) return false;\n"; } printer->Print(variables_, text); } void WrapperFieldGenerator::WriteToString(io::Printer* printer) { // TODO: Implement if we ever actually need it... } void WrapperFieldGenerator::GenerateCloningCode(io::Printer* printer) { printer->Print(variables_, "$property_name$ = other.$property_name$;\n"); } void WrapperFieldGenerator::GenerateCodecCode(io::Printer* printer) { if (is_value_type) { printer->Print( variables_, "pb::FieldCodec.ForStructWrapper<$nonnullable_type_name$>($tag$)"); } else { printer->Print( variables_, "pb::FieldCodec.ForClassWrapper<$type_name$>($tag$)"); } } WrapperOneofFieldGenerator::WrapperOneofFieldGenerator( const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options) : WrapperFieldGenerator(descriptor, fieldOrdinal, options) { SetCommonOneofFieldVariables(&variables_); } WrapperOneofFieldGenerator::~WrapperOneofFieldGenerator() { } void WrapperOneofFieldGenerator::GenerateMembers(io::Printer* printer) { // Note: deliberately _oneof_$name$_codec, not _$oneof_name$_codec... we have one codec per field. printer->Print( variables_, "private static readonly pb::FieldCodec<$type_name$> _oneof_$name$_codec = "); GenerateCodecCode(printer); printer->Print(";\n"); WritePropertyDocComment(printer, descriptor_); AddPublicMemberAttributes(printer); printer->Print( variables_, "$access_level$ $type_name$ $property_name$ {\n" " get { return $has_property_check$ ? ($type_name$) $oneof_name$_ : ($type_name$) null; }\n" " set {\n" " $oneof_name$_ = value;\n" " $oneof_name$Case_ = value == null ? $oneof_property_name$OneofCase.None : $oneof_property_name$OneofCase.$property_name$;\n" " }\n" "}\n"); } void WrapperOneofFieldGenerator::GenerateMergingCode(io::Printer* printer) { printer->Print(variables_, "$property_name$ = other.$property_name$;\n"); } void WrapperOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print( variables_, "$property_name$ = _oneof_$name$_codec.Read(input);\n"); } void WrapperOneofFieldGenerator::GenerateSerializationCode(io::Printer* printer) { // TODO: I suspect this is wrong... printer->Print( variables_, "if ($has_property_check$) {\n" " _oneof_$name$_codec.WriteTagAndValue(output, ($type_name$) $oneof_name$_);\n" "}\n"); } void WrapperOneofFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { // TODO: I suspect this is wrong... printer->Print( variables_, "if ($has_property_check$) {\n" " size += _oneof_$name$_codec.CalculateSizeWithTag($property_name$);\n" "}\n"); } } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google csharp_wrapper_field.h000066400000000000000000000073031334102242000346430ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/csharp// 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_CSHARP_WRAPPER_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_CSHARP_WRAPPER_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace csharp { struct Options; class WrapperFieldGenerator : public FieldGeneratorBase { public: WrapperFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options); ~WrapperFieldGenerator(); virtual void GenerateCodecCode(io::Printer* printer); virtual void GenerateCloningCode(io::Printer* printer); virtual void GenerateMembers(io::Printer* printer); virtual void GenerateMergingCode(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); virtual void GenerateSerializationCode(io::Printer* printer); virtual void GenerateSerializedSizeCode(io::Printer* printer); virtual void WriteHash(io::Printer* printer); virtual void WriteEquals(io::Printer* printer); virtual void WriteToString(io::Printer* printer); private: bool is_value_type; // True for int32 etc; false for bytes and string GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WrapperFieldGenerator); }; class WrapperOneofFieldGenerator : public WrapperFieldGenerator { public: WrapperOneofFieldGenerator(const FieldDescriptor* descriptor, int fieldOrdinal, const Options *options); ~WrapperOneofFieldGenerator(); virtual void GenerateMembers(io::Printer* printer); virtual void GenerateMergingCode(io::Printer* printer); virtual void GenerateParsingCode(io::Printer* printer); virtual void GenerateSerializationCode(io::Printer* printer); virtual void GenerateSerializedSizeCode(io::Printer* printer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WrapperOneofFieldGenerator); }; } // namespace csharp } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_WRAPPER_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/importer.cc000066400000000000000000000414411334102242000312570ustar00rootroot00000000000000// 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. #ifdef _MSC_VER #include #else #include #endif #include #include #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #ifdef _WIN32 #include #endif namespace google { namespace protobuf { namespace compiler { #ifdef _WIN32 // DO NOT include , instead create functions in io_win32.{h,cc} and import // them like we do below. using google::protobuf::internal::win32::access; using google::protobuf::internal::win32::open; #endif // 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 string& text) { #if defined(_WIN32) || defined(__CYGWIN__) return text.size() >= 3 && text[1] == ':' && isalpha(text[0]) && (text[2] == '/' || text[2] == '\\') && text.find_last_of(':') == 1; #else return false; #endif } MultiFileErrorCollector::~MultiFileErrorCollector() {} // This class serves two purposes: // - It implements the ErrorCollector interface (used by Tokenizer and Parser) // in terms of MultiFileErrorCollector, using a particular filename. // - It lets us check if any errors have occurred. class SourceTreeDescriptorDatabase::SingleFileErrorCollector : public io::ErrorCollector { public: SingleFileErrorCollector(const string& filename, MultiFileErrorCollector* multi_file_error_collector) : filename_(filename), multi_file_error_collector_(multi_file_error_collector), had_errors_(false) {} ~SingleFileErrorCollector() {} bool had_errors() { return had_errors_; } // implements ErrorCollector --------------------------------------- void AddError(int line, int column, const string& message) { if (multi_file_error_collector_ != NULL) { multi_file_error_collector_->AddError(filename_, line, column, message); } had_errors_ = true; } private: string filename_; MultiFileErrorCollector* multi_file_error_collector_; bool had_errors_; }; // =================================================================== SourceTreeDescriptorDatabase::SourceTreeDescriptorDatabase( SourceTree* source_tree) : source_tree_(source_tree), error_collector_(NULL), using_validation_error_collector_(false), validation_error_collector_(this) {} SourceTreeDescriptorDatabase::~SourceTreeDescriptorDatabase() {} bool SourceTreeDescriptorDatabase::FindFileByName( const string& filename, FileDescriptorProto* output) { google::protobuf::scoped_ptr input(source_tree_->Open(filename)); if (input == NULL) { if (error_collector_ != NULL) { error_collector_->AddError(filename, -1, 0, source_tree_->GetLastErrorMessage()); } return false; } // Set up the tokenizer and parser. SingleFileErrorCollector file_error_collector(filename, error_collector_); io::Tokenizer tokenizer(input.get(), &file_error_collector); Parser parser; if (error_collector_ != NULL) { parser.RecordErrorsTo(&file_error_collector); } if (using_validation_error_collector_) { parser.RecordSourceLocationsTo(&source_locations_); } // Parse it. output->set_name(filename); return parser.Parse(&tokenizer, output) && !file_error_collector.had_errors(); } bool SourceTreeDescriptorDatabase::FindFileContainingSymbol( const string& symbol_name, FileDescriptorProto* output) { return false; } bool SourceTreeDescriptorDatabase::FindFileContainingExtension( const string& containing_type, int field_number, FileDescriptorProto* output) { return false; } // ------------------------------------------------------------------- SourceTreeDescriptorDatabase::ValidationErrorCollector:: ValidationErrorCollector(SourceTreeDescriptorDatabase* owner) : owner_(owner) {} SourceTreeDescriptorDatabase::ValidationErrorCollector:: ~ValidationErrorCollector() {} void SourceTreeDescriptorDatabase::ValidationErrorCollector::AddError( const string& filename, const string& element_name, const Message* descriptor, ErrorLocation location, const string& message) { if (owner_->error_collector_ == NULL) return; int line, column; owner_->source_locations_.Find(descriptor, location, &line, &column); owner_->error_collector_->AddError(filename, line, column, message); } void SourceTreeDescriptorDatabase::ValidationErrorCollector::AddWarning( const string& filename, const string& element_name, const Message* descriptor, ErrorLocation location, const string& message) { if (owner_->error_collector_ == NULL) return; int line, column; owner_->source_locations_.Find(descriptor, location, &line, &column); owner_->error_collector_->AddWarning(filename, line, column, message); } // =================================================================== Importer::Importer(SourceTree* source_tree, MultiFileErrorCollector* error_collector) : database_(source_tree), pool_(&database_, database_.GetValidationErrorCollector()) { pool_.EnforceWeakDependencies(true); database_.RecordErrorsTo(error_collector); } Importer::~Importer() {} const FileDescriptor* Importer::Import(const string& filename) { return pool_.FindFileByName(filename); } void Importer::AddUnusedImportTrackFile(const string& file_name) { pool_.AddUnusedImportTrackFile(file_name); } void Importer::ClearUnusedImportTrackFiles() { pool_.ClearUnusedImportTrackFiles(); } // =================================================================== SourceTree::~SourceTree() {} string SourceTree::GetLastErrorMessage() { return "File not found."; } DiskSourceTree::DiskSourceTree() {} DiskSourceTree::~DiskSourceTree() {} static inline char LastChar(const 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. // - Any consecutive '/'s are collapsed into a single slash. // Note that the resulting string may be empty. // // TODO(kenton): It would be nice to handle "..", e.g. so that we can figure // out that "foo/bar.proto" is inside "baz/../foo". However, if baz is a // symlink or doesn't exist, then things get complicated, and we can't // actually determine this without investigating the filesystem, probably // in non-portable ways. So, we punt. // // TODO(kenton): It would be nice to use realpath() here except that it // resolves symbolic links. This could cause problems if people place // symbolic links in their source tree. For example, if you executed: // protoc --proto_path=foo foo/bar/baz.proto // 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 string CanonicalizePath(string 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, "\\\\")) { // Avoid converting two leading backslashes. path = "\\\\" + StringReplace(path.substr(2), "\\", "/", true); } else { path = StringReplace(path, "\\", "/", true); } #endif std::vector canonical_parts; std::vector parts = Split( path, "/", true); // Note: Removes empty parts. for (int i = 0; i < parts.size(); i++) { if (parts[i] == ".") { // Ignore. } else { canonical_parts.push_back(parts[i]); } } 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; } static inline bool ContainsParentReference(const string& path) { return path == ".." || HasPrefixString(path, "../") || HasSuffixString(path, "/..") || path.find("/../") != string::npos; } // Maps a file from an old location to a new one. Typically, old_prefix is // a virtual path and new_prefix is its corresponding disk path. Returns // false if the filename did not start with old_prefix, otherwise replaces // old_prefix with new_prefix and stores the result in *result. Examples: // string result; // assert(ApplyMapping("foo/bar", "", "baz", &result)); // assert(result == "baz/foo/bar"); // // assert(ApplyMapping("foo/bar", "foo", "baz", &result)); // assert(result == "baz/bar"); // // assert(ApplyMapping("foo", "foo", "bar", &result)); // assert(result == "bar"); // // assert(!ApplyMapping("foo/bar", "baz", "qux", &result)); // assert(!ApplyMapping("foo/bar", "baz", "qux", &result)); // assert(!ApplyMapping("foobar", "foo", "baz", &result)); static bool ApplyMapping(const string& filename, const string& old_prefix, const string& new_prefix, 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)) { // This is an absolute path, so it isn't matched by the empty string. return false; } result->assign(new_prefix); if (!result->empty()) result->push_back('/'); result->append(filename); return true; } else if (HasPrefixString(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; return true; } else { // Not an exact match. Is the next character a '/'? Otherwise, // this isn't actually a match at all. E.g. the prefix "foo/bar" // does not match the filename "foo/barbaz". int after_prefix_start = -1; if (filename[old_prefix.size()] == '/') { after_prefix_start = old_prefix.size() + 1; } else if (filename[old_prefix.size() - 1] == '/') { // old_prefix is never empty, and canonicalized paths never have // consecutive '/' characters. after_prefix_start = old_prefix.size(); } if (after_prefix_start != -1) { // Yep. So the prefixes are directories and the filename is a file // inside them. string 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); if (!result->empty()) result->push_back('/'); result->append(after_prefix); return true; } } } return false; } void DiskSourceTree::MapPath(const string& virtual_path, const string& disk_path) { mappings_.push_back(Mapping(virtual_path, CanonicalizePath(disk_path))); } DiskSourceTree::DiskFileToVirtualFileResult DiskSourceTree::DiskFileToVirtualFile( const string& disk_file, string* virtual_file, string* shadowing_disk_file) { int mapping_index = -1; string canonical_disk_file = CanonicalizePath(disk_file); for (int i = 0; i < mappings_.size(); i++) { // Apply the mapping in reverse. if (ApplyMapping(canonical_disk_file, mappings_[i].disk_path, mappings_[i].virtual_path, virtual_file)) { // Success. mapping_index = i; break; } } if (mapping_index == -1) { return NO_MAPPING; } // Iterate through all mappings with higher precedence and verify that none // of them map this file to some other existing file. for (int i = 0; i < mapping_index; i++) { if (ApplyMapping(*virtual_file, mappings_[i].virtual_path, mappings_[i].disk_path, shadowing_disk_file)) { if (access(shadowing_disk_file->c_str(), F_OK) >= 0) { // File exists. return SHADOWED; } } } shadowing_disk_file->clear(); // Verify that we can open the file. Note that this also has the side-effect // of verifying that we are not canonicalizing away any non-existent // directories. google::protobuf::scoped_ptr stream(OpenDiskFile(disk_file)); if (stream == NULL) { return CANNOT_OPEN; } return SUCCESS; } bool DiskSourceTree::VirtualFileToDiskFile(const string& virtual_file, string* disk_file) { google::protobuf::scoped_ptr stream( OpenVirtualFile(virtual_file, disk_file)); return stream != NULL; } io::ZeroCopyInputStream* DiskSourceTree::Open(const string& filename) { return OpenVirtualFile(filename, NULL); } string DiskSourceTree::GetLastErrorMessage() { return last_error_message_; } io::ZeroCopyInputStream* DiskSourceTree::OpenVirtualFile( const string& virtual_file, string* disk_file) { if (virtual_file != CanonicalizePath(virtual_file) || ContainsParentReference(virtual_file)) { // We do not allow importing of paths containing things like ".." or // consecutive slashes since the compiler expects files to be uniquely // identified by file name. last_error_message_ = "Backslashes, consecutive slashes, \".\", or \"..\" " "are not allowed in the virtual path"; return NULL; } for (int i = 0; i < mappings_.size(); i++) { string temp_disk_file; if (ApplyMapping(virtual_file, mappings_[i].virtual_path, mappings_[i].disk_path, &temp_disk_file)) { io::ZeroCopyInputStream* stream = OpenDiskFile(temp_disk_file); if (stream != NULL) { if (disk_file != NULL) { *disk_file = temp_disk_file; } return stream; } if (errno == EACCES) { // The file exists but is not readable. last_error_message_ = "Read access is denied for file: " + temp_disk_file; return NULL; } } } last_error_message_ = "File not found."; return NULL; } io::ZeroCopyInputStream* DiskSourceTree::OpenDiskFile( const string& filename) { int file_descriptor; do { file_descriptor = open(filename.c_str(), O_RDONLY); } while (file_descriptor < 0 && errno == EINTR); if (file_descriptor >= 0) { io::FileInputStream* result = new io::FileInputStream(file_descriptor); result->SetCloseOnDelete(true); return result; } else { return NULL; } } } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/importer.h000066400000000000000000000326451334102242000311270ustar00rootroot00000000000000// 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. // // This file is the public interface to the .proto file parser. #ifndef GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__ #define GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__ #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { class ZeroCopyInputStream; } namespace compiler { // Defined in this file. class Importer; class MultiFileErrorCollector; class SourceTree; class DiskSourceTree; // TODO(kenton): Move all SourceTree stuff to a separate file? // An implementation of DescriptorDatabase which loads files from a SourceTree // and parses them. // // Note: This class is not thread-safe since it maintains a table of source // code locations for error reporting. However, when a DescriptorPool wraps // a DescriptorDatabase, it uses mutex locking to make sure only one method // of the database is called at a time, even if the DescriptorPool is used // from multiple threads. Therefore, there is only a problem if you create // multiple DescriptorPools wrapping the same SourceTreeDescriptorDatabase // and use them from multiple threads. // // Note: This class does not implement FindFileContainingSymbol() or // FindFileContainingExtension(); these will always return false. class LIBPROTOBUF_EXPORT SourceTreeDescriptorDatabase : public DescriptorDatabase { public: SourceTreeDescriptorDatabase(SourceTree* source_tree); ~SourceTreeDescriptorDatabase(); // Instructs the SourceTreeDescriptorDatabase to report any parse errors // to the given MultiFileErrorCollector. This should be called before // parsing. error_collector must remain valid until either this method // is called again or the SourceTreeDescriptorDatabase is destroyed. void RecordErrorsTo(MultiFileErrorCollector* error_collector) { error_collector_ = error_collector; } // Gets a DescriptorPool::ErrorCollector which records errors to the // MultiFileErrorCollector specified with RecordErrorsTo(). This collector // has the ability to determine exact line and column numbers of errors // from the information given to it by the DescriptorPool. DescriptorPool::ErrorCollector* GetValidationErrorCollector() { using_validation_error_collector_ = true; return &validation_error_collector_; } // implements DescriptorDatabase ----------------------------------- bool FindFileByName(const string& filename, FileDescriptorProto* output); bool FindFileContainingSymbol(const string& symbol_name, FileDescriptorProto* output); bool FindFileContainingExtension(const string& containing_type, int field_number, FileDescriptorProto* output); private: class SingleFileErrorCollector; SourceTree* source_tree_; MultiFileErrorCollector* error_collector_; class LIBPROTOBUF_EXPORT ValidationErrorCollector : public DescriptorPool::ErrorCollector { public: ValidationErrorCollector(SourceTreeDescriptorDatabase* owner); ~ValidationErrorCollector(); // implements ErrorCollector --------------------------------------- void AddError(const string& filename, const string& element_name, const Message* descriptor, ErrorLocation location, const string& message); virtual void AddWarning(const string& filename, const string& element_name, const Message* descriptor, ErrorLocation location, const string& message); private: SourceTreeDescriptorDatabase* owner_; }; friend class ValidationErrorCollector; bool using_validation_error_collector_; SourceLocationTable source_locations_; ValidationErrorCollector validation_error_collector_; }; // Simple interface for parsing .proto files. This wraps the process // of opening the file, parsing it with a Parser, recursively parsing all its // imports, and then cross-linking the results to produce a FileDescriptor. // // This is really just a thin wrapper around SourceTreeDescriptorDatabase. // You may find that SourceTreeDescriptorDatabase is more flexible. // // TODO(kenton): I feel like this class is not well-named. class LIBPROTOBUF_EXPORT Importer { public: Importer(SourceTree* source_tree, MultiFileErrorCollector* error_collector); ~Importer(); // Import the given file and build a FileDescriptor representing it. If // the file is already in the DescriptorPool, the existing FileDescriptor // will be returned. The FileDescriptor is property of the DescriptorPool, // and will remain valid until it is destroyed. If any errors occur, they // will be reported using the error collector and Import() will return NULL. // // A particular Importer object will only report errors for a particular // file once. All future attempts to import the same file will return NULL // without reporting any errors. The idea is that you might want to import // a lot of files without seeing the same errors over and over again. If // you want to see errors for the same files repeatedly, you can use a // separate Importer object to import each one (but use the same // DescriptorPool so that they can be cross-linked). const FileDescriptor* Import(const string& filename); // The DescriptorPool in which all imported FileDescriptors and their // contents are stored. inline const DescriptorPool* pool() const { return &pool_; } void AddUnusedImportTrackFile(const string& file_name); void ClearUnusedImportTrackFiles(); 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 LIBPROTOBUF_EXPORT MultiFileErrorCollector { public: inline MultiFileErrorCollector() {} virtual ~MultiFileErrorCollector(); // Line and column numbers are zero-based. A line number of -1 indicates // an error with the entire file (e.g. "not found"). virtual void AddError(const string& filename, int line, int column, const string& message) = 0; virtual void AddWarning(const string& filename, int line, int column, const string& message) {} private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MultiFileErrorCollector); }; // Abstract interface which represents a directory tree containing proto files. // Used by the default implementation of Importer to resolve import statements // Most users will probably want to use the DiskSourceTree implementation, // below. class LIBPROTOBUF_EXPORT SourceTree { public: inline SourceTree() {} virtual ~SourceTree(); // 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 string& filename) = 0; // If Open() returns NULL, calling this method immediately will return an // description of the error. // Subclasses should implement this method and return a meaningful value for // better error reporting. // TODO(xiaofeng): change this to a pure virtual function. virtual string GetLastErrorMessage(); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SourceTree); }; // An implementation of SourceTree which loads files from locations on disk. // Multiple mappings can be set up to map locations in the DiskSourceTree to // locations in the physical filesystem. class LIBPROTOBUF_EXPORT DiskSourceTree : public SourceTree { public: DiskSourceTree(); ~DiskSourceTree(); // Map a path on disk to a location in the SourceTree. The path may be // either a file or a directory. If it is a directory, the entire tree // under it will be mapped to the given virtual location. To map a directory // to the root of the source tree, pass an empty string for virtual_path. // // If multiple mapped paths apply when opening a file, they will be searched // in order. For example, if you do: // MapPath("bar", "foo/bar"); // MapPath("", "baz"); // and then you do: // Open("bar/qux"); // the DiskSourceTree will first try to open foo/bar/qux, then baz/bar/qux, // returning the first one that opens successfuly. // // 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 string& virtual_path, const string& disk_path); // Return type for DiskFileToVirtualFile(). enum DiskFileToVirtualFileResult { SUCCESS, SHADOWED, CANNOT_OPEN, NO_MAPPING }; // Given a path to a file on disk, find a virtual path mapping to that // file. The first mapping created with MapPath() whose disk_path contains // the filename is used. However, that virtual path may not actually be // usable to open the given file. Possible return values are: // * SUCCESS: The mapping was found. *virtual_file is filled in so that // calling Open(*virtual_file) will open the file named by disk_file. // * SHADOWED: A mapping was found, but using Open() to open this virtual // path will end up returning some different file. This is because some // other mapping with a higher precedence also matches this virtual path // and maps it to a different file that exists on disk. *virtual_file // is filled in as it would be in the SUCCESS case. *shadowing_disk_file // is filled in with the disk path of the file which would be opened if // you were to call Open(*virtual_file). // * CANNOT_OPEN: The mapping was found and was not shadowed, but the // file specified cannot be opened. When this value is returned, // errno will indicate the reason the file cannot be opened. *virtual_file // will be set to the virtual path as in the SUCCESS case, even though // it is not useful. // * NO_MAPPING: Indicates that no mapping was found which contains this // file. DiskFileToVirtualFileResult DiskFileToVirtualFile(const string& disk_file, string* virtual_file, 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 string& virtual_file, string* disk_file); // implements SourceTree ------------------------------------------- virtual io::ZeroCopyInputStream* Open(const string& filename); virtual string GetLastErrorMessage(); private: struct Mapping { string virtual_path; string disk_path; inline Mapping(const string& virtual_path_param, const string& disk_path_param) : virtual_path(virtual_path_param), disk_path(disk_path_param) {} }; std::vector mappings_; 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 string& virtual_file, string* disk_file); // Like Open() but given the actual on-disk path. io::ZeroCopyInputStream* OpenDiskFile(const string& filename); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DiskSourceTree); }; } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/importer_unittest.cc000066400000000000000000000434171334102242000332230ustar00rootroot00000000000000// 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 #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace { bool FileExists(const string& path) { return File::Exists(path); } #define EXPECT_SUBSTRING(needle, haystack) \ EXPECT_PRED_FORMAT2(testing::IsSubstring, (needle), (haystack)) class MockErrorCollector : public MultiFileErrorCollector { public: MockErrorCollector() {} ~MockErrorCollector() {} string text_; string warning_text_; // implements ErrorCollector --------------------------------------- void AddError(const string& filename, int line, int column, const string& message) { strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line, column, message); } void AddWarning(const string& filename, int line, int column, const string& message) { strings::SubstituteAndAppend(&warning_text_, "$0:$1:$2: $3\n", filename, line, column, message); } }; // ------------------------------------------------------------------- // A dummy implementation of SourceTree backed by a simple map. class MockSourceTree : public SourceTree { public: MockSourceTree() {} ~MockSourceTree() {} void AddFile(const string& name, const char* contents) { files_[name] = contents; } // implements SourceTree ------------------------------------------- io::ZeroCopyInputStream* Open(const string& filename) { const char* contents = FindPtrOrNull(files_, filename); if (contents == NULL) { return NULL; } else { return new io::ArrayInputStream(contents, strlen(contents)); } } string GetLastErrorMessage() { return "File not found."; } private: hash_map files_; }; // =================================================================== class ImporterTest : public testing::Test { protected: ImporterTest() : importer_(&source_tree_, &error_collector_) {} void AddFile(const string& filename, const char* text) { source_tree_.AddFile(filename, text); } // Return the collected error text string error() const { return error_collector_.text_; } string warning() const { return error_collector_.warning_text_; } MockErrorCollector error_collector_; MockSourceTree source_tree_; Importer importer_; }; TEST_F(ImporterTest, Import) { // Test normal importing. AddFile("foo.proto", "syntax = \"proto2\";\n" "message Foo {}\n"); const FileDescriptor* file = importer_.Import("foo.proto"); EXPECT_EQ("", error_collector_.text_); ASSERT_TRUE(file != NULL); ASSERT_EQ(1, file->message_type_count()); EXPECT_EQ("Foo", file->message_type(0)->name()); // Importing again should return same object. EXPECT_EQ(file, importer_.Import("foo.proto")); } TEST_F(ImporterTest, ImportNested) { // Test that importing a file which imports another file works. AddFile("foo.proto", "syntax = \"proto2\";\n" "import \"bar.proto\";\n" "message Foo {\n" " optional Bar bar = 1;\n" "}\n"); AddFile("bar.proto", "syntax = \"proto2\";\n" "message Bar {}\n"); // Note that both files are actually parsed by the first call to Import() // here, since foo.proto imports bar.proto. The second call just returns // the same ProtoFile for bar.proto which was constructed while importing // foo.proto. We test that this is the case below by checking that bar // is among foo's dependencies (by pointer). const FileDescriptor* foo = importer_.Import("foo.proto"); const FileDescriptor* bar = importer_.Import("bar.proto"); EXPECT_EQ("", error_collector_.text_); ASSERT_TRUE(foo != NULL); ASSERT_TRUE(bar != NULL); // Check that foo's dependency is the same object as bar. ASSERT_EQ(1, foo->dependency_count()); EXPECT_EQ(bar, foo->dependency(0)); // Check that foo properly cross-links bar. ASSERT_EQ(1, foo->message_type_count()); ASSERT_EQ(1, bar->message_type_count()); ASSERT_EQ(1, foo->message_type(0)->field_count()); ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, foo->message_type(0)->field(0)->type()); EXPECT_EQ(bar->message_type(0), foo->message_type(0)->field(0)->message_type()); } TEST_F(ImporterTest, FileNotFound) { // Error: Parsing a file that doesn't exist. EXPECT_TRUE(importer_.Import("foo.proto") == NULL); EXPECT_EQ( "foo.proto:-1:0: File not found.\n", error_collector_.text_); } TEST_F(ImporterTest, ImportNotFound) { // Error: Importing a file that doesn't exist. AddFile("foo.proto", "syntax = \"proto2\";\n" "import \"bar.proto\";\n"); EXPECT_TRUE(importer_.Import("foo.proto") == NULL); EXPECT_EQ( "bar.proto:-1:0: File not found.\n" "foo.proto:-1:0: Import \"bar.proto\" was not found or had errors.\n", error_collector_.text_); } TEST_F(ImporterTest, RecursiveImport) { // Error: Recursive import. AddFile("recursive1.proto", "syntax = \"proto2\";\n" "import \"recursive2.proto\";\n"); AddFile("recursive2.proto", "syntax = \"proto2\";\n" "import \"recursive1.proto\";\n"); EXPECT_TRUE(importer_.Import("recursive1.proto") == NULL); EXPECT_EQ( "recursive1.proto:-1:0: File recursively imports itself: recursive1.proto " "-> recursive2.proto -> recursive1.proto\n" "recursive2.proto:-1:0: Import \"recursive1.proto\" was not found " "or had errors.\n" "recursive1.proto:-1:0: Import \"recursive2.proto\" was not found " "or had errors.\n", error_collector_.text_); } // =================================================================== class DiskSourceTreeTest : public testing::Test { protected: virtual void SetUp() { dirnames_.push_back(TestTempDir() + "/test_proto2_import_path_1"); dirnames_.push_back(TestTempDir() + "/test_proto2_import_path_2"); for (int i = 0; i < dirnames_.size(); i++) { if (FileExists(dirnames_[i])) { File::DeleteRecursively(dirnames_[i], NULL, NULL); } GOOGLE_CHECK_OK(File::CreateDir(dirnames_[i], 0777)); } } virtual void TearDown() { for (int i = 0; i < dirnames_.size(); i++) { if (FileExists(dirnames_[i])) { File::DeleteRecursively(dirnames_[i], NULL, NULL); } } } void AddFile(const string& filename, const char* contents) { GOOGLE_CHECK_OK(File::SetContents(filename, contents, true)); } void AddSubdir(const string& dirname) { GOOGLE_CHECK_OK(File::CreateDir(dirname, 0777)); } void ExpectFileContents(const string& filename, const char* expected_contents) { google::protobuf::scoped_ptr input(source_tree_.Open(filename)); ASSERT_FALSE(input == NULL); // Read all the data from the file. string file_contents; const void* data; int size; while (input->Next(&data, &size)) { file_contents.append(reinterpret_cast(data), size); } EXPECT_EQ(expected_contents, file_contents); } void ExpectCannotOpenFile(const string& filename, const string& error_message) { google::protobuf::scoped_ptr input(source_tree_.Open(filename)); EXPECT_TRUE(input == NULL); EXPECT_EQ(error_message, source_tree_.GetLastErrorMessage()); } DiskSourceTree source_tree_; // Paths of two on-disk directories to use during the test. std::vector dirnames_; }; TEST_F(DiskSourceTreeTest, MapRoot) { // Test opening a file in a directory that is mapped to the root of the // source tree. AddFile(dirnames_[0] + "/foo", "Hello World!"); source_tree_.MapPath("", dirnames_[0]); ExpectFileContents("foo", "Hello World!"); ExpectCannotOpenFile("bar", "File not found."); } TEST_F(DiskSourceTreeTest, MapDirectory) { // Test opening a file in a directory that is mapped to somewhere other // than the root of the source tree. AddFile(dirnames_[0] + "/foo", "Hello World!"); source_tree_.MapPath("baz", dirnames_[0]); ExpectFileContents("baz/foo", "Hello World!"); ExpectCannotOpenFile("baz/bar", "File not found."); ExpectCannotOpenFile("foo", "File not found."); ExpectCannotOpenFile("bar", "File not found."); // Non-canonical file names should not work. ExpectCannotOpenFile("baz//foo", "Backslashes, consecutive slashes, \".\", or \"..\" are " "not allowed in the virtual path"); ExpectCannotOpenFile("baz/../baz/foo", "Backslashes, consecutive slashes, \".\", or \"..\" are " "not allowed in the virtual path"); ExpectCannotOpenFile("baz/./foo", "Backslashes, consecutive slashes, \".\", or \"..\" are " "not allowed in the virtual path"); ExpectCannotOpenFile("baz/foo/", "File not found."); } TEST_F(DiskSourceTreeTest, NoParent) { // Test that we cannot open files in a parent of a mapped directory. AddFile(dirnames_[0] + "/foo", "Hello World!"); AddSubdir(dirnames_[0] + "/bar"); AddFile(dirnames_[0] + "/bar/baz", "Blah."); source_tree_.MapPath("", dirnames_[0] + "/bar"); ExpectFileContents("baz", "Blah."); ExpectCannotOpenFile("../foo", "Backslashes, consecutive slashes, \".\", or \"..\" are " "not allowed in the virtual path"); ExpectCannotOpenFile("../bar/baz", "Backslashes, consecutive slashes, \".\", or \"..\" are " "not allowed in the virtual path"); } TEST_F(DiskSourceTreeTest, MapFile) { // Test opening a file that is mapped directly into the source tree. AddFile(dirnames_[0] + "/foo", "Hello World!"); source_tree_.MapPath("foo", dirnames_[0] + "/foo"); ExpectFileContents("foo", "Hello World!"); ExpectCannotOpenFile("bar", "File not found."); } TEST_F(DiskSourceTreeTest, SearchMultipleDirectories) { // Test mapping and searching multiple directories. AddFile(dirnames_[0] + "/foo", "Hello World!"); AddFile(dirnames_[1] + "/foo", "This file should be hidden."); AddFile(dirnames_[1] + "/bar", "Goodbye World!"); source_tree_.MapPath("", dirnames_[0]); source_tree_.MapPath("", dirnames_[1]); ExpectFileContents("foo", "Hello World!"); ExpectFileContents("bar", "Goodbye World!"); ExpectCannotOpenFile("baz", "File not found."); } TEST_F(DiskSourceTreeTest, OrderingTrumpsSpecificity) { // Test that directories are always searched in order, even when a latter // directory is more-specific than a former one. // Create the "bar" directory so we can put a file in it. GOOGLE_CHECK_OK(File::CreateDir(dirnames_[0] + "/bar", 0777)); // Add files and map paths. AddFile(dirnames_[0] + "/bar/foo", "Hello World!"); AddFile(dirnames_[1] + "/foo", "This file should be hidden."); source_tree_.MapPath("", dirnames_[0]); source_tree_.MapPath("bar", dirnames_[1]); // Check. ExpectFileContents("bar/foo", "Hello World!"); } TEST_F(DiskSourceTreeTest, DiskFileToVirtualFile) { // Test DiskFileToVirtualFile. AddFile(dirnames_[0] + "/foo", "Hello World!"); AddFile(dirnames_[1] + "/foo", "This file should be hidden."); source_tree_.MapPath("bar", dirnames_[0]); source_tree_.MapPath("bar", dirnames_[1]); string virtual_file; string shadowing_disk_file; EXPECT_EQ(DiskSourceTree::NO_MAPPING, source_tree_.DiskFileToVirtualFile( "/foo", &virtual_file, &shadowing_disk_file)); EXPECT_EQ(DiskSourceTree::SHADOWED, source_tree_.DiskFileToVirtualFile( dirnames_[1] + "/foo", &virtual_file, &shadowing_disk_file)); EXPECT_EQ("bar/foo", virtual_file); EXPECT_EQ(dirnames_[0] + "/foo", shadowing_disk_file); EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, source_tree_.DiskFileToVirtualFile( dirnames_[1] + "/baz", &virtual_file, &shadowing_disk_file)); EXPECT_EQ("bar/baz", virtual_file); EXPECT_EQ(DiskSourceTree::SUCCESS, source_tree_.DiskFileToVirtualFile( dirnames_[0] + "/foo", &virtual_file, &shadowing_disk_file)); EXPECT_EQ("bar/foo", virtual_file); } TEST_F(DiskSourceTreeTest, DiskFileToVirtualFileCanonicalization) { // Test handling of "..", ".", etc. in DiskFileToVirtualFile(). source_tree_.MapPath("dir1", ".."); source_tree_.MapPath("dir2", "../../foo"); source_tree_.MapPath("dir3", "./foo/bar/."); source_tree_.MapPath("dir4", "."); source_tree_.MapPath("", "/qux"); source_tree_.MapPath("dir5", "/quux/"); string virtual_file; string shadowing_disk_file; // "../.." should not be considered to be under "..". EXPECT_EQ(DiskSourceTree::NO_MAPPING, source_tree_.DiskFileToVirtualFile( "../../baz", &virtual_file, &shadowing_disk_file)); // "/foo" is not mapped (it should not be misintepreted as being under "."). EXPECT_EQ(DiskSourceTree::NO_MAPPING, source_tree_.DiskFileToVirtualFile( "/foo", &virtual_file, &shadowing_disk_file)); #ifdef WIN32 // "C:\foo" is not mapped (it should not be misintepreted as being under "."). EXPECT_EQ(DiskSourceTree::NO_MAPPING, source_tree_.DiskFileToVirtualFile( "C:\\foo", &virtual_file, &shadowing_disk_file)); #endif // WIN32 // But "../baz" should be. EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, source_tree_.DiskFileToVirtualFile( "../baz", &virtual_file, &shadowing_disk_file)); EXPECT_EQ("dir1/baz", virtual_file); // "../../foo/baz" is under "../../foo". EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, source_tree_.DiskFileToVirtualFile( "../../foo/baz", &virtual_file, &shadowing_disk_file)); EXPECT_EQ("dir2/baz", virtual_file); // "foo/./bar/baz" is under "./foo/bar/.". EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, source_tree_.DiskFileToVirtualFile( "foo/bar/baz", &virtual_file, &shadowing_disk_file)); EXPECT_EQ("dir3/baz", virtual_file); // "bar" is under ".". EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, source_tree_.DiskFileToVirtualFile( "bar", &virtual_file, &shadowing_disk_file)); EXPECT_EQ("dir4/bar", virtual_file); // "/qux/baz" is under "/qux". EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, source_tree_.DiskFileToVirtualFile( "/qux/baz", &virtual_file, &shadowing_disk_file)); EXPECT_EQ("baz", virtual_file); // "/quux/bar" is under "/quux". EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, source_tree_.DiskFileToVirtualFile( "/quux/bar", &virtual_file, &shadowing_disk_file)); EXPECT_EQ("dir5/bar", virtual_file); } TEST_F(DiskSourceTreeTest, VirtualFileToDiskFile) { // Test VirtualFileToDiskFile. AddFile(dirnames_[0] + "/foo", "Hello World!"); AddFile(dirnames_[1] + "/foo", "This file should be hidden."); AddFile(dirnames_[1] + "/quux", "This file should not be hidden."); source_tree_.MapPath("bar", dirnames_[0]); source_tree_.MapPath("bar", dirnames_[1]); // Existent files, shadowed and non-shadowed case. string disk_file; EXPECT_TRUE(source_tree_.VirtualFileToDiskFile("bar/foo", &disk_file)); EXPECT_EQ(dirnames_[0] + "/foo", disk_file); EXPECT_TRUE(source_tree_.VirtualFileToDiskFile("bar/quux", &disk_file)); EXPECT_EQ(dirnames_[1] + "/quux", disk_file); // Nonexistent file in existent directory and vice versa. string not_touched = "not touched"; EXPECT_FALSE(source_tree_.VirtualFileToDiskFile("bar/baz", ¬_touched)); EXPECT_EQ("not touched", not_touched); EXPECT_FALSE(source_tree_.VirtualFileToDiskFile("baz/foo", ¬_touched)); EXPECT_EQ("not touched", not_touched); // Accept NULL as output parameter. EXPECT_TRUE(source_tree_.VirtualFileToDiskFile("bar/foo", NULL)); EXPECT_FALSE(source_tree_.VirtualFileToDiskFile("baz/foo", NULL)); } } // namespace } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/000077500000000000000000000000001334102242000300245ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_context.cc000066400000000000000000000176221334102242000330300ustar00rootroot00000000000000// 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 #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { Context::Context(const FileDescriptor* file, const Options& options) : name_resolver_(new ClassNameResolver), options_(options) { InitializeFieldGeneratorInfo(file); } Context::~Context() { } ClassNameResolver* Context::GetNameResolver() const { return name_resolver_.get(); } namespace { // Whether two fields have conflicting accessors (assuming name1 and name2 // are different). name1 and name2 are field1 and field2's camel-case name // respectively. bool IsConflicting(const FieldDescriptor* field1, const string& name1, const FieldDescriptor* field2, const string& name2, string* info) { if (field1->is_repeated()) { if (field2->is_repeated()) { // Both fields are repeated. return false; } else { // field1 is repeated, and field2 is not. if (name1 + "Count" == name2) { *info = "both repeated field \"" + field1->name() + "\" and singular " + "field \"" + field2->name() + "\" generates the method \"" + "get" + name1 + "Count()\""; return true; } if (name1 + "List" == name2) { *info = "both repeated field \"" + field1->name() + "\" and singular " + "field \"" + field2->name() + "\" generates the method \"" + "get" + name1 + "List()\""; return true; } // Well, there are obviously many more conflicting cases, but it probably // doesn't worth the effort to exhaust all of them because they rarely // happen and as we are continuing adding new methods/changing existing // methods the number of different conflicting cases will keep growing. // We can just add more cases here when they are found in the real world. return false; } } else { if (field2->is_repeated()) { return IsConflicting(field2, name2, field1, name1, info); } else { // None of the two fields are repeated. return false; } } } } // namespace void Context::InitializeFieldGeneratorInfo(const FileDescriptor* file) { for (int i = 0; i < file->message_type_count(); ++i) { InitializeFieldGeneratorInfoForMessage(file->message_type(i)); } } void Context::InitializeFieldGeneratorInfoForMessage( const Descriptor* message) { for (int i = 0; i < message->nested_type_count(); ++i) { InitializeFieldGeneratorInfoForMessage(message->nested_type(i)); } std::vector fields; for (int i = 0; i < message->field_count(); ++i) { fields.push_back(message->field(i)); } InitializeFieldGeneratorInfoForFields(fields); for (int i = 0; i < message->oneof_decl_count(); ++i) { const OneofDescriptor* oneof = message->oneof_decl(i); OneofGeneratorInfo info; info.name = UnderscoresToCamelCase(oneof->name(), false); info.capitalized_name = UnderscoresToCamelCase(oneof->name(), true); oneof_generator_info_map_[oneof] = info; } } void Context::InitializeFieldGeneratorInfoForFields( const std::vector& fields) { // Find out all fields that conflict with some other field in the same // message. std::vector is_conflict(fields.size()); std::vector conflict_reason(fields.size()); for (int i = 0; i < fields.size(); ++i) { const FieldDescriptor* field = fields[i]; const string& name = UnderscoresToCapitalizedCamelCase(field); for (int j = i + 1; j < fields.size(); ++j) { const FieldDescriptor* other = fields[j]; const string& other_name = UnderscoresToCapitalizedCamelCase(other); if (name == other_name) { is_conflict[i] = is_conflict[j] = true; conflict_reason[i] = conflict_reason[j] = "capitalized name of field \"" + field->name() + "\" conflicts with field \"" + other->name() + "\""; } else if (IsConflicting(field, name, other, other_name, &conflict_reason[j])) { is_conflict[i] = is_conflict[j] = true; conflict_reason[i] = conflict_reason[j]; } } if (is_conflict[i]) { GOOGLE_LOG(WARNING) << "field \"" << field->full_name() << "\" is conflicting " << "with another field: " << conflict_reason[i]; } } for (int i = 0; i < fields.size(); ++i) { const FieldDescriptor* field = fields[i]; FieldGeneratorInfo info; info.name = CamelCaseFieldName(field); info.capitalized_name = UnderscoresToCapitalizedCamelCase(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 += SimpleItoa(field->number()); info.capitalized_name += SimpleItoa(field->number()); info.disambiguated_reason = conflict_reason[i]; } field_generator_info_map_[field] = info; } } const FieldGeneratorInfo* Context::GetFieldGeneratorInfo( const FieldDescriptor* field) const { const FieldGeneratorInfo* result = FindOrNull(field_generator_info_map_, field); if (result == NULL) { GOOGLE_LOG(FATAL) << "Can not find FieldGeneratorInfo for field: " << field->full_name(); } return result; } const OneofGeneratorInfo* Context::GetOneofGeneratorInfo( const OneofDescriptor* oneof) const { const OneofGeneratorInfo* result = FindOrNull(oneof_generator_info_map_, oneof); if (result == NULL) { GOOGLE_LOG(FATAL) << "Can not find OneofGeneratorInfo for oneof: " << oneof->name(); } return result; } // Does this message class have generated parsing, serialization, and other // standard methods for which reflection-based fallback implementations exist? bool Context::HasGeneratedMethods(const Descriptor* descriptor) const { return options_.enforce_lite || descriptor->file()->options().optimize_for() != FileOptions::CODE_SIZE; } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_context.h000066400000000000000000000101371334102242000326640ustar00rootroot00000000000000// 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_CONTEXT_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_CONTEXT_H__ #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include namespace google { namespace protobuf { class FileDescriptor; class FieldDescriptor; class OneofDescriptor; class Descriptor; class EnumDescriptor; namespace compiler { namespace java { class ClassNameResolver; // name_resolver.h } } } // namespace protobuf namespace protobuf { namespace compiler { namespace java { struct FieldGeneratorInfo; struct OneofGeneratorInfo; // A context object holds the information that is shared among all code // generators. class Context { public: Context(const FileDescriptor* file, const Options& options); ~Context(); // Get the name resolver associated with this context. The resolver // can be used to map descriptors to Java class names. ClassNameResolver* GetNameResolver() const; // Get the FieldGeneratorInfo for a given field. const FieldGeneratorInfo* GetFieldGeneratorInfo( const FieldDescriptor* field) const; // Get the OneofGeneratorInfo for a given oneof. const OneofGeneratorInfo* GetOneofGeneratorInfo( const OneofDescriptor* oneof) const; const Options& options() const { return options_; } // Enforces all the files (including transitive dependencies) to use // LiteRuntime. bool EnforceLite() const { return options_.enforce_lite; } // Does this message class have generated parsing, serialization, and other // standard methods for which reflection-based fallback implementations exist? bool HasGeneratedMethods(const Descriptor* descriptor) const; private: void InitializeFieldGeneratorInfo(const FileDescriptor* file); void InitializeFieldGeneratorInfoForMessage(const Descriptor* message); void InitializeFieldGeneratorInfoForFields( const std::vector& fields); google::protobuf::scoped_ptr name_resolver_; std::map field_generator_info_map_; std::map oneof_generator_info_map_; Options options_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Context); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_CONTEXT_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc000066400000000000000000000170321334102242000336260ustar00rootroot00000000000000// 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 #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { string EscapeJavadoc(const string& input) { string result; result.reserve(input.size() * 2); char prev = '*'; for (string::size_type i = 0; i < input.size(); i++) { char c = input[i]; 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; case '@': // '@' starts javadoc tags including the @deprecated tag, which will // cause a compile-time error if inserted before a declaration that // does not have a corresponding @Deprecated annotation. result.append("@"); break; case '<': // Avoid interpretation as HTML. result.append("<"); break; case '>': // Avoid interpretation as HTML. result.append(">"); break; case '&': // Avoid interpretation as HTML. result.append("&"); break; case '\\': // Java interprets Unicode escape sequences anywhere! result.append("\"); break; default: result.push_back(c); break; } prev = c; } return result; } static void WriteDocCommentBodyForLocation( io::Printer* printer, const SourceLocation& location) { 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
 to get fixed-width text formatting.

    // 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 lines = Split(comments, "\n");
    while (!lines.empty() && lines.back().empty()) {
      lines.pop_back();
    }

    printer->Print(" * 
\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
      // close the comment.
      if (!lines[i].empty() && lines[i][0] == '/') {
        printer->Print(" * $line$\n", "line", lines[i]);
      } else {
        printer->Print(" *$line$\n", "line", lines[i]);
      }
    }
    printer->Print(
        " * 
\n" " *\n"); } } template static void WriteDocCommentBody( io::Printer* printer, const DescriptorType* descriptor) { SourceLocation location; if (descriptor->GetSourceLocation(&location)) { WriteDocCommentBodyForLocation(printer, location); } } static string FirstLineOf(const string& value) { string result = value; string::size_type pos = result.find_first_of('\n'); if (pos != string::npos) { result.erase(pos); } // If line ends in an opening brace, make it "{ ... }" so it looks nice. if (!result.empty() && result[result.size() - 1] == '{') { result.append(" ... }"); } 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())); } void WriteFieldDocComment(io::Printer* printer, const FieldDescriptor* field) { // In theory we should have slightly different comments for setters, getters, // etc., but in practice everyone already knows the difference between these // so it's redundant information. // We start the comment with the main body based on the comments from the // .proto file (if present). We then end with the field declaration, e.g.: // optional string foo = 5; // If the field is a group, the debug string might end with {. printer->Print("/**\n"); WriteDocCommentBody(printer, field); printer->Print( " * $def$\n", "def", EscapeJavadoc(FirstLineOf(field->DebugString()))); printer->Print(" */\n"); } void WriteEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_) { printer->Print("/**\n"); WriteDocCommentBody(printer, enum_); 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); printer->Print( " * $def$\n" " */\n", "def", EscapeJavadoc(FirstLineOf(value->DebugString()))); } void WriteServiceDocComment(io::Printer* printer, const ServiceDescriptor* service) { printer->Print("/**\n"); WriteDocCommentBody(printer, service); printer->Print( " * Protobuf service {@code $fullname$}\n" " */\n", "fullname", EscapeJavadoc(service->full_name())); } void WriteMethodDocComment(io::Printer* printer, const MethodDescriptor* method) { printer->Print("/**\n"); WriteDocCommentBody(printer, method); printer->Print( " * $def$\n" " */\n", "def", EscapeJavadoc(FirstLineOf(method->DebugString()))); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_doc_comment.h000066400000000000000000000055641334102242000334770ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_DOC_COMMENT_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_DOC_COMMENT_H__ #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace java { void WriteMessageDocComment(io::Printer* printer, const Descriptor* message); void WriteFieldDocComment(io::Printer* printer, const FieldDescriptor* field); void WriteEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_); void WriteEnumValueDocComment(io::Printer* printer, const EnumValueDescriptor* value); void WriteServiceDocComment(io::Printer* printer, const ServiceDescriptor* service); void WriteMethodDocComment(io::Printer* printer, const MethodDescriptor* method); // Exposed for testing only. LIBPROTOC_EXPORT string EscapeJavadoc(const string& input); } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_DOC_COMMENT_H__ java_doc_comment_unittest.cc000066400000000000000000000061071334102242000355070ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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 #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { TEST(JavaDocCommentTest, Escaping) { EXPECT_EQ("foo /* bar */ baz", EscapeJavadoc("foo /* bar */ baz")); EXPECT_EQ("foo /*/ baz", EscapeJavadoc("foo /*/ baz")); EXPECT_EQ("{@foo}", EscapeJavadoc("{@foo}")); EXPECT_EQ("<i>&</i>", EscapeJavadoc("&")); EXPECT_EQ("foo\u1234bar", EscapeJavadoc("foo\\u1234bar")); EXPECT_EQ("@deprecated", EscapeJavadoc("@deprecated")); } // TODO(kenton): It's hard to write a robust test of the doc comments -- we // can only really compare the output against a golden value, which is a // fairly tedious and fragile testing strategy. If we want to go that route, // it probably makes sense to bite the bullet and write a test that compares // the whole generated output for unittest.proto against a golden value, with // a very simple script that can be run to regenerate it with the latest code. // This would mean that updates to the golden file would have to be included // in any change to the code generator, which would actually be fairly useful // as it allows the reviewer to see clearly how the generated code is // changing. } // namespace } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_enum.cc000066400000000000000000000303231334102242000323010ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor, bool immutable_api, Context* context) : descriptor_(descriptor), immutable_api_(immutable_api), context_(context), name_resolver_(context->GetNameResolver()) { for (int i = 0; i < descriptor_->value_count(); i++) { const EnumValueDescriptor* value = descriptor_->value(i); const EnumValueDescriptor* canonical_value = descriptor_->FindValueByNumber(value->number()); if (value == canonical_value) { canonical_values_.push_back(value); } else { Alias alias; alias.value = value; alias.canonical_value = canonical_value; aliases_.push_back(alias); } } } EnumGenerator::~EnumGenerator() {} void EnumGenerator::Generate(io::Printer* printer) { WriteEnumDocComment(printer, descriptor_); MaybePrintGeneratedAnnotation(context_, printer, descriptor_, immutable_api_); printer->Print( "public enum $classname$\n" " implements com.google.protobuf.ProtocolMessageEnum {\n", "classname", descriptor_->name()); printer->Annotate("classname", descriptor_); printer->Indent(); bool ordinal_is_index = true; string index_text = "ordinal()"; for (int i = 0; i < canonical_values_.size(); i++) { if (canonical_values_[i]->index() != i) { ordinal_is_index = false; index_text = "index"; break; } } for (int i = 0; i < canonical_values_.size(); i++) { std::map vars; vars["name"] = canonical_values_[i]->name(); vars["index"] = SimpleItoa(canonical_values_[i]->index()); vars["number"] = SimpleItoa(canonical_values_[i]->number()); WriteEnumValueDocComment(printer, canonical_values_[i]); if (canonical_values_[i]->options().deprecated()) { printer->Print("@java.lang.Deprecated\n"); } if (ordinal_is_index) { printer->Print(vars, "$name$($number$),\n"); } else { printer->Print(vars, "$name$($index$, $number$),\n"); } printer->Annotate("name", canonical_values_[i]); } if (SupportUnknownEnumValue(descriptor_->file())) { if (ordinal_is_index) { printer->Print("${$UNRECOGNIZED$}$(-1),\n", "{", "", "}", ""); } else { printer->Print("${$UNRECOGNIZED$}$(-1, -1),\n", "{", "", "}", ""); } printer->Annotate("{", "}", descriptor_); } printer->Print( ";\n" "\n"); // ----------------------------------------------------------------- for (int i = 0; i < aliases_.size(); i++) { std::map vars; vars["classname"] = descriptor_->name(); vars["name"] = aliases_[i].value->name(); vars["canonical_name"] = aliases_[i].canonical_value->name(); WriteEnumValueDocComment(printer, aliases_[i].value); printer->Print(vars, "public static final $classname$ $name$ = $canonical_name$;\n"); printer->Annotate("name", aliases_[i].value); } for (int i = 0; i < descriptor_->value_count(); i++) { std::map vars; vars["name"] = descriptor_->value(i)->name(); vars["number"] = SimpleItoa(descriptor_->value(i)->number()); vars["{"] = ""; vars["}"] = ""; WriteEnumValueDocComment(printer, descriptor_->value(i)); printer->Print(vars, "public static final int ${$$name$_VALUE$}$ = $number$;\n"); printer->Annotate("{", "}", descriptor_->value(i)); } printer->Print("\n"); // ----------------------------------------------------------------- printer->Print( "\n" "public final int getNumber() {\n"); if (SupportUnknownEnumValue(descriptor_->file())) { if (ordinal_is_index) { printer->Print( " if (this == UNRECOGNIZED) {\n" " throw new java.lang.IllegalArgumentException(\n" " \"Can't get the number of an unknown enum value.\");\n" " }\n"); } else { printer->Print( " if (index == -1) {\n" " throw new java.lang.IllegalArgumentException(\n" " \"Can't get the number of an unknown enum value.\");\n" " }\n"); } } printer->Print( " return value;\n" "}\n" "\n" "/**\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" "public static $classname$ forNumber(int value) {\n" " switch (value) {\n", "classname", descriptor_->name()); printer->Indent(); printer->Indent(); for (int i = 0; i < canonical_values_.size(); i++) { printer->Print( "case $number$: return $name$;\n", "name", canonical_values_[i]->name(), "number", SimpleItoa(canonical_values_[i]->number())); } printer->Outdent(); printer->Outdent(); printer->Print( " default: return null;\n" " }\n" "}\n" "\n" "public static com.google.protobuf.Internal.EnumLiteMap<$classname$>\n" " internalGetValueMap() {\n" " return internalValueMap;\n" "}\n" "private static final com.google.protobuf.Internal.EnumLiteMap<\n" " $classname$> internalValueMap =\n" " new com.google.protobuf.Internal.EnumLiteMap<$classname$>() {\n" " public $classname$ findValueByNumber(int number) {\n" " return $classname$.forNumber(number);\n" " }\n" " };\n" "\n", "classname", descriptor_->name()); // ----------------------------------------------------------------- // Reflection if (HasDescriptorMethods(descriptor_, context_->EnforceLite())) { printer->Print( "public final com.google.protobuf.Descriptors.EnumValueDescriptor\n" " getValueDescriptor() {\n" " return getDescriptor().getValues().get($index_text$);\n" "}\n" "public final com.google.protobuf.Descriptors.EnumDescriptor\n" " getDescriptorForType() {\n" " return getDescriptor();\n" "}\n" "public static final com.google.protobuf.Descriptors.EnumDescriptor\n" " getDescriptor() {\n", "index_text", index_text); // TODO(kenton): Cache statically? Note that we can't access descriptors // at module init time because it wouldn't work with descriptor.proto, but // we can cache the value the first time getDescriptor() is called. if (descriptor_->containing_type() == NULL) { // The class generated for the File fully populates the descriptor with // extensions in both the mutable and immutable cases. (In the mutable api // this is accomplished by attempting to load the immutable outer class). printer->Print( " return $file$.getDescriptor().getEnumTypes().get($index$);\n", "file", name_resolver_->GetClassName(descriptor_->file(), immutable_api_), "index", SimpleItoa(descriptor_->index())); } else { printer->Print( " return $parent$.$descriptor$.getEnumTypes().get($index$);\n", "parent", name_resolver_->GetClassName(descriptor_->containing_type(), immutable_api_), "descriptor", descriptor_->containing_type()->options() .no_standard_descriptor_accessor() ? "getDefaultInstance().getDescriptorForType()" : "getDescriptor()", "index", SimpleItoa(descriptor_->index())); } printer->Print( "}\n" "\n" "private static final $classname$[] VALUES = ", "classname", descriptor_->name()); if (CanUseEnumValues()) { // If the constants we are going to output are exactly the ones we // have declared in the Java enum in the same order, then we can use // the values() method that the Java compiler automatically generates // for every enum. printer->Print("values();\n"); } else { printer->Print( "{\n" " "); for (int i = 0; i < descriptor_->value_count(); i++) { printer->Print("$name$, ", "name", descriptor_->value(i)->name()); } printer->Print( "\n" "};\n"); } printer->Print( "\n" "public static $classname$ valueOf(\n" " com.google.protobuf.Descriptors.EnumValueDescriptor desc) {\n" " if (desc.getType() != getDescriptor()) {\n" " throw new java.lang.IllegalArgumentException(\n" " \"EnumValueDescriptor is not for this type.\");\n" " }\n", "classname", descriptor_->name()); if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print( " if (desc.getIndex() == -1) {\n" " return UNRECOGNIZED;\n" " }\n"); } printer->Print( " return VALUES[desc.getIndex()];\n" "}\n" "\n"); if (!ordinal_is_index) { printer->Print("private final int index;\n"); } } // ----------------------------------------------------------------- printer->Print( "private final int value;\n\n"); if (ordinal_is_index) { printer->Print( "private $classname$(int value) {\n", "classname", descriptor_->name()); } else { printer->Print( "private $classname$(int index, int value) {\n", "classname", descriptor_->name()); } if (HasDescriptorMethods(descriptor_, context_->EnforceLite()) && !ordinal_is_index) { printer->Print(" this.index = index;\n"); } printer->Print( " this.value = value;\n" "}\n"); printer->Print( "\n" "// @@protoc_insertion_point(enum_scope:$full_name$)\n", "full_name", descriptor_->full_name()); printer->Outdent(); printer->Print("}\n\n"); } bool EnumGenerator::CanUseEnumValues() { if (canonical_values_.size() != descriptor_->value_count()) { return false; } for (int i = 0; i < descriptor_->value_count(); i++) { if (descriptor_->value(i)->name() != canonical_values_[i]->name()) { return false; } } return true; } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_enum.h000066400000000000000000000064451334102242000321530ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace java { class EnumGenerator { public: EnumGenerator(const EnumDescriptor* descriptor, bool immutable_api, Context* context); ~EnumGenerator(); void Generate(io::Printer* printer); private: const EnumDescriptor* descriptor_; // The proto language allows multiple enum constants to have the same numeric // value. Java, however, does not allow multiple enum constants to be // considered equivalent. We treat the first defined constant for any // given numeric value as "canonical" and the rest as aliases of that // canonical value. std::vector canonical_values_; struct Alias { const EnumValueDescriptor* value; const EnumValueDescriptor* canonical_value; }; std::vector aliases_; bool immutable_api_; Context* context_; ClassNameResolver* name_resolver_; bool CanUseEnumValues(); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc000066400000000000000000001076431334102242000334560ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { void SetEnumVariables(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, const FieldGeneratorInfo* info, ClassNameResolver* name_resolver, std::map* variables) { SetCommonFieldVariables(descriptor, info, variables); (*variables)["type"] = name_resolver->GetImmutableClassName(descriptor->enum_type()); (*variables)["mutable_type"] = name_resolver->GetMutableClassName(descriptor->enum_type()); (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver); (*variables)["default_number"] = SimpleItoa( descriptor->default_value_enum()->number()); (*variables)["tag"] = SimpleItoa(static_cast(internal::WireFormat::MakeTag(descriptor))); (*variables)["tag_size"] = SimpleItoa( internal::WireFormat::TagSize(descriptor->number(), GetType(descriptor))); // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported // by the proto compiler (*variables)["deprecation"] = descriptor->options().deprecated() ? "@java.lang.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. (*variables)["for_number"] = "valueOf"; if (SupportFieldPresence(descriptor->file())) { // For singular messages and builders, one bit is used for the hasField bit. (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); // Note that these have a trailing ";". (*variables)["set_has_field_bit_message"] = GenerateSetBit(messageBitIndex) + ";"; (*variables)["set_has_field_bit_builder"] = GenerateSetBit(builderBitIndex) + ";"; (*variables)["clear_has_field_bit_builder"] = GenerateClearBit(builderBitIndex) + ";"; (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex); } else { (*variables)["set_has_field_bit_message"] = ""; (*variables)["set_has_field_bit_builder"] = ""; (*variables)["clear_has_field_bit_builder"] = ""; (*variables)["is_field_present_message"] = (*variables)["name"] + "_ != " + (*variables)["default"] + ".getNumber()"; } // For repated builders, one bit is used for whether the array is immutable. (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); // For repeated fields, one bit is used for whether the array is immutable // in the parsing constructor. (*variables)["get_mutable_bit_parser"] = GenerateGetBitMutableLocal(builderBitIndex); (*variables)["set_mutable_bit_parser"] = GenerateSetBitMutableLocal(builderBitIndex); (*variables)["get_has_field_bit_from_local"] = GenerateGetBitFromLocal(builderBitIndex); (*variables)["set_has_field_bit_to_local"] = GenerateSetBitToLocal(messageBitIndex); if (SupportUnknownEnumValue(descriptor->file())) { (*variables)["unknown"] = (*variables)["type"] + ".UNRECOGNIZED"; } else { (*variables)["unknown"] = (*variables)["default"]; } } } // namespace // =================================================================== ImmutableEnumFieldGenerator:: ImmutableEnumFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), name_resolver_(context->GetNameResolver()) { SetEnumVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } ImmutableEnumFieldGenerator::~ImmutableEnumFieldGenerator() {} int ImmutableEnumFieldGenerator::GetNumBitsForMessage() const { return 1; } int ImmutableEnumFieldGenerator::GetNumBitsForBuilder() const { return 1; } void ImmutableEnumFieldGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$boolean has$capitalized_name$();\n"); } if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$int get$capitalized_name$Value();\n"); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n"); } void ImmutableEnumFieldGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private int $name$_;\n"); PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n" " return $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " $type$ result = $type$.$for_number$($name$_);\n" " return result == null ? $unknown$ : result;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableEnumFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { printer->Print(variables_, "private int $name$_ = $default_number$;\n"); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_builder$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n" " return $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder " "${$set$capitalized_name$Value$}$(int value) {\n" " $name$_ = value;\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " $type$ result = $type$.$for_number$($name$_);\n" " return result == null ? $unknown$ : result;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " $set_has_field_bit_builder$\n" " $name$_ = value.getNumber();\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " $clear_has_field_bit_builder$\n" " $name$_ = $default_number$;\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableEnumFieldGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for enums } void ImmutableEnumFieldGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default_number$;\n"); } void ImmutableEnumFieldGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default_number$;\n" "$clear_has_field_bit_builder$\n"); } void ImmutableEnumFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "if (other.has$capitalized_name$()) {\n" " set$capitalized_name$(other.get$capitalized_name$());\n" "}\n"); } else if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "if (other.$name$_ != $default_number$) {\n" " set$capitalized_name$Value(other.get$capitalized_name$Value());\n" "}\n"); } else { GOOGLE_LOG(FATAL) << "Can't reach here."; } } void ImmutableEnumFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "if ($get_has_field_bit_from_local$) {\n" " $set_has_field_bit_to_local$;\n" "}\n"); } printer->Print(variables_, "result.$name$_ = $name$_;\n"); } void ImmutableEnumFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "int rawValue = input.readEnum();\n" "$set_has_field_bit_message$\n" "$name$_ = rawValue;\n"); } else { printer->Print(variables_, "int rawValue = input.readEnum();\n" "$type$ value = $type$.$for_number$(rawValue);\n" "if (value == null) {\n" " unknownFields.mergeVarintField($number$, rawValue);\n" "} else {\n" " $set_has_field_bit_message$\n" " $name$_ = rawValue;\n" "}\n"); } } void ImmutableEnumFieldGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { // noop for enums } void ImmutableEnumFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " output.writeEnum($number$, $name$_);\n" "}\n"); } void ImmutableEnumFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeEnumSize($number$, $name$_);\n" "}\n"); } void ImmutableEnumFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && $name$_ == other.$name$_;\n"); } void ImmutableEnumFieldGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n" "hash = (53 * hash) + $name$_;\n"); } string ImmutableEnumFieldGenerator::GetBoxedType() const { return name_resolver_->GetImmutableClassName(descriptor_->enum_type()); } // =================================================================== ImmutableEnumOneofFieldGenerator:: ImmutableEnumOneofFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutableEnumFieldGenerator( descriptor, messageBitIndex, builderBitIndex, context) { const OneofGeneratorInfo* info = context->GetOneofGeneratorInfo(descriptor->containing_oneof()); SetCommonOneofVariables(descriptor, info, &variables_); } ImmutableEnumOneofFieldGenerator:: ~ImmutableEnumOneofFieldGenerator() {} void ImmutableEnumOneofFieldGenerator:: GenerateMembers(io::Printer* printer) const { PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n" " if ($has_oneof_case_message$) {\n" " return (java.lang.Integer) $oneof_name$_;\n" " }\n" " return $default_number$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " $type$ result = $type$.$for_number$(\n" " (java.lang.Integer) $oneof_name$_);\n" " return result == null ? $unknown$ : result;\n" " }\n" " return $default$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableEnumOneofFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n" " if ($has_oneof_case_message$) {\n" " return ((java.lang.Integer) $oneof_name$_).intValue();\n" " }\n" " return $default_number$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder " "${$set$capitalized_name$Value$}$(int value) {\n" " $set_oneof_case_message$;\n" " $oneof_name$_ = value;\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " $type$ result = $type$.$for_number$(\n" " (java.lang.Integer) $oneof_name$_);\n" " return result == null ? $unknown$ : result;\n" " }\n" " return $default$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " $set_oneof_case_message$;\n" " $oneof_name$_ = value.getNumber();\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " $clear_oneof_case_message$;\n" " $oneof_name$_ = null;\n" " $on_changed$\n" " }\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableEnumOneofFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " result.$oneof_name$_ = $oneof_name$_;\n" "}\n"); } void ImmutableEnumOneofFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "set$capitalized_name$Value(other.get$capitalized_name$Value());\n"); } else { printer->Print(variables_, "set$capitalized_name$(other.get$capitalized_name$());\n"); } } void ImmutableEnumOneofFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "int rawValue = input.readEnum();\n" "$set_oneof_case_message$;\n" "$oneof_name$_ = rawValue;\n"); } else { printer->Print(variables_, "int rawValue = input.readEnum();\n" "$type$ value = $type$.$for_number$(rawValue);\n" "if (value == null) {\n" " unknownFields.mergeVarintField($number$, rawValue);\n" "} else {\n" " $set_oneof_case_message$;\n" " $oneof_name$_ = rawValue;\n" "}\n"); } } void ImmutableEnumOneofFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " output.writeEnum($number$, ((java.lang.Integer) $oneof_name$_));\n" "}\n"); } void ImmutableEnumOneofFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeEnumSize($number$, ((java.lang.Integer) $oneof_name$_));\n" "}\n"); } void ImmutableEnumOneofFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "result = result && get$capitalized_name$Value()\n" " == other.get$capitalized_name$Value();\n"); } else { printer->Print(variables_, "result = result && get$capitalized_name$()\n" " .equals(other.get$capitalized_name$());\n"); } } void ImmutableEnumOneofFieldGenerator:: GenerateHashCode(io::Printer* printer) const { if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n" "hash = (53 * hash) + get$capitalized_name$Value();\n"); } else { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n" "hash = (53 * hash) + get$capitalized_name$().getNumber();\n"); } } // =================================================================== RepeatedImmutableEnumFieldGenerator:: RepeatedImmutableEnumFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetEnumVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } RepeatedImmutableEnumFieldGenerator::~RepeatedImmutableEnumFieldGenerator() {} int RepeatedImmutableEnumFieldGenerator::GetNumBitsForMessage() const { return 0; } int RepeatedImmutableEnumFieldGenerator::GetNumBitsForBuilder() const { return 1; } void RepeatedImmutableEnumFieldGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.util.List<$type$> get$capitalized_name$List();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$int get$capitalized_name$Count();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$(int index);\n"); if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.util.List\n" "get$capitalized_name$ValueList();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$int get$capitalized_name$Value(int index);\n"); } } void RepeatedImmutableEnumFieldGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private java.util.List $name$_;\n" "private static final com.google.protobuf.Internal.ListAdapter.Converter<\n" " java.lang.Integer, $type$> $name$_converter_ =\n" " new com.google.protobuf.Internal.ListAdapter.Converter<\n" " java.lang.Integer, $type$>() {\n" " public $type$ convert(java.lang.Integer from) {\n" " $type$ result = $type$.$for_number$(from);\n" " return result == null ? $unknown$ : result;\n" " }\n" " };\n"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$type$> " "${$get$capitalized_name$List$}$() {\n" " return new com.google.protobuf.Internal.ListAdapter<\n" " java.lang.Integer, $type$>($name$_, $name$_converter_);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return $name$_.size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n" " return $name$_converter_.convert($name$_.get(index));\n" "}\n"); printer->Annotate("{", "}", descriptor_); if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List\n" "${$get$capitalized_name$ValueList$}$() {\n" " return $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$(int index) {\n" " return $name$_.get(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); } if (descriptor_->is_packed() && context_->HasGeneratedMethods(descriptor_->containing_type())) { printer->Print(variables_, "private int $name$MemoizedSerializedSize;\n"); } } void RepeatedImmutableEnumFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { printer->Print(variables_, // One field is the list and the other field keeps track of whether the // list is immutable. If it's immutable, the invariant is that it must // either an instance of Collections.emptyList() or it's an ArrayList // wrapped in a Collections.unmodifiableList() wrapper and nobody else has // a refererence to the underlying ArrayList. This invariant allows us to // share instances of lists between protocol buffers avoiding expensive // memory allocations. Note, immutable is a strong guarantee here -- not // just that the list cannot be modified via the reference but that the // list can never be modified. "private java.util.List $name$_ =\n" " java.util.Collections.emptyList();\n" "private void ensure$capitalized_name$IsMutable() {\n" " if (!$get_mutable_bit_builder$) {\n" " $name$_ = new java.util.ArrayList($name$_);\n" " $set_mutable_bit_builder$;\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, // Note: We return an unmodifiable list because otherwise the caller // could hold on to the returned list and modify it after the message // has been built, thus mutating the message which is supposed to be // immutable. "$deprecation$public java.util.List<$type$> " "${$get$capitalized_name$List$}$() {\n" " return new com.google.protobuf.Internal.ListAdapter<\n" " java.lang.Integer, $type$>($name$_, $name$_converter_);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return $name$_.size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n" " return $name$_converter_.convert($name$_.get(index));\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " int index, $type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.set(index, value.getNumber());\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(value.getNumber());\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n" " java.lang.Iterable values) {\n" " ensure$capitalized_name$IsMutable();\n" " for ($type$ value : values) {\n" " $name$_.add(value.getNumber());\n" " }\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " $name$_ = java.util.Collections.emptyList();\n" " $clear_mutable_bit_builder$;\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List\n" "${$get$capitalized_name$ValueList$}$() {\n" " return java.util.Collections.unmodifiableList($name$_);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$(int index) {\n" " return $name$_.get(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$Value$}$(\n" " int index, int value) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.set(index, value);\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder " "${$add$capitalized_name$Value$}$(int value) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(value);\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$addAll$capitalized_name$Value$}$(\n" " java.lang.Iterable values) {\n" " ensure$capitalized_name$IsMutable();\n" " for (int value : values) {\n" " $name$_.add(value);\n" " }\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } } void RepeatedImmutableEnumFieldGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for enums } void RepeatedImmutableEnumFieldGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n"); } void RepeatedImmutableEnumFieldGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n" "$clear_mutable_bit_builder$;\n"); } void RepeatedImmutableEnumFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { // The code below does two optimizations: // 1. If the other list is empty, there's nothing to do. This ensures we // don't allocate a new array if we already have an immutable one. // 2. If the other list is non-empty and our current list is empty, we can // reuse the other list which is guaranteed to be immutable. printer->Print(variables_, "if (!other.$name$_.isEmpty()) {\n" " if ($name$_.isEmpty()) {\n" " $name$_ = other.$name$_;\n" " $clear_mutable_bit_builder$;\n" " } else {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.addAll(other.$name$_);\n" " }\n" " $on_changed$\n" "}\n"); } void RepeatedImmutableEnumFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { // The code below ensures that the result has an immutable list. If our // list is immutable, we can just reuse it. If not, we make it immutable. printer->Print(variables_, "if ($get_mutable_bit_builder$) {\n" " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" " $clear_mutable_bit_builder$;\n" "}\n" "result.$name$_ = $name$_;\n"); } void RepeatedImmutableEnumFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { // Read and store the enum if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "int rawValue = input.readEnum();\n" "if (!$get_mutable_bit_parser$) {\n" " $name$_ = new java.util.ArrayList();\n" " $set_mutable_bit_parser$;\n" "}\n" "$name$_.add(rawValue);\n"); } else { printer->Print(variables_, "int rawValue = input.readEnum();\n" "$type$ value = $type$.$for_number$(rawValue);\n" "if (value == null) {\n" " unknownFields.mergeVarintField($number$, rawValue);\n" "} else {\n" " if (!$get_mutable_bit_parser$) {\n" " $name$_ = new java.util.ArrayList();\n" " $set_mutable_bit_parser$;\n" " }\n" " $name$_.add(rawValue);\n" "}\n"); } } void RepeatedImmutableEnumFieldGenerator:: GenerateParsingCodeFromPacked(io::Printer* printer) const { // Wrap GenerateParsingCode's contents with a while loop. printer->Print(variables_, "int length = input.readRawVarint32();\n" "int oldLimit = input.pushLimit(length);\n" "while(input.getBytesUntilLimit() > 0) {\n"); printer->Indent(); GenerateParsingCode(printer); printer->Outdent(); printer->Print(variables_, "}\n" "input.popLimit(oldLimit);\n"); } void RepeatedImmutableEnumFieldGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { printer->Print(variables_, "if ($get_mutable_bit_parser$) {\n" " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" "}\n"); } void RepeatedImmutableEnumFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { if (descriptor_->is_packed()) { printer->Print(variables_, "if (get$capitalized_name$List().size() > 0) {\n" " output.writeUInt32NoTag($tag$);\n" " output.writeUInt32NoTag($name$MemoizedSerializedSize);\n" "}\n" "for (int i = 0; i < $name$_.size(); i++) {\n" " output.writeEnumNoTag($name$_.get(i));\n" "}\n"); } else { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " output.writeEnum($number$, $name$_.get(i));\n" "}\n"); } } void RepeatedImmutableEnumFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "{\n" " int dataSize = 0;\n"); printer->Indent(); printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " dataSize += com.google.protobuf.CodedOutputStream\n" " .computeEnumSizeNoTag($name$_.get(i));\n" "}\n"); printer->Print( "size += dataSize;\n"); if (descriptor_->is_packed()) { printer->Print(variables_, "if (!get$capitalized_name$List().isEmpty()) {" " size += $tag_size$;\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeUInt32SizeNoTag(dataSize);\n" "}"); } else { printer->Print(variables_, "size += $tag_size$ * $name$_.size();\n"); } // cache the data size for packed fields. if (descriptor_->is_packed()) { printer->Print(variables_, "$name$MemoizedSerializedSize = dataSize;\n"); } printer->Outdent(); printer->Print("}\n"); } void RepeatedImmutableEnumFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && $name$_.equals(other.$name$_);\n"); } void RepeatedImmutableEnumFieldGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "if (get$capitalized_name$Count() > 0) {\n" " hash = (37 * hash) + $constant_name$;\n" " hash = (53 * hash) + $name$_.hashCode();\n" "}\n"); } string RepeatedImmutableEnumFieldGenerator::GetBoxedType() const { return name_resolver_->GetImmutableClassName(descriptor_->enum_type()); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_enum_field.h000066400000000000000000000145271334102242000333160ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } } namespace protobuf { namespace compiler { namespace java { class ImmutableEnumFieldGenerator : public ImmutableFieldGenerator { public: explicit ImmutableEnumFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableEnumFieldGenerator(); // implements ImmutableFieldGenerator --------------------------------------- int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; protected: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableEnumFieldGenerator); }; class ImmutableEnumOneofFieldGenerator : public ImmutableEnumFieldGenerator { public: ImmutableEnumOneofFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableEnumOneofFieldGenerator(); void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableEnumOneofFieldGenerator); }; class RepeatedImmutableEnumFieldGenerator : public ImmutableFieldGenerator { public: explicit RepeatedImmutableEnumFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~RepeatedImmutableEnumFieldGenerator(); // implements ImmutableFieldGenerator --------------------------------------- int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingCodeFromPacked(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; private: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableEnumFieldGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__ java_enum_field_lite.cc000066400000000000000000001067541334102242000344160ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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 #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { void SetEnumVariables(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, const FieldGeneratorInfo* info, ClassNameResolver* name_resolver, std::map* variables) { SetCommonFieldVariables(descriptor, info, variables); (*variables)["type"] = name_resolver->GetImmutableClassName(descriptor->enum_type()); (*variables)["mutable_type"] = name_resolver->GetMutableClassName(descriptor->enum_type()); (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver); (*variables)["default_number"] = SimpleItoa( descriptor->default_value_enum()->number()); (*variables)["tag"] = SimpleItoa(static_cast(internal::WireFormat::MakeTag(descriptor))); (*variables)["tag_size"] = SimpleItoa( internal::WireFormat::TagSize(descriptor->number(), GetType(descriptor))); // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported // by the proto compiler (*variables)["deprecation"] = descriptor->options().deprecated() ? "@java.lang.Deprecated " : ""; (*variables)["required"] = descriptor->is_required() ? "true" : "false"; if (SupportFieldPresence(descriptor->file())) { // For singular messages and builders, one bit is used for the hasField bit. (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); // Note that these have a trailing ";". (*variables)["set_has_field_bit_message"] = GenerateSetBit(messageBitIndex) + ";"; (*variables)["clear_has_field_bit_message"] = GenerateClearBit(messageBitIndex) + ";"; (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex); } else { (*variables)["set_has_field_bit_message"] = ""; (*variables)["clear_has_field_bit_message"] = ""; (*variables)["is_field_present_message"] = (*variables)["name"] + "_ != " + (*variables)["default"] + ".getNumber()"; } // For repeated builders, the underlying list tracks mutability state. (*variables)["is_mutable"] = (*variables)["name"] + "_.isModifiable()"; (*variables)["get_has_field_bit_from_local"] = GenerateGetBitFromLocal(builderBitIndex); (*variables)["set_has_field_bit_to_local"] = GenerateSetBitToLocal(messageBitIndex); if (SupportUnknownEnumValue(descriptor->file())) { (*variables)["unknown"] = (*variables)["type"] + ".UNRECOGNIZED"; } else { (*variables)["unknown"] = (*variables)["default"]; } } } // namespace // =================================================================== ImmutableEnumFieldLiteGenerator:: ImmutableEnumFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), name_resolver_(context->GetNameResolver()) { SetEnumVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } ImmutableEnumFieldLiteGenerator::~ImmutableEnumFieldLiteGenerator() {} int ImmutableEnumFieldLiteGenerator::GetNumBitsForMessage() const { return 1; } int ImmutableEnumFieldLiteGenerator::GetNumBitsForBuilder() const { return 0; } void ImmutableEnumFieldLiteGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$boolean has$capitalized_name$();\n"); } if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$int get$capitalized_name$Value();\n"); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n"); } void ImmutableEnumFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private int $name$_;\n"); PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n" " return $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " $type$ result = $type$.forNumber($name$_);\n" " return result == null ? $unknown$ : result;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Generate private setters for the builder to proxy into. if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$Value(int value) {\n" " $set_has_field_bit_message$" " $name$_ = value;\n" "}\n"); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " $set_has_field_bit_message$\n" " $name$_ = value.getNumber();\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " $clear_has_field_bit_message$\n" " $name$_ = $default_number$;\n" "}\n"); } void ImmutableEnumFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return instance.has$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); } if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n" " return instance.get$capitalized_name$Value();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder " "${$set$capitalized_name$Value$}$(int value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$Value(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return instance.get$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableEnumFieldLiteGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for enums } void ImmutableEnumFieldLiteGenerator:: GenerateInitializationCode(io::Printer* printer) const { if (!IsDefaultValueJavaDefault(descriptor_)) { printer->Print(variables_, "$name$_ = $default_number$;\n"); } } void ImmutableEnumFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "$name$_ = visitor.visitInt(has$capitalized_name$(), $name$_,\n" " other.has$capitalized_name$(), other.$name$_);\n"); } else if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "$name$_ = visitor.visitInt($name$_ != $default_number$, $name$_," " other.$name$_ != $default_number$, other.$name$_);\n"); } else { GOOGLE_LOG(FATAL) << "Can't reach here."; } } void ImmutableEnumFieldLiteGenerator:: GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const { // noop for scalars } void ImmutableEnumFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "int rawValue = input.readEnum();\n" "$set_has_field_bit_message$\n" "$name$_ = rawValue;\n"); } else { printer->Print(variables_, "int rawValue = input.readEnum();\n" "$type$ value = $type$.forNumber(rawValue);\n" "if (value == null) {\n" " super.mergeVarintField($number$, rawValue);\n" "} else {\n" " $set_has_field_bit_message$\n" " $name$_ = rawValue;\n" "}\n"); } } void ImmutableEnumFieldLiteGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { // noop for enums } void ImmutableEnumFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " output.writeEnum($number$, $name$_);\n" "}\n"); } void ImmutableEnumFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeEnumSize($number$, $name$_);\n" "}\n"); } void ImmutableEnumFieldLiteGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && $name$_ == other.$name$_;\n"); } void ImmutableEnumFieldLiteGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n" "hash = (53 * hash) + $name$_;\n"); } string ImmutableEnumFieldLiteGenerator::GetBoxedType() const { return name_resolver_->GetImmutableClassName(descriptor_->enum_type()); } // =================================================================== ImmutableEnumOneofFieldLiteGenerator:: ImmutableEnumOneofFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutableEnumFieldLiteGenerator( descriptor, messageBitIndex, builderBitIndex, context) { const OneofGeneratorInfo* info = context->GetOneofGeneratorInfo(descriptor->containing_oneof()); SetCommonOneofVariables(descriptor, info, &variables_); } ImmutableEnumOneofFieldLiteGenerator:: ~ImmutableEnumOneofFieldLiteGenerator() {} void ImmutableEnumOneofFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n" " if ($has_oneof_case_message$) {\n" " return (java.lang.Integer) $oneof_name$_;\n" " }\n" " return $default_number$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " $type$ result = $type$.forNumber((java.lang.Integer) $oneof_name$_);\n" " return result == null ? $unknown$ : result;\n" " }\n" " return $default$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Generate private setters for the builder to proxy into. if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$Value(int value) {\n" " $set_oneof_case_message$;\n" " $oneof_name$_ = value;\n" "}\n"); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " $set_oneof_case_message$;\n" " $oneof_name$_ = value.getNumber();\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " if ($has_oneof_case_message$) {\n" " $clear_oneof_case_message$;\n" " $oneof_name$_ = null;\n" " }\n" "}\n"); } void ImmutableEnumOneofFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return instance.has$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); } if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n" " return instance.get$capitalized_name$Value();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder " "${$set$capitalized_name$Value$}$(int value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$Value(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return instance.get$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableEnumOneofFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print(variables_, "$oneof_name$_ = visitor.visitOneofInt(\n" " $has_oneof_case_message$, $oneof_name$_, other.$oneof_name$_);\n"); } void ImmutableEnumOneofFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "int rawValue = input.readEnum();\n" "$set_oneof_case_message$;\n" "$oneof_name$_ = rawValue;\n"); } else { printer->Print(variables_, "int rawValue = input.readEnum();\n" "$type$ value = $type$.forNumber(rawValue);\n" "if (value == null) {\n" " super.mergeVarintField($number$, rawValue);\n" "} else {\n" " $set_oneof_case_message$;\n" " $oneof_name$_ = rawValue;\n" "}\n"); } } void ImmutableEnumOneofFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " output.writeEnum($number$, ((java.lang.Integer) $oneof_name$_));\n" "}\n"); } void ImmutableEnumOneofFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeEnumSize($number$, ((java.lang.Integer) $oneof_name$_));\n" "}\n"); } void ImmutableEnumOneofFieldLiteGenerator:: GenerateEqualsCode(io::Printer* printer) const { if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "result = result && get$capitalized_name$Value()\n" " == other.get$capitalized_name$Value();\n"); } else { printer->Print(variables_, "result = result && get$capitalized_name$()\n" " .equals(other.get$capitalized_name$());\n"); } } void ImmutableEnumOneofFieldLiteGenerator:: GenerateHashCode(io::Printer* printer) const { if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n" "hash = (53 * hash) + get$capitalized_name$Value();\n"); } else { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n" "hash = (53 * hash) + get$capitalized_name$().getNumber();\n"); } } // =================================================================== RepeatedImmutableEnumFieldLiteGenerator:: RepeatedImmutableEnumFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetEnumVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } RepeatedImmutableEnumFieldLiteGenerator:: ~RepeatedImmutableEnumFieldLiteGenerator() {} int RepeatedImmutableEnumFieldLiteGenerator::GetNumBitsForMessage() const { return 0; } int RepeatedImmutableEnumFieldLiteGenerator::GetNumBitsForBuilder() const { return 0; } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.util.List<$type$> get$capitalized_name$List();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$int get$capitalized_name$Count();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$(int index);\n"); if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.util.List\n" "get$capitalized_name$ValueList();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$int get$capitalized_name$Value(int index);\n"); } } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private com.google.protobuf.Internal.IntList $name$_;\n" "private static final com.google.protobuf.Internal.ListAdapter.Converter<\n" " java.lang.Integer, $type$> $name$_converter_ =\n" " new com.google.protobuf.Internal.ListAdapter.Converter<\n" " java.lang.Integer, $type$>() {\n" " public $type$ convert(java.lang.Integer from) {\n" " $type$ result = $type$.forNumber(from);\n" " return result == null ? $unknown$ : result;\n" " }\n" " };\n"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$type$> " "${$get$capitalized_name$List$}$() {\n" " return new com.google.protobuf.Internal.ListAdapter<\n" " java.lang.Integer, $type$>($name$_, $name$_converter_);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return $name$_.size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n" " return $name$_converter_.convert($name$_.getInt(index));\n" "}\n"); printer->Annotate("{", "}", descriptor_); if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List\n" "${$get$capitalized_name$ValueList$}$() {\n" " return $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$(int index) {\n" " return $name$_.getInt(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); } if (descriptor_->is_packed() && context_->HasGeneratedMethods(descriptor_->containing_type())) { printer->Print(variables_, "private int $name$MemoizedSerializedSize;\n"); } // Generate private setters for the builder to proxy into. printer->Print(variables_, "private void ensure$capitalized_name$IsMutable() {\n" " if (!$is_mutable$) {\n" " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " int index, $type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.setInt(index, value.getNumber());\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.addInt(value.getNumber());\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void addAll$capitalized_name$(\n" " java.lang.Iterable values) {\n" " ensure$capitalized_name$IsMutable();\n" " for ($type$ value : values) {\n" " $name$_.addInt(value.getNumber());\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " $name$_ = emptyIntList();\n" "}\n"); if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$Value(\n" " int index, int value) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.setInt(index, value);\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$Value(int value) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.addInt(value);\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void addAll$capitalized_name$Value(\n" " java.lang.Iterable values) {\n" " ensure$capitalized_name$IsMutable();\n" " for (int value : values) {\n" " $name$_.addInt(value);\n" " }\n" "}\n"); } } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$type$> " "${$get$capitalized_name$List$}$() {\n" " return instance.get$capitalized_name$List();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return instance.get$capitalized_name$Count();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n" " return instance.get$capitalized_name$(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " int index, $type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(index, value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n" " java.lang.Iterable values) {\n" " copyOnWrite();\n" " instance.addAll$capitalized_name$(values);" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List\n" "${$get$capitalized_name$ValueList$}$() {\n" " return java.util.Collections.unmodifiableList(\n" " instance.get$capitalized_name$ValueList());\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Value$}$(int index) {\n" " return instance.get$capitalized_name$Value(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$Value$}$(\n" " int index, int value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$Value(index, value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder " "${$add$capitalized_name$Value$}$(int value) {\n" " instance.add$capitalized_name$Value(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$addAll$capitalized_name$Value$}$(\n" " java.lang.Iterable values) {\n" " copyOnWrite();\n" " instance.addAll$capitalized_name$Value(values);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for enums } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = emptyIntList();\n"); } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print(variables_, "$name$_= visitor.visitIntList($name$_, other.$name$_);\n"); } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.makeImmutable();\n"); } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { // Read and store the enum printer->Print(variables_, "if (!$is_mutable$) {\n" " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" "}\n"); if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "$name$_.addInt(input.readEnum());\n"); } else { printer->Print(variables_, "int rawValue = input.readEnum();\n" "$type$ value = $type$.forNumber(rawValue);\n" "if (value == null) {\n" // We store the unknown value in unknown fields. " super.mergeVarintField($number$, rawValue);\n" "} else {\n" " $name$_.addInt(rawValue);\n" "}\n"); } } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateParsingCodeFromPacked(io::Printer* printer) const { printer->Print(variables_, "if (!$is_mutable$) {\n" " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" "}\n"); printer->Print(variables_, "int length = input.readRawVarint32();\n" "int oldLimit = input.pushLimit(length);\n" "while(input.getBytesUntilLimit() > 0) {\n"); printer->Indent(); // Read and store the enum if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print(variables_, "$name$_.addInt(input.readEnum());\n"); } else { printer->Print(variables_, "int rawValue = input.readEnum();\n" "$type$ value = $type$.forNumber(rawValue);\n" "if (value == null) {\n" // We store the unknown value in unknown fields. " super.mergeVarintField($number$, rawValue);\n" "} else {\n" " $name$_.addInt(rawValue);\n" "}\n"); } printer->Outdent(); printer->Print(variables_, "}\n" "input.popLimit(oldLimit);\n"); } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_mutable$) {\n" " $name$_.makeImmutable();\n" "}\n"); } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { if (descriptor_->is_packed()) { printer->Print(variables_, "if (get$capitalized_name$List().size() > 0) {\n" " output.writeUInt32NoTag($tag$);\n" " output.writeUInt32NoTag($name$MemoizedSerializedSize);\n" "}\n" "for (int i = 0; i < $name$_.size(); i++) {\n" " output.writeEnumNoTag($name$_.getInt(i));\n" "}\n"); } else { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " output.writeEnum($number$, $name$_.getInt(i));\n" "}\n"); } } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "{\n" " int dataSize = 0;\n"); printer->Indent(); printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " dataSize += com.google.protobuf.CodedOutputStream\n" " .computeEnumSizeNoTag($name$_.getInt(i));\n" "}\n"); printer->Print( "size += dataSize;\n"); if (descriptor_->is_packed()) { printer->Print(variables_, "if (!get$capitalized_name$List().isEmpty()) {" " size += $tag_size$;\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeUInt32SizeNoTag(dataSize);\n" "}"); } else { printer->Print(variables_, "size += $tag_size$ * $name$_.size();\n"); } // cache the data size for packed fields. if (descriptor_->is_packed()) { printer->Print(variables_, "$name$MemoizedSerializedSize = dataSize;\n"); } printer->Outdent(); printer->Print("}\n"); } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && $name$_.equals(other.$name$_);\n"); } void RepeatedImmutableEnumFieldLiteGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "if (get$capitalized_name$Count() > 0) {\n" " hash = (37 * hash) + $constant_name$;\n" " hash = (53 * hash) + $name$_.hashCode();\n" "}\n"); } string RepeatedImmutableEnumFieldLiteGenerator::GetBoxedType() const { return name_resolver_->GetImmutableClassName(descriptor_->enum_type()); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_enum_field_lite.h000066400000000000000000000144271334102242000342530ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_LITE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_LITE_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } } namespace protobuf { namespace compiler { namespace java { class ImmutableEnumFieldLiteGenerator : public ImmutableFieldLiteGenerator { public: explicit ImmutableEnumFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableEnumFieldLiteGenerator(); // implements ImmutableFieldLiteGenerator ------------------------------------ int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; protected: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableEnumFieldLiteGenerator); }; class ImmutableEnumOneofFieldLiteGenerator : public ImmutableEnumFieldLiteGenerator { public: ImmutableEnumOneofFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableEnumOneofFieldLiteGenerator(); void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableEnumOneofFieldLiteGenerator); }; class RepeatedImmutableEnumFieldLiteGenerator : public ImmutableFieldLiteGenerator { public: explicit RepeatedImmutableEnumFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~RepeatedImmutableEnumFieldLiteGenerator(); // implements ImmutableFieldLiteGenerator ------------------------------------ int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingCodeFromPacked(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; private: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableEnumFieldLiteGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_enum_lite.cc000066400000000000000000000172201334102242000333170ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { EnumLiteGenerator::EnumLiteGenerator(const EnumDescriptor* descriptor, bool immutable_api, Context* context) : descriptor_(descriptor), immutable_api_(immutable_api), context_(context), name_resolver_(context->GetNameResolver()) { for (int i = 0; i < descriptor_->value_count(); i++) { const EnumValueDescriptor* value = descriptor_->value(i); const EnumValueDescriptor* canonical_value = descriptor_->FindValueByNumber(value->number()); if (value == canonical_value) { canonical_values_.push_back(value); } else { Alias alias; alias.value = value; alias.canonical_value = canonical_value; aliases_.push_back(alias); } } } EnumLiteGenerator::~EnumLiteGenerator() {} void EnumLiteGenerator::Generate(io::Printer* printer) { WriteEnumDocComment(printer, descriptor_); MaybePrintGeneratedAnnotation(context_, printer, descriptor_, immutable_api_); printer->Print( "public enum $classname$\n" " implements com.google.protobuf.Internal.EnumLite {\n", "classname", descriptor_->name()); printer->Annotate("classname", descriptor_); printer->Indent(); for (int i = 0; i < canonical_values_.size(); i++) { std::map vars; vars["name"] = canonical_values_[i]->name(); vars["number"] = SimpleItoa(canonical_values_[i]->number()); WriteEnumValueDocComment(printer, canonical_values_[i]); if (canonical_values_[i]->options().deprecated()) { printer->Print("@java.lang.Deprecated\n"); } printer->Print(vars, "$name$($number$),\n"); printer->Annotate("name", canonical_values_[i]); } if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print("${$UNRECOGNIZED$}$(-1),\n", "{", "", "}", ""); printer->Annotate("{", "}", descriptor_); } printer->Print( ";\n" "\n"); // ----------------------------------------------------------------- for (int i = 0; i < aliases_.size(); i++) { std::map vars; vars["classname"] = descriptor_->name(); vars["name"] = aliases_[i].value->name(); vars["canonical_name"] = aliases_[i].canonical_value->name(); WriteEnumValueDocComment(printer, aliases_[i].value); printer->Print(vars, "public static final $classname$ $name$ = $canonical_name$;\n"); printer->Annotate("name", aliases_[i].value); } for (int i = 0; i < descriptor_->value_count(); i++) { std::map vars; vars["name"] = descriptor_->value(i)->name(); vars["number"] = SimpleItoa(descriptor_->value(i)->number()); vars["{"] = ""; vars["}"] = ""; WriteEnumValueDocComment(printer, descriptor_->value(i)); printer->Print(vars, "public static final int ${$$name$_VALUE$}$ = $number$;\n"); printer->Annotate("{", "}", descriptor_->value(i)); } printer->Print("\n"); // ----------------------------------------------------------------- printer->Print( "\n" "public final int getNumber() {\n"); if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print( " if (this == UNRECOGNIZED) {\n" " throw new java.lang.IllegalArgumentException(\n" " \"Can't get the number of an unknown enum value.\");\n" " }\n"); } printer->Print( " return value;\n" "}\n" "\n" "/**\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" "public static $classname$ forNumber(int value) {\n" " switch (value) {\n", "classname", descriptor_->name()); printer->Indent(); printer->Indent(); for (int i = 0; i < canonical_values_.size(); i++) { printer->Print( "case $number$: return $name$;\n", "name", canonical_values_[i]->name(), "number", SimpleItoa(canonical_values_[i]->number())); } printer->Outdent(); printer->Outdent(); printer->Print( " default: return null;\n" " }\n" "}\n" "\n" "public static com.google.protobuf.Internal.EnumLiteMap<$classname$>\n" " internalGetValueMap() {\n" " return internalValueMap;\n" "}\n" "private static final com.google.protobuf.Internal.EnumLiteMap<\n" " $classname$> internalValueMap =\n" " new com.google.protobuf.Internal.EnumLiteMap<$classname$>() {\n" " public $classname$ findValueByNumber(int number) {\n" " return $classname$.forNumber(number);\n" " }\n" " };\n" "\n", "classname", descriptor_->name()); printer->Print( "private final int value;\n\n" "private $classname$(int value) {\n", "classname", descriptor_->name()); printer->Print( " this.value = value;\n" "}\n"); printer->Print( "\n" "// @@protoc_insertion_point(enum_scope:$full_name$)\n", "full_name", descriptor_->full_name()); printer->Outdent(); printer->Print("}\n\n"); } bool EnumLiteGenerator::CanUseEnumValues() { if (canonical_values_.size() != descriptor_->value_count()) { return false; } for (int i = 0; i < descriptor_->value_count(); i++) { if (descriptor_->value(i)->name() != canonical_values_[i]->name()) { return false; } } return true; } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_enum_lite.h000066400000000000000000000065101334102242000331610ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_LITE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_LITE_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace java { class EnumLiteGenerator { public: EnumLiteGenerator(const EnumDescriptor* descriptor, bool immutable_api, Context* context); ~EnumLiteGenerator(); void Generate(io::Printer* printer); private: const EnumDescriptor* descriptor_; // The proto language allows multiple enum constants to have the same numeric // value. Java, however, does not allow multiple enum constants to be // considered equivalent. We treat the first defined constant for any // given numeric value as "canonical" and the rest as aliases of that // canonical value. std::vector canonical_values_; struct Alias { const EnumValueDescriptor* value; const EnumValueDescriptor* canonical_value; }; std::vector aliases_; bool immutable_api_; Context* context_; ClassNameResolver* name_resolver_; bool CanUseEnumValues(); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumLiteGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_extension.cc000066400000000000000000000152751334102242000333620ustar00rootroot00000000000000// 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 #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { ImmutableExtensionGenerator::ImmutableExtensionGenerator( const FieldDescriptor* descriptor, Context* context) : descriptor_(descriptor), context_(context), name_resolver_(context->GetNameResolver()) { if (descriptor_->extension_scope() != NULL) { scope_ = name_resolver_->GetImmutableClassName( descriptor_->extension_scope()); } else { scope_ = name_resolver_->GetImmutableClassName(descriptor_->file()); } } ImmutableExtensionGenerator::~ImmutableExtensionGenerator() {} // Initializes the vars referenced in the generated code templates. void ExtensionGenerator::InitTemplateVars( const FieldDescriptor* descriptor, const string& scope, bool immutable, ClassNameResolver* name_resolver, std::map* vars_pointer) { std::map &vars = *vars_pointer; vars["scope"] = scope; vars["name"] = UnderscoresToCamelCase(descriptor); vars["containing_type"] = name_resolver->GetClassName(descriptor->containing_type(), immutable); vars["number"] = SimpleItoa(descriptor->number()); vars["constant_name"] = FieldConstantName(descriptor); vars["index"] = SimpleItoa(descriptor->index()); vars["default"] = descriptor->is_repeated() ? "" : DefaultValue(descriptor, immutable, name_resolver); vars["type_constant"] = FieldTypeName(GetType(descriptor)); vars["packed"] = descriptor->is_packed() ? "true" : "false"; vars["enum_map"] = "null"; vars["prototype"] = "null"; JavaType java_type = GetJavaType(descriptor); string singular_type; switch (java_type) { case JAVATYPE_MESSAGE: singular_type = name_resolver->GetClassName(descriptor->message_type(), immutable); vars["prototype"] = singular_type + ".getDefaultInstance()"; break; case JAVATYPE_ENUM: singular_type = name_resolver->GetClassName(descriptor->enum_type(), immutable); vars["enum_map"] = singular_type + ".internalGetValueMap()"; break; case JAVATYPE_STRING: singular_type = "java.lang.String"; break; case JAVATYPE_BYTES: singular_type = immutable ? "com.google.protobuf.ByteString" : "byte[]"; break; default: singular_type = BoxedPrimitiveTypeName(java_type); break; } vars["type"] = descriptor->is_repeated() ? "java.util.List<" + singular_type + ">" : singular_type; vars["singular_type"] = singular_type; } void ImmutableExtensionGenerator::Generate(io::Printer* printer) { std::map vars; const bool kUseImmutableNames = true; InitTemplateVars(descriptor_, scope_, kUseImmutableNames, name_resolver_, &vars); printer->Print(vars, "public static final int $constant_name$ = $number$;\n"); WriteFieldDocComment(printer, descriptor_); if (descriptor_->extension_scope() == NULL) { // Non-nested printer->Print( vars, "public static final\n" " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" " $containing_type$,\n" " $type$> $name$ = com.google.protobuf.GeneratedMessage\n" " .newFileScopedGeneratedExtension(\n" " $singular_type$.class,\n" " $prototype$);\n"); } else { // Nested printer->Print( vars, "public static final\n" " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" " $containing_type$,\n" " $type$> $name$ = com.google.protobuf.GeneratedMessage\n" " .newMessageScopedGeneratedExtension(\n" " $scope$.getDefaultInstance(),\n" " $index$,\n" " $singular_type$.class,\n" " $prototype$);\n"); } } int ImmutableExtensionGenerator::GenerateNonNestedInitializationCode( io::Printer* printer) { int bytecode_estimate = 0; if (descriptor_->extension_scope() == NULL) { // Only applies to non-nested extensions. printer->Print( "$name$.internalInit(descriptor.getExtensions().get($index$));\n", "name", UnderscoresToCamelCase(descriptor_), "index", SimpleItoa(descriptor_->index())); bytecode_estimate += 21; } return bytecode_estimate; } int ImmutableExtensionGenerator::GenerateRegistrationCode( io::Printer* printer) { printer->Print( "registry.add($scope$.$name$);\n", "scope", scope_, "name", UnderscoresToCamelCase(descriptor_)); return 7; } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_extension.h000066400000000000000000000101561334102242000332150ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_EXTENSION_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_EXTENSION_H__ #include #include #include namespace google { namespace protobuf { class FieldDescriptor; // descriptor.h namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace java { // Generates code for an extension, which may be within the scope of some // message or may be at file scope. This is much simpler than FieldGenerator // since extensions are just simple identifiers with interesting types. class ExtensionGenerator { public: explicit ExtensionGenerator() {} virtual ~ExtensionGenerator() {} virtual void Generate(io::Printer* printer) = 0; // Returns an estimate of the number of bytes the printed code will compile to virtual int GenerateNonNestedInitializationCode(io::Printer* printer) = 0; // Returns an estimate of the number of bytes the printed code will compile to virtual int GenerateRegistrationCode(io::Printer* printer) = 0; protected: static void InitTemplateVars(const FieldDescriptor* descriptor, const string& scope, bool immutable, ClassNameResolver* name_resolver, std::map* vars_pointer); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator); }; class ImmutableExtensionGenerator : public ExtensionGenerator { public: explicit ImmutableExtensionGenerator(const FieldDescriptor* descriptor, Context* context); virtual ~ImmutableExtensionGenerator(); virtual void Generate(io::Printer* printer); virtual int GenerateNonNestedInitializationCode(io::Printer* printer); virtual int GenerateRegistrationCode(io::Printer* printer); protected: const FieldDescriptor* descriptor_; Context* context_; ClassNameResolver* name_resolver_; string scope_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableExtensionGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_EXTENSION_H__ java_extension_lite.cc000066400000000000000000000111601334102242000343050ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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 #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { ImmutableExtensionLiteGenerator::ImmutableExtensionLiteGenerator( const FieldDescriptor* descriptor, Context* context) : descriptor_(descriptor), context_(context), name_resolver_(context->GetNameResolver()) { if (descriptor_->extension_scope() != NULL) { scope_ = name_resolver_->GetImmutableClassName( descriptor_->extension_scope()); } else { scope_ = name_resolver_->GetImmutableClassName(descriptor_->file()); } } ImmutableExtensionLiteGenerator::~ImmutableExtensionLiteGenerator() {} void ImmutableExtensionLiteGenerator::Generate(io::Printer* printer) { std::map vars; const bool kUseImmutableNames = true; InitTemplateVars(descriptor_, scope_, kUseImmutableNames, name_resolver_, &vars); printer->Print(vars, "public static final int $constant_name$ = $number$;\n"); WriteFieldDocComment(printer, descriptor_); if (descriptor_->is_repeated()) { printer->Print( vars, "public static final\n" " com.google.protobuf.GeneratedMessageLite.GeneratedExtension<\n" " $containing_type$,\n" " $type$> $name$ = com.google.protobuf.GeneratedMessageLite\n" " .newRepeatedGeneratedExtension(\n" " $containing_type$.getDefaultInstance(),\n" " $prototype$,\n" " $enum_map$,\n" " $number$,\n" " com.google.protobuf.WireFormat.FieldType.$type_constant$,\n" " $packed$,\n" " $singular_type$.class);\n"); } else { printer->Print( vars, "public static final\n" " com.google.protobuf.GeneratedMessageLite.GeneratedExtension<\n" " $containing_type$,\n" " $type$> $name$ = com.google.protobuf.GeneratedMessageLite\n" " .newSingularGeneratedExtension(\n" " $containing_type$.getDefaultInstance(),\n" " $default$,\n" " $prototype$,\n" " $enum_map$,\n" " $number$,\n" " com.google.protobuf.WireFormat.FieldType.$type_constant$,\n" " $singular_type$.class);\n"); } } int ImmutableExtensionLiteGenerator::GenerateNonNestedInitializationCode( io::Printer* printer) { return 0; } int ImmutableExtensionLiteGenerator::GenerateRegistrationCode( io::Printer* printer) { printer->Print( "registry.add($scope$.$name$);\n", "scope", scope_, "name", UnderscoresToCamelCase(descriptor_)); return 7; } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_extension_lite.h000066400000000000000000000061551334102242000341570ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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_EXTENSION_LITE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_EXTENSION_LITE_H__ #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { // Generates code for a lite extension, which may be within the scope of some // message or may be at file scope. This is much simpler than FieldGenerator // since extensions are just simple identifiers with interesting types. class ImmutableExtensionLiteGenerator : public ExtensionGenerator { public: explicit ImmutableExtensionLiteGenerator(const FieldDescriptor* descriptor, Context* context); virtual ~ImmutableExtensionLiteGenerator(); virtual void Generate(io::Printer* printer); // Returns an estimate of the number of bytes the printed code will compile to virtual int GenerateNonNestedInitializationCode(io::Printer* printer); // Returns an estimate of the number of bytes the printed code will compile to virtual int GenerateRegistrationCode(io::Printer* printer); private: const FieldDescriptor* descriptor_; Context* context_; ClassNameResolver* name_resolver_; string scope_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableExtensionLiteGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_EXTENSION_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_field.cc000066400000000000000000000304521334102242000324230ustar00rootroot00000000000000// 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 #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { ImmutableFieldGenerator* MakeImmutableGenerator( const FieldDescriptor* field, int messageBitIndex, int builderBitIndex, Context* context) { if (field->is_repeated()) { switch (GetJavaType(field)) { case JAVATYPE_MESSAGE: if (IsMapEntry(field->message_type())) { return new ImmutableMapFieldGenerator( field, messageBitIndex, builderBitIndex, context); } else { return new RepeatedImmutableMessageFieldGenerator( field, messageBitIndex, builderBitIndex, context); } case JAVATYPE_ENUM: return new RepeatedImmutableEnumFieldGenerator( field, messageBitIndex, builderBitIndex, context); case JAVATYPE_STRING: return new RepeatedImmutableStringFieldGenerator( field, messageBitIndex, builderBitIndex, context); default: return new RepeatedImmutablePrimitiveFieldGenerator( field, messageBitIndex, builderBitIndex, context); } } else { if (field->containing_oneof()) { switch (GetJavaType(field)) { case JAVATYPE_MESSAGE: return new ImmutableMessageOneofFieldGenerator( field, messageBitIndex, builderBitIndex, context); case JAVATYPE_ENUM: return new ImmutableEnumOneofFieldGenerator( field, messageBitIndex, builderBitIndex, context); case JAVATYPE_STRING: return new ImmutableStringOneofFieldGenerator( field, messageBitIndex, builderBitIndex, context); default: return new ImmutablePrimitiveOneofFieldGenerator( field, messageBitIndex, builderBitIndex, context); } } else { switch (GetJavaType(field)) { case JAVATYPE_MESSAGE: return new ImmutableMessageFieldGenerator( field, messageBitIndex, builderBitIndex, context); case JAVATYPE_ENUM: return new ImmutableEnumFieldGenerator( field, messageBitIndex, builderBitIndex, context); case JAVATYPE_STRING: return new ImmutableStringFieldGenerator( field, messageBitIndex, builderBitIndex, context); default: return new ImmutablePrimitiveFieldGenerator( field, messageBitIndex, builderBitIndex, context); } } } } ImmutableFieldLiteGenerator* MakeImmutableLiteGenerator( const FieldDescriptor* field, int messageBitIndex, int builderBitIndex, Context* context) { if (field->is_repeated()) { switch (GetJavaType(field)) { case JAVATYPE_MESSAGE: if (IsMapEntry(field->message_type())) { return new ImmutableMapFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); } else { return new RepeatedImmutableMessageFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); } case JAVATYPE_ENUM: return new RepeatedImmutableEnumFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); case JAVATYPE_STRING: return new RepeatedImmutableStringFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); default: return new RepeatedImmutablePrimitiveFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); } } else { if (field->containing_oneof()) { switch (GetJavaType(field)) { case JAVATYPE_MESSAGE: return new ImmutableMessageOneofFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); case JAVATYPE_ENUM: return new ImmutableEnumOneofFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); case JAVATYPE_STRING: return new ImmutableStringOneofFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); default: return new ImmutablePrimitiveOneofFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); } } else { switch (GetJavaType(field)) { case JAVATYPE_MESSAGE: return new ImmutableMessageFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); case JAVATYPE_ENUM: return new ImmutableEnumFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); case JAVATYPE_STRING: return new ImmutableStringFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); default: return new ImmutablePrimitiveFieldLiteGenerator( field, messageBitIndex, builderBitIndex, context); } } } } static inline void ReportUnexpectedPackedFieldsCall(io::Printer* printer) { // Reaching here indicates a bug. Cases are: // - This FieldGenerator should support packing, // but this method should be overridden. // - This FieldGenerator doesn't support packing, and this method // should never have been called. GOOGLE_LOG(FATAL) << "GenerateParsingCodeFromPacked() " << "called on field generator that does not support packing."; } } // namespace ImmutableFieldGenerator::~ImmutableFieldGenerator() {} void ImmutableFieldGenerator:: GenerateParsingCodeFromPacked(io::Printer* printer) const { ReportUnexpectedPackedFieldsCall(printer); } ImmutableFieldLiteGenerator::~ImmutableFieldLiteGenerator() {} void ImmutableFieldLiteGenerator:: GenerateParsingCodeFromPacked(io::Printer* printer) const { ReportUnexpectedPackedFieldsCall(printer); } // =================================================================== template <> FieldGeneratorMap::FieldGeneratorMap( const Descriptor* descriptor, Context* context) : descriptor_(descriptor), field_generators_(new google::protobuf::scoped_ptr< ImmutableFieldGenerator>[descriptor->field_count()]) { // Construct all the FieldGenerators and assign them bit indices for their // bit fields. int messageBitIndex = 0; int builderBitIndex = 0; for (int i = 0; i < descriptor->field_count(); i++) { ImmutableFieldGenerator* generator = MakeImmutableGenerator( descriptor->field(i), messageBitIndex, builderBitIndex, context); field_generators_[i].reset(generator); messageBitIndex += generator->GetNumBitsForMessage(); builderBitIndex += generator->GetNumBitsForBuilder(); } } template<> FieldGeneratorMap::~FieldGeneratorMap() {} template <> FieldGeneratorMap::FieldGeneratorMap( const Descriptor* descriptor, Context* context) : descriptor_(descriptor), field_generators_(new google::protobuf::scoped_ptr< ImmutableFieldLiteGenerator>[descriptor->field_count()]) { // Construct all the FieldGenerators and assign them bit indices for their // bit fields. int messageBitIndex = 0; int builderBitIndex = 0; for (int i = 0; i < descriptor->field_count(); i++) { ImmutableFieldLiteGenerator* generator = MakeImmutableLiteGenerator( descriptor->field(i), messageBitIndex, builderBitIndex, context); field_generators_[i].reset(generator); messageBitIndex += generator->GetNumBitsForMessage(); builderBitIndex += generator->GetNumBitsForBuilder(); } } template<> FieldGeneratorMap::~FieldGeneratorMap() {} void SetCommonFieldVariables(const FieldDescriptor* descriptor, const FieldGeneratorInfo* info, std::map* variables) { (*variables)["field_name"] = descriptor->name(); (*variables)["name"] = info->name; (*variables)["classname"] = descriptor->containing_type()->name(); (*variables)["capitalized_name"] = info->capitalized_name; (*variables)["disambiguated_reason"] = info->disambiguated_reason; (*variables)["constant_name"] = FieldConstantName(descriptor); (*variables)["number"] = SimpleItoa(descriptor->number()); // These variables are placeholders to pick out the beginning and ends of // identifiers for annotations (when doing so with existing variables would // be ambiguous or impossible). They should never be set to anything but the // empty string. (*variables)["{"] = ""; (*variables)["}"] = ""; } void SetCommonOneofVariables(const FieldDescriptor* descriptor, const OneofGeneratorInfo* info, std::map* variables) { (*variables)["oneof_name"] = info->name; (*variables)["oneof_capitalized_name"] = info->capitalized_name; (*variables)["oneof_index"] = SimpleItoa(descriptor->containing_oneof()->index()); (*variables)["set_oneof_case_message"] = info->name + "Case_ = " + SimpleItoa(descriptor->number()); (*variables)["clear_oneof_case_message"] = info->name + "Case_ = 0"; (*variables)["has_oneof_case_message"] = info->name + "Case_ == " + SimpleItoa(descriptor->number()); } void PrintExtraFieldInfo(const std::map& variables, io::Printer* printer) { const std::map::const_iterator it = variables.find("disambiguated_reason"); if (it != variables.end() && !it->second.empty()) { printer->Print( variables, "// An alternative name is used for field \"$field_name$\" because:\n" "// $disambiguated_reason$\n"); } } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_field.h000066400000000000000000000165371334102242000322750ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_FIELD_H__ #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace java { class ImmutableFieldGenerator { public: ImmutableFieldGenerator() {} virtual ~ImmutableFieldGenerator(); virtual int GetNumBitsForMessage() const = 0; virtual int GetNumBitsForBuilder() const = 0; virtual void GenerateInterfaceMembers(io::Printer* printer) const = 0; virtual void GenerateMembers(io::Printer* printer) const = 0; virtual void GenerateBuilderMembers(io::Printer* printer) const = 0; virtual void GenerateInitializationCode(io::Printer* printer) const = 0; virtual void GenerateBuilderClearCode(io::Printer* printer) const = 0; virtual void GenerateMergingCode(io::Printer* printer) const = 0; virtual void GenerateBuildingCode(io::Printer* printer) const = 0; virtual void GenerateParsingCode(io::Printer* printer) const = 0; virtual void GenerateParsingCodeFromPacked(io::Printer* printer) const; virtual void GenerateParsingDoneCode(io::Printer* printer) const = 0; virtual void GenerateSerializationCode(io::Printer* printer) const = 0; virtual void GenerateSerializedSizeCode(io::Printer* printer) const = 0; virtual void GenerateFieldBuilderInitializationCode(io::Printer* printer) const = 0; virtual void GenerateEqualsCode(io::Printer* printer) const = 0; virtual void GenerateHashCode(io::Printer* printer) const = 0; virtual string GetBoxedType() const = 0; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableFieldGenerator); }; class ImmutableFieldLiteGenerator { public: ImmutableFieldLiteGenerator() {} virtual ~ImmutableFieldLiteGenerator(); virtual int GetNumBitsForMessage() const = 0; virtual int GetNumBitsForBuilder() const = 0; virtual void GenerateInterfaceMembers(io::Printer* printer) const = 0; virtual void GenerateMembers(io::Printer* printer) const = 0; virtual void GenerateBuilderMembers(io::Printer* printer) const = 0; virtual void GenerateInitializationCode(io::Printer* printer) const = 0; virtual void GenerateVisitCode(io::Printer* printer) const = 0; virtual void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const = 0; virtual void GenerateParsingCode(io::Printer* printer) const = 0; virtual void GenerateParsingCodeFromPacked(io::Printer* printer) const; virtual void GenerateParsingDoneCode(io::Printer* printer) const = 0; virtual void GenerateSerializationCode(io::Printer* printer) const = 0; virtual void GenerateSerializedSizeCode(io::Printer* printer) const = 0; virtual void GenerateFieldBuilderInitializationCode(io::Printer* printer) const = 0; virtual void GenerateEqualsCode(io::Printer* printer) const = 0; virtual void GenerateHashCode(io::Printer* printer) const = 0; virtual string GetBoxedType() const = 0; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableFieldLiteGenerator); }; // Convenience class which constructs FieldGenerators for a Descriptor. template class FieldGeneratorMap { public: explicit FieldGeneratorMap(const Descriptor* descriptor, Context* context); ~FieldGeneratorMap(); const FieldGeneratorType& get(const FieldDescriptor* field) const; private: const Descriptor* descriptor_; Context* context_; ClassNameResolver* name_resolver_; google::protobuf::scoped_array > field_generators_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap); }; template inline const FieldGeneratorType& FieldGeneratorMap::get(const FieldDescriptor* field) const { GOOGLE_CHECK_EQ(field->containing_type(), descriptor_); return *field_generators_[field->index()]; } // Instantiate template for mutable and immutable maps. template<> FieldGeneratorMap:: FieldGeneratorMap(const Descriptor* descriptor, Context* context); template<> FieldGeneratorMap::~FieldGeneratorMap(); // Field information used in FieldGeneartors. struct FieldGeneratorInfo { string name; string capitalized_name; string disambiguated_reason; }; // Oneof information used in OneofFieldGenerators. struct OneofGeneratorInfo { string name; string capitalized_name; }; // Set some common variables used in variable FieldGenerators. void SetCommonFieldVariables(const FieldDescriptor* descriptor, const FieldGeneratorInfo* info, std::map* variables); // Set some common oneof variables used in OneofFieldGenerators. void SetCommonOneofVariables(const FieldDescriptor* descriptor, const OneofGeneratorInfo* info, std::map* variables); // Print useful comments before a field's accessors. void PrintExtraFieldInfo(const std::map& variables, io::Printer* printer); } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_file.cc000066400000000000000000000654251334102242000322670ustar00rootroot00000000000000// 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 #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { struct FieldDescriptorCompare { bool operator ()(const FieldDescriptor* f1, const FieldDescriptor* f2) const { if(f1 == NULL) { return false; } if(f2 == NULL) { return true; } return f1->full_name() < f2->full_name(); } }; typedef std::set FieldDescriptorSet; // Recursively searches the given message to collect extensions. // Returns true if all the extensions can be recognized. The extensions will be // appended in to the extensions parameter. // Returns false when there are unknown fields, in which case the data in the // extensions output parameter is not reliable and should be discarded. bool CollectExtensions(const Message& message, FieldDescriptorSet* extensions) { const Reflection* reflection = message.GetReflection(); // There are unknown fields that could be extensions, thus this call fails. if (reflection->GetUnknownFields(message).field_count() > 0) return false; std::vector fields; reflection->ListFields(message, &fields); for (int i = 0; i < fields.size(); i++) { if (fields[i]->is_extension()) extensions->insert(fields[i]); if (GetJavaType(fields[i]) == JAVATYPE_MESSAGE) { if (fields[i]->is_repeated()) { int size = reflection->FieldSize(message, fields[i]); for (int j = 0; j < size; j++) { const Message& sub_message = reflection->GetRepeatedMessage(message, fields[i], j); if (!CollectExtensions(sub_message, extensions)) return false; } } else { const Message& sub_message = reflection->GetMessage(message, fields[i]); if (!CollectExtensions(sub_message, extensions)) return false; } } } return true; } // Finds all extensions in the given message and its sub-messages. If the // message contains unknown fields (which could be extensions), then those // extensions are defined in alternate_pool. // The message will be converted to a DynamicMessage backed by alternate_pool // in order to handle this case. void CollectExtensions(const FileDescriptorProto& file_proto, const DescriptorPool& alternate_pool, FieldDescriptorSet* extensions, const string& file_data) { if (!CollectExtensions(file_proto, extensions)) { // There are unknown fields in the file_proto, which are probably // extensions. We need to parse the data into a dynamic message based on the // builder-pool to find out all extensions. const Descriptor* file_proto_desc = alternate_pool.FindMessageTypeByName( file_proto.GetDescriptor()->full_name()); GOOGLE_CHECK(file_proto_desc) << "Find unknown fields in FileDescriptorProto when building " << file_proto.name() << ". It's likely that those fields are custom options, however, " "descriptor.proto is not in the transitive dependencies. " "This normally should not happen. Please report a bug."; DynamicMessageFactory factory; google::protobuf::scoped_ptr dynamic_file_proto( factory.GetPrototype(file_proto_desc)->New()); GOOGLE_CHECK(dynamic_file_proto.get() != NULL); GOOGLE_CHECK(dynamic_file_proto->ParseFromString(file_data)); // Collect the extensions again from the dynamic message. There should be no // more unknown fields this time, i.e. all the custom options should be // parsed as extensions now. extensions->clear(); GOOGLE_CHECK(CollectExtensions(*dynamic_file_proto, extensions)) << "Find unknown fields in FileDescriptorProto when building " << file_proto.name() << ". It's likely that those fields are custom options, however, " "those options cannot be recognized in the builder pool. " "This normally should not happen. Please report a bug."; } } // Our static initialization methods can become very, very large. // So large that if we aren't careful we end up blowing the JVM's // 64K bytes of bytecode/method. Fortunately, since these static // methods are executed only once near the beginning of a program, // there's usually plenty of stack space available and we can // extend our methods by simply chaining them to another method // with a tail call. This inserts the sequence call-next-method, // end this one, begin-next-method as needed. void MaybeRestartJavaMethod(io::Printer* printer, int *bytecode_estimate, int *method_num, const char *chain_statement, const char *method_decl) { // The goal here is to stay under 64K bytes of jvm bytecode/method, // since otherwise we hit a hardcoded limit in the jvm and javac will // then fail with the error "code too large". This limit lets our // estimates be off by a factor of two and still we're okay. static const int bytesPerMethod = kMaxStaticSize; if ((*bytecode_estimate) > bytesPerMethod) { ++(*method_num); printer->Print(chain_statement, "method_num", SimpleItoa(*method_num)); printer->Outdent(); printer->Print("}\n"); printer->Print(method_decl, "method_num", SimpleItoa(*method_num)); printer->Indent(); *bytecode_estimate = 0; } } } // namespace FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options, bool immutable_api) : file_(file), java_package_(FileJavaPackage(file, immutable_api)), message_generators_( new google::protobuf::scoped_ptr[file->message_type_count()]), extension_generators_( new google::protobuf::scoped_ptr[file->extension_count()]), context_(new Context(file, options)), name_resolver_(context_->GetNameResolver()), options_(options), immutable_api_(immutable_api) { classname_ = name_resolver_->GetFileClassName(file, immutable_api); 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))); } for (int i = 0; i < file_->extension_count(); ++i) { extension_generators_[i].reset( generator_factory_->NewExtensionGenerator(file_->extension(i))); } } FileGenerator::~FileGenerator() {} bool FileGenerator::Validate(string* error) { // Check that no class name matches the file's class name. This is a common // problem that leads to Java compile errors that can be hard to understand. // It's especially bad when using the java_multiple_files, since we would // end up overwriting the outer class with one of the inner ones. if (name_resolver_->HasConflictingClassName(file_, classname_)) { error->assign(file_->name()); error->append( ": Cannot generate Java output because the file's outer class name, \""); error->append(classname_); error->append( "\", matches the name of one of the types declared inside it. " "Please either rename the type or use the java_outer_classname " "option to specify a different outer class name for the .proto file."); return false; } return true; } void FileGenerator::Generate(io::Printer* printer) { // We don't import anything because we refer to all classes by their // fully-qualified names in the generated source. printer->Print( "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" "// source: $filename$\n" "\n", "filename", file_->name()); if (!java_package_.empty()) { printer->Print( "package $package$;\n" "\n", "package", java_package_); } PrintGeneratedAnnotation( printer, '$', options_.annotate_code ? classname_ + ".java.pb.meta" : ""); printer->Print( "$deprecation$public final class $classname$ {\n" " private $ctor$() {}\n", "deprecation", file_->options().deprecated() ? "@java.lang.Deprecated " : "", "classname", classname_, "ctor", classname_); printer->Annotate("classname", file_->name()); printer->Indent(); // ----------------------------------------------------------------- printer->Print( "public static void registerAllExtensions(\n" " com.google.protobuf.ExtensionRegistryLite registry) {\n"); printer->Indent(); for (int i = 0; i < file_->extension_count(); i++) { extension_generators_[i]->GenerateRegistrationCode(printer); } for (int i = 0; i < file_->message_type_count(); i++) { message_generators_[i]->GenerateExtensionRegistrationCode(printer); } printer->Outdent(); printer->Print( "}\n"); if (HasDescriptorMethods(file_, context_->EnforceLite())) { // Overload registerAllExtensions for the non-lite usage to // redundantly maintain the original signature (this is // redundant because ExtensionRegistryLite now invokes // ExtensionRegistry in the non-lite usage). Intent is // to remove this in the future. printer->Print( "\n" "public static void registerAllExtensions(\n" " com.google.protobuf.ExtensionRegistry registry) {\n" " registerAllExtensions(\n" " (com.google.protobuf.ExtensionRegistryLite) registry);\n" "}\n"); } // ----------------------------------------------------------------- if (!MultipleJavaFiles(file_, immutable_api_)) { for (int i = 0; i < file_->enum_type_count(); i++) { if (HasDescriptorMethods(file_, context_->EnforceLite())) { EnumGenerator(file_->enum_type(i), immutable_api_, context_.get()) .Generate(printer); } else { EnumLiteGenerator(file_->enum_type(i), immutable_api_, context_.get()) .Generate(printer); } } for (int i = 0; i < file_->message_type_count(); i++) { message_generators_[i]->GenerateInterface(printer); message_generators_[i]->Generate(printer); } if (HasGenericServices(file_, context_->EnforceLite())) { for (int i = 0; i < file_->service_count(); i++) { google::protobuf::scoped_ptr generator( generator_factory_->NewServiceGenerator(file_->service(i))); generator->Generate(printer); } } } // Extensions must be generated in the outer class since they are values, // not classes. for (int i = 0; i < file_->extension_count(); i++) { extension_generators_[i]->Generate(printer); } // Static variables. We'd like them to be final if possible, but due to // the JVM's 64k size limit on static blocks, we have to initialize some // of them in methods; thus they cannot be final. int static_block_bytecode_estimate = 0; for (int i = 0; i < file_->message_type_count(); i++) { message_generators_[i]->GenerateStaticVariables( printer, &static_block_bytecode_estimate); } printer->Print("\n"); if (HasDescriptorMethods(file_, context_->EnforceLite())) { if (immutable_api_) { GenerateDescriptorInitializationCodeForImmutable(printer); } else { GenerateDescriptorInitializationCodeForMutable(printer); } } else { printer->Print( "static {\n"); printer->Indent(); int bytecode_estimate = 0; int method_num = 0; for (int i = 0; i < file_->message_type_count(); i++) { bytecode_estimate += message_generators_[i]->GenerateStaticVariableInitializers(printer); MaybeRestartJavaMethod( printer, &bytecode_estimate, &method_num, "_clinit_autosplit_$method_num$();\n", "private static void _clinit_autosplit_$method_num$() {\n"); } printer->Outdent(); printer->Print( "}\n"); } printer->Print( "\n" "// @@protoc_insertion_point(outer_class_scope)\n"); printer->Outdent(); printer->Print("}\n"); } void FileGenerator::GenerateDescriptorInitializationCodeForImmutable( io::Printer* printer) { printer->Print( "public static com.google.protobuf.Descriptors.FileDescriptor\n" " getDescriptor() {\n" " return descriptor;\n" "}\n" "private static $final$ com.google.protobuf.Descriptors.FileDescriptor\n" " descriptor;\n" "static {\n", // TODO(dweis): Mark this as final. "final", ""); printer->Indent(); SharedCodeGenerator shared_code_generator(file_, options_); shared_code_generator.GenerateDescriptors(printer); int bytecode_estimate = 0; int method_num = 0; for (int i = 0; i < file_->message_type_count(); i++) { bytecode_estimate += message_generators_[i]->GenerateStaticVariableInitializers(printer); MaybeRestartJavaMethod( printer, &bytecode_estimate, &method_num, "_clinit_autosplit_dinit_$method_num$();\n", "private static void _clinit_autosplit_dinit_$method_num$() {\n"); } for (int i = 0; i < file_->extension_count(); i++) { bytecode_estimate += extension_generators_[i]->GenerateNonNestedInitializationCode(printer); MaybeRestartJavaMethod( printer, &bytecode_estimate, &method_num, "_clinit_autosplit_dinit_$method_num$();\n", "private static void _clinit_autosplit_dinit_$method_num$() {\n"); } // Proto compiler builds a DescriptorPool, which holds all the descriptors to // generate, when processing the ".proto" files. We call this DescriptorPool // the parsed pool (a.k.a. file_->pool()). // // Note that when users try to extend the (.*)DescriptorProto in their // ".proto" files, it does not affect the pre-built FileDescriptorProto class // in proto compiler. When we put the descriptor data in the file_proto, those // extensions become unknown fields. // // Now we need to find out all the extension value to the (.*)DescriptorProto // in the file_proto message, and prepare an ExtensionRegistry to return. // // To find those extensions, we need to parse the data into a dynamic message // of the FileDescriptor based on the builder-pool, then we can use // reflections to find all extension fields FileDescriptorProto file_proto; file_->CopyTo(&file_proto); string file_data; file_proto.SerializeToString(&file_data); FieldDescriptorSet extensions; CollectExtensions(file_proto, *file_->pool(), &extensions, file_data); if (extensions.size() > 0) { // Must construct an ExtensionRegistry containing all existing extensions // and use it to parse the descriptor data again to recognize extensions. printer->Print( "com.google.protobuf.ExtensionRegistry registry =\n" " com.google.protobuf.ExtensionRegistry.newInstance();\n"); FieldDescriptorSet::iterator it; for (it = extensions.begin(); it != extensions.end(); it++) { google::protobuf::scoped_ptr generator( generator_factory_->NewExtensionGenerator(*it)); bytecode_estimate += generator->GenerateRegistrationCode(printer); MaybeRestartJavaMethod( printer, &bytecode_estimate, &method_num, "_clinit_autosplit_dinit_$method_num$(registry);\n", "private static void _clinit_autosplit_dinit_$method_num$(\n" " com.google.protobuf.ExtensionRegistry registry) {\n"); } printer->Print( "com.google.protobuf.Descriptors.FileDescriptor\n" " .internalUpdateFileDescriptor(descriptor, registry);\n"); } // Force descriptor initialization of all dependencies. for (int i = 0; i < file_->dependency_count(); i++) { if (ShouldIncludeDependency(file_->dependency(i), true)) { string dependency = name_resolver_->GetImmutableClassName(file_->dependency(i)); printer->Print( "$dependency$.getDescriptor();\n", "dependency", dependency); } } printer->Outdent(); printer->Print( "}\n"); } void FileGenerator::GenerateDescriptorInitializationCodeForMutable(io::Printer* printer) { printer->Print( "public static com.google.protobuf.Descriptors.FileDescriptor\n" " getDescriptor() {\n" " return descriptor;\n" "}\n" "private static final com.google.protobuf.Descriptors.FileDescriptor\n" " descriptor;\n" "static {\n"); printer->Indent(); printer->Print( "descriptor = $immutable_package$.$descriptor_classname$.descriptor;\n", "immutable_package", FileJavaPackage(file_, true), "descriptor_classname", name_resolver_->GetDescriptorClassName(file_)); for (int i = 0; i < file_->message_type_count(); i++) { message_generators_[i]->GenerateStaticVariableInitializers(printer); } for (int i = 0; i < file_->extension_count(); i++) { extension_generators_[i]->GenerateNonNestedInitializationCode(printer); } // Check if custom options exist. If any, try to load immutable classes since // custom options are only represented with immutable messages. FileDescriptorProto file_proto; file_->CopyTo(&file_proto); string file_data; file_proto.SerializeToString(&file_data); FieldDescriptorSet extensions; CollectExtensions(file_proto, *file_->pool(), &extensions, file_data); if (extensions.size() > 0) { // Try to load immutable messages' outer class. Its initialization code // will take care of interpreting custom options. printer->Print( "try {\n" // Note that we have to load the immutable class dynamically here as // we want the mutable code to be independent from the immutable code // at compile time. It is required to implement dual-compile for // mutable and immutable API in blaze. " java.lang.Class immutableClass = java.lang.Class.forName(\n" " \"$immutable_classname$\");\n" "} catch (java.lang.ClassNotFoundException e) {\n", "immutable_classname", name_resolver_->GetImmutableClassName(file_)); printer->Indent(); // The immutable class can not be found. We try our best to collect all // custom option extensions to interpret the custom options. printer->Print( "com.google.protobuf.ExtensionRegistry registry =\n" " com.google.protobuf.ExtensionRegistry.newInstance();\n" "com.google.protobuf.MessageLite defaultExtensionInstance = null;\n"); FieldDescriptorSet::iterator it; for (it = extensions.begin(); it != extensions.end(); it++) { const FieldDescriptor* field = *it; string scope; if (field->extension_scope() != NULL) { scope = name_resolver_->GetMutableClassName(field->extension_scope()) + ".getDescriptor()"; } else { scope = FileJavaPackage(field->file(), true) + "." + name_resolver_->GetDescriptorClassName(field->file()) + ".descriptor"; } if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { printer->Print( "defaultExtensionInstance = com.google.protobuf.Internal\n" " .getDefaultInstance(\"$class$\");\n" "if (defaultExtensionInstance != null) {\n" " registry.add(\n" " $scope$.getExtensions().get($index$),\n" " (com.google.protobuf.Message) defaultExtensionInstance);\n" "}\n", "scope", scope, "index", SimpleItoa(field->index()), "class", name_resolver_->GetImmutableClassName(field->message_type())); } else { printer->Print("registry.add($scope$.getExtensions().get($index$));\n", "scope", scope, "index", SimpleItoa(field->index())); } } printer->Print( "com.google.protobuf.Descriptors.FileDescriptor\n" " .internalUpdateFileDescriptor(descriptor, registry);\n"); printer->Outdent(); printer->Print("}\n"); } // Force descriptor initialization of all dependencies. for (int i = 0; i < file_->dependency_count(); i++) { if (ShouldIncludeDependency(file_->dependency(i), false)) { string dependency = name_resolver_->GetMutableClassName( file_->dependency(i)); printer->Print( "$dependency$.getDescriptor();\n", "dependency", dependency); } } printer->Outdent(); printer->Print( "}\n"); } template static void GenerateSibling(const string& package_dir, const string& java_package, const DescriptorClass* descriptor, GeneratorContext* context, std::vector* file_list, bool annotate_code, std::vector* annotation_list, const string& name_suffix, GeneratorClass* generator, void (GeneratorClass::*pfn)(io::Printer* printer)) { string filename = package_dir + descriptor->name() + name_suffix + ".java"; file_list->push_back(filename); string info_full_path = filename + ".pb.meta"; GeneratedCodeInfo annotations; io::AnnotationProtoCollector annotation_collector( &annotations); google::protobuf::scoped_ptr output(context->Open(filename)); io::Printer printer(output.get(), '$', annotate_code ? &annotation_collector : NULL); printer.Print( "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" "// source: $filename$\n" "\n", "filename", descriptor->file()->name()); if (!java_package.empty()) { printer.Print( "package $package$;\n" "\n", "package", java_package); } (generator->*pfn)(&printer); if (annotate_code) { google::protobuf::scoped_ptr info_output( context->Open(info_full_path)); annotations.SerializeToZeroCopyStream(info_output.get()); annotation_list->push_back(info_full_path); } } void FileGenerator::GenerateSiblings(const string& package_dir, GeneratorContext* context, std::vector* file_list, std::vector* annotation_list) { if (MultipleJavaFiles(file_, immutable_api_)) { for (int i = 0; i < file_->enum_type_count(); i++) { if (HasDescriptorMethods(file_, context_->EnforceLite())) { EnumGenerator generator(file_->enum_type(i), immutable_api_, context_.get()); GenerateSibling( package_dir, java_package_, file_->enum_type(i), context, file_list, options_.annotate_code, annotation_list, "", &generator, &EnumGenerator::Generate); } else { EnumLiteGenerator generator(file_->enum_type(i), immutable_api_, context_.get()); GenerateSibling( package_dir, java_package_, file_->enum_type(i), context, file_list, options_.annotate_code, annotation_list, "", &generator, &EnumLiteGenerator::Generate); } } for (int i = 0; i < file_->message_type_count(); i++) { if (immutable_api_) { GenerateSibling( package_dir, java_package_, file_->message_type(i), context, file_list, options_.annotate_code, annotation_list, "OrBuilder", message_generators_[i].get(), &MessageGenerator::GenerateInterface); } GenerateSibling( package_dir, java_package_, file_->message_type(i), context, file_list, options_.annotate_code, annotation_list, "", message_generators_[i].get(), &MessageGenerator::Generate); } if (HasGenericServices(file_, context_->EnforceLite())) { for (int i = 0; i < file_->service_count(); i++) { google::protobuf::scoped_ptr generator( generator_factory_->NewServiceGenerator(file_->service(i))); GenerateSibling( package_dir, java_package_, file_->service(i), context, file_list, options_.annotate_code, annotation_list, "", generator.get(), &ServiceGenerator::Generate); } } } } bool FileGenerator::ShouldIncludeDependency( const FileDescriptor* descriptor, bool immutable_api) { return true; } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_file.h000066400000000000000000000110351334102242000321150ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_FILE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_FILE_H__ #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include namespace google { namespace protobuf { class FileDescriptor; // descriptor.h namespace io { class Printer; // printer.h } namespace compiler { class GeneratorContext; // code_generator.h namespace java { class Context; // context.h class MessageGenerator; // message.h class GeneratorFactory; // generator_factory.h class ExtensionGenerator; // extension.h class ClassNameResolver; // name_resolver.h } } } namespace protobuf { namespace compiler { namespace java { class FileGenerator { public: FileGenerator(const FileDescriptor* file, const Options& options, bool immutable_api = true); ~FileGenerator(); // Checks for problems that would otherwise lead to cryptic compile errors. // Returns true if there are no problems, or writes an error description to // the given string and returns false otherwise. bool Validate(string* error); void Generate(io::Printer* printer); // If we aren't putting everything into one file, this will write all the // files other than the outer file (i.e. one for each message, enum, and // service type). void GenerateSiblings(const string& package_dir, GeneratorContext* generator_context, std::vector* file_list, std::vector* annotation_list); const string& java_package() { return java_package_; } const string& classname() { return classname_; } private: void GenerateDescriptorInitializationCodeForImmutable(io::Printer* printer); void GenerateDescriptorInitializationCodeForMutable(io::Printer* printer); bool ShouldIncludeDependency(const FileDescriptor* descriptor, bool immutable_api_); const FileDescriptor* file_; string java_package_; string classname_; google::protobuf::scoped_array > message_generators_; google::protobuf::scoped_array > extension_generators_; google::protobuf::scoped_ptr generator_factory_; google::protobuf::scoped_ptr context_; ClassNameResolver* name_resolver_; const Options options_; bool immutable_api_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_FILE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_generator.cc000066400000000000000000000174211334102242000333270ustar00rootroot00000000000000// 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 #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { JavaGenerator::JavaGenerator() {} JavaGenerator::~JavaGenerator() {} bool JavaGenerator::Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const { // ----------------------------------------------------------------- // parse generator options std::vector > options; ParseGeneratorParameter(parameter, &options); Options file_options; for (int i = 0; i < options.size(); i++) { if (options[i].first == "output_list_file") { file_options.output_list_file = options[i].second; } else if (options[i].first == "immutable") { file_options.generate_immutable_code = true; } else if (options[i].first == "mutable") { file_options.generate_mutable_code = true; } else if (options[i].first == "shared") { file_options.generate_shared_code = true; } else if (options[i].first == "annotate_code") { file_options.annotate_code = true; } else if (options[i].first == "annotation_list_file") { file_options.annotation_list_file = options[i].second; } else { *error = "Unknown generator option: " + options[i].first; return false; } } if (file_options.enforce_lite && file_options.generate_mutable_code) { *error = "lite runtime generator option cannot be used with mutable API."; return false; } // By default we generate immutable code and shared code for immutable API. if (!file_options.generate_immutable_code && !file_options.generate_mutable_code && !file_options.generate_shared_code) { file_options.generate_immutable_code = true; file_options.generate_shared_code = true; } // ----------------------------------------------------------------- std::vector all_files; std::vector all_annotations; std::vector file_generators; if (file_options.generate_immutable_code) { file_generators.push_back(new FileGenerator(file, file_options, /* immutable = */ true)); } if (file_options.generate_mutable_code) { file_generators.push_back(new FileGenerator(file, file_options, /* mutable = */ false)); } for (int i = 0; i < file_generators.size(); ++i) { if (!file_generators[i]->Validate(error)) { for (int j = 0; j < file_generators.size(); ++j) { delete file_generators[j]; } return false; } } for (int i = 0; i < file_generators.size(); ++i) { FileGenerator* file_generator = file_generators[i]; string package_dir = JavaPackageToDir(file_generator->java_package()); string java_filename = package_dir; java_filename += file_generator->classname(); java_filename += ".java"; all_files.push_back(java_filename); string info_full_path = java_filename + ".pb.meta"; if (file_options.annotate_code) { all_annotations.push_back(info_full_path); } // Generate main java file. google::protobuf::scoped_ptr output( context->Open(java_filename)); GeneratedCodeInfo annotations; io::AnnotationProtoCollector annotation_collector( &annotations); io::Printer printer(output.get(), '$', file_options.annotate_code ? &annotation_collector : NULL); file_generator->Generate(&printer); // Generate sibling files. file_generator->GenerateSiblings(package_dir, context, &all_files, &all_annotations); if (file_options.annotate_code) { google::protobuf::scoped_ptr info_output( context->Open(info_full_path)); annotations.SerializeToZeroCopyStream(info_output.get()); } } for (int i = 0; i < file_generators.size(); ++i) { delete file_generators[i]; } file_generators.clear(); // Generate output list if requested. if (!file_options.output_list_file.empty()) { // Generate output list. This is just a simple text file placed in a // deterministic location which lists the .java files being generated. google::protobuf::scoped_ptr srclist_raw_output( context->Open(file_options.output_list_file)); io::Printer srclist_printer(srclist_raw_output.get(), '$'); for (int i = 0; i < all_files.size(); i++) { srclist_printer.Print("$filename$\n", "filename", all_files[i]); } } if (!file_options.annotation_list_file.empty()) { // Generate output list. This is just a simple text file placed in a // deterministic location which lists the .java files being generated. google::protobuf::scoped_ptr annotation_list_raw_output( context->Open(file_options.annotation_list_file)); io::Printer annotation_list_printer(annotation_list_raw_output.get(), '$'); for (int i = 0; i < all_annotations.size(); i++) { annotation_list_printer.Print("$filename$\n", "filename", all_annotations[i]); } } return true; } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_generator.h000066400000000000000000000056011334102242000331660ustar00rootroot00000000000000// 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. // // Generates Java code for a given .proto file. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace java { // CodeGenerator implementation which generates Java code. If you create your // own protocol compiler binary and you want it to support Java output, you // can do so by registering an instance of this CodeGenerator with the // CommandLineInterface in your main() function. class LIBPROTOC_EXPORT JavaGenerator : public CodeGenerator { public: JavaGenerator(); ~JavaGenerator(); // implements CodeGenerator ---------------------------------------- bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(JavaGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_H__ java_generator_factory.cc000066400000000000000000000070551334102242000350010ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: liujisi@google.com (Pherl Liu) #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { GeneratorFactory::GeneratorFactory() {} GeneratorFactory::~GeneratorFactory() {} // =================================================================== ImmutableGeneratorFactory::ImmutableGeneratorFactory( Context* context) : context_(context) { } ImmutableGeneratorFactory::~ImmutableGeneratorFactory() {} MessageGenerator* ImmutableGeneratorFactory::NewMessageGenerator( const Descriptor* descriptor) const { if (HasDescriptorMethods(descriptor, context_->EnforceLite())) { return new ImmutableMessageGenerator(descriptor, context_); } else { return new ImmutableMessageLiteGenerator(descriptor, context_); } } ExtensionGenerator* ImmutableGeneratorFactory::NewExtensionGenerator( const FieldDescriptor* descriptor) const { if (HasDescriptorMethods(descriptor->file(), context_->EnforceLite())) { return new ImmutableExtensionGenerator(descriptor, context_); } else { return new ImmutableExtensionLiteGenerator(descriptor, context_); } } ServiceGenerator* ImmutableGeneratorFactory::NewServiceGenerator( const ServiceDescriptor* descriptor) const { return new ImmutableServiceGenerator(descriptor, context_); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_generator_factory.h000066400000000000000000000070161334102242000346400ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: liujisi@google.com (Pherl Liu) #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_FACTORY_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_FACTORY_H__ #include namespace google { namespace protobuf { class FieldDescriptor; // descriptor.h class Descriptor; // descriptor.h class ServiceDescriptor; // descriptor.h namespace compiler { namespace java { class MessageGenerator; // message.h class ExtensionGenerator; // extension.h class ServiceGenerator; // service.h class Context; // context.h } } } namespace protobuf { namespace compiler { namespace java { class GeneratorFactory { public: GeneratorFactory(); virtual ~GeneratorFactory(); virtual MessageGenerator* NewMessageGenerator( const Descriptor* descriptor) const = 0; virtual ExtensionGenerator* NewExtensionGenerator( const FieldDescriptor* descriptor) const = 0; 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); virtual ~ImmutableGeneratorFactory(); virtual MessageGenerator* NewMessageGenerator( const Descriptor* descriptor) const; virtual ExtensionGenerator* NewExtensionGenerator( const FieldDescriptor* descriptor) const; virtual ServiceGenerator* NewServiceGenerator( const ServiceDescriptor* descriptor) const; private: Context* context_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableGeneratorFactory); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_FACTORY_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_helpers.cc000066400000000000000000000737121334102242000330100ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include #include // for hash namespace google { namespace protobuf { namespace compiler { namespace java { using internal::WireFormat; using internal::WireFormatLite; const char kThickSeparator[] = "// ===================================================================\n"; const char kThinSeparator[] = "// -------------------------------------------------------------------\n"; namespace { const char* kDefaultPackage = ""; // Names that should be avoided as field names. // Using them will cause the compiler to generate accessors whose names are // colliding with methods defined in base classes. const char* kForbiddenWordList[] = { // message base class: "cached_size", "serialized_size", // java.lang.Object: "class", }; bool IsForbidden(const string& field_name) { for (int i = 0; i < GOOGLE_ARRAYSIZE(kForbiddenWordList); ++i) { if (field_name == kForbiddenWordList[i]) { return true; } } return false; } string FieldName(const FieldDescriptor* field) { 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 string& annotation_file) { if (annotation_file.empty()) { return; } string ptemplate = "@javax.annotation.Generated(value=\"protoc\", comments=\"annotations:"; ptemplate.push_back(delimiter); ptemplate.append("annotation_file"); ptemplate.push_back(delimiter); ptemplate.append("\")\n"); printer->Print(ptemplate.c_str(), "annotation_file", annotation_file); } string UnderscoresToCamelCase(const string& input, bool cap_next_letter) { 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; } } // Add a trailing "_" if the name should be altered. if (input[input.size() - 1] == '#') { result += '_'; } return result; } string UnderscoresToCamelCase(const FieldDescriptor* field) { return UnderscoresToCamelCase(FieldName(field), false); } string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field) { return UnderscoresToCamelCase(FieldName(field), true); } string UnderscoresToCamelCase(const MethodDescriptor* method) { return UnderscoresToCamelCase(method->name(), false); } string UniqueFileScopeIdentifier(const Descriptor* descriptor) { return "static_" + StringReplace(descriptor->full_name(), ".", "_", true); } string CamelCaseFieldName(const FieldDescriptor* field) { string fieldName = UnderscoresToCamelCase(field); if ('0' <= fieldName[0] && fieldName[0] <= '9') { return '_' + fieldName; } return fieldName; } string StripProto(const string& filename) { if (HasSuffixString(filename, ".protodevel")) { return StripSuffixString(filename, ".protodevel"); } else { return StripSuffixString(filename, ".proto"); } } string FileClassName(const FileDescriptor* file, bool immutable) { ClassNameResolver name_resolver; return name_resolver.GetFileClassName(file, immutable); } string FileJavaPackage(const FileDescriptor* file, bool immutable) { 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; } string JavaPackageToDir(string package_name) { string package_dir = StringReplace(package_name, ".", "/", true); if (!package_dir.empty()) package_dir += "/"; return package_dir; } // TODO(xiaofeng): This function is only kept for it's publicly referenced. // It should be removed after mutable API up-integration. string ToJavaName(const string& full_name, const FileDescriptor* file) { string result; if (file->options().java_multiple_files()) { result = FileJavaPackage(file); } else { result = ClassName(file); } if (!result.empty()) { result += '.'; } if (file->package().empty()) { result += full_name; } else { // Strip the proto package from full_name since we've replaced it with // the Java package. result += full_name.substr(file->package().size() + 1); } return result; } string ClassName(const Descriptor* descriptor) { ClassNameResolver name_resolver; return name_resolver.GetClassName(descriptor, true); } string ClassName(const EnumDescriptor* descriptor) { ClassNameResolver name_resolver; return name_resolver.GetClassName(descriptor, true); } string ClassName(const ServiceDescriptor* descriptor) { ClassNameResolver name_resolver; return name_resolver.GetClassName(descriptor, true); } string ClassName(const FileDescriptor* descriptor) { ClassNameResolver name_resolver; return name_resolver.GetClassName(descriptor, true); } string ExtraMessageInterfaces(const Descriptor* descriptor) { string interfaces = "// @@protoc_insertion_point(message_implements:" + descriptor->full_name() + ")"; return interfaces; } string ExtraBuilderInterfaces(const Descriptor* descriptor) { string interfaces = "// @@protoc_insertion_point(builder_implements:" + descriptor->full_name() + ")"; return interfaces; } string ExtraMessageOrBuilderInterfaces(const Descriptor* descriptor) { string interfaces = "// @@protoc_insertion_point(interface_extends:" + descriptor->full_name() + ")"; return interfaces; } string FieldConstantName(const FieldDescriptor *field) { string name = field->name() + "_FIELD_NUMBER"; UpperString(&name); return name; } FieldDescriptor::Type GetType(const FieldDescriptor* field) { return field->type(); } JavaType GetJavaType(const FieldDescriptor* field) { switch (GetType(field)) { case FieldDescriptor::TYPE_INT32: case FieldDescriptor::TYPE_UINT32: case FieldDescriptor::TYPE_SINT32: case FieldDescriptor::TYPE_FIXED32: case FieldDescriptor::TYPE_SFIXED32: return JAVATYPE_INT; case FieldDescriptor::TYPE_INT64: case FieldDescriptor::TYPE_UINT64: case FieldDescriptor::TYPE_SINT64: case FieldDescriptor::TYPE_FIXED64: case FieldDescriptor::TYPE_SFIXED64: return JAVATYPE_LONG; case FieldDescriptor::TYPE_FLOAT: return JAVATYPE_FLOAT; case FieldDescriptor::TYPE_DOUBLE: return JAVATYPE_DOUBLE; case FieldDescriptor::TYPE_BOOL: return JAVATYPE_BOOLEAN; case FieldDescriptor::TYPE_STRING: return JAVATYPE_STRING; case FieldDescriptor::TYPE_BYTES: return JAVATYPE_BYTES; case FieldDescriptor::TYPE_ENUM: return JAVATYPE_ENUM; case FieldDescriptor::TYPE_GROUP: case FieldDescriptor::TYPE_MESSAGE: return JAVATYPE_MESSAGE; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return JAVATYPE_INT; } const char* PrimitiveTypeName(JavaType type) { switch (type) { case JAVATYPE_INT : return "int"; case JAVATYPE_LONG : return "long"; case JAVATYPE_FLOAT : return "float"; case JAVATYPE_DOUBLE : return "double"; case JAVATYPE_BOOLEAN: return "boolean"; case JAVATYPE_STRING : return "java.lang.String"; case JAVATYPE_BYTES : return "com.google.protobuf.ByteString"; case JAVATYPE_ENUM : return NULL; case JAVATYPE_MESSAGE: return NULL; // No default because we want the compiler to complain if any new // JavaTypes are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } const char* BoxedPrimitiveTypeName(JavaType type) { switch (type) { case JAVATYPE_INT : return "java.lang.Integer"; case JAVATYPE_LONG : return "java.lang.Long"; case JAVATYPE_FLOAT : return "java.lang.Float"; case JAVATYPE_DOUBLE : return "java.lang.Double"; case JAVATYPE_BOOLEAN: return "java.lang.Boolean"; case JAVATYPE_STRING : return "java.lang.String"; case JAVATYPE_BYTES : return "com.google.protobuf.ByteString"; case JAVATYPE_ENUM : return NULL; case JAVATYPE_MESSAGE: return NULL; // No default because we want the compiler to complain if any new // JavaTypes are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } const char* FieldTypeName(FieldDescriptor::Type field_type) { switch (field_type) { case FieldDescriptor::TYPE_INT32 : return "INT32"; case FieldDescriptor::TYPE_UINT32 : return "UINT32"; case FieldDescriptor::TYPE_SINT32 : return "SINT32"; case FieldDescriptor::TYPE_FIXED32 : return "FIXED32"; case FieldDescriptor::TYPE_SFIXED32: return "SFIXED32"; case FieldDescriptor::TYPE_INT64 : return "INT64"; case FieldDescriptor::TYPE_UINT64 : return "UINT64"; case FieldDescriptor::TYPE_SINT64 : return "SINT64"; case FieldDescriptor::TYPE_FIXED64 : return "FIXED64"; case FieldDescriptor::TYPE_SFIXED64: return "SFIXED64"; case FieldDescriptor::TYPE_FLOAT : return "FLOAT"; case FieldDescriptor::TYPE_DOUBLE : return "DOUBLE"; case FieldDescriptor::TYPE_BOOL : return "BOOL"; case FieldDescriptor::TYPE_STRING : return "STRING"; case FieldDescriptor::TYPE_BYTES : return "BYTES"; case FieldDescriptor::TYPE_ENUM : return "ENUM"; case FieldDescriptor::TYPE_GROUP : return "GROUP"; case FieldDescriptor::TYPE_MESSAGE : return "MESSAGE"; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } bool AllAscii(const string& text) { for (int i = 0; i < text.size(); i++) { if ((text[i] & 0x80) != 0) { return false; } } return true; } string DefaultValue(const FieldDescriptor* field, bool immutable, ClassNameResolver* name_resolver) { // 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 SimpleItoa(field->default_value_int32()); case FieldDescriptor::CPPTYPE_UINT32: // Need to print as a signed int since Java has no unsigned. return SimpleItoa(static_cast(field->default_value_uint32())); case FieldDescriptor::CPPTYPE_INT64: return SimpleItoa(field->default_value_int64()) + "L"; case FieldDescriptor::CPPTYPE_UINT64: return SimpleItoa(static_cast(field->default_value_uint64())) + "L"; case FieldDescriptor::CPPTYPE_DOUBLE: { double value = field->default_value_double(); if (value == std::numeric_limits::infinity()) { return "Double.POSITIVE_INFINITY"; } else if (value == -std::numeric_limits::infinity()) { return "Double.NEGATIVE_INFINITY"; } else if (value != value) { return "Double.NaN"; } else { return SimpleDtoa(value) + "D"; } } case FieldDescriptor::CPPTYPE_FLOAT: { float value = field->default_value_float(); if (value == std::numeric_limits::infinity()) { return "Float.POSITIVE_INFINITY"; } else if (value == -std::numeric_limits::infinity()) { return "Float.NEGATIVE_INFINITY"; } else if (value != value) { return "Float.NaN"; } else { return SimpleFtoa(value) + "F"; } } case FieldDescriptor::CPPTYPE_BOOL: return field->default_value_bool() ? "true" : "false"; case FieldDescriptor::CPPTYPE_STRING: if (GetType(field) == FieldDescriptor::TYPE_BYTES) { if (field->has_default_value()) { // See comments in Internal.java for gory details. return strings::Substitute( "com.google.protobuf.Internal.bytesDefaultValue(\"$0\")", 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()) + "\""; } else { // See comments in Internal.java for gory details. return strings::Substitute( "com.google.protobuf.Internal.stringDefaultValue(\"$0\")", CEscape(field->default_value_string())); } } case FieldDescriptor::CPPTYPE_ENUM: return name_resolver->GetClassName(field->enum_type(), immutable) + "." + field->default_value_enum()->name(); case FieldDescriptor::CPPTYPE_MESSAGE: return name_resolver->GetClassName(field->message_type(), immutable) + ".getDefaultInstance()"; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } bool IsDefaultValueJavaDefault(const FieldDescriptor* field) { // 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 field->default_value_int32() == 0; case FieldDescriptor::CPPTYPE_UINT32: return field->default_value_uint32() == 0; case FieldDescriptor::CPPTYPE_INT64: return field->default_value_int64() == 0L; case FieldDescriptor::CPPTYPE_UINT64: return field->default_value_uint64() == 0L; case FieldDescriptor::CPPTYPE_DOUBLE: return field->default_value_double() == 0.0; case FieldDescriptor::CPPTYPE_FLOAT: return field->default_value_float() == 0.0; case FieldDescriptor::CPPTYPE_BOOL: return field->default_value_bool() == false; case FieldDescriptor::CPPTYPE_ENUM: return field->default_value_enum()->number() == 0; case FieldDescriptor::CPPTYPE_STRING: case FieldDescriptor::CPPTYPE_MESSAGE: return false; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return false; } bool IsByteStringWithCustomDefaultValue(const FieldDescriptor* field) { return GetJavaType(field) == JAVATYPE_BYTES && field->default_value_string() != ""; } const char* bit_masks[] = { "0x00000001", "0x00000002", "0x00000004", "0x00000008", "0x00000010", "0x00000020", "0x00000040", "0x00000080", "0x00000100", "0x00000200", "0x00000400", "0x00000800", "0x00001000", "0x00002000", "0x00004000", "0x00008000", "0x00010000", "0x00020000", "0x00040000", "0x00080000", "0x00100000", "0x00200000", "0x00400000", "0x00800000", "0x01000000", "0x02000000", "0x04000000", "0x08000000", "0x10000000", "0x20000000", "0x40000000", "0x80000000", }; string GetBitFieldName(int index) { string varName = "bitField"; varName += SimpleItoa(index); varName += "_"; return varName; } string GetBitFieldNameForBit(int bitIndex) { return GetBitFieldName(bitIndex / 32); } namespace { string GenerateGetBitInternal(const string& prefix, int bitIndex) { string varName = prefix + GetBitFieldNameForBit(bitIndex); int bitInVarIndex = bitIndex % 32; string mask = bit_masks[bitInVarIndex]; string result = "((" + varName + " & " + mask + ") == " + mask + ")"; return result; } string GenerateSetBitInternal(const string& prefix, int bitIndex) { string varName = prefix + GetBitFieldNameForBit(bitIndex); int bitInVarIndex = bitIndex % 32; string mask = bit_masks[bitInVarIndex]; string result = varName + " |= " + mask; return result; } } // namespace string GenerateGetBit(int bitIndex) { return GenerateGetBitInternal("", bitIndex); } string GenerateSetBit(int bitIndex) { return GenerateSetBitInternal("", bitIndex); } string GenerateClearBit(int bitIndex) { string varName = GetBitFieldNameForBit(bitIndex); int bitInVarIndex = bitIndex % 32; string mask = bit_masks[bitInVarIndex]; string result = varName + " = (" + varName + " & ~" + mask + ")"; return result; } string GenerateGetBitFromLocal(int bitIndex) { return GenerateGetBitInternal("from_", bitIndex); } string GenerateSetBitToLocal(int bitIndex) { return GenerateSetBitInternal("to_", bitIndex); } string GenerateGetBitMutableLocal(int bitIndex) { return GenerateGetBitInternal("mutable_", bitIndex); } string GenerateSetBitMutableLocal(int bitIndex) { return GenerateSetBitInternal("mutable_", bitIndex); } bool IsReferenceType(JavaType type) { switch (type) { case JAVATYPE_INT : return false; case JAVATYPE_LONG : return false; case JAVATYPE_FLOAT : return false; case JAVATYPE_DOUBLE : return false; case JAVATYPE_BOOLEAN: return false; case JAVATYPE_STRING : return true; case JAVATYPE_BYTES : return true; case JAVATYPE_ENUM : return true; case JAVATYPE_MESSAGE: return true; // No default because we want the compiler to complain if any new // JavaTypes are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return false; } const char* GetCapitalizedType(const FieldDescriptor* field, bool immutable) { switch (GetType(field)) { case FieldDescriptor::TYPE_INT32 : return "Int32"; case FieldDescriptor::TYPE_UINT32 : return "UInt32"; case FieldDescriptor::TYPE_SINT32 : return "SInt32"; case FieldDescriptor::TYPE_FIXED32 : return "Fixed32"; case FieldDescriptor::TYPE_SFIXED32: return "SFixed32"; case FieldDescriptor::TYPE_INT64 : return "Int64"; case FieldDescriptor::TYPE_UINT64 : return "UInt64"; case FieldDescriptor::TYPE_SINT64 : return "SInt64"; case FieldDescriptor::TYPE_FIXED64 : return "Fixed64"; case FieldDescriptor::TYPE_SFIXED64: return "SFixed64"; case FieldDescriptor::TYPE_FLOAT : return "Float"; case FieldDescriptor::TYPE_DOUBLE : return "Double"; case FieldDescriptor::TYPE_BOOL : return "Bool"; case FieldDescriptor::TYPE_STRING : return "String"; case FieldDescriptor::TYPE_BYTES : { return "Bytes"; } case FieldDescriptor::TYPE_ENUM : return "Enum"; case FieldDescriptor::TYPE_GROUP : return "Group"; case FieldDescriptor::TYPE_MESSAGE : return "Message"; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } // For encodings with fixed sizes, returns that size in bytes. Otherwise // returns -1. int FixedSize(FieldDescriptor::Type type) { switch (type) { case FieldDescriptor::TYPE_INT32 : return -1; case FieldDescriptor::TYPE_INT64 : return -1; case FieldDescriptor::TYPE_UINT32 : return -1; case FieldDescriptor::TYPE_UINT64 : return -1; case FieldDescriptor::TYPE_SINT32 : return -1; case FieldDescriptor::TYPE_SINT64 : return -1; case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size; case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size; case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size; case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size; case FieldDescriptor::TYPE_FLOAT : return WireFormatLite::kFloatSize; case FieldDescriptor::TYPE_DOUBLE : return WireFormatLite::kDoubleSize; case FieldDescriptor::TYPE_BOOL : return WireFormatLite::kBoolSize; case FieldDescriptor::TYPE_ENUM : return -1; case FieldDescriptor::TYPE_STRING : return -1; case FieldDescriptor::TYPE_BYTES : return -1; case FieldDescriptor::TYPE_GROUP : return -1; case FieldDescriptor::TYPE_MESSAGE : return -1; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return -1; } // Sort the fields of the given Descriptor by number into a new[]'d array // and return it. The caller should delete the returned array. const FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor) { const FieldDescriptor** fields = new const FieldDescriptor*[descriptor->field_count()]; for (int i = 0; i < descriptor->field_count(); i++) { fields[i] = descriptor->field(i); } std::sort(fields, fields + descriptor->field_count(), FieldOrderingByNumber()); return fields; } // Returns true if the message type has any required fields. If it doesn't, // we can optimize out calls to its isInitialized() method. // // already_seen is used to avoid checking the same type multiple times // (and also to protect against recursion). bool HasRequiredFields( const Descriptor* type, hash_set* 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. // b. We are in the midst of checking if the type has required fields, // somewhere up the stack. In this case, we know that if the type // has any required fields, they'll be found when we return to it, // and the whole call to HasRequiredFields() will return true. // Therefore, we don't have to check if this type has required fields // here. return false; } already_seen->insert(type); // If the type has extensions, an extension with message type could contain // required fields, so we have to be conservative and assume such an // extension exists. if (type->extension_range_count() > 0) return true; for (int i = 0; i < type->field_count(); i++) { const FieldDescriptor* field = type->field(i); if (field->is_required()) { return true; } if (GetJavaType(field) == JAVATYPE_MESSAGE) { if (HasRequiredFields(field->message_type(), already_seen)) { return true; } } } return false; } bool HasRequiredFields(const Descriptor* type) { hash_set already_seen; return HasRequiredFields(type, &already_seen); } bool HasRepeatedFields(const Descriptor* descriptor) { for (int i = 0; i < descriptor->field_count(); ++i) { const FieldDescriptor* field = descriptor->field(i); if (field->is_repeated()) { return true; } } return false; } // Encode an unsigned 32-bit value into a sequence of UTF-16 characters. // // If the value is in [0x0000, 0xD7FF], we encode it with a single character // with the same numeric value. // // If the value is larger than 0xD7FF, we encode its lowest 13 bits into a // character in the range [0xE000, 0xFFFF] by combining these 13 bits with // 0xE000 using logic-or. Then we shift the value to the right by 13 bits, and // encode the remaining value by repeating this same process until we get to // a value in [0x0000, 0xD7FF] where we will encode it using a character with // the same numeric value. // // Note that we only use code points in [0x0000, 0xD7FF] and [0xE000, 0xFFFF]. // There will be no surrogate pairs in the encoded character sequence. void WriteUInt32ToUtf16CharSequence(uint32 number, std::vector* output) { // For values in [0x0000, 0xD7FF], only use one char to encode it. if (number < 0xD800) { output->push_back(static_cast(number)); return; } // Encode into multiple chars. All except the last char will be in the range // [0xE000, 0xFFFF], and the last char will be in the range [0x0000, 0xD7FF]. // Note that we don't use any value in range [0xD800, 0xDFFF] because they // have to come in pairs and the encoding is just more space-efficient w/o // them. while (number >= 0xD800) { // [0xE000, 0xFFFF] can represent 13 bits of info. output->push_back(static_cast(0xE000 | (number & 0x1FFF))); number >>= 13; } output->push_back(static_cast(number)); } int GetExperimentalJavaFieldTypeForSingular(const FieldDescriptor* field) { // j/c/g/protobuf/FieldType.java lists field types in a slightly different // order from FieldDescriptor::Type so we can't do a simple cast. // // TODO(xiaofeng): Make j/c/g/protobuf/FieldType.java follow the same order. int result = field->type(); if (result == FieldDescriptor::TYPE_GROUP) { return 17; } else if (result < FieldDescriptor::TYPE_GROUP) { return result - 1; } else { return result - 2; } } int GetExperimentalJavaFieldTypeForRepeated(const FieldDescriptor* field) { if (field->type() == FieldDescriptor::TYPE_GROUP) { return 49; } else { return GetExperimentalJavaFieldTypeForSingular(field) + 18; } } int GetExperimentalJavaFieldTypeForPacked(const FieldDescriptor* field) { int result = field->type(); if (result < FieldDescriptor::TYPE_STRING) { return result + 34; } else if (result > FieldDescriptor::TYPE_BYTES) { return result + 30; } else { GOOGLE_LOG(FATAL) << field->full_name() << " can't be packed."; return 0; } } int GetExperimentalJavaFieldType(const FieldDescriptor* field) { static const int kMapFieldType = 50; static const int kOneofFieldTypeOffset = 51; static const int kRequiredBit = 0x100; static const int kUtf8CheckBit = 0x200; static const int kCheckInitialized = 0x400; static const int kMapWithProto2EnumValue = 0x800; int extra_bits = field->is_required() ? kRequiredBit : 0; if (field->type() == FieldDescriptor::TYPE_STRING && CheckUtf8(field)) { extra_bits |= kUtf8CheckBit; } if (field->is_required() || (GetJavaType(field) == JAVATYPE_MESSAGE && HasRequiredFields(field->message_type()))) { extra_bits |= kCheckInitialized; } if (field->is_map()) { if (SupportFieldPresence(field->file())) { const FieldDescriptor* value = field->message_type()->FindFieldByName("value"); if (GetJavaType(value) == JAVATYPE_ENUM) { extra_bits |= kMapWithProto2EnumValue; } } return kMapFieldType | extra_bits; } else if (field->is_packed()) { return GetExperimentalJavaFieldTypeForPacked(field); } else if (field->is_repeated()) { return GetExperimentalJavaFieldTypeForRepeated(field) | extra_bits; } else if (field->containing_oneof() != NULL) { return (GetExperimentalJavaFieldTypeForSingular(field) + kOneofFieldTypeOffset) | extra_bits; } else { return GetExperimentalJavaFieldTypeForSingular(field) | extra_bits; } } // Escape a UTF-16 character to be embedded in a Java string. void EscapeUtf16ToString(uint16 code, string* output) { if (code == '\t') { output->append("\\t"); } else if (code == '\b') { output->append("\\b"); } else if (code == '\n') { output->append("\\n"); } else if (code == '\r') { output->append("\\r"); } else if (code == '\f') { output->append("\\f"); } else if (code == '\'') { output->append("\\'"); } else if (code == '\"') { output->append("\\\""); } else if (code == '\\') { output->append("\\\\"); } else if (code >= 0x20 && code <= 0x7f) { output->push_back(static_cast(code)); } else { output->append(StringPrintf("\\u%04x", code)); } } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_helpers.h000066400000000000000000000421701334102242000326440ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__ #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { // Commonly-used separator comments. Thick is a line of '=', thin is a line // of '-'. extern const char kThickSeparator[]; extern const char kThinSeparator[]; // If annotation_file is non-empty, prints a javax.annotation.Generated // annotation to the given Printer. annotation_file will be referenced in the // annotation's comments field. delimiter should be the Printer's delimiter // character. annotation_file will be included verbatim into a Java literal // string, so it should not contain quotes or invalid Java escape sequences; // however, these are unlikely to appear in practice, as the value of // 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 string& annotation_file = ""); // Converts a name to camel-case. If cap_first_letter is true, capitalize the // first letter. string UnderscoresToCamelCase(const string& name, bool cap_first_letter); // Converts the field's name to camel-case, e.g. "foo_bar_baz" becomes // "fooBarBaz" or "FooBarBaz", respectively. string UnderscoresToCamelCase(const FieldDescriptor* field); 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.) string UnderscoresToCamelCase(const MethodDescriptor* method); // Similar to UnderscoresToCamelCase, but guarentees that the result is a // complete Java identifier by adding a _ if needed. string CamelCaseFieldName(const FieldDescriptor* field); // Get an identifier that uniquely identifies this type within the file. // This is used to declare static variables related to this type at the // outermost file scope. string UniqueFileScopeIdentifier(const Descriptor* descriptor); // Strips ".proto" or ".protodevel" from the end of a filename. string StripProto(const string& filename); // Gets the unqualified class name for the file. For each .proto file, there // will be one Java class containing all the immutable messages and another // Java class containing all the mutable messages. // TODO(xiaofeng): remove the default value after updating client code. string FileClassName(const FileDescriptor* file, bool immutable = true); // Returns the file's Java package name. string FileJavaPackage(const FileDescriptor* file, bool immutable = true); // Returns output directory for the given package name. string JavaPackageToDir(string package_name); // Converts the given fully-qualified name in the proto namespace to its // fully-qualified name in the Java namespace, given that it is in the given // file. // TODO(xiaofeng): this method is deprecated and should be removed in the // future. string ToJavaName(const string& full_name, const FileDescriptor* file); // TODO(xiaofeng): the following methods are kept for they are exposed // publicly in //google/protobuf/compiler/java/names.h. They return // immutable names only and should be removed after mutable API is // integrated into google3. string ClassName(const Descriptor* descriptor); string ClassName(const EnumDescriptor* descriptor); string ClassName(const ServiceDescriptor* descriptor); string ClassName(const FileDescriptor* descriptor); // Comma-separate list of option-specified interfaces implemented by the // Message, to follow the "implements" declaration of the Message definition. string ExtraMessageInterfaces(const Descriptor* descriptor); // Comma-separate list of option-specified interfaces implemented by the // MutableMessage, to follow the "implements" declaration of the MutableMessage // definition. string ExtraMutableMessageInterfaces(const Descriptor* descriptor); // Comma-separate list of option-specified interfaces implemented by the // Builder, to follow the "implements" declaration of the Builder definition. string ExtraBuilderInterfaces(const Descriptor* descriptor); // Comma-separate list of option-specified interfaces extended by the // MessageOrBuilder, to follow the "extends" declaration of the // MessageOrBuilder definition. string ExtraMessageOrBuilderInterfaces(const Descriptor* descriptor); // Get the unqualified Java class name for mutable messages. i.e. without // package or outer classnames. inline string ShortMutableJavaClassName(const Descriptor* descriptor) { return descriptor->name(); } // Whether the given descriptor is for one of the core descriptor protos. We // cannot currently use the new runtime with core protos since there is a // bootstrapping problem with obtaining their descriptors. inline bool IsDescriptorProto(const Descriptor* descriptor) { return descriptor->file()->name() == "google/protobuf/descriptor.proto"; } // Whether we should generate multiple java files for messages. inline bool MultipleJavaFiles( const FileDescriptor* descriptor, bool immutable) { return descriptor->options().java_multiple_files(); } // Returns true if `descriptor` will be written to its own .java file. // `immutable` should be set to true if we're generating for the immutable API. template bool IsOwnFile(const Descriptor* descriptor, bool immutable) { return descriptor->containing_type() == NULL && MultipleJavaFiles(descriptor->file(), immutable); } template <> inline bool IsOwnFile(const ServiceDescriptor* descriptor, bool immutable) { return MultipleJavaFiles(descriptor->file(), immutable); } // If `descriptor` describes an object with its own .java file, // returns the name (relative to that .java file) of the file that stores // annotation data for that descriptor. `suffix` is usually empty, but may // (e.g.) be "OrBuilder" for some generated interfaces. template string AnnotationFileName(const Descriptor* descriptor, const string& suffix) { return descriptor->name() + suffix + ".java.pb.meta"; } template void MaybePrintGeneratedAnnotation(Context* context, io::Printer* printer, Descriptor* descriptor, bool immutable, const string& suffix = "") { if (context->options().annotate_code && IsOwnFile(descriptor, immutable)) { PrintGeneratedAnnotation(printer, '$', AnnotationFileName(descriptor, suffix)); } } // Get the unqualified name that should be used for a field's field // number constant. string FieldConstantName(const FieldDescriptor *field); // Returns the type of the FieldDescriptor. // This does nothing interesting for the open source release, but is used for // hacks that improve compatibility with version 1 protocol buffers at Google. FieldDescriptor::Type GetType(const FieldDescriptor* field); enum JavaType { JAVATYPE_INT, JAVATYPE_LONG, JAVATYPE_FLOAT, JAVATYPE_DOUBLE, JAVATYPE_BOOLEAN, JAVATYPE_STRING, JAVATYPE_BYTES, JAVATYPE_ENUM, JAVATYPE_MESSAGE }; JavaType GetJavaType(const FieldDescriptor* field); const char* PrimitiveTypeName(JavaType type); // Get the fully-qualified class name for a boxed primitive type, e.g. // "java.lang.Integer" for JAVATYPE_INT. Returns NULL for enum and message // types. const char* BoxedPrimitiveTypeName(JavaType type); // Get the name of the java enum constant representing this type. E.g., // "INT32" for FieldDescriptor::TYPE_INT32. The enum constant's full // name is "com.google.protobuf.WireFormat.FieldType.INT32". const char* FieldTypeName(const FieldDescriptor::Type field_type); class ClassNameResolver; string DefaultValue(const FieldDescriptor* field, bool immutable, ClassNameResolver* name_resolver); inline string ImmutableDefaultValue(const FieldDescriptor* field, ClassNameResolver* name_resolver) { return DefaultValue(field, true, name_resolver); } bool IsDefaultValueJavaDefault(const FieldDescriptor* field); bool IsByteStringWithCustomDefaultValue(const FieldDescriptor* field); // Does this message class have descriptor and reflection methods? inline bool HasDescriptorMethods(const Descriptor* descriptor, bool enforce_lite) { return !enforce_lite && descriptor->file()->options().optimize_for() != FileOptions::LITE_RUNTIME; } inline bool HasDescriptorMethods(const EnumDescriptor* descriptor, bool enforce_lite) { return !enforce_lite && descriptor->file()->options().optimize_for() != FileOptions::LITE_RUNTIME; } inline bool HasDescriptorMethods(const FileDescriptor* descriptor, bool enforce_lite) { return !enforce_lite && descriptor->options().optimize_for() != FileOptions::LITE_RUNTIME; } // Should we generate generic services for this file? inline bool HasGenericServices(const FileDescriptor *file, bool enforce_lite) { return file->service_count() > 0 && HasDescriptorMethods(file, enforce_lite) && file->options().java_generic_services(); } // Methods for shared bitfields. // Gets the name of the shared bitfield for the given index. string GetBitFieldName(int index); // Gets the name of the shared bitfield for the given bit index. // Effectively, GetBitFieldName(bitIndex / 32) string GetBitFieldNameForBit(int bitIndex); // Generates the java code for the expression that returns the boolean value // of the bit of the shared bitfields for the given bit index. // Example: "((bitField1_ & 0x04) == 0x04)" string GenerateGetBit(int bitIndex); // Generates the java code for the expression that sets the bit of the shared // bitfields for the given bit index. // Example: "bitField1_ = (bitField1_ | 0x04)" string GenerateSetBit(int bitIndex); // Generates the java code for the expression that clears the bit of the shared // bitfields for the given bit index. // Example: "bitField1_ = (bitField1_ & ~0x04)" string GenerateClearBit(int bitIndex); // Does the same as GenerateGetBit but operates on the bit field on a local // variable. This is used by the builder to copy the value in the builder to // the message. // Example: "((from_bitField1_ & 0x04) == 0x04)" string GenerateGetBitFromLocal(int bitIndex); // Does the same as GenerateSetBit but operates on the bit field on a local // variable. This is used by the builder to copy the value in the builder to // the message. // Example: "to_bitField1_ = (to_bitField1_ | 0x04)" string GenerateSetBitToLocal(int bitIndex); // Does the same as GenerateGetBit but operates on the bit field on a local // variable. This is used by the parsing constructor to record if a repeated // field is mutable. // Example: "((mutable_bitField1_ & 0x04) == 0x04)" string GenerateGetBitMutableLocal(int bitIndex); // Does the same as GenerateSetBit but operates on the bit field on a local // variable. This is used by the parsing constructor to record if a repeated // field is mutable. // Example: "mutable_bitField1_ = (mutable_bitField1_ | 0x04)" string GenerateSetBitMutableLocal(int bitIndex); // Returns whether the JavaType is a reference type. bool IsReferenceType(JavaType type); // Returns the capitalized name for calling relative functions in // CodedInputStream const char* GetCapitalizedType(const FieldDescriptor* field, bool immutable); // For encodings with fixed sizes, returns that size in bytes. Otherwise // returns -1. int FixedSize(FieldDescriptor::Type type); // Comparators used to sort fields in MessageGenerator struct FieldOrderingByNumber { inline bool operator()(const FieldDescriptor* a, const FieldDescriptor* b) const { return a->number() < b->number(); } }; struct ExtensionRangeOrdering { bool operator()(const Descriptor::ExtensionRange* a, const Descriptor::ExtensionRange* b) const { return a->start < b->start; } }; // Sort the fields of the given Descriptor by number into a new[]'d array // and return it. The caller should delete the returned array. const FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor); // Does this message class have any packed fields? inline bool HasPackedFields(const Descriptor* descriptor) { for (int i = 0; i < descriptor->field_count(); i++) { if (descriptor->field(i)->is_packed()) { return true; } } return false; } // Check a message type and its sub-message types recursively to see if any of // them has a required field. Return true if a required field is found. bool HasRequiredFields(const Descriptor* descriptor); // Whether a .proto file supports field presence test for non-message types. inline bool SupportFieldPresence(const FileDescriptor* descriptor) { return descriptor->syntax() != FileDescriptor::SYNTAX_PROTO3; } // Whether generate classes expose public PARSER instances. inline bool ExposePublicParser(const FileDescriptor* descriptor) { // TODO(liujisi): Mark the PARSER private in 3.1.x releases. return descriptor->syntax() == FileDescriptor::SYNTAX_PROTO2; } // Whether unknown enum values are kept (i.e., not stored in UnknownFieldSet // but in the message and can be queried using additional getters that return // ints. inline bool SupportUnknownEnumValue(const FileDescriptor* descriptor) { return descriptor->syntax() == FileDescriptor::SYNTAX_PROTO3; } // Check whether a mesasge has repeated fields. bool HasRepeatedFields(const Descriptor* descriptor); inline bool IsMapEntry(const Descriptor* descriptor) { return descriptor->options().map_entry(); } inline bool IsMapField(const FieldDescriptor* descriptor) { return descriptor->is_map(); } inline bool IsAnyMessage(const Descriptor* descriptor) { return descriptor->full_name() == "google.protobuf.Any"; } inline bool IsWrappersProtoFile(const FileDescriptor* descriptor) { return descriptor->name() == "google/protobuf/wrappers.proto"; } inline bool CheckUtf8(const FieldDescriptor* descriptor) { return descriptor->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 || descriptor->file()->options().java_string_check_utf8(); } inline string GeneratedCodeVersionSuffix() { return "V3"; } inline bool EnableExperimentalRuntime(Context* context) { return false; } void WriteUInt32ToUtf16CharSequence(uint32 number, std::vector* output); inline void WriteIntToUtf16CharSequence(int value, std::vector* output) { WriteUInt32ToUtf16CharSequence(static_cast(value), output); } // Escape a UTF-16 character so it can be embedded in a Java string literal. void EscapeUtf16ToString(uint16 code, string* output); // Only the lowest two bytes of the return value are used. The lowest byte // is the integer value of a j/c/g/protobuf/FieldType enum. For the other // byte: // bit 0: whether the field is required. // bit 1: whether the field requires UTF-8 validation. // bit 2: whether the field needs isInitialized check. // bit 3: whether the field is a map field with proto2 enum value. // bits 4-7: unused int GetExperimentalJavaFieldType(const FieldDescriptor* field); } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__ java_lazy_message_field.cc000066400000000000000000000666251334102242000351220ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: niwasaki@google.com (Naoki Iwasaki) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { ImmutableLazyMessageFieldGenerator:: ImmutableLazyMessageFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutableMessageFieldGenerator( descriptor, messageBitIndex, builderBitIndex, context) { } ImmutableLazyMessageFieldGenerator::~ImmutableLazyMessageFieldGenerator() {} void ImmutableLazyMessageFieldGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private com.google.protobuf.LazyFieldLite $name$_ =\n" " new com.google.protobuf.LazyFieldLite();\n"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean has$capitalized_name$() {\n" " return $get_has_field_bit_message$;\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ get$capitalized_name$() {\n" " return ($type$) $name$_.getValue($type$.getDefaultInstance());\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n" " return $name$_;\n" "}\n"); } void ImmutableLazyMessageFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // When using nested-builders, the code initially works just like the // non-nested builder case. It only creates a nested builder lazily on // demand and then forever delegates to it after creation. printer->Print(variables_, "private com.google.protobuf.LazyFieldLite $name$_ =\n" " new com.google.protobuf.LazyFieldLite();\n"); printer->Print(variables_, // If this builder is non-null, it is used and the other fields are // ignored. "private com.google.protobuf.SingleFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;" "\n"); // The comments above the methods below are based on a hypothetical // field of type "Field" called "Field". // boolean hasField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean has$capitalized_name$() {\n" " return $get_has_field_bit_builder$;\n" "}\n"); printer->Print(variables_, "$deprecation$public $type$ get$capitalized_name$() {\n" " return ($type$) $name$_.getValue($type$.getDefaultInstance());\n" "}\n"); // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder set$capitalized_name$($type$ value)", "if (value == null) {\n" " throw new NullPointerException();\n" "}\n" "$name$_.setValue(value);\n" "$on_changed$\n", NULL, // Lazy fields are supported only for lite-runtime. "$set_has_field_bit_builder$;\n" "return this;\n"); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder set$capitalized_name$(\n" " $type$.Builder builderForValue)", "$name$_.setValue(builderForValue.build());\n" "$on_changed$\n", NULL, "$set_has_field_bit_builder$;\n" "return this;\n"); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder merge$capitalized_name$($type$ value)", "if ($get_has_field_bit_builder$ &&\n" " !$name$_.containsDefaultInstance()) {\n" " $name$_.setValue(\n" " $type$.newBuilder(\n" " get$capitalized_name$()).mergeFrom(value).buildPartial());\n" "} else {\n" " $name$_.setValue(value);\n" "}\n" "$on_changed$\n", NULL, "$set_has_field_bit_builder$;\n" "return this;\n"); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder clear$capitalized_name$()", "$name$_.clear();\n" "$on_changed$\n", NULL, "$clear_has_field_bit_builder$;\n" "return this;\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$.Builder get$capitalized_name$Builder() {\n" " $set_has_field_bit_builder$;\n" " $on_changed$\n" " return get$capitalized_name$FieldBuilder().getBuilder();\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n" " if ($name$Builder_ != null) {\n" " return $name$Builder_.getMessageOrBuilder();\n" " } else {\n" " return $name$_;\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private com.google.protobuf.SingleFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder> \n" " get$capitalized_name$FieldBuilder() {\n" " if ($name$Builder_ == null) {\n" " $name$Builder_ = new com.google.protobuf.SingleFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder>(\n" " $name$_,\n" " getParentForChildren(),\n" " isClean());\n" " $name$_ = null;\n" " }\n" " return $name$Builder_;\n" "}\n"); } void ImmutableLazyMessageFieldGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.clear();\n"); } void ImmutableLazyMessageFieldGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.clear();\n"); printer->Print(variables_, "$clear_has_field_bit_builder$;\n"); } void ImmutableLazyMessageFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "if (other.has$capitalized_name$()) {\n" " $name$_.merge(other.$name$_);\n" " $set_has_field_bit_builder$;\n" "}\n"); } void ImmutableLazyMessageFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { printer->Print(variables_, "if ($get_has_field_bit_from_local$) {\n" " $set_has_field_bit_to_local$;\n" "}\n"); printer->Print(variables_, "result.$name$_.set(\n" " $name$_);\n"); } void ImmutableLazyMessageFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.setByteString(input.readBytes(), extensionRegistry);\n"); printer->Print(variables_, "$set_has_field_bit_message$;\n"); } void ImmutableLazyMessageFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { // Do not de-serialize lazy fields. printer->Print(variables_, "if ($get_has_field_bit_message$) {\n" " output.writeBytes($number$, $name$_.toByteString());\n" "}\n"); } void ImmutableLazyMessageFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($get_has_field_bit_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeLazyFieldSize($number$, $name$_);\n" "}\n"); } // =================================================================== ImmutableLazyMessageOneofFieldGenerator:: ImmutableLazyMessageOneofFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutableLazyMessageFieldGenerator( descriptor, messageBitIndex, builderBitIndex, context) { const OneofGeneratorInfo* info = context->GetOneofGeneratorInfo(descriptor->containing_oneof()); SetCommonOneofVariables(descriptor, info, &variables_); variables_["lazy_type"] = "com.google.protobuf.LazyFieldLite"; } ImmutableLazyMessageOneofFieldGenerator:: ~ImmutableLazyMessageOneofFieldGenerator() {} void ImmutableLazyMessageOneofFieldGenerator:: GenerateMembers(io::Printer* printer) const { PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean has$capitalized_name$() {\n" " return $has_oneof_case_message$;\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ get$capitalized_name$() {\n" " if ($has_oneof_case_message$) {\n" " return ($type$) (($lazy_type$) $oneof_name$_).getValue(\n" " $type$.getDefaultInstance());\n" " }\n" " return $type$.getDefaultInstance();\n" "}\n"); } void ImmutableLazyMessageOneofFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // boolean hasField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean has$capitalized_name$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Print(variables_, "$deprecation$public $type$ get$capitalized_name$() {\n" " if ($has_oneof_case_message$) {\n" " return ($type$) (($lazy_type$) $oneof_name$_).getValue(\n" " $type$.getDefaultInstance());\n" " }\n" " return $type$.getDefaultInstance();\n" "}\n"); // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder set$capitalized_name$($type$ value)", "if (value == null) {\n" " throw new NullPointerException();\n" "}\n" "if (!($has_oneof_case_message$)) {\n" " $oneof_name$_ = new $lazy_type$();\n" " $set_oneof_case_message$;\n" "}\n" "(($lazy_type$) $oneof_name$_).setValue(value);\n" "$on_changed$\n", NULL, // Lazy fields are supported only for lite-runtime. "return this;\n"); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder set$capitalized_name$(\n" " $type$.Builder builderForValue)", "if (!($has_oneof_case_message$)) {\n" " $oneof_name$_ = new $lazy_type$();\n" " $set_oneof_case_message$;\n" "}\n" "(($lazy_type$) $oneof_name$_).setValue(builderForValue.build());\n" "$on_changed$\n", NULL, "return this;\n"); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder merge$capitalized_name$($type$ value)", "if ($has_oneof_case_message$ &&\n" " !(($lazy_type$) $oneof_name$_).containsDefaultInstance()) {\n" " (($lazy_type$) $oneof_name$_).setValue(\n" " $type$.newBuilder(\n" " get$capitalized_name$()).mergeFrom(value).buildPartial());\n" "} else {\n" " if (!($has_oneof_case_message$)) {\n" " $oneof_name$_ = new $lazy_type$();\n" " $set_oneof_case_message$;\n" " }\n" " (($lazy_type$) $oneof_name$_).setValue(value);\n" "}\n" "$on_changed$\n", NULL, "return this;\n"); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder clear$capitalized_name$()", "if ($has_oneof_case_message$) {\n" " $clear_oneof_case_message$;\n" " $oneof_name$_ = null;\n" " $on_changed$\n" "}\n", NULL, "return this;\n"); } void ImmutableLazyMessageOneofFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "if (!($has_oneof_case_message$)) {\n" " $oneof_name$_ = new $lazy_type$();\n" "}\n" "(($lazy_type$) $oneof_name$_).merge(\n" " ($lazy_type$) other.$oneof_name$_);\n" "$set_oneof_case_message$;\n"); } void ImmutableLazyMessageOneofFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n"); printer->Indent(); printer->Print(variables_, "result.$oneof_name$_ = new $lazy_type$();\n" "(($lazy_type$) result.$oneof_name$_).set(\n" " (($lazy_type$) $oneof_name$_));\n"); printer->Outdent(); printer->Print("}\n"); } void ImmutableLazyMessageOneofFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "if (!($has_oneof_case_message$)) {\n" " $oneof_name$_ = new $lazy_type$();\n" "}\n" "(($lazy_type$) $oneof_name$_).setByteString(\n" " input.readBytes(), extensionRegistry);\n" "$set_oneof_case_message$;\n"); } void ImmutableLazyMessageOneofFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { // Do not de-serialize lazy fields. printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " output.writeBytes(\n" " $number$, (($lazy_type$) $oneof_name$_).toByteString());\n" "}\n"); } void ImmutableLazyMessageOneofFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeLazyFieldSize($number$, ($lazy_type$) $oneof_name$_);\n" "}\n"); } // =================================================================== RepeatedImmutableLazyMessageFieldGenerator:: RepeatedImmutableLazyMessageFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : RepeatedImmutableMessageFieldGenerator( descriptor, messageBitIndex, builderBitIndex, context) { } RepeatedImmutableLazyMessageFieldGenerator:: ~RepeatedImmutableLazyMessageFieldGenerator() {} void RepeatedImmutableLazyMessageFieldGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private java.util.List $name$_;\n"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$type$>\n" " get$capitalized_name$List() {\n" " java.util.List<$type$> list =\n" " new java.util.ArrayList<$type$>($name$_.size());\n" " for (com.google.protobuf.LazyFieldLite lf : $name$_) {\n" " list.add(($type$) lf.getValue($type$.getDefaultInstance()));\n" " }\n" " return list;\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List\n" " get$capitalized_name$OrBuilderList() {\n" " return get$capitalized_name$List();\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int get$capitalized_name$Count() {\n" " return $name$_.size();\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ get$capitalized_name$(int index) {\n" " return ($type$)\n" " $name$_.get(index).getValue($type$.getDefaultInstance());\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n" " int index) {\n" " return ($type$OrBuilder)\n" " $name$_.get(index).getValue($type$.getDefaultInstance());\n" "}\n"); } void RepeatedImmutableLazyMessageFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // When using nested-builders, the code initially works just like the // non-nested builder case. It only creates a nested builder lazily on // demand and then forever delegates to it after creation. printer->Print(variables_, "private java.util.List $name$_ =\n" " java.util.Collections.emptyList();\n" "private void ensure$capitalized_name$IsMutable() {\n" " if (!$get_mutable_bit_builder$) {\n" " $name$_ =\n" " new java.util.ArrayList(\n" " $name$_);\n" " $set_mutable_bit_builder$;\n" " }\n" "}\n" "\n"); printer->Print(variables_, // If this builder is non-null, it is used and the other fields are // ignored. "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n" "\n"); // The comments above the methods below are based on a hypothetical // repeated field of type "Field" called "RepeatedField". // List getRepeatedFieldList() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public java.util.List<$type$> get$capitalized_name$List()", "java.util.List<$type$> list =\n" " new java.util.ArrayList<$type$>($name$_.size());\n" "for (com.google.protobuf.LazyFieldLite lf : $name$_) {\n" " list.add(($type$) lf.getValue($type$.getDefaultInstance()));\n" "}\n" "return java.util.Collections.unmodifiableList(list);\n", "return $name$Builder_.getMessageList();\n", NULL); // int getRepeatedFieldCount() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public int get$capitalized_name$Count()", "return $name$_.size();\n", "return $name$Builder_.getCount();\n", NULL); // Field getRepeatedField(int index) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public $type$ get$capitalized_name$(int index)", "return ($type$) $name$_.get(index).getValue(\n" " $type$.getDefaultInstance());\n", "return $name$Builder_.getMessage(index);\n", NULL); // Builder setRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder set$capitalized_name$(\n" " int index, $type$ value)", "if (value == null) {\n" " throw new NullPointerException();\n" "}\n" "ensure$capitalized_name$IsMutable();\n" "$name$_.set(index, com.google.protobuf.LazyFieldLite.fromValue(value));\n" "$on_changed$\n", "$name$Builder_.setMessage(index, value);\n", "return this;\n"); // Builder setRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder set$capitalized_name$(\n" " int index, $type$.Builder builderForValue)", "ensure$capitalized_name$IsMutable();\n" "$name$_.set(index, com.google.protobuf.LazyFieldLite.fromValue(\n" " builderForValue.build()));\n" "$on_changed$\n", "$name$Builder_.setMessage(index, builderForValue.build());\n", "return this;\n"); // Builder addRepeatedField(Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder add$capitalized_name$($type$ value)", "if (value == null) {\n" " throw new NullPointerException();\n" "}\n" "ensure$capitalized_name$IsMutable();\n" "$name$_.add(com.google.protobuf.LazyFieldLite.fromValue(value));\n" "$on_changed$\n", "$name$Builder_.addMessage(value);\n", "return this;\n"); // Builder addRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder add$capitalized_name$(\n" " int index, $type$ value)", "if (value == null) {\n" " throw new NullPointerException();\n" "}\n" "ensure$capitalized_name$IsMutable();\n" "$name$_.add(index, com.google.protobuf.LazyFieldLite.fromValue(value));\n" "$on_changed$\n", "$name$Builder_.addMessage(index, value);\n", "return this;\n"); // Builder addRepeatedField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder add$capitalized_name$(\n" " $type$.Builder builderForValue)", "ensure$capitalized_name$IsMutable();\n" "$name$_.add(com.google.protobuf.LazyFieldLite.fromValue(\n" " builderForValue.build()));\n" "$on_changed$\n", "$name$Builder_.addMessage(builderForValue.build());\n", "return this;\n"); // Builder addRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder add$capitalized_name$(\n" " int index, $type$.Builder builderForValue)", "ensure$capitalized_name$IsMutable();\n" "$name$_.add(index, com.google.protobuf.LazyFieldLite.fromValue(\n" " builderForValue.build()));\n" "$on_changed$\n", "$name$Builder_.addMessage(index, builderForValue.build());\n", "return this;\n"); // Builder addAllRepeatedField(Iterable values) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder addAll$capitalized_name$(\n" " java.lang.Iterable values)", "ensure$capitalized_name$IsMutable();\n" "for (com.google.protobuf.MessageLite v : values) {\n" " $name$_.add(com.google.protobuf.LazyFieldLite.fromValue(v));\n" "}\n" "$on_changed$\n", "$name$Builder_.addAllMessages(values);\n", "return this;\n"); // Builder clearAllRepeatedField() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder clear$capitalized_name$()", "$name$_ = java.util.Collections.emptyList();\n" "$clear_mutable_bit_builder$;\n" "$on_changed$\n", "$name$Builder_.clear();\n", "return this;\n"); // Builder removeRepeatedField(int index) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder remove$capitalized_name$(int index)", "ensure$capitalized_name$IsMutable();\n" "$name$_.remove(index);\n" "$on_changed$\n", "$name$Builder_.remove(index);\n", "return this;\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$.Builder get$capitalized_name$Builder(\n" " int index) {\n" " return get$capitalized_name$FieldBuilder().getBuilder(index);\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n" " int index) {\n" " if ($name$Builder_ == null) {\n" " return $name$_.get(index);" " } else {\n" " return $name$Builder_.getMessageOrBuilder(index);\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List \n" " get$capitalized_name$OrBuilderList() {\n" " if ($name$Builder_ != null) {\n" " return $name$Builder_.getMessageOrBuilderList();\n" " } else {\n" " return java.util.Collections.unmodifiableList($name$_);\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$.Builder add$capitalized_name$Builder() {\n" " return get$capitalized_name$FieldBuilder().addBuilder(\n" " $type$.getDefaultInstance());\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$.Builder add$capitalized_name$Builder(\n" " int index) {\n" " return get$capitalized_name$FieldBuilder().addBuilder(\n" " index, $type$.getDefaultInstance());\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$type$.Builder> \n" " get$capitalized_name$BuilderList() {\n" " return get$capitalized_name$FieldBuilder().getBuilderList();\n" "}\n" "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder> \n" " get$capitalized_name$FieldBuilder() {\n" " if ($name$Builder_ == null) {\n" " $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder>(\n" " $name$_,\n" " $get_mutable_bit_builder$,\n" " getParentForChildren(),\n" " isClean());\n" " $name$_ = null;\n" " }\n" " return $name$Builder_;\n" "}\n"); } void RepeatedImmutableLazyMessageFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "if (!$get_mutable_bit_parser$) {\n" " $name$_ =\n" " new java.util.ArrayList();\n" " $set_mutable_bit_parser$;\n" "}\n" "$name$_.add(new com.google.protobuf.LazyFieldLite(\n" " extensionRegistry, input.readBytes()));\n"); } void RepeatedImmutableLazyMessageFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " output.writeBytes($number$, $name$_.get(i).toByteString());\n" "}\n"); } void RepeatedImmutableLazyMessageFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeLazyFieldSize($number$, $name$_.get(i));\n" "}\n"); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_lazy_message_field.h000066400000000000000000000115601334102242000347500ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: niwasaki@google.com (Naoki Iwasaki) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_LAZY_MESSAGE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_LAZY_MESSAGE_FIELD_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h } } } namespace protobuf { namespace compiler { namespace java { class ImmutableLazyMessageFieldGenerator : public ImmutableMessageFieldGenerator { public: explicit ImmutableLazyMessageFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableLazyMessageFieldGenerator(); // overroads ImmutableMessageFieldGenerator --------------------------------- void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableLazyMessageFieldGenerator); }; class ImmutableLazyMessageOneofFieldGenerator : public ImmutableLazyMessageFieldGenerator { public: ImmutableLazyMessageOneofFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableLazyMessageOneofFieldGenerator(); void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableLazyMessageOneofFieldGenerator); }; class RepeatedImmutableLazyMessageFieldGenerator : public RepeatedImmutableMessageFieldGenerator { public: explicit RepeatedImmutableLazyMessageFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~RepeatedImmutableLazyMessageFieldGenerator(); // overroads RepeatedImmutableMessageFieldGenerator ------------------------- void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableLazyMessageFieldGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_LAZY_MESSAGE_FIELD_H__ java_lazy_message_field_lite.cc000066400000000000000000000626461334102242000361360ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: niwasaki@google.com (Naoki Iwasaki) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { ImmutableLazyMessageFieldLiteGenerator:: ImmutableLazyMessageFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutableMessageFieldLiteGenerator( descriptor, messageBitIndex, builderBitIndex, context) { } ImmutableLazyMessageFieldLiteGenerator:: ~ImmutableLazyMessageFieldLiteGenerator() {} void ImmutableLazyMessageFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private com.google.protobuf.LazyFieldLite $name$_;"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "$deprecation$public boolean has$capitalized_name$() {\n" " return $get_has_field_bit_message$;\n" "}\n"); } else { printer->Print(variables_, "$deprecation$public boolean has$capitalized_name$() {\n" " return $name$_ != null;\n" "}\n"); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ get$capitalized_name$() {\n" " if ($name$_ == null) {\n" " return $type$.getDefaultInstance();\n" " }\n" " return ($type$) $name$_.getValue($type$.getDefaultInstance());\n" "}\n"); // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " if ($name$_ == null) {\n" " $name$_ = new com.google.protobuf.LazyFieldLite();\n" " }\n" " $name$_.setValue(value);\n" " $set_has_field_bit_message$\n" "}\n"); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " $type$.Builder builderForValue) {\n" " if ($name$_ == null) {\n" " $name$_ = new com.google.protobuf.LazyFieldLite();\n" " }\n" " $name$_.setValue(builderForValue.build());\n" " $set_has_field_bit_message$\n" "}\n"); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void merge$capitalized_name$($type$ value) {\n" " if (has$capitalized_name$() &&\n" " !$name$_.containsDefaultInstance()) {\n" " $name$_.setValue(\n" " $type$.newBuilder(\n" " get$capitalized_name$()).mergeFrom(value).buildPartial());\n" " } else {\n" " if ($name$_ == null) {\n" " $name$_ = new com.google.protobuf.LazyFieldLite();\n" " }\n" " $name$_.setValue(value);\n" " $set_has_field_bit_message$\n" " }\n" "}\n"); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " $name$_ = null;\n" " $clear_has_field_bit_message$;\n" "}\n"); } void ImmutableLazyMessageFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // The comments above the methods below are based on a hypothetical // field of type "Field" called "Field". // boolean hasField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean has$capitalized_name$() {\n" " return instance.has$capitalized_name$();\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ get$capitalized_name$() {\n" " return instance.get$capitalized_name$();\n" "}\n"); // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder set$capitalized_name$($type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(value);\n" " return this;\n" "}\n"); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder set$capitalized_name$(\n" " $type$.Builder builderForValue) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(builderForValue);\n" " return this;\n" "}\n"); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder merge$capitalized_name$($type$ value) {\n" " copyOnWrite();\n" " instance.merge$capitalized_name$(value);\n" " return this;\n" "}\n"); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder clear$capitalized_name$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); } void ImmutableLazyMessageFieldLiteGenerator:: GenerateInitializationCode(io::Printer* printer) const {} void ImmutableLazyMessageFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = visitor.visitLazyMessage($name$_, other.$name$_);\n"); } void ImmutableLazyMessageFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "if ($name$_ == null) {\n" " $name$_ = new com.google.protobuf.LazyFieldLite();\n" "}\n" "$name$_.mergeFrom(input, extensionRegistry);\n"); printer->Print(variables_, "$set_has_field_bit_message$\n"); } void ImmutableLazyMessageFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { // Do not de-serialize lazy fields. printer->Print(variables_, "if (has$capitalized_name$()) {\n" " output.writeBytes($number$, $name$_.toByteString());\n" "}\n"); } void ImmutableLazyMessageFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if (has$capitalized_name$()) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeLazyFieldSize($number$, $name$_);\n" "}\n"); } // =================================================================== ImmutableLazyMessageOneofFieldLiteGenerator:: ImmutableLazyMessageOneofFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutableLazyMessageFieldLiteGenerator( descriptor, messageBitIndex, builderBitIndex, context) { const OneofGeneratorInfo* info = context->GetOneofGeneratorInfo(descriptor->containing_oneof()); SetCommonOneofVariables(descriptor, info, &variables_); variables_["lazy_type"] = "com.google.protobuf.LazyFieldLite"; } ImmutableLazyMessageOneofFieldLiteGenerator:: ~ImmutableLazyMessageOneofFieldLiteGenerator() {} void ImmutableLazyMessageOneofFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean has$capitalized_name$() {\n" " return $has_oneof_case_message$;\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ get$capitalized_name$() {\n" " if ($has_oneof_case_message$) {\n" " return ($type$) (($lazy_type$) $oneof_name$_).getValue(\n" " $type$.getDefaultInstance());\n" " }\n" " return $type$.getDefaultInstance();\n" "}\n"); // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " if (!($has_oneof_case_message$)) {\n" " $oneof_name$_ = new $lazy_type$();\n" " $set_oneof_case_message$;\n" " }\n" " (($lazy_type$) $oneof_name$_).setValue(value);\n" "}\n"); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " $type$.Builder builderForValue) {\n" " if (!($has_oneof_case_message$)) {\n" " $oneof_name$_ = new $lazy_type$();\n" " $set_oneof_case_message$;\n" " }\n" " (($lazy_type$) $oneof_name$_).setValue(builderForValue.build());\n" "}\n"); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void merge$capitalized_name$($type$ value) {\n" " if ($has_oneof_case_message$ &&\n" " !(($lazy_type$) $oneof_name$_).containsDefaultInstance()) {\n" " (($lazy_type$) $oneof_name$_).setValue(\n" " $type$.newBuilder(\n" " get$capitalized_name$()).mergeFrom(value).buildPartial());\n" " } else {\n" " if (!($has_oneof_case_message$)) {\n" " $oneof_name$_ = new $lazy_type$();\n" " $set_oneof_case_message$;\n" " }\n" " (($lazy_type$) $oneof_name$_).setValue(value);\n" " }\n" "}\n"); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " if ($has_oneof_case_message$) {\n" " $clear_oneof_case_message$;\n" " $oneof_name$_ = null;\n" " }\n" "}\n"); } void ImmutableLazyMessageOneofFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // boolean hasField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean has$capitalized_name$() {\n" " return instance.has$capitalized_name$();\n" "}\n"); printer->Print(variables_, "$deprecation$public $type$ get$capitalized_name$() {\n" " return instance.get$capitalized_name$();\n" "}\n"); // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder set$capitalized_name$($type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(value);\n" " return this;\n" "}\n"); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder set$capitalized_name$(\n" " $type$.Builder builderForValue) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(builderForValue);\n" " return this;\n" "}\n"); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder merge$capitalized_name$($type$ value) {\n" " copyOnWrite();\n" " instance.merge$capitalized_name$(value);\n" " return this;\n" "}\n"); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder clear$capitalized_name$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); } void ImmutableLazyMessageOneofFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print(variables_, "$oneof_name$_ = visitor.visitOneofLazyMessage(\n" " $has_oneof_case_message$,\n" " ($lazy_type$) $oneof_name$_,\n" " ($lazy_type$) other.$oneof_name$_);\n"); } void ImmutableLazyMessageOneofFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "if (!($has_oneof_case_message$)) {\n" " $oneof_name$_ = new $lazy_type$();\n" "}\n" "(($lazy_type$) $oneof_name$_).mergeFrom(input, extensionRegistry);\n" "$set_oneof_case_message$;\n"); } void ImmutableLazyMessageOneofFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { // Do not de-serialize lazy fields. printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " output.writeBytes(\n" " $number$, (($lazy_type$) $oneof_name$_).toByteString());\n" "}\n"); } void ImmutableLazyMessageOneofFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeLazyFieldSize($number$, ($lazy_type$) $oneof_name$_);\n" "}\n"); } // =================================================================== RepeatedImmutableLazyMessageFieldLiteGenerator:: RepeatedImmutableLazyMessageFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : RepeatedImmutableMessageFieldLiteGenerator( descriptor, messageBitIndex, builderBitIndex, context) { } RepeatedImmutableLazyMessageFieldLiteGenerator:: ~RepeatedImmutableLazyMessageFieldLiteGenerator() {} void RepeatedImmutableLazyMessageFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private com.google.protobuf.Internal.ProtobufList<\n" " com.google.protobuf.LazyFieldLite> $name$_;\n"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$type$>\n" " get$capitalized_name$List() {\n" " java.util.List<$type$> list =\n" " new java.util.ArrayList<$type$>($name$_.size());\n" " for (com.google.protobuf.LazyFieldLite lf : $name$_) {\n" " list.add(($type$) lf.getValue($type$.getDefaultInstance()));\n" " }\n" " return java.util.Collections.unmodifiableList(list);\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List\n" " get$capitalized_name$OrBuilderList() {\n" " return get$capitalized_name$List();\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int get$capitalized_name$Count() {\n" " return $name$_.size();\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ get$capitalized_name$(int index) {\n" " return ($type$)\n" " $name$_.get(index).getValue($type$.getDefaultInstance());\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n" " int index) {\n" " return ($type$OrBuilder)\n" " $name$_.get(index).getValue($type$.getDefaultInstance());\n" "}\n"); printer->Print(variables_, "private void ensure$capitalized_name$IsMutable() {\n" " if (!$is_mutable$) {\n" " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" " }\n" "}\n" "\n"); // Builder setRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " int index, $type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.set(\n" " index, com.google.protobuf.LazyFieldLite.fromValue(value));\n" "}\n"); // Builder setRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " int index, $type$.Builder builderForValue) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.set(index, com.google.protobuf.LazyFieldLite.fromValue(\n" " builderForValue.build()));\n" "}\n"); // Builder addRepeatedField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(com.google.protobuf.LazyFieldLite.fromValue(value));\n" "}\n"); // Builder addRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$(\n" " int index, $type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(\n" " index, com.google.protobuf.LazyFieldLite.fromValue(value));\n" "}\n"); // Builder addRepeatedField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$(\n" " $type$.Builder builderForValue) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(com.google.protobuf.LazyFieldLite.fromValue(\n" " builderForValue.build()));\n" "}\n"); // Builder addRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$(\n" " int index, $type$.Builder builderForValue) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(index, com.google.protobuf.LazyFieldLite.fromValue(\n" " builderForValue.build()));\n" "}\n"); // Builder addAllRepeatedField(Iterable values) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void addAll$capitalized_name$(\n" " java.lang.Iterable values) {\n" " ensure$capitalized_name$IsMutable();\n" " for (com.google.protobuf.MessageLite v : values) {\n" " $name$_.add(com.google.protobuf.LazyFieldLite.fromValue(v));\n" " }\n" "}\n"); // Builder clearAllRepeatedField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " $name$_ = emptyProtobufList();\n" "}\n"); // Builder removeRepeatedField(int index) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void remove$capitalized_name$(int index) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.remove(index);\n" "}\n"); } void RepeatedImmutableLazyMessageFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // List getRepeatedFieldList() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$type$> get$capitalized_name$List() {\n" " return java.util.Collections.unmodifiableList(\n" " instance.get$capitalized_name$List());\n" "}\n"); // int getRepeatedFieldCount() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int get$capitalized_name$Count() {\n" " return instance.get$capitalized_name$Count();\n" "}\n"); // Field getRepeatedField(int index) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ get$capitalized_name$(int index) {\n" " return instance.get$capitalized_name$(index);\n" "}\n"); // Builder setRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder set$capitalized_name$(\n" " int index, $type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(index, value);\n" " return this;\n" "}\n"); // Builder setRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder set$capitalized_name$(\n" " int index, $type$.Builder builderForValue) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(index, builderForValue);\n" " return this;\n" "}\n"); // Builder addRepeatedField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder add$capitalized_name$($type$ value) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$(value);\n" " return this;\n" "}\n"); // Builder addRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder add$capitalized_name$(\n" " int index, $type$ value) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$(index, value);\n" " return this;\n" "}\n"); // Builder addRepeatedField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder add$capitalized_name$(\n" " $type$.Builder builderForValue) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$(builderForValue);\n" " return this;\n" "}\n"); // Builder addRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder add$capitalized_name$(\n" " int index, $type$.Builder builderForValue) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$(index, builderForValue);\n" " return this;\n" "}\n"); // Builder addAllRepeatedField(Iterable values) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder addAll$capitalized_name$(\n" " java.lang.Iterable values) {\n" " copyOnWrite();\n" " instance.addAll$capitalized_name$(values);\n" " return this;\n" "}\n"); // Builder clearAllRepeatedField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder clear$capitalized_name$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); // Builder removeRepeatedField(int index) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder remove$capitalized_name$(int index) {\n" " copyOnWrite();\n" " instance.remove$capitalized_name$(index);\n" " return this;\n" "}\n"); } void RepeatedImmutableLazyMessageFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "if (!$is_mutable$) {\n" " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" "}\n" "$name$_.add(new com.google.protobuf.LazyFieldLite(\n" " extensionRegistry, input.readBytes()));\n"); } void RepeatedImmutableLazyMessageFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " output.writeBytes($number$, $name$_.get(i).toByteString());\n" "}\n"); } void RepeatedImmutableLazyMessageFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeLazyFieldSize($number$, $name$_.get(i));\n" "}\n"); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_lazy_message_field_lite.h000066400000000000000000000114221334102242000357620ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: niwasaki@google.com (Naoki Iwasaki) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_LAZY_MESSAGE_FIELD_LITE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_LAZY_MESSAGE_FIELD_LITE_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h } } } namespace protobuf { namespace compiler { namespace java { class ImmutableLazyMessageFieldLiteGenerator : public ImmutableMessageFieldLiteGenerator { public: explicit ImmutableLazyMessageFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableLazyMessageFieldLiteGenerator(); // overroads ImmutableMessageFieldLiteGenerator ------------------------------ void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableLazyMessageFieldLiteGenerator); }; class ImmutableLazyMessageOneofFieldLiteGenerator : public ImmutableLazyMessageFieldLiteGenerator { public: ImmutableLazyMessageOneofFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableLazyMessageOneofFieldLiteGenerator(); void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableLazyMessageOneofFieldLiteGenerator); }; class RepeatedImmutableLazyMessageFieldLiteGenerator : public RepeatedImmutableMessageFieldLiteGenerator { public: explicit RepeatedImmutableLazyMessageFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~RepeatedImmutableLazyMessageFieldLiteGenerator(); // overroads RepeatedImmutableMessageFieldLiteGenerator ---------------------- void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableLazyMessageFieldLiteGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_LAZY_MESSAGE_FIELD_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_map_field.cc000066400000000000000000000745041334102242000332660ustar00rootroot00000000000000// 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 #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { const FieldDescriptor* KeyField(const FieldDescriptor* descriptor) { GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, descriptor->type()); const Descriptor* message = descriptor->message_type(); GOOGLE_CHECK(message->options().map_entry()); return message->FindFieldByName("key"); } const FieldDescriptor* ValueField(const FieldDescriptor* descriptor) { GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, descriptor->type()); const Descriptor* message = descriptor->message_type(); GOOGLE_CHECK(message->options().map_entry()); return message->FindFieldByName("value"); } string TypeName(const FieldDescriptor* field, ClassNameResolver* name_resolver, bool boxed) { if (GetJavaType(field) == JAVATYPE_MESSAGE) { return name_resolver->GetImmutableClassName(field->message_type()); } else if (GetJavaType(field) == JAVATYPE_ENUM) { return name_resolver->GetImmutableClassName(field->enum_type()); } else { return boxed ? BoxedPrimitiveTypeName(GetJavaType(field)) : PrimitiveTypeName(GetJavaType(field)); } } string WireType(const FieldDescriptor* field) { return "com.google.protobuf.WireFormat.FieldType." + string(FieldTypeName(field->type())); } void SetMessageVariables(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, const FieldGeneratorInfo* info, Context* context, std::map* variables) { SetCommonFieldVariables(descriptor, info, variables); ClassNameResolver* name_resolver = context->GetNameResolver(); (*variables)["type"] = name_resolver->GetImmutableClassName(descriptor->message_type()); const FieldDescriptor* key = KeyField(descriptor); const FieldDescriptor* value = ValueField(descriptor); const JavaType keyJavaType = GetJavaType(key); const JavaType valueJavaType = GetJavaType(value); (*variables)["key_type"] = TypeName(key, name_resolver, false); string boxed_key_type = TypeName(key, name_resolver, true); (*variables)["boxed_key_type"] = boxed_key_type; // Used for calling the serialization function. (*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_null_check"] = IsReferenceType(keyJavaType) ? "if (key == null) { throw new java.lang.NullPointerException(); }" : ""; (*variables)["value_null_check"] = IsReferenceType(valueJavaType) ? "if (value == null) { throw new java.lang.NullPointerException(); }" : ""; if (valueJavaType == JAVATYPE_ENUM) { // We store enums as Integers internally. (*variables)["value_type"] = "int"; (*variables)["boxed_value_type"] = "java.lang.Integer"; (*variables)["value_wire_type"] = WireType(value); (*variables)["value_default_value"] = DefaultValue(value, true, name_resolver) + ".getNumber()"; (*variables)["value_enum_type"] = TypeName(value, name_resolver, false); if (SupportUnknownEnumValue(descriptor->file())) { // Map unknown values to a special UNRECOGNIZED value if supported. (*variables)["unrecognized_value"] = (*variables)["value_enum_type"] + ".UNRECOGNIZED"; } else { // Map unknown values to the default value if we don't have UNRECOGNIZED. (*variables)["unrecognized_value"] = DefaultValue(value, true, name_resolver); } } else { (*variables)["value_type"] = TypeName(value, name_resolver, false); (*variables)["boxed_value_type"] = TypeName(value, name_resolver, true); (*variables)["value_wire_type"] = WireType(value); (*variables)["value_default_value"] = DefaultValue(value, true, name_resolver); } (*variables)["type_parameters"] = (*variables)["boxed_key_type"] + ", " + (*variables)["boxed_value_type"]; // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported // by the proto compiler (*variables)["deprecation"] = descriptor->options().deprecated() ? "@java.lang.Deprecated " : ""; (*variables)["on_changed"] = "onChanged();"; // For repeated fields, one bit is used for whether the array is immutable // in the parsing constructor. (*variables)["get_mutable_bit_parser"] = GenerateGetBitMutableLocal(builderBitIndex); (*variables)["set_mutable_bit_parser"] = GenerateSetBitMutableLocal(builderBitIndex); (*variables)["default_entry"] = (*variables)["capitalized_name"] + "DefaultEntryHolder.defaultEntry"; (*variables)["map_field_parameter"] = (*variables)["default_entry"]; (*variables)["descriptor"] = name_resolver->GetImmutableClassName(descriptor->file()) + ".internal_" + UniqueFileScopeIdentifier(descriptor->message_type()) + "_descriptor, "; (*variables)["ver"] = GeneratedCodeVersionSuffix(); } } // namespace ImmutableMapFieldGenerator:: ImmutableMapFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), name_resolver_(context->GetNameResolver()) { SetMessageVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), context, &variables_); } ImmutableMapFieldGenerator:: ~ImmutableMapFieldGenerator() {} int ImmutableMapFieldGenerator::GetNumBitsForMessage() const { return 0; } int ImmutableMapFieldGenerator::GetNumBitsForBuilder() const { return 1; } void ImmutableMapFieldGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$int ${$get$capitalized_name$Count$}$();\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$boolean ${$contains$capitalized_name$$}$(\n" " $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_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$java.util.Map<$boxed_key_type$, $value_enum_type$>\n" "${$get$capitalized_name$Map$}$();\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$$value_enum_type$ ${$get$capitalized_name$OrDefault$}$(\n" " $key_type$ key,\n" " $value_enum_type$ defaultValue);\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$$value_enum_type$ ${$get$capitalized_name$OrThrow$}$(\n" " $key_type$ key);\n"); printer->Annotate("{", "}", descriptor_); if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print( variables_, "/**\n" " * Use {@link #get$capitalized_name$ValueMap()} instead.\n" " */\n" "@java.lang.Deprecated\n" "java.util.Map<$type_parameters$>\n" "${$get$capitalized_name$Value$}$();\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$java.util.Map<$type_parameters$>\n" "${$get$capitalized_name$ValueMap$}$();\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "$value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n" " $key_type$ key,\n" " $value_type$ defaultValue);\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "$value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n" " $key_type$ key);\n"); 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_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$java.util.Map<$type_parameters$>\n" "${$get$capitalized_name$Map$}$();\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "$value_type$ ${$get$capitalized_name$OrDefault$}$(\n" " $key_type$ key,\n" " $value_type$ defaultValue);\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "$value_type$ ${$get$capitalized_name$OrThrow$}$(\n" " $key_type$ key);\n"); printer->Annotate("{", "}", descriptor_); } } void ImmutableMapFieldGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print( variables_, "private static final class $capitalized_name$DefaultEntryHolder {\n" " static final com.google.protobuf.MapEntry<\n" " $type_parameters$> defaultEntry =\n" " com.google.protobuf.MapEntry\n" " .<$type_parameters$>newDefaultInstance(\n" " $descriptor$\n" " $key_wire_type$,\n" " $key_default_value$,\n" " $value_wire_type$,\n" " $value_default_value$);\n" "}\n"); printer->Print( variables_, "private com.google.protobuf.MapField<\n" " $type_parameters$> $name$_;\n" "private com.google.protobuf.MapField<$type_parameters$>\n" "internalGet$capitalized_name$() {\n" " if ($name$_ == null) {\n" " return com.google.protobuf.MapField.emptyMapField(\n" " $map_field_parameter$);\n" " }\n" " return $name$_;\n" "}\n"); if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) { printer->Print( variables_, "private static final\n" "com.google.protobuf.Internal.MapAdapter.Converter<\n" " java.lang.Integer, $value_enum_type$> $name$ValueConverter =\n" " com.google.protobuf.Internal.MapAdapter.newEnumConverter(\n" " $value_enum_type$.internalGetValueMap(),\n" " $unrecognized_value$);\n"); printer->Print( variables_, "private static final java.util.Map<$boxed_key_type$, " "$value_enum_type$>\n" "internalGetAdapted$capitalized_name$Map(\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> map) {\n" " return new com.google.protobuf.Internal.MapAdapter<\n" " $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n" " map, $name$ValueConverter);\n" "}\n"); } GenerateMapGetters(printer); } void ImmutableMapFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { printer->Print( variables_, "private com.google.protobuf.MapField<\n" " $type_parameters$> $name$_;\n" "private com.google.protobuf.MapField<$type_parameters$>\n" "internalGet$capitalized_name$() {\n" " if ($name$_ == null) {\n" " return com.google.protobuf.MapField.emptyMapField(\n" " $map_field_parameter$);\n" " }\n" " return $name$_;\n" "}\n" "private com.google.protobuf.MapField<$type_parameters$>\n" "internalGetMutable$capitalized_name$() {\n" " $on_changed$;\n" " if ($name$_ == null) {\n" " $name$_ = com.google.protobuf.MapField.newMapField(\n" " $map_field_parameter$);\n" " }\n" " if (!$name$_.isMutable()) {\n" " $name$_ = $name$_.copy();\n" " }\n" " return $name$_;\n" "}\n"); GenerateMapGetters(printer); printer->Print( variables_, "$deprecation$\n" "public Builder ${$clear$capitalized_name$$}$() {\n" " internalGetMutable$capitalized_name$().getMutableMap()\n" " .clear();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public Builder ${$remove$capitalized_name$$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " internalGetMutable$capitalized_name$().getMutableMap()\n" " .remove(key);\n" " return this;\n" "}\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_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$put$capitalized_name$$}$(\n" " $key_type$ key,\n" " $value_enum_type$ value) {\n" " $key_null_check$\n" " $value_null_check$\n" " internalGetMutable$capitalized_name$().getMutableMap()\n" " .put(key, $name$ValueConverter.doBackward(value));\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$public Builder ${$putAll$capitalized_name$$}$(\n" " java.util.Map<$boxed_key_type$, $value_enum_type$> values) {\n" " internalGetAdapted$capitalized_name$Map(\n" " internalGetMutable$capitalized_name$().getMutableMap())\n" " .putAll(values);\n" " return this;\n" "}\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_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$public Builder ${$put$capitalized_name$Value$}$(\n" " $key_type$ key,\n" " $value_type$ value) {\n" " $key_null_check$\n" " internalGetMutable$capitalized_name$().getMutableMap()\n" " .put(key, value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$public Builder ${$putAll$capitalized_name$Value$}$(\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> values) {\n" " internalGetMutable$capitalized_name$().getMutableMap()\n" " .putAll(values);\n" " return this;\n" "}\n"); 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_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$" "public Builder ${$put$capitalized_name$$}$(\n" " $key_type$ key,\n" " $value_type$ value) {\n" " $key_null_check$\n" " $value_null_check$\n" " internalGetMutable$capitalized_name$().getMutableMap()\n" " .put(key, value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public Builder ${$putAll$capitalized_name$$}$(\n" " java.util.Map<$type_parameters$> values) {\n" " internalGetMutable$capitalized_name$().getMutableMap()\n" " .putAll(values);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } } void ImmutableMapFieldGenerator:: GenerateMapGetters(io::Printer* printer) const { printer->Print( variables_, "$deprecation$\n" "public int ${$get$capitalized_name$Count$}$() {\n" " return internalGet$capitalized_name$().getMap().size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public boolean ${$contains$capitalized_name$$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " return internalGet$capitalized_name$().getMap().containsKey(key);\n" "}\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_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n" "${$get$capitalized_name$Map$}$() {\n" " return internalGetAdapted$capitalized_name$Map(\n" " internalGet$capitalized_name$().getMap());" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_enum_type$ ${$get$capitalized_name$OrDefault$}$(\n" " $key_type$ key,\n" " $value_enum_type$ defaultValue) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n" " internalGet$capitalized_name$().getMap();\n" " return map.containsKey(key)\n" " ? $name$ValueConverter.doForward(map.get(key))\n" " : defaultValue;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_enum_type$ ${$get$capitalized_name$OrThrow$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n" " internalGet$capitalized_name$().getMap();\n" " if (!map.containsKey(key)) {\n" " throw new java.lang.IllegalArgumentException();\n" " }\n" " return $name$ValueConverter.doForward(map.get(key));\n" "}\n"); printer->Annotate("{", "}", descriptor_); if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print( variables_, "/**\n" " * Use {@link #get$capitalized_name$ValueMap()} instead.\n" " */\n" "@java.lang.Deprecated\n" "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n" "${$get$capitalized_name$Value$}$() {\n" " return get$capitalized_name$ValueMap();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n" "${$get$capitalized_name$ValueMap$}$() {\n" " return internalGet$capitalized_name$().getMap();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n" " $key_type$ key,\n" " $value_type$ defaultValue) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n" " internalGet$capitalized_name$().getMap();\n" " return map.containsKey(key) ? map.get(key) : defaultValue;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n" " internalGet$capitalized_name$().getMap();\n" " if (!map.containsKey(key)) {\n" " throw new java.lang.IllegalArgumentException();\n" " }\n" " return map.get(key);\n" "}\n"); printer->Annotate("{", "}", descriptor_); } } else { printer->Print( variables_, "/**\n" " * Use {@link #get$capitalized_name$Map()} instead.\n" " */\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_, "$deprecation$\n" "public java.util.Map<$type_parameters$> " "${$get$capitalized_name$Map$}$() {\n" " return internalGet$capitalized_name$().getMap();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$OrDefault$}$(\n" " $key_type$ key,\n" " $value_type$ defaultValue) {\n" " $key_null_check$\n" " java.util.Map<$type_parameters$> map =\n" " internalGet$capitalized_name$().getMap();\n" " return map.containsKey(key) ? map.get(key) : defaultValue;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$OrThrow$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " java.util.Map<$type_parameters$> map =\n" " internalGet$capitalized_name$().getMap();\n" " if (!map.containsKey(key)) {\n" " throw new java.lang.IllegalArgumentException();\n" " }\n" " return map.get(key);\n" "}\n"); printer->Annotate("{", "}", descriptor_); } } void ImmutableMapFieldGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // Nothing to initialize. } void ImmutableMapFieldGenerator:: GenerateInitializationCode(io::Printer* printer) const { // Nothing to initialize. } void ImmutableMapFieldGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { printer->Print( variables_, "internalGetMutable$capitalized_name$().clear();\n"); } void ImmutableMapFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print( variables_, "internalGetMutable$capitalized_name$().mergeFrom(\n" " other.internalGet$capitalized_name$());\n"); } void ImmutableMapFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { printer->Print( variables_, "result.$name$_ = internalGet$capitalized_name$();\n" "result.$name$_.makeImmutable();\n"); } void ImmutableMapFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print( variables_, "if (!$get_mutable_bit_parser$) {\n" " $name$_ = com.google.protobuf.MapField.newMapField(\n" " $map_field_parameter$);\n" " $set_mutable_bit_parser$;\n" "}\n"); if (!SupportUnknownEnumValue(descriptor_->file()) && GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) { printer->Print( variables_, "com.google.protobuf.ByteString bytes = input.readBytes();\n" "com.google.protobuf.MapEntry<$type_parameters$>\n" "$name$__ = $default_entry$.getParserForType().parseFrom(bytes);\n"); printer->Print( variables_, "if ($value_enum_type$.forNumber($name$__.getValue()) == null) {\n" " unknownFields.mergeLengthDelimitedField($number$, bytes);\n" "} else {\n" " $name$_.getMutableMap().put(\n" " $name$__.getKey(), $name$__.getValue());\n" "}\n"); } else { printer->Print( variables_, "com.google.protobuf.MapEntry<$type_parameters$>\n" "$name$__ = input.readMessage(\n" " $default_entry$.getParserForType(), extensionRegistry);\n" "$name$_.getMutableMap().put(\n" " $name$__.getKey(), $name$__.getValue());\n"); } } void ImmutableMapFieldGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { // Nothing to do here. } void ImmutableMapFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print( variables_, "com.google.protobuf.GeneratedMessage$ver$\n" " .serialize$short_key_type$MapTo(\n" " output,\n" " internalGet$capitalized_name$(),\n" " $default_entry$,\n" " $number$);\n"); } void ImmutableMapFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print( variables_, "for (java.util.Map.Entry<$type_parameters$> entry\n" " : internalGet$capitalized_name$().getMap().entrySet()) {\n" " com.google.protobuf.MapEntry<$type_parameters$>\n" " $name$__ = $default_entry$.newBuilderForType()\n" " .setKey(entry.getKey())\n" " .setValue(entry.getValue())\n" " .build();\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeMessageSize($number$, $name$__);\n" "}\n"); } void ImmutableMapFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print( variables_, "result = result && internalGet$capitalized_name$().equals(\n" " other.internalGet$capitalized_name$());\n"); } void ImmutableMapFieldGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print( variables_, "if (!internalGet$capitalized_name$().getMap().isEmpty()) {\n" " hash = (37 * hash) + $constant_name$;\n" " hash = (53 * hash) + internalGet$capitalized_name$().hashCode();\n" "}\n"); } string ImmutableMapFieldGenerator::GetBoxedType() const { return name_resolver_->GetImmutableClassName(descriptor_->message_type()); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_map_field.h000066400000000000000000000066641334102242000331320ustar00rootroot00000000000000// 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_MAP_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_MAP_FIELD_H__ #include namespace google { namespace protobuf { namespace compiler { namespace java { class ImmutableMapFieldGenerator : public ImmutableFieldGenerator { public: explicit ImmutableMapFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableMapFieldGenerator(); // implements ImmutableFieldGenerator --------------------------------------- int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; private: const FieldDescriptor* descriptor_; std::map variables_; ClassNameResolver* name_resolver_; void GenerateMapGetters(io::Printer* printer) const; }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MAP_FIELD_H__ java_map_field_lite.cc000066400000000000000000001033211334102242000342120ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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 #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { const FieldDescriptor* KeyField(const FieldDescriptor* descriptor) { GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, descriptor->type()); const Descriptor* message = descriptor->message_type(); GOOGLE_CHECK(message->options().map_entry()); return message->FindFieldByName("key"); } const FieldDescriptor* ValueField(const FieldDescriptor* descriptor) { GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, descriptor->type()); const Descriptor* message = descriptor->message_type(); GOOGLE_CHECK(message->options().map_entry()); return message->FindFieldByName("value"); } string TypeName(const FieldDescriptor* field, ClassNameResolver* name_resolver, bool boxed) { if (GetJavaType(field) == JAVATYPE_MESSAGE) { return name_resolver->GetImmutableClassName(field->message_type()); } else if (GetJavaType(field) == JAVATYPE_ENUM) { return name_resolver->GetImmutableClassName(field->enum_type()); } else { return boxed ? BoxedPrimitiveTypeName(GetJavaType(field)) : PrimitiveTypeName(GetJavaType(field)); } } string WireType(const FieldDescriptor* field) { return "com.google.protobuf.WireFormat.FieldType." + string(FieldTypeName(field->type())); } void SetMessageVariables(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, const FieldGeneratorInfo* info, Context* context, std::map* variables) { SetCommonFieldVariables(descriptor, info, variables); ClassNameResolver* name_resolver = context->GetNameResolver(); (*variables)["type"] = name_resolver->GetImmutableClassName(descriptor->message_type()); const FieldDescriptor* key = KeyField(descriptor); const FieldDescriptor* value = ValueField(descriptor); const JavaType keyJavaType = GetJavaType(key); const JavaType valueJavaType = GetJavaType(value); (*variables)["key_type"] = TypeName(key, name_resolver, false); (*variables)["boxed_key_type"] = TypeName(key, name_resolver, true); (*variables)["key_wire_type"] = WireType(key); (*variables)["key_default_value"] = DefaultValue(key, true, name_resolver); (*variables)["key_null_check"] = IsReferenceType(keyJavaType) ? "if (key == null) { throw new java.lang.NullPointerException(); }" : ""; (*variables)["value_null_check"] = IsReferenceType(valueJavaType) ? "if (value == null) { throw new java.lang.NullPointerException(); }" : ""; if (GetJavaType(value) == JAVATYPE_ENUM) { // We store enums as Integers internally. (*variables)["value_type"] = "int"; (*variables)["boxed_value_type"] = "java.lang.Integer"; (*variables)["value_wire_type"] = WireType(value); (*variables)["value_default_value"] = DefaultValue(value, true, name_resolver) + ".getNumber()"; (*variables)["value_enum_type"] = TypeName(value, name_resolver, false); if (SupportUnknownEnumValue(descriptor->file())) { // Map unknown values to a special UNRECOGNIZED value if supported. (*variables)["unrecognized_value"] = (*variables)["value_enum_type"] + ".UNRECOGNIZED"; } else { // Map unknown values to the default value if we don't have UNRECOGNIZED. (*variables)["unrecognized_value"] = DefaultValue(value, true, name_resolver); } } else { (*variables)["value_type"] = TypeName(value, name_resolver, false); (*variables)["boxed_value_type"] = TypeName(value, name_resolver, true); (*variables)["value_wire_type"] = WireType(value); (*variables)["value_default_value"] = DefaultValue(value, true, name_resolver); } (*variables)["type_parameters"] = (*variables)["boxed_key_type"] + ", " + (*variables)["boxed_value_type"]; // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported // by the proto compiler (*variables)["deprecation"] = descriptor->options().deprecated() ? "@java.lang.Deprecated " : ""; (*variables)["default_entry"] = (*variables)["capitalized_name"] + "DefaultEntryHolder.defaultEntry"; } } // namespace ImmutableMapFieldLiteGenerator:: ImmutableMapFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), name_resolver_(context->GetNameResolver()) { SetMessageVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), context, &variables_); } ImmutableMapFieldLiteGenerator:: ~ImmutableMapFieldLiteGenerator() {} int ImmutableMapFieldLiteGenerator::GetNumBitsForMessage() const { return 0; } int ImmutableMapFieldLiteGenerator::GetNumBitsForBuilder() const { return 0; } void ImmutableMapFieldLiteGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$int ${$get$capitalized_name$Count$}$();\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$boolean ${$contains$capitalized_name$$}$(\n" " $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_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$java.util.Map<$boxed_key_type$, $value_enum_type$>\n" "${$get$capitalized_name$Map$}$();\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$$value_enum_type$ ${$get$capitalized_name$OrDefault$}$(\n" " $key_type$ key,\n" " $value_enum_type$ defaultValue);\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$$value_enum_type$ ${$get$capitalized_name$OrThrow$}$(\n" " $key_type$ key);\n"); printer->Annotate("{", "}", descriptor_); if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print( variables_, "/**\n" " * Use {@link #get$capitalized_name$ValueMap()} instead.\n" " */\n" "@java.lang.Deprecated\n" "java.util.Map<$type_parameters$>\n" "${$get$capitalized_name$Value$}$();\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$java.util.Map<$type_parameters$>\n" "${$get$capitalized_name$ValueMap$}$();\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "$value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n" " $key_type$ key,\n" " $value_type$ defaultValue);\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "$value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n" " $key_type$ key);\n"); 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_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$java.util.Map<$type_parameters$>\n" "${$get$capitalized_name$Map$}$();\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "$value_type$ ${$get$capitalized_name$OrDefault$}$(\n" " $key_type$ key,\n" " $value_type$ defaultValue);\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "$value_type$ ${$get$capitalized_name$OrThrow$}$(\n" " $key_type$ key);\n"); printer->Annotate("{", "}", descriptor_); } } void ImmutableMapFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print( variables_, "private static final class $capitalized_name$DefaultEntryHolder {\n" " static final com.google.protobuf.MapEntryLite<\n" " $type_parameters$> defaultEntry =\n" " com.google.protobuf.MapEntryLite\n" " .<$type_parameters$>newDefaultInstance(\n" " $key_wire_type$,\n" " $key_default_value$,\n" " $value_wire_type$,\n" " $value_default_value$);\n" "}\n"); printer->Print( variables_, "private com.google.protobuf.MapFieldLite<\n" " $type_parameters$> $name$_ =\n" " com.google.protobuf.MapFieldLite.emptyMapField();\n" "private com.google.protobuf.MapFieldLite<$type_parameters$>\n" "internalGet$capitalized_name$() {\n" " return $name$_;\n" "}\n" "private com.google.protobuf.MapFieldLite<$type_parameters$>\n" "internalGetMutable$capitalized_name$() {\n" " if (!$name$_.isMutable()) {\n" " $name$_ = $name$_.mutableCopy();\n" " }\n" " return $name$_;\n" "}\n"); printer->Print( variables_, "$deprecation$\n" "public int ${$get$capitalized_name$Count$}$() {\n" " return internalGet$capitalized_name$().size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public boolean ${$contains$capitalized_name$$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " return internalGet$capitalized_name$().containsKey(key);\n" "}\n"); printer->Annotate("{", "}", descriptor_); if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) { printer->Print( variables_, "private static final\n" "com.google.protobuf.Internal.MapAdapter.Converter<\n" " java.lang.Integer, $value_enum_type$> $name$ValueConverter =\n" " 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_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n" "${$get$capitalized_name$Map$}$() {\n" " return java.util.Collections.unmodifiableMap(\n" " new com.google.protobuf.Internal.MapAdapter<\n" " $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n" " internalGet$capitalized_name$(),\n" " $name$ValueConverter));\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_enum_type$ ${$get$capitalized_name$OrDefault$}$(\n" " $key_type$ key,\n" " $value_enum_type$ defaultValue) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n" " internalGet$capitalized_name$();\n" " return map.containsKey(key)\n" " ? $name$ValueConverter.doForward(map.get(key))\n" " : defaultValue;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_enum_type$ ${$get$capitalized_name$OrThrow$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n" " internalGet$capitalized_name$();\n" " if (!map.containsKey(key)) {\n" " throw new java.lang.IllegalArgumentException();\n" " }\n" " return $name$ValueConverter.doForward(map.get(key));\n" "}\n"); printer->Annotate("{", "}", descriptor_); if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print( variables_, "/**\n" " * Use {@link #get$capitalized_name$ValueMap()} instead.\n" " */\n" "@java.lang.Deprecated\n" "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n" "${$get$capitalized_name$Value$}$() {\n" " return get$capitalized_name$ValueMap();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n" "${$get$capitalized_name$ValueMap$}$() {\n" " return java.util.Collections.unmodifiableMap(\n" " internalGet$capitalized_name$());\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n" " $key_type$ key,\n" " $value_type$ defaultValue) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n" " internalGet$capitalized_name$();\n" " return map.containsKey(key) ? map.get(key) : defaultValue;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n" " internalGet$capitalized_name$();\n" " if (!map.containsKey(key)) {\n" " throw new java.lang.IllegalArgumentException();\n" " }\n" " return map.get(key);\n" "}\n"); printer->Annotate("{", "}", descriptor_); } } else { printer->Print( variables_, "/**\n" " * Use {@link #get$capitalized_name$Map()} instead.\n" " */\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_, "$deprecation$\n" "public java.util.Map<$type_parameters$> " "${$get$capitalized_name$Map$}$() {\n" " return java.util.Collections.unmodifiableMap(\n" " internalGet$capitalized_name$());\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$OrDefault$}$(\n" " $key_type$ key,\n" " $value_type$ defaultValue) {\n" " $key_null_check$\n" " java.util.Map<$type_parameters$> map =\n" " internalGet$capitalized_name$();\n" " return map.containsKey(key) ? map.get(key) : defaultValue;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$OrThrow$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " java.util.Map<$type_parameters$> map =\n" " internalGet$capitalized_name$();\n" " if (!map.containsKey(key)) {\n" " throw new java.lang.IllegalArgumentException();\n" " }\n" " return map.get(key);\n" "}\n"); printer->Annotate("{", "}", descriptor_); } // Generate private setters for the builder to proxy into. if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) { WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "private java.util.Map<$boxed_key_type$, $value_enum_type$>\n" "getMutable$capitalized_name$Map() {\n" " return new com.google.protobuf.Internal.MapAdapter<\n" " $boxed_key_type$, $value_enum_type$, java.lang.Integer>(\n" " internalGetMutable$capitalized_name$(),\n" " $name$ValueConverter);\n" "}\n"); if (SupportUnknownEnumValue(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "private java.util.Map<$boxed_key_type$, $boxed_value_type$>\n" "getMutable$capitalized_name$ValueMap() {\n" " return internalGetMutable$capitalized_name$();\n" "}\n"); } } else { WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "private java.util.Map<$type_parameters$>\n" "getMutable$capitalized_name$Map() {\n" " return internalGetMutable$capitalized_name$();\n" "}\n"); } } void ImmutableMapFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { printer->Print( variables_, "$deprecation$\n" "public int ${$get$capitalized_name$Count$}$() {\n" " return instance.get$capitalized_name$Map().size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public boolean ${$contains$capitalized_name$$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " return instance.get$capitalized_name$Map().containsKey(key);\n" "}\n"); printer->Annotate("{", "}", descriptor_); printer->Print( variables_, "$deprecation$\n" "public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.getMutable$capitalized_name$Map().clear();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public Builder ${$remove$capitalized_name$$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " copyOnWrite();\n" " instance.getMutable$capitalized_name$Map().remove(key);\n" " return this;\n" "}\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_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n" "${$get$capitalized_name$Map$}$() {\n" " return java.util.Collections.unmodifiableMap(\n" " instance.get$capitalized_name$Map());\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_enum_type$ ${$get$capitalized_name$OrDefault$}$(\n" " $key_type$ key,\n" " $value_enum_type$ defaultValue) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $value_enum_type$> map =\n" " instance.get$capitalized_name$Map();\n" " return map.containsKey(key)\n" " ? map.get(key)\n" " : defaultValue;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_enum_type$ ${$get$capitalized_name$OrThrow$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $value_enum_type$> map =\n" " instance.get$capitalized_name$Map();\n" " if (!map.containsKey(key)) {\n" " throw new java.lang.IllegalArgumentException();\n" " }\n" " return map.get(key);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$public Builder ${$put$capitalized_name$$}$(\n" " $key_type$ key,\n" " $value_enum_type$ value) {\n" " $key_null_check$\n" " $value_null_check$\n" " copyOnWrite();\n" " instance.getMutable$capitalized_name$Map().put(key, value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$public Builder ${$putAll$capitalized_name$$}$(\n" " java.util.Map<$boxed_key_type$, $value_enum_type$> values) {\n" " copyOnWrite();\n" " instance.getMutable$capitalized_name$Map().putAll(values);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); if (SupportUnknownEnumValue(descriptor_->file())) { printer->Print( variables_, "/**\n" " * Use {@link #get$capitalized_name$ValueMap()} instead.\n" " */\n" "@java.lang.Deprecated\n" "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n" "${$get$capitalized_name$Value$}$() {\n" " return get$capitalized_name$ValueMap();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public java.util.Map<$boxed_key_type$, $boxed_value_type$>\n" "${$get$capitalized_name$ValueMap$}$() {\n" " return java.util.Collections.unmodifiableMap(\n" " instance.get$capitalized_name$ValueMap());\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n" " $key_type$ key,\n" " $value_type$ defaultValue) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n" " instance.get$capitalized_name$ValueMap();\n" " return map.containsKey(key) ? map.get(key) : defaultValue;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> map =\n" " instance.get$capitalized_name$ValueMap();\n" " if (!map.containsKey(key)) {\n" " throw new java.lang.IllegalArgumentException();\n" " }\n" " return map.get(key);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$public Builder ${$put$capitalized_name$Value$}$(\n" " $key_type$ key,\n" " $value_type$ value) {\n" " $key_null_check$\n" " copyOnWrite();\n" " instance.getMutable$capitalized_name$ValueMap().put(key, value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$public Builder ${$putAll$capitalized_name$Value$}$(\n" " java.util.Map<$boxed_key_type$, $boxed_value_type$> values) {\n" " copyOnWrite();\n" " instance.getMutable$capitalized_name$ValueMap().putAll(values);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } } else { printer->Print( variables_, "/**\n" " * Use {@link #get$capitalized_name$Map()} instead.\n" " */\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_, "$deprecation$" "public java.util.Map<$type_parameters$> " "${$get$capitalized_name$Map$}$() {\n" " return java.util.Collections.unmodifiableMap(\n" " instance.get$capitalized_name$Map());\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$OrDefault$}$(\n" " $key_type$ key,\n" " $value_type$ defaultValue) {\n" " $key_null_check$\n" " java.util.Map<$type_parameters$> map =\n" " instance.get$capitalized_name$Map();\n" " return map.containsKey(key) ? map.get(key) : defaultValue;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$\n" "public $value_type$ ${$get$capitalized_name$OrThrow$}$(\n" " $key_type$ key) {\n" " $key_null_check$\n" " java.util.Map<$type_parameters$> map =\n" " instance.get$capitalized_name$Map();\n" " if (!map.containsKey(key)) {\n" " throw new java.lang.IllegalArgumentException();\n" " }\n" " return map.get(key);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$" "public Builder ${$put$capitalized_name$$}$(\n" " $key_type$ key,\n" " $value_type$ value) {\n" " $key_null_check$\n" " $value_null_check$\n" " copyOnWrite();\n" " instance.getMutable$capitalized_name$Map().put(key, value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print( variables_, "$deprecation$" "public Builder ${$putAll$capitalized_name$$}$(\n" " java.util.Map<$type_parameters$> values) {\n" " copyOnWrite();\n" " instance.getMutable$capitalized_name$Map().putAll(values);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } } void ImmutableMapFieldLiteGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // Nothing to initialize. } void ImmutableMapFieldLiteGenerator:: GenerateInitializationCode(io::Printer* printer) const { // Nothing to initialize. } void ImmutableMapFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print( variables_, "$name$_ = visitor.visitMap(\n" " $name$_, other.internalGet$capitalized_name$());\n"); } void ImmutableMapFieldLiteGenerator:: GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.makeImmutable();\n"); } void ImmutableMapFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print( variables_, "if (!$name$_.isMutable()) {\n" " $name$_ = $name$_.mutableCopy();\n" "}\n"); if (!SupportUnknownEnumValue(descriptor_->file()) && GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) { printer->Print( variables_, "com.google.protobuf.ByteString bytes = input.readBytes();\n" "java.util.Map.Entry<$type_parameters$> $name$__ =\n" " $default_entry$.parseEntry(bytes, extensionRegistry);\n"); printer->Print( variables_, "if ($value_enum_type$.forNumber($name$__.getValue()) == null) {\n" " super.mergeLengthDelimitedField($number$, bytes);\n" "} else {\n" " $name$_.put($name$__);\n" "}\n"); } else { printer->Print( variables_, "$default_entry$.parseInto($name$_, input, extensionRegistry);"); } } void ImmutableMapFieldLiteGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { // Nothing to do here. } void ImmutableMapFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print( variables_, "for (java.util.Map.Entry<$type_parameters$> entry\n" " : internalGet$capitalized_name$().entrySet()) {\n" " $default_entry$.serializeTo(\n" " output, $number$, entry.getKey(), entry.getValue());\n" "}\n"); } void ImmutableMapFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print( variables_, "for (java.util.Map.Entry<$type_parameters$> entry\n" " : internalGet$capitalized_name$().entrySet()) {\n" " size += $default_entry$.computeMessageSize(\n" " $number$, entry.getKey(), entry.getValue());\n" "}\n"); } void ImmutableMapFieldLiteGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print( variables_, "result = result && internalGet$capitalized_name$().equals(\n" " other.internalGet$capitalized_name$());\n"); } void ImmutableMapFieldLiteGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print( variables_, "if (!internalGet$capitalized_name$().isEmpty()) {\n" " hash = (37 * hash) + $constant_name$;\n" " hash = (53 * hash) + internalGet$capitalized_name$().hashCode();\n" "}\n"); } string ImmutableMapFieldLiteGenerator::GetBoxedType() const { return name_resolver_->GetImmutableClassName(descriptor_->message_type()); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_map_field_lite.h000066400000000000000000000065611334102242000340640ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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_MAP_FIELD_LITE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_MAP_FIELD_LITE_H__ #include namespace google { namespace protobuf { namespace compiler { namespace java { class ImmutableMapFieldLiteGenerator : public ImmutableFieldLiteGenerator { public: explicit ImmutableMapFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableMapFieldLiteGenerator(); // implements ImmutableFieldLiteGenerator ------------------------------------ int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; private: const FieldDescriptor* descriptor_; std::map variables_; ClassNameResolver* name_resolver_; }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MAP_FIELD_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_message.cc000066400000000000000000001524601334102242000327700ustar00rootroot00000000000000// 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 #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { using internal::WireFormat; using internal::WireFormatLite; namespace { bool GenerateHasBits(const Descriptor* descriptor) { return SupportFieldPresence(descriptor->file()) || HasRepeatedFields(descriptor); } string MapValueImmutableClassdName(const Descriptor* descriptor, ClassNameResolver* name_resolver) { const FieldDescriptor* value_field = descriptor->FindFieldByName("value"); GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, value_field->type()); return name_resolver->GetImmutableClassName(value_field->message_type()); } } // namespace // =================================================================== MessageGenerator::MessageGenerator(const Descriptor* descriptor) : descriptor_(descriptor) {} MessageGenerator::~MessageGenerator() {} // =================================================================== ImmutableMessageGenerator::ImmutableMessageGenerator( const Descriptor* descriptor, Context* context) : MessageGenerator(descriptor), context_(context), name_resolver_(context->GetNameResolver()), field_generators_(descriptor, context_) { GOOGLE_CHECK(HasDescriptorMethods(descriptor->file(), context->EnforceLite())) << "Generator factory error: A non-lite message generator is used to " "generate lite messages."; } ImmutableMessageGenerator::~ImmutableMessageGenerator() {} void ImmutableMessageGenerator::GenerateStaticVariables( io::Printer* printer, int* bytecode_estimate) { // Because descriptor.proto (com.google.protobuf.DescriptorProtos) is // used in the construction of descriptors, we have a tricky bootstrapping // problem. To help control static initialization order, we make sure all // descriptors and other static data that depends on them are members of // the outermost class in the file. This way, they will be initialized in // a deterministic order. std::map vars; vars["identifier"] = UniqueFileScopeIdentifier(descriptor_); vars["index"] = SimpleItoa(descriptor_->index()); vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_); if (descriptor_->containing_type() != NULL) { vars["parent"] = UniqueFileScopeIdentifier( descriptor_->containing_type()); } if (MultipleJavaFiles(descriptor_->file(), /* immutable = */ true)) { // We can only make these package-private since the classes that use them // are in separate files. vars["private"] = ""; } else { vars["private"] = "private "; } if (*bytecode_estimate <= kMaxStaticSize) { vars["final"] = "final "; } else { vars["final"] = ""; } // The descriptor for this type. printer->Print(vars, // TODO(teboring): final needs to be added back. The way to fix it is to // generate methods that can construct the types, and then still declare the // types, and then init them in clinit with the new method calls. "$private$static $final$com.google.protobuf.Descriptors.Descriptor\n" " internal_$identifier$_descriptor;\n"); *bytecode_estimate += 30; // And the FieldAccessorTable. GenerateFieldAccessorTable(printer, bytecode_estimate); // Generate static members for all nested types. for (int i = 0; i < descriptor_->nested_type_count(); i++) { // TODO(kenton): Reuse MessageGenerator objects? ImmutableMessageGenerator(descriptor_->nested_type(i), context_) .GenerateStaticVariables(printer, bytecode_estimate); } } int ImmutableMessageGenerator::GenerateStaticVariableInitializers( io::Printer* printer) { int bytecode_estimate = 0; std::map vars; vars["identifier"] = UniqueFileScopeIdentifier(descriptor_); vars["index"] = SimpleItoa(descriptor_->index()); vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_); if (descriptor_->containing_type() != NULL) { vars["parent"] = UniqueFileScopeIdentifier( descriptor_->containing_type()); } // The descriptor for this type. if (descriptor_->containing_type() == NULL) { printer->Print(vars, "internal_$identifier$_descriptor =\n" " getDescriptor().getMessageTypes().get($index$);\n"); bytecode_estimate += 30; } else { printer->Print(vars, "internal_$identifier$_descriptor =\n" " internal_$parent$_descriptor.getNestedTypes().get($index$);\n"); bytecode_estimate += 30; } // And the FieldAccessorTable. bytecode_estimate += GenerateFieldAccessorTableInitializer(printer); // Generate static member initializers for all nested types. for (int i = 0; i < descriptor_->nested_type_count(); i++) { // TODO(kenton): Reuse MessageGenerator objects? bytecode_estimate += ImmutableMessageGenerator(descriptor_->nested_type(i), context_) .GenerateStaticVariableInitializers(printer); } return bytecode_estimate; } void ImmutableMessageGenerator:: GenerateFieldAccessorTable(io::Printer* printer, int* bytecode_estimate) { std::map vars; vars["identifier"] = UniqueFileScopeIdentifier(descriptor_); if (MultipleJavaFiles(descriptor_->file(), /* immutable = */ true)) { // We can only make these package-private since the classes that use them // are in separate files. vars["private"] = ""; } else { vars["private"] = "private "; } if (*bytecode_estimate <= kMaxStaticSize) { vars["final"] = "final "; } else { vars["final"] = ""; } vars["ver"] = GeneratedCodeVersionSuffix(); printer->Print(vars, "$private$static $final$\n" " com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n" " internal_$identifier$_fieldAccessorTable;\n"); // 6 bytes per field and oneof *bytecode_estimate += 10 + 6 * descriptor_->field_count() + 6 * descriptor_->oneof_decl_count(); } int ImmutableMessageGenerator:: GenerateFieldAccessorTableInitializer(io::Printer* printer) { int bytecode_estimate = 10; printer->Print( "internal_$identifier$_fieldAccessorTable = new\n" " com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable(\n" " internal_$identifier$_descriptor,\n" " new java.lang.String[] { ", "identifier", UniqueFileScopeIdentifier(descriptor_), "ver", GeneratedCodeVersionSuffix()); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); bytecode_estimate += 6; printer->Print( "\"$field_name$\", ", "field_name", info->capitalized_name); } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { const OneofDescriptor* oneof = descriptor_->oneof_decl(i); const OneofGeneratorInfo* info = context_->GetOneofGeneratorInfo(oneof); bytecode_estimate += 6; printer->Print( "\"$oneof_name$\", ", "oneof_name", info->capitalized_name); } printer->Print("});\n"); return bytecode_estimate; } // =================================================================== void ImmutableMessageGenerator::GenerateInterface(io::Printer* printer) { MaybePrintGeneratedAnnotation(context_, printer, descriptor_, /* immutable = */ true, "OrBuilder"); if (descriptor_->extension_range_count() > 0) { printer->Print( "$deprecation$public interface ${$$classname$OrBuilder$}$ extends\n" " $extra_interfaces$\n" " com.google.protobuf.GeneratedMessage$ver$.\n" " ExtendableMessageOrBuilder<$classname$> {\n", "deprecation", descriptor_->options().deprecated() ? "@java.lang.Deprecated " : "", "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_), "classname", descriptor_->name(), "{", "", "}", "", "ver", GeneratedCodeVersionSuffix()); } else { printer->Print( "$deprecation$public interface ${$$classname$OrBuilder$}$ extends\n" " $extra_interfaces$\n" " com.google.protobuf.MessageOrBuilder {\n", "deprecation", descriptor_->options().deprecated() ? "@java.lang.Deprecated " : "", "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_), "classname", descriptor_->name(), "{", "", "}", ""); } printer->Annotate("{", "}", descriptor_); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { printer->Print("\n"); field_generators_.get(descriptor_->field(i)) .GenerateInterfaceMembers(printer); } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "\n" "public $classname$.$oneof_capitalized_name$Case " "get$oneof_capitalized_name$Case();\n", "oneof_capitalized_name", context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->capitalized_name, "classname", context_->GetNameResolver()->GetImmutableClassName( descriptor_)); } printer->Outdent(); printer->Print("}\n"); } // =================================================================== void ImmutableMessageGenerator::Generate(io::Printer* printer) { bool is_own_file = IsOwnFile(descriptor_, /* immutable = */ true); std::map variables; variables["static"] = is_own_file ? " " : " static "; variables["classname"] = descriptor_->name(); variables["extra_interfaces"] = ExtraMessageInterfaces(descriptor_); variables["ver"] = GeneratedCodeVersionSuffix(); variables["deprecation"] = descriptor_->options().deprecated() ? "@java.lang.Deprecated " : ""; WriteMessageDocComment(printer, descriptor_); MaybePrintGeneratedAnnotation(context_, printer, descriptor_, /* immutable = */ true); // The builder_type stores the super type name of the nested Builder class. string builder_type; if (descriptor_->extension_range_count() > 0) { printer->Print( variables, "$deprecation$public $static$final class $classname$ extends\n"); printer->Annotate("classname", descriptor_); printer->Print( variables, " com.google.protobuf.GeneratedMessage$ver$.ExtendableMessage<\n" " $classname$> implements\n" " $extra_interfaces$\n" " $classname$OrBuilder {\n"); builder_type = strings::Substitute( "com.google.protobuf.GeneratedMessage$1.ExtendableBuilder<$0, ?>", name_resolver_->GetImmutableClassName(descriptor_), GeneratedCodeVersionSuffix()); } else { printer->Print( variables, "$deprecation$public $static$final class $classname$ extends\n"); printer->Annotate("classname", descriptor_); printer->Print(variables, " com.google.protobuf.GeneratedMessage$ver$ implements\n" " $extra_interfaces$\n" " $classname$OrBuilder {\n"); builder_type = strings::Substitute( "com.google.protobuf.GeneratedMessage$0.Builder", GeneratedCodeVersionSuffix()); } printer->Print( "private static final long serialVersionUID = 0L;\n"); printer->Indent(); // Using builder_type, instead of Builder, prevents the Builder class from // being loaded into PermGen space when the default instance is created. // This optimizes the PermGen space usage for clients that do not modify // messages. printer->Print( "// Use $classname$.newBuilder() to construct.\n" "private $classname$($buildertype$ builder) {\n" " super(builder);\n" "}\n", "classname", descriptor_->name(), "buildertype", builder_type); printer->Print( "private $classname$() {\n", "classname", descriptor_->name()); printer->Indent(); GenerateInitializers(printer); printer->Outdent(); printer->Print( "}\n" "\n"); printer->Print( "@java.lang.Override\n" "public final com.google.protobuf.UnknownFieldSet\n" "getUnknownFields() {\n" " return this.unknownFields;\n" "}\n"); if (context_->HasGeneratedMethods(descriptor_)) { if (!EnableExperimentalRuntime(context_) || IsDescriptorProto(descriptor_)) { GenerateParsingConstructor(printer); } } GenerateDescriptorMethods(printer); // Nested types for (int i = 0; i < descriptor_->enum_type_count(); i++) { EnumGenerator(descriptor_->enum_type(i), true, context_) .Generate(printer); } for (int i = 0; i < descriptor_->nested_type_count(); i++) { // Don't generate Java classes for map entry messages. if (IsMapEntry(descriptor_->nested_type(i))) continue; ImmutableMessageGenerator messageGenerator( descriptor_->nested_type(i), context_); messageGenerator.GenerateInterface(printer); messageGenerator.Generate(printer); } if (GenerateHasBits(descriptor_)) { // Integers for bit fields. int totalBits = 0; for (int i = 0; i < descriptor_->field_count(); i++) { totalBits += field_generators_.get(descriptor_->field(i)) .GetNumBitsForMessage(); } int totalInts = (totalBits + 31) / 32; for (int i = 0; i < totalInts; i++) { printer->Print("private int $bit_field_name$;\n", "bit_field_name", GetBitFieldName(i)); } } // oneof std::map vars; for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { vars["oneof_name"] = context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->name; vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->capitalized_name; vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index()); // 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" " implements com.google.protobuf.Internal.EnumLite {\n"); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); printer->Print( "$field_name$($field_number$),\n", "field_name", ToUpper(field->name()), "field_number", SimpleItoa(field->number())); } printer->Print( "$cap_oneof_name$_NOT_SET(0);\n", "cap_oneof_name", ToUpper(vars["oneof_name"])); printer->Print(vars, "private final int value;\n" "private $oneof_capitalized_name$Case(int value) {\n" " this.value = value;\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 < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); printer->Print( " case $field_number$: return $field_name$;\n", "field_number", SimpleItoa(field->number()), "field_name", ToUpper(field->name())); } printer->Print( " case 0: return $cap_oneof_name$_NOT_SET;\n" " default: return null;\n" " }\n" "}\n" "public int getNumber() {\n" " return this.value;\n" "}\n", "cap_oneof_name", ToUpper(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" " return $oneof_capitalized_name$Case.forNumber(\n" " $oneof_name$Case_);\n" "}\n" "\n"); } if (IsAnyMessage(descriptor_)) { GenerateAnyMethods(printer); } // 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", SimpleItoa(descriptor_->field(i)->number())); field_generators_.get(descriptor_->field(i)).GenerateMembers(printer); printer->Print("\n"); } if (context_->HasGeneratedMethods(descriptor_)) { GenerateIsInitialized(printer); GenerateMessageSerializationMethods(printer); GenerateEqualsAndHashCode(printer); } GenerateParseFromMethods(printer); GenerateBuilder(printer); printer->Print( "\n" "// @@protoc_insertion_point(class_scope:$full_name$)\n", "full_name", descriptor_->full_name()); // Carefully initialize the default instance in such a way that it doesn't // conflict with other initialization. printer->Print( "private static final $classname$ DEFAULT_INSTANCE;\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Print( "static {\n" " DEFAULT_INSTANCE = new $classname$();\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Print( "public static $classname$ getDefaultInstance() {\n" " return DEFAULT_INSTANCE;\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); // 'of' method for Wrappers if (IsWrappersProtoFile(descriptor_->file())) { printer->Print( "public static $classname$ of($field_type$ value) {\n" " return newBuilder().setValue(value).build();\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_), "field_type", PrimitiveTypeName(GetJavaType(descriptor_->field(0)))); } GenerateParser(printer); printer->Print( "public $classname$ getDefaultInstanceForType() {\n" " return DEFAULT_INSTANCE;\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); // Extensions must be declared after the DEFAULT_INSTANCE is initialized // because the DEFAULT_INSTANCE is used by the extension to lazily retrieve // the outer class's FileDescriptor. for (int i = 0; i < descriptor_->extension_count(); i++) { ImmutableExtensionGenerator(descriptor_->extension(i), context_) .Generate(printer); } printer->Outdent(); printer->Print("}\n\n"); } // =================================================================== void ImmutableMessageGenerator:: GenerateMessageSerializationMethods(io::Printer* printer) { google::protobuf::scoped_array sorted_fields( SortFieldsByNumber(descriptor_)); std::vector sorted_extensions; 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( "public void writeTo(com.google.protobuf.CodedOutputStream output)\n" " throws java.io.IOException {\n"); printer->Indent(); if (EnableExperimentalRuntime(context_) && !IsDescriptorProto(descriptor_)) { printer->Print("writeToInternal(output);\n"); } else { if (HasPackedFields(descriptor_)) { // writeTo(CodedOutputStream output) might be invoked without // getSerializedSize() ever being called, but we need the memoized // sizes in case this message has packed fields. Rather than emit checks // for each packed field, just call getSerializedSize() up front. In most // cases, getSerializedSize() will have already been called anyway by one // of the wrapper writeTo() methods, making this call cheap. printer->Print("getSerializedSize();\n"); } if (descriptor_->extension_range_count() > 0) { if (descriptor_->options().message_set_wire_format()) { printer->Print( "com.google.protobuf.GeneratedMessage$ver$\n" " .ExtendableMessage<$classname$>.ExtensionWriter\n" " extensionWriter = newMessageSetExtensionWriter();\n", "classname", name_resolver_->GetImmutableClassName(descriptor_), "ver", GeneratedCodeVersionSuffix()); } else { printer->Print( "com.google.protobuf.GeneratedMessage$ver$\n" " .ExtendableMessage<$classname$>.ExtensionWriter\n" " extensionWriter = newExtensionWriter();\n", "classname", name_resolver_->GetImmutableClassName(descriptor_), "ver", GeneratedCodeVersionSuffix()); } } // 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++]); } } if (descriptor_->options().message_set_wire_format()) { printer->Print("unknownFields.writeAsMessageSetTo(output);\n"); } else { printer->Print("unknownFields.writeTo(output);\n"); } } printer->Outdent(); printer->Print( "}\n" "\n" "public int getSerializedSize() {\n" " int size = memoizedSize;\n" " if (size != -1) return size;\n" "\n"); printer->Indent(); if (EnableExperimentalRuntime(context_) && !IsDescriptorProto(descriptor_)) { printer->Print( "memoizedSize = getSerializedSizeInternal();\n" "return memoizedSize;\n"); } else { printer->Print("size = 0;\n"); for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(sorted_fields[i]) .GenerateSerializedSizeCode(printer); } if (descriptor_->extension_range_count() > 0) { if (descriptor_->options().message_set_wire_format()) { printer->Print("size += extensionsSerializedSizeAsMessageSet();\n"); } else { printer->Print("size += extensionsSerializedSize();\n"); } } if (descriptor_->options().message_set_wire_format()) { printer->Print( "size += unknownFields.getSerializedSizeAsMessageSet();\n"); } else { printer->Print("size += unknownFields.getSerializedSize();\n"); } printer->Print( "memoizedSize = size;\n" "return size;\n"); } printer->Outdent(); printer->Print( "}\n" "\n"); } void ImmutableMessageGenerator:: GenerateParseFromMethods(io::Printer* printer) { // Note: These are separate from GenerateMessageSerializationMethods() // because they need to be generated even for messages that are optimized // for code size. printer->Print( "public static $classname$ parseFrom(\n" " java.nio.ByteBuffer data)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return PARSER.parseFrom(data);\n" "}\n" "public static $classname$ parseFrom(\n" " java.nio.ByteBuffer data,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return PARSER.parseFrom(data, extensionRegistry);\n" "}\n" "public static $classname$ parseFrom(\n" " com.google.protobuf.ByteString data)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return PARSER.parseFrom(data);\n" "}\n" "public static $classname$ parseFrom(\n" " com.google.protobuf.ByteString data,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return PARSER.parseFrom(data, extensionRegistry);\n" "}\n" "public static $classname$ parseFrom(byte[] data)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return PARSER.parseFrom(data);\n" "}\n" "public static $classname$ parseFrom(\n" " byte[] data,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return PARSER.parseFrom(data, extensionRegistry);\n" "}\n" "public static $classname$ parseFrom(java.io.InputStream input)\n" " throws java.io.IOException {\n" " return com.google.protobuf.GeneratedMessage$ver$\n" " .parseWithIOException(PARSER, input);\n" "}\n" "public static $classname$ parseFrom(\n" " java.io.InputStream input,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws java.io.IOException {\n" " return com.google.protobuf.GeneratedMessage$ver$\n" " .parseWithIOException(PARSER, input, extensionRegistry);\n" "}\n" "public static $classname$ parseDelimitedFrom(java.io.InputStream input)\n" " throws java.io.IOException {\n" " return com.google.protobuf.GeneratedMessage$ver$\n" " .parseDelimitedWithIOException(PARSER, input);\n" "}\n" "public static $classname$ parseDelimitedFrom(\n" " java.io.InputStream input,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws java.io.IOException {\n" " return com.google.protobuf.GeneratedMessage$ver$\n" " .parseDelimitedWithIOException(PARSER, input, extensionRegistry);\n" "}\n" "public static $classname$ parseFrom(\n" " com.google.protobuf.CodedInputStream input)\n" " throws java.io.IOException {\n" " return com.google.protobuf.GeneratedMessage$ver$\n" " .parseWithIOException(PARSER, input);\n" "}\n" "public static $classname$ parseFrom(\n" " com.google.protobuf.CodedInputStream input,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws java.io.IOException {\n" " return com.google.protobuf.GeneratedMessage$ver$\n" " .parseWithIOException(PARSER, input, extensionRegistry);\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_), "ver", 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", SimpleItoa(range->end)); } // =================================================================== void ImmutableMessageGenerator::GenerateBuilder(io::Printer* printer) { // LITE_RUNTIME implements this at the GeneratedMessageLite level. printer->Print( "public Builder newBuilderForType() { return newBuilder(); }\n"); printer->Print( "public static Builder newBuilder() {\n" " return DEFAULT_INSTANCE.toBuilder();\n" "}\n" "public static Builder newBuilder($classname$ prototype) {\n" " return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);\n" "}\n" "public Builder toBuilder() {\n" " return this == DEFAULT_INSTANCE\n" " ? new Builder() : new Builder().mergeFrom(this);\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Print( "@java.lang.Override\n" "protected Builder newBuilderForType(\n" " com.google.protobuf.GeneratedMessage$ver$.BuilderParent parent) {\n" " Builder builder = new Builder(parent);\n" " return builder;\n" "}\n", "ver", GeneratedCodeVersionSuffix()); MessageBuilderGenerator builderGenerator(descriptor_, context_); builderGenerator.Generate(printer); } void ImmutableMessageGenerator:: GenerateDescriptorMethods(io::Printer* printer) { if (!descriptor_->options().no_standard_descriptor_accessor()) { printer->Print( "public static final com.google.protobuf.Descriptors.Descriptor\n" " getDescriptor() {\n" " return $fileclass$.internal_$identifier$_descriptor;\n" "}\n" "\n", "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), "identifier", UniqueFileScopeIdentifier(descriptor_)); } std::vector map_fields; for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (GetJavaType(field) == JAVATYPE_MESSAGE && IsMapEntry(field->message_type())) { map_fields.push_back(field); } } if (!map_fields.empty()) { printer->Print( "@SuppressWarnings({\"rawtypes\"})\n" "protected com.google.protobuf.MapField internalGetMapField(\n" " int number) {\n" " switch (number) {\n"); printer->Indent(); printer->Indent(); for (int i = 0; i < map_fields.size(); ++i) { const FieldDescriptor* field = map_fields[i]; const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); printer->Print( "case $number$:\n" " return internalGet$capitalized_name$();\n", "number", SimpleItoa(field->number()), "capitalized_name", info->capitalized_name); } printer->Print( "default:\n" " throw new RuntimeException(\n" " \"Invalid map field number: \" + number);\n"); printer->Outdent(); printer->Outdent(); printer->Print( " }\n" "}\n"); } printer->Print( "protected com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n" " internalGetFieldAccessorTable() {\n" " return $fileclass$.internal_$identifier$_fieldAccessorTable\n" " .ensureFieldAccessorsInitialized(\n" " $classname$.class, $classname$.Builder.class);\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_), "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), "identifier", UniqueFileScopeIdentifier(descriptor_), "ver", GeneratedCodeVersionSuffix()); } // =================================================================== void ImmutableMessageGenerator::GenerateIsInitialized( io::Printer* printer) { // Memoizes whether the protocol buffer is fully initialized (has all // required fields). -1 means not yet computed. 0 means false and 1 means // true. printer->Print( "private byte memoizedIsInitialized = -1;\n"); printer->Print( "public final boolean isInitialized() {\n"); printer->Indent(); // Don't directly compare to -1 to avoid an Android x86 JIT bug. printer->Print( "byte isInitialized = memoizedIsInitialized;\n" "if (isInitialized == 1) return true;\n" "if (isInitialized == 0) return false;\n" "\n"); // Check that all required fields in this message are set. // TODO(kenton): We can optimize this when we switch to putting all the // "has" fields into a single bitfield. for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); if (field->is_required()) { printer->Print( "if (!has$name$()) {\n" " memoizedIsInitialized = 0;\n" " return false;\n" "}\n", "name", info->capitalized_name); } } // Now check that all embedded messages are initialized. for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); if (GetJavaType(field) == JAVATYPE_MESSAGE && HasRequiredFields(field->message_type())) { switch (field->label()) { case FieldDescriptor::LABEL_REQUIRED: printer->Print( "if (!get$name$().isInitialized()) {\n" " memoizedIsInitialized = 0;\n" " return false;\n" "}\n", "type", name_resolver_->GetImmutableClassName( field->message_type()), "name", info->capitalized_name); break; case FieldDescriptor::LABEL_OPTIONAL: if (!SupportFieldPresence(descriptor_->file()) && field->containing_oneof() != NULL) { const OneofDescriptor* oneof = field->containing_oneof(); const OneofGeneratorInfo* oneof_info = context_->GetOneofGeneratorInfo(oneof); printer->Print( "if ($oneof_name$Case_ == $field_number$) {\n", "oneof_name", oneof_info->name, "field_number", SimpleItoa(field->number())); } else { printer->Print( "if (has$name$()) {\n", "name", info->capitalized_name); } printer->Print( " if (!get$name$().isInitialized()) {\n" " memoizedIsInitialized = 0;\n" " return false;\n" " }\n" "}\n", "name", info->capitalized_name); break; case FieldDescriptor::LABEL_REPEATED: if (IsMapEntry(field->message_type())) { printer->Print( "for ($type$ item : get$name$Map().values()) {\n" " if (!item.isInitialized()) {\n" " memoizedIsInitialized = 0;\n" " return false;\n" " }\n" "}\n", "type", MapValueImmutableClassdName(field->message_type(), name_resolver_), "name", info->capitalized_name); } else { printer->Print( "for (int i = 0; i < get$name$Count(); i++) {\n" " if (!get$name$(i).isInitialized()) {\n" " memoizedIsInitialized = 0;\n" " return false;\n" " }\n" "}\n", "type", name_resolver_->GetImmutableClassName( field->message_type()), "name", info->capitalized_name); } break; } } } if (descriptor_->extension_range_count() > 0) { printer->Print( "if (!extensionsAreInitialized()) {\n" " memoizedIsInitialized = 0;\n" " return false;\n" "}\n"); } printer->Outdent(); printer->Print( " memoizedIsInitialized = 1;\n"); printer->Print( " return true;\n" "}\n" "\n"); } // =================================================================== namespace { bool CheckHasBitsForEqualsAndHashCode(const FieldDescriptor* field) { if (field->is_repeated()) { return false; } if (SupportFieldPresence(field->file())) { return true; } return GetJavaType(field) == JAVATYPE_MESSAGE && field->containing_oneof() == NULL; } } // namespace void ImmutableMessageGenerator:: GenerateEqualsAndHashCode(io::Printer* printer) { printer->Print( "@java.lang.Override\n" "public boolean equals(final java.lang.Object obj) {\n"); printer->Indent(); printer->Print( "if (obj == this) {\n" " return true;\n" "}\n" "if (!(obj instanceof $classname$)) {\n" " return super.equals(obj);\n" "}\n" "$classname$ other = ($classname$) obj;\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Print("boolean result = true;\n"); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->containing_oneof() == NULL) { const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); bool check_has_bits = CheckHasBitsForEqualsAndHashCode(field); if (check_has_bits) { printer->Print( "result = result && (has$name$() == other.has$name$());\n" "if (has$name$()) {\n", "name", info->capitalized_name); printer->Indent(); } field_generators_.get(field).GenerateEqualsCode(printer); if (check_has_bits) { printer->Outdent(); printer->Print( "}\n"); } } } // Compare oneofs. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "result = result && get$oneof_capitalized_name$Case().equals(\n" " other.get$oneof_capitalized_name$Case());\n", "oneof_capitalized_name", context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->capitalized_name); printer->Print( "if (!result) return false;\n" "switch ($oneof_name$Case_) {\n", "oneof_name", context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->name); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); printer->Print( "case $field_number$:\n", "field_number", SimpleItoa(field->number())); printer->Indent(); field_generators_.get(field).GenerateEqualsCode(printer); printer->Print("break;\n"); printer->Outdent(); } printer->Print( "case 0:\n" "default:\n"); printer->Outdent(); printer->Print("}\n"); } // Always consider unknown fields for equality. This will sometimes return // false for non-canonical ordering when running in LITE_RUNTIME but it's // the best we can do. printer->Print( "result = result && unknownFields.equals(other.unknownFields);\n"); if (descriptor_->extension_range_count() > 0) { printer->Print( "result = result &&\n" " getExtensionFields().equals(other.getExtensionFields());\n"); } printer->Print( "return result;\n"); printer->Outdent(); printer->Print( "}\n" "\n"); printer->Print( "@java.lang.Override\n" "public int hashCode() {\n"); printer->Indent(); printer->Print( "if (memoizedHashCode != 0) {\n"); printer->Indent(); printer->Print( "return memoizedHashCode;\n"); printer->Outdent(); printer->Print( "}\n" "int hash = 41;\n"); // If we output a getDescriptor() method, use that as it is more efficient. if (descriptor_->options().no_standard_descriptor_accessor()) { printer->Print("hash = (19 * hash) + getDescriptorForType().hashCode();\n"); } else { printer->Print("hash = (19 * hash) + getDescriptor().hashCode();\n"); } // hashCode non-oneofs. for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->containing_oneof() == NULL) { const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); bool check_has_bits = CheckHasBitsForEqualsAndHashCode(field); if (check_has_bits) { printer->Print( "if (has$name$()) {\n", "name", info->capitalized_name); printer->Indent(); } field_generators_.get(field).GenerateHashCode(printer); if (check_has_bits) { printer->Outdent(); printer->Print("}\n"); } } } // hashCode oneofs. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "switch ($oneof_name$Case_) {\n", "oneof_name", context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->name); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); printer->Print( "case $field_number$:\n", "field_number", SimpleItoa(field->number())); printer->Indent(); field_generators_.get(field).GenerateHashCode(printer); printer->Print("break;\n"); printer->Outdent(); } printer->Print( "case 0:\n" "default:\n"); printer->Outdent(); printer->Print("}\n"); } if (descriptor_->extension_range_count() > 0) { printer->Print( "hash = hashFields(hash, getExtensionFields());\n"); } printer->Print( "hash = (29 * hash) + unknownFields.hashCode();\n"); printer->Print( "memoizedHashCode = hash;\n" "return hash;\n"); printer->Outdent(); printer->Print( "}\n" "\n"); } // =================================================================== void ImmutableMessageGenerator:: GenerateExtensionRegistrationCode(io::Printer* printer) { for (int i = 0; i < descriptor_->extension_count(); i++) { ImmutableExtensionGenerator(descriptor_->extension(i), context_) .GenerateRegistrationCode(printer); } for (int i = 0; i < descriptor_->nested_type_count(); i++) { ImmutableMessageGenerator(descriptor_->nested_type(i), context_) .GenerateExtensionRegistrationCode(printer); } } // =================================================================== void ImmutableMessageGenerator:: GenerateParsingConstructor(io::Printer* printer) { google::protobuf::scoped_array sorted_fields( SortFieldsByNumber(descriptor_)); printer->Print( "private $classname$(\n" " com.google.protobuf.CodedInputStream input,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n", "classname", descriptor_->name()); printer->Indent(); // Initialize all fields to default. printer->Print( "this();\n" "if (extensionRegistry == null) {\n" " throw new java.lang.NullPointerException();\n" "}\n"); // Use builder bits to track mutable repeated fields. int totalBuilderBits = 0; for (int i = 0; i < descriptor_->field_count(); i++) { const ImmutableFieldGenerator& field = field_generators_.get(descriptor_->field(i)); totalBuilderBits += field.GetNumBitsForBuilder(); } int totalBuilderInts = (totalBuilderBits + 31) / 32; for (int i = 0; i < totalBuilderInts; i++) { printer->Print("int mutable_$bit_field_name$ = 0;\n", "bit_field_name", GetBitFieldName(i)); } printer->Print( "com.google.protobuf.UnknownFieldSet.Builder unknownFields =\n" " com.google.protobuf.UnknownFieldSet.newBuilder();\n"); printer->Print( "try {\n"); printer->Indent(); printer->Print( "boolean done = false;\n" "while (!done) {\n"); printer->Indent(); printer->Print( "int tag = input.readTag();\n" "switch (tag) {\n"); printer->Indent(); printer->Print( "case 0:\n" // zero signals EOF / limit reached " done = true;\n" " break;\n" "default: {\n" " if (!parseUnknownField$suffix$(\n" " input, unknownFields, extensionRegistry, tag)) {\n" " done = true;\n" // it's an endgroup tag " }\n" " break;\n" "}\n", "suffix", descriptor_->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 ? "Proto3" : ""); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = sorted_fields[i]; uint32 tag = WireFormatLite::MakeTag(field->number(), WireFormat::WireTypeForFieldType(field->type())); printer->Print( "case $tag$: {\n", "tag", SimpleItoa(static_cast(tag))); printer->Indent(); field_generators_.get(field).GenerateParsingCode(printer); printer->Outdent(); printer->Print( " break;\n" "}\n"); if (field->is_packable()) { // To make packed = true wire compatible, we generate parsing code from a // packed version of this field regardless of field->options().packed(). uint32 packed_tag = WireFormatLite::MakeTag(field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED); printer->Print( "case $tag$: {\n", "tag", SimpleItoa(static_cast(packed_tag))); printer->Indent(); field_generators_.get(field).GenerateParsingCodeFromPacked(printer); printer->Outdent(); printer->Print( " break;\n" "}\n"); } } printer->Outdent(); printer->Outdent(); printer->Print( " }\n" // switch (tag) "}\n"); // while (!done) printer->Outdent(); printer->Print( "} catch (com.google.protobuf.InvalidProtocolBufferException e) {\n" " throw e.setUnfinishedMessage(this);\n" "} catch (java.io.IOException e) {\n" " throw new com.google.protobuf.InvalidProtocolBufferException(\n" " e).setUnfinishedMessage(this);\n" "} finally {\n"); printer->Indent(); // Make repeated field list immutable. for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = sorted_fields[i]; field_generators_.get(field).GenerateParsingDoneCode(printer); } // Make unknown fields immutable. printer->Print("this.unknownFields = unknownFields.build();\n"); // Make extensions immutable. printer->Print( "makeExtensionsImmutable();\n"); printer->Outdent(); printer->Outdent(); printer->Print( " }\n" // finally "}\n"); } // =================================================================== void ImmutableMessageGenerator::GenerateParser(io::Printer* printer) { printer->Print( "$visibility$ static final com.google.protobuf.Parser<$classname$>\n" " PARSER = new com.google.protobuf.AbstractParser<$classname$>() {\n", "visibility", ExposePublicParser(descriptor_->file()) ? "@java.lang.Deprecated public" : "private", "classname", descriptor_->name()); printer->Indent(); printer->Print( "public $classname$ parsePartialFrom(\n" " com.google.protobuf.CodedInputStream input,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n", "classname", descriptor_->name()); if (EnableExperimentalRuntime(context_) && !IsDescriptorProto(descriptor_)) { printer->Indent(); printer->Print( "$classname$ msg = new $classname$();\n" "msg.mergeFromInternal(input, extensionRegistry);\n" "msg.makeImmutableInternal();\n" "return msg;\n", "classname", descriptor_->name()); printer->Outdent(); } else if (context_->HasGeneratedMethods(descriptor_)) { printer->Print(" return new $classname$(input, extensionRegistry);\n", "classname", descriptor_->name()); } else { // When parsing constructor isn't generated, use builder to parse // messages. Note, will fallback to use reflection based mergeFieldFrom() // in AbstractMessage.Builder. printer->Indent(); printer->Print( "Builder builder = newBuilder();\n" "try {\n" " builder.mergeFrom(input, extensionRegistry);\n" "} catch (com.google.protobuf.InvalidProtocolBufferException e) {\n" " throw e.setUnfinishedMessage(builder.buildPartial());\n" "} catch (java.io.IOException e) {\n" " throw new com.google.protobuf.InvalidProtocolBufferException(\n" " e.getMessage()).setUnfinishedMessage(\n" " builder.buildPartial());\n" "}\n" "return builder.buildPartial();\n"); printer->Outdent(); } printer->Print( "}\n"); printer->Outdent(); printer->Print( "};\n" "\n"); printer->Print( "public static com.google.protobuf.Parser<$classname$> parser() {\n" " return PARSER;\n" "}\n" "\n" "@java.lang.Override\n" "public com.google.protobuf.Parser<$classname$> getParserForType() {\n" " return PARSER;\n" "}\n" "\n", "classname", descriptor_->name()); } // =================================================================== void ImmutableMessageGenerator::GenerateInitializers(io::Printer* printer) { for (int i = 0; i < descriptor_->field_count(); i++) { if (!descriptor_->field(i)->containing_oneof()) { field_generators_.get(descriptor_->field(i)) .GenerateInitializationCode(printer); } } } void ImmutableMessageGenerator::GenerateAnyMethods(io::Printer* printer) { printer->Print( "private static String getTypeUrl(\n" " java.lang.String typeUrlPrefix,\n" " com.google.protobuf.Descriptors.Descriptor descriptor) {\n" " return typeUrlPrefix.endsWith(\"/\")\n" " ? typeUrlPrefix + descriptor.getFullName()\n" " : typeUrlPrefix + \"/\" + descriptor.getFullName();\n" "}\n" "\n" "private static String getTypeNameFromTypeUrl(\n" " java.lang.String typeUrl) {\n" " int pos = typeUrl.lastIndexOf('/');\n" " return pos == -1 ? \"\" : typeUrl.substring(pos + 1);\n" "}\n" "\n" "public static Any pack(\n" " T message) {\n" " return Any.newBuilder()\n" " .setTypeUrl(getTypeUrl(\"type.googleapis.com\",\n" " message.getDescriptorForType()))\n" " .setValue(message.toByteString())\n" " .build();\n" "}\n" "\n" "/**\n" " * Packs a message using the given type URL prefix. The type URL will\n" " * be constructed by concatenating the message type's full name to the\n" " * prefix with an optional \"/\" separator if the prefix doesn't end\n" " * with \"/\" already.\n" " */\n" "public static Any pack(\n" " T message, java.lang.String typeUrlPrefix) {\n" " return Any.newBuilder()\n" " .setTypeUrl(getTypeUrl(typeUrlPrefix,\n" " message.getDescriptorForType()))\n" " .setValue(message.toByteString())\n" " .build();\n" "}\n" "\n" "public boolean is(\n" " java.lang.Class clazz) {\n" " T defaultInstance =\n" " com.google.protobuf.Internal.getDefaultInstance(clazz);\n" " return getTypeNameFromTypeUrl(getTypeUrl()).equals(\n" " defaultInstance.getDescriptorForType().getFullName());\n" "}\n" "\n" "private volatile com.google.protobuf.Message cachedUnpackValue;\n" "\n" "@java.lang.SuppressWarnings(\"unchecked\")\n" "public T unpack(\n" " java.lang.Class clazz)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " if (!is(clazz)) {\n" " throw new com.google.protobuf.InvalidProtocolBufferException(\n" " \"Type of the Any message does not match the given class.\");\n" " }\n" " if (cachedUnpackValue != null) {\n" " return (T) cachedUnpackValue;\n" " }\n" " T defaultInstance =\n" " com.google.protobuf.Internal.getDefaultInstance(clazz);\n" " T result = (T) defaultInstance.getParserForType()\n" " .parseFrom(getValue());\n" " cachedUnpackValue = result;\n" " return result;\n" "}\n"); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_message.h000066400000000000000000000125151334102242000326260ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace java { static const int kMaxStaticSize = 1 << 15; // aka 32k class MessageGenerator { public: explicit MessageGenerator(const Descriptor* descriptor); virtual ~MessageGenerator(); // All static variables have to be declared at the top-level of the file // so that we can control initialization order, which is important for // DescriptorProto bootstrapping to work. virtual void GenerateStaticVariables( io::Printer* printer, int* bytecode_estimate) = 0; // Output code which initializes the static variables generated by // GenerateStaticVariables(). Returns an estimate of bytecode size. virtual int GenerateStaticVariableInitializers(io::Printer* printer) = 0; // Generate the class itself. virtual void Generate(io::Printer* printer) = 0; // Generates the base interface that both the class and its builder implement virtual void GenerateInterface(io::Printer* printer) = 0; // Generate code to register all contained extensions with an // ExtensionRegistry. virtual void GenerateExtensionRegistrationCode(io::Printer* printer) = 0; protected: const Descriptor* descriptor_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator); }; class ImmutableMessageGenerator : public MessageGenerator { public: ImmutableMessageGenerator(const Descriptor* descriptor, Context* context); virtual ~ImmutableMessageGenerator(); virtual void Generate(io::Printer* printer); virtual void GenerateInterface(io::Printer* printer); virtual void GenerateExtensionRegistrationCode(io::Printer* printer); virtual void GenerateStaticVariables( io::Printer* printer, int* bytecode_estimate); // Returns an estimate of the number of bytes the printed code will compile to virtual int GenerateStaticVariableInitializers(io::Printer* printer); private: void GenerateFieldAccessorTable(io::Printer* printer, int* bytecode_estimate); // Returns an estimate of the number of bytes the printed code will compile to int GenerateFieldAccessorTableInitializer(io::Printer* printer); 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); void GenerateDescriptorMethods(io::Printer* printer); void GenerateInitializers(io::Printer* printer); void GenerateEqualsAndHashCode(io::Printer* printer); void GenerateParser(io::Printer* printer); void GenerateParsingConstructor(io::Printer* printer); void GenerateAnyMethods(io::Printer* printer); Context* context_; ClassNameResolver* name_resolver_; FieldGeneratorMap field_generators_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__ java_message_builder.cc000066400000000000000000000634221334102242000344160ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: dweis@google.com (Daniel Weis) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { bool GenerateHasBits(const Descriptor* descriptor) { return SupportFieldPresence(descriptor->file()) || HasRepeatedFields(descriptor); } string MapValueImmutableClassdName(const Descriptor* descriptor, ClassNameResolver* name_resolver) { const FieldDescriptor* value_field = descriptor->FindFieldByName("value"); GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, value_field->type()); return name_resolver->GetImmutableClassName(value_field->message_type()); } } // namespace MessageBuilderGenerator::MessageBuilderGenerator( const Descriptor* descriptor, Context* context) : descriptor_(descriptor), context_(context), name_resolver_(context->GetNameResolver()), field_generators_(descriptor, context_) { GOOGLE_CHECK(HasDescriptorMethods(descriptor->file(), context->EnforceLite())) << "Generator factory error: A non-lite message generator is used to " "generate lite messages."; } MessageBuilderGenerator::~MessageBuilderGenerator() {} void MessageBuilderGenerator:: Generate(io::Printer* printer) { WriteMessageDocComment(printer, descriptor_); if (descriptor_->extension_range_count() > 0) { printer->Print( "public static final class Builder extends\n" " com.google.protobuf.GeneratedMessage$ver$.ExtendableBuilder<\n" " $classname$, Builder> implements\n" " $extra_interfaces$\n" " $classname$OrBuilder {\n", "classname", name_resolver_->GetImmutableClassName(descriptor_), "extra_interfaces", ExtraBuilderInterfaces(descriptor_), "ver", GeneratedCodeVersionSuffix()); } else { printer->Print( "public static final class Builder extends\n" " com.google.protobuf.GeneratedMessage$ver$.Builder implements\n" " $extra_interfaces$\n" " $classname$OrBuilder {\n", "classname", name_resolver_->GetImmutableClassName(descriptor_), "extra_interfaces", ExtraBuilderInterfaces(descriptor_), "ver", GeneratedCodeVersionSuffix()); } printer->Indent(); GenerateDescriptorMethods(printer); GenerateCommonBuilderMethods(printer); if (context_->HasGeneratedMethods(descriptor_)) { GenerateIsInitialized(printer); GenerateBuilderParsingMethods(printer); } // oneof std::map vars; for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { vars["oneof_name"] = context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->name; vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->capitalized_name; vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index()); // oneofCase_ and oneof_ printer->Print(vars, "private int $oneof_name$Case_ = 0;\n" "private java.lang.Object $oneof_name$_;\n"); // oneofCase() and clearOneof() printer->Print(vars, "public $oneof_capitalized_name$Case\n" " get$oneof_capitalized_name$Case() {\n" " return $oneof_capitalized_name$Case.forNumber(\n" " $oneof_name$Case_);\n" "}\n" "\n" "public Builder clear$oneof_capitalized_name$() {\n" " $oneof_name$Case_ = 0;\n" " $oneof_name$_ = null;\n"); printer->Print(" onChanged();\n"); printer->Print( " return this;\n" "}\n" "\n"); } if (GenerateHasBits(descriptor_)) { // Integers for bit fields. int totalBits = 0; for (int i = 0; i < descriptor_->field_count(); i++) { totalBits += field_generators_.get(descriptor_->field(i)) .GetNumBitsForBuilder(); } int totalInts = (totalBits + 31) / 32; for (int i = 0; i < totalInts; i++) { printer->Print("private int $bit_field_name$;\n", "bit_field_name", GetBitFieldName(i)); } } for (int i = 0; i < descriptor_->field_count(); i++) { printer->Print("\n"); field_generators_.get(descriptor_->field(i)) .GenerateBuilderMembers(printer); } bool is_proto3 = descriptor_->file()->syntax() == FileDescriptor::SYNTAX_PROTO3; // 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( "public final Builder setUnknownFields(\n" " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" " return super.setUnknownFields$suffix$(unknownFields);\n" "}\n" "\n" "public final Builder mergeUnknownFields(\n" " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" " return super.mergeUnknownFields(unknownFields);\n" "}\n" "\n", "suffix", is_proto3 ? "Proto3" : ""); printer->Print( "\n" "// @@protoc_insertion_point(builder_scope:$full_name$)\n", "full_name", descriptor_->full_name()); printer->Outdent(); printer->Print("}\n"); } // =================================================================== void MessageBuilderGenerator:: GenerateDescriptorMethods(io::Printer* printer) { if (!descriptor_->options().no_standard_descriptor_accessor()) { printer->Print( "public static final com.google.protobuf.Descriptors.Descriptor\n" " getDescriptor() {\n" " return $fileclass$.internal_$identifier$_descriptor;\n" "}\n" "\n", "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), "identifier", UniqueFileScopeIdentifier(descriptor_)); } std::vector map_fields; for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (GetJavaType(field) == JAVATYPE_MESSAGE && IsMapEntry(field->message_type())) { map_fields.push_back(field); } } if (!map_fields.empty()) { printer->Print( "@SuppressWarnings({\"rawtypes\"})\n" "protected com.google.protobuf.MapField internalGetMapField(\n" " int number) {\n" " switch (number) {\n"); printer->Indent(); printer->Indent(); for (int i = 0; i < map_fields.size(); ++i) { const FieldDescriptor* field = map_fields[i]; const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); printer->Print( "case $number$:\n" " return internalGet$capitalized_name$();\n", "number", SimpleItoa(field->number()), "capitalized_name", info->capitalized_name); } printer->Print( "default:\n" " throw new RuntimeException(\n" " \"Invalid map field number: \" + number);\n"); printer->Outdent(); printer->Outdent(); printer->Print( " }\n" "}\n"); printer->Print( "@SuppressWarnings({\"rawtypes\"})\n" "protected com.google.protobuf.MapField internalGetMutableMapField(\n" " int number) {\n" " switch (number) {\n"); printer->Indent(); printer->Indent(); for (int i = 0; i < map_fields.size(); ++i) { const FieldDescriptor* field = map_fields[i]; const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); printer->Print( "case $number$:\n" " return internalGetMutable$capitalized_name$();\n", "number", SimpleItoa(field->number()), "capitalized_name", info->capitalized_name); } printer->Print( "default:\n" " throw new RuntimeException(\n" " \"Invalid map field number: \" + number);\n"); printer->Outdent(); printer->Outdent(); printer->Print( " }\n" "}\n"); } printer->Print( "protected com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n" " internalGetFieldAccessorTable() {\n" " return $fileclass$.internal_$identifier$_fieldAccessorTable\n" " .ensureFieldAccessorsInitialized(\n" " $classname$.class, $classname$.Builder.class);\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_), "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), "identifier", UniqueFileScopeIdentifier(descriptor_), "ver", GeneratedCodeVersionSuffix()); } // =================================================================== void MessageBuilderGenerator:: GenerateCommonBuilderMethods(io::Printer* printer) { printer->Print( "// Construct using $classname$.newBuilder()\n" "private Builder() {\n" " maybeForceBuilderInitialization();\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Print( "private Builder(\n" " com.google.protobuf.GeneratedMessage$ver$.BuilderParent parent) {\n" " super(parent);\n" " maybeForceBuilderInitialization();\n" "}\n", "classname", name_resolver_->GetImmutableClassName(descriptor_), "ver", GeneratedCodeVersionSuffix()); printer->Print( "private void maybeForceBuilderInitialization() {\n" " if (com.google.protobuf.GeneratedMessage$ver$\n" " .alwaysUseFieldBuilders) {\n", "ver", GeneratedCodeVersionSuffix()); printer->Indent(); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { if (!descriptor_->field(i)->containing_oneof()) { field_generators_.get(descriptor_->field(i)) .GenerateFieldBuilderInitializationCode(printer); } } printer->Outdent(); printer->Outdent(); printer->Print( " }\n" "}\n"); printer->Print( "public Builder clear() {\n" " super.clear();\n"); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { if (!descriptor_->field(i)->containing_oneof()) { field_generators_.get(descriptor_->field(i)) .GenerateBuilderClearCode(printer); } } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "$oneof_name$Case_ = 0;\n" "$oneof_name$_ = null;\n", "oneof_name", context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->name); } printer->Outdent(); printer->Print( " return this;\n" "}\n" "\n"); printer->Print( "public com.google.protobuf.Descriptors.Descriptor\n" " getDescriptorForType() {\n" " return $fileclass$.internal_$identifier$_descriptor;\n" "}\n" "\n", "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), "identifier", UniqueFileScopeIdentifier(descriptor_)); // LITE runtime implements this in GeneratedMessageLite. printer->Print( "public $classname$ getDefaultInstanceForType() {\n" " return $classname$.getDefaultInstance();\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Print( "public $classname$ build() {\n" " $classname$ result = buildPartial();\n" " if (!result.isInitialized()) {\n" " throw newUninitializedMessageException(result);\n" " }\n" " return result;\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Print( "public $classname$ buildPartial() {\n" " $classname$ result = new $classname$(this);\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Indent(); int totalBuilderBits = 0; int totalMessageBits = 0; for (int i = 0; i < descriptor_->field_count(); i++) { const ImmutableFieldGenerator& field = field_generators_.get(descriptor_->field(i)); totalBuilderBits += field.GetNumBitsForBuilder(); totalMessageBits += field.GetNumBitsForMessage(); } int totalBuilderInts = (totalBuilderBits + 31) / 32; int totalMessageInts = (totalMessageBits + 31) / 32; if (GenerateHasBits(descriptor_)) { // Local vars for from and to bit fields to avoid accessing the builder and // message over and over for these fields. Seems to provide a slight // perforamance improvement in micro benchmark and this is also what proto1 // code does. for (int i = 0; i < totalBuilderInts; i++) { printer->Print("int from_$bit_field_name$ = $bit_field_name$;\n", "bit_field_name", GetBitFieldName(i)); } for (int i = 0; i < totalMessageInts; i++) { printer->Print("int to_$bit_field_name$ = 0;\n", "bit_field_name", GetBitFieldName(i)); } } // Output generation code for each field. for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(descriptor_->field(i)).GenerateBuildingCode(printer); } if (GenerateHasBits(descriptor_)) { // Copy the bit field results to the generated message for (int i = 0; i < totalMessageInts; i++) { printer->Print("result.$bit_field_name$ = to_$bit_field_name$;\n", "bit_field_name", GetBitFieldName(i)); } } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print("result.$oneof_name$Case_ = $oneof_name$Case_;\n", "oneof_name", context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->name); } printer->Outdent(); printer->Print( " onBuilt();\n"); printer->Print( " return result;\n" "}\n" "\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( "public Builder clone() {\n" " return (Builder) super.clone();\n" "}\n" "public Builder setField(\n" " com.google.protobuf.Descriptors.FieldDescriptor field,\n" " java.lang.Object value) {\n" " return (Builder) super.setField(field, value);\n" "}\n" "public Builder clearField(\n" " com.google.protobuf.Descriptors.FieldDescriptor field) {\n" " return (Builder) super.clearField(field);\n" "}\n" "public Builder clearOneof(\n" " com.google.protobuf.Descriptors.OneofDescriptor oneof) {\n" " return (Builder) super.clearOneof(oneof);\n" "}\n" "public Builder setRepeatedField(\n" " com.google.protobuf.Descriptors.FieldDescriptor field,\n" " int index, java.lang.Object value) {\n" " return (Builder) super.setRepeatedField(field, index, value);\n" "}\n" "public Builder addRepeatedField(\n" " com.google.protobuf.Descriptors.FieldDescriptor field,\n" " java.lang.Object value) {\n" " return (Builder) super.addRepeatedField(field, value);\n" "}\n"); if (descriptor_->extension_range_count() > 0) { printer->Print( "public Builder setExtension(\n" " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" " $classname$, Type> extension,\n" " Type value) {\n" " return (Builder) super.setExtension(extension, value);\n" "}\n" "public Builder setExtension(\n" " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" " $classname$, java.util.List> extension,\n" " int index, Type value) {\n" " return (Builder) super.setExtension(extension, index, value);\n" "}\n" "public Builder addExtension(\n" " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" " $classname$, java.util.List> extension,\n" " Type value) {\n" " return (Builder) super.addExtension(extension, value);\n" "}\n" "public Builder clearExtension(\n" " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" " $classname$, ?> extension) {\n" " return (Builder) super.clearExtension(extension);\n" "}\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); } // ----------------------------------------------------------------- if (context_->HasGeneratedMethods(descriptor_)) { printer->Print( "public Builder mergeFrom(com.google.protobuf.Message other) {\n" " if (other instanceof $classname$) {\n" " return mergeFrom(($classname$)other);\n" " } else {\n" " super.mergeFrom(other);\n" " return this;\n" " }\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Print( "public Builder mergeFrom($classname$ other) {\n" // Optimization: If other is the default instance, we know none of its // fields are set so we can skip the merge. " if (other == $classname$.getDefaultInstance()) return this;\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { if (!descriptor_->field(i)->containing_oneof()) { field_generators_.get( descriptor_->field(i)).GenerateMergingCode(printer); } } // Merge oneof fields. for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) { printer->Print( "switch (other.get$oneof_capitalized_name$Case()) {\n", "oneof_capitalized_name", context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->capitalized_name); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); printer->Print( "case $field_name$: {\n", "field_name", ToUpper(field->name())); printer->Indent(); field_generators_.get(field).GenerateMergingCode(printer); printer->Print( "break;\n"); printer->Outdent(); printer->Print( "}\n"); } printer->Print( "case $cap_oneof_name$_NOT_SET: {\n" " break;\n" "}\n", "cap_oneof_name", ToUpper(context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->name)); printer->Outdent(); printer->Print( "}\n"); } printer->Outdent(); // if message type has extensions if (descriptor_->extension_range_count() > 0) { printer->Print( " this.mergeExtensionFields(other);\n"); } printer->Print( " this.mergeUnknownFields(other.unknownFields);\n"); printer->Print( " onChanged();\n"); printer->Print( " return this;\n" "}\n" "\n"); } } // =================================================================== void MessageBuilderGenerator:: GenerateBuilderParsingMethods(io::Printer* printer) { printer->Print( "public Builder mergeFrom(\n" " com.google.protobuf.CodedInputStream input,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws java.io.IOException {\n" " $classname$ parsedMessage = null;\n" " try {\n" " parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);\n" " } catch (com.google.protobuf.InvalidProtocolBufferException e) {\n" " parsedMessage = ($classname$) e.getUnfinishedMessage();\n" " throw e.unwrapIOException();\n" " } finally {\n" " if (parsedMessage != null) {\n" " mergeFrom(parsedMessage);\n" " }\n" " }\n" " return this;\n" "}\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); } // =================================================================== void MessageBuilderGenerator::GenerateIsInitialized( io::Printer* printer) { printer->Print( "public final boolean isInitialized() {\n"); printer->Indent(); // Check that all required fields in this message are set. // TODO(kenton): We can optimize this when we switch to putting all the // "has" fields into a single bitfield. for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); if (field->is_required()) { printer->Print( "if (!has$name$()) {\n" " return false;\n" "}\n", "name", info->capitalized_name); } } // Now check that all embedded messages are initialized. for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); if (GetJavaType(field) == JAVATYPE_MESSAGE && HasRequiredFields(field->message_type())) { switch (field->label()) { case FieldDescriptor::LABEL_REQUIRED: printer->Print( "if (!get$name$().isInitialized()) {\n" " return false;\n" "}\n", "type", name_resolver_->GetImmutableClassName( field->message_type()), "name", info->capitalized_name); break; case FieldDescriptor::LABEL_OPTIONAL: if (!SupportFieldPresence(descriptor_->file()) && field->containing_oneof() != NULL) { const OneofDescriptor* oneof = field->containing_oneof(); const OneofGeneratorInfo* oneof_info = context_->GetOneofGeneratorInfo(oneof); printer->Print( "if ($oneof_name$Case_ == $field_number$) {\n", "oneof_name", oneof_info->name, "field_number", SimpleItoa(field->number())); } else { printer->Print( "if (has$name$()) {\n", "name", info->capitalized_name); } printer->Print( " if (!get$name$().isInitialized()) {\n" " return false;\n" " }\n" "}\n", "name", info->capitalized_name); break; case FieldDescriptor::LABEL_REPEATED: if (IsMapEntry(field->message_type())) { printer->Print( "for ($type$ item : get$name$Map().values()) {\n" " if (!item.isInitialized()) {\n" " return false;\n" " }\n" "}\n", "type", MapValueImmutableClassdName(field->message_type(), name_resolver_), "name", info->capitalized_name); } else { printer->Print( "for (int i = 0; i < get$name$Count(); i++) {\n" " if (!get$name$(i).isInitialized()) {\n" " return false;\n" " }\n" "}\n", "type", name_resolver_->GetImmutableClassName( field->message_type()), "name", info->capitalized_name); } break; } } } if (descriptor_->extension_range_count() > 0) { printer->Print( "if (!extensionsAreInitialized()) {\n" " return false;\n" "}\n"); } printer->Outdent(); printer->Print( " return true;\n" "}\n" "\n"); } // =================================================================== } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_message_builder.h000066400000000000000000000061541334102242000342570ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: dweis@google.com (Daniel Weis) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_BUILDER_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_BUILDER_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace java { class MessageBuilderGenerator { public: explicit MessageBuilderGenerator(const Descriptor* descriptor, Context* context); virtual ~MessageBuilderGenerator(); virtual void Generate(io::Printer* printer); private: void GenerateCommonBuilderMethods(io::Printer* printer); void GenerateDescriptorMethods(io::Printer* printer); void GenerateBuilderParsingMethods(io::Printer* printer); void GenerateIsInitialized(io::Printer* printer); const Descriptor* descriptor_; Context* context_; ClassNameResolver* name_resolver_; FieldGeneratorMap field_generators_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageBuilderGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_BUILDER_H__ java_message_builder_lite.cc000066400000000000000000000143461334102242000354340ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: dweis@google.com (Daniel Weis) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { bool GenerateHasBits(const Descriptor* descriptor) { return SupportFieldPresence(descriptor->file()) || HasRepeatedFields(descriptor); } } // namespace MessageBuilderLiteGenerator::MessageBuilderLiteGenerator( const Descriptor* descriptor, Context* context) : descriptor_(descriptor), context_(context), name_resolver_(context->GetNameResolver()), field_generators_(descriptor, context_) { GOOGLE_CHECK(!HasDescriptorMethods(descriptor->file(), context->EnforceLite())) << "Generator factory error: A lite message generator is used to " "generate non-lite messages."; } MessageBuilderLiteGenerator::~MessageBuilderLiteGenerator() {} void MessageBuilderLiteGenerator:: Generate(io::Printer* printer) { WriteMessageDocComment(printer, descriptor_); printer->Print( "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" : ""); printer->Indent(); GenerateCommonBuilderMethods(printer); // oneof std::map vars; for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { vars["oneof_name"] = context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->name; vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->capitalized_name; vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index()); // oneofCase() and clearOneof() printer->Print(vars, "public $oneof_capitalized_name$Case\n" " get$oneof_capitalized_name$Case() {\n" " return instance.get$oneof_capitalized_name$Case();\n" "}\n" "\n" "public Builder clear$oneof_capitalized_name$() {\n" " copyOnWrite();\n" " instance.clear$oneof_capitalized_name$();\n" " return this;\n" "}\n" "\n"); } if (GenerateHasBits(descriptor_)) { // Integers for bit fields. int totalBits = 0; for (int i = 0; i < descriptor_->field_count(); i++) { totalBits += field_generators_.get(descriptor_->field(i)) .GetNumBitsForBuilder(); } int totalInts = (totalBits + 31) / 32; for (int i = 0; i < totalInts; i++) { printer->Print("private int $bit_field_name$;\n", "bit_field_name", GetBitFieldName(i)); } } for (int i = 0; i < descriptor_->field_count(); i++) { printer->Print("\n"); field_generators_.get(descriptor_->field(i)) .GenerateBuilderMembers(printer); } printer->Print( "\n" "// @@protoc_insertion_point(builder_scope:$full_name$)\n", "full_name", descriptor_->full_name()); printer->Outdent(); printer->Print("}\n"); } // =================================================================== void MessageBuilderLiteGenerator:: GenerateCommonBuilderMethods(io::Printer* printer) { printer->Print( "// Construct using $classname$.newBuilder()\n" "private Builder() {\n" " super(DEFAULT_INSTANCE);\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); } // =================================================================== } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_message_builder_lite.h000066400000000000000000000057471334102242000353030ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: dweis@google.com (Daniel Weis) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_BUILDER_LITE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_BUILDER_LITE_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace java { class MessageBuilderLiteGenerator { public: explicit MessageBuilderLiteGenerator(const Descriptor* descriptor, Context* context); virtual ~MessageBuilderLiteGenerator(); virtual void Generate(io::Printer* printer); private: void GenerateCommonBuilderMethods(io::Printer* printer); const Descriptor* descriptor_; Context* context_; ClassNameResolver* name_resolver_; FieldGeneratorMap field_generators_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageBuilderLiteGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_BUILDER_LITE_H__ java_message_field.cc000066400000000000000000001334651334102242000340600ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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 #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { void SetMessageVariables(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, const FieldGeneratorInfo* info, ClassNameResolver* name_resolver, std::map* variables) { SetCommonFieldVariables(descriptor, info, variables); (*variables)["type"] = name_resolver->GetImmutableClassName(descriptor->message_type()); (*variables)["mutable_type"] = name_resolver->GetMutableClassName(descriptor->message_type()); (*variables)["group_or_message"] = (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ? "Group" : "Message"; // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported // by the proto compiler (*variables)["deprecation"] = descriptor->options().deprecated() ? "@java.lang.Deprecated " : ""; (*variables)["on_changed"] = "onChanged();"; (*variables)["ver"] = GeneratedCodeVersionSuffix(); (*variables)["get_parser"] = ExposePublicParser(descriptor->message_type()->file()) ? "PARSER" : "parser()"; if (SupportFieldPresence(descriptor->file())) { // For singular messages and builders, one bit is used for the hasField bit. (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); // Note that these have a trailing ";". (*variables)["set_has_field_bit_message"] = GenerateSetBit(messageBitIndex) + ";"; (*variables)["set_has_field_bit_builder"] = GenerateSetBit(builderBitIndex) + ";"; (*variables)["clear_has_field_bit_builder"] = GenerateClearBit(builderBitIndex) + ";"; (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex); } else { (*variables)["set_has_field_bit_message"] = ""; (*variables)["set_has_field_bit_builder"] = ""; (*variables)["clear_has_field_bit_builder"] = ""; (*variables)["is_field_present_message"] = (*variables)["name"] + "_ != null"; } // For repated builders, one bit is used for whether the array is immutable. (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); // For repeated fields, one bit is used for whether the array is immutable // in the parsing constructor. (*variables)["get_mutable_bit_parser"] = GenerateGetBitMutableLocal(builderBitIndex); (*variables)["set_mutable_bit_parser"] = GenerateSetBitMutableLocal(builderBitIndex); (*variables)["get_has_field_bit_from_local"] = GenerateGetBitFromLocal(builderBitIndex); (*variables)["set_has_field_bit_to_local"] = GenerateSetBitToLocal(messageBitIndex); } } // namespace // =================================================================== ImmutableMessageFieldGenerator:: ImmutableMessageFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetMessageVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } ImmutableMessageFieldGenerator::~ImmutableMessageFieldGenerator() {} int ImmutableMessageFieldGenerator::GetNumBitsForMessage() const { return 1; } int ImmutableMessageFieldGenerator::GetNumBitsForBuilder() const { return 1; } void ImmutableMessageFieldGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { // TODO(jonp): In the future, consider having a method specific to the // interface so that builders can choose dynamically to either return a // message or a nested builder, so that asking for the interface doesn't // cause a message to ever be built. WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$boolean has$capitalized_name$();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder();\n"); } void ImmutableMessageFieldGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private $type$ $name$_;\n"); PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder " "${$get$capitalized_name$OrBuilder$}$() {\n" " return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } else { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $name$_ != null;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder " "${$get$capitalized_name$OrBuilder$}$() {\n" " return get$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); } } void ImmutableMessageFieldGenerator::PrintNestedBuilderCondition( io::Printer* printer, const char* regular_case, const char* nested_builder_case) const { printer->Print(variables_, "if ($name$Builder_ == null) {\n"); printer->Indent(); printer->Print(variables_, regular_case); printer->Outdent(); printer->Print("} else {\n"); printer->Indent(); printer->Print(variables_, nested_builder_case); printer->Outdent(); printer->Print("}\n"); } void ImmutableMessageFieldGenerator::PrintNestedBuilderFunction( io::Printer* printer, const char* method_prototype, const char* regular_case, const char* nested_builder_case, const char* trailing_code) const { printer->Print(variables_, method_prototype); printer->Annotate("{", "}", descriptor_); printer->Print(" {\n"); printer->Indent(); PrintNestedBuilderCondition(printer, regular_case, nested_builder_case); if (trailing_code != NULL) { printer->Print(variables_, trailing_code); } printer->Outdent(); printer->Print("}\n"); } void ImmutableMessageFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // When using nested-builders, the code initially works just like the // non-nested builder case. It only creates a nested builder lazily on // demand and then forever delegates to it after creation. bool support_field_presence = SupportFieldPresence(descriptor_->file()); printer->Print(variables_, "private $type$ $name$_ = null;\n"); printer->Print(variables_, // If this builder is non-null, it is used and the other fields are // ignored. "private com.google.protobuf.SingleFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;" "\n"); // The comments above the methods below are based on a hypothetical // field of type "Field" called "Field". // boolean hasField() WriteFieldDocComment(printer, descriptor_); if (support_field_presence) { printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_builder$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } else { printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $name$Builder_ != null || $name$_ != null;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } // Field getField() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public $type$ ${$get$capitalized_name$$}$()", "return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n", "return $name$Builder_.getMessage();\n", NULL); // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value)", "if (value == null) {\n" " throw new NullPointerException();\n" "}\n" "$name$_ = value;\n" "$on_changed$\n", "$name$Builder_.setMessage(value);\n", "$set_has_field_bit_builder$\n" "return this;\n"); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " $type$.Builder builderForValue)", "$name$_ = builderForValue.build();\n" "$on_changed$\n", "$name$Builder_.setMessage(builderForValue.build());\n", "$set_has_field_bit_builder$\n" "return this;\n"); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$merge$capitalized_name$$}$($type$ value)", support_field_presence ? "if ($get_has_field_bit_builder$ &&\n" " $name$_ != null &&\n" " $name$_ != $type$.getDefaultInstance()) {\n" " $name$_ =\n" " $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n" "} else {\n" " $name$_ = value;\n" "}\n" "$on_changed$\n" : "if ($name$_ != null) {\n" " $name$_ =\n" " $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n" "} else {\n" " $name$_ = value;\n" "}\n" "$on_changed$\n", "$name$Builder_.mergeFrom(value);\n", "$set_has_field_bit_builder$\n" "return this;\n"); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$clear$capitalized_name$$}$()", "$name$_ = null;\n" "$on_changed$\n", support_field_presence ? "$name$Builder_.clear();\n" : "$name$_ = null;\n" "$name$Builder_ = null;\n", "$clear_has_field_bit_builder$\n" "return this;\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$.Builder " "${$get$capitalized_name$Builder$}$() {\n" " $set_has_field_bit_builder$\n" " $on_changed$\n" " return get$capitalized_name$FieldBuilder().getBuilder();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder " "${$get$capitalized_name$OrBuilder$}$() {\n" " if ($name$Builder_ != null) {\n" " return $name$Builder_.getMessageOrBuilder();\n" " } else {\n" " return $name$_ == null ?\n" " $type$.getDefaultInstance() : $name$_;\n" " }\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private com.google.protobuf.SingleFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder> \n" " get$capitalized_name$FieldBuilder() {\n" " if ($name$Builder_ == null) {\n" " $name$Builder_ = new com.google.protobuf.SingleFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder>(\n" " get$capitalized_name$(),\n" " getParentForChildren(),\n" " isClean());\n" " $name$_ = null;\n" " }\n" " return $name$Builder_;\n" "}\n"); } void ImmutableMessageFieldGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "get$capitalized_name$FieldBuilder();\n"); } } void ImmutableMessageFieldGenerator:: GenerateInitializationCode(io::Printer* printer) const {} void ImmutableMessageFieldGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { PrintNestedBuilderCondition(printer, "$name$_ = null;\n", "$name$Builder_.clear();\n"); printer->Print(variables_, "$clear_has_field_bit_builder$\n"); } else { PrintNestedBuilderCondition(printer, "$name$_ = null;\n", "$name$_ = null;\n" "$name$Builder_ = null;\n"); } } void ImmutableMessageFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "if (other.has$capitalized_name$()) {\n" " merge$capitalized_name$(other.get$capitalized_name$());\n" "}\n"); } void ImmutableMessageFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "if ($get_has_field_bit_from_local$) {\n" " $set_has_field_bit_to_local$;\n" "}\n"); } PrintNestedBuilderCondition(printer, "result.$name$_ = $name$_;\n", "result.$name$_ = $name$Builder_.build();\n"); } void ImmutableMessageFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "$type$.Builder subBuilder = null;\n" "if ($is_field_present_message$) {\n" " subBuilder = $name$_.toBuilder();\n" "}\n"); if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { printer->Print(variables_, "$name$_ = input.readGroup($number$, $type$.$get_parser$,\n" " extensionRegistry);\n"); } else { printer->Print(variables_, "$name$_ = input.readMessage($type$.$get_parser$, extensionRegistry);\n"); } printer->Print(variables_, "if (subBuilder != null) {\n" " subBuilder.mergeFrom($name$_);\n" " $name$_ = subBuilder.buildPartial();\n" "}\n" "$set_has_field_bit_message$\n"); } void ImmutableMessageFieldGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { // noop for messages. } void ImmutableMessageFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " output.write$group_or_message$($number$, get$capitalized_name$());\n" "}\n"); } void ImmutableMessageFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .compute$group_or_message$Size($number$, get$capitalized_name$());\n" "}\n"); } void ImmutableMessageFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && get$capitalized_name$()\n" " .equals(other.get$capitalized_name$());\n"); } void ImmutableMessageFieldGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n" "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); } string ImmutableMessageFieldGenerator::GetBoxedType() const { return name_resolver_->GetImmutableClassName(descriptor_->message_type()); } // =================================================================== ImmutableMessageOneofFieldGenerator:: ImmutableMessageOneofFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutableMessageFieldGenerator( descriptor, messageBitIndex, builderBitIndex, context) { const OneofGeneratorInfo* info = context->GetOneofGeneratorInfo(descriptor->containing_oneof()); SetCommonOneofVariables(descriptor, info, &variables_); } ImmutableMessageOneofFieldGenerator:: ~ImmutableMessageOneofFieldGenerator() {} void ImmutableMessageOneofFieldGenerator:: GenerateMembers(io::Printer* printer) const { PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " return ($type$) $oneof_name$_;\n" " }\n" " return $type$.getDefaultInstance();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder " "${$get$capitalized_name$OrBuilder$}$() {\n" " if ($has_oneof_case_message$) {\n" " return ($type$) $oneof_name$_;\n" " }\n" " return $type$.getDefaultInstance();\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableMessageOneofFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // When using nested-builders, the code initially works just like the // non-nested builder case. It only creates a nested builder lazily on // demand and then forever delegates to it after creation. printer->Print(variables_, // If this builder is non-null, it is used and the other fields are // ignored. "private com.google.protobuf.SingleFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;" "\n"); // The comments above the methods below are based on a hypothetical // field of type "Field" called "Field". // boolean hasField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Field getField() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public $type$ ${$get$capitalized_name$$}$()", "if ($has_oneof_case_message$) {\n" " return ($type$) $oneof_name$_;\n" "}\n" "return $type$.getDefaultInstance();\n", "if ($has_oneof_case_message$) {\n" " return $name$Builder_.getMessage();\n" "}\n" "return $type$.getDefaultInstance();\n", NULL); // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value)", "if (value == null) {\n" " throw new NullPointerException();\n" "}\n" "$oneof_name$_ = value;\n" "$on_changed$\n", "$name$Builder_.setMessage(value);\n", "$set_oneof_case_message$;\n" "return this;\n"); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " $type$.Builder builderForValue)", "$oneof_name$_ = builderForValue.build();\n" "$on_changed$\n", "$name$Builder_.setMessage(builderForValue.build());\n", "$set_oneof_case_message$;\n" "return this;\n"); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$merge$capitalized_name$$}$($type$ value)", "if ($has_oneof_case_message$ &&\n" " $oneof_name$_ != $type$.getDefaultInstance()) {\n" " $oneof_name$_ = $type$.newBuilder(($type$) $oneof_name$_)\n" " .mergeFrom(value).buildPartial();\n" "} else {\n" " $oneof_name$_ = value;\n" "}\n" "$on_changed$\n", "if ($has_oneof_case_message$) {\n" " $name$Builder_.mergeFrom(value);\n" "}\n" "$name$Builder_.setMessage(value);\n", "$set_oneof_case_message$;\n" "return this;\n"); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$clear$capitalized_name$$}$()", "if ($has_oneof_case_message$) {\n" " $clear_oneof_case_message$;\n" " $oneof_name$_ = null;\n" " $on_changed$\n" "}\n", "if ($has_oneof_case_message$) {\n" " $clear_oneof_case_message$;\n" " $oneof_name$_ = null;\n" "}\n" "$name$Builder_.clear();\n", "return this;\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$.Builder " "${$get$capitalized_name$Builder$}$() {\n" " return get$capitalized_name$FieldBuilder().getBuilder();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder " "${$get$capitalized_name$OrBuilder$}$() {\n" " if (($has_oneof_case_message$) && ($name$Builder_ != null)) {\n" " return $name$Builder_.getMessageOrBuilder();\n" " } else {\n" " if ($has_oneof_case_message$) {\n" " return ($type$) $oneof_name$_;\n" " }\n" " return $type$.getDefaultInstance();\n" " }\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private com.google.protobuf.SingleFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder> \n" " ${$get$capitalized_name$FieldBuilder$}$() {\n" " if ($name$Builder_ == null) {\n" " if (!($has_oneof_case_message$)) {\n" " $oneof_name$_ = $type$.getDefaultInstance();\n" " }\n" " $name$Builder_ = new com.google.protobuf.SingleFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder>(\n" " ($type$) $oneof_name$_,\n" " getParentForChildren(),\n" " isClean());\n" " $oneof_name$_ = null;\n" " }\n" " $set_oneof_case_message$;\n" " $on_changed$;\n" " return $name$Builder_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableMessageOneofFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n"); printer->Indent(); PrintNestedBuilderCondition(printer, "result.$oneof_name$_ = $oneof_name$_;\n", "result.$oneof_name$_ = $name$Builder_.build();\n"); printer->Outdent(); printer->Print("}\n"); } void ImmutableMessageOneofFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "merge$capitalized_name$(other.get$capitalized_name$());\n"); } void ImmutableMessageOneofFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "$type$.Builder subBuilder = null;\n" "if ($has_oneof_case_message$) {\n" " subBuilder = (($type$) $oneof_name$_).toBuilder();\n" "}\n"); if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { printer->Print(variables_, "$oneof_name$_ = input.readGroup($number$, $type$.$get_parser$,\n" " extensionRegistry);\n"); } else { printer->Print(variables_, "$oneof_name$_ =\n" " input.readMessage($type$.$get_parser$, extensionRegistry);\n"); } printer->Print(variables_, "if (subBuilder != null) {\n" " subBuilder.mergeFrom(($type$) $oneof_name$_);\n" " $oneof_name$_ = subBuilder.buildPartial();\n" "}\n"); printer->Print(variables_, "$set_oneof_case_message$;\n"); } void ImmutableMessageOneofFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " output.write$group_or_message$($number$, ($type$) $oneof_name$_);\n" "}\n"); } void ImmutableMessageOneofFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .compute$group_or_message$Size($number$, ($type$) $oneof_name$_);\n" "}\n"); } // =================================================================== RepeatedImmutableMessageFieldGenerator:: RepeatedImmutableMessageFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetMessageVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } RepeatedImmutableMessageFieldGenerator:: ~RepeatedImmutableMessageFieldGenerator() {} int RepeatedImmutableMessageFieldGenerator::GetNumBitsForMessage() const { return 0; } int RepeatedImmutableMessageFieldGenerator::GetNumBitsForBuilder() const { return 1; } void RepeatedImmutableMessageFieldGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { // TODO(jonp): In the future, consider having methods specific to the // interface so that builders can choose dynamically to either return a // message or a nested builder, so that asking for the interface doesn't // cause a message to ever be built. WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.util.List<$type$> \n" " get$capitalized_name$List();\n"); 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"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.util.List \n" " get$capitalized_name$OrBuilderList();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder(\n" " int index);\n"); } void RepeatedImmutableMessageFieldGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private java.util.List<$type$> $name$_;\n"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$type$> " "${$get$capitalized_name$List$}$() {\n" " return $name$_;\n" // note: unmodifiable list "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List \n" " ${$get$capitalized_name$OrBuilderList$}$() {\n" " return $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return $name$_.size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n" " return $name$_.get(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder " "${$get$capitalized_name$OrBuilder$}$(\n" " int index) {\n" " return $name$_.get(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void RepeatedImmutableMessageFieldGenerator::PrintNestedBuilderCondition( io::Printer* printer, const char* regular_case, const char* nested_builder_case) const { printer->Print(variables_, "if ($name$Builder_ == null) {\n"); printer->Indent(); printer->Print(variables_, regular_case); printer->Outdent(); printer->Print("} else {\n"); printer->Indent(); printer->Print(variables_, nested_builder_case); printer->Outdent(); printer->Print("}\n"); } void RepeatedImmutableMessageFieldGenerator::PrintNestedBuilderFunction( io::Printer* printer, const char* method_prototype, const char* regular_case, const char* nested_builder_case, const char* trailing_code) const { printer->Print(variables_, method_prototype); printer->Annotate("{", "}", descriptor_); printer->Print(" {\n"); printer->Indent(); PrintNestedBuilderCondition(printer, regular_case, nested_builder_case); if (trailing_code != NULL) { printer->Print(variables_, trailing_code); } printer->Outdent(); printer->Print("}\n"); } void RepeatedImmutableMessageFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // When using nested-builders, the code initially works just like the // non-nested builder case. It only creates a nested builder lazily on // demand and then forever delegates to it after creation. printer->Print(variables_, // Used when the builder is null. // One field is the list and the other field keeps track of whether the // list is immutable. If it's immutable, the invariant is that it must // either an instance of Collections.emptyList() or it's an ArrayList // wrapped in a Collections.unmodifiableList() wrapper and nobody else has // a refererence to the underlying ArrayList. This invariant allows us to // share instances of lists between protocol buffers avoiding expensive // memory allocations. Note, immutable is a strong guarantee here -- not // just that the list cannot be modified via the reference but that the // list can never be modified. "private java.util.List<$type$> $name$_ =\n" " java.util.Collections.emptyList();\n" "private void ensure$capitalized_name$IsMutable() {\n" " if (!$get_mutable_bit_builder$) {\n" " $name$_ = new java.util.ArrayList<$type$>($name$_);\n" " $set_mutable_bit_builder$;\n" " }\n" "}\n" "\n"); printer->Print(variables_, // If this builder is non-null, it is used and the other fields are // ignored. "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n" "\n"); // The comments above the methods below are based on a hypothetical // repeated field of type "Field" called "RepeatedField". // List getRepeatedFieldList() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public java.util.List<$type$> " "${$get$capitalized_name$List$}$()", "return java.util.Collections.unmodifiableList($name$_);\n", "return $name$Builder_.getMessageList();\n", NULL); // int getRepeatedFieldCount() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public int ${$get$capitalized_name$Count$}$()", "return $name$_.size();\n", "return $name$Builder_.getCount();\n", NULL); // Field getRepeatedField(int index) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index)", "return $name$_.get(index);\n", "return $name$Builder_.getMessage(index);\n", NULL); // Builder setRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " int index, $type$ value)", "if (value == null) {\n" " throw new NullPointerException();\n" "}\n" "ensure$capitalized_name$IsMutable();\n" "$name$_.set(index, value);\n" "$on_changed$\n", "$name$Builder_.setMessage(index, value);\n", "return this;\n"); // Builder setRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " int index, $type$.Builder builderForValue)", "ensure$capitalized_name$IsMutable();\n" "$name$_.set(index, builderForValue.build());\n" "$on_changed$\n", "$name$Builder_.setMessage(index, builderForValue.build());\n", "return this;\n"); // Builder addRepeatedField(Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value)", "if (value == null) {\n" " throw new NullPointerException();\n" "}\n" "ensure$capitalized_name$IsMutable();\n" "$name$_.add(value);\n" "$on_changed$\n", "$name$Builder_.addMessage(value);\n", "return this;\n"); // Builder addRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$add$capitalized_name$$}$(\n" " int index, $type$ value)", "if (value == null) {\n" " throw new NullPointerException();\n" "}\n" "ensure$capitalized_name$IsMutable();\n" "$name$_.add(index, value);\n" "$on_changed$\n", "$name$Builder_.addMessage(index, value);\n", "return this;\n"); // Builder addRepeatedField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$add$capitalized_name$$}$(\n" " $type$.Builder builderForValue)", "ensure$capitalized_name$IsMutable();\n" "$name$_.add(builderForValue.build());\n" "$on_changed$\n", "$name$Builder_.addMessage(builderForValue.build());\n", "return this;\n"); // Builder addRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$add$capitalized_name$$}$(\n" " int index, $type$.Builder builderForValue)", "ensure$capitalized_name$IsMutable();\n" "$name$_.add(index, builderForValue.build());\n" "$on_changed$\n", "$name$Builder_.addMessage(index, builderForValue.build());\n", "return this;\n"); // Builder addAllRepeatedField(Iterable values) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n" " java.lang.Iterable values)", "ensure$capitalized_name$IsMutable();\n" "com.google.protobuf.AbstractMessageLite.Builder.addAll(\n" " values, $name$_);\n" "$on_changed$\n", "$name$Builder_.addAllMessages(values);\n", "return this;\n"); // Builder clearAllRepeatedField() WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$clear$capitalized_name$$}$()", "$name$_ = java.util.Collections.emptyList();\n" "$clear_mutable_bit_builder$;\n" "$on_changed$\n", "$name$Builder_.clear();\n", "return this;\n"); // Builder removeRepeatedField(int index) WriteFieldDocComment(printer, descriptor_); PrintNestedBuilderFunction(printer, "$deprecation$public Builder ${$remove$capitalized_name$$}$(int index)", "ensure$capitalized_name$IsMutable();\n" "$name$_.remove(index);\n" "$on_changed$\n", "$name$Builder_.remove(index);\n", "return this;\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$.Builder ${$get$capitalized_name$Builder$}$(\n" " int index) {\n" " return get$capitalized_name$FieldBuilder().getBuilder(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder " "${$get$capitalized_name$OrBuilder$}$(\n" " int index) {\n" " if ($name$Builder_ == null) {\n" " return $name$_.get(index);" " } else {\n" " return $name$Builder_.getMessageOrBuilder(index);\n" " }\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List \n" " ${$get$capitalized_name$OrBuilderList$}$() {\n" " if ($name$Builder_ != null) {\n" " return $name$Builder_.getMessageOrBuilderList();\n" " } else {\n" " return java.util.Collections.unmodifiableList($name$_);\n" " }\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$.Builder " "${$add$capitalized_name$Builder$}$() {\n" " return get$capitalized_name$FieldBuilder().addBuilder(\n" " $type$.getDefaultInstance());\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$.Builder ${$add$capitalized_name$Builder$}$(\n" " int index) {\n" " return get$capitalized_name$FieldBuilder().addBuilder(\n" " index, $type$.getDefaultInstance());\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$type$.Builder> \n" " ${$get$capitalized_name$BuilderList$}$() {\n" " return get$capitalized_name$FieldBuilder().getBuilderList();\n" "}\n" "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder> \n" " get$capitalized_name$FieldBuilder() {\n" " if ($name$Builder_ == null) {\n" " $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder$ver$<\n" " $type$, $type$.Builder, $type$OrBuilder>(\n" " $name$_,\n" " $get_mutable_bit_builder$,\n" " getParentForChildren(),\n" " isClean());\n" " $name$_ = null;\n" " }\n" " return $name$Builder_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void RepeatedImmutableMessageFieldGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { printer->Print(variables_, "get$capitalized_name$FieldBuilder();\n"); } void RepeatedImmutableMessageFieldGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n"); } void RepeatedImmutableMessageFieldGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { PrintNestedBuilderCondition(printer, "$name$_ = java.util.Collections.emptyList();\n" "$clear_mutable_bit_builder$;\n", "$name$Builder_.clear();\n"); } void RepeatedImmutableMessageFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { // The code below does two optimizations (non-nested builder case): // 1. If the other list is empty, there's nothing to do. This ensures we // don't allocate a new array if we already have an immutable one. // 2. If the other list is non-empty and our current list is empty, we can // reuse the other list which is guaranteed to be immutable. PrintNestedBuilderCondition(printer, "if (!other.$name$_.isEmpty()) {\n" " if ($name$_.isEmpty()) {\n" " $name$_ = other.$name$_;\n" " $clear_mutable_bit_builder$;\n" " } else {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.addAll(other.$name$_);\n" " }\n" " $on_changed$\n" "}\n", "if (!other.$name$_.isEmpty()) {\n" " if ($name$Builder_.isEmpty()) {\n" " $name$Builder_.dispose();\n" " $name$Builder_ = null;\n" " $name$_ = other.$name$_;\n" " $clear_mutable_bit_builder$;\n" " $name$Builder_ = \n" " com.google.protobuf.GeneratedMessage$ver$.alwaysUseFieldBuilders ?\n" " get$capitalized_name$FieldBuilder() : null;\n" " } else {\n" " $name$Builder_.addAllMessages(other.$name$_);\n" " }\n" "}\n"); } void RepeatedImmutableMessageFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { // The code below (non-nested builder case) ensures that the result has an // immutable list. If our list is immutable, we can just reuse it. If not, // we make it immutable. PrintNestedBuilderCondition(printer, "if ($get_mutable_bit_builder$) {\n" " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" " $clear_mutable_bit_builder$;\n" "}\n" "result.$name$_ = $name$_;\n", "result.$name$_ = $name$Builder_.build();\n"); } void RepeatedImmutableMessageFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "if (!$get_mutable_bit_parser$) {\n" " $name$_ = new java.util.ArrayList<$type$>();\n" " $set_mutable_bit_parser$;\n" "}\n"); if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { printer->Print(variables_, "$name$_.add(input.readGroup($number$, $type$.$get_parser$,\n" " extensionRegistry));\n"); } else { printer->Print(variables_, "$name$_.add(\n" " input.readMessage($type$.$get_parser$, extensionRegistry));\n"); } } void RepeatedImmutableMessageFieldGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { printer->Print(variables_, "if ($get_mutable_bit_parser$) {\n" " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" "}\n"); } void RepeatedImmutableMessageFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " output.write$group_or_message$($number$, $name$_.get(i));\n" "}\n"); } void RepeatedImmutableMessageFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .compute$group_or_message$Size($number$, $name$_.get(i));\n" "}\n"); } void RepeatedImmutableMessageFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && get$capitalized_name$List()\n" " .equals(other.get$capitalized_name$List());\n"); } void RepeatedImmutableMessageFieldGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "if (get$capitalized_name$Count() > 0) {\n" " hash = (37 * hash) + $constant_name$;\n" " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" "}\n"); } string RepeatedImmutableMessageFieldGenerator::GetBoxedType() const { return name_resolver_->GetImmutableClassName(descriptor_->message_type()); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_message_field.h000066400000000000000000000155651334102242000340010ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } } namespace protobuf { namespace compiler { namespace java { class ImmutableMessageFieldGenerator : public ImmutableFieldGenerator { public: explicit ImmutableMessageFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableMessageFieldGenerator(); // implements ImmutableFieldGenerator --------------------------------------- int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; protected: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; void PrintNestedBuilderCondition(io::Printer* printer, const char* regular_case, const char* nested_builder_case) const; void PrintNestedBuilderFunction(io::Printer* printer, const char* method_prototype, const char* regular_case, const char* nested_builder_case, const char* trailing_code) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageFieldGenerator); }; class ImmutableMessageOneofFieldGenerator : public ImmutableMessageFieldGenerator { public: ImmutableMessageOneofFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableMessageOneofFieldGenerator(); void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageOneofFieldGenerator); }; class RepeatedImmutableMessageFieldGenerator : public ImmutableFieldGenerator { public: explicit RepeatedImmutableMessageFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~RepeatedImmutableMessageFieldGenerator(); // implements ImmutableFieldGenerator --------------------------------------- int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; protected: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; void PrintNestedBuilderCondition(io::Printer* printer, const char* regular_case, const char* nested_builder_case) const; void PrintNestedBuilderFunction(io::Printer* printer, const char* method_prototype, const char* regular_case, const char* nested_builder_case, const char* trailing_code) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableMessageFieldGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_H__ java_message_field_lite.cc000066400000000000000000001046111334102242000350640ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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 #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { void SetMessageVariables(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, const FieldGeneratorInfo* info, ClassNameResolver* name_resolver, std::map* variables) { SetCommonFieldVariables(descriptor, info, variables); (*variables)["type"] = name_resolver->GetImmutableClassName(descriptor->message_type()); (*variables)["mutable_type"] = name_resolver->GetMutableClassName(descriptor->message_type()); (*variables)["group_or_message"] = (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ? "Group" : "Message"; // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported // by the proto compiler (*variables)["deprecation"] = descriptor->options().deprecated() ? "@java.lang.Deprecated " : ""; (*variables)["required"] = descriptor->is_required() ? "true" : "false"; if (SupportFieldPresence(descriptor->file())) { // For singular messages and builders, one bit is used for the hasField bit. (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); // Note that these have a trailing ";". (*variables)["set_has_field_bit_message"] = GenerateSetBit(messageBitIndex) + ";"; (*variables)["clear_has_field_bit_message"] = GenerateClearBit(messageBitIndex) + ";"; (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex); } else { (*variables)["set_has_field_bit_message"] = ""; (*variables)["clear_has_field_bit_message"] = ""; (*variables)["is_field_present_message"] = (*variables)["name"] + "_ != null"; } // For repeated builders, the underlying list tracks mutability state. (*variables)["is_mutable"] = (*variables)["name"] + "_.isModifiable()"; (*variables)["get_has_field_bit_from_local"] = GenerateGetBitFromLocal(builderBitIndex); (*variables)["set_has_field_bit_to_local"] = GenerateSetBitToLocal(messageBitIndex); } } // namespace // =================================================================== ImmutableMessageFieldLiteGenerator:: ImmutableMessageFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetMessageVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } ImmutableMessageFieldLiteGenerator::~ImmutableMessageFieldLiteGenerator() {} int ImmutableMessageFieldLiteGenerator::GetNumBitsForMessage() const { return 1; } int ImmutableMessageFieldLiteGenerator::GetNumBitsForBuilder() const { return 0; } void ImmutableMessageFieldLiteGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$boolean has$capitalized_name$();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n"); } void ImmutableMessageFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private $type$ $name$_;\n"); PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } else { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $name$_ != null;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " $name$_ = value;\n" " $set_has_field_bit_message$\n" " }\n"); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " $type$.Builder builderForValue) {\n" " $name$_ = builderForValue.build();\n" " $set_has_field_bit_message$\n" "}\n"); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void merge$capitalized_name$($type$ value) {\n" " if ($name$_ != null &&\n" " $name$_ != $type$.getDefaultInstance()) {\n" " $name$_ =\n" " $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n" " } else {\n" " $name$_ = value;\n" " }\n" " $set_has_field_bit_message$\n" "}\n"); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {" " $name$_ = null;\n" " $clear_has_field_bit_message$\n" "}\n"); } void ImmutableMessageFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // The comments above the methods below are based on a hypothetical // field of type "Field" called "Field". // boolean hasField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return instance.has$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Field getField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return instance.get$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(value);\n" " return this;\n" " }\n"); printer->Annotate("{", "}", descriptor_); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " $type$.Builder builderForValue) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(builderForValue);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder " "${$merge$capitalized_name$$}$($type$ value) {\n" " copyOnWrite();\n" " instance.merge$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableMessageFieldLiteGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "get$capitalized_name$FieldBuilder();\n"); } } void ImmutableMessageFieldLiteGenerator:: GenerateInitializationCode(io::Printer* printer) const {} void ImmutableMessageFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = visitor.visitMessage($name$_, other.$name$_);\n"); } void ImmutableMessageFieldLiteGenerator:: GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const { // noop for scalars } void ImmutableMessageFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { // TODO(dweis): Update this code to avoid the builder allocation and instead // only allocate a submessage that isn't made immutable. Rely on the top // message calling makeImmutable once done to actually traverse the tree and // finalize state. This will avoid: // - transitive builder allocations // - the extra transitive iteration for streamed fields // - reallocations for copying repeated fields printer->Print(variables_, "$type$.Builder subBuilder = null;\n" "if ($is_field_present_message$) {\n" " subBuilder = $name$_.toBuilder();\n" "}\n"); if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { printer->Print(variables_, "$name$_ = input.readGroup($number$, $type$.parser(),\n" " extensionRegistry);\n"); } else { printer->Print(variables_, "$name$_ = input.readMessage($type$.parser(), extensionRegistry);\n"); } printer->Print(variables_, "if (subBuilder != null) {\n" " subBuilder.mergeFrom($name$_);\n" " $name$_ = subBuilder.buildPartial();\n" "}\n" "$set_has_field_bit_message$\n"); } void ImmutableMessageFieldLiteGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { // noop for messages. } void ImmutableMessageFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " output.write$group_or_message$($number$, get$capitalized_name$());\n" "}\n"); } void ImmutableMessageFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .compute$group_or_message$Size($number$, get$capitalized_name$());\n" "}\n"); } void ImmutableMessageFieldLiteGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && get$capitalized_name$()\n" " .equals(other.get$capitalized_name$());\n"); } void ImmutableMessageFieldLiteGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n" "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); } string ImmutableMessageFieldLiteGenerator::GetBoxedType() const { return name_resolver_->GetImmutableClassName(descriptor_->message_type()); } // =================================================================== ImmutableMessageOneofFieldLiteGenerator:: ImmutableMessageOneofFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutableMessageFieldLiteGenerator( descriptor, messageBitIndex, builderBitIndex, context) { const OneofGeneratorInfo* info = context->GetOneofGeneratorInfo(descriptor->containing_oneof()); SetCommonOneofVariables(descriptor, info, &variables_); } ImmutableMessageOneofFieldLiteGenerator:: ~ImmutableMessageOneofFieldLiteGenerator() {} void ImmutableMessageOneofFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " return ($type$) $oneof_name$_;\n" " }\n" " return $type$.getDefaultInstance();\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " $oneof_name$_ = value;\n" " $set_oneof_case_message$;\n" "}\n"); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " $type$.Builder builderForValue) {\n" " $oneof_name$_ = builderForValue.build();\n" " $set_oneof_case_message$;\n" "}\n"); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void merge$capitalized_name$($type$ value) {\n" " if ($has_oneof_case_message$ &&\n" " $oneof_name$_ != $type$.getDefaultInstance()) {\n" " $oneof_name$_ = $type$.newBuilder(($type$) $oneof_name$_)\n" " .mergeFrom(value).buildPartial();\n" " } else {\n" " $oneof_name$_ = value;\n" " }\n" " $set_oneof_case_message$;\n" "}\n"); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " if ($has_oneof_case_message$) {\n" " $clear_oneof_case_message$;\n" " $oneof_name$_ = null;\n" " }\n" "}\n"); } void ImmutableMessageOneofFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // The comments above the methods below are based on a hypothetical // field of type "Field" called "Field". // boolean hasField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return instance.has$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Field getField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return instance.get$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Field.Builder setField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Field.Builder setField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " $type$.Builder builderForValue) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(builderForValue);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Field.Builder mergeField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder " "${$merge$capitalized_name$$}$($type$ value) {\n" " copyOnWrite();\n" " instance.merge$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Field.Builder clearField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableMessageOneofFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print(variables_, "$oneof_name$_ = visitor.visitOneofMessage(\n" " $has_oneof_case_message$,\n" " $oneof_name$_,\n" " other.$oneof_name$_);\n"); } void ImmutableMessageOneofFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "$type$.Builder subBuilder = null;\n" "if ($has_oneof_case_message$) {\n" " subBuilder = (($type$) $oneof_name$_).toBuilder();\n" "}\n"); if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { printer->Print(variables_, "$oneof_name$_ = input.readGroup($number$, $type$.parser(),\n" " extensionRegistry);\n"); } else { printer->Print(variables_, "$oneof_name$_ =\n" " input.readMessage($type$.parser(), extensionRegistry);\n"); } printer->Print(variables_, "if (subBuilder != null) {\n" " subBuilder.mergeFrom(($type$) $oneof_name$_);\n" " $oneof_name$_ = subBuilder.buildPartial();\n" "}\n"); printer->Print(variables_, "$set_oneof_case_message$;\n"); } void ImmutableMessageOneofFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " output.write$group_or_message$($number$, ($type$) $oneof_name$_);\n" "}\n"); } void ImmutableMessageOneofFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .compute$group_or_message$Size($number$, ($type$) $oneof_name$_);\n" "}\n"); } // =================================================================== RepeatedImmutableMessageFieldLiteGenerator:: RepeatedImmutableMessageFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetMessageVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } RepeatedImmutableMessageFieldLiteGenerator:: ~RepeatedImmutableMessageFieldLiteGenerator() {} int RepeatedImmutableMessageFieldLiteGenerator::GetNumBitsForMessage() const { return 0; } int RepeatedImmutableMessageFieldLiteGenerator::GetNumBitsForBuilder() const { return 0; } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { // TODO(jonp): In the future, consider having methods specific to the // interface so that builders can choose dynamically to either return a // message or a nested builder, so that asking for the interface doesn't // cause a message to ever be built. WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.util.List<$type$> \n" " get$capitalized_name$List();\n"); 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"); } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private com.google.protobuf.Internal.ProtobufList<$type$> $name$_;\n"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$type$> " "${$get$capitalized_name$List$}$() {\n" " return $name$_;\n" // note: unmodifiable list "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List \n" " ${$get$capitalized_name$OrBuilderList$}$() {\n" " return $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return $name$_.size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n" " return $name$_.get(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$OrBuilder " "${$get$capitalized_name$OrBuilder$}$(\n" " int index) {\n" " return $name$_.get(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "private void ensure$capitalized_name$IsMutable() {\n" " if (!$is_mutable$) {\n" " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" " }\n" "}\n" "\n"); // Builder setRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " int index, $type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.set(index, value);\n" "}\n"); // Builder setRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " int index, $type$.Builder builderForValue) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.set(index, builderForValue.build());\n" "}\n"); // Builder addRepeatedField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$($type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(value);\n" "}\n"); // Builder addRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$(\n" " int index, $type$ value) {\n" " if (value == null) {\n" " throw new NullPointerException();\n" " }\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(index, value);\n" "}\n"); // Builder addRepeatedField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$(\n" " $type$.Builder builderForValue) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(builderForValue.build());\n" "}\n"); // Builder addRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$(\n" " int index, $type$.Builder builderForValue) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(index, builderForValue.build());\n" "}\n"); // Builder addAllRepeatedField(Iterable values) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void addAll$capitalized_name$(\n" " java.lang.Iterable values) {\n" " ensure$capitalized_name$IsMutable();\n" " com.google.protobuf.AbstractMessageLite.addAll(\n" " values, $name$_);\n" "}\n"); // Builder clearAllRepeatedField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " $name$_ = emptyProtobufList();\n" "}\n"); // Builder removeRepeatedField(int index) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void remove$capitalized_name$(int index) {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.remove(index);\n" "}\n"); } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // The comments above the methods below are based on a hypothetical // repeated field of type "Field" called "RepeatedField". // List getRepeatedFieldList() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$type$> " "${$get$capitalized_name$List$}$() {\n" " return java.util.Collections.unmodifiableList(\n" " instance.get$capitalized_name$List());\n" "}\n"); printer->Annotate("{", "}", descriptor_); // int getRepeatedFieldCount() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return instance.get$capitalized_name$Count();\n" "}"); printer->Annotate("{", "}", descriptor_); // Field getRepeatedField(int index) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n" " return instance.get$capitalized_name$(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Builder setRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " int index, $type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(index, value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Builder setRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " int index, $type$.Builder builderForValue) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(index, builderForValue);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Builder addRepeatedField(Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Builder addRepeatedField(int index, Field value) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$$}$(\n" " int index, $type$ value) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$(index, value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Builder addRepeatedField(Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$$}$(\n" " $type$.Builder builderForValue) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$(builderForValue);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Builder addRepeatedField(int index, Field.Builder builderForValue) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$$}$(\n" " int index, $type$.Builder builderForValue) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$(index, builderForValue);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Builder addAllRepeatedField(Iterable values) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n" " java.lang.Iterable values) {\n" " copyOnWrite();\n" " instance.addAll$capitalized_name$(values);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Builder clearAllRepeatedField() WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); // Builder removeRepeatedField(int index) WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$remove$capitalized_name$$}$(int index) {\n" " copyOnWrite();\n" " instance.remove$capitalized_name$(index);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { printer->Print(variables_, "get$capitalized_name$FieldBuilder();\n"); } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = emptyProtobufList();\n"); } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print(variables_, "$name$_= visitor.visitList($name$_, other.$name$_);\n"); } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.makeImmutable();\n"); } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "if (!$is_mutable$) {\n" " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" "}\n"); if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { printer->Print(variables_, "$name$_.add(input.readGroup($number$, $type$.parser(),\n" " extensionRegistry));\n"); } else { printer->Print(variables_, "$name$_.add(\n" " input.readMessage($type$.parser(), extensionRegistry));\n"); } } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_mutable$) {\n" " $name$_.makeImmutable();\n" "}\n"); } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " output.write$group_or_message$($number$, $name$_.get(i));\n" "}\n"); } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .compute$group_or_message$Size($number$, $name$_.get(i));\n" "}\n"); } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && get$capitalized_name$List()\n" " .equals(other.get$capitalized_name$List());\n"); } void RepeatedImmutableMessageFieldLiteGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "if (get$capitalized_name$Count() > 0) {\n" " hash = (37 * hash) + $constant_name$;\n" " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" "}\n"); } string RepeatedImmutableMessageFieldLiteGenerator::GetBoxedType() const { return name_resolver_->GetImmutableClassName(descriptor_->message_type()); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_message_field_lite.h000066400000000000000000000142451334102242000347310ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_LITE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_LITE_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } } namespace protobuf { namespace compiler { namespace java { class ImmutableMessageFieldLiteGenerator : public ImmutableFieldLiteGenerator { public: explicit ImmutableMessageFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableMessageFieldLiteGenerator(); // implements ImmutableFieldLiteGenerator ------------------------------------ int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; protected: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageFieldLiteGenerator); }; class ImmutableMessageOneofFieldLiteGenerator : public ImmutableMessageFieldLiteGenerator { public: ImmutableMessageOneofFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableMessageOneofFieldLiteGenerator(); void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageOneofFieldLiteGenerator); }; class RepeatedImmutableMessageFieldLiteGenerator : public ImmutableFieldLiteGenerator { public: explicit RepeatedImmutableMessageFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~RepeatedImmutableMessageFieldLiteGenerator(); // implements ImmutableFieldLiteGenerator ------------------------------------ int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; protected: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableMessageFieldLiteGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_message_lite.cc000066400000000000000000001206551334102242000340060ustar00rootroot00000000000000// 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: dweis@google.com (Daniel Weis) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { using internal::WireFormat; using internal::WireFormatLite; namespace { bool EnableExperimentalRuntimeForLite() { #ifdef PROTOBUF_EXPERIMENT return PROTOBUF_EXPERIMENT; #else // PROTOBUF_EXPERIMENT return false; #endif // !PROTOBUF_EXPERIMENT } bool GenerateHasBits(const Descriptor* descriptor) { return SupportFieldPresence(descriptor->file()) || HasRepeatedFields(descriptor); } string MapValueImmutableClassdName(const Descriptor* descriptor, ClassNameResolver* name_resolver) { const FieldDescriptor* value_field = descriptor->FindFieldByName("value"); GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, value_field->type()); return name_resolver->GetImmutableClassName(value_field->message_type()); } } // namespace // =================================================================== ImmutableMessageLiteGenerator::ImmutableMessageLiteGenerator( const Descriptor* descriptor, Context* context) : MessageGenerator(descriptor), context_(context), name_resolver_(context->GetNameResolver()), field_generators_(descriptor, context_) { GOOGLE_CHECK(!HasDescriptorMethods(descriptor->file(), context->EnforceLite())) << "Generator factory error: A lite message generator is used to " "generate non-lite messages."; } ImmutableMessageLiteGenerator::~ImmutableMessageLiteGenerator() {} void ImmutableMessageLiteGenerator::GenerateStaticVariables( io::Printer* printer, int* bytecode_estimate) { // Generate static members for all nested types. for (int i = 0; i < descriptor_->nested_type_count(); i++) { // TODO(kenton): Reuse MessageGenerator objects? ImmutableMessageLiteGenerator(descriptor_->nested_type(i), context_) .GenerateStaticVariables(printer, bytecode_estimate); } } int ImmutableMessageLiteGenerator::GenerateStaticVariableInitializers( io::Printer* printer) { int bytecode_estimate = 0; // Generate static member initializers for all nested types. for (int i = 0; i < descriptor_->nested_type_count(); i++) { // TODO(kenton): Reuse MessageGenerator objects? bytecode_estimate += ImmutableMessageLiteGenerator(descriptor_->nested_type(i), context_) .GenerateStaticVariableInitializers(printer); } return bytecode_estimate; } // =================================================================== void ImmutableMessageLiteGenerator::GenerateInterface(io::Printer* printer) { MaybePrintGeneratedAnnotation(context_, printer, descriptor_, /* immutable = */ true, "OrBuilder"); if (descriptor_->extension_range_count() > 0) { printer->Print( "$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(), "{", "", "}", ""); } else { printer->Print( "$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(), "{", "", "}", ""); } printer->Annotate("{", "}", descriptor_); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { printer->Print("\n"); field_generators_.get(descriptor_->field(i)) .GenerateInterfaceMembers(printer); } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "\n" "public $classname$.$oneof_capitalized_name$Case " "get$oneof_capitalized_name$Case();\n", "oneof_capitalized_name", context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->capitalized_name, "classname", context_->GetNameResolver()->GetImmutableClassName(descriptor_)); } printer->Outdent(); printer->Print("}\n"); } // =================================================================== void ImmutableMessageLiteGenerator::Generate(io::Printer* printer) { bool is_own_file = IsOwnFile(descriptor_, /* immutable = */ true); std::map variables; variables["static"] = is_own_file ? " " : " static "; variables["classname"] = descriptor_->name(); variables["extra_interfaces"] = ExtraMessageInterfaces(descriptor_); variables["deprecation"] = descriptor_->options().deprecated() ? "@java.lang.Deprecated " : ""; WriteMessageDocComment(printer, descriptor_); MaybePrintGeneratedAnnotation(context_, printer, descriptor_, /* immutable = */ true); // The builder_type stores the super type name of the nested Builder class. string builder_type; if (descriptor_->extension_range_count() > 0) { printer->Print(variables, "$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( "com.google.protobuf.GeneratedMessageLite.ExtendableBuilder<$0, ?>", name_resolver_->GetImmutableClassName(descriptor_)); } else { printer->Print(variables, "$deprecation$public $static$final class $classname$ extends\n" " com.google.protobuf.GeneratedMessageLite<\n" " $classname$, $classname$.Builder> implements\n" " $extra_interfaces$\n" " $classname$OrBuilder {\n"); builder_type = "com.google.protobuf.GeneratedMessageLite.Builder"; } printer->Indent(); GenerateConstructor(printer); // Nested types for (int i = 0; i < descriptor_->enum_type_count(); i++) { EnumLiteGenerator(descriptor_->enum_type(i), true, context_) .Generate(printer); } for (int i = 0; i < descriptor_->nested_type_count(); i++) { // Don't generate Java classes for map entry messages. if (IsMapEntry(descriptor_->nested_type(i))) continue; ImmutableMessageLiteGenerator messageGenerator( descriptor_->nested_type(i), context_); messageGenerator.GenerateInterface(printer); messageGenerator.Generate(printer); } if (GenerateHasBits(descriptor_)) { // Integers for bit fields. int totalBits = 0; for (int i = 0; i < descriptor_->field_count(); i++) { totalBits += field_generators_.get(descriptor_->field(i)) .GetNumBitsForMessage(); } int totalInts = (totalBits + 31) / 32; for (int i = 0; i < totalInts; i++) { printer->Print("private int $bit_field_name$;\n", "bit_field_name", GetBitFieldName(i)); } } // oneof std::map vars; for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { const OneofDescriptor* oneof = descriptor_->oneof_decl(i); vars["oneof_name"] = context_->GetOneofGeneratorInfo(oneof)->name; vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo( oneof)->capitalized_name; vars["oneof_index"] = SimpleItoa(oneof->index()); // 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" " implements com.google.protobuf.Internal.EnumLite {\n"); 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", SimpleItoa(field->number())); } printer->Print( "$cap_oneof_name$_NOT_SET(0);\n", "cap_oneof_name", ToUpper(vars["oneof_name"])); printer->Print(vars, "private final int value;\n" "private $oneof_capitalized_name$Case(int value) {\n" " this.value = value;\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", SimpleItoa(field->number()), "field_name", ToUpper(field->name())); } printer->Print( " case 0: return $cap_oneof_name$_NOT_SET;\n" " default: return null;\n" " }\n" "}\n" "public int getNumber() {\n" " return this.value;\n" "}\n", "cap_oneof_name", ToUpper(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" " return $oneof_capitalized_name$Case.forNumber(\n" " $oneof_name$Case_);\n" "}\n" "\n" "private void clear$oneof_capitalized_name$() {\n" " $oneof_name$Case_ = 0;\n" " $oneof_name$_ = null;\n" "}\n" "\n"); } // 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", SimpleItoa(descriptor_->field(i)->number())); field_generators_.get(descriptor_->field(i)).GenerateMembers(printer); printer->Print("\n"); } if (!EnableExperimentalRuntime(context_)) { GenerateMessageSerializationMethods(printer); } GenerateParseFromMethods(printer); GenerateBuilder(printer); if (HasRequiredFields(descriptor_)) { // Memoizes whether the protocol buffer is fully initialized (has all // required fields). 0 means false, 1 means true, and all other values // mean not yet computed. printer->Print( "private byte memoizedIsInitialized = 2;\n"); } printer->Print( "@java.lang.SuppressWarnings({\"unchecked\", \"fallthrough\"})\n" "protected final java.lang.Object dynamicMethod(\n" " com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,\n" " java.lang.Object arg0, java.lang.Object arg1) {\n" " switch (method) {\n" " case NEW_MUTABLE_INSTANCE: {\n" " return new $classname$();\n" " }\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Indent(); printer->Indent(); printer->Print("case IS_INITIALIZED: {\n"); printer->Indent(); GenerateDynamicMethodIsInitialized(printer); printer->Outdent(); printer->Print("}\n"); printer->Print( "case MAKE_IMMUTABLE: {\n"); printer->Indent(); GenerateDynamicMethodMakeImmutable(printer); printer->Outdent(); printer->Print( "}\n" "case NEW_BUILDER: {\n"); printer->Indent(); GenerateDynamicMethodNewBuilder(printer); printer->Outdent(); if (!EnableExperimentalRuntimeForLite()) { printer->Print( "}\n" "case VISIT: {\n"); printer->Indent(); GenerateDynamicMethodVisit(printer); printer->Outdent(); } printer->Print( "}\n" "case MERGE_FROM_STREAM: {\n"); printer->Indent(); GenerateDynamicMethodMergeFromStream(printer); printer->Outdent(); printer->Print( "}\n" "// fall through\n" "case GET_DEFAULT_INSTANCE: {\n" " return DEFAULT_INSTANCE;\n" "}\n" "case GET_PARSER: {\n" // Generally one would use the lazy initialization holder pattern for // manipulating static fields but that has exceptional cost on Android as // it will generate an extra class for every message. Instead, use the // double-check locking pattern which works just as well. " if (PARSER == null) {" " synchronized ($classname$.class) {\n" " if (PARSER == null) {\n" " PARSER = new DefaultInstanceBasedParser(DEFAULT_INSTANCE);\n" " }\n" " }\n" " }\n" " return PARSER;\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Outdent(); if (HasRequiredFields(descriptor_)) { printer->Print( "}\n" "case GET_MEMOIZED_IS_INITIALIZED: {\n" " return memoizedIsInitialized;\n" "}\n" "case SET_MEMOIZED_IS_INITIALIZED: {\n" " memoizedIsInitialized = (byte) (arg0 == null ? 0 : 1);\n" " return null;\n" "}\n"); } else { printer->Print( "}\n" "case GET_MEMOIZED_IS_INITIALIZED: {\n" " return (byte) 1;\n" "}\n" "case SET_MEMOIZED_IS_INITIALIZED: {\n" " return null;\n" "}\n"); } printer->Outdent(); printer->Print( " }\n" " throw new UnsupportedOperationException();\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Print( "\n" "// @@protoc_insertion_point(class_scope:$full_name$)\n", "full_name", descriptor_->full_name()); // Carefully initialize the default instance in such a way that it doesn't // conflict with other initialization. printer->Print( "private static final $classname$ DEFAULT_INSTANCE;\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Print( "static {\n" " DEFAULT_INSTANCE = new $classname$();\n" " DEFAULT_INSTANCE.makeImmutable();\n" "}\n" "\n", "classname", descriptor_->name()); if (EnableExperimentalRuntimeForLite()) { // Register the default instance in a map. This map will be used by // experimental runtime to lookup default instance given a class instance // without using Java reflection. printer->Print( "static {\n" " com.google.protobuf.GeneratedMessageLite.registerDefaultInstance(\n" " $classname$.class, DEFAULT_INSTANCE);\n" "}\n", "classname", descriptor_->name()); } printer->Print( "public static $classname$ getDefaultInstance() {\n" " return DEFAULT_INSTANCE;\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); // 'of' method for Wrappers if (IsWrappersProtoFile(descriptor_->file())) { printer->Print( "public static $classname$ of($field_type$ value) {\n" " return newBuilder().setValue(value).build();\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_), "field_type", PrimitiveTypeName(GetJavaType(descriptor_->field(0)))); } GenerateParser(printer); // Extensions must be declared after the DEFAULT_INSTANCE is initialized // because the DEFAULT_INSTANCE is used by the extension to lazily retrieve // the outer class's FileDescriptor. for (int i = 0; i < descriptor_->extension_count(); i++) { ImmutableExtensionLiteGenerator(descriptor_->extension(i), context_) .Generate(printer); } printer->Outdent(); printer->Print("}\n\n"); } // =================================================================== void ImmutableMessageLiteGenerator:: GenerateMessageSerializationMethods(io::Printer* printer) { google::protobuf::scoped_array sorted_fields( SortFieldsByNumber(descriptor_)); std::vector sorted_extensions; 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( "public void writeTo(com.google.protobuf.CodedOutputStream output)\n" " throws java.io.IOException {\n"); printer->Indent(); if (HasPackedFields(descriptor_)) { // writeTo(CodedOutputStream output) might be invoked without // getSerializedSize() ever being called, but we need the memoized // sizes in case this message has packed fields. Rather than emit checks // for each packed field, just call getSerializedSize() up front. In most // cases, getSerializedSize() will have already been called anyway by one // of the wrapper writeTo() methods, making this call cheap. printer->Print("getSerializedSize();\n"); } if (descriptor_->extension_range_count() > 0) { if (descriptor_->options().message_set_wire_format()) { printer->Print( "com.google.protobuf.GeneratedMessageLite\n" " .ExtendableMessage<$classname$, $classname$.Builder>\n" " .ExtensionWriter extensionWriter =\n" " newMessageSetExtensionWriter();\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); } else { printer->Print( "com.google.protobuf.GeneratedMessageLite\n" " .ExtendableMessage<$classname$, $classname$.Builder>\n" " .ExtensionWriter extensionWriter =\n" " newExtensionWriter();\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); } } // 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++]); } } if (descriptor_->options().message_set_wire_format()) { printer->Print("unknownFields.writeAsMessageSetTo(output);\n"); } else { printer->Print("unknownFields.writeTo(output);\n"); } printer->Outdent(); printer->Print( "}\n" "\n" "public int getSerializedSize() {\n" " int size = memoizedSerializedSize;\n" " if (size != -1) return size;\n" "\n"); printer->Indent(); printer->Print( "size = 0;\n"); for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer); } if (descriptor_->extension_range_count() > 0) { if (descriptor_->options().message_set_wire_format()) { printer->Print("size += extensionsSerializedSizeAsMessageSet();\n"); } else { printer->Print("size += extensionsSerializedSize();\n"); } } if (descriptor_->options().message_set_wire_format()) { printer->Print("size += unknownFields.getSerializedSizeAsMessageSet();\n"); } else { printer->Print("size += unknownFields.getSerializedSize();\n"); } printer->Print( "memoizedSerializedSize = size;\n" "return size;\n"); printer->Outdent(); printer->Print( "}\n" "\n"); } void ImmutableMessageLiteGenerator:: GenerateParseFromMethods(io::Printer* printer) { // Note: These are separate from GenerateMessageSerializationMethods() // because they need to be generated even for messages that are optimized // for code size. printer->Print( "public static $classname$ parseFrom(\n" " java.nio.ByteBuffer data)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n" " DEFAULT_INSTANCE, data);\n" "}\n" "public static $classname$ parseFrom(\n" " java.nio.ByteBuffer data,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n" " DEFAULT_INSTANCE, data, extensionRegistry);\n" "}\n" "public static $classname$ parseFrom(\n" " com.google.protobuf.ByteString data)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n" " DEFAULT_INSTANCE, data);\n" "}\n" "public static $classname$ parseFrom(\n" " com.google.protobuf.ByteString data,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n" " DEFAULT_INSTANCE, data, extensionRegistry);\n" "}\n" "public static $classname$ parseFrom(byte[] data)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n" " DEFAULT_INSTANCE, data);\n" "}\n" "public static $classname$ parseFrom(\n" " byte[] data,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws com.google.protobuf.InvalidProtocolBufferException {\n" " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n" " DEFAULT_INSTANCE, data, extensionRegistry);\n" "}\n" "public static $classname$ parseFrom(java.io.InputStream input)\n" " throws java.io.IOException {\n" " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n" " DEFAULT_INSTANCE, input);\n" "}\n" "public static $classname$ parseFrom(\n" " java.io.InputStream input,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws java.io.IOException {\n" " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n" " DEFAULT_INSTANCE, input, extensionRegistry);\n" "}\n" "public static $classname$ parseDelimitedFrom(java.io.InputStream input)\n" " throws java.io.IOException {\n" " return parseDelimitedFrom(DEFAULT_INSTANCE, input);\n" "}\n" "public static $classname$ parseDelimitedFrom(\n" " java.io.InputStream input,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws java.io.IOException {\n" " return parseDelimitedFrom(DEFAULT_INSTANCE, input, extensionRegistry);\n" "}\n" "public static $classname$ parseFrom(\n" " com.google.protobuf.CodedInputStream input)\n" " throws java.io.IOException {\n" " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n" " DEFAULT_INSTANCE, input);\n" "}\n" "public static $classname$ parseFrom(\n" " com.google.protobuf.CodedInputStream input,\n" " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" " throws java.io.IOException {\n" " return com.google.protobuf.GeneratedMessageLite.parseFrom(\n" " DEFAULT_INSTANCE, input, extensionRegistry);\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); } void ImmutableMessageLiteGenerator::GenerateSerializeOneField( io::Printer* printer, const FieldDescriptor* field) { field_generators_.get(field).GenerateSerializationCode(printer); } void ImmutableMessageLiteGenerator::GenerateSerializeOneExtensionRange( io::Printer* printer, const Descriptor::ExtensionRange* range) { printer->Print( "extensionWriter.writeUntil($end$, output);\n", "end", SimpleItoa(range->end)); } // =================================================================== void ImmutableMessageLiteGenerator::GenerateBuilder(io::Printer* printer) { printer->Print( "public static Builder newBuilder() {\n" " return (Builder) DEFAULT_INSTANCE.createBuilder();\n" "}\n" "public static Builder newBuilder($classname$ prototype) {\n" " return (Builder) DEFAULT_INSTANCE.createBuilder(prototype);\n" "}\n" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); MessageBuilderLiteGenerator builderGenerator(descriptor_, context_); builderGenerator.Generate(printer); } // =================================================================== void ImmutableMessageLiteGenerator::GenerateDynamicMethodIsInitialized( io::Printer* printer) { // Returns null for false, DEFAULT_INSTANCE for true. if (!HasRequiredFields(descriptor_)) { printer->Print("return DEFAULT_INSTANCE;\n"); return; } // TODO(xiaofeng): Remove this when b/64445758 is fixed. We don't need to // check memoizedIsInitialized here because the caller does that already, // but right now proguard proto shrinker asserts on the bytecode layout of // this code so it can't be removed until proguard is updated. printer->Print( "byte isInitialized = memoizedIsInitialized;\n" "if (isInitialized == 1) return DEFAULT_INSTANCE;\n" "if (isInitialized == 0) return null;\n" "\n" "boolean shouldMemoize = ((Boolean) arg0).booleanValue();\n"); // Check that all required fields in this message are set. // TODO(kenton): We can optimize this when we switch to putting all the // "has" fields into a single bitfield. for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); if (field->is_required()) { printer->Print( "if (!has$name$()) {\n" " return null;\n" "}\n", "name", info->capitalized_name); } } // Now check that all embedded messages are initialized. for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field); if (GetJavaType(field) == JAVATYPE_MESSAGE && HasRequiredFields(field->message_type())) { switch (field->label()) { case FieldDescriptor::LABEL_REQUIRED: printer->Print( "if (!get$name$().isInitialized()) {\n" " return null;\n" "}\n", "type", name_resolver_->GetImmutableClassName( field->message_type()), "name", info->capitalized_name); break; case FieldDescriptor::LABEL_OPTIONAL: if (!SupportFieldPresence(descriptor_->file()) && field->containing_oneof() != NULL) { const OneofDescriptor* oneof = field->containing_oneof(); const OneofGeneratorInfo* oneof_info = context_->GetOneofGeneratorInfo(oneof); printer->Print( "if ($oneof_name$Case_ == $field_number$) {\n", "oneof_name", oneof_info->name, "field_number", SimpleItoa(field->number())); } else { printer->Print( "if (has$name$()) {\n", "name", info->capitalized_name); } printer->Print( " if (!get$name$().isInitialized()) {\n" " return null;\n" " }\n" "}\n", "name", info->capitalized_name); break; case FieldDescriptor::LABEL_REPEATED: if (IsMapEntry(field->message_type())) { printer->Print( "for ($type$ item : get$name$Map().values()) {\n" " if (!item.isInitialized()) {\n" " return null;\n" " }\n" "}\n", "type", MapValueImmutableClassdName(field->message_type(), name_resolver_), "name", info->capitalized_name); } else { printer->Print( "for (int i = 0; i < get$name$Count(); i++) {\n" " if (!get$name$(i).isInitialized()) {\n" " return null;\n" " }\n" "}\n", "type", name_resolver_->GetImmutableClassName( field->message_type()), "name", info->capitalized_name); } break; } } } if (descriptor_->extension_range_count() > 0) { printer->Print( "if (!extensionsAreInitialized()) {\n" " return null;\n" "}\n"); } printer->Print( "return DEFAULT_INSTANCE;\n" "\n"); } // =================================================================== void ImmutableMessageLiteGenerator::GenerateDynamicMethodMakeImmutable( io::Printer* printer) { // Output generation code for each field. for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(descriptor_->field(i)) .GenerateDynamicMethodMakeImmutableCode(printer); } printer->Print( "return null;\n"); } // =================================================================== void ImmutableMessageLiteGenerator::GenerateDynamicMethodNewBuilder( io::Printer* printer) { printer->Print( "return new Builder();\n"); } // =================================================================== void ImmutableMessageLiteGenerator::GenerateDynamicMethodVisit( io::Printer* printer) { printer->Print( "Visitor visitor = (Visitor) arg0;\n" "$classname$ other = ($classname$) arg1;\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); for (int i = 0; i < descriptor_->field_count(); i++) { if (!descriptor_->field(i)->containing_oneof()) { field_generators_.get( descriptor_->field(i)).GenerateVisitCode(printer); } } // Merge oneof fields. for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) { printer->Print( "switch (other.get$oneof_capitalized_name$Case()) {\n", "oneof_capitalized_name", context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->capitalized_name); printer->Indent(); for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j); printer->Print( "case $field_name$: {\n", "field_name", ToUpper(field->name())); printer->Indent(); field_generators_.get(field).GenerateVisitCode(printer); printer->Print( "break;\n"); printer->Outdent(); printer->Print( "}\n"); } printer->Print( "case $cap_oneof_name$_NOT_SET: {\n" " visitor.visitOneofNotSet($oneof_name$Case_ != 0);\n" " break;\n" "}\n", "cap_oneof_name", ToUpper(context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->name), "oneof_name", context_->GetOneofGeneratorInfo( descriptor_->oneof_decl(i))->name); printer->Outdent(); printer->Print( "}\n"); } printer->Print( "if (visitor == com.google.protobuf.GeneratedMessageLite.MergeFromVisitor\n" " .INSTANCE) {\n"); printer->Indent(); for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) { const OneofDescriptor* field = descriptor_->oneof_decl(i); printer->Print( "if (other.$oneof_name$Case_ != 0) {\n" " $oneof_name$Case_ = other.$oneof_name$Case_;\n" "}\n", "oneof_name", context_->GetOneofGeneratorInfo(field)->name); } if (GenerateHasBits(descriptor_)) { // Integers for bit fields. int totalBits = 0; for (int i = 0; i < descriptor_->field_count(); i++) { totalBits += field_generators_.get(descriptor_->field(i)) .GetNumBitsForMessage(); } int totalInts = (totalBits + 31) / 32; for (int i = 0; i < totalInts; i++) { printer->Print( "$bit_field_name$ |= other.$bit_field_name$;\n", "bit_field_name", GetBitFieldName(i)); } } printer->Outdent(); printer->Print( "}\n"); printer->Print( "return this;\n"); } // =================================================================== void ImmutableMessageLiteGenerator::GenerateDynamicMethodMergeFromStream( io::Printer* printer) { printer->Print( "com.google.protobuf.CodedInputStream input =\n" " (com.google.protobuf.CodedInputStream) arg0;\n" "com.google.protobuf.ExtensionRegistryLite extensionRegistry =\n" " (com.google.protobuf.ExtensionRegistryLite) arg1;\n" "if (extensionRegistry == null) {\n" " throw new java.lang.NullPointerException();\n" "}\n"); printer->Print( "try {\n"); printer->Indent(); if (EnableExperimentalRuntime(context_)) { printer->Print( "mergeFromInternal(input, extensionRegistry);\n" "return DEFAULT_INSTANCE;\n"); } else { printer->Print( "boolean done = false;\n" "while (!done) {\n"); printer->Indent(); printer->Print( "int tag = input.readTag();\n" "switch (tag) {\n"); printer->Indent(); printer->Print( "case 0:\n" // zero signals EOF / limit reached " done = true;\n" " break;\n"); if (descriptor_->extension_range_count() > 0) { if (descriptor_->options().message_set_wire_format()) { printer->Print( "default: {\n" " if (!parseUnknownFieldAsMessageSet(\n" " getDefaultInstanceForType(), input, extensionRegistry,\n" " tag)) {\n" " done = true;\n" // it's an endgroup tag " }\n" " break;\n" "}\n"); } else { printer->Print( "default: {\n" " if (!parseUnknownField(getDefaultInstanceForType(),\n" " input, extensionRegistry, tag)) {\n" " done = true;\n" // it's an endgroup tag " }\n" " break;\n" "}\n"); } } else { printer->Print( "default: {\n" " if (!parseUnknownField(tag, input)) {\n" " done = true;\n" // it's an endgroup tag " }\n" " break;\n" "}\n"); } google::protobuf::scoped_array sorted_fields( SortFieldsByNumber(descriptor_)); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = sorted_fields[i]; uint32 tag = WireFormatLite::MakeTag( field->number(), WireFormat::WireTypeForFieldType(field->type())); printer->Print("case $tag$: {\n", "tag", SimpleItoa(static_cast(tag))); printer->Indent(); field_generators_.get(field).GenerateParsingCode(printer); printer->Outdent(); printer->Print( " break;\n" "}\n"); if (field->is_packable()) { // To make packed = true wire compatible, we generate parsing code from // a packed version of this field regardless of // field->options().packed(). uint32 packed_tag = WireFormatLite::MakeTag( field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED); printer->Print("case $tag$: {\n", "tag", SimpleItoa(static_cast(packed_tag))); printer->Indent(); field_generators_.get(field).GenerateParsingCodeFromPacked(printer); printer->Outdent(); printer->Print( " break;\n" "}\n"); } } printer->Outdent(); printer->Outdent(); printer->Print( " }\n" // switch (tag) "}\n"); // while (!done) } printer->Outdent(); printer->Print( "} catch (com.google.protobuf.InvalidProtocolBufferException e) {\n" " throw new RuntimeException(e.setUnfinishedMessage(this));\n" "} catch (java.io.IOException e) {\n" " throw new RuntimeException(\n" " new com.google.protobuf.InvalidProtocolBufferException(\n" " e.getMessage()).setUnfinishedMessage(this));\n" "} finally {\n"); printer->Indent(); printer->Outdent(); printer->Print( "}\n"); // finally } // =================================================================== void ImmutableMessageLiteGenerator:: GenerateExtensionRegistrationCode(io::Printer* printer) { for (int i = 0; i < descriptor_->extension_count(); i++) { ImmutableExtensionLiteGenerator(descriptor_->extension(i), context_) .GenerateRegistrationCode(printer); } for (int i = 0; i < descriptor_->nested_type_count(); i++) { ImmutableMessageLiteGenerator(descriptor_->nested_type(i), context_) .GenerateExtensionRegistrationCode(printer); } } // =================================================================== void ImmutableMessageLiteGenerator:: GenerateConstructor(io::Printer* printer) { printer->Print( "private $classname$() {\n", "classname", descriptor_->name()); printer->Indent(); // Initialize all fields to default. GenerateInitializers(printer); printer->Outdent(); printer->Print( "}\n"); } // =================================================================== void ImmutableMessageLiteGenerator::GenerateParser(io::Printer* printer) { printer->Print( "private static volatile com.google.protobuf.Parser<$classname$> PARSER;\n" "\n" "public static com.google.protobuf.Parser<$classname$> parser() {\n" " return DEFAULT_INSTANCE.getParserForType();\n" "}\n", "classname", descriptor_->name()); } // =================================================================== void ImmutableMessageLiteGenerator::GenerateInitializers(io::Printer* printer) { for (int i = 0; i < descriptor_->field_count(); i++) { if (!descriptor_->field(i)->containing_oneof()) { field_generators_.get(descriptor_->field(i)) .GenerateInitializationCode(printer); } } } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_message_lite.h000066400000000000000000000075601334102242000336470ustar00rootroot00000000000000// 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: dweis@google.com (Daniel Weis) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_LITE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_LITE_H__ #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class ImmutableMessageLiteGenerator : public MessageGenerator { public: ImmutableMessageLiteGenerator(const Descriptor* descriptor, Context* context); virtual ~ImmutableMessageLiteGenerator(); virtual void Generate(io::Printer* printer); virtual void GenerateInterface(io::Printer* printer); virtual void GenerateExtensionRegistrationCode(io::Printer* printer); virtual void GenerateStaticVariables( io::Printer* printer, int* bytecode_estimate); virtual int GenerateStaticVariableInitializers(io::Printer* printer); private: 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 GenerateDynamicMethodIsInitialized(io::Printer* printer); void GenerateDynamicMethodMakeImmutable(io::Printer* printer); void GenerateDynamicMethodVisit(io::Printer* printer); void GenerateDynamicMethodMergeFromStream(io::Printer* printer); void GenerateDynamicMethodNewBuilder(io::Printer* printer); void GenerateInitializers(io::Printer* printer); void GenerateEqualsAndHashCode(io::Printer* printer); void GenerateParser(io::Printer* printer); void GenerateConstructor(io::Printer* printer); Context* context_; ClassNameResolver* name_resolver_; FieldGeneratorMap field_generators_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageLiteGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_LITE_H__ java_name_resolver.cc000066400000000000000000000225461334102242000341270ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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 #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { // A suffix that will be appended to the file's outer class name if the name // conflicts with some other types defined in the file. const char* kOuterClassNameSuffix = "OuterClass"; // Strip package name from a descriptor's full name. // For example: // Full name : foo.Bar.Baz // Package name: foo // After strip : Bar.Baz string StripPackageName(const string& full_name, const FileDescriptor* file) { if (file->package().empty()) { return full_name; } else { // Strip package name return full_name.substr(file->package().size() + 1); } } // Get the name of a message's Java class without package name prefix. string ClassNameWithoutPackage(const Descriptor* descriptor, bool immutable) { return StripPackageName(descriptor->full_name(), descriptor->file()); } // Get the name of an enum's Java class without package name prefix. string ClassNameWithoutPackage(const EnumDescriptor* descriptor, bool immutable) { // Doesn't append "Mutable" for enum type's name. const Descriptor* message_descriptor = descriptor->containing_type(); if (message_descriptor == NULL) { return descriptor->name(); } else { return ClassNameWithoutPackage(message_descriptor, immutable) + "." + descriptor->name(); } } // Get the name of a service's Java class without package name prefix. string ClassNameWithoutPackage(const ServiceDescriptor* descriptor, bool immutable) { string full_name = StripPackageName(descriptor->full_name(), descriptor->file()); // We don't allow nested service definitions. GOOGLE_CHECK(full_name.find('.') == string::npos); return full_name; } // Check whether a given message or its nested types has the given class name. bool MessageHasConflictingClassName(const Descriptor* message, const string& classname) { if (message->name() == classname) return true; for (int i = 0; i < message->nested_type_count(); ++i) { if (MessageHasConflictingClassName(message->nested_type(i), classname)) { return true; } } for (int i = 0; i < message->enum_type_count(); ++i) { if (message->enum_type(i)->name() == classname) { return true; } } return false; } } // namespace ClassNameResolver::ClassNameResolver() { } ClassNameResolver::~ClassNameResolver() { } string ClassNameResolver::GetFileDefaultImmutableClassName( const FileDescriptor* file) { string basename; string::size_type last_slash = file->name().find_last_of('/'); if (last_slash == string::npos) { basename = file->name(); } else { basename = file->name().substr(last_slash + 1); } return UnderscoresToCamelCase(StripProto(basename), true); } string ClassNameResolver::GetFileImmutableClassName( const FileDescriptor* file) { string& class_name = file_immutable_outer_class_names_[file]; if (class_name.empty()) { if (file->options().has_java_outer_classname()) { class_name = file->options().java_outer_classname(); } else { class_name = GetFileDefaultImmutableClassName(file); if (HasConflictingClassName(file, class_name)) { class_name += kOuterClassNameSuffix; } } } return class_name; } string ClassNameResolver::GetFileClassName(const FileDescriptor* file, bool immutable) { if (immutable) { return GetFileImmutableClassName(file); } else { return "Mutable" + GetFileImmutableClassName(file); } } // Check whether there is any type defined in the proto file that has // the given class name. bool ClassNameResolver::HasConflictingClassName( const FileDescriptor* file, const string& classname) { for (int i = 0; i < file->enum_type_count(); i++) { if (file->enum_type(i)->name() == classname) { return true; } } for (int i = 0; i < file->service_count(); i++) { if (file->service(i)->name() == classname) { return true; } } for (int i = 0; i < file->message_type_count(); i++) { if (MessageHasConflictingClassName(file->message_type(i), classname)) { return true; } } return false; } string ClassNameResolver::GetDescriptorClassName( const FileDescriptor* descriptor) { return GetFileImmutableClassName(descriptor); } string ClassNameResolver::GetClassName(const FileDescriptor* descriptor, bool immutable) { string result = FileJavaPackage(descriptor, immutable); if (!result.empty()) result += '.'; result += GetFileClassName(descriptor, immutable); return result; } // Get the full name of a Java class by prepending the Java package name // or outer class name. string ClassNameResolver::GetClassFullName(const string& name_without_package, const FileDescriptor* file, bool immutable, bool multiple_files) { string result; if (multiple_files) { result = FileJavaPackage(file, immutable); } else { result = GetClassName(file, immutable); } if (!result.empty()) { result += '.'; } result += name_without_package; return result; } string ClassNameResolver::GetClassName(const Descriptor* descriptor, bool immutable) { return GetClassFullName(ClassNameWithoutPackage(descriptor, immutable), descriptor->file(), immutable, MultipleJavaFiles(descriptor->file(), immutable)); } string ClassNameResolver::GetClassName(const EnumDescriptor* descriptor, bool immutable) { return GetClassFullName(ClassNameWithoutPackage(descriptor, immutable), descriptor->file(), immutable, MultipleJavaFiles(descriptor->file(), immutable)); } string ClassNameResolver::GetClassName(const ServiceDescriptor* descriptor, bool immutable) { return GetClassFullName(ClassNameWithoutPackage(descriptor, immutable), descriptor->file(), immutable, MultipleJavaFiles(descriptor->file(), immutable)); } // Get the Java Class style full name of a message. string ClassNameResolver::GetJavaClassFullName( const string& name_without_package, const FileDescriptor* file, bool immutable) { string result; if (MultipleJavaFiles(file, immutable)) { result = FileJavaPackage(file, immutable); if (!result.empty()) result += '.'; } else { result = GetClassName(file, immutable); if (!result.empty()) result += '$'; } result += StringReplace(name_without_package, ".", "$", true); return result; } string ClassNameResolver::GetExtensionIdentifierName( const FieldDescriptor* descriptor, bool immutable) { return GetClassName(descriptor->containing_type(), immutable) + "." + descriptor->name(); } string ClassNameResolver::GetJavaImmutableClassName( const Descriptor* descriptor) { return GetJavaClassFullName( ClassNameWithoutPackage(descriptor, true), descriptor->file(), true); } string ClassNameResolver::GetJavaImmutableClassName( const EnumDescriptor* descriptor) { return GetJavaClassFullName( ClassNameWithoutPackage(descriptor, true), descriptor->file(), true); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_name_resolver.h000066400000000000000000000123671334102242000340500ustar00rootroot00000000000000// 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_NAME_RESOLVER_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_NAME_RESOLVER_H__ #include #include #include namespace google { namespace protobuf { class Descriptor; class EnumDescriptor; class FieldDescriptor; class FileDescriptor; class ServiceDescriptor; namespace compiler { namespace java { // Used to get the Java class related names for a given descriptor. It caches // the results to avoid redundant calculation across multiple name queries. // Thread-safety note: This class is *not* thread-safe. class ClassNameResolver { public: ClassNameResolver(); ~ClassNameResolver(); // Gets the unqualified outer class name for the file. string GetFileClassName(const FileDescriptor* file, bool immutable); // Gets the unqualified immutable outer class name of a file. string GetFileImmutableClassName(const FileDescriptor* file); // Gets the unqualified default immutable outer class name of a file // (converted from the proto file's name). string GetFileDefaultImmutableClassName(const FileDescriptor* file); // Check whether there is any type defined in the proto file that has // the given class name. bool HasConflictingClassName(const FileDescriptor* file, const string& classname); // Gets the name of the outer class that holds descriptor information. // Descriptors are shared between immutable messages and mutable messages. // Since both of them are generated optionally, the descriptors need to be // put in another common place. string GetDescriptorClassName(const FileDescriptor* file); // Gets the fully-qualified class name corresponding to the given descriptor. string GetClassName(const Descriptor* descriptor, bool immutable); string GetClassName(const EnumDescriptor* descriptor, bool immutable); string GetClassName(const ServiceDescriptor* descriptor, bool immutable); string GetClassName(const FileDescriptor* descriptor, bool immutable); template string GetImmutableClassName(const DescriptorType* descriptor) { return GetClassName(descriptor, true); } template string GetMutableClassName(const DescriptorType* descriptor) { return GetClassName(descriptor, false); } // Gets the fully qualified name of an extension identifier. string GetExtensionIdentifierName(const FieldDescriptor* descriptor, bool immutable); // Gets the fully qualified name for generated classes in Java convention. // Nested classes will be separated using '$' instead of '.' // For example: // com.package.OuterClass$OuterMessage$InnerMessage string GetJavaImmutableClassName(const Descriptor* descriptor); string GetJavaImmutableClassName(const EnumDescriptor* descriptor); private: // Get the full name of a Java class by prepending the Java package name // or outer class name. string GetClassFullName(const string& name_without_package, const FileDescriptor* file, bool immutable, bool multiple_files); // Get the Java Class style full name of a message. string GetJavaClassFullName( const string& name_without_package, const FileDescriptor* file, bool immutable); // Caches the result to provide better performance. std::map file_immutable_outer_class_names_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ClassNameResolver); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_NAME_RESOLVER_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_names.h000066400000000000000000000055631334102242000323120ustar00rootroot00000000000000// 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. // // Provides a mechanism for mapping a descriptor to the // fully-qualified name of the corresponding Java class. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_NAMES_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_NAMES_H__ #include namespace google { namespace protobuf { class Descriptor; class EnumDescriptor; class FileDescriptor; class ServiceDescriptor; namespace compiler { namespace java { // Requires: // descriptor != NULL // // Returns: // The fully-qualified Java class name. string ClassName(const Descriptor* descriptor); // Requires: // descriptor != NULL // // Returns: // The fully-qualified Java class name. string ClassName(const EnumDescriptor* descriptor); // Requires: // descriptor != NULL // // Returns: // The fully-qualified Java class name. string ClassName(const FileDescriptor* descriptor); // Requires: // descriptor != NULL // // Returns: // The fully-qualified Java class name. string ClassName(const ServiceDescriptor* descriptor); } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_NAMES_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_options.h000066400000000000000000000054371334102242000327020ustar00rootroot00000000000000// 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_OPTIONS_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_OPTIONS_H__ #include namespace google { namespace protobuf { namespace compiler { namespace java { // Generator options struct Options { Options() : generate_immutable_code(false), generate_mutable_code(false), generate_shared_code(false), enforce_lite(false), annotate_code(false) { } bool generate_immutable_code; bool generate_mutable_code; bool generate_shared_code; // When set, the protoc will generate the current files and all the transitive // dependencies as lite runtime. bool enforce_lite; // If true, we should build .meta files and emit @Generated annotations into // generated code. bool annotate_code; // Name of a file where we will write a list of generated .meta file names, // one per line. std::string annotation_list_file; // Name of a file where we will write a list of generated file names, one // per line. std::string output_list_file; }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_OPTIONS_H__ java_plugin_unittest.cc000066400000000000000000000116131334102242000345140ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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) // // TODO(kenton): Share code with the versions of this test in other languages? // It seemed like parameterizing it would add more complexity than it is // worth. #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { namespace { class TestGenerator : public CodeGenerator { public: TestGenerator() {} ~TestGenerator() {} virtual bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const { string filename = "Test.java"; TryInsert(filename, "outer_class_scope", context); TryInsert(filename, "class_scope:foo.Bar", context); TryInsert(filename, "class_scope:foo.Bar.Baz", context); TryInsert(filename, "builder_scope:foo.Bar", context); TryInsert(filename, "builder_scope:foo.Bar.Baz", context); TryInsert(filename, "enum_scope:foo.Qux", context); return true; } void TryInsert(const string& filename, const string& insertion_point, GeneratorContext* context) const { google::protobuf::scoped_ptr output( context->OpenForInsert(filename, insertion_point)); io::Printer printer(output.get(), '$'); printer.Print("// inserted $name$\n", "name", insertion_point); } }; // This test verifies that all the expected insertion points exist. It does // not verify that they are correctly-placed; that would require actually // compiling the output which is a bit more than I care to do for this test. TEST(JavaPluginTest, PluginTest) { GOOGLE_CHECK_OK(File::SetContents(TestTempDir() + "/test.proto", "syntax = \"proto2\";\n" "package foo;\n" "option java_package = \"\";\n" "option java_outer_classname = \"Test\";\n" "message Bar {\n" " message Baz {}\n" "}\n" "enum Qux { BLAH = 1; }\n", true)); google::protobuf::compiler::CommandLineInterface cli; cli.SetInputsAreProtoPathRelative(true); JavaGenerator java_generator; TestGenerator test_generator; cli.RegisterGenerator("--java_out", &java_generator, ""); cli.RegisterGenerator("--test_out", &test_generator, ""); string proto_path = "-I" + TestTempDir(); string java_out = "--java_out=" + TestTempDir(); string test_out = "--test_out=" + TestTempDir(); const char* argv[] = { "protoc", proto_path.c_str(), java_out.c_str(), test_out.c_str(), "test.proto" }; EXPECT_EQ(0, cli.Run(5, argv)); } } // namespace } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_primitive_field.cc000066400000000000000000000772311334102242000344420ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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 #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { using internal::WireFormat; using internal::WireFormatLite; namespace { void SetPrimitiveVariables(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, const FieldGeneratorInfo* info, ClassNameResolver* name_resolver, std::map* variables) { SetCommonFieldVariables(descriptor, info, variables); (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor)); (*variables)["boxed_type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor)); (*variables)["field_type"] = (*variables)["type"]; (*variables)["field_list_type"] = "java.util.List<" + (*variables)["boxed_type"] + ">"; (*variables)["empty_list"] = "java.util.Collections.emptyList()"; (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver); (*variables)["default_init"] = IsDefaultValueJavaDefault(descriptor) ? "" : ("= " + ImmutableDefaultValue(descriptor, name_resolver)); (*variables)["capitalized_type"] = GetCapitalizedType(descriptor, /* immutable = */ true); (*variables)["tag"] = SimpleItoa(static_cast(WireFormat::MakeTag(descriptor))); (*variables)["tag_size"] = SimpleItoa( WireFormat::TagSize(descriptor->number(), GetType(descriptor))); if (IsReferenceType(GetJavaType(descriptor))) { (*variables)["null_check"] = " if (value == null) {\n" " throw new NullPointerException();\n" " }\n"; } else { (*variables)["null_check"] = ""; } // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported // by the proto compiler (*variables)["deprecation"] = descriptor->options().deprecated() ? "@java.lang.Deprecated " : ""; int fixed_size = FixedSize(GetType(descriptor)); if (fixed_size != -1) { (*variables)["fixed_size"] = SimpleItoa(fixed_size); } (*variables)["on_changed"] = "onChanged();"; if (SupportFieldPresence(descriptor->file())) { // For singular messages and builders, one bit is used for the hasField bit. (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); // Note that these have a trailing ";". (*variables)["set_has_field_bit_message"] = GenerateSetBit(messageBitIndex) + ";"; (*variables)["set_has_field_bit_builder"] = GenerateSetBit(builderBitIndex) + ";"; (*variables)["clear_has_field_bit_builder"] = GenerateClearBit(builderBitIndex) + ";"; (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex); } else { (*variables)["set_has_field_bit_message"] = ""; (*variables)["set_has_field_bit_builder"] = ""; (*variables)["clear_has_field_bit_builder"] = ""; if (descriptor->type() == FieldDescriptor::TYPE_BYTES) { (*variables)["is_field_present_message"] = "!" + (*variables)["name"] + "_.isEmpty()"; } else { (*variables)["is_field_present_message"] = (*variables)["name"] + "_ != " + (*variables)["default"]; } } // For repated builders, one bit is used for whether the array is immutable. (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); // For repeated fields, one bit is used for whether the array is immutable // in the parsing constructor. (*variables)["get_mutable_bit_parser"] = GenerateGetBitMutableLocal(builderBitIndex); (*variables)["set_mutable_bit_parser"] = GenerateSetBitMutableLocal(builderBitIndex); (*variables)["get_has_field_bit_from_local"] = GenerateGetBitFromLocal(builderBitIndex); (*variables)["set_has_field_bit_to_local"] = GenerateSetBitToLocal(messageBitIndex); } } // namespace // =================================================================== ImmutablePrimitiveFieldGenerator:: ImmutablePrimitiveFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } ImmutablePrimitiveFieldGenerator::~ImmutablePrimitiveFieldGenerator() {} int ImmutablePrimitiveFieldGenerator::GetNumBitsForMessage() const { return 1; } int ImmutablePrimitiveFieldGenerator::GetNumBitsForBuilder() const { return 1; } void ImmutablePrimitiveFieldGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$boolean has$capitalized_name$();\n"); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n"); } void ImmutablePrimitiveFieldGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private $field_type$ $name$_;\n"); PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutablePrimitiveFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { printer->Print(variables_, "private $field_type$ $name$_ $default_init$;\n"); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_builder$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n" "$null_check$" " $set_has_field_bit_builder$\n" " $name$_ = value;\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " $clear_has_field_bit_builder$\n"); printer->Annotate("{", "}", descriptor_); JavaType type = GetJavaType(descriptor_); if (type == JAVATYPE_STRING || type == JAVATYPE_BYTES) { // The default value is not a simple literal so we want to avoid executing // it multiple times. Instead, get the default out of the default instance. printer->Print(variables_, " $name$_ = getDefaultInstance().get$capitalized_name$();\n"); } else { printer->Print(variables_, " $name$_ = $default$;\n"); } printer->Print(variables_, " $on_changed$\n" " return this;\n" "}\n"); } void ImmutablePrimitiveFieldGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for primitives } void ImmutablePrimitiveFieldGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default$;\n"); } void ImmutablePrimitiveFieldGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default$;\n" "$clear_has_field_bit_builder$\n"); } void ImmutablePrimitiveFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "if (other.has$capitalized_name$()) {\n" " set$capitalized_name$(other.get$capitalized_name$());\n" "}\n"); } else { printer->Print(variables_, "if (other.get$capitalized_name$() != $default$) {\n" " set$capitalized_name$(other.get$capitalized_name$());\n" "}\n"); } } void ImmutablePrimitiveFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "if ($get_has_field_bit_from_local$) {\n" " $set_has_field_bit_to_local$;\n" "}\n"); } printer->Print(variables_, "result.$name$_ = $name$_;\n"); } void ImmutablePrimitiveFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "$set_has_field_bit_message$\n" "$name$_ = input.read$capitalized_type$();\n"); } void ImmutablePrimitiveFieldGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { // noop for primitives. } void ImmutablePrimitiveFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " output.write$capitalized_type$($number$, $name$_);\n" "}\n"); } void ImmutablePrimitiveFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .compute$capitalized_type$Size($number$, $name$_);\n" "}\n"); } void ImmutablePrimitiveFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { switch (GetJavaType(descriptor_)) { case JAVATYPE_INT: case JAVATYPE_LONG: case JAVATYPE_BOOLEAN: printer->Print(variables_, "result = result && (get$capitalized_name$()\n" " == other.get$capitalized_name$());\n"); break; case JAVATYPE_FLOAT: printer->Print(variables_, "result = result && (\n" " java.lang.Float.floatToIntBits(get$capitalized_name$())\n" " == java.lang.Float.floatToIntBits(\n" " other.get$capitalized_name$()));\n"); break; case JAVATYPE_DOUBLE: printer->Print(variables_, "result = result && (\n" " java.lang.Double.doubleToLongBits(get$capitalized_name$())\n" " == java.lang.Double.doubleToLongBits(\n" " other.get$capitalized_name$()));\n"); break; case JAVATYPE_STRING: case JAVATYPE_BYTES: printer->Print(variables_, "result = result && get$capitalized_name$()\n" " .equals(other.get$capitalized_name$());\n"); break; case JAVATYPE_ENUM: case JAVATYPE_MESSAGE: default: GOOGLE_LOG(FATAL) << "Can't get here."; break; } } void ImmutablePrimitiveFieldGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n"); switch (GetJavaType(descriptor_)) { case JAVATYPE_INT: printer->Print(variables_, "hash = (53 * hash) + get$capitalized_name$();\n"); break; case JAVATYPE_LONG: printer->Print(variables_, "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n" " get$capitalized_name$());\n"); break; case JAVATYPE_BOOLEAN: printer->Print(variables_, "hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(\n" " get$capitalized_name$());\n"); break; case JAVATYPE_FLOAT: printer->Print(variables_, "hash = (53 * hash) + java.lang.Float.floatToIntBits(\n" " get$capitalized_name$());\n"); break; case JAVATYPE_DOUBLE: printer->Print(variables_, "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n" " java.lang.Double.doubleToLongBits(get$capitalized_name$()));\n"); break; case JAVATYPE_STRING: case JAVATYPE_BYTES: printer->Print(variables_, "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); break; case JAVATYPE_ENUM: case JAVATYPE_MESSAGE: default: GOOGLE_LOG(FATAL) << "Can't get here."; break; } } string ImmutablePrimitiveFieldGenerator::GetBoxedType() const { return BoxedPrimitiveTypeName(GetJavaType(descriptor_)); } // =================================================================== ImmutablePrimitiveOneofFieldGenerator:: ImmutablePrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutablePrimitiveFieldGenerator( descriptor, messageBitIndex, builderBitIndex, context) { const OneofGeneratorInfo* info = context->GetOneofGeneratorInfo(descriptor->containing_oneof()); SetCommonOneofVariables(descriptor, info, &variables_); } ImmutablePrimitiveOneofFieldGenerator:: ~ImmutablePrimitiveOneofFieldGenerator() {} void ImmutablePrimitiveOneofFieldGenerator:: GenerateMembers(io::Printer* printer) const { PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " return ($boxed_type$) $oneof_name$_;\n" " }\n" " return $default$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutablePrimitiveOneofFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " return ($boxed_type$) $oneof_name$_;\n" " }\n" " return $default$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n" "$null_check$" " $set_oneof_case_message$;\n" " $oneof_name$_ = value;\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " $clear_oneof_case_message$;\n" " $oneof_name$_ = null;\n" " $on_changed$\n" " }\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutablePrimitiveOneofFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " result.$oneof_name$_ = $oneof_name$_;\n" "}\n"); } void ImmutablePrimitiveOneofFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "set$capitalized_name$(other.get$capitalized_name$());\n"); } void ImmutablePrimitiveOneofFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "$set_oneof_case_message$;\n" "$oneof_name$_ = input.read$capitalized_type$();\n"); } void ImmutablePrimitiveOneofFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " output.write$capitalized_type$(\n"); // $type$ and $boxed_type$ is the same for bytes fields so we don't need to // do redundant casts. if (GetJavaType(descriptor_) == JAVATYPE_BYTES) { printer->Print(variables_, " $number$, ($type$) $oneof_name$_);\n"); } else { printer->Print(variables_, " $number$, ($type$)(($boxed_type$) $oneof_name$_));\n"); } printer->Print( "}\n"); } void ImmutablePrimitiveOneofFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .compute$capitalized_type$Size(\n"); // $type$ and $boxed_type$ is the same for bytes fields so we don't need to // do redundant casts. if (GetJavaType(descriptor_) == JAVATYPE_BYTES) { printer->Print(variables_, " $number$, ($type$) $oneof_name$_);\n"); } else { printer->Print(variables_, " $number$, ($type$)(($boxed_type$) $oneof_name$_));\n"); } printer->Print( "}\n"); } // =================================================================== RepeatedImmutablePrimitiveFieldGenerator:: RepeatedImmutablePrimitiveFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } RepeatedImmutablePrimitiveFieldGenerator:: ~RepeatedImmutablePrimitiveFieldGenerator() {} int RepeatedImmutablePrimitiveFieldGenerator::GetNumBitsForMessage() const { return 0; } int RepeatedImmutablePrimitiveFieldGenerator::GetNumBitsForBuilder() const { return 1; } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.util.List<$boxed_type$> get$capitalized_name$List();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$int get$capitalized_name$Count();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$(int index);\n"); } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private $field_list_type$ $name$_;\n"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$boxed_type$>\n" " ${$get$capitalized_name$List$}$() {\n" " return $name$_;\n" // note: unmodifiable list "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return $name$_.size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n" " return $name$_.get(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); if (descriptor_->is_packed() && context_->HasGeneratedMethods(descriptor_->containing_type())) { printer->Print(variables_, "private int $name$MemoizedSerializedSize = -1;\n"); } } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // One field is the list and the bit field keeps track of whether the // list is immutable. If it's immutable, the invariant is that it must // either an instance of Collections.emptyList() or it's an ArrayList // wrapped in a Collections.unmodifiableList() wrapper and nobody else has // a refererence to the underlying ArrayList. This invariant allows us to // share instances of lists between protocol buffers avoiding expensive // memory allocations. Note, immutable is a strong guarantee here -- not // just that the list cannot be modified via the reference but that the // list can never be modified. printer->Print(variables_, "private $field_list_type$ $name$_ = $empty_list$;\n"); printer->Print(variables_, "private void ensure$capitalized_name$IsMutable() {\n" " if (!$get_mutable_bit_builder$) {\n" " $name$_ = new java.util.ArrayList<$boxed_type$>($name$_);\n" " $set_mutable_bit_builder$;\n" " }\n" "}\n"); // Note: We return an unmodifiable list because otherwise the caller // could hold on to the returned list and modify it after the message // has been built, thus mutating the message which is supposed to be // immutable. WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$boxed_type$>\n" " ${$get$capitalized_name$List$}$() {\n" " return java.util.Collections.unmodifiableList($name$_);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return $name$_.size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n" " return $name$_.get(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " int index, $type$ value) {\n" "$null_check$" " ensure$capitalized_name$IsMutable();\n" " $name$_.set(index, value);\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value) {\n" "$null_check$" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(value);\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n" " java.lang.Iterable values) {\n" " ensure$capitalized_name$IsMutable();\n" " com.google.protobuf.AbstractMessageLite.Builder.addAll(\n" " values, $name$_);\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " $name$_ = $empty_list$;\n" " $clear_mutable_bit_builder$;\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for primitives } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $empty_list$;\n"); } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $empty_list$;\n" "$clear_mutable_bit_builder$;\n"); } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { // The code below does two optimizations: // 1. If the other list is empty, there's nothing to do. This ensures we // don't allocate a new array if we already have an immutable one. // 2. If the other list is non-empty and our current list is empty, we can // reuse the other list which is guaranteed to be immutable. printer->Print(variables_, "if (!other.$name$_.isEmpty()) {\n" " if ($name$_.isEmpty()) {\n" " $name$_ = other.$name$_;\n" " $clear_mutable_bit_builder$;\n" " } else {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.addAll(other.$name$_);\n" " }\n" " $on_changed$\n" "}\n"); } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { // The code below ensures that the result has an immutable list. If our // list is immutable, we can just reuse it. If not, we make it immutable. printer->Print(variables_, "if ($get_mutable_bit_builder$) {\n" " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" " $clear_mutable_bit_builder$;\n" "}\n" "result.$name$_ = $name$_;\n"); } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "if (!$get_mutable_bit_parser$) {\n" " $name$_ = new java.util.ArrayList<$boxed_type$>();\n" " $set_mutable_bit_parser$;\n" "}\n" "$name$_.add(input.read$capitalized_type$());\n"); } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateParsingCodeFromPacked(io::Printer* printer) const { printer->Print(variables_, "int length = input.readRawVarint32();\n" "int limit = input.pushLimit(length);\n" "if (!$get_mutable_bit_parser$ && input.getBytesUntilLimit() > 0) {\n" " $name$_ = new java.util.ArrayList<$boxed_type$>();\n" " $set_mutable_bit_parser$;\n" "}\n" "while (input.getBytesUntilLimit() > 0) {\n" " $name$_.add(input.read$capitalized_type$());\n" "}\n" "input.popLimit(limit);\n"); } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { printer->Print(variables_, "if ($get_mutable_bit_parser$) {\n" " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" "}\n"); } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { if (descriptor_->is_packed()) { // We invoke getSerializedSize in writeTo for messages that have packed // fields in ImmutableMessageGenerator::GenerateMessageSerializationMethods. // That makes it safe to rely on the memoized size here. printer->Print(variables_, "if (get$capitalized_name$List().size() > 0) {\n" " output.writeUInt32NoTag($tag$);\n" " output.writeUInt32NoTag($name$MemoizedSerializedSize);\n" "}\n" "for (int i = 0; i < $name$_.size(); i++) {\n" " output.write$capitalized_type$NoTag($name$_.get(i));\n" "}\n"); } else { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " output.write$capitalized_type$($number$, $name$_.get(i));\n" "}\n"); } } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "{\n" " int dataSize = 0;\n"); printer->Indent(); if (FixedSize(GetType(descriptor_)) == -1) { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " dataSize += com.google.protobuf.CodedOutputStream\n" " .compute$capitalized_type$SizeNoTag($name$_.get(i));\n" "}\n"); } else { printer->Print(variables_, "dataSize = $fixed_size$ * get$capitalized_name$List().size();\n"); } printer->Print( "size += dataSize;\n"); if (descriptor_->is_packed()) { printer->Print(variables_, "if (!get$capitalized_name$List().isEmpty()) {\n" " size += $tag_size$;\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeInt32SizeNoTag(dataSize);\n" "}\n"); } else { printer->Print(variables_, "size += $tag_size$ * get$capitalized_name$List().size();\n"); } // cache the data size for packed fields. if (descriptor_->is_packed()) { printer->Print(variables_, "$name$MemoizedSerializedSize = dataSize;\n"); } printer->Outdent(); printer->Print("}\n"); } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && get$capitalized_name$List()\n" " .equals(other.get$capitalized_name$List());\n"); } void RepeatedImmutablePrimitiveFieldGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "if (get$capitalized_name$Count() > 0) {\n" " hash = (37 * hash) + $constant_name$;\n" " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" "}\n"); } string RepeatedImmutablePrimitiveFieldGenerator::GetBoxedType() const { return BoxedPrimitiveTypeName(GetJavaType(descriptor_)); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_primitive_field.h000066400000000000000000000145111334102242000342740ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } } namespace protobuf { namespace compiler { namespace java { class ImmutablePrimitiveFieldGenerator : public ImmutableFieldGenerator { public: explicit ImmutablePrimitiveFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutablePrimitiveFieldGenerator(); // implements ImmutableFieldGenerator --------------------------------------- int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; protected: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutablePrimitiveFieldGenerator); }; class ImmutablePrimitiveOneofFieldGenerator : public ImmutablePrimitiveFieldGenerator { public: ImmutablePrimitiveOneofFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutablePrimitiveOneofFieldGenerator(); void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutablePrimitiveOneofFieldGenerator); }; class RepeatedImmutablePrimitiveFieldGenerator : public ImmutableFieldGenerator { public: explicit RepeatedImmutablePrimitiveFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); virtual ~RepeatedImmutablePrimitiveFieldGenerator(); // implements ImmutableFieldGenerator --------------------------------------- int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingCodeFromPacked(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; private: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutablePrimitiveFieldGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_H__ java_primitive_field_lite.cc000066400000000000000000001014241334102242000354470ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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 #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { using internal::WireFormat; using internal::WireFormatLite; namespace { void SetPrimitiveVariables(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, const FieldGeneratorInfo* info, ClassNameResolver* name_resolver, std::map* variables) { SetCommonFieldVariables(descriptor, info, variables); JavaType javaType = GetJavaType(descriptor); (*variables)["type"] = PrimitiveTypeName(javaType); (*variables)["boxed_type"] = BoxedPrimitiveTypeName(javaType); (*variables)["field_type"] = (*variables)["type"]; (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver); (*variables)["capitalized_type"] = GetCapitalizedType(descriptor, /* immutable = */ true); (*variables)["tag"] = SimpleItoa(static_cast(WireFormat::MakeTag(descriptor))); (*variables)["tag_size"] = SimpleItoa( WireFormat::TagSize(descriptor->number(), GetType(descriptor))); (*variables)["required"] = descriptor->is_required() ? "true" : "false"; string capitalized_type = UnderscoresToCamelCase(PrimitiveTypeName(javaType), true /* cap_next_letter */); switch (javaType) { case JAVATYPE_INT: case JAVATYPE_LONG: case JAVATYPE_FLOAT: case JAVATYPE_DOUBLE: case JAVATYPE_BOOLEAN: (*variables)["field_list_type"] = "com.google.protobuf.Internal." + capitalized_type + "List"; (*variables)["empty_list"] = "empty" + capitalized_type + "List()"; (*variables)["make_name_unmodifiable"] = (*variables)["name"] + "_.makeImmutable()"; (*variables)["repeated_get"] = (*variables)["name"] + "_.get" + capitalized_type; (*variables)["repeated_add"] = (*variables)["name"] + "_.add" + capitalized_type; (*variables)["repeated_set"] = (*variables)["name"] + "_.set" + capitalized_type; (*variables)["visit_type"] = capitalized_type; (*variables)["visit_type_list"] = "visit" + capitalized_type + "List"; break; default: (*variables)["field_list_type"] = "com.google.protobuf.Internal.ProtobufList<" + (*variables)["boxed_type"] + ">"; (*variables)["empty_list"] = "emptyProtobufList()"; (*variables)["make_name_unmodifiable"] = (*variables)["name"] + "_.makeImmutable()"; (*variables)["repeated_get"] = (*variables)["name"] + "_.get"; (*variables)["repeated_add"] = (*variables)["name"] + "_.add"; (*variables)["repeated_set"] = (*variables)["name"] + "_.set"; (*variables)["visit_type"] = "ByteString"; (*variables)["visit_type_list"] = "visitList"; } if (javaType == JAVATYPE_BYTES) { (*variables)["bytes_default"] = ToUpper((*variables)["name"]) + "_DEFAULT_VALUE"; } if (IsReferenceType(javaType)) { (*variables)["null_check"] = " if (value == null) {\n" " throw new NullPointerException();\n" " }\n"; } else { (*variables)["null_check"] = ""; } // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported // by the proto compiler (*variables)["deprecation"] = descriptor->options().deprecated() ? "@java.lang.Deprecated " : ""; int fixed_size = FixedSize(GetType(descriptor)); if (fixed_size != -1) { (*variables)["fixed_size"] = SimpleItoa(fixed_size); } if (SupportFieldPresence(descriptor->file())) { // For singular messages and builders, one bit is used for the hasField bit. (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); // Note that these have a trailing ";". (*variables)["set_has_field_bit_message"] = GenerateSetBit(messageBitIndex) + ";"; (*variables)["clear_has_field_bit_message"] = GenerateClearBit(messageBitIndex) + ";"; (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex); } else { (*variables)["set_has_field_bit_message"] = ""; (*variables)["set_has_field_bit_message"] = ""; (*variables)["clear_has_field_bit_message"] = ""; if (descriptor->type() == FieldDescriptor::TYPE_BYTES) { (*variables)["is_field_present_message"] = "!" + (*variables)["name"] + "_.isEmpty()"; } else { (*variables)["is_field_present_message"] = (*variables)["name"] + "_ != " + (*variables)["default"]; } } // For repeated builders, the underlying list tracks mutability state. (*variables)["is_mutable"] = (*variables)["name"] + "_.isModifiable()"; (*variables)["get_has_field_bit_from_local"] = GenerateGetBitFromLocal(builderBitIndex); (*variables)["set_has_field_bit_to_local"] = GenerateSetBitToLocal(messageBitIndex); } } // namespace // =================================================================== ImmutablePrimitiveFieldLiteGenerator:: ImmutablePrimitiveFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } ImmutablePrimitiveFieldLiteGenerator::~ImmutablePrimitiveFieldLiteGenerator() {} int ImmutablePrimitiveFieldLiteGenerator::GetNumBitsForMessage() const { return 1; } int ImmutablePrimitiveFieldLiteGenerator::GetNumBitsForBuilder() const { return 0; } void ImmutablePrimitiveFieldLiteGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$boolean has$capitalized_name$();\n"); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n"); } void ImmutablePrimitiveFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { if (IsByteStringWithCustomDefaultValue(descriptor_)) { // allocate this once statically since we know ByteStrings are immutable // values that can be reused. printer->Print( variables_, "private static final $field_type$ $bytes_default$ = $default$;\n"); } printer->Print(variables_, "private $field_type$ $name$_;\n"); PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$($type$ value) {\n" "$null_check$" " $set_has_field_bit_message$\n" " $name$_ = value;\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " $clear_has_field_bit_message$\n"); JavaType type = GetJavaType(descriptor_); if (type == JAVATYPE_STRING || type == JAVATYPE_BYTES) { // The default value is not a simple literal so we want to avoid executing // it multiple times. Instead, get the default out of the default instance. printer->Print(variables_, " $name$_ = getDefaultInstance().get$capitalized_name$();\n"); } else { printer->Print(variables_, " $name$_ = $default$;\n"); } printer->Print(variables_, "}\n"); } void ImmutablePrimitiveFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return instance.has$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return instance.get$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutablePrimitiveFieldLiteGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for primitives } void ImmutablePrimitiveFieldLiteGenerator:: GenerateInitializationCode(io::Printer* printer) const { if (IsByteStringWithCustomDefaultValue(descriptor_)) { printer->Print(variables_, "$name$_ = $bytes_default$;\n"); } else if (!IsDefaultValueJavaDefault(descriptor_)) { printer->Print(variables_, "$name$_ = $default$;\n"); } } void ImmutablePrimitiveFieldLiteGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { // noop for primitives } void ImmutablePrimitiveFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "$name$_ = visitor.visit$visit_type$(\n" " has$capitalized_name$(), $name$_,\n" " other.has$capitalized_name$(), other.$name$_);\n"); } else { printer->Print(variables_, "$name$_ = visitor.visit$visit_type$($name$_ != $default$, $name$_,\n" " other.$name$_ != $default$, other.$name$_);\n"); } } void ImmutablePrimitiveFieldLiteGenerator:: GenerateBuildingCode(io::Printer* printer) const { // noop for primitives } void ImmutablePrimitiveFieldLiteGenerator:: GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const { // noop for scalars } void ImmutablePrimitiveFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "$set_has_field_bit_message$\n" "$name$_ = input.read$capitalized_type$();\n"); } void ImmutablePrimitiveFieldLiteGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { // noop for primitives. } void ImmutablePrimitiveFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " output.write$capitalized_type$($number$, $name$_);\n" "}\n"); } void ImmutablePrimitiveFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .compute$capitalized_type$Size($number$, $name$_);\n" "}\n"); } void ImmutablePrimitiveFieldLiteGenerator:: GenerateEqualsCode(io::Printer* printer) const { switch (GetJavaType(descriptor_)) { case JAVATYPE_INT: case JAVATYPE_LONG: case JAVATYPE_BOOLEAN: printer->Print(variables_, "result = result && (get$capitalized_name$()\n" " == other.get$capitalized_name$());\n"); break; case JAVATYPE_FLOAT: printer->Print(variables_, "result = result && (\n" " java.lang.Float.floatToIntBits(get$capitalized_name$())\n" " == java.lang.Float.floatToIntBits(\n" " other.get$capitalized_name$()));\n"); break; case JAVATYPE_DOUBLE: printer->Print(variables_, "result = result && (\n" " java.lang.Double.doubleToLongBits(get$capitalized_name$())\n" " == java.lang.Double.doubleToLongBits(\n" " other.get$capitalized_name$()));\n"); break; case JAVATYPE_STRING: case JAVATYPE_BYTES: printer->Print(variables_, "result = result && get$capitalized_name$()\n" " .equals(other.get$capitalized_name$());\n"); break; case JAVATYPE_ENUM: case JAVATYPE_MESSAGE: default: GOOGLE_LOG(FATAL) << "Can't get here."; break; } } void ImmutablePrimitiveFieldLiteGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n"); switch (GetJavaType(descriptor_)) { case JAVATYPE_INT: printer->Print(variables_, "hash = (53 * hash) + get$capitalized_name$();\n"); break; case JAVATYPE_LONG: printer->Print(variables_, "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n" " get$capitalized_name$());\n"); break; case JAVATYPE_BOOLEAN: printer->Print(variables_, "hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(\n" " get$capitalized_name$());\n"); break; case JAVATYPE_FLOAT: printer->Print(variables_, "hash = (53 * hash) + java.lang.Float.floatToIntBits(\n" " get$capitalized_name$());\n"); break; case JAVATYPE_DOUBLE: printer->Print(variables_, "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n" " java.lang.Double.doubleToLongBits(get$capitalized_name$()));\n"); break; case JAVATYPE_STRING: case JAVATYPE_BYTES: printer->Print(variables_, "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); break; case JAVATYPE_ENUM: case JAVATYPE_MESSAGE: default: GOOGLE_LOG(FATAL) << "Can't get here."; break; } } string ImmutablePrimitiveFieldLiteGenerator::GetBoxedType() const { return BoxedPrimitiveTypeName(GetJavaType(descriptor_)); } // =================================================================== ImmutablePrimitiveOneofFieldLiteGenerator:: ImmutablePrimitiveOneofFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutablePrimitiveFieldLiteGenerator( descriptor, messageBitIndex, builderBitIndex, context) { const OneofGeneratorInfo* info = context->GetOneofGeneratorInfo(descriptor->containing_oneof()); SetCommonOneofVariables(descriptor, info, &variables_); } ImmutablePrimitiveOneofFieldLiteGenerator:: ~ImmutablePrimitiveOneofFieldLiteGenerator() {} void ImmutablePrimitiveOneofFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " return ($boxed_type$) $oneof_name$_;\n" " }\n" " return $default$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$($type$ value) {\n" "$null_check$" " $set_oneof_case_message$;\n" " $oneof_name$_ = value;\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " if ($has_oneof_case_message$) {\n" " $clear_oneof_case_message$;\n" " $oneof_name$_ = null;\n" " }\n" "}\n"); } void ImmutablePrimitiveOneofFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return instance.has$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n" " return instance.get$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutablePrimitiveOneofFieldLiteGenerator:: GenerateBuildingCode(io::Printer* printer) const { // noop for primitives } void ImmutablePrimitiveOneofFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print(variables_, "$oneof_name$_ = visitor.visitOneof$visit_type$(\n" " $has_oneof_case_message$, $oneof_name$_, other.$oneof_name$_);\n"); } void ImmutablePrimitiveOneofFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { printer->Print(variables_, "$set_oneof_case_message$;\n" "$oneof_name$_ = input.read$capitalized_type$();\n"); } void ImmutablePrimitiveOneofFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " output.write$capitalized_type$(\n" " $number$, ($type$)(($boxed_type$) $oneof_name$_));\n" "}\n"); } void ImmutablePrimitiveOneofFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .compute$capitalized_type$Size(\n" " $number$, ($type$)(($boxed_type$) $oneof_name$_));\n" "}\n"); } // =================================================================== RepeatedImmutablePrimitiveFieldLiteGenerator:: RepeatedImmutablePrimitiveFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } RepeatedImmutablePrimitiveFieldLiteGenerator:: ~RepeatedImmutablePrimitiveFieldLiteGenerator() {} int RepeatedImmutablePrimitiveFieldLiteGenerator::GetNumBitsForMessage() const { return 0; } int RepeatedImmutablePrimitiveFieldLiteGenerator::GetNumBitsForBuilder() const { return 0; } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.util.List<$boxed_type$> get$capitalized_name$List();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$int get$capitalized_name$Count();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$(int index);\n"); } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private $field_list_type$ $name$_;\n"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$boxed_type$>\n" " ${$get$capitalized_name$List$}$() {\n" " return $name$_;\n" // note: unmodifiable list "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return $name$_.size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n" " return $repeated_get$(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); if (descriptor_->is_packed() && context_->HasGeneratedMethods(descriptor_->containing_type())) { printer->Print(variables_, "private int $name$MemoizedSerializedSize = -1;\n"); } printer->Print(variables_, "private void ensure$capitalized_name$IsMutable() {\n" " if (!$is_mutable$) {\n" " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " int index, $type$ value) {\n" "$null_check$" " ensure$capitalized_name$IsMutable();\n" " $repeated_set$(index, value);\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$($type$ value) {\n" "$null_check$" " ensure$capitalized_name$IsMutable();\n" " $repeated_add$(value);\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void addAll$capitalized_name$(\n" " java.lang.Iterable values) {\n" " ensure$capitalized_name$IsMutable();\n" " com.google.protobuf.AbstractMessageLite.addAll(\n" " values, $name$_);\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " $name$_ = $empty_list$;\n" "}\n"); } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List<$boxed_type$>\n" " ${$get$capitalized_name$List$}$() {\n" " return java.util.Collections.unmodifiableList(\n" " instance.get$capitalized_name$List());\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return instance.get$capitalized_name$Count();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n" " return instance.get$capitalized_name$(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " int index, $type$ value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(index, value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n" " java.lang.Iterable values) {\n" " copyOnWrite();\n" " instance.addAll$capitalized_name$(values);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for primitives } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $empty_list$;\n"); } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { // noop for primitives } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print(variables_, "$name$_= visitor.$visit_type_list$($name$_, other.$name$_);\n"); } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateBuildingCode(io::Printer* printer) const { // noop for primitives } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.makeImmutable();\n"); } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { // TODO(dweis): Scan the input buffer to count, then initialize // appropriately. // TODO(dweis): Scan the input buffer to count and ensure capacity. printer->Print(variables_, "if (!$is_mutable$) {\n" " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" "}\n" "$repeated_add$(input.read$capitalized_type$());\n"); } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateParsingCodeFromPacked(io::Printer* printer) const { printer->Print(variables_, "int length = input.readRawVarint32();\n" "int limit = input.pushLimit(length);\n" "if (!$is_mutable$ && input.getBytesUntilLimit() > 0) {\n"); int fixed_size = FixedSize(GetType(descriptor_)); if (fixed_size == -1) { // TODO(dweis): Scan the input buffer to count, then initialize // appropriately. printer->Print(variables_, " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"); } else { printer->Print(variables_, " final int currentSize = $name$_.size();\n" " $name$_ = $name$_.mutableCopyWithCapacity(\n" " currentSize + (length/$fixed_size$));\n"); } // TODO(dweis): Scan the input buffer to count and ensure capacity. printer->Print(variables_, "}\n" "while (input.getBytesUntilLimit() > 0) {\n" " $repeated_add$(input.read$capitalized_type$());\n" "}\n" "input.popLimit(limit);\n"); } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_mutable$) {\n" " $make_name_unmodifiable$;\n" "}\n"); } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { if (descriptor_->is_packed()) { // We invoke getSerializedSize in writeTo for messages that have packed // fields in ImmutableMessageGenerator::GenerateMessageSerializationMethods. // That makes it safe to rely on the memoized size here. printer->Print(variables_, "if (get$capitalized_name$List().size() > 0) {\n" " output.writeUInt32NoTag($tag$);\n" " output.writeUInt32NoTag($name$MemoizedSerializedSize);\n" "}\n" "for (int i = 0; i < $name$_.size(); i++) {\n" " output.write$capitalized_type$NoTag($repeated_get$(i));\n" "}\n"); } else { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " output.write$capitalized_type$($number$, $repeated_get$(i));\n" "}\n"); } } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "{\n" " int dataSize = 0;\n"); printer->Indent(); if (FixedSize(GetType(descriptor_)) == -1) { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " dataSize += com.google.protobuf.CodedOutputStream\n" " .compute$capitalized_type$SizeNoTag($repeated_get$(i));\n" "}\n"); } else { printer->Print(variables_, "dataSize = $fixed_size$ * get$capitalized_name$List().size();\n"); } printer->Print( "size += dataSize;\n"); if (descriptor_->is_packed()) { printer->Print(variables_, "if (!get$capitalized_name$List().isEmpty()) {\n" " size += $tag_size$;\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeInt32SizeNoTag(dataSize);\n" "}\n"); } else { printer->Print(variables_, "size += $tag_size$ * get$capitalized_name$List().size();\n"); } // cache the data size for packed fields. if (descriptor_->is_packed()) { printer->Print(variables_, "$name$MemoizedSerializedSize = dataSize;\n"); } printer->Outdent(); printer->Print("}\n"); } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && get$capitalized_name$List()\n" " .equals(other.get$capitalized_name$List());\n"); } void RepeatedImmutablePrimitiveFieldLiteGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "if (get$capitalized_name$Count() > 0) {\n" " hash = (37 * hash) + $constant_name$;\n" " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" "}\n"); } string RepeatedImmutablePrimitiveFieldLiteGenerator::GetBoxedType() const { return BoxedPrimitiveTypeName(GetJavaType(descriptor_)); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_primitive_field_lite.h000066400000000000000000000150551334102242000353150ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_LITE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_LITE_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } } namespace protobuf { namespace compiler { namespace java { class ImmutablePrimitiveFieldLiteGenerator : public ImmutableFieldLiteGenerator { public: explicit ImmutablePrimitiveFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutablePrimitiveFieldLiteGenerator(); // implements ImmutableFieldLiteGenerator ------------------------------------ int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; protected: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutablePrimitiveFieldLiteGenerator); }; class ImmutablePrimitiveOneofFieldLiteGenerator : public ImmutablePrimitiveFieldLiteGenerator { public: ImmutablePrimitiveOneofFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutablePrimitiveOneofFieldLiteGenerator(); void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutablePrimitiveOneofFieldLiteGenerator); }; class RepeatedImmutablePrimitiveFieldLiteGenerator : public ImmutableFieldLiteGenerator { public: explicit RepeatedImmutablePrimitiveFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); virtual ~RepeatedImmutablePrimitiveFieldLiteGenerator(); // implements ImmutableFieldLiteGenerator ------------------------------------ int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingCodeFromPacked(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; private: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutablePrimitiveFieldLiteGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_service.cc000066400000000000000000000370221334102242000330000ustar00rootroot00000000000000// 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 #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { ServiceGenerator::ServiceGenerator(const ServiceDescriptor* descriptor) : descriptor_(descriptor) {} ServiceGenerator::~ServiceGenerator() {} // =================================================================== ImmutableServiceGenerator::ImmutableServiceGenerator( const ServiceDescriptor* descriptor, Context* context) : ServiceGenerator(descriptor), context_(context), name_resolver_(context->GetNameResolver()) {} ImmutableServiceGenerator::~ImmutableServiceGenerator() {} void ImmutableServiceGenerator::Generate(io::Printer* printer) { bool is_own_file = IsOwnFile(descriptor_, /* immutable = */ true); WriteServiceDocComment(printer, descriptor_); MaybePrintGeneratedAnnotation(context_, printer, descriptor_, /* immutable = */ true); printer->Print( "public $static$ abstract class $classname$\n" " implements com.google.protobuf.Service {\n", "static", is_own_file ? "" : "static", "classname", descriptor_->name()); printer->Indent(); printer->Print( "protected $classname$() {}\n\n", "classname", descriptor_->name()); GenerateInterface(printer); GenerateNewReflectiveServiceMethod(printer); GenerateNewReflectiveBlockingServiceMethod(printer); GenerateAbstractMethods(printer); // Generate getDescriptor() and getDescriptorForType(). printer->Print( "public static final\n" " com.google.protobuf.Descriptors.ServiceDescriptor\n" " getDescriptor() {\n" " return $file$.getDescriptor().getServices().get($index$);\n" "}\n", "file", name_resolver_->GetImmutableClassName(descriptor_->file()), "index", SimpleItoa(descriptor_->index())); GenerateGetDescriptorForType(printer); // Generate more stuff. GenerateCallMethod(printer); GenerateGetPrototype(REQUEST, printer); GenerateGetPrototype(RESPONSE, printer); GenerateStub(printer); GenerateBlockingStub(printer); // Add an insertion point. printer->Print( "\n" "// @@protoc_insertion_point(class_scope:$full_name$)\n", "full_name", descriptor_->full_name()); printer->Outdent(); printer->Print("}\n\n"); } void ImmutableServiceGenerator::GenerateGetDescriptorForType( io::Printer* printer) { printer->Print( "public final com.google.protobuf.Descriptors.ServiceDescriptor\n" " getDescriptorForType() {\n" " return getDescriptor();\n" "}\n"); } void ImmutableServiceGenerator::GenerateInterface(io::Printer* printer) { printer->Print("public interface Interface {\n"); printer->Indent(); GenerateAbstractMethods(printer); printer->Outdent(); printer->Print("}\n\n"); } void ImmutableServiceGenerator::GenerateNewReflectiveServiceMethod( io::Printer* printer) { printer->Print( "public static com.google.protobuf.Service newReflectiveService(\n" " final Interface impl) {\n" " return new $classname$() {\n", "classname", descriptor_->name()); printer->Indent(); printer->Indent(); for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); printer->Print("@java.lang.Override\n"); GenerateMethodSignature(printer, method, IS_CONCRETE); printer->Print( " {\n" " impl.$method$(controller, request, done);\n" "}\n\n", "method", UnderscoresToCamelCase(method)); } printer->Outdent(); printer->Print("};\n"); printer->Outdent(); printer->Print("}\n\n"); } void ImmutableServiceGenerator::GenerateNewReflectiveBlockingServiceMethod( io::Printer* printer) { printer->Print( "public static com.google.protobuf.BlockingService\n" " newReflectiveBlockingService(final BlockingInterface impl) {\n" " return new com.google.protobuf.BlockingService() {\n"); printer->Indent(); printer->Indent(); GenerateGetDescriptorForType(printer); GenerateCallBlockingMethod(printer); GenerateGetPrototype(REQUEST, printer); GenerateGetPrototype(RESPONSE, printer); printer->Outdent(); printer->Print("};\n"); printer->Outdent(); printer->Print("}\n\n"); } void ImmutableServiceGenerator::GenerateAbstractMethods(io::Printer* printer) { for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); WriteMethodDocComment(printer, method); GenerateMethodSignature(printer, method, IS_ABSTRACT); printer->Print(";\n\n"); } } string ImmutableServiceGenerator::GetOutput(const MethodDescriptor* method) { return name_resolver_->GetImmutableClassName(method->output_type()); } void ImmutableServiceGenerator::GenerateCallMethod(io::Printer* printer) { printer->Print( "\n" "public final void callMethod(\n" " com.google.protobuf.Descriptors.MethodDescriptor method,\n" " com.google.protobuf.RpcController controller,\n" " com.google.protobuf.Message request,\n" " com.google.protobuf.RpcCallback<\n" " com.google.protobuf.Message> done) {\n" " if (method.getService() != getDescriptor()) {\n" " throw new java.lang.IllegalArgumentException(\n" " \"Service.callMethod() given method descriptor for wrong \" +\n" " \"service type.\");\n" " }\n" " switch(method.getIndex()) {\n"); printer->Indent(); printer->Indent(); for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); std::map vars; vars["index"] = SimpleItoa(i); vars["method"] = UnderscoresToCamelCase(method); vars["input"] = name_resolver_->GetImmutableClassName( method->input_type()); vars["output"] = GetOutput(method); printer->Print(vars, "case $index$:\n" " this.$method$(controller, ($input$)request,\n" " com.google.protobuf.RpcUtil.<$output$>specializeCallback(\n" " done));\n" " return;\n"); } printer->Print( "default:\n" " throw new java.lang.AssertionError(\"Can't get here.\");\n"); printer->Outdent(); printer->Outdent(); printer->Print( " }\n" "}\n" "\n"); } void ImmutableServiceGenerator::GenerateCallBlockingMethod( io::Printer* printer) { printer->Print( "\n" "public final com.google.protobuf.Message callBlockingMethod(\n" " com.google.protobuf.Descriptors.MethodDescriptor method,\n" " com.google.protobuf.RpcController controller,\n" " com.google.protobuf.Message request)\n" " throws com.google.protobuf.ServiceException {\n" " if (method.getService() != getDescriptor()) {\n" " throw new java.lang.IllegalArgumentException(\n" " \"Service.callBlockingMethod() given method descriptor for \" +\n" " \"wrong service type.\");\n" " }\n" " switch(method.getIndex()) {\n"); printer->Indent(); printer->Indent(); for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); std::map vars; vars["index"] = SimpleItoa(i); vars["method"] = UnderscoresToCamelCase(method); vars["input"] = name_resolver_->GetImmutableClassName( method->input_type()); vars["output"] = GetOutput(method); printer->Print(vars, "case $index$:\n" " return impl.$method$(controller, ($input$)request);\n"); } printer->Print( "default:\n" " throw new java.lang.AssertionError(\"Can't get here.\");\n"); printer->Outdent(); printer->Outdent(); printer->Print( " }\n" "}\n" "\n"); } void ImmutableServiceGenerator::GenerateGetPrototype(RequestOrResponse which, io::Printer* printer) { /* * TODO(cpovirk): The exception message says "Service.foo" when it may be * "BlockingService.foo." Consider fixing. */ printer->Print( "public final com.google.protobuf.Message\n" " get$request_or_response$Prototype(\n" " com.google.protobuf.Descriptors.MethodDescriptor method) {\n" " if (method.getService() != getDescriptor()) {\n" " throw new java.lang.IllegalArgumentException(\n" " \"Service.get$request_or_response$Prototype() given method \" +\n" " \"descriptor for wrong service type.\");\n" " }\n" " switch(method.getIndex()) {\n", "request_or_response", (which == REQUEST) ? "Request" : "Response"); printer->Indent(); printer->Indent(); for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); std::map vars; vars["index"] = SimpleItoa(i); vars["type"] = name_resolver_->GetImmutableClassName( (which == REQUEST) ? method->input_type() : method->output_type()); printer->Print(vars, "case $index$:\n" " return $type$.getDefaultInstance();\n"); } printer->Print( "default:\n" " throw new java.lang.AssertionError(\"Can't get here.\");\n"); printer->Outdent(); printer->Outdent(); printer->Print( " }\n" "}\n" "\n"); } void ImmutableServiceGenerator::GenerateStub(io::Printer* printer) { printer->Print( "public static Stub newStub(\n" " com.google.protobuf.RpcChannel channel) {\n" " return new Stub(channel);\n" "}\n" "\n" "public static final class Stub extends $classname$ implements Interface {" "\n", "classname", name_resolver_->GetImmutableClassName(descriptor_)); printer->Indent(); printer->Print( "private Stub(com.google.protobuf.RpcChannel channel) {\n" " this.channel = channel;\n" "}\n" "\n" "private final com.google.protobuf.RpcChannel channel;\n" "\n" "public com.google.protobuf.RpcChannel getChannel() {\n" " return channel;\n" "}\n"); for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); printer->Print("\n"); GenerateMethodSignature(printer, method, IS_CONCRETE); printer->Print(" {\n"); printer->Indent(); std::map vars; vars["index"] = SimpleItoa(i); vars["output"] = GetOutput(method); printer->Print(vars, "channel.callMethod(\n" " getDescriptor().getMethods().get($index$),\n" " controller,\n" " request,\n" " $output$.getDefaultInstance(),\n" " com.google.protobuf.RpcUtil.generalizeCallback(\n" " done,\n" " $output$.class,\n" " $output$.getDefaultInstance()));\n"); printer->Outdent(); printer->Print("}\n"); } printer->Outdent(); printer->Print( "}\n" "\n"); } void ImmutableServiceGenerator::GenerateBlockingStub(io::Printer* printer) { printer->Print( "public static BlockingInterface newBlockingStub(\n" " com.google.protobuf.BlockingRpcChannel channel) {\n" " return new BlockingStub(channel);\n" "}\n" "\n"); printer->Print( "public interface BlockingInterface {"); printer->Indent(); for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); GenerateBlockingMethodSignature(printer, method); printer->Print(";\n"); } printer->Outdent(); printer->Print( "}\n" "\n"); printer->Print( "private static final class BlockingStub implements BlockingInterface {\n"); printer->Indent(); printer->Print( "private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) {\n" " this.channel = channel;\n" "}\n" "\n" "private final com.google.protobuf.BlockingRpcChannel channel;\n"); for (int i = 0; i < descriptor_->method_count(); i++) { const MethodDescriptor* method = descriptor_->method(i); GenerateBlockingMethodSignature(printer, method); printer->Print(" {\n"); printer->Indent(); std::map vars; vars["index"] = SimpleItoa(i); vars["output"] = GetOutput(method); printer->Print(vars, "return ($output$) channel.callBlockingMethod(\n" " getDescriptor().getMethods().get($index$),\n" " controller,\n" " request,\n" " $output$.getDefaultInstance());\n"); printer->Outdent(); printer->Print( "}\n" "\n"); } printer->Outdent(); printer->Print("}\n"); } void ImmutableServiceGenerator::GenerateMethodSignature(io::Printer* printer, const MethodDescriptor* method, IsAbstract is_abstract) { std::map vars; vars["name"] = UnderscoresToCamelCase(method); vars["input"] = name_resolver_->GetImmutableClassName(method->input_type()); vars["output"] = GetOutput(method); vars["abstract"] = (is_abstract == IS_ABSTRACT) ? "abstract" : ""; printer->Print(vars, "public $abstract$ void $name$(\n" " com.google.protobuf.RpcController controller,\n" " $input$ request,\n" " com.google.protobuf.RpcCallback<$output$> done)"); } void ImmutableServiceGenerator::GenerateBlockingMethodSignature( io::Printer* printer, const MethodDescriptor* method) { std::map vars; vars["method"] = UnderscoresToCamelCase(method); vars["input"] = name_resolver_->GetImmutableClassName(method->input_type()); vars["output"] = GetOutput(method); printer->Print(vars, "\n" "public $output$ $method$(\n" " com.google.protobuf.RpcController controller,\n" " $input$ request)\n" " throws com.google.protobuf.ServiceException"); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_service.h000066400000000000000000000115541334102242000326440ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_SERVICE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_SERVICE_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace java { class ServiceGenerator { public: explicit ServiceGenerator(const ServiceDescriptor* descriptor); virtual ~ServiceGenerator(); virtual void Generate(io::Printer* printer) = 0; enum RequestOrResponse { REQUEST, RESPONSE }; enum IsAbstract { IS_ABSTRACT, IS_CONCRETE }; protected: const ServiceDescriptor* descriptor_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceGenerator); }; class ImmutableServiceGenerator : public ServiceGenerator { public: ImmutableServiceGenerator(const ServiceDescriptor* descriptor, Context* context); virtual ~ImmutableServiceGenerator(); virtual void Generate(io::Printer* printer); private: // Generate the getDescriptorForType() method. void GenerateGetDescriptorForType(io::Printer* printer); // Generate a Java interface for the service. void GenerateInterface(io::Printer* printer); // Generate newReflectiveService() method. void GenerateNewReflectiveServiceMethod(io::Printer* printer); // Generate newReflectiveBlockingService() method. void GenerateNewReflectiveBlockingServiceMethod(io::Printer* printer); // Generate abstract method declarations for all methods. void GenerateAbstractMethods(io::Printer* printer); // Generate the implementation of Service.callMethod(). void GenerateCallMethod(io::Printer* printer); // Generate the implementation of BlockingService.callBlockingMethod(). void GenerateCallBlockingMethod(io::Printer* printer); // Generate the implementations of Service.get{Request,Response}Prototype(). void GenerateGetPrototype(RequestOrResponse which, io::Printer* printer); // Generate a stub implementation of the service. void GenerateStub(io::Printer* printer); // Generate a method signature, possibly abstract, without body or trailing // semicolon. void GenerateMethodSignature(io::Printer* printer, const MethodDescriptor* method, IsAbstract is_abstract); // Generate a blocking stub interface and implementation of the service. void GenerateBlockingStub(io::Printer* printer); // Generate the method signature for one method of a blocking stub. void GenerateBlockingMethodSignature(io::Printer* printer, const MethodDescriptor* method); // Return the output type of the method. string GetOutput(const MethodDescriptor* method); Context* context_; ClassNameResolver* name_resolver_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableServiceGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf #endif // NET_PROTO2_COMPILER_JAVA_SERVICE_H__ } // namespace google java_shared_code_generator.cc000066400000000000000000000210171334102242000355640ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: xiaofeng@google.com (Feng Xiao) #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { SharedCodeGenerator::SharedCodeGenerator(const FileDescriptor* file, const Options& options) : name_resolver_(new ClassNameResolver), file_(file), options_(options) {} SharedCodeGenerator::~SharedCodeGenerator() { } void SharedCodeGenerator::Generate(GeneratorContext* context, std::vector* file_list, std::vector* annotation_file_list) { string java_package = FileJavaPackage(file_); string package_dir = JavaPackageToDir(java_package); if (HasDescriptorMethods(file_, options_.enforce_lite)) { // Generate descriptors. string classname = name_resolver_->GetDescriptorClassName(file_); string filename = package_dir + classname + ".java"; file_list->push_back(filename); google::protobuf::scoped_ptr output(context->Open(filename)); GeneratedCodeInfo annotations; io::AnnotationProtoCollector annotation_collector( &annotations); google::protobuf::scoped_ptr printer( new io::Printer(output.get(), '$', options_.annotate_code ? &annotation_collector : NULL)); string info_relative_path = classname + ".java.pb.meta"; string info_full_path = filename + ".pb.meta"; printer->Print( "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" "// source: $filename$\n" "\n", "filename", file_->name()); if (!java_package.empty()) { printer->Print( "package $package$;\n" "\n", "package", java_package); } PrintGeneratedAnnotation(printer.get(), '$', options_.annotate_code ? info_relative_path : ""); printer->Print( "public final class $classname$ {\n" " public static com.google.protobuf.Descriptors.FileDescriptor\n" " descriptor;\n" " static {\n", "classname", classname); printer->Annotate("classname", file_->name()); printer->Indent(); printer->Indent(); GenerateDescriptors(printer.get()); printer->Outdent(); printer->Outdent(); printer->Print( " }\n" "}\n"); if (options_.annotate_code) { google::protobuf::scoped_ptr info_output( context->Open(info_full_path)); annotations.SerializeToZeroCopyStream(info_output.get()); annotation_file_list->push_back(info_full_path); } printer.reset(); output.reset(); } } void SharedCodeGenerator::GenerateDescriptors(io::Printer* printer) { // 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. We unfortunately have to put it in // a string literal, not a byte array, because apparently using a literal // byte array causes the Java compiler to generate *instructions* to // initialize each and every byte of the array, e.g. as if you typed: // b[0] = 123; b[1] = 456; b[2] = 789; // This makes huge bytecode files and can easily hit the compiler's internal // code size limits (error "code to large"). String literals are apparently // embedded raw, which is what we want. FileDescriptorProto file_proto; file_->CopyTo(&file_proto); string file_data; file_proto.SerializeToString(&file_data); printer->Print( "java.lang.String[] descriptorData = {\n"); printer->Indent(); // Limit the number of bytes per line. static const int kBytesPerLine = 40; // Limit the number of lines per string part. static const int kLinesPerPart = 400; // Every block of bytes, start a new string literal, in order to avoid the // 64k length limit. Note that this value needs to be <64k. static const int kBytesPerPart = kBytesPerLine * kLinesPerPart; for (int i = 0; i < file_data.size(); i += kBytesPerLine) { if (i > 0) { if (i % kBytesPerPart == 0) { printer->Print(",\n"); } else { printer->Print(" +\n"); } } printer->Print("\"$data$\"", "data", CEscape(file_data.substr(i, kBytesPerLine))); } printer->Outdent(); printer->Print("\n};\n"); // ----------------------------------------------------------------- // Create the InternalDescriptorAssigner. printer->Print( "com.google.protobuf.Descriptors.FileDescriptor." "InternalDescriptorAssigner assigner =\n" " new com.google.protobuf.Descriptors.FileDescriptor." " InternalDescriptorAssigner() {\n" " public com.google.protobuf.ExtensionRegistry assignDescriptors(\n" " com.google.protobuf.Descriptors.FileDescriptor root) {\n" " descriptor = root;\n" // Custom options will be handled when immutable messages' outer class is // loaded. Here we just return null and let custom options be unknown // fields. " return null;\n" " }\n" " };\n"); // ----------------------------------------------------------------- // Find out all dependencies. std::vector > dependencies; for (int i = 0; i < file_->dependency_count(); i++) { string filename = file_->dependency(i)->name(); string package = FileJavaPackage(file_->dependency(i)); string classname = name_resolver_->GetDescriptorClassName( file_->dependency(i)); string full_name; if (package.empty()) { full_name = classname; } else { full_name = package + "." + classname; } dependencies.push_back(std::make_pair(filename, full_name)); } // ----------------------------------------------------------------- // Invoke internalBuildGeneratedFileFrom() to build the file. printer->Print( "com.google.protobuf.Descriptors.FileDescriptor\n" " .internalBuildGeneratedFileFrom(descriptorData,\n"); printer->Print( " new com.google.protobuf.Descriptors.FileDescriptor[] {\n"); for (int i = 0; i < dependencies.size(); i++) { const string& dependency = dependencies[i].second; printer->Print( " $dependency$.getDescriptor(),\n", "dependency", dependency); } printer->Print( " }, assigner);\n"); } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_shared_code_generator.h000066400000000000000000000064421334102242000354330ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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: xiaofeng@google.com (Feng Xiao) // // Generators that generate shared code between immutable API and mutable API. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_SHARED_CODE_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_SHARED_CODE_GENERATOR_H__ #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include namespace google { namespace protobuf { class FileDescriptor; // descriptor.h namespace compiler { class GeneratorContext; // code_generator.h namespace java { class ClassNameResolver; // name_resolver.h } } namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace java { // A generator that generates code that are shared between immutable API // and mutable API. Currently only descriptors are shared. class SharedCodeGenerator { public: SharedCodeGenerator(const FileDescriptor* file, const Options& options); ~SharedCodeGenerator(); void Generate(GeneratorContext* generator_context, std::vector* file_list, std::vector* annotation_file_list); void GenerateDescriptors(io::Printer* printer); private: google::protobuf::scoped_ptr name_resolver_; const FileDescriptor* file_; const Options options_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SharedCodeGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_SHARED_CODE_GENERATOR_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_string_field.cc000066400000000000000000001120411334102242000340040ustar00rootroot00000000000000// 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) // Author: jonp@google.com (Jon Perlow) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { using internal::WireFormat; using internal::WireFormatLite; namespace { void SetPrimitiveVariables(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, const FieldGeneratorInfo* info, ClassNameResolver* name_resolver, std::map* variables) { SetCommonFieldVariables(descriptor, info, variables); (*variables)["empty_list"] = "com.google.protobuf.LazyStringArrayList.EMPTY"; (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver); (*variables)["default_init"] = "= " + ImmutableDefaultValue(descriptor, name_resolver); (*variables)["capitalized_type"] = "String"; (*variables)["tag"] = SimpleItoa(static_cast(WireFormat::MakeTag(descriptor))); (*variables)["tag_size"] = SimpleItoa( WireFormat::TagSize(descriptor->number(), GetType(descriptor))); (*variables)["null_check"] = " if (value == null) {\n" " throw new NullPointerException();\n" " }\n"; (*variables)["writeString"] = "com.google.protobuf.GeneratedMessage" + GeneratedCodeVersionSuffix() + ".writeString"; (*variables)["computeStringSize"] = "com.google.protobuf.GeneratedMessage" + GeneratedCodeVersionSuffix() + ".computeStringSize"; // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported // by the proto compiler (*variables)["deprecation"] = descriptor->options().deprecated() ? "@java.lang.Deprecated " : ""; (*variables)["on_changed"] = "onChanged();"; if (SupportFieldPresence(descriptor->file())) { // For singular messages and builders, one bit is used for the hasField bit. (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); // Note that these have a trailing ";". (*variables)["set_has_field_bit_message"] = GenerateSetBit(messageBitIndex) + ";"; (*variables)["set_has_field_bit_builder"] = GenerateSetBit(builderBitIndex) + ";"; (*variables)["clear_has_field_bit_builder"] = GenerateClearBit(builderBitIndex) + ";"; (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex); } else { (*variables)["set_has_field_bit_message"] = ""; (*variables)["set_has_field_bit_builder"] = ""; (*variables)["clear_has_field_bit_builder"] = ""; (*variables)["is_field_present_message"] = "!get" + (*variables)["capitalized_name"] + "Bytes().isEmpty()"; } // For repeated builders, one bit is used for whether the array is immutable. (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); // For repeated fields, one bit is used for whether the array is immutable // in the parsing constructor. (*variables)["get_mutable_bit_parser"] = GenerateGetBitMutableLocal(builderBitIndex); (*variables)["set_mutable_bit_parser"] = GenerateSetBitMutableLocal(builderBitIndex); (*variables)["get_has_field_bit_from_local"] = GenerateGetBitFromLocal(builderBitIndex); (*variables)["set_has_field_bit_to_local"] = GenerateSetBitToLocal(messageBitIndex); } } // namespace // =================================================================== ImmutableStringFieldGenerator:: ImmutableStringFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } ImmutableStringFieldGenerator::~ImmutableStringFieldGenerator() {} int ImmutableStringFieldGenerator::GetNumBitsForMessage() const { return 1; } int ImmutableStringFieldGenerator::GetNumBitsForBuilder() const { return 1; } // A note about how strings are handled. This code used to just store a String // in the Message. This had two issues: // // 1. It wouldn't roundtrip byte arrays that were not vaid UTF-8 encoded // strings, but rather fields that were raw bytes incorrectly marked // as strings in the proto file. This is common because in the proto1 // syntax, string was the way to indicate bytes and C++ engineers can // easily make this mistake without affecting the C++ API. By converting to // strings immediately, some java code might corrupt these byte arrays as // it passes through a java server even if the field was never accessed by // application code. // // 2. There's a performance hit to converting between bytes and strings and // it many cases, the field is never even read by the application code. This // avoids unnecessary conversions in the common use cases. // // So now, the field for String is maintained as an Object reference which can // either store a String or a ByteString. The code uses an instanceof check // to see which one it has and converts to the other one if needed. It remembers // the last value requested (in a thread safe manner) as this is most likely // the one needed next. The thread safety is such that if two threads both // convert the field because the changes made by each thread were not visible to // the other, they may cause a conversion to happen more times than would // otherwise be necessary. This was deemed better than adding synchronization // overhead. It will not cause any corruption issues or affect the behavior of // the API. The instanceof check is also highly optimized in the JVM and we // decided it was better to reduce the memory overhead by not having two // separate fields but rather use dynamic type checking. // // For single fields, the logic for this is done inside the generated code. For // repeated fields, the logic is done in LazyStringArrayList and // UnmodifiableLazyStringList. void ImmutableStringFieldGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$boolean has$capitalized_name$();\n"); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.lang.String get$capitalized_name$();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$com.google.protobuf.ByteString\n" " get$capitalized_name$Bytes();\n"); } void ImmutableStringFieldGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private volatile java.lang.Object $name$_;\n"); PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n" " java.lang.Object ref = $name$_;\n" " if (ref instanceof java.lang.String) {\n" " return (java.lang.String) ref;\n" " } else {\n" " com.google.protobuf.ByteString bs = \n" " (com.google.protobuf.ByteString) ref;\n" " java.lang.String s = bs.toStringUtf8();\n"); printer->Annotate("{", "}", descriptor_); if (CheckUtf8(descriptor_)) { printer->Print(variables_, " $name$_ = s;\n"); } else { printer->Print(variables_, " if (bs.isValidUtf8()) {\n" " $name$_ = s;\n" " }\n"); } printer->Print(variables_, " return s;\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$() {\n" " java.lang.Object ref = $name$_;\n" " if (ref instanceof java.lang.String) {\n" " com.google.protobuf.ByteString b = \n" " com.google.protobuf.ByteString.copyFromUtf8(\n" " (java.lang.String) ref);\n" " $name$_ = b;\n" " return b;\n" " } else {\n" " return (com.google.protobuf.ByteString) ref;\n" " }\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableStringFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { printer->Print(variables_, "private java.lang.Object $name$_ $default_init$;\n"); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_builder$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n" " java.lang.Object ref = $name$_;\n" " if (!(ref instanceof java.lang.String)) {\n" " com.google.protobuf.ByteString bs =\n" " (com.google.protobuf.ByteString) ref;\n" " java.lang.String s = bs.toStringUtf8();\n"); printer->Annotate("{", "}", descriptor_); if (CheckUtf8(descriptor_)) { printer->Print(variables_, " $name$_ = s;\n"); } else { printer->Print(variables_, " if (bs.isValidUtf8()) {\n" " $name$_ = s;\n" " }\n"); } printer->Print(variables_, " return s;\n" " } else {\n" " return (java.lang.String) ref;\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$() {\n" " java.lang.Object ref = $name$_;\n" " if (ref instanceof String) {\n" " com.google.protobuf.ByteString b = \n" " com.google.protobuf.ByteString.copyFromUtf8(\n" " (java.lang.String) ref);\n" " $name$_ = b;\n" " return b;\n" " } else {\n" " return (com.google.protobuf.ByteString) ref;\n" " }\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " java.lang.String value) {\n" "$null_check$" " $set_has_field_bit_builder$\n" " $name$_ = value;\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " $clear_has_field_bit_builder$\n"); printer->Annotate("{", "}", descriptor_); // The default value is not a simple literal so we want to avoid executing // it multiple times. Instead, get the default out of the default instance. printer->Print(variables_, " $name$_ = getDefaultInstance().get$capitalized_name$();\n"); printer->Print(variables_, " $on_changed$\n" " return this;\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n" " com.google.protobuf.ByteString value) {\n" "$null_check$"); printer->Annotate("{", "}", descriptor_); if (CheckUtf8(descriptor_)) { printer->Print(variables_, " checkByteStringIsUtf8(value);\n"); } printer->Print(variables_, " $set_has_field_bit_builder$\n" " $name$_ = value;\n" " $on_changed$\n" " return this;\n" "}\n"); } void ImmutableStringFieldGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for primitives } void ImmutableStringFieldGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default$;\n"); } void ImmutableStringFieldGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default$;\n" "$clear_has_field_bit_builder$\n"); } void ImmutableStringFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { // Allow a slight breach of abstraction here in order to avoid forcing // all string fields to Strings when copying fields from a Message. printer->Print(variables_, "if (other.has$capitalized_name$()) {\n" " $set_has_field_bit_builder$\n" " $name$_ = other.$name$_;\n" " $on_changed$\n" "}\n"); } else { printer->Print(variables_, "if (!other.get$capitalized_name$().isEmpty()) {\n" " $name$_ = other.$name$_;\n" " $on_changed$\n" "}\n"); } } void ImmutableStringFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "if ($get_has_field_bit_from_local$) {\n" " $set_has_field_bit_to_local$;\n" "}\n"); } printer->Print(variables_, "result.$name$_ = $name$_;\n"); } void ImmutableStringFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { if (CheckUtf8(descriptor_)) { printer->Print(variables_, "java.lang.String s = input.readStringRequireUtf8();\n" "$set_has_field_bit_message$\n" "$name$_ = s;\n"); } else { printer->Print(variables_, "com.google.protobuf.ByteString bs = input.readBytes();\n" "$set_has_field_bit_message$\n" "$name$_ = bs;\n"); } } void ImmutableStringFieldGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { // noop for strings. } void ImmutableStringFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " $writeString$(output, $number$, $name$_);\n" "}\n"); } void ImmutableStringFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_field_present_message$) {\n" " size += $computeStringSize$($number$, $name$_);\n" "}\n"); } void ImmutableStringFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && get$capitalized_name$()\n" " .equals(other.get$capitalized_name$());\n"); } void ImmutableStringFieldGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n"); printer->Print(variables_, "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); } string ImmutableStringFieldGenerator::GetBoxedType() const { return "java.lang.String"; } // =================================================================== ImmutableStringOneofFieldGenerator:: ImmutableStringOneofFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutableStringFieldGenerator( descriptor, messageBitIndex, builderBitIndex, context) { const OneofGeneratorInfo* info = context->GetOneofGeneratorInfo(descriptor->containing_oneof()); SetCommonOneofVariables(descriptor, info, &variables_); } ImmutableStringOneofFieldGenerator:: ~ImmutableStringOneofFieldGenerator() {} void ImmutableStringOneofFieldGenerator:: GenerateMembers(io::Printer* printer) const { PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n" " java.lang.Object ref $default_init$;\n" " if ($has_oneof_case_message$) {\n" " ref = $oneof_name$_;\n" " }\n" " if (ref instanceof java.lang.String) {\n" " return (java.lang.String) ref;\n" " } else {\n" " com.google.protobuf.ByteString bs = \n" " (com.google.protobuf.ByteString) ref;\n" " java.lang.String s = bs.toStringUtf8();\n"); printer->Annotate("{", "}", descriptor_); if (CheckUtf8(descriptor_)) { printer->Print(variables_, " if ($has_oneof_case_message$) {\n" " $oneof_name$_ = s;\n" " }\n"); } else { printer->Print(variables_, " if (bs.isValidUtf8() && ($has_oneof_case_message$)) {\n" " $oneof_name$_ = s;\n" " }\n"); } printer->Print(variables_, " return s;\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$() {\n" " java.lang.Object ref $default_init$;\n" " if ($has_oneof_case_message$) {\n" " ref = $oneof_name$_;\n" " }\n" " if (ref instanceof java.lang.String) {\n" " com.google.protobuf.ByteString b = \n" " com.google.protobuf.ByteString.copyFromUtf8(\n" " (java.lang.String) ref);\n" " if ($has_oneof_case_message$) {\n" " $oneof_name$_ = b;\n" " }\n" " return b;\n" " } else {\n" " return (com.google.protobuf.ByteString) ref;\n" " }\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableStringOneofFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n" " java.lang.Object ref $default_init$;\n" " if ($has_oneof_case_message$) {\n" " ref = $oneof_name$_;\n" " }\n" " if (!(ref instanceof java.lang.String)) {\n" " com.google.protobuf.ByteString bs =\n" " (com.google.protobuf.ByteString) ref;\n" " java.lang.String s = bs.toStringUtf8();\n" " if ($has_oneof_case_message$) {\n"); printer->Annotate("{", "}", descriptor_); if (CheckUtf8(descriptor_)) { printer->Print(variables_, " $oneof_name$_ = s;\n"); } else { printer->Print(variables_, " if (bs.isValidUtf8()) {\n" " $oneof_name$_ = s;\n" " }\n"); } printer->Print(variables_, " }\n" " return s;\n" " } else {\n" " return (java.lang.String) ref;\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$() {\n" " java.lang.Object ref $default_init$;\n" " if ($has_oneof_case_message$) {\n" " ref = $oneof_name$_;\n" " }\n" " if (ref instanceof String) {\n" " com.google.protobuf.ByteString b = \n" " com.google.protobuf.ByteString.copyFromUtf8(\n" " (java.lang.String) ref);\n" " if ($has_oneof_case_message$) {\n" " $oneof_name$_ = b;\n" " }\n" " return b;\n" " } else {\n" " return (com.google.protobuf.ByteString) ref;\n" " }\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " java.lang.String value) {\n" "$null_check$" " $set_oneof_case_message$;\n" " $oneof_name$_ = value;\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " $clear_oneof_case_message$;\n" " $oneof_name$_ = null;\n" " $on_changed$\n" " }\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n" " com.google.protobuf.ByteString value) {\n" "$null_check$"); printer->Annotate("{", "}", descriptor_); if (CheckUtf8(descriptor_)) { printer->Print(variables_, " checkByteStringIsUtf8(value);\n"); } printer->Print(variables_, " $set_oneof_case_message$;\n" " $oneof_name$_ = value;\n" " $on_changed$\n" " return this;\n" "}\n"); } void ImmutableStringOneofFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { // Allow a slight breach of abstraction here in order to avoid forcing // all string fields to Strings when copying fields from a Message. printer->Print(variables_, "$set_oneof_case_message$;\n" "$oneof_name$_ = other.$oneof_name$_;\n" "$on_changed$\n"); } void ImmutableStringOneofFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " result.$oneof_name$_ = $oneof_name$_;\n" "}\n"); } void ImmutableStringOneofFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { if (CheckUtf8(descriptor_)) { printer->Print(variables_, "java.lang.String s = input.readStringRequireUtf8();\n" "$set_oneof_case_message$;\n" "$oneof_name$_ = s;\n"); } else { printer->Print(variables_, "com.google.protobuf.ByteString bs = input.readBytes();\n" "$set_oneof_case_message$;\n" "$oneof_name$_ = bs;\n"); } } void ImmutableStringOneofFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " $writeString$(output, $number$, $oneof_name$_);\n" "}\n"); } void ImmutableStringOneofFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " size += $computeStringSize$($number$, $oneof_name$_);\n" "}\n"); } // =================================================================== RepeatedImmutableStringFieldGenerator:: RepeatedImmutableStringFieldGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } RepeatedImmutableStringFieldGenerator:: ~RepeatedImmutableStringFieldGenerator() {} int RepeatedImmutableStringFieldGenerator::GetNumBitsForMessage() const { return 0; } int RepeatedImmutableStringFieldGenerator::GetNumBitsForBuilder() const { return 1; } void RepeatedImmutableStringFieldGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, // NOTE: the same method in the implementation class actually returns // com.google.protobuf.ProtocolStringList (a subclass of List). It's // changed between protobuf 2.5.0 release and protobuf 2.6.1 release. // To retain binary compatibility with both 2.5.0 and 2.6.1 generated // code, we make this interface method return List so both methods // with different return types exist in the compiled byte code. "$deprecation$java.util.List\n" " get$capitalized_name$List();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$int get$capitalized_name$Count();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.lang.String get$capitalized_name$(int index);\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$com.google.protobuf.ByteString\n" " get$capitalized_name$Bytes(int index);\n"); } void RepeatedImmutableStringFieldGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private com.google.protobuf.LazyStringList $name$_;\n"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ProtocolStringList\n" " ${$get$capitalized_name$List$}$() {\n" " return $name$_;\n" // note: unmodifiable list "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return $name$_.size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String " "${$get$capitalized_name$$}$(int index) {\n" " return $name$_.get(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$(int index) {\n" " return $name$_.getByteString(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void RepeatedImmutableStringFieldGenerator:: GenerateBuilderMembers(io::Printer* printer) const { // One field is the list and the bit field keeps track of whether the // list is immutable. If it's immutable, the invariant is that it must // either an instance of Collections.emptyList() or it's an ArrayList // wrapped in a Collections.unmodifiableList() wrapper and nobody else has // a refererence to the underlying ArrayList. This invariant allows us to // share instances of lists between protocol buffers avoiding expensive // memory allocations. Note, immutable is a strong guarantee here -- not // just that the list cannot be modified via the reference but that the // list can never be modified. printer->Print(variables_, "private com.google.protobuf.LazyStringList $name$_ = $empty_list$;\n"); printer->Print(variables_, "private void ensure$capitalized_name$IsMutable() {\n" " if (!$get_mutable_bit_builder$) {\n" " $name$_ = new com.google.protobuf.LazyStringArrayList($name$_);\n" " $set_mutable_bit_builder$;\n" " }\n" "}\n"); // Note: We return an unmodifiable list because otherwise the caller // could hold on to the returned list and modify it after the message // has been built, thus mutating the message which is supposed to be // immutable. WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ProtocolStringList\n" " ${$get$capitalized_name$List$}$() {\n" " return $name$_.getUnmodifiableView();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return $name$_.size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String " "${$get$capitalized_name$$}$(int index) {\n" " return $name$_.get(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$(int index) {\n" " return $name$_.getByteString(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " int index, java.lang.String value) {\n" "$null_check$" " ensure$capitalized_name$IsMutable();\n" " $name$_.set(index, value);\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$$}$(\n" " java.lang.String value) {\n" "$null_check$" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(value);\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n" " java.lang.Iterable values) {\n" " ensure$capitalized_name$IsMutable();\n" " com.google.protobuf.AbstractMessageLite.Builder.addAll(\n" " values, $name$_);\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " $name$_ = $empty_list$;\n" " $clear_mutable_bit_builder$;\n" " $on_changed$\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$Bytes$}$(\n" " com.google.protobuf.ByteString value) {\n" "$null_check$"); printer->Annotate("{", "}", descriptor_); if (CheckUtf8(descriptor_)) { printer->Print(variables_, " checkByteStringIsUtf8(value);\n"); } printer->Print(variables_, " ensure$capitalized_name$IsMutable();\n" " $name$_.add(value);\n" " $on_changed$\n" " return this;\n" "}\n"); } void RepeatedImmutableStringFieldGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for primitives } void RepeatedImmutableStringFieldGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $empty_list$;\n"); } void RepeatedImmutableStringFieldGenerator:: GenerateBuilderClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $empty_list$;\n" "$clear_mutable_bit_builder$;\n"); } void RepeatedImmutableStringFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { // The code below does two optimizations: // 1. If the other list is empty, there's nothing to do. This ensures we // don't allocate a new array if we already have an immutable one. // 2. If the other list is non-empty and our current list is empty, we can // reuse the other list which is guaranteed to be immutable. printer->Print(variables_, "if (!other.$name$_.isEmpty()) {\n" " if ($name$_.isEmpty()) {\n" " $name$_ = other.$name$_;\n" " $clear_mutable_bit_builder$;\n" " } else {\n" " ensure$capitalized_name$IsMutable();\n" " $name$_.addAll(other.$name$_);\n" " }\n" " $on_changed$\n" "}\n"); } void RepeatedImmutableStringFieldGenerator:: GenerateBuildingCode(io::Printer* printer) const { // The code below ensures that the result has an immutable list. If our // list is immutable, we can just reuse it. If not, we make it immutable. printer->Print(variables_, "if ($get_mutable_bit_builder$) {\n" " $name$_ = $name$_.getUnmodifiableView();\n" " $clear_mutable_bit_builder$;\n" "}\n" "result.$name$_ = $name$_;\n"); } void RepeatedImmutableStringFieldGenerator:: GenerateParsingCode(io::Printer* printer) const { if (CheckUtf8(descriptor_)) { printer->Print(variables_, "java.lang.String s = input.readStringRequireUtf8();\n"); } else { printer->Print(variables_, "com.google.protobuf.ByteString bs = input.readBytes();\n"); } printer->Print(variables_, "if (!$get_mutable_bit_parser$) {\n" " $name$_ = new com.google.protobuf.LazyStringArrayList();\n" " $set_mutable_bit_parser$;\n" "}\n"); if (CheckUtf8(descriptor_)) { printer->Print(variables_, "$name$_.add(s);\n"); } else { printer->Print(variables_, "$name$_.add(bs);\n"); } } void RepeatedImmutableStringFieldGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { printer->Print(variables_, "if ($get_mutable_bit_parser$) {\n" " $name$_ = $name$_.getUnmodifiableView();\n" "}\n"); } void RepeatedImmutableStringFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " $writeString$(output, $number$, $name$_.getRaw(i));\n" "}\n"); } void RepeatedImmutableStringFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "{\n" " int dataSize = 0;\n"); printer->Indent(); printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " dataSize += computeStringSizeNoTag($name$_.getRaw(i));\n" "}\n"); printer->Print( "size += dataSize;\n"); printer->Print(variables_, "size += $tag_size$ * get$capitalized_name$List().size();\n"); printer->Outdent(); printer->Print("}\n"); } void RepeatedImmutableStringFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && get$capitalized_name$List()\n" " .equals(other.get$capitalized_name$List());\n"); } void RepeatedImmutableStringFieldGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "if (get$capitalized_name$Count() > 0) {\n" " hash = (37 * hash) + $constant_name$;\n" " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" "}\n"); } string RepeatedImmutableStringFieldGenerator::GetBoxedType() const { return "String"; } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java/java_string_field.h000066400000000000000000000143631334102242000336560ustar00rootroot00000000000000// 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) // Author: jonp@google.com (Jon Perlow) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } } namespace protobuf { namespace compiler { namespace java { class ImmutableStringFieldGenerator : public ImmutableFieldGenerator { public: explicit ImmutableStringFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableStringFieldGenerator(); // implements ImmutableFieldGenerator --------------------------------------- int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; protected: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableStringFieldGenerator); }; class ImmutableStringOneofFieldGenerator : public ImmutableStringFieldGenerator { public: ImmutableStringOneofFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableStringOneofFieldGenerator(); private: void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableStringOneofFieldGenerator); }; class RepeatedImmutableStringFieldGenerator : public ImmutableFieldGenerator { public: explicit RepeatedImmutableStringFieldGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~RepeatedImmutableStringFieldGenerator(); // implements ImmutableFieldGenerator --------------------------------------- int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateBuilderClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateBuildingCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; private: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableStringFieldGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_H__ java_string_field_lite.cc000066400000000000000000001021201334102242000347370ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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) // Author: jonp@google.com (Jon Perlow) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { using internal::WireFormat; using internal::WireFormatLite; namespace { void SetPrimitiveVariables(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, const FieldGeneratorInfo* info, ClassNameResolver* name_resolver, std::map* variables) { SetCommonFieldVariables(descriptor, info, variables); (*variables)["empty_list"] = "com.google.protobuf.GeneratedMessageLite.emptyProtobufList()"; (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver); (*variables)["default_init"] = "= " + ImmutableDefaultValue(descriptor, name_resolver); (*variables)["capitalized_type"] = "java.lang.String"; (*variables)["tag"] = SimpleItoa(static_cast(WireFormat::MakeTag(descriptor))); (*variables)["tag_size"] = SimpleItoa( WireFormat::TagSize(descriptor->number(), GetType(descriptor))); (*variables)["null_check"] = " if (value == null) {\n" " throw new NullPointerException();\n" " }\n"; // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported // by the proto compiler (*variables)["deprecation"] = descriptor->options().deprecated() ? "@java.lang.Deprecated " : ""; (*variables)["required"] = descriptor->is_required() ? "true" : "false"; if (SupportFieldPresence(descriptor->file())) { // For singular messages and builders, one bit is used for the hasField bit. (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); // Note that these have a trailing ";". (*variables)["set_has_field_bit_message"] = GenerateSetBit(messageBitIndex) + ";"; (*variables)["clear_has_field_bit_message"] = GenerateClearBit(messageBitIndex) + ";"; (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex); } else { (*variables)["set_has_field_bit_message"] = ""; (*variables)["clear_has_field_bit_message"] = ""; (*variables)["is_field_present_message"] = "!" + (*variables)["name"] + "_.isEmpty()"; } // For repeated builders, the underlying list tracks mutability state. (*variables)["is_mutable"] = (*variables)["name"] + "_.isModifiable()"; (*variables)["get_has_field_bit_from_local"] = GenerateGetBitFromLocal(builderBitIndex); (*variables)["set_has_field_bit_to_local"] = GenerateSetBitToLocal(messageBitIndex); } } // namespace // =================================================================== ImmutableStringFieldLiteGenerator:: ImmutableStringFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } ImmutableStringFieldLiteGenerator::~ImmutableStringFieldLiteGenerator() {} int ImmutableStringFieldLiteGenerator::GetNumBitsForMessage() const { return 1; } int ImmutableStringFieldLiteGenerator::GetNumBitsForBuilder() const { return 0; } // A note about how strings are handled. In the SPEED and CODE_SIZE runtimes, // strings are not stored as java.lang.String in the Message because of two // issues: // // 1. It wouldn't roundtrip byte arrays that were not vaid UTF-8 encoded // strings, but rather fields that were raw bytes incorrectly marked // as strings in the proto file. This is common because in the proto1 // syntax, string was the way to indicate bytes and C++ engineers can // easily make this mistake without affecting the C++ API. By converting to // strings immediately, some java code might corrupt these byte arrays as // it passes through a java server even if the field was never accessed by // application code. // // 2. There's a performance hit to converting between bytes and strings and // it many cases, the field is never even read by the application code. This // avoids unnecessary conversions in the common use cases. // // In the LITE_RUNTIME, we store strings as java.lang.String because we assume // that the users of this runtime are not subject to proto1 constraints and are // running code on devices that are user facing. That is, the developers are // properly incentivized to only fetch the data they need to read and wish to // reduce the number of allocations incurred when running on a user's device. // TODO(dweis): Consider dropping all of the *Bytes() methods. They really // shouldn't be necessary or used on devices. void ImmutableStringFieldLiteGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$boolean has$capitalized_name$();\n"); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.lang.String get$capitalized_name$();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$com.google.protobuf.ByteString\n" " get$capitalized_name$Bytes();\n"); } void ImmutableStringFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private java.lang.String $name$_;\n"); PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $get_has_field_bit_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n" " return $name$_;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$() {\n" " return com.google.protobuf.ByteString.copyFromUtf8($name$_);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " java.lang.String value) {\n" "$null_check$" " $set_has_field_bit_message$\n" " $name$_ = value;\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " $clear_has_field_bit_message$\n" // The default value is not a simple literal so we want to avoid executing // it multiple times. Instead, get the default out of the default instance. " $name$_ = getDefaultInstance().get$capitalized_name$();\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$Bytes(\n" " com.google.protobuf.ByteString value) {\n" "$null_check$"); if (CheckUtf8(descriptor_)) { printer->Print(variables_, " checkByteStringIsUtf8(value);\n"); } printer->Print(variables_, " $set_has_field_bit_message$\n" " $name$_ = value.toStringUtf8();\n" "}\n"); } void ImmutableStringFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return instance.has$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n" " return instance.get$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$() {\n" " return instance.get$capitalized_name$Bytes();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " java.lang.String value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n" " com.google.protobuf.ByteString value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$Bytes(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableStringFieldLiteGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for strings } void ImmutableStringFieldLiteGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default$;\n"); } void ImmutableStringFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { printer->Print(variables_, "$name$_ = visitor.visitString(\n" " has$capitalized_name$(), $name$_,\n" " other.has$capitalized_name$(), other.$name$_);\n"); } else { printer->Print(variables_, "$name$_ = visitor.visitString(!$name$_.isEmpty(), $name$_,\n" " !other.$name$_.isEmpty(), other.$name$_);\n"); } } void ImmutableStringFieldLiteGenerator:: GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const { // noop for scalars } void ImmutableStringFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { if (CheckUtf8(descriptor_)) { printer->Print(variables_, "java.lang.String s = input.readStringRequireUtf8();\n" "$set_has_field_bit_message$\n" "$name$_ = s;\n"); } else { // Lite runtime should attempt to reduce allocations by attempting to // construct the string directly from the input stream buffer. This avoids // spurious intermediary ByteString allocations, cutting overall allocations // in half. printer->Print(variables_, "java.lang.String s = input.readString();\n" "$set_has_field_bit_message$\n" "$name$_ = s;\n"); } } void ImmutableStringFieldLiteGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { // noop for strings } void ImmutableStringFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { // Lite runtime should reduce allocations by serializing the string directly. // This avoids spurious intermediary ByteString allocations, cutting overall // allocations in half. printer->Print(variables_, "if ($is_field_present_message$) {\n" " output.writeString($number$, get$capitalized_name$());\n" "}\n"); } void ImmutableStringFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { // Lite runtime should reduce allocations by computing on the string directly. // This avoids spurious intermediary ByteString allocations, cutting overall // allocations in half. printer->Print(variables_, "if ($is_field_present_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeStringSize($number$, get$capitalized_name$());\n" "}\n"); } void ImmutableStringFieldLiteGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && get$capitalized_name$()\n" " .equals(other.get$capitalized_name$());\n"); } void ImmutableStringFieldLiteGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n"); printer->Print(variables_, "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); } string ImmutableStringFieldLiteGenerator::GetBoxedType() const { return "java.lang.String"; } // =================================================================== ImmutableStringOneofFieldLiteGenerator:: ImmutableStringOneofFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : ImmutableStringFieldLiteGenerator( descriptor, messageBitIndex, builderBitIndex, context) { const OneofGeneratorInfo* info = context->GetOneofGeneratorInfo(descriptor->containing_oneof()); SetCommonOneofVariables(descriptor, info, &variables_); } ImmutableStringOneofFieldLiteGenerator:: ~ImmutableStringOneofFieldLiteGenerator() {} void ImmutableStringOneofFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { PrintExtraFieldInfo(variables_, printer); if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return $has_oneof_case_message$;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n" " java.lang.String ref $default_init$;\n" " if ($has_oneof_case_message$) {\n" " ref = (java.lang.String) $oneof_name$_;\n" " }\n" " return ref;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$() {\n" " java.lang.String ref $default_init$;\n" " if ($has_oneof_case_message$) {\n" " ref = (java.lang.String) $oneof_name$_;\n" " }\n" " return com.google.protobuf.ByteString.copyFromUtf8(ref);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void ${$set$capitalized_name$$}$(\n" " java.lang.String value) {\n" "$null_check$" " $set_oneof_case_message$;\n" " $oneof_name$_ = value;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void ${$clear$capitalized_name$$}$() {\n" " if ($has_oneof_case_message$) {\n" " $clear_oneof_case_message$;\n" " $oneof_name$_ = null;\n" " }\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void ${$set$capitalized_name$Bytes$}$(\n" " com.google.protobuf.ByteString value) {\n" "$null_check$"); printer->Annotate("{", "}", descriptor_); if (CheckUtf8(descriptor_)) { printer->Print(variables_, " checkByteStringIsUtf8(value);\n"); } printer->Print(variables_, " $set_oneof_case_message$;\n" " $oneof_name$_ = value.toStringUtf8();\n" "}\n"); } void ImmutableStringOneofFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { if (SupportFieldPresence(descriptor_->file())) { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n" " return instance.has$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); } WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n" " return instance.get$capitalized_name$();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$() {\n" " return instance.get$capitalized_name$Bytes();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " java.lang.String value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n" " com.google.protobuf.ByteString value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$Bytes(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void ImmutableStringOneofFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print(variables_, "$oneof_name$_ = visitor.visitOneofString(\n" " $has_oneof_case_message$, $oneof_name$_, other.$oneof_name$_);\n"); } void ImmutableStringOneofFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { if (CheckUtf8(descriptor_)) { printer->Print(variables_, "java.lang.String s = input.readStringRequireUtf8();\n" "$set_oneof_case_message$;\n" "$oneof_name$_ = s;\n"); } else { // Lite runtime should attempt to reduce allocations by attempting to // construct the string directly from the input stream buffer. This avoids // spurious intermediary ByteString allocations, cutting overall allocations // in half. printer->Print(variables_, "java.lang.String s = input.readString();\n" "$set_oneof_case_message$;\n" "$oneof_name$_ = s;\n"); } } void ImmutableStringOneofFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { // Lite runtime should reduce allocations by serializing the string directly. // This avoids spurious intermediary ByteString allocations, cutting overall // allocations in half. printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " output.writeString($number$, get$capitalized_name$());\n" "}\n"); } void ImmutableStringOneofFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { // Lite runtime should reduce allocations by computing on the string directly. // This avoids spurious intermediary ByteString allocations, cutting overall // allocations in half. printer->Print(variables_, "if ($has_oneof_case_message$) {\n" " size += com.google.protobuf.CodedOutputStream\n" " .computeStringSize($number$, get$capitalized_name$());\n" "}\n"); } // =================================================================== RepeatedImmutableStringFieldLiteGenerator:: RepeatedImmutableStringFieldLiteGenerator(const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), builderBitIndex_(builderBitIndex), context_(context), name_resolver_(context->GetNameResolver()) { SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, context->GetFieldGeneratorInfo(descriptor), name_resolver_, &variables_); } RepeatedImmutableStringFieldLiteGenerator:: ~RepeatedImmutableStringFieldLiteGenerator() {} int RepeatedImmutableStringFieldLiteGenerator::GetNumBitsForMessage() const { return 0; } int RepeatedImmutableStringFieldLiteGenerator::GetNumBitsForBuilder() const { return 0; } void RepeatedImmutableStringFieldLiteGenerator:: GenerateInterfaceMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.util.List\n" " get$capitalized_name$List();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$int get$capitalized_name$Count();\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$java.lang.String get$capitalized_name$(int index);\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$com.google.protobuf.ByteString\n" " get$capitalized_name$Bytes(int index);\n"); } void RepeatedImmutableStringFieldLiteGenerator:: GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private com.google.protobuf.Internal.ProtobufList " "$name$_;\n"); PrintExtraFieldInfo(variables_, printer); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List " "${$get$capitalized_name$List$}$() {\n" " return $name$_;\n" // note: unmodifiable list "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return $name$_.size();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String " "${$get$capitalized_name$$}$(int index) {\n" " return $name$_.get(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$(int index) {\n" " return com.google.protobuf.ByteString.copyFromUtf8(\n" " $name$_.get(index));\n" "}\n"); printer->Annotate("{", "}", descriptor_); printer->Print(variables_, "private void ensure$capitalized_name$IsMutable() {\n" " if (!$is_mutable$) {\n" " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" " }\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void set$capitalized_name$(\n" " int index, java.lang.String value) {\n" "$null_check$" " ensure$capitalized_name$IsMutable();\n" " $name$_.set(index, value);\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$(\n" " java.lang.String value) {\n" "$null_check$" " ensure$capitalized_name$IsMutable();\n" " $name$_.add(value);\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void addAll$capitalized_name$(\n" " java.lang.Iterable values) {\n" " ensure$capitalized_name$IsMutable();\n" " com.google.protobuf.AbstractMessageLite.addAll(\n" " values, $name$_);\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void clear$capitalized_name$() {\n" " $name$_ = $empty_list$;\n" "}\n"); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "private void add$capitalized_name$Bytes(\n" " com.google.protobuf.ByteString value) {\n" "$null_check$"); if (CheckUtf8(descriptor_)) { printer->Print(variables_, " checkByteStringIsUtf8(value);\n"); } printer->Print(variables_, " ensure$capitalized_name$IsMutable();\n" " $name$_.add(value.toStringUtf8());\n" "}\n"); } void RepeatedImmutableStringFieldLiteGenerator:: GenerateBuilderMembers(io::Printer* printer) const { WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.util.List\n" " ${$get$capitalized_name$List$}$() {\n" " return java.util.Collections.unmodifiableList(\n" " instance.get$capitalized_name$List());\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n" " return instance.get$capitalized_name$Count();\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public java.lang.String " "${$get$capitalized_name$$}$(int index) {\n" " return instance.get$capitalized_name$(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public com.google.protobuf.ByteString\n" " ${$get$capitalized_name$Bytes$}$(int index) {\n" " return instance.get$capitalized_name$Bytes(index);\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$set$capitalized_name$$}$(\n" " int index, java.lang.String value) {\n" " copyOnWrite();\n" " instance.set$capitalized_name$(index, value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$$}$(\n" " java.lang.String value) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n" " java.lang.Iterable values) {\n" " copyOnWrite();\n" " instance.addAll$capitalized_name$(values);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n" " copyOnWrite();\n" " instance.clear$capitalized_name$();\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); WriteFieldDocComment(printer, descriptor_); printer->Print(variables_, "$deprecation$public Builder ${$add$capitalized_name$Bytes$}$(\n" " com.google.protobuf.ByteString value) {\n" " copyOnWrite();\n" " instance.add$capitalized_name$Bytes(value);\n" " return this;\n" "}\n"); printer->Annotate("{", "}", descriptor_); } void RepeatedImmutableStringFieldLiteGenerator:: GenerateFieldBuilderInitializationCode(io::Printer* printer) const { // noop for strings } void RepeatedImmutableStringFieldLiteGenerator:: GenerateInitializationCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $empty_list$;\n"); } void RepeatedImmutableStringFieldLiteGenerator:: GenerateVisitCode(io::Printer* printer) const { printer->Print(variables_, "$name$_= visitor.visitList($name$_, other.$name$_);\n"); } void RepeatedImmutableStringFieldLiteGenerator:: GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const { printer->Print(variables_, "$name$_.makeImmutable();\n"); } void RepeatedImmutableStringFieldLiteGenerator:: GenerateParsingCode(io::Printer* printer) const { if (CheckUtf8(descriptor_)) { printer->Print(variables_, "java.lang.String s = input.readStringRequireUtf8();\n"); } else { // Lite runtime should attempt to reduce allocations by attempting to // construct the string directly from the input stream buffer. This avoids // spurious intermediary ByteString allocations, cutting overall allocations // in half. printer->Print(variables_, "java.lang.String s = input.readString();\n"); } printer->Print(variables_, "if (!$is_mutable$) {\n" " $name$_ =\n" " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" "}\n"); printer->Print(variables_, "$name$_.add(s);\n"); } void RepeatedImmutableStringFieldLiteGenerator:: GenerateParsingDoneCode(io::Printer* printer) const { printer->Print(variables_, "if ($is_mutable$) {\n" " $name$_.makeImmutable();\n" "}\n"); } void RepeatedImmutableStringFieldLiteGenerator:: GenerateSerializationCode(io::Printer* printer) const { // Lite runtime should reduce allocations by serializing the string directly. // This avoids spurious intermediary ByteString allocations, cutting overall // allocations in half. printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " output.writeString($number$, $name$_.get(i));\n" "}\n"); } void RepeatedImmutableStringFieldLiteGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { // Lite runtime should reduce allocations by computing on the string directly. // This avoids spurious intermediary ByteString allocations, cutting overall // allocations in half. printer->Print(variables_, "{\n" " int dataSize = 0;\n"); printer->Indent(); printer->Print(variables_, "for (int i = 0; i < $name$_.size(); i++) {\n" " dataSize += com.google.protobuf.CodedOutputStream\n" " .computeStringSizeNoTag($name$_.get(i));\n" "}\n"); printer->Print( "size += dataSize;\n"); printer->Print(variables_, "size += $tag_size$ * get$capitalized_name$List().size();\n"); printer->Outdent(); printer->Print("}\n"); } void RepeatedImmutableStringFieldLiteGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "result = result && get$capitalized_name$List()\n" " .equals(other.get$capitalized_name$List());\n"); } void RepeatedImmutableStringFieldLiteGenerator:: GenerateHashCode(io::Printer* printer) const { printer->Print(variables_, "if (get$capitalized_name$Count() > 0) {\n" " hash = (37 * hash) + $constant_name$;\n" " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" "}\n"); } string RepeatedImmutableStringFieldLiteGenerator::GetBoxedType() const { return "java.lang.String"; } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google java_string_field_lite.h000066400000000000000000000142621334102242000346120ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/java// 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) // Author: jonp@google.com (Jon Perlow) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_LITE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_LITE_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace java { class Context; // context.h class ClassNameResolver; // name_resolver.h } } } namespace protobuf { namespace compiler { namespace java { class ImmutableStringFieldLiteGenerator : public ImmutableFieldLiteGenerator { public: explicit ImmutableStringFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableStringFieldLiteGenerator(); // implements ImmutableFieldLiteGenerator ------------------------------------ int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; protected: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableStringFieldLiteGenerator); }; class ImmutableStringOneofFieldLiteGenerator : public ImmutableStringFieldLiteGenerator { public: ImmutableStringOneofFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~ImmutableStringOneofFieldLiteGenerator(); private: void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableStringOneofFieldLiteGenerator); }; class RepeatedImmutableStringFieldLiteGenerator : public ImmutableFieldLiteGenerator { public: explicit RepeatedImmutableStringFieldLiteGenerator( const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex, Context* context); ~RepeatedImmutableStringFieldLiteGenerator(); // implements ImmutableFieldLiteGenerator ------------------------------------ int GetNumBitsForMessage() const; int GetNumBitsForBuilder() const; void GenerateInterfaceMembers(io::Printer* printer) const; void GenerateMembers(io::Printer* printer) const; void GenerateBuilderMembers(io::Printer* printer) const; void GenerateInitializationCode(io::Printer* printer) const; void GenerateVisitCode(io::Printer* printer) const; void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const; void GenerateParsingCode(io::Printer* printer) const; void GenerateParsingDoneCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCode(io::Printer* printer) const; string GetBoxedType() const; private: const FieldDescriptor* descriptor_; std::map variables_; const int messageBitIndex_; const int builderBitIndex_; Context* context_; ClassNameResolver* name_resolver_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedImmutableStringFieldLiteGenerator); }; } // namespace java } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano/000077500000000000000000000000001334102242000307005ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_enum.cc000066400000000000000000000121471334102242000340350ustar00rootroot00000000000000// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor, const Params& params) : params_(params), descriptor_(descriptor) { for (int i = 0; i < descriptor_->value_count(); i++) { const EnumValueDescriptor* value = descriptor_->value(i); const EnumValueDescriptor* canonical_value = descriptor_->FindValueByNumber(value->number()); if (value == canonical_value) { canonical_values_.push_back(value); } else { Alias alias; alias.value = value; alias.canonical_value = canonical_value; aliases_.push_back(alias); } } } EnumGenerator::~EnumGenerator() {} void EnumGenerator::Generate(io::Printer* printer) { printer->Print( "\n" "// enum $classname$\n", "classname", descriptor_->name()); const string classname = RenameJavaKeywords(descriptor_->name()); // Start of container interface // If generating intdefs, we use the container interface as the intdef if // present. Otherwise, we just make an empty @interface parallel to the // constants. bool use_intdef = params_.generate_intdefs(); bool use_shell_class = params_.java_enum_style(); if (use_intdef) { // @IntDef annotation so tools can enforce correctness // Annotations will be discarded by the compiler printer->Print("@java.lang.annotation.Retention(" "java.lang.annotation.RetentionPolicy.SOURCE)\n" "@android.support.annotation.IntDef({\n"); printer->Indent(); for (int i = 0; i < canonical_values_.size(); i++) { const string constant_name = RenameJavaKeywords(canonical_values_[i]->name()); if (use_shell_class) { printer->Print("$classname$.$name$,\n", "classname", classname, "name", constant_name); } else { printer->Print("$name$,\n", "name", constant_name); } } printer->Outdent(); printer->Print("})\n"); } if (use_shell_class || use_intdef) { printer->Print( "public $at_for_intdef$interface $classname$ {\n", "classname", classname, "at_for_intdef", use_intdef ? "@" : ""); if (use_shell_class) { printer->Indent(); } else { printer->Print("}\n\n"); } } // Canonical values for (int i = 0; i < canonical_values_.size(); i++) { printer->Print( "public static final int $name$ = $canonical_value$;\n", "name", RenameJavaKeywords(canonical_values_[i]->name()), "canonical_value", SimpleItoa(canonical_values_[i]->number())); } // Aliases for (int i = 0; i < aliases_.size(); i++) { printer->Print( "public static final int $name$ = $canonical_name$;\n", "name", RenameJavaKeywords(aliases_[i].value->name()), "canonical_name", RenameJavaKeywords(aliases_[i].canonical_value->name())); } // End of container interface if (use_shell_class) { printer->Outdent(); printer->Print("}\n"); } } } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_enum.h000066400000000000000000000061411334102242000336740ustar00rootroot00000000000000// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_ENUM_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_ENUM_H__ #include #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace javanano { class EnumGenerator { public: explicit EnumGenerator(const EnumDescriptor* descriptor, const Params& params); ~EnumGenerator(); void Generate(io::Printer* printer); private: const Params& params_; const EnumDescriptor* descriptor_; // The proto language allows multiple enum constants to have the same numeric // value. Java, however, does not allow multiple enum constants to be // considered equivalent. We treat the first defined constant for any // given numeric value as "canonical" and the rest as aliases of that // canonical value. vector canonical_values_; struct Alias { const EnumValueDescriptor* value; const EnumValueDescriptor* canonical_value; }; vector aliases_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator); }; } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_ENUM_H__ javanano_enum_field.cc000066400000000000000000000437471334102242000351330ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { namespace { // TODO(kenton): Factor out a "SetCommonFieldVariables()" to get rid of // repeat code between this and the other field types. void SetEnumVariables(const Params& params, const FieldDescriptor* descriptor, std::map* variables) { (*variables)["name"] = RenameJavaKeywords(UnderscoresToCamelCase(descriptor)); (*variables)["capitalized_name"] = RenameJavaKeywords(UnderscoresToCapitalizedCamelCase(descriptor)); (*variables)["number"] = SimpleItoa(descriptor->number()); if (params.use_reference_types_for_primitives() && !params.reftypes_primitive_enums() && !descriptor->is_repeated()) { (*variables)["type"] = "java.lang.Integer"; (*variables)["default"] = "null"; } else { (*variables)["type"] = "int"; (*variables)["default"] = DefaultValue(params, descriptor); } (*variables)["repeated_default"] = "com.google.protobuf.nano.WireFormatNano.EMPTY_INT_ARRAY"; (*variables)["tag"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor)); (*variables)["tag_size"] = SimpleItoa( internal::WireFormat::TagSize(descriptor->number(), descriptor->type())); (*variables)["non_packed_tag"] = SimpleItoa( internal::WireFormatLite::MakeTag(descriptor->number(), internal::WireFormat::WireTypeForFieldType(descriptor->type()))); (*variables)["message_name"] = descriptor->containing_type()->name(); const EnumDescriptor* enum_type = descriptor->enum_type(); (*variables)["message_type_intdef"] = "@" + ToJavaName(params, enum_type->name(), true, enum_type->containing_type(), enum_type->file()); } void LoadEnumValues(const Params& params, const EnumDescriptor* enum_descriptor, vector* canonical_values) { string enum_class_name = ClassName(params, enum_descriptor); for (int i = 0; i < enum_descriptor->value_count(); i++) { const EnumValueDescriptor* value = enum_descriptor->value(i); const EnumValueDescriptor* canonical_value = enum_descriptor->FindValueByNumber(value->number()); if (value == canonical_value) { canonical_values->push_back( enum_class_name + "." + RenameJavaKeywords(value->name())); } } } void PrintCaseLabels( io::Printer* printer, const vector& canonical_values) { for (int i = 0; i < canonical_values.size(); i++) { printer->Print( " case $value$:\n", "value", canonical_values[i]); } } } // namespace // =================================================================== EnumFieldGenerator:: EnumFieldGenerator(const FieldDescriptor* descriptor, const Params& params) : FieldGenerator(params), descriptor_(descriptor) { SetEnumVariables(params, descriptor, &variables_); LoadEnumValues(params, descriptor->enum_type(), &canonical_values_); } EnumFieldGenerator::~EnumFieldGenerator() {} void EnumFieldGenerator:: GenerateMembers(io::Printer* printer, bool /* unused lazy_init */) const { if (params_.generate_intdefs()) { printer->Print(variables_, "$message_type_intdef$\n"); } printer->Print(variables_, "public $type$ $name$;\n"); if (params_.generate_has()) { printer->Print(variables_, "public boolean has$capitalized_name$;\n"); } } void EnumFieldGenerator:: GenerateClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$ = $default$;\n"); if (params_.generate_has()) { printer->Print(variables_, "has$capitalized_name$ = false;\n"); } } void EnumFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "int value = input.readInt32();\n" "switch (value) {\n"); PrintCaseLabels(printer, canonical_values_); printer->Print(variables_, " this.$name$ = value;\n"); if (params_.generate_has()) { printer->Print(variables_, " has$capitalized_name$ = true;\n"); } printer->Print( " break;\n" "}\n"); // No default case: in case of invalid value from the wire, preserve old // field value. Also we are not storing the invalid value into the unknown // fields, because there is no way to get the value out. } void EnumFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { if (descriptor_->is_required() && !params_.generate_has()) { // Always serialize a required field if we don't have the 'has' signal. printer->Print(variables_, "output.writeInt32($number$, this.$name$);\n"); } else { if (params_.generate_has()) { printer->Print(variables_, "if (this.$name$ != $default$ || has$capitalized_name$) {\n"); } else { printer->Print(variables_, "if (this.$name$ != $default$) {\n"); } printer->Print(variables_, " output.writeInt32($number$, this.$name$);\n" "}\n"); } } void EnumFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { if (descriptor_->is_required() && !params_.generate_has()) { printer->Print(variables_, "size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .computeInt32Size($number$, this.$name$);\n"); } else { if (params_.generate_has()) { printer->Print(variables_, "if (this.$name$ != $default$ || has$capitalized_name$) {\n"); } else { printer->Print(variables_, "if (this.$name$ != $default$) {\n"); } printer->Print(variables_, " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .computeInt32Size($number$, this.$name$);\n" "}\n"); } } void EnumFieldGenerator::GenerateEqualsCode(io::Printer* printer) const { if (params_.use_reference_types_for_primitives() && !params_.reftypes_primitive_enums()) { printer->Print(variables_, "if (this.$name$ == null) {\n" " if (other.$name$ != null) {\n" " return false;\n" " }\n" "} else if (!this.$name$.equals(other.$name$)) {\n" " return false;" "}\n"); } else { // We define equality as serialized form equality. If generate_has(), // then if the field value equals the default value in both messages, // but one's 'has' field is set and the other's is not, the serialized // forms are different and we should return false. printer->Print(variables_, "if (this.$name$ != other.$name$"); if (params_.generate_has()) { printer->Print(variables_, "\n" " || (this.$name$ == $default$\n" " && this.has$capitalized_name$ != other.has$capitalized_name$)"); } printer->Print(") {\n" " return false;\n" "}\n"); } } void EnumFieldGenerator::GenerateHashCodeCode(io::Printer* printer) const { printer->Print( "result = 31 * result + "); if (params_.use_reference_types_for_primitives() && !params_.reftypes_primitive_enums()) { printer->Print(variables_, "(this.$name$ == null ? 0 : this.$name$)"); } else { printer->Print(variables_, "this.$name$"); } printer->Print(";\n"); } // =================================================================== AccessorEnumFieldGenerator:: AccessorEnumFieldGenerator(const FieldDescriptor* descriptor, const Params& params, int has_bit_index) : FieldGenerator(params), descriptor_(descriptor) { SetEnumVariables(params, descriptor, &variables_); LoadEnumValues(params, descriptor->enum_type(), &canonical_values_); SetBitOperationVariables("has", has_bit_index, &variables_); } AccessorEnumFieldGenerator::~AccessorEnumFieldGenerator() {} void AccessorEnumFieldGenerator:: GenerateMembers(io::Printer* printer, bool /* unused lazy_init */) const { printer->Print(variables_, "private int $name$_;\n"); if (params_.generate_intdefs()) { printer->Print(variables_, "$message_type_intdef$\n"); } printer->Print(variables_, "public int get$capitalized_name$() {\n" " return $name$_;\n" "}\n" "public $message_name$ set$capitalized_name$("); if (params_.generate_intdefs()) { printer->Print(variables_, "\n" " $message_type_intdef$ "); } printer->Print(variables_, "int value) {\n" " $name$_ = value;\n" " $set_has$;\n" " return this;\n" "}\n" "public boolean has$capitalized_name$() {\n" " return $get_has$;\n" "}\n" "public $message_name$ clear$capitalized_name$() {\n" " $name$_ = $default$;\n" " $clear_has$;\n" " return this;\n" "}\n"); } void AccessorEnumFieldGenerator:: GenerateClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default$;\n"); } void AccessorEnumFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "int value = input.readInt32();\n" "switch (value) {\n"); PrintCaseLabels(printer, canonical_values_); printer->Print(variables_, " $name$_ = value;\n" " $set_has$;\n" " break;\n" "}\n"); // No default case: in case of invalid value from the wire, preserve old // field value. Also we are not storing the invalid value into the unknown // fields, because there is no way to get the value out. } void AccessorEnumFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($get_has$) {\n" " output.writeInt32($number$, $name$_);\n" "}\n"); } void AccessorEnumFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($get_has$) {\n" " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .computeInt32Size($number$, $name$_);\n" "}\n"); } void AccessorEnumFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "if ($different_has$\n" " || $name$_ != other.$name$_) {\n" " return false;\n" "}\n"); } void AccessorEnumFieldGenerator:: GenerateHashCodeCode(io::Printer* printer) const { printer->Print(variables_, "result = 31 * result + $name$_;\n"); } // =================================================================== RepeatedEnumFieldGenerator:: RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor, const Params& params) : FieldGenerator(params), descriptor_(descriptor) { SetEnumVariables(params, descriptor, &variables_); LoadEnumValues(params, descriptor->enum_type(), &canonical_values_); } RepeatedEnumFieldGenerator::~RepeatedEnumFieldGenerator() {} void RepeatedEnumFieldGenerator:: GenerateMembers(io::Printer* printer, bool /* unused lazy_init */) const { printer->Print(variables_, "public $type$[] $name$;\n"); } void RepeatedEnumFieldGenerator:: GenerateClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$ = $repeated_default$;\n"); } void RepeatedEnumFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { // First, figure out the maximum length of the array, then parse, // and finally copy the valid values to the field. printer->Print(variables_, "int length = com.google.protobuf.nano.WireFormatNano\n" " .getRepeatedFieldArrayLength(input, $non_packed_tag$);\n" "int[] validValues = new int[length];\n" "int validCount = 0;\n" "for (int i = 0; i < length; i++) {\n" " if (i != 0) { // tag for first value already consumed.\n" " input.readTag();\n" " }\n" " int value = input.readInt32();\n" " switch (value) {\n"); printer->Indent(); PrintCaseLabels(printer, canonical_values_); printer->Outdent(); printer->Print(variables_, " validValues[validCount++] = value;\n" " break;\n" " }\n" "}\n" "if (validCount != 0) {\n" " int i = this.$name$ == null ? 0 : this.$name$.length;\n" " if (i == 0 && validCount == validValues.length) {\n" " this.$name$ = validValues;\n" " } else {\n" " int[] newArray = new int[i + validCount];\n" " if (i != 0) {\n" " java.lang.System.arraycopy(this.$name$, 0, newArray, 0, i);\n" " }\n" " java.lang.System.arraycopy(validValues, 0, newArray, i, validCount);\n" " this.$name$ = newArray;\n" " }\n" "}\n"); } void RepeatedEnumFieldGenerator:: GenerateMergingCodeFromPacked(io::Printer* printer) const { printer->Print(variables_, "int bytes = input.readRawVarint32();\n" "int limit = input.pushLimit(bytes);\n" "// First pass to compute array length.\n" "int arrayLength = 0;\n" "int startPos = input.getPosition();\n" "while (input.getBytesUntilLimit() > 0) {\n" " switch (input.readInt32()) {\n"); printer->Indent(); PrintCaseLabels(printer, canonical_values_); printer->Outdent(); printer->Print(variables_, " arrayLength++;\n" " break;\n" " }\n" "}\n" "if (arrayLength != 0) {\n" " input.rewindToPosition(startPos);\n" " int i = this.$name$ == null ? 0 : this.$name$.length;\n" " int[] newArray = new int[i + arrayLength];\n" " if (i != 0) {\n" " java.lang.System.arraycopy(this.$name$, 0, newArray, 0, i);\n" " }\n" " while (input.getBytesUntilLimit() > 0) {\n" " int value = input.readInt32();\n" " switch (value) {\n"); printer->Indent(); printer->Indent(); PrintCaseLabels(printer, canonical_values_); printer->Outdent(); printer->Outdent(); printer->Print(variables_, " newArray[i++] = value;\n" " break;\n" " }\n" " }\n" " this.$name$ = newArray;\n" "}\n" "input.popLimit(limit);\n"); } void RepeatedEnumFieldGenerator:: GenerateRepeatedDataSizeCode(io::Printer* printer) const { // Creates a variable dataSize and puts the serialized size in there. printer->Print(variables_, "int dataSize = 0;\n" "for (int i = 0; i < this.$name$.length; i++) {\n" " int element = this.$name$[i];\n" " dataSize += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .computeInt32SizeNoTag(element);\n" "}\n"); } void RepeatedEnumFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null && this.$name$.length > 0) {\n"); printer->Indent(); if (descriptor_->options().packed()) { GenerateRepeatedDataSizeCode(printer); printer->Print(variables_, "output.writeRawVarint32($tag$);\n" "output.writeRawVarint32(dataSize);\n" "for (int i = 0; i < this.$name$.length; i++) {\n" " output.writeRawVarint32(this.$name$[i]);\n" "}\n"); } else { printer->Print(variables_, "for (int i = 0; i < this.$name$.length; i++) {\n" " output.writeInt32($number$, this.$name$[i]);\n" "}\n"); } printer->Outdent(); printer->Print(variables_, "}\n"); } void RepeatedEnumFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null && this.$name$.length > 0) {\n"); printer->Indent(); GenerateRepeatedDataSizeCode(printer); printer->Print( "size += dataSize;\n"); if (descriptor_->options().packed()) { printer->Print(variables_, "size += $tag_size$;\n" "size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .computeRawVarint32Size(dataSize);\n"); } else { printer->Print(variables_, "size += $tag_size$ * this.$name$.length;\n"); } printer->Outdent(); printer->Print( "}\n"); } void RepeatedEnumFieldGenerator:: GenerateFixClonedCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null && this.$name$.length > 0) {\n" " cloned.$name$ = this.$name$.clone();\n" "}\n"); } void RepeatedEnumFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "if (!com.google.protobuf.nano.InternalNano.equals(\n" " this.$name$, other.$name$)) {\n" " return false;\n" "}\n"); } void RepeatedEnumFieldGenerator:: GenerateHashCodeCode(io::Printer* printer) const { printer->Print(variables_, "result = 31 * result\n" " + com.google.protobuf.nano.InternalNano.hashCode(this.$name$);\n"); } } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google javanano_enum_field.h000066400000000000000000000117371334102242000347670ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_ENUM_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_ENUM_FIELD_H__ #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { class EnumFieldGenerator : public FieldGenerator { public: explicit EnumFieldGenerator( const FieldDescriptor* descriptor, const Params& params); ~EnumFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCodeCode(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; std::map variables_; vector canonical_values_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator); }; class AccessorEnumFieldGenerator : public FieldGenerator { public: explicit AccessorEnumFieldGenerator(const FieldDescriptor* descriptor, const Params& params, int has_bit_index); ~AccessorEnumFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCodeCode(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; std::map variables_; vector canonical_values_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AccessorEnumFieldGenerator); }; class RepeatedEnumFieldGenerator : public FieldGenerator { public: explicit RepeatedEnumFieldGenerator( const FieldDescriptor* descriptor, const Params& params); ~RepeatedEnumFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateMergingCodeFromPacked(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCodeCode(io::Printer* printer) const; void GenerateFixClonedCode(io::Printer* printer) const; private: void GenerateRepeatedDataSizeCode(io::Printer* printer) const; const FieldDescriptor* descriptor_; std::map variables_; vector canonical_values_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator); }; } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_ENUM_FIELD_H__ javanano_extension.cc000066400000000000000000000144521334102242000350270ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: bduff@google.com (Brian Duff) #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { using internal::WireFormat; using internal::WireFormatLite; namespace { const char* GetTypeConstantName(const FieldDescriptor::Type type) { switch (type) { case FieldDescriptor::TYPE_INT32 : return "TYPE_INT32" ; case FieldDescriptor::TYPE_UINT32 : return "TYPE_UINT32" ; case FieldDescriptor::TYPE_SINT32 : return "TYPE_SINT32" ; case FieldDescriptor::TYPE_FIXED32 : return "TYPE_FIXED32" ; case FieldDescriptor::TYPE_SFIXED32: return "TYPE_SFIXED32"; case FieldDescriptor::TYPE_INT64 : return "TYPE_INT64" ; case FieldDescriptor::TYPE_UINT64 : return "TYPE_UINT64" ; case FieldDescriptor::TYPE_SINT64 : return "TYPE_SINT64" ; case FieldDescriptor::TYPE_FIXED64 : return "TYPE_FIXED64" ; case FieldDescriptor::TYPE_SFIXED64: return "TYPE_SFIXED64"; case FieldDescriptor::TYPE_FLOAT : return "TYPE_FLOAT" ; case FieldDescriptor::TYPE_DOUBLE : return "TYPE_DOUBLE" ; case FieldDescriptor::TYPE_BOOL : return "TYPE_BOOL" ; case FieldDescriptor::TYPE_STRING : return "TYPE_STRING" ; case FieldDescriptor::TYPE_BYTES : return "TYPE_BYTES" ; case FieldDescriptor::TYPE_ENUM : return "TYPE_ENUM" ; case FieldDescriptor::TYPE_GROUP : return "TYPE_GROUP" ; case FieldDescriptor::TYPE_MESSAGE : return "TYPE_MESSAGE" ; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } } // namespace void SetVariables(const FieldDescriptor* descriptor, const Params params, std::map* variables) { (*variables)["extends"] = ClassName(params, descriptor->containing_type()); (*variables)["name"] = RenameJavaKeywords(UnderscoresToCamelCase(descriptor)); bool repeated = descriptor->is_repeated(); (*variables)["repeated"] = repeated ? "Repeated" : ""; (*variables)["type"] = GetTypeConstantName(descriptor->type()); JavaType java_type = GetJavaType(descriptor->type()); string tag = SimpleItoa(WireFormat::MakeTag(descriptor)); if (java_type == JAVATYPE_MESSAGE) { (*variables)["ext_type"] = "MessageTyped"; string message_type = ClassName(params, descriptor->message_type()); if (repeated) { message_type += "[]"; } (*variables)["class"] = message_type; // For message typed extensions, tags_params contains a single tag // for both singular and repeated cases. (*variables)["tag_params"] = tag; } else { (*variables)["ext_type"] = "PrimitiveTyped"; if (!repeated) { (*variables)["class"] = BoxedPrimitiveTypeName(java_type); (*variables)["tag_params"] = tag; } else { (*variables)["class"] = PrimitiveTypeName(java_type) + "[]"; if (!descriptor->is_packable()) { // Non-packable: nonPackedTag == tag, packedTag == 0 (*variables)["tag_params"] = tag + ", " + tag + ", 0"; } else if (descriptor->options().packed()) { // Packable and packed: tag == packedTag string non_packed_tag = SimpleItoa(WireFormatLite::MakeTag( descriptor->number(), WireFormat::WireTypeForFieldType(descriptor->type()))); (*variables)["tag_params"] = tag + ", " + non_packed_tag + ", " + tag; } else { // Packable and not packed: tag == nonPackedTag string packed_tag = SimpleItoa(WireFormatLite::MakeTag( descriptor->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); (*variables)["tag_params"] = tag + ", " + tag + ", " + packed_tag; } } } } ExtensionGenerator:: ExtensionGenerator(const FieldDescriptor* descriptor, const Params& params) : params_(params), descriptor_(descriptor) { SetVariables(descriptor, params, &variables_); } ExtensionGenerator::~ExtensionGenerator() {} void ExtensionGenerator::Generate(io::Printer* printer) const { printer->Print("\n"); PrintFieldComment(printer, descriptor_); printer->Print(variables_, "public static final com.google.protobuf.nano.Extension<\n" " $extends$,\n" " $class$> $name$ =\n" " com.google.protobuf.nano.Extension.create$repeated$$ext_type$(\n" " com.google.protobuf.nano.Extension.$type$,\n" " $class$.class,\n" " $tag_params$L);\n"); } } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google javanano_extension.h000066400000000000000000000052661334102242000346740ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: bduff@google.com (Brian Duff) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_EXTENSION_H_ #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_EXTENSION_H_ #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace javanano { class ExtensionGenerator { public: explicit ExtensionGenerator(const FieldDescriptor* descriptor, const Params& params); ~ExtensionGenerator(); void Generate(io::Printer* printer) const; private: const Params& params_; const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator); }; } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_EXTENSION_H_ javanano_field.cc000066400000000000000000000203251334102242000340720ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { FieldGenerator::~FieldGenerator() {} bool FieldGenerator::SavedDefaultNeeded() const { // No saved default for this field by default. // Subclasses whose instances may need saved defaults will override this // and return the appropriate value. return false; } void FieldGenerator::GenerateInitSavedDefaultCode(io::Printer* printer) const { // No saved default for this field by default. // Subclasses whose instances may need saved defaults will override this // and generate the appropriate init code to the printer. } void FieldGenerator::GenerateMergingCodeFromPacked(io::Printer* printer) const { // Reaching here indicates a bug. Cases are: // - This FieldGenerator should support packing, but this method should be // overridden. // - This FieldGenerator doesn't support packing, and this method should // never have been called. GOOGLE_LOG(FATAL) << "GenerateParsingCodeFromPacked() " << "called on field generator that does not support packing."; } // ============================================= FieldGeneratorMap::FieldGeneratorMap( const Descriptor* descriptor, const Params ¶ms) : descriptor_(descriptor), field_generators_( new scoped_ptr[descriptor->field_count()]) { int next_has_bit_index = 0; bool saved_defaults_needed = false; // Construct all the FieldGenerators. for (int i = 0; i < descriptor->field_count(); i++) { FieldGenerator* field_generator = MakeGenerator( descriptor->field(i), params, &next_has_bit_index); saved_defaults_needed = saved_defaults_needed || field_generator->SavedDefaultNeeded(); field_generators_[i].reset(field_generator); } total_bits_ = next_has_bit_index; saved_defaults_needed_ = saved_defaults_needed; } FieldGenerator* FieldGeneratorMap::MakeGenerator(const FieldDescriptor* field, const Params ¶ms, int* next_has_bit_index) { JavaType java_type = GetJavaType(field); if (field->is_repeated()) { switch (java_type) { case JAVATYPE_MESSAGE: if (IsMapEntry(field->message_type())) { return new MapFieldGenerator(field, params); } else { return new RepeatedMessageFieldGenerator(field, params); } case JAVATYPE_ENUM: return new RepeatedEnumFieldGenerator(field, params); default: return new RepeatedPrimitiveFieldGenerator(field, params); } } else if (field->containing_oneof()) { switch (java_type) { case JAVATYPE_MESSAGE: return new MessageOneofFieldGenerator(field, params); case JAVATYPE_ENUM: default: return new PrimitiveOneofFieldGenerator(field, params); } } else if (params.optional_field_accessors() && field->is_optional() && java_type != JAVATYPE_MESSAGE) { // We need a has-bit for each primitive/enum field because their default // values could be same as explicitly set values. But we don't need it // for a message field because they have no defaults and Nano uses 'null' // for unset messages, which cannot be set explicitly. switch (java_type) { case JAVATYPE_ENUM: return new AccessorEnumFieldGenerator( field, params, (*next_has_bit_index)++); default: return new AccessorPrimitiveFieldGenerator( field, params, (*next_has_bit_index)++); } } else { switch (java_type) { case JAVATYPE_MESSAGE: return new MessageFieldGenerator(field, params); case JAVATYPE_ENUM: return new EnumFieldGenerator(field, params); default: return new PrimitiveFieldGenerator(field, params); } } } FieldGeneratorMap::~FieldGeneratorMap() {} const FieldGenerator& FieldGeneratorMap::get( const FieldDescriptor* field) const { GOOGLE_CHECK_EQ(field->containing_type(), descriptor_); return *field_generators_[field->index()]; } void SetCommonOneofVariables(const FieldDescriptor* descriptor, std::map* variables) { (*variables)["oneof_name"] = UnderscoresToCamelCase(descriptor->containing_oneof()); (*variables)["oneof_capitalized_name"] = UnderscoresToCapitalizedCamelCase(descriptor->containing_oneof()); (*variables)["oneof_index"] = SimpleItoa(descriptor->containing_oneof()->index()); (*variables)["set_oneof_case"] = "this." + (*variables)["oneof_name"] + "Case_ = " + SimpleItoa(descriptor->number()); (*variables)["clear_oneof_case"] = "this." + (*variables)["oneof_name"] + "Case_ = 0"; (*variables)["has_oneof_case"] = "this." + (*variables)["oneof_name"] + "Case_ == " + SimpleItoa(descriptor->number()); } void GenerateOneofFieldEquals(const FieldDescriptor* descriptor, const std::map& variables, io::Printer* printer) { if (GetJavaType(descriptor) == JAVATYPE_BYTES) { printer->Print(variables, "if (this.has$capitalized_name$()) {\n" " if (!java.util.Arrays.equals((byte[]) this.$oneof_name$_,\n" " (byte[]) other.$oneof_name$_)) {\n" " return false;\n" " }\n" "}\n"); } else { printer->Print(variables, "if (this.has$capitalized_name$()) {\n" " if (!this.$oneof_name$_.equals(other.$oneof_name$_)) {\n" " return false;\n" " }\n" "}\n"); } } void GenerateOneofFieldHashCode(const FieldDescriptor* descriptor, const std::map& variables, io::Printer* printer) { if (GetJavaType(descriptor) == JAVATYPE_BYTES) { printer->Print(variables, "result = 31 * result + ($has_oneof_case$\n" " ? java.util.Arrays.hashCode((byte[]) this.$oneof_name$_) : 0);\n"); } else { printer->Print(variables, "result = 31 * result +\n" " ($has_oneof_case$ ? this.$oneof_name$_.hashCode() : 0);\n"); } } } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_field.h000066400000000000000000000125171334102242000340170ustar00rootroot00000000000000// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_FIELD_H__ #include #include #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace javanano { class FieldGenerator { public: FieldGenerator(const Params& params) : params_(params) {} virtual ~FieldGenerator(); virtual bool SavedDefaultNeeded() const; virtual void GenerateInitSavedDefaultCode(io::Printer* printer) const; // Generates code for Java fields and methods supporting this field. // If this field needs a saved default (SavedDefaultNeeded() is true), // then @lazy_init controls how the static field for that default value // and its initialization code should be generated. If @lazy_init is // true, the static field is not declared final and the initialization // code is generated only when GenerateInitSavedDefaultCode is called; // otherwise, the static field is declared final and initialized inline. // GenerateInitSavedDefaultCode will not be called in the latter case. virtual void GenerateMembers( io::Printer* printer, bool lazy_init) const = 0; virtual void GenerateClearCode(io::Printer* printer) const = 0; virtual void GenerateMergingCode(io::Printer* printer) const = 0; // Generates code to merge from packed serialized form. The default // implementation will fail; subclasses which can handle packed serialized // forms will override this and print appropriate code to the printer. virtual void GenerateMergingCodeFromPacked(io::Printer* printer) const; virtual void GenerateSerializationCode(io::Printer* printer) const = 0; virtual void GenerateSerializedSizeCode(io::Printer* printer) const = 0; virtual void GenerateEqualsCode(io::Printer* printer) const = 0; virtual void GenerateHashCodeCode(io::Printer* printer) const = 0; virtual void GenerateFixClonedCode(io::Printer* printer) const {} protected: const Params& params_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGenerator); }; // Convenience class which constructs FieldGenerators for a Descriptor. class FieldGeneratorMap { public: explicit FieldGeneratorMap(const Descriptor* descriptor, const Params ¶ms); ~FieldGeneratorMap(); const FieldGenerator& get(const FieldDescriptor* field) const; int total_bits() const { return total_bits_; } bool saved_defaults_needed() const { return saved_defaults_needed_; } private: const Descriptor* descriptor_; scoped_array > field_generators_; int total_bits_; bool saved_defaults_needed_; static FieldGenerator* MakeGenerator(const FieldDescriptor* field, const Params ¶ms, int* next_has_bit_index); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap); }; void SetCommonOneofVariables(const FieldDescriptor* descriptor, std::map* variables); void GenerateOneofFieldEquals(const FieldDescriptor* descriptor, const std::map& variables, io::Printer* printer); void GenerateOneofFieldHashCode(const FieldDescriptor* descriptor, const std::map& variables, io::Printer* printer); } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_file.cc000066400000000000000000000232041334102242000340040ustar00rootroot00000000000000// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { namespace { // Recursively searches the given message to see if it contains any extensions. bool UsesExtensions(const Message& message) { const Reflection* reflection = message.GetReflection(); // We conservatively assume that unknown fields are extensions. if (reflection->GetUnknownFields(message).field_count() > 0) return true; vector fields; reflection->ListFields(message, &fields); for (int i = 0; i < fields.size(); i++) { if (fields[i]->is_extension()) return true; if (fields[i]->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { if (fields[i]->is_repeated()) { int size = reflection->FieldSize(message, fields[i]); for (int j = 0; j < size; j++) { const Message& sub_message = reflection->GetRepeatedMessage(message, fields[i], j); if (UsesExtensions(sub_message)) return true; } } else { const Message& sub_message = reflection->GetMessage(message, fields[i]); if (UsesExtensions(sub_message)) return true; } } } return false; } } // namespace FileGenerator::FileGenerator(const FileDescriptor* file, const Params& params) : file_(file), params_(params), java_package_(FileJavaPackage(params, file)), classname_(FileClassName(params, file)) {} FileGenerator::~FileGenerator() {} bool FileGenerator::Validate(string* error) { // Check for extensions FileDescriptorProto file_proto; file_->CopyTo(&file_proto); if (UsesExtensions(file_proto) && !params_.store_unknown_fields()) { error->assign(file_->name()); error->append( ": Java NANO_RUNTIME only supports extensions when the " "'store_unknown_fields' generator option is 'true'."); return false; } if (file_->service_count() != 0 && !params_.ignore_services()) { error->assign(file_->name()); error->append( ": Java NANO_RUNTIME does not support services\""); return false; } if (!IsOuterClassNeeded(params_, file_)) { return true; } // Check whether legacy javanano generator would omit the outer class. if (!params_.has_java_outer_classname(file_->name()) && file_->message_type_count() == 1 && file_->enum_type_count() == 0 && file_->extension_count() == 0) { std::cout << "INFO: " << file_->name() << ":" << std::endl; std::cout << "Javanano generator has changed to align with java generator. " "An outer class will be created for this file and the single message " "in the file will become a nested class. Use java_multiple_files to " "skip generating the outer class, or set an explicit " "java_outer_classname to suppress this message." << std::endl; } // Check that no class name matches the file's class name. This is a common // problem that leads to Java compile errors that can be hard to understand. // It's especially bad when using the java_multiple_files, since we would // end up overwriting the outer class with one of the inner ones. bool found_conflict = false; for (int i = 0; !found_conflict && i < file_->message_type_count(); i++) { if (file_->message_type(i)->name() == classname_) { found_conflict = true; } } if (params_.java_enum_style()) { for (int i = 0; !found_conflict && i < file_->enum_type_count(); i++) { if (file_->enum_type(i)->name() == classname_) { found_conflict = true; } } } if (found_conflict) { error->assign(file_->name()); error->append( ": Cannot generate Java output because the file's outer class name, \""); error->append(classname_); error->append( "\", matches the name of one of the types declared inside it. " "Please either rename the type or use the java_outer_classname " "option to specify a different outer class name for the .proto file."); return false; } return true; } void FileGenerator::Generate(io::Printer* printer) { // We don't import anything because we refer to all classes by their // fully-qualified names in the generated source. printer->Print( "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"); if (!java_package_.empty()) { printer->Print( "\n" "package $package$;\n", "package", java_package_); } // Note: constants (from enums, emitted in the loop below) may have the same names as constants // in the nested classes. This causes Java warnings, but is not fatal, so we suppress those // warnings here in the top-most class declaration. printer->Print( "\n" "@SuppressWarnings(\"hiding\")\n" "public interface $classname$ {\n", "classname", classname_); printer->Indent(); // ----------------------------------------------------------------- // Extensions. for (int i = 0; i < file_->extension_count(); i++) { ExtensionGenerator(file_->extension(i), params_).Generate(printer); } // Enums. for (int i = 0; i < file_->enum_type_count(); i++) { EnumGenerator(file_->enum_type(i), params_).Generate(printer); } // Messages. if (!params_.java_multiple_files(file_->name())) { for (int i = 0; i < file_->message_type_count(); i++) { MessageGenerator(file_->message_type(i), params_).Generate(printer); } } // Static variables. for (int i = 0; i < file_->message_type_count(); i++) { // TODO(kenton): Reuse MessageGenerator objects? MessageGenerator(file_->message_type(i), params_).GenerateStaticVariables(printer); } printer->Outdent(); printer->Print( "}\n"); } template static void GenerateSibling(const string& package_dir, const string& java_package, const DescriptorClass* descriptor, GeneratorContext* output_directory, vector* file_list, const Params& params) { string filename = package_dir + descriptor->name() + ".java"; file_list->push_back(filename); scoped_ptr output( output_directory->Open(filename)); io::Printer printer(output.get(), '$'); printer.Print( "// Generated by the protocol buffer compiler. DO NOT EDIT!\n"); if (!java_package.empty()) { printer.Print( "\n" "package $package$;\n", "package", java_package); } GeneratorClass(descriptor, params).Generate(&printer); } void FileGenerator::GenerateSiblings(const string& package_dir, GeneratorContext* output_directory, vector* file_list) { if (params_.java_multiple_files(file_->name())) { for (int i = 0; i < file_->message_type_count(); i++) { GenerateSibling(package_dir, java_package_, file_->message_type(i), output_directory, file_list, params_); } if (params_.java_enum_style()) { for (int i = 0; i < file_->enum_type_count(); i++) { GenerateSibling(package_dir, java_package_, file_->enum_type(i), output_directory, file_list, params_); } } } } } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano/javanano_file.h000066400000000000000000000066631334102242000336600ustar00rootroot00000000000000// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_FILE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_FILE_H__ #include #include #include #include namespace google { namespace protobuf { class FileDescriptor; // descriptor.h namespace io { class Printer; // printer.h } namespace compiler { class GeneratorContext; // code_generator.h } } namespace protobuf { namespace compiler { namespace javanano { class FileGenerator { public: explicit FileGenerator(const FileDescriptor* file, const Params& params); ~FileGenerator(); // Checks for problems that would otherwise lead to cryptic compile errors. // Returns true if there are no problems, or writes an error description to // the given string and returns false otherwise. bool Validate(string* error); void Generate(io::Printer* printer); // If we aren't putting everything into one file, this will write all the // files other than the outer file (i.e. one for each message, enum, and // service type). void GenerateSiblings(const string& package_dir, GeneratorContext* output_directory, vector* file_list); const string& java_package() { return java_package_; } const string& classname() { return classname_; } private: const FileDescriptor* file_; const Params& params_; string java_package_; string classname_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator); }; } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_FILE_H__ javanano_generator.cc000066400000000000000000000214221334102242000347740ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { namespace { string TrimString(const string& s) { string::size_type start = s.find_first_not_of(" \n\r\t"); if (start == string::npos) { return ""; } string::size_type end = s.find_last_not_of(" \n\r\t") + 1; return s.substr(start, end - start); } } // namespace void UpdateParamsRecursively(Params& params, const FileDescriptor* file) { // Add any parameters for this file if (file->options().has_java_outer_classname()) { params.set_java_outer_classname( file->name(), file->options().java_outer_classname()); } if (file->options().has_java_package()) { string result = file->options().java_package(); if (!result.empty()) { result += "."; } result += "nano"; params.set_java_package( file->name(), result); } if (file->options().has_java_multiple_files()) { params.set_java_multiple_files( file->name(), file->options().java_multiple_files()); } // Loop through all dependent files recursively // adding dep for (int i = 0; i < file->dependency_count(); i++) { UpdateParamsRecursively(params, file->dependency(i)); } } JavaNanoGenerator::JavaNanoGenerator() {} JavaNanoGenerator::~JavaNanoGenerator() {} bool JavaNanoGenerator::Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* output_directory, string* error) const { vector > options; ParseGeneratorParameter(parameter, &options); // ----------------------------------------------------------------- // parse generator options // Name a file where we will write a list of generated file names, one // per line. string output_list_file; Params params(file->name()); // Update per file params UpdateParamsRecursively(params, file); // Replace any existing options with ones from command line for (int i = 0; i < options.size(); i++) { string option_name = TrimString(options[i].first); string option_value = TrimString(options[i].second); if (option_name == "output_list_file") { output_list_file = option_value; } else if (option_name == "java_package") { vector parts; SplitStringUsing(option_value, "|", &parts); if (parts.size() != 2) { *error = "Bad java_package, expecting filename|PackageName found '" + option_value + "'"; return false; } params.set_java_package(parts[0], parts[1]); } else if (option_name == "java_outer_classname") { vector parts; SplitStringUsing(option_value, "|", &parts); if (parts.size() != 2) { *error = "Bad java_outer_classname, " "expecting filename|ClassName found '" + option_value + "'"; return false; } params.set_java_outer_classname(parts[0], parts[1]); } else if (option_name == "store_unknown_fields") { params.set_store_unknown_fields(option_value == "true"); } else if (option_name == "java_multiple_files") { params.set_override_java_multiple_files(option_value == "true"); } else if (option_name == "java_nano_generate_has") { params.set_generate_has(option_value == "true"); } else if (option_name == "enum_style") { params.set_java_enum_style(option_value == "java"); } else if (option_name == "optional_field_style") { params.set_optional_field_accessors(option_value == "accessors"); params.set_use_reference_types_for_primitives(option_value == "reftypes" || option_value == "reftypes_compat_mode"); params.set_reftypes_primitive_enums( option_value == "reftypes_compat_mode"); if (option_value == "reftypes_compat_mode") { params.set_generate_clear(false); } } else if (option_name == "generate_equals") { params.set_generate_equals(option_value == "true"); } else if (option_name == "ignore_services") { params.set_ignore_services(option_value == "true"); } else if (option_name == "parcelable_messages") { params.set_parcelable_messages(option_value == "true"); } else if (option_name == "generate_clone") { params.set_generate_clone(option_value == "true"); } else if (option_name == "generate_intdefs") { params.set_generate_intdefs(option_value == "true"); } else if (option_name == "generate_clear") { params.set_generate_clear(option_value == "true"); } else { *error = "Ignore unknown javanano generator option: " + option_name; } } // Check illegal parameter combinations // Note: the enum-like optional_field_style generator param ensures // that we can never have illegal combinations of field styles // (e.g. reftypes and accessors can't be on at the same time). if (params.generate_has() && (params.optional_field_accessors() || params.use_reference_types_for_primitives())) { error->assign("java_nano_generate_has=true cannot be used in conjunction" " with optional_field_style=accessors or optional_field_style=reftypes"); return false; } // ----------------------------------------------------------------- FileGenerator file_generator(file, params); if (!file_generator.Validate(error)) { return false; } string package_dir = StringReplace(file_generator.java_package(), ".", "/", true); if (!package_dir.empty()) package_dir += "/"; vector all_files; if (IsOuterClassNeeded(params, file)) { string java_filename = package_dir; java_filename += file_generator.classname(); java_filename += ".java"; all_files.push_back(java_filename); // Generate main java file. scoped_ptr output( output_directory->Open(java_filename)); io::Printer printer(output.get(), '$'); file_generator.Generate(&printer); } // Generate sibling files. file_generator.GenerateSiblings(package_dir, output_directory, &all_files); // Generate output list if requested. if (!output_list_file.empty()) { // Generate output list. This is just a simple text file placed in a // deterministic location which lists the .java files being generated. scoped_ptr srclist_raw_output( output_directory->Open(output_list_file)); io::Printer srclist_printer(srclist_raw_output.get(), '$'); for (int i = 0; i < all_files.size(); i++) { srclist_printer.Print("$filename$\n", "filename", all_files[i]); } } return true; } } // namespace java } // namespace compiler } // namespace protobuf } // namespace google javanano_generator.h000066400000000000000000000057171334102242000346470ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. // // Generates Java nano code for a given .proto file. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_NANO_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_NANO_GENERATOR_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { // CodeGenerator implementation which generates Java nano code. If you create your // own protocol compiler binary and you want it to support Java output for the // nano runtime, you can do so by registering an instance of this CodeGenerator with // the CommandLineInterface in your main() function. class LIBPROTOC_EXPORT JavaNanoGenerator : public CodeGenerator { public: JavaNanoGenerator(); ~JavaNanoGenerator(); // implements CodeGenerator ---------------------------------------- bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* output_directory, string* error) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(JavaNanoGenerator); }; } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_NANO_GENERATOR_H__ javanano_helpers.cc000066400000000000000000000454421334102242000344600ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { const char kThickSeparator[] = "// ===================================================================\n"; const char kThinSeparator[] = "// -------------------------------------------------------------------\n"; class RenameKeywords { private: hash_set java_keywords_set_; public: RenameKeywords() { static const char* kJavaKeywordsList[] = { // Reserved Java Keywords "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", // Reserved Keywords for Literals "false", "null", "true" }; for (int i = 0; i < GOOGLE_ARRAYSIZE(kJavaKeywordsList); i++) { java_keywords_set_.insert(kJavaKeywordsList[i]); } } // Used to rename the a field name if it's a java keyword. Specifically // this is used to rename the ["name"] or ["capitalized_name"] field params. // (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html) string RenameJavaKeywordsImpl(const string& input) { string result = input; if (java_keywords_set_.find(result) != java_keywords_set_.end()) { result += "_"; } return result; } }; static RenameKeywords sRenameKeywords; namespace { const char* kDefaultPackage = ""; const string& FieldName(const FieldDescriptor* field) { // 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 (field->type() == FieldDescriptor::TYPE_GROUP) { return field->message_type()->name(); } else { return field->name(); } } string UnderscoresToCamelCaseImpl(const string& input, bool cap_next_letter) { 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; } } return result; } } // namespace string UnderscoresToCamelCase(const FieldDescriptor* field) { return UnderscoresToCamelCaseImpl(FieldName(field), false); } string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field) { return UnderscoresToCamelCaseImpl(FieldName(field), true); } string UnderscoresToCamelCase(const MethodDescriptor* method) { return UnderscoresToCamelCaseImpl(method->name(), false); } string UnderscoresToCamelCase(const OneofDescriptor* oneof) { return UnderscoresToCamelCaseImpl(oneof->name(), false); } string UnderscoresToCapitalizedCamelCase(const OneofDescriptor* oneof) { return UnderscoresToCamelCaseImpl(oneof->name(), true); } string RenameJavaKeywords(const string& input) { return sRenameKeywords.RenameJavaKeywordsImpl(input); } string StripProto(const string& filename) { if (HasSuffixString(filename, ".protodevel")) { return StripSuffixString(filename, ".protodevel"); } else { return StripSuffixString(filename, ".proto"); } } string FileClassName(const Params& params, const FileDescriptor* file) { if (params.has_java_outer_classname(file->name())) { return params.java_outer_classname(file->name()); } else { // Use the filename itself with underscores removed // and a CamelCase style name. string basename; string::size_type last_slash = file->name().find_last_of('/'); if (last_slash == string::npos) { basename = file->name(); } else { basename = file->name().substr(last_slash + 1); } return UnderscoresToCamelCaseImpl(StripProto(basename), true); } } string FileJavaPackage(const Params& params, const FileDescriptor* file) { if (params.has_java_package(file->name())) { return params.java_package(file->name()); } else { string result = kDefaultPackage; if (!file->package().empty()) { if (!result.empty()) result += '.'; result += file->package(); } if (!result.empty()) { result += "."; } result += "nano"; return result; } } bool IsOuterClassNeeded(const Params& params, const FileDescriptor* file) { // If java_multiple_files is false, the outer class is always needed. if (!params.java_multiple_files(file->name())) { return true; } // File-scope extensions need the outer class as the scope. if (file->extension_count() != 0) { return true; } // If container interfaces are not generated, file-scope enums need the // outer class as the scope. if (file->enum_type_count() != 0 && !params.java_enum_style()) { return true; } return false; } string ToJavaName(const Params& params, const string& name, bool is_class, const Descriptor* parent, const FileDescriptor* file) { string result; if (parent != NULL) { result.append(ClassName(params, parent)); } else if (is_class && params.java_multiple_files(file->name())) { result.append(FileJavaPackage(params, file)); } else { result.append(ClassName(params, file)); } if (!result.empty()) result.append(1, '.'); result.append(RenameJavaKeywords(name)); return result; } string ClassName(const Params& params, const FileDescriptor* descriptor) { string result = FileJavaPackage(params, descriptor); if (!result.empty()) result += '.'; result += FileClassName(params, descriptor); return result; } string ClassName(const Params& params, const EnumDescriptor* descriptor) { const Descriptor* parent = descriptor->containing_type(); // When using Java enum style, an enum's class name contains the enum name. // Use the standard ToJavaName translation. if (params.java_enum_style()) { return ToJavaName(params, descriptor->name(), true, parent, descriptor->file()); } // Otherwise the enum members are accessed from the enclosing class. if (parent != NULL) { return ClassName(params, parent); } else { return ClassName(params, descriptor->file()); } } string FieldConstantName(const FieldDescriptor *field) { string name = field->name() + "_FIELD_NUMBER"; UpperString(&name); return name; } string FieldDefaultConstantName(const FieldDescriptor *field) { return "_" + RenameJavaKeywords(UnderscoresToCamelCase(field)) + "Default"; } void PrintFieldComment(io::Printer* printer, const FieldDescriptor* field) { // We don't want to print group bodies so we cut off after the first line // (the second line for extensions). string def = field->DebugString(); string::size_type first_line_end = def.find_first_of('\n'); printer->Print("// $def$\n", "def", def.substr(0, first_line_end)); if (field->is_extension()) { string::size_type second_line_start = first_line_end + 1; string::size_type second_line_length = def.find('\n', second_line_start) - second_line_start; printer->Print("// $def$\n", "def", def.substr(second_line_start, second_line_length)); } } JavaType GetJavaType(FieldDescriptor::Type field_type) { switch (field_type) { case FieldDescriptor::TYPE_INT32: case FieldDescriptor::TYPE_UINT32: case FieldDescriptor::TYPE_SINT32: case FieldDescriptor::TYPE_FIXED32: case FieldDescriptor::TYPE_SFIXED32: return JAVATYPE_INT; case FieldDescriptor::TYPE_INT64: case FieldDescriptor::TYPE_UINT64: case FieldDescriptor::TYPE_SINT64: case FieldDescriptor::TYPE_FIXED64: case FieldDescriptor::TYPE_SFIXED64: return JAVATYPE_LONG; case FieldDescriptor::TYPE_FLOAT: return JAVATYPE_FLOAT; case FieldDescriptor::TYPE_DOUBLE: return JAVATYPE_DOUBLE; case FieldDescriptor::TYPE_BOOL: return JAVATYPE_BOOLEAN; case FieldDescriptor::TYPE_STRING: return JAVATYPE_STRING; case FieldDescriptor::TYPE_BYTES: return JAVATYPE_BYTES; case FieldDescriptor::TYPE_ENUM: return JAVATYPE_ENUM; case FieldDescriptor::TYPE_GROUP: case FieldDescriptor::TYPE_MESSAGE: return JAVATYPE_MESSAGE; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return JAVATYPE_INT; } string PrimitiveTypeName(JavaType type) { switch (type) { case JAVATYPE_INT : return "int"; case JAVATYPE_LONG : return "long"; case JAVATYPE_FLOAT : return "float"; case JAVATYPE_DOUBLE : return "double"; case JAVATYPE_BOOLEAN: return "boolean"; case JAVATYPE_STRING : return "java.lang.String"; case JAVATYPE_BYTES : return "byte[]"; case JAVATYPE_ENUM : return "int"; case JAVATYPE_MESSAGE: return ""; // No default because we want the compiler to complain if any new // JavaTypes are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } string BoxedPrimitiveTypeName(JavaType type) { switch (type) { case JAVATYPE_INT : return "java.lang.Integer"; case JAVATYPE_LONG : return "java.lang.Long"; case JAVATYPE_FLOAT : return "java.lang.Float"; case JAVATYPE_DOUBLE : return "java.lang.Double"; case JAVATYPE_BOOLEAN: return "java.lang.Boolean"; case JAVATYPE_STRING : return "java.lang.String"; case JAVATYPE_BYTES : return "byte[]"; case JAVATYPE_ENUM : return "java.lang.Integer"; case JAVATYPE_MESSAGE: return ""; // No default because we want the compiler to complain if any new // JavaTypes are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } string EmptyArrayName(const Params& params, const FieldDescriptor* field) { switch (GetJavaType(field)) { case JAVATYPE_INT : return "com.google.protobuf.nano.WireFormatNano.EMPTY_INT_ARRAY"; case JAVATYPE_LONG : return "com.google.protobuf.nano.WireFormatNano.EMPTY_LONG_ARRAY"; case JAVATYPE_FLOAT : return "com.google.protobuf.nano.WireFormatNano.EMPTY_FLOAT_ARRAY"; case JAVATYPE_DOUBLE : return "com.google.protobuf.nano.WireFormatNano.EMPTY_DOUBLE_ARRAY"; case JAVATYPE_BOOLEAN: return "com.google.protobuf.nano.WireFormatNano.EMPTY_BOOLEAN_ARRAY"; case JAVATYPE_STRING : return "com.google.protobuf.nano.WireFormatNano.EMPTY_STRING_ARRAY"; case JAVATYPE_BYTES : return "com.google.protobuf.nano.WireFormatNano.EMPTY_BYTES_ARRAY"; case JAVATYPE_ENUM : return "com.google.protobuf.nano.WireFormatNano.EMPTY_INT_ARRAY"; case JAVATYPE_MESSAGE: return ClassName(params, field->message_type()) + ".EMPTY_ARRAY"; // No default because we want the compiler to complain if any new // JavaTypes are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } string DefaultValue(const Params& params, const FieldDescriptor* field) { if (field->label() == FieldDescriptor::LABEL_REPEATED) { return EmptyArrayName(params, field); } if (params.use_reference_types_for_primitives()) { if (params.reftypes_primitive_enums() && field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { return "Integer.MIN_VALUE"; } return "null"; } // Switch on cpp_type since we need to know which default_value_* method // of FieldDescriptor to call. switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: return SimpleItoa(field->default_value_int32()); case FieldDescriptor::CPPTYPE_UINT32: // Need to print as a signed int since Java has no unsigned. return SimpleItoa(static_cast(field->default_value_uint32())); case FieldDescriptor::CPPTYPE_INT64: return SimpleItoa(field->default_value_int64()) + "L"; case FieldDescriptor::CPPTYPE_UINT64: return SimpleItoa(static_cast(field->default_value_uint64())) + "L"; case FieldDescriptor::CPPTYPE_DOUBLE: { double value = field->default_value_double(); if (value == std::numeric_limits::infinity()) { return "Double.POSITIVE_INFINITY"; } else if (value == -std::numeric_limits::infinity()) { return "Double.NEGATIVE_INFINITY"; } else if (value != value) { return "Double.NaN"; } else { return SimpleDtoa(value) + "D"; } } case FieldDescriptor::CPPTYPE_FLOAT: { float value = field->default_value_float(); if (value == std::numeric_limits::infinity()) { return "Float.POSITIVE_INFINITY"; } else if (value == -std::numeric_limits::infinity()) { return "Float.NEGATIVE_INFINITY"; } else if (value != value) { return "Float.NaN"; } else { return SimpleFtoa(value) + "F"; } } case FieldDescriptor::CPPTYPE_BOOL: return field->default_value_bool() ? "true" : "false"; case FieldDescriptor::CPPTYPE_STRING: if (!field->default_value_string().empty()) { // Point it to the static final in the generated code. return FieldDefaultConstantName(field); } else { if (field->type() == FieldDescriptor::TYPE_BYTES) { return "com.google.protobuf.nano.WireFormatNano.EMPTY_BYTES"; } else { return "\"\""; } } case FieldDescriptor::CPPTYPE_ENUM: return ClassName(params, field->enum_type()) + "." + RenameJavaKeywords(field->default_value_enum()->name()); case FieldDescriptor::CPPTYPE_MESSAGE: return "null"; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; } static const char* kBitMasks[] = { "0x00000001", "0x00000002", "0x00000004", "0x00000008", "0x00000010", "0x00000020", "0x00000040", "0x00000080", "0x00000100", "0x00000200", "0x00000400", "0x00000800", "0x00001000", "0x00002000", "0x00004000", "0x00008000", "0x00010000", "0x00020000", "0x00040000", "0x00080000", "0x00100000", "0x00200000", "0x00400000", "0x00800000", "0x01000000", "0x02000000", "0x04000000", "0x08000000", "0x10000000", "0x20000000", "0x40000000", "0x80000000", }; string GetBitFieldName(int index) { string var_name = "bitField"; var_name += SimpleItoa(index); var_name += "_"; return var_name; } string GetBitFieldNameForBit(int bit_index) { return GetBitFieldName(bit_index / 32); } string GenerateGetBit(int bit_index) { string var_name = GetBitFieldNameForBit(bit_index); int bit_in_var_index = bit_index % 32; string mask = kBitMasks[bit_in_var_index]; string result = "((" + var_name + " & " + mask + ") != 0)"; return result; } string GenerateSetBit(int bit_index) { string var_name = GetBitFieldNameForBit(bit_index); int bit_in_var_index = bit_index % 32; string mask = kBitMasks[bit_in_var_index]; string result = var_name + " |= " + mask; return result; } string GenerateClearBit(int bit_index) { string var_name = GetBitFieldNameForBit(bit_index); int bit_in_var_index = bit_index % 32; string mask = kBitMasks[bit_in_var_index]; string result = var_name + " = (" + var_name + " & ~" + mask + ")"; return result; } string GenerateDifferentBit(int bit_index) { string var_name = GetBitFieldNameForBit(bit_index); int bit_in_var_index = bit_index % 32; string mask = kBitMasks[bit_in_var_index]; string result = "((" + var_name + " & " + mask + ") != (other." + var_name + " & " + mask + "))"; return result; } void SetBitOperationVariables(const string name, int bitIndex, std::map* variables) { (*variables)["get_" + name] = GenerateGetBit(bitIndex); (*variables)["set_" + name] = GenerateSetBit(bitIndex); (*variables)["clear_" + name] = GenerateClearBit(bitIndex); (*variables)["different_" + name] = GenerateDifferentBit(bitIndex); } bool HasMapField(const Descriptor* descriptor) { for (int i = 0; i < descriptor->field_count(); ++i) { const FieldDescriptor* field = descriptor->field(i); if (field->type() == FieldDescriptor::TYPE_MESSAGE && IsMapEntry(field->message_type())) { return true; } } return false; } } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google javanano_helpers.h000066400000000000000000000200201334102242000343030ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_HELPERS_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_HELPERS_H__ #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { // Commonly-used separator comments. Thick is a line of '=', thin is a line // of '-'. extern const char kThickSeparator[]; extern const char kThinSeparator[]; // Converts the field's name to camel-case, e.g. "foo_bar_baz" becomes // "fooBarBaz" or "FooBarBaz", respectively. string UnderscoresToCamelCase(const FieldDescriptor* field); string UnderscoresToCamelCase(const OneofDescriptor* oneof); string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field); string UnderscoresToCapitalizedCamelCase(const OneofDescriptor* oneof); // Appends an "_" to the end of a field where the name is a reserved java // keyword. For example int32 public = 1 will generate int public_. string RenameJavaKeywords(const string& input); // Similar, but for method names. (Typically, this merely has the effect // of lower-casing the first letter of the name.) string UnderscoresToCamelCase(const MethodDescriptor* method); // Strips ".proto" or ".protodevel" from the end of a filename. string StripProto(const string& filename); // Gets the unqualified class name for the file. Each .proto file becomes a // single Java class, with all its contents nested in that class. string FileClassName(const Params& params, const FileDescriptor* file); // Returns the file's Java package name. string FileJavaPackage(const Params& params, const FileDescriptor* file); // Returns whether the Java outer class is needed, i.e. whether the option // java_multiple_files is false, or the proto file contains any file-scope // enums/extensions. bool IsOuterClassNeeded(const Params& params, const FileDescriptor* file); // Converts the given simple name of a proto entity to its fully-qualified name // in the Java namespace, given that it is in the given file enclosed in the // given parent message (or NULL for file-scope entities). Whether the file's // outer class name should be included in the return value depends on factors // inferrable from the given arguments, including is_class which indicates // whether the entity translates to a Java class. string ToJavaName(const Params& params, const string& name, bool is_class, const Descriptor* parent, const FileDescriptor* file); // These return the fully-qualified class name corresponding to the given // descriptor. inline string ClassName(const Params& params, const Descriptor* descriptor) { return ToJavaName(params, descriptor->name(), true, descriptor->containing_type(), descriptor->file()); } string ClassName(const Params& params, const EnumDescriptor* descriptor); inline string ClassName(const Params& params, const ServiceDescriptor* descriptor) { return ToJavaName(params, descriptor->name(), true, NULL, descriptor->file()); } inline string ExtensionIdentifierName(const Params& params, const FieldDescriptor* descriptor) { return ToJavaName(params, descriptor->name(), false, descriptor->extension_scope(), descriptor->file()); } string ClassName(const Params& params, const FileDescriptor* descriptor); // Get the unqualified name that should be used for a field's field // number constant. string FieldConstantName(const FieldDescriptor *field); string FieldDefaultConstantName(const FieldDescriptor *field); // Print the field's proto-syntax definition as a comment. void PrintFieldComment(io::Printer* printer, const FieldDescriptor* field); enum JavaType { JAVATYPE_INT, JAVATYPE_LONG, JAVATYPE_FLOAT, JAVATYPE_DOUBLE, JAVATYPE_BOOLEAN, JAVATYPE_STRING, JAVATYPE_BYTES, JAVATYPE_ENUM, JAVATYPE_MESSAGE }; JavaType GetJavaType(FieldDescriptor::Type field_type); inline JavaType GetJavaType(const FieldDescriptor* field) { return GetJavaType(field->type()); } string PrimitiveTypeName(JavaType type); // Get the fully-qualified class name for a boxed primitive type, e.g. // "java.lang.Integer" for JAVATYPE_INT. Returns NULL for enum and message // types. string BoxedPrimitiveTypeName(JavaType type); string EmptyArrayName(const Params& params, const FieldDescriptor* field); string DefaultValue(const Params& params, const FieldDescriptor* field); // Methods for shared bitfields. // Gets the name of the shared bitfield for the given field index. string GetBitFieldName(int index); // Gets the name of the shared bitfield for the given bit index. // Effectively, GetBitFieldName(bit_index / 32) string GetBitFieldNameForBit(int bit_index); // Generates the java code for the expression that returns whether the bit at // the given bit index is set. // Example: "((bitField1_ & 0x04000000) != 0)" string GenerateGetBit(int bit_index); // Generates the java code for the expression that sets the bit at the given // bit index. // Example: "bitField1_ |= 0x04000000" string GenerateSetBit(int bit_index); // Generates the java code for the expression that clears the bit at the given // bit index. // Example: "bitField1_ = (bitField1_ & ~0x04000000)" string GenerateClearBit(int bit_index); // Generates the java code for the expression that returns whether the bit at // the given bit index contains different values in the current object and // another object accessible via the variable 'other'. // Example: "((bitField1_ & 0x04000000) != (other.bitField1_ & 0x04000000))" string GenerateDifferentBit(int bit_index); // Sets the 'get_*', 'set_*', 'clear_*' and 'different_*' variables, where * is // the given name of the bit, to the appropriate Java expressions for the given // bit index. void SetBitOperationVariables(const string name, int bitIndex, std::map* variables); inline bool IsMapEntry(const Descriptor* descriptor) { // TODO(liujisi): Add an option to turn on maps for proto2 syntax as well. return descriptor->options().map_entry() && descriptor->file()->syntax() == FileDescriptor::SYNTAX_PROTO3; } bool HasMapField(const Descriptor* descriptor); } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_HELPERS_H__ javanano_map_field.cc000066400000000000000000000157311334102242000347340ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { namespace { string TypeName(const Params& params, const FieldDescriptor* field, bool boxed) { JavaType java_type = GetJavaType(field); switch (java_type) { case JAVATYPE_MESSAGE: return ClassName(params, field->message_type()); case JAVATYPE_INT: case JAVATYPE_LONG: case JAVATYPE_FLOAT: case JAVATYPE_DOUBLE: case JAVATYPE_BOOLEAN: case JAVATYPE_STRING: case JAVATYPE_BYTES: case JAVATYPE_ENUM: if (boxed) { return BoxedPrimitiveTypeName(java_type); } else { return PrimitiveTypeName(java_type); } // No default because we want the compiler to complain if any new JavaTypes // are added.. } GOOGLE_LOG(FATAL) << "should not reach here."; return ""; } const FieldDescriptor* KeyField(const FieldDescriptor* descriptor) { GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, descriptor->type()); const Descriptor* message = descriptor->message_type(); GOOGLE_CHECK(message->options().map_entry()); return message->FindFieldByName("key"); } const FieldDescriptor* ValueField(const FieldDescriptor* descriptor) { GOOGLE_CHECK_EQ(FieldDescriptor::TYPE_MESSAGE, descriptor->type()); const Descriptor* message = descriptor->message_type(); GOOGLE_CHECK(message->options().map_entry()); return message->FindFieldByName("value"); } void SetMapVariables(const Params& params, const FieldDescriptor* descriptor, std::map* variables) { const FieldDescriptor* key = KeyField(descriptor); const FieldDescriptor* value = ValueField(descriptor); (*variables)["name"] = RenameJavaKeywords(UnderscoresToCamelCase(descriptor)); (*variables)["number"] = SimpleItoa(descriptor->number()); (*variables)["key_type"] = TypeName(params, key, false); (*variables)["boxed_key_type"] = TypeName(params,key, true); (*variables)["key_desc_type"] = "TYPE_" + ToUpper(FieldDescriptor::TypeName(key->type())); (*variables)["key_tag"] = SimpleItoa(internal::WireFormat::MakeTag(key)); (*variables)["value_type"] = TypeName(params, value, false); (*variables)["boxed_value_type"] = TypeName(params, value, true); (*variables)["value_desc_type"] = "TYPE_" + ToUpper(FieldDescriptor::TypeName(value->type())); (*variables)["value_tag"] = SimpleItoa(internal::WireFormat::MakeTag(value)); (*variables)["type_parameters"] = (*variables)["boxed_key_type"] + ", " + (*variables)["boxed_value_type"]; (*variables)["value_default"] = value->type() == FieldDescriptor::TYPE_MESSAGE ? "new " + (*variables)["value_type"] + "()" : "null"; } } // namespace // =================================================================== MapFieldGenerator::MapFieldGenerator(const FieldDescriptor* descriptor, const Params& params) : FieldGenerator(params), descriptor_(descriptor) { SetMapVariables(params, descriptor, &variables_); } MapFieldGenerator::~MapFieldGenerator() {} void MapFieldGenerator:: GenerateMembers(io::Printer* printer, bool /* unused lazy_init */) const { printer->Print(variables_, "public java.util.Map<$type_parameters$> $name$;\n"); } void MapFieldGenerator:: GenerateClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$ = null;\n"); } void MapFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "this.$name$ = com.google.protobuf.nano.InternalNano.mergeMapEntry(\n" " input, this.$name$, mapFactory,\n" " com.google.protobuf.nano.InternalNano.$key_desc_type$,\n" " com.google.protobuf.nano.InternalNano.$value_desc_type$,\n" " $value_default$,\n" " $key_tag$, $value_tag$);\n" "\n"); } void MapFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null) {\n" " com.google.protobuf.nano.InternalNano.serializeMapField(\n" " output, this.$name$, $number$,\n" " com.google.protobuf.nano.InternalNano.$key_desc_type$,\n" " com.google.protobuf.nano.InternalNano.$value_desc_type$);\n" "}\n"); } void MapFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null) {\n" " size += com.google.protobuf.nano.InternalNano.computeMapFieldSize(\n" " this.$name$, $number$,\n" " com.google.protobuf.nano.InternalNano.$key_desc_type$,\n" " com.google.protobuf.nano.InternalNano.$value_desc_type$);\n" "}\n"); } void MapFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "if (!com.google.protobuf.nano.InternalNano.equals(\n" " this.$name$, other.$name$)) {\n" " return false;\n" "}\n"); } void MapFieldGenerator:: GenerateHashCodeCode(io::Printer* printer) const { printer->Print(variables_, "result = 31 * result +\n" " com.google.protobuf.nano.InternalNano.hashCode(this.$name$);\n"); } } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google javanano_map_field.h000066400000000000000000000055571334102242000346030ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_MAP_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_MAP_FIELD_H__ #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { class MapFieldGenerator : public FieldGenerator { public: explicit MapFieldGenerator( const FieldDescriptor* descriptor, const Params& params); ~MapFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCodeCode(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapFieldGenerator); }; } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_MAP_FIELD_H__ javanano_message.cc000066400000000000000000000526021334102242000344360ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { using internal::WireFormat; using internal::WireFormatLite; namespace { struct FieldOrderingByNumber { inline bool operator()(const FieldDescriptor* a, const FieldDescriptor* b) const { return a->number() < b->number(); } }; // Sort the fields of the given Descriptor by number into a new[]'d array // and return it. const FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor) { const FieldDescriptor** fields = new const FieldDescriptor*[descriptor->field_count()]; for (int i = 0; i < descriptor->field_count(); i++) { fields[i] = descriptor->field(i); } std::sort(fields, fields + descriptor->field_count(), FieldOrderingByNumber()); return fields; } } // namespace // =================================================================== MessageGenerator::MessageGenerator(const Descriptor* descriptor, const Params& params) : params_(params), descriptor_(descriptor), field_generators_(descriptor, params) { } MessageGenerator::~MessageGenerator() {} void MessageGenerator::GenerateStaticVariables(io::Printer* printer) { // Generate static members for all nested types. for (int i = 0; i < descriptor_->nested_type_count(); i++) { // TODO(kenton): Reuse MessageGenerator objects? if (IsMapEntry(descriptor_->nested_type(i))) continue; MessageGenerator(descriptor_->nested_type(i), params_) .GenerateStaticVariables(printer); } } void MessageGenerator::GenerateStaticVariableInitializers( io::Printer* printer) { // Generate static member initializers for all nested types. for (int i = 0; i < descriptor_->nested_type_count(); i++) { // TODO(kenton): Reuse MessageGenerator objects? if (IsMapEntry(descriptor_->nested_type(i))) continue; MessageGenerator(descriptor_->nested_type(i), params_) .GenerateStaticVariableInitializers(printer); } } void MessageGenerator::Generate(io::Printer* printer) { if (!params_.store_unknown_fields() && (descriptor_->extension_count() != 0 || descriptor_->extension_range_count() != 0)) { GOOGLE_LOG(FATAL) << "Extensions are only supported in NANO_RUNTIME if the " "'store_unknown_fields' generator option is 'true'\n"; } const string& file_name = descriptor_->file()->name(); bool is_own_file = params_.java_multiple_files(file_name) && descriptor_->containing_type() == NULL; if (is_own_file) { // Note: constants (from enums and fields requiring stored defaults, emitted in the loop below) // may have the same names as constants in the nested classes. This causes Java warnings, but // is not fatal, so we suppress those warnings here in the top-most class declaration. printer->Print( "\n" "@SuppressWarnings(\"hiding\")\n" "public final class $classname$ extends\n", "classname", descriptor_->name()); } else { printer->Print( "\n" "public static final class $classname$ extends\n", "classname", descriptor_->name()); } if (params_.store_unknown_fields() && params_.parcelable_messages()) { printer->Print( " com.google.protobuf.nano.android.ParcelableExtendableMessageNano<$classname$>", "classname", descriptor_->name()); } else if (params_.store_unknown_fields()) { printer->Print( " com.google.protobuf.nano.ExtendableMessageNano<$classname$>", "classname", descriptor_->name()); } else if (params_.parcelable_messages()) { printer->Print( " com.google.protobuf.nano.android.ParcelableMessageNano"); } else { printer->Print( " com.google.protobuf.nano.MessageNano"); } if (params_.generate_clone()) { printer->Print(" implements java.lang.Cloneable {\n"); } else { printer->Print(" {\n"); } printer->Indent(); if (params_.parcelable_messages()) { printer->Print( "\n" "// Used by Parcelable\n" "@SuppressWarnings({\"unused\"})\n" "public static final android.os.Parcelable.Creator<$classname$> CREATOR =\n" " new com.google.protobuf.nano.android.ParcelableMessageNanoCreator<\n" " $classname$>($classname$.class);\n", "classname", descriptor_->name()); } // Nested types and extensions for (int i = 0; i < descriptor_->extension_count(); i++) { ExtensionGenerator(descriptor_->extension(i), params_).Generate(printer); } for (int i = 0; i < descriptor_->enum_type_count(); i++) { EnumGenerator(descriptor_->enum_type(i), params_).Generate(printer); } for (int i = 0; i < descriptor_->nested_type_count(); i++) { if (IsMapEntry(descriptor_->nested_type(i))) continue; MessageGenerator(descriptor_->nested_type(i), params_).Generate(printer); } // oneof std::map vars; vars["message_name"] = descriptor_->name(); for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { const OneofDescriptor* oneof_desc = descriptor_->oneof_decl(i); vars["oneof_name"] = UnderscoresToCamelCase(oneof_desc); vars["oneof_capitalized_name"] = UnderscoresToCapitalizedCamelCase(oneof_desc); vars["oneof_index"] = SimpleItoa(oneof_desc->index()); // Oneof Constants for (int j = 0; j < oneof_desc->field_count(); j++) { const FieldDescriptor* field = oneof_desc->field(j); vars["number"] = SimpleItoa(field->number()); vars["cap_field_name"] = ToUpper(field->name()); printer->Print(vars, "public static final int $cap_field_name$_FIELD_NUMBER = $number$;\n"); } // oneofCase_ and oneof_ printer->Print(vars, "private int $oneof_name$Case_ = 0;\n" "private java.lang.Object $oneof_name$_;\n"); printer->Print(vars, "public int get$oneof_capitalized_name$Case() {\n" " return this.$oneof_name$Case_;\n" "}\n"); // Oneof clear printer->Print(vars, "public $message_name$ clear$oneof_capitalized_name$() {\n" " this.$oneof_name$Case_ = 0;\n" " this.$oneof_name$_ = null;\n" " return this;\n" "}\n"); } // Lazy initialization of otherwise static final fields can help prevent the // class initializer from being generated. We want to prevent it because it // stops ProGuard from inlining any methods in this class into call sites and // therefore reducing the method count. However, extensions are best kept as // public static final fields with initializers, so with their existence we // won't bother with lazy initialization. bool lazy_init = descriptor_->extension_count() == 0; // Empty array if (lazy_init) { printer->Print( "\n" "private static volatile $classname$[] _emptyArray;\n" "public static $classname$[] emptyArray() {\n" " // Lazily initializes the empty array\n" " if (_emptyArray == null) {\n" " synchronized (\n" " com.google.protobuf.nano.InternalNano.LAZY_INIT_LOCK) {\n" " if (_emptyArray == null) {\n" " _emptyArray = new $classname$[0];\n" " }\n" " }\n" " }\n" " return _emptyArray;\n" "}\n", "classname", descriptor_->name()); } else { printer->Print( "\n" "private static final $classname$[] EMPTY_ARRAY = {};\n" "public static $classname$[] emptyArray() {\n" " return EMPTY_ARRAY;\n" "}\n", "classname", descriptor_->name()); } // Integers for bit fields int totalInts = (field_generators_.total_bits() + 31) / 32; if (totalInts > 0) { printer->Print("\n"); for (int i = 0; i < totalInts; i++) { printer->Print("private int $bit_field_name$;\n", "bit_field_name", GetBitFieldName(i)); } } // Fields and maybe their default values for (int i = 0; i < descriptor_->field_count(); i++) { printer->Print("\n"); PrintFieldComment(printer, descriptor_->field(i)); field_generators_.get(descriptor_->field(i)).GenerateMembers( printer, lazy_init); } // Constructor, with lazy init code if needed if (lazy_init && field_generators_.saved_defaults_needed()) { printer->Print( "\n" "private static volatile boolean _classInitialized;\n" "\n" "public $classname$() {\n" " // Lazily initializes the field defaults\n" " if (!_classInitialized) {\n" " synchronized (\n" " com.google.protobuf.nano.InternalNano.LAZY_INIT_LOCK) {\n" " if (!_classInitialized) {\n", "classname", descriptor_->name()); printer->Indent(); printer->Indent(); printer->Indent(); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(descriptor_->field(i)) .GenerateInitSavedDefaultCode(printer); } printer->Outdent(); printer->Outdent(); printer->Outdent(); printer->Outdent(); printer->Print( " _classInitialized = true;\n" " }\n" " }\n" " }\n"); if (params_.generate_clear()) { printer->Print(" clear();\n"); } printer->Print("}\n"); } else { printer->Print( "\n" "public $classname$() {\n", "classname", descriptor_->name()); if (params_.generate_clear()) { printer->Print(" clear();\n"); } else { printer->Indent(); GenerateFieldInitializers(printer); printer->Outdent(); } printer->Print("}\n"); } // Other methods in this class GenerateClear(printer); if (params_.generate_clone()) { GenerateClone(printer); } if (params_.generate_equals()) { GenerateEquals(printer); GenerateHashCode(printer); } GenerateMessageSerializationMethods(printer); GenerateMergeFromMethods(printer); GenerateParseFromMethods(printer); printer->Outdent(); printer->Print("}\n"); } // =================================================================== void MessageGenerator:: GenerateMessageSerializationMethods(io::Printer* printer) { // Rely on the parent implementations of writeTo() and getSerializedSize() // if there are no fields to serialize in this message. if (descriptor_->field_count() == 0) { return; } scoped_array sorted_fields( SortFieldsByNumber(descriptor_)); printer->Print( "\n" "@Override\n" "public void writeTo(com.google.protobuf.nano.CodedOutputByteBufferNano output)\n" " throws java.io.IOException {\n"); printer->Indent(); // Output the fields in sorted order for (int i = 0; i < descriptor_->field_count(); i++) { GenerateSerializeOneField(printer, sorted_fields[i]); } // The parent implementation will write any unknown fields if necessary. printer->Print( "super.writeTo(output);\n"); printer->Outdent(); printer->Print("}\n"); // The parent implementation will get the serialized size for unknown // fields if necessary. printer->Print( "\n" "@Override\n" "protected int computeSerializedSize() {\n" " int size = super.computeSerializedSize();\n"); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer); } printer->Outdent(); printer->Print( " return size;\n" "}\n"); } void MessageGenerator::GenerateMergeFromMethods(io::Printer* printer) { scoped_array sorted_fields( SortFieldsByNumber(descriptor_)); printer->Print( "\n" "@Override\n" "public $classname$ mergeFrom(\n" " com.google.protobuf.nano.CodedInputByteBufferNano input)\n" " throws java.io.IOException {\n", "classname", descriptor_->name()); printer->Indent(); if (HasMapField(descriptor_)) { printer->Print( "com.google.protobuf.nano.MapFactories.MapFactory mapFactory =\n" " com.google.protobuf.nano.MapFactories.getMapFactory();\n"); } printer->Print( "while (true) {\n"); printer->Indent(); printer->Print( "int tag = input.readTag();\n" "switch (tag) {\n"); printer->Indent(); printer->Print( "case 0:\n" // zero signals EOF / limit reached " return this;\n" "default: {\n"); printer->Indent(); if (params_.store_unknown_fields()) { printer->Print( "if (!storeUnknownField(input, tag)) {\n" " return this;\n" "}\n"); } else { printer->Print( "if (!com.google.protobuf.nano.WireFormatNano.parseUnknownField(input, tag)) {\n" " return this;\n" // it's an endgroup tag "}\n"); } printer->Print("break;\n"); printer->Outdent(); printer->Print("}\n"); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = sorted_fields[i]; uint32 tag = WireFormatLite::MakeTag(field->number(), WireFormat::WireTypeForFieldType(field->type())); printer->Print( "case $tag$: {\n", "tag", SimpleItoa(tag)); printer->Indent(); field_generators_.get(field).GenerateMergingCode(printer); printer->Outdent(); printer->Print( " break;\n" "}\n"); if (field->is_packable()) { // To make packed = true wire compatible, we generate parsing code from a // packed version of this field regardless of field->options().packed(). uint32 packed_tag = WireFormatLite::MakeTag(field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED); printer->Print( "case $tag$: {\n", "tag", SimpleItoa(packed_tag)); printer->Indent(); field_generators_.get(field).GenerateMergingCodeFromPacked(printer); printer->Outdent(); printer->Print( " break;\n" "}\n"); } } printer->Outdent(); printer->Outdent(); printer->Outdent(); printer->Print( " }\n" // switch (tag) " }\n" // while (true) "}\n"); } void MessageGenerator:: GenerateParseFromMethods(io::Printer* printer) { // Note: These are separate from GenerateMessageSerializationMethods() // because they need to be generated even for messages that are optimized // for code size. printer->Print( "\n" "public static $classname$ parseFrom(byte[] data)\n" " throws com.google.protobuf.nano.InvalidProtocolBufferNanoException {\n" " return com.google.protobuf.nano.MessageNano.mergeFrom(new $classname$(), data);\n" "}\n" "\n" "public static $classname$ parseFrom(\n" " com.google.protobuf.nano.CodedInputByteBufferNano input)\n" " throws java.io.IOException {\n" " return new $classname$().mergeFrom(input);\n" "}\n", "classname", descriptor_->name()); } void MessageGenerator::GenerateSerializeOneField( io::Printer* printer, const FieldDescriptor* field) { field_generators_.get(field).GenerateSerializationCode(printer); } void MessageGenerator::GenerateClear(io::Printer* printer) { if (!params_.generate_clear()) { return; } printer->Print( "\n" "public $classname$ clear() {\n", "classname", descriptor_->name()); printer->Indent(); GenerateFieldInitializers(printer); printer->Outdent(); printer->Print( " return this;\n" "}\n"); } void MessageGenerator::GenerateFieldInitializers(io::Printer* printer) { // Clear bit fields. int totalInts = (field_generators_.total_bits() + 31) / 32; for (int i = 0; i < totalInts; i++) { printer->Print("$bit_field_name$ = 0;\n", "bit_field_name", GetBitFieldName(i)); } // Call clear for all of the fields. for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); field_generators_.get(field).GenerateClearCode(printer); } // Clear oneofs. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { printer->Print( "clear$oneof_capitalized_name$();\n", "oneof_capitalized_name", UnderscoresToCapitalizedCamelCase( descriptor_->oneof_decl(i))); } // Clear unknown fields. if (params_.store_unknown_fields()) { printer->Print("unknownFieldData = null;\n"); } printer->Print("cachedSize = -1;\n"); } void MessageGenerator::GenerateClone(io::Printer* printer) { printer->Print( "@Override\n" "public $classname$ clone() {\n", "classname", descriptor_->name()); printer->Indent(); printer->Print( "$classname$ cloned;\n" "try {\n" " cloned = ($classname$) super.clone();\n" "} catch (java.lang.CloneNotSupportedException e) {\n" " throw new java.lang.AssertionError(e);\n" "}\n", "classname", descriptor_->name()); for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(descriptor_->field(i)).GenerateFixClonedCode(printer); } printer->Outdent(); printer->Print( " return cloned;\n" "}\n" "\n"); } void MessageGenerator::GenerateEquals(io::Printer* printer) { // Don't override if there are no fields. We could generate an // equals method that compares types, but often empty messages // are used as namespaces. if (descriptor_->field_count() == 0 && !params_.store_unknown_fields()) { return; } printer->Print( "\n" "@Override\n" "public boolean equals(Object o) {\n"); printer->Indent(); printer->Print( "if (o == this) {\n" " return true;\n" "}\n" "if (!(o instanceof $classname$)) {\n" " return false;\n" "}\n" "$classname$ other = ($classname$) o;\n", "classname", descriptor_->name()); // Checking oneof case before checking each oneof field. for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { const OneofDescriptor* oneof_desc = descriptor_->oneof_decl(i); printer->Print( "if (this.$oneof_name$Case_ != other.$oneof_name$Case_) {\n" " return false;\n" "}\n", "oneof_name", UnderscoresToCamelCase(oneof_desc)); } for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); field_generators_.get(field).GenerateEqualsCode(printer); } if (params_.store_unknown_fields()) { printer->Print( "if (unknownFieldData == null || unknownFieldData.isEmpty()) {\n" " return other.unknownFieldData == null || other.unknownFieldData.isEmpty();\n" "} else {\n" " return unknownFieldData.equals(other.unknownFieldData);\n" "}"); } else { printer->Print( "return true;\n"); } printer->Outdent(); printer->Print("}\n"); } void MessageGenerator::GenerateHashCode(io::Printer* printer) { if (descriptor_->field_count() == 0 && !params_.store_unknown_fields()) { return; } printer->Print( "\n" "@Override\n" "public int hashCode() {\n"); printer->Indent(); printer->Print("int result = 17;\n"); printer->Print("result = 31 * result + getClass().getName().hashCode();\n"); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); field_generators_.get(field).GenerateHashCodeCode(printer); } if (params_.store_unknown_fields()) { printer->Print( "result = 31 * result + \n" " (unknownFieldData == null || unknownFieldData.isEmpty() ? 0 : \n" " unknownFieldData.hashCode());\n"); } printer->Print("return result;\n"); printer->Outdent(); printer->Print("}\n"); } // =================================================================== } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google javanano_message.h000066400000000000000000000073251334102242000343020ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_MESSAGE_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_MESSAGE_H__ #include #include #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace javanano { class MessageGenerator { public: explicit MessageGenerator(const Descriptor* descriptor, const Params& params); ~MessageGenerator(); // All static variables have to be declared at the top-level of the file // so that we can control initialization order, which is important for // DescriptorProto bootstrapping to work. void GenerateStaticVariables(io::Printer* printer); // Output code which initializes the static variables generated by // GenerateStaticVariables(). void GenerateStaticVariableInitializers(io::Printer* printer); // Generate the class itself. void Generate(io::Printer* printer); private: void GenerateMessageSerializationMethods(io::Printer* printer); void GenerateMergeFromMethods(io::Printer* printer); void GenerateParseFromMethods(io::Printer* printer); void GenerateSerializeOneField(io::Printer* printer, const FieldDescriptor* field); void GenerateClear(io::Printer* printer); void GenerateFieldInitializers(io::Printer* printer); void GenerateEquals(io::Printer* printer); void GenerateHashCode(io::Printer* printer); void GenerateClone(io::Printer* printer); const Params& params_; const Descriptor* descriptor_; FieldGeneratorMap field_generators_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator); }; } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_MESSAGE_H__ javanano_message_field.cc000066400000000000000000000276211334102242000356040ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { using internal::WireFormat; using internal::WireFormatLite; namespace { // TODO(kenton): Factor out a "SetCommonFieldVariables()" to get rid of // repeat code between this and the other field types. void SetMessageVariables(const Params& params, const FieldDescriptor* descriptor, std::map* variables) { (*variables)["name"] = RenameJavaKeywords(UnderscoresToCamelCase(descriptor)); (*variables)["capitalized_name"] = RenameJavaKeywords(UnderscoresToCapitalizedCamelCase(descriptor)); (*variables)["number"] = SimpleItoa(descriptor->number()); (*variables)["type"] = ClassName(params, descriptor->message_type()); (*variables)["group_or_message"] = (descriptor->type() == FieldDescriptor::TYPE_GROUP) ? "Group" : "Message"; (*variables)["message_name"] = descriptor->containing_type()->name(); //(*variables)["message_type"] = descriptor->message_type()->name(); (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor)); } } // namespace // =================================================================== MessageFieldGenerator:: MessageFieldGenerator(const FieldDescriptor* descriptor, const Params& params) : FieldGenerator(params), descriptor_(descriptor) { SetMessageVariables(params, descriptor, &variables_); } MessageFieldGenerator::~MessageFieldGenerator() {} void MessageFieldGenerator:: GenerateMembers(io::Printer* printer, bool /* unused lazy_init */) const { printer->Print(variables_, "public $type$ $name$;\n"); } void MessageFieldGenerator:: GenerateClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$ = null;\n"); } void MessageFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ == null) {\n" " this.$name$ = new $type$();\n" "}\n"); if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) { printer->Print(variables_, "input.readGroup(this.$name$, $number$);\n"); } else { printer->Print(variables_, "input.readMessage(this.$name$);\n"); } } void MessageFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null) {\n" " output.write$group_or_message$($number$, this.$name$);\n" "}\n"); } void MessageFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null) {\n" " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .compute$group_or_message$Size($number$, this.$name$);\n" "}\n"); } void MessageFieldGenerator:: GenerateFixClonedCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null) {\n" " cloned.$name$ = this.$name$.clone();\n" "}\n"); } void MessageFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ == null) { \n" " if (other.$name$ != null) {\n" " return false;\n" " }\n" "} else {\n" " if (!this.$name$.equals(other.$name$)) {\n" " return false;\n" " }\n" "}\n"); } void MessageFieldGenerator:: GenerateHashCodeCode(io::Printer* printer) const { printer->Print(variables_, "result = 31 * result +\n" " (this.$name$ == null ? 0 : this.$name$.hashCode());\n"); } // =================================================================== MessageOneofFieldGenerator::MessageOneofFieldGenerator( const FieldDescriptor* descriptor, const Params& params) : FieldGenerator(params), descriptor_(descriptor) { SetMessageVariables(params, descriptor, &variables_); SetCommonOneofVariables(descriptor, &variables_); } MessageOneofFieldGenerator::~MessageOneofFieldGenerator() {} void MessageOneofFieldGenerator:: GenerateMembers(io::Printer* printer, bool /* unused lazy_init */) const { printer->Print(variables_, "public boolean has$capitalized_name$() {\n" " return $has_oneof_case$;\n" "}\n" "public $type$ get$capitalized_name$() {\n" " if ($has_oneof_case$) {\n" " return ($type$) this.$oneof_name$_;\n" " }\n" " return null;\n" "}\n" "public $message_name$ set$capitalized_name$($type$ value) {\n" " if (value == null) { throw new java.lang.NullPointerException(); }\n" " $set_oneof_case$;\n" " this.$oneof_name$_ = value;\n" " return this;\n" "}\n"); } void MessageOneofFieldGenerator:: GenerateClearCode(io::Printer* printer) const { // No clear method for oneof fields. } void MessageOneofFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "if (!($has_oneof_case$)) {\n" " this.$oneof_name$_ = new $type$();\n" "}\n" "input.readMessage(\n" " (com.google.protobuf.nano.MessageNano) this.$oneof_name$_);\n" "$set_oneof_case$;\n"); } void MessageOneofFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case$) {\n" " output.writeMessage($number$,\n" " (com.google.protobuf.nano.MessageNano) this.$oneof_name$_);\n" "}\n"); } void MessageOneofFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case$) {\n" " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .computeMessageSize($number$,\n" " (com.google.protobuf.nano.MessageNano) this.$oneof_name$_);\n" "}\n"); } void MessageOneofFieldGenerator:: GenerateFixClonedCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$oneof_name$ != null) {\n" " cloned.$oneof_name$ = this.$oneof_name$.clone();\n" "}\n"); } void MessageOneofFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { GenerateOneofFieldEquals(descriptor_, variables_, printer); } void MessageOneofFieldGenerator:: GenerateHashCodeCode(io::Printer* printer) const { GenerateOneofFieldHashCode(descriptor_, variables_, printer); } // =================================================================== RepeatedMessageFieldGenerator::RepeatedMessageFieldGenerator( const FieldDescriptor* descriptor, const Params& params) : FieldGenerator(params), descriptor_(descriptor) { SetMessageVariables(params, descriptor, &variables_); } RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {} void RepeatedMessageFieldGenerator:: GenerateMembers(io::Printer* printer, bool /* unused lazy_init */) const { printer->Print(variables_, "public $type$[] $name$;\n"); } void RepeatedMessageFieldGenerator:: GenerateClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$ = $type$.emptyArray();\n"); } void RepeatedMessageFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { // First, figure out the length of the array, then parse. printer->Print(variables_, "int arrayLength = com.google.protobuf.nano.WireFormatNano\n" " .getRepeatedFieldArrayLength(input, $tag$);\n" "int i = this.$name$ == null ? 0 : this.$name$.length;\n" "$type$[] newArray =\n" " new $type$[i + arrayLength];\n" "if (i != 0) {\n" " java.lang.System.arraycopy(this.$name$, 0, newArray, 0, i);\n" "}\n" "for (; i < newArray.length - 1; i++) {\n" " newArray[i] = new $type$();\n"); if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) { printer->Print(variables_, " input.readGroup(newArray[i], $number$);\n"); } else { printer->Print(variables_, " input.readMessage(newArray[i]);\n"); } printer->Print(variables_, " input.readTag();\n" "}\n" "// Last one without readTag.\n" "newArray[i] = new $type$();\n"); if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) { printer->Print(variables_, "input.readGroup(newArray[i], $number$);\n"); } else { printer->Print(variables_, "input.readMessage(newArray[i]);\n"); } printer->Print(variables_, "this.$name$ = newArray;\n"); } void RepeatedMessageFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null && this.$name$.length > 0) {\n" " for (int i = 0; i < this.$name$.length; i++) {\n" " $type$ element = this.$name$[i];\n" " if (element != null) {\n" " output.write$group_or_message$($number$, element);\n" " }\n" " }\n" "}\n"); } void RepeatedMessageFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null && this.$name$.length > 0) {\n" " for (int i = 0; i < this.$name$.length; i++) {\n" " $type$ element = this.$name$[i];\n" " if (element != null) {\n" " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .compute$group_or_message$Size($number$, element);\n" " }\n" " }\n" "}\n"); } void RepeatedMessageFieldGenerator:: GenerateFixClonedCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null && this.$name$.length > 0) {\n" " cloned.$name$ = new $type$[this.$name$.length];\n" " for (int i = 0; i < this.$name$.length; i++) {\n" " if (this.$name$[i] != null) {\n" " cloned.$name$[i] = this.$name$[i].clone();\n" " }\n" " }\n" "}\n"); } void RepeatedMessageFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "if (!com.google.protobuf.nano.InternalNano.equals(\n" " this.$name$, other.$name$)) {\n" " return false;\n" "}\n"); } void RepeatedMessageFieldGenerator:: GenerateHashCodeCode(io::Printer* printer) const { printer->Print(variables_, "result = 31 * result\n" " + com.google.protobuf.nano.InternalNano.hashCode(this.$name$);\n"); } } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google javanano_message_field.h000066400000000000000000000116001334102242000354340ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_MESSAGE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_MESSAGE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { class MessageFieldGenerator : public FieldGenerator { public: explicit MessageFieldGenerator( const FieldDescriptor* descriptor, const Params& params); ~MessageFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCodeCode(io::Printer* printer) const; void GenerateFixClonedCode(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator); }; class MessageOneofFieldGenerator : public FieldGenerator { public: explicit MessageOneofFieldGenerator(const FieldDescriptor* descriptor, const Params& params); ~MessageOneofFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCodeCode(io::Printer* printer) const; void GenerateFixClonedCode(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageOneofFieldGenerator); }; class RepeatedMessageFieldGenerator : public FieldGenerator { public: explicit RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, const Params& params); ~RepeatedMessageFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCodeCode(io::Printer* printer) const; void GenerateFixClonedCode(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator); }; } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_MESSAGE_FIELD_H__ javanano_params.h000066400000000000000000000165501334102242000341410ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2010 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: wink@google.com (Wink Saville) #ifndef PROTOBUF_COMPILER_JAVANANO_JAVANANO_PARAMS_H_ #define PROTOBUF_COMPILER_JAVANANO_JAVANANO_PARAMS_H_ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { enum eMultipleFiles { JAVANANO_MUL_UNSET, JAVANANO_MUL_FALSE, JAVANANO_MUL_TRUE }; // Parameters for used by the generators class Params { public: typedef std::map NameMap; typedef std::set NameSet; private: string empty_; string base_name_; eMultipleFiles override_java_multiple_files_; bool store_unknown_fields_; NameMap java_packages_; NameMap java_outer_classnames_; NameSet java_multiple_files_; bool generate_has_; bool java_enum_style_; bool optional_field_accessors_; bool use_reference_types_for_primitives_; bool generate_equals_; bool ignore_services_; bool parcelable_messages_; bool reftypes_primitive_enums_; bool generate_clear_; bool generate_clone_; bool generate_intdefs_; public: Params(const string & base_name) : empty_(""), base_name_(base_name), override_java_multiple_files_(JAVANANO_MUL_UNSET), store_unknown_fields_(false), generate_has_(false), java_enum_style_(false), optional_field_accessors_(false), use_reference_types_for_primitives_(false), generate_equals_(false), ignore_services_(false), parcelable_messages_(false), reftypes_primitive_enums_(false), generate_clear_(true), generate_clone_(false), generate_intdefs_(false) { } const string& base_name() const { return base_name_; } bool has_java_package(const string& file_name) const { return java_packages_.find(file_name) != java_packages_.end(); } void set_java_package(const string& file_name, const string& java_package) { java_packages_[file_name] = java_package; } const string& java_package(const string& file_name) const { NameMap::const_iterator itr; itr = java_packages_.find(file_name); if (itr == java_packages_.end()) { return empty_; } else { return itr->second; } } const NameMap& java_packages() { return java_packages_; } bool has_java_outer_classname(const string& file_name) const { return java_outer_classnames_.find(file_name) != java_outer_classnames_.end(); } void set_java_outer_classname(const string& file_name, const string& java_outer_classname) { java_outer_classnames_[file_name] = java_outer_classname; } const string& java_outer_classname(const string& file_name) const { NameMap::const_iterator itr; itr = java_outer_classnames_.find(file_name); if (itr == java_outer_classnames_.end()) { return empty_; } else { return itr->second; } } const NameMap& java_outer_classnames() { return java_outer_classnames_; } void set_override_java_multiple_files(bool java_multiple_files) { if (java_multiple_files) { override_java_multiple_files_ = JAVANANO_MUL_TRUE; } else { override_java_multiple_files_ = JAVANANO_MUL_FALSE; } } void clear_override_java_multiple_files() { override_java_multiple_files_ = JAVANANO_MUL_UNSET; } void set_java_multiple_files(const string& file_name, bool value) { if (value) { java_multiple_files_.insert(file_name); } else { java_multiple_files_.erase(file_name); } } bool java_multiple_files(const string& file_name) const { switch (override_java_multiple_files_) { case JAVANANO_MUL_FALSE: return false; case JAVANANO_MUL_TRUE: return true; default: return java_multiple_files_.find(file_name) != java_multiple_files_.end(); } } void set_store_unknown_fields(bool value) { store_unknown_fields_ = value; } bool store_unknown_fields() const { return store_unknown_fields_; } void set_generate_has(bool value) { generate_has_ = value; } bool generate_has() const { return generate_has_; } void set_java_enum_style(bool value) { java_enum_style_ = value; } bool java_enum_style() const { return java_enum_style_; } void set_optional_field_accessors(bool value) { optional_field_accessors_ = value; } bool optional_field_accessors() const { return optional_field_accessors_; } void set_use_reference_types_for_primitives(bool value) { use_reference_types_for_primitives_ = value; } bool use_reference_types_for_primitives() const { return use_reference_types_for_primitives_; } void set_generate_equals(bool value) { generate_equals_ = value; } bool generate_equals() const { return generate_equals_; } void set_ignore_services(bool value) { ignore_services_ = value; } bool ignore_services() const { return ignore_services_; } void set_parcelable_messages(bool value) { parcelable_messages_ = value; } bool parcelable_messages() const { return parcelable_messages_; } void set_reftypes_primitive_enums(bool value) { reftypes_primitive_enums_ = value; } bool reftypes_primitive_enums() const { return reftypes_primitive_enums_; } void set_generate_clear(bool value) { generate_clear_ = value; } bool generate_clear() const { return generate_clear_; } void set_generate_clone(bool value) { generate_clone_ = value; } bool generate_clone() const { return generate_clone_; } void set_generate_intdefs(bool value) { generate_intdefs_ = value; } bool generate_intdefs() const { return generate_intdefs_; } }; } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // PROTOBUF_COMPILER_JAVANANO_JAVANANO_PARAMS_H_ javanano_primitive_field.cc000066400000000000000000001036761334102242000361750ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { using internal::WireFormat; using internal::WireFormatLite; namespace { bool IsReferenceType(JavaType type) { switch (type) { case JAVATYPE_INT : return false; case JAVATYPE_LONG : return false; case JAVATYPE_FLOAT : return false; case JAVATYPE_DOUBLE : return false; case JAVATYPE_BOOLEAN: return false; case JAVATYPE_STRING : return true; case JAVATYPE_BYTES : return true; case JAVATYPE_ENUM : return false; case JAVATYPE_MESSAGE: return true; // No default because we want the compiler to complain if any new // JavaTypes are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return false; } bool IsArrayType(JavaType type) { switch (type) { case JAVATYPE_INT : return false; case JAVATYPE_LONG : return false; case JAVATYPE_FLOAT : return false; case JAVATYPE_DOUBLE : return false; case JAVATYPE_BOOLEAN: return false; case JAVATYPE_STRING : return false; case JAVATYPE_BYTES : return true; case JAVATYPE_ENUM : return false; case JAVATYPE_MESSAGE: return false; // No default because we want the compiler to complain if any new // JavaTypes are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return false; } const char* GetCapitalizedType(const FieldDescriptor* field) { switch (field->type()) { case FieldDescriptor::TYPE_INT32 : return "Int32" ; case FieldDescriptor::TYPE_UINT32 : return "UInt32" ; case FieldDescriptor::TYPE_SINT32 : return "SInt32" ; case FieldDescriptor::TYPE_FIXED32 : return "Fixed32" ; case FieldDescriptor::TYPE_SFIXED32: return "SFixed32"; case FieldDescriptor::TYPE_INT64 : return "Int64" ; case FieldDescriptor::TYPE_UINT64 : return "UInt64" ; case FieldDescriptor::TYPE_SINT64 : return "SInt64" ; case FieldDescriptor::TYPE_FIXED64 : return "Fixed64" ; case FieldDescriptor::TYPE_SFIXED64: return "SFixed64"; case FieldDescriptor::TYPE_FLOAT : return "Float" ; case FieldDescriptor::TYPE_DOUBLE : return "Double" ; case FieldDescriptor::TYPE_BOOL : return "Bool" ; case FieldDescriptor::TYPE_STRING : return "String" ; case FieldDescriptor::TYPE_BYTES : return "Bytes" ; case FieldDescriptor::TYPE_ENUM : return "Enum" ; case FieldDescriptor::TYPE_GROUP : return "Group" ; case FieldDescriptor::TYPE_MESSAGE : return "Message" ; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } // For encodings with fixed sizes, returns that size in bytes. Otherwise // returns -1. int FixedSize(FieldDescriptor::Type type) { switch (type) { case FieldDescriptor::TYPE_INT32 : return -1; case FieldDescriptor::TYPE_INT64 : return -1; case FieldDescriptor::TYPE_UINT32 : return -1; case FieldDescriptor::TYPE_UINT64 : return -1; case FieldDescriptor::TYPE_SINT32 : return -1; case FieldDescriptor::TYPE_SINT64 : return -1; case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size; case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size; case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size; case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size; case FieldDescriptor::TYPE_FLOAT : return WireFormatLite::kFloatSize; case FieldDescriptor::TYPE_DOUBLE : return WireFormatLite::kDoubleSize; case FieldDescriptor::TYPE_BOOL : return WireFormatLite::kBoolSize; case FieldDescriptor::TYPE_ENUM : return -1; case FieldDescriptor::TYPE_STRING : return -1; case FieldDescriptor::TYPE_BYTES : return -1; case FieldDescriptor::TYPE_GROUP : return -1; case FieldDescriptor::TYPE_MESSAGE : return -1; // No default because we want the compiler to complain if any new // types are added. } GOOGLE_LOG(FATAL) << "Can't get here."; return -1; } bool AllAscii(const string& text) { for (int i = 0; i < text.size(); i++) { if ((text[i] & 0x80) != 0) { return false; } } return true; } void SetPrimitiveVariables(const FieldDescriptor* descriptor, const Params params, std::map* variables) { (*variables)["name"] = RenameJavaKeywords(UnderscoresToCamelCase(descriptor)); (*variables)["capitalized_name"] = RenameJavaKeywords(UnderscoresToCapitalizedCamelCase(descriptor)); (*variables)["number"] = SimpleItoa(descriptor->number()); if (params.use_reference_types_for_primitives() && !descriptor->is_repeated()) { (*variables)["type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor)); } else { (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor)); } // Deals with defaults. For C++-string types (string and bytes), // we might need to have the generated code do the unicode decoding // (see comments in InternalNano.java for gory details.). We would // like to do this once into a static field and re-use that from // then on. if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_STRING && !descriptor->default_value_string().empty() && !params.use_reference_types_for_primitives()) { if (descriptor->type() == FieldDescriptor::TYPE_BYTES) { (*variables)["default"] = DefaultValue(params, descriptor); (*variables)["default_constant"] = FieldDefaultConstantName(descriptor); (*variables)["default_constant_value"] = strings::Substitute( "com.google.protobuf.nano.InternalNano.bytesDefaultValue(\"$0\")", CEscape(descriptor->default_value_string())); (*variables)["default_copy_if_needed"] = (*variables)["default"] + ".clone()"; } else if (AllAscii(descriptor->default_value_string())) { // All chars are ASCII. In this case directly referencing a // CEscape()'d string literal works fine. (*variables)["default"] = "\"" + CEscape(descriptor->default_value_string()) + "\""; (*variables)["default_copy_if_needed"] = (*variables)["default"]; } else { // Strings where some chars are non-ASCII. We need to save the // default value. (*variables)["default"] = DefaultValue(params, descriptor); (*variables)["default_constant"] = FieldDefaultConstantName(descriptor); (*variables)["default_constant_value"] = strings::Substitute( "com.google.protobuf.nano.InternalNano.stringDefaultValue(\"$0\")", CEscape(descriptor->default_value_string())); (*variables)["default_copy_if_needed"] = (*variables)["default"]; } } else { // Non-string, non-bytes field. Defaults are literals. (*variables)["default"] = DefaultValue(params, descriptor); (*variables)["default_copy_if_needed"] = (*variables)["default"]; } (*variables)["boxed_type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor)); (*variables)["capitalized_type"] = GetCapitalizedType(descriptor); (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor)); (*variables)["tag_size"] = SimpleItoa( WireFormat::TagSize(descriptor->number(), descriptor->type())); (*variables)["non_packed_tag"] = SimpleItoa( internal::WireFormatLite::MakeTag(descriptor->number(), internal::WireFormat::WireTypeForFieldType(descriptor->type()))); int fixed_size = FixedSize(descriptor->type()); if (fixed_size != -1) { (*variables)["fixed_size"] = SimpleItoa(fixed_size); } (*variables)["message_name"] = descriptor->containing_type()->name(); (*variables)["empty_array_name"] = EmptyArrayName(params, descriptor); } } // namespace // =================================================================== PrimitiveFieldGenerator:: PrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Params& params) : FieldGenerator(params), descriptor_(descriptor) { SetPrimitiveVariables(descriptor, params, &variables_); } PrimitiveFieldGenerator::~PrimitiveFieldGenerator() {} bool PrimitiveFieldGenerator::SavedDefaultNeeded() const { return variables_.find("default_constant") != variables_.end(); } void PrimitiveFieldGenerator::GenerateInitSavedDefaultCode(io::Printer* printer) const { if (variables_.find("default_constant") != variables_.end()) { printer->Print(variables_, "$default_constant$ = $default_constant_value$;\n"); } } void PrimitiveFieldGenerator:: GenerateMembers(io::Printer* printer, bool lazy_init) const { if (variables_.find("default_constant") != variables_.end()) { // Those primitive types that need a saved default. if (lazy_init) { printer->Print(variables_, "private static $type$ $default_constant$;\n"); } else { printer->Print(variables_, "private static final $type$ $default_constant$ =\n" " $default_constant_value$;\n"); } } printer->Print(variables_, "public $type$ $name$;\n"); if (params_.generate_has()) { printer->Print(variables_, "public boolean has$capitalized_name$;\n"); } } void PrimitiveFieldGenerator:: GenerateClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$ = $default_copy_if_needed$;\n"); if (params_.generate_has()) { printer->Print(variables_, "has$capitalized_name$ = false;\n"); } } void PrimitiveFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "this.$name$ = input.read$capitalized_type$();\n"); if (params_.generate_has()) { printer->Print(variables_, "has$capitalized_name$ = true;\n"); } } void PrimitiveFieldGenerator:: GenerateSerializationConditional(io::Printer* printer) const { if (params_.use_reference_types_for_primitives()) { // For reference type mode, serialize based on equality // to null. printer->Print(variables_, "if (this.$name$ != null) {\n"); return; } if (params_.generate_has()) { printer->Print(variables_, "if (has$capitalized_name$ || "); } else { printer->Print(variables_, "if ("); } JavaType java_type = GetJavaType(descriptor_); if (IsArrayType(java_type)) { printer->Print(variables_, "!java.util.Arrays.equals(this.$name$, $default$)) {\n"); } else if (IsReferenceType(java_type)) { printer->Print(variables_, "!this.$name$.equals($default$)) {\n"); } else if (java_type == JAVATYPE_FLOAT) { printer->Print(variables_, "java.lang.Float.floatToIntBits(this.$name$)\n" " != java.lang.Float.floatToIntBits($default$)) {\n"); } else if (java_type == JAVATYPE_DOUBLE) { printer->Print(variables_, "java.lang.Double.doubleToLongBits(this.$name$)\n" " != java.lang.Double.doubleToLongBits($default$)) {\n"); } else { printer->Print(variables_, "this.$name$ != $default$) {\n"); } } void PrimitiveFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { if (descriptor_->is_required() && !params_.generate_has()) { // Always serialize a required field if we don't have the 'has' signal. printer->Print(variables_, "output.write$capitalized_type$($number$, this.$name$);\n"); } else { GenerateSerializationConditional(printer); printer->Print(variables_, " output.write$capitalized_type$($number$, this.$name$);\n" "}\n"); } } void PrimitiveFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { if (descriptor_->is_required() && !params_.generate_has()) { printer->Print(variables_, "size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .compute$capitalized_type$Size($number$, this.$name$);\n"); } else { GenerateSerializationConditional(printer); printer->Print(variables_, " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .compute$capitalized_type$Size($number$, this.$name$);\n" "}\n"); } } void RepeatedPrimitiveFieldGenerator:: GenerateFixClonedCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null && this.$name$.length > 0) {\n" " cloned.$name$ = this.$name$.clone();\n" "}\n"); } void PrimitiveFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { // We define equality as serialized form equality. If generate_has(), // then if the field value equals the default value in both messages, // but one's 'has' field is set and the other's is not, the serialized // forms are different and we should return false. JavaType java_type = GetJavaType(descriptor_); if (java_type == JAVATYPE_BYTES) { printer->Print(variables_, "if (!java.util.Arrays.equals(this.$name$, other.$name$)"); if (params_.generate_has()) { printer->Print(variables_, "\n" " || (java.util.Arrays.equals(this.$name$, $default$)\n" " && this.has$capitalized_name$ != other.has$capitalized_name$)"); } printer->Print(") {\n" " return false;\n" "}\n"); } else if (java_type == JAVATYPE_STRING || params_.use_reference_types_for_primitives()) { printer->Print(variables_, "if (this.$name$ == null) {\n" " if (other.$name$ != null) {\n" " return false;\n" " }\n" "} else if (!this.$name$.equals(other.$name$)"); if (params_.generate_has()) { printer->Print(variables_, "\n" " || (this.$name$.equals($default$)\n" " && this.has$capitalized_name$ != other.has$capitalized_name$)"); } printer->Print(") {\n" " return false;\n" "}\n"); } else if (java_type == JAVATYPE_FLOAT) { printer->Print(variables_, "{\n" " int bits = java.lang.Float.floatToIntBits(this.$name$);\n" " if (bits != java.lang.Float.floatToIntBits(other.$name$)"); if (params_.generate_has()) { printer->Print(variables_, "\n" " || (bits == java.lang.Float.floatToIntBits($default$)\n" " && this.has$capitalized_name$ != other.has$capitalized_name$)"); } printer->Print(") {\n" " return false;\n" " }\n" "}\n"); } else if (java_type == JAVATYPE_DOUBLE) { printer->Print(variables_, "{\n" " long bits = java.lang.Double.doubleToLongBits(this.$name$);\n" " if (bits != java.lang.Double.doubleToLongBits(other.$name$)"); if (params_.generate_has()) { printer->Print(variables_, "\n" " || (bits == java.lang.Double.doubleToLongBits($default$)\n" " && this.has$capitalized_name$ != other.has$capitalized_name$)"); } printer->Print(") {\n" " return false;\n" " }\n" "}\n"); } else { printer->Print(variables_, "if (this.$name$ != other.$name$"); if (params_.generate_has()) { printer->Print(variables_, "\n" " || (this.$name$ == $default$\n" " && this.has$capitalized_name$ != other.has$capitalized_name$)"); } printer->Print(") {\n" " return false;\n" "}\n"); } } void PrimitiveFieldGenerator:: GenerateHashCodeCode(io::Printer* printer) const { JavaType java_type = GetJavaType(descriptor_); if (java_type == JAVATYPE_BYTES) { printer->Print(variables_, "result = 31 * result + java.util.Arrays.hashCode(this.$name$);\n"); } else if (java_type == JAVATYPE_STRING || params_.use_reference_types_for_primitives()) { printer->Print(variables_, "result = 31 * result\n" " + (this.$name$ == null ? 0 : this.$name$.hashCode());\n"); } else { switch (java_type) { // For all Java primitive types below, the hash codes match the // results of BoxedType.valueOf(primitiveValue).hashCode(). case JAVATYPE_INT: printer->Print(variables_, "result = 31 * result + this.$name$;\n"); break; case JAVATYPE_LONG: printer->Print(variables_, "result = 31 * result\n" " + (int) (this.$name$ ^ (this.$name$ >>> 32));\n"); break; case JAVATYPE_FLOAT: printer->Print(variables_, "result = 31 * result\n" " + java.lang.Float.floatToIntBits(this.$name$);\n"); break; case JAVATYPE_DOUBLE: printer->Print(variables_, "{\n" " long v = java.lang.Double.doubleToLongBits(this.$name$);\n" " result = 31 * result + (int) (v ^ (v >>> 32));\n" "}\n"); break; case JAVATYPE_BOOLEAN: printer->Print(variables_, "result = 31 * result + (this.$name$ ? 1231 : 1237);\n"); break; default: GOOGLE_LOG(ERROR) << "unknown java type for primitive field"; break; } } } // =================================================================== AccessorPrimitiveFieldGenerator:: AccessorPrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Params& params, int has_bit_index) : FieldGenerator(params), descriptor_(descriptor) { SetPrimitiveVariables(descriptor, params, &variables_); SetBitOperationVariables("has", has_bit_index, &variables_); } AccessorPrimitiveFieldGenerator::~AccessorPrimitiveFieldGenerator() {} bool AccessorPrimitiveFieldGenerator::SavedDefaultNeeded() const { return variables_.find("default_constant") != variables_.end(); } void AccessorPrimitiveFieldGenerator:: GenerateInitSavedDefaultCode(io::Printer* printer) const { if (variables_.find("default_constant") != variables_.end()) { printer->Print(variables_, "$default_constant$ = $default_constant_value$;\n"); } } void AccessorPrimitiveFieldGenerator:: GenerateMembers(io::Printer* printer, bool lazy_init) const { if (variables_.find("default_constant") != variables_.end()) { // Those primitive types that need a saved default. if (lazy_init) { printer->Print(variables_, "private static $type$ $default_constant$;\n"); } else { printer->Print(variables_, "private static final $type$ $default_constant$ =\n" " $default_constant_value$;\n"); } } printer->Print(variables_, "private $type$ $name$_;\n" "public $type$ get$capitalized_name$() {\n" " return $name$_;\n" "}\n" "public $message_name$ set$capitalized_name$($type$ value) {\n"); if (IsReferenceType(GetJavaType(descriptor_))) { printer->Print(variables_, " if (value == null) {\n" " throw new java.lang.NullPointerException();\n" " }\n"); } printer->Print(variables_, " $name$_ = value;\n" " $set_has$;\n" " return this;\n" "}\n" "public boolean has$capitalized_name$() {\n" " return $get_has$;\n" "}\n" "public $message_name$ clear$capitalized_name$() {\n" " $name$_ = $default_copy_if_needed$;\n" " $clear_has$;\n" " return this;\n" "}\n"); } void AccessorPrimitiveFieldGenerator:: GenerateClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = $default_copy_if_needed$;\n"); } void AccessorPrimitiveFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { printer->Print(variables_, "$name$_ = input.read$capitalized_type$();\n" "$set_has$;\n"); } void AccessorPrimitiveFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if ($get_has$) {\n" " output.write$capitalized_type$($number$, $name$_);\n" "}\n"); } void AccessorPrimitiveFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if ($get_has$) {\n" " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .compute$capitalized_type$Size($number$, $name$_);\n" "}\n"); } void AccessorPrimitiveFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { switch (GetJavaType(descriptor_)) { // For all Java primitive types below, the equality checks match the // results of BoxedType.valueOf(primitiveValue).equals(otherValue). case JAVATYPE_FLOAT: printer->Print(variables_, "if ($different_has$\n" " || java.lang.Float.floatToIntBits($name$_)\n" " != java.lang.Float.floatToIntBits(other.$name$_)) {\n" " return false;\n" "}\n"); break; case JAVATYPE_DOUBLE: printer->Print(variables_, "if ($different_has$\n" " || java.lang.Double.doubleToLongBits($name$_)\n" " != java.lang.Double.doubleToLongBits(other.$name$_)) {\n" " return false;\n" "}\n"); break; case JAVATYPE_INT: case JAVATYPE_LONG: case JAVATYPE_BOOLEAN: printer->Print(variables_, "if ($different_has$\n" " || $name$_ != other.$name$_) {\n" " return false;\n" "}\n"); break; case JAVATYPE_STRING: // Accessor style would guarantee $name$_ non-null printer->Print(variables_, "if ($different_has$\n" " || !$name$_.equals(other.$name$_)) {\n" " return false;\n" "}\n"); break; case JAVATYPE_BYTES: // Accessor style would guarantee $name$_ non-null printer->Print(variables_, "if ($different_has$\n" " || !java.util.Arrays.equals($name$_, other.$name$_)) {\n" " return false;\n" "}\n"); break; default: GOOGLE_LOG(ERROR) << "unknown java type for primitive field"; break; } } void AccessorPrimitiveFieldGenerator:: GenerateHashCodeCode(io::Printer* printer) const { switch (GetJavaType(descriptor_)) { // For all Java primitive types below, the hash codes match the // results of BoxedType.valueOf(primitiveValue).hashCode(). case JAVATYPE_INT: printer->Print(variables_, "result = 31 * result + $name$_;\n"); break; case JAVATYPE_LONG: printer->Print(variables_, "result = 31 * result + (int) ($name$_ ^ ($name$_ >>> 32));\n"); break; case JAVATYPE_FLOAT: printer->Print(variables_, "result = 31 * result +\n" " java.lang.Float.floatToIntBits($name$_);\n"); break; case JAVATYPE_DOUBLE: printer->Print(variables_, "{\n" " long v = java.lang.Double.doubleToLongBits($name$_);\n" " result = 31 * result + (int) (v ^ (v >>> 32));\n" "}\n"); break; case JAVATYPE_BOOLEAN: printer->Print(variables_, "result = 31 * result + ($name$_ ? 1231 : 1237);\n"); break; case JAVATYPE_STRING: // Accessor style would guarantee $name$_ non-null printer->Print(variables_, "result = 31 * result + $name$_.hashCode();\n"); break; case JAVATYPE_BYTES: // Accessor style would guarantee $name$_ non-null printer->Print(variables_, "result = 31 * result + java.util.Arrays.hashCode($name$_);\n"); break; default: GOOGLE_LOG(ERROR) << "unknown java type for primitive field"; break; } } // =================================================================== PrimitiveOneofFieldGenerator::PrimitiveOneofFieldGenerator( const FieldDescriptor* descriptor, const Params& params) : FieldGenerator(params), descriptor_(descriptor) { SetPrimitiveVariables(descriptor, params, &variables_); SetCommonOneofVariables(descriptor, &variables_); } PrimitiveOneofFieldGenerator::~PrimitiveOneofFieldGenerator() {} void PrimitiveOneofFieldGenerator::GenerateMembers( io::Printer* printer, bool /*unused lazy_init*/) const { printer->Print(variables_, "public boolean has$capitalized_name$() {\n" " return $has_oneof_case$;\n" "}\n" "public $type$ get$capitalized_name$() {\n" " if ($has_oneof_case$) {\n" " return ($type$) ($boxed_type$) this.$oneof_name$_;\n" " }\n" " return $default$;\n" "}\n" "public $message_name$ set$capitalized_name$($type$ value) {\n" " $set_oneof_case$;\n" " this.$oneof_name$_ = value;\n" " return this;\n" "}\n"); } void PrimitiveOneofFieldGenerator::GenerateClearCode( io::Printer* printer) const { // No clear method for oneof fields. } void PrimitiveOneofFieldGenerator::GenerateMergingCode( io::Printer* printer) const { printer->Print(variables_, "this.$oneof_name$_ = input.read$capitalized_type$();\n" "$set_oneof_case$;\n"); } void PrimitiveOneofFieldGenerator::GenerateSerializationCode( io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case$) {\n" " output.write$capitalized_type$(\n" " $number$, ($boxed_type$) this.$oneof_name$_);\n" "}\n"); } void PrimitiveOneofFieldGenerator::GenerateSerializedSizeCode( io::Printer* printer) const { printer->Print(variables_, "if ($has_oneof_case$) {\n" " size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .compute$capitalized_type$Size(\n" " $number$, ($boxed_type$) this.$oneof_name$_);\n" "}\n"); } void PrimitiveOneofFieldGenerator::GenerateEqualsCode( io::Printer* printer) const { GenerateOneofFieldEquals(descriptor_, variables_, printer); } void PrimitiveOneofFieldGenerator::GenerateHashCodeCode( io::Printer* printer) const { GenerateOneofFieldHashCode(descriptor_, variables_, printer); } // =================================================================== RepeatedPrimitiveFieldGenerator::RepeatedPrimitiveFieldGenerator( const FieldDescriptor* descriptor, const Params& params) : FieldGenerator(params), descriptor_(descriptor) { SetPrimitiveVariables(descriptor, params, &variables_); } RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {} void RepeatedPrimitiveFieldGenerator:: GenerateMembers(io::Printer* printer, bool /*unused init_defaults*/) const { printer->Print(variables_, "public $type$[] $name$;\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateClearCode(io::Printer* printer) const { printer->Print(variables_, "$name$ = $default$;\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateMergingCode(io::Printer* printer) const { // First, figure out the length of the array, then parse. printer->Print(variables_, "int arrayLength = com.google.protobuf.nano.WireFormatNano\n" " .getRepeatedFieldArrayLength(input, $non_packed_tag$);\n" "int i = this.$name$ == null ? 0 : this.$name$.length;\n"); if (GetJavaType(descriptor_) == JAVATYPE_BYTES) { printer->Print(variables_, "byte[][] newArray = new byte[i + arrayLength][];\n"); } else { printer->Print(variables_, "$type$[] newArray = new $type$[i + arrayLength];\n"); } printer->Print(variables_, "if (i != 0) {\n" " java.lang.System.arraycopy(this.$name$, 0, newArray, 0, i);\n" "}\n" "for (; i < newArray.length - 1; i++) {\n" " newArray[i] = input.read$capitalized_type$();\n" " input.readTag();\n" "}\n" "// Last one without readTag.\n" "newArray[i] = input.read$capitalized_type$();\n" "this.$name$ = newArray;\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateMergingCodeFromPacked(io::Printer* printer) const { printer->Print( "int length = input.readRawVarint32();\n" "int limit = input.pushLimit(length);\n"); // If we know the elements will all be of the same size, the arrayLength // can be calculated much more easily. However, FixedSize() returns 1 for // repeated bool fields, which are guaranteed to have the fixed size of // 1 byte per value only if we control the output. On the wire they can // legally appear as variable-size integers, so we need to use the slow // way for repeated bool fields. if (descriptor_->type() == FieldDescriptor::TYPE_BOOL || FixedSize(descriptor_->type()) == -1) { printer->Print(variables_, "// First pass to compute array length.\n" "int arrayLength = 0;\n" "int startPos = input.getPosition();\n" "while (input.getBytesUntilLimit() > 0) {\n" " input.read$capitalized_type$();\n" " arrayLength++;\n" "}\n" "input.rewindToPosition(startPos);\n"); } else { printer->Print(variables_, "int arrayLength = length / $fixed_size$;\n"); } printer->Print(variables_, "int i = this.$name$ == null ? 0 : this.$name$.length;\n" "$type$[] newArray = new $type$[i + arrayLength];\n" "if (i != 0) {\n" " java.lang.System.arraycopy(this.$name$, 0, newArray, 0, i);\n" "}\n" "for (; i < newArray.length; i++) {\n" " newArray[i] = input.read$capitalized_type$();\n" "}\n" "this.$name$ = newArray;\n" "input.popLimit(limit);\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateRepeatedDataSizeCode(io::Printer* printer) const { // Creates a variable dataSize and puts the serialized size in there. // If the element type is a Java reference type, also generates // dataCount which stores the number of non-null elements in the field. if (IsReferenceType(GetJavaType(descriptor_))) { printer->Print(variables_, "int dataCount = 0;\n" "int dataSize = 0;\n" "for (int i = 0; i < this.$name$.length; i++) {\n" " $type$ element = this.$name$[i];\n" " if (element != null) {\n" " dataCount++;\n" " dataSize += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .compute$capitalized_type$SizeNoTag(element);\n" " }\n" "}\n"); } else if (FixedSize(descriptor_->type()) == -1) { printer->Print(variables_, "int dataSize = 0;\n" "for (int i = 0; i < this.$name$.length; i++) {\n" " $type$ element = this.$name$[i];\n" " dataSize += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .compute$capitalized_type$SizeNoTag(element);\n" "}\n"); } else { printer->Print(variables_, "int dataSize = $fixed_size$ * this.$name$.length;\n"); } } void RepeatedPrimitiveFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null && this.$name$.length > 0) {\n"); printer->Indent(); if (descriptor_->is_packable() && descriptor_->options().packed()) { GenerateRepeatedDataSizeCode(printer); printer->Print(variables_, "output.writeRawVarint32($tag$);\n" "output.writeRawVarint32(dataSize);\n" "for (int i = 0; i < this.$name$.length; i++) {\n" " output.write$capitalized_type$NoTag(this.$name$[i]);\n" "}\n"); } else if (IsReferenceType(GetJavaType(descriptor_))) { printer->Print(variables_, "for (int i = 0; i < this.$name$.length; i++) {\n" " $type$ element = this.$name$[i];\n" " if (element != null) {\n" " output.write$capitalized_type$($number$, element);\n" " }\n" "}\n"); } else { printer->Print(variables_, "for (int i = 0; i < this.$name$.length; i++) {\n" " output.write$capitalized_type$($number$, this.$name$[i]);\n" "}\n"); } printer->Outdent(); printer->Print("}\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { printer->Print(variables_, "if (this.$name$ != null && this.$name$.length > 0) {\n"); printer->Indent(); GenerateRepeatedDataSizeCode(printer); printer->Print( "size += dataSize;\n"); if (descriptor_->is_packable() && descriptor_->options().packed()) { printer->Print(variables_, "size += $tag_size$;\n" "size += com.google.protobuf.nano.CodedOutputByteBufferNano\n" " .computeRawVarint32Size(dataSize);\n"); } else if (IsReferenceType(GetJavaType(descriptor_))) { printer->Print(variables_, "size += $tag_size$ * dataCount;\n"); } else { printer->Print(variables_, "size += $tag_size$ * this.$name$.length;\n"); } printer->Outdent(); printer->Print( "}\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateEqualsCode(io::Printer* printer) const { printer->Print(variables_, "if (!com.google.protobuf.nano.InternalNano.equals(\n" " this.$name$, other.$name$)) {\n" " return false;\n" "}\n"); } void RepeatedPrimitiveFieldGenerator:: GenerateHashCodeCode(io::Printer* printer) const { printer->Print(variables_, "result = 31 * result\n" " + com.google.protobuf.nano.InternalNano.hashCode(this.$name$);\n"); } } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google javanano_primitive_field.h000066400000000000000000000140671334102242000360320ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/javanano// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // http://code.google.com/p/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. // Author: kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #ifndef GOOGLE_PROTOBUF_COMPILER_JAVANANO_PRIMITIVE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_JAVANANO_PRIMITIVE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace javanano { class PrimitiveFieldGenerator : public FieldGenerator { public: explicit PrimitiveFieldGenerator( const FieldDescriptor* descriptor, const Params& params); ~PrimitiveFieldGenerator(); // implements FieldGenerator --------------------------------------- bool SavedDefaultNeeded() const; void GenerateInitSavedDefaultCode(io::Printer* printer) const; void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCodeCode(io::Printer* printer) const; private: void GenerateSerializationConditional(io::Printer* printer) const; const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator); }; class AccessorPrimitiveFieldGenerator : public FieldGenerator { public: explicit AccessorPrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Params ¶ms, int has_bit_index); ~AccessorPrimitiveFieldGenerator(); // implements FieldGenerator --------------------------------------- bool SavedDefaultNeeded() const; void GenerateInitSavedDefaultCode(io::Printer* printer) const; void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCodeCode(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AccessorPrimitiveFieldGenerator); }; class PrimitiveOneofFieldGenerator : public FieldGenerator { public: explicit PrimitiveOneofFieldGenerator( const FieldDescriptor* descriptor, const Params& params); ~PrimitiveOneofFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCodeCode(io::Printer* printer) const; private: const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveOneofFieldGenerator); }; class RepeatedPrimitiveFieldGenerator : public FieldGenerator { public: explicit RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Params& params); ~RepeatedPrimitiveFieldGenerator(); // implements FieldGenerator --------------------------------------- void GenerateMembers(io::Printer* printer, bool lazy_init) const; void GenerateClearCode(io::Printer* printer) const; void GenerateMergingCode(io::Printer* printer) const; void GenerateMergingCodeFromPacked(io::Printer* printer) const; void GenerateSerializationCode(io::Printer* printer) const; void GenerateSerializedSizeCode(io::Printer* printer) const; void GenerateEqualsCode(io::Printer* printer) const; void GenerateHashCodeCode(io::Printer* printer) const; void GenerateFixClonedCode(io::Printer* printer) const; private: void GenerateRepeatedDataSizeCode(io::Printer* printer) const; const FieldDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator); }; } // namespace javanano } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JAVANANO_PRIMITIVE_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/js/000077500000000000000000000000001334102242000275175ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/js/embed.cc000066400000000000000000000067451334102242000311160ustar00rootroot00000000000000// 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 #include #include #include #include const char output_file[] = "well_known_types_embed.cc"; static bool AsciiIsPrint(unsigned char c) { return c >= 32 && c < 127; } static char ToDecimalDigit(int num) { assert(num < 10); return '0' + num; } static std::string CEscape(const std::string& str) { std::string dest; for (size_t i = 0; i < str.size(); ++i) { unsigned char ch = str[i]; switch (ch) { case '\n': dest += "\\n"; break; case '\r': dest += "\\r"; break; case '\t': dest += "\\t"; break; case '\"': dest += "\\\""; break; case '\\': dest += "\\\\"; break; default: if (AsciiIsPrint(ch)) { dest += ch; } else { dest += "\\"; dest += ToDecimalDigit(ch / 64); dest += ToDecimalDigit((ch % 64) / 8); dest += ToDecimalDigit(ch % 8); } break; } } return dest; } static void AddFile(const char* name, std::basic_ostream* out) { std::ifstream in(name); if (!in.is_open()) { std::cerr << "Couldn't open input file: " << name << "\n"; std::exit(EXIT_FAILURE); } // Make canonical name only include the final element. for (const char *p = name; *p; p++) { if (*p == '/') { name = p + 1; } } *out << "{\"" << CEscape(name) << "\",\n"; for (std::string line; std::getline(in, line); ) { *out << " \"" << CEscape(line) << "\\n\"\n"; } *out << "},\n"; } int main(int argc, char *argv[]) { std::cout << "#include " "\"google/protobuf/compiler/js/well_known_types_embed.h\"\n"; std::cout << "struct FileToc well_known_types_js[] = {\n"; for (int i = 1; i < argc; i++) { AddFile(argv[i], &std::cout); } std::cout << " {NULL, NULL} // Terminate the list.\n"; std::cout << "};\n"; return EXIT_SUCCESS; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/js/js_generator.cc000066400000000000000000003727641334102242000325330ustar00rootroot00000000000000// 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 #include #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace js { // Sorted list of JavaScript keywords. These cannot be used as names. If they // appear, we prefix them with "pb_". const char* kKeyword[] = { "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "debugger", "default", "delete", "do", "double", "else", "enum", "export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "try", "typeof", "var", "void", "volatile", "while", "with", }; static const int kNumKeyword = sizeof(kKeyword) / sizeof(char*); namespace { // The mode of operation for bytes fields. Historically JSPB always carried // bytes as JS {string}, containing base64 content by convention. With binary // and proto3 serialization the new convention is to represent it as binary // data in Uint8Array. See b/26173701 for background on the migration. enum BytesMode { BYTES_DEFAULT, // Default type for getBytesField to return. BYTES_B64, // Explicitly coerce to base64 string where needed. BYTES_U8, // Explicitly coerce to Uint8Array where needed. }; bool IsReserved(const string& ident) { for (int i = 0; i < kNumKeyword; i++) { if (ident == kKeyword[i]) { return true; } } return false; } bool StrEndsWith(StringPiece sp, StringPiece x) { return sp.size() >= x.size() && sp.substr(sp.size() - x.size()) == x; } // Returns a copy of |filename| with any trailing ".protodevel" or ".proto // suffix stripped. // TODO(haberman): Unify with copy in compiler/cpp/internal/helpers.cc. string StripProto(const string& filename) { const char* suffix = StrEndsWith(filename, ".protodevel") ? ".protodevel" : ".proto"; return StripSuffixString(filename, suffix); } // Given a filename like foo/bar/baz.proto, returns the corresponding JavaScript // file foo/bar/baz.js. string GetJSFilename(const GeneratorOptions& options, const string& filename) { return StripProto(filename) + options.GetFileNameExtension(); } // Given a filename like foo/bar/baz.proto, returns the root directory // path ../../ string GetRootPath(const string& from_filename, const string& to_filename) { if (to_filename.find("google/protobuf") == 0) { // Well-known types (.proto files in the google/protobuf directory) are // assumed to come from the 'google-protobuf' npm package. We may want to // generalize this exception later by letting others put generated code in // their own npm packages. return "google-protobuf/"; } size_t slashes = std::count(from_filename.begin(), from_filename.end(), '/'); if (slashes == 0) { return "./"; } string result = ""; for (size_t i = 0; i < slashes; i++) { result += "../"; } return result; } // Returns the alias we assign to the module of the given .proto filename // when importing. string ModuleAlias(const string& filename) { // This scheme could technically cause problems if a file includes any 2 of: // foo/bar_baz.proto // foo_bar_baz.proto // foo_bar/baz.proto // // We'll worry about this problem if/when we actually see it. This name isn't // exposed to users so we can change it later if we need to. string basename = StripProto(filename); StripString(&basename, "-", '$'); StripString(&basename, "/", '_'); StripString(&basename, ".", '_'); return basename + "_pb"; } // Returns the fully normalized JavaScript path for the given // file descriptor's package. string GetFilePath(const GeneratorOptions& options, const FileDescriptor* file) { if (!options.namespace_prefix.empty()) { return options.namespace_prefix; } else if (!file->package().empty()) { return "proto." + file->package(); } else { return "proto"; } } // Returns the name of the message with a leading dot and taking into account // nesting, for example ".OuterMessage.InnerMessage", or returns empty if // descriptor is null. This function does not handle namespacing, only message // nesting. string GetNestedMessageName(const Descriptor* descriptor) { if (descriptor == NULL) { return ""; } string result = StripPrefixString(descriptor->full_name(), descriptor->file()->package()); // Add a leading dot if one is not already present. if (!result.empty() && result[0] != '.') { result = "." + result; } return result; } // Returns the path prefix for a message or enumeration that // lives under the given file and containing type. string GetPrefix(const GeneratorOptions& options, const FileDescriptor* file_descriptor, const Descriptor* containing_type) { string prefix = GetFilePath(options, file_descriptor) + GetNestedMessageName(containing_type); if (!prefix.empty()) { prefix += "."; } return prefix; } // Returns the fully normalized JavaScript path prefix for the given // message descriptor. string GetMessagePathPrefix(const GeneratorOptions& options, const Descriptor* descriptor) { return GetPrefix( options, descriptor->file(), descriptor->containing_type()); } // Returns the fully normalized JavaScript path for the given // message descriptor. string GetMessagePath(const GeneratorOptions& options, const Descriptor* descriptor) { return GetMessagePathPrefix(options, descriptor) + descriptor->name(); } // Returns the fully normalized JavaScript path prefix for the given // enumeration descriptor. string GetEnumPathPrefix(const GeneratorOptions& options, const EnumDescriptor* enum_descriptor) { return GetPrefix(options, enum_descriptor->file(), enum_descriptor->containing_type()); } // Returns the fully normalized JavaScript path for the given // enumeration descriptor. string GetEnumPath(const GeneratorOptions& options, const EnumDescriptor* enum_descriptor) { return GetEnumPathPrefix(options, enum_descriptor) + enum_descriptor->name(); } string MaybeCrossFileRef(const GeneratorOptions& options, const FileDescriptor* from_file, const Descriptor* to_message) { if (options.import_style == GeneratorOptions::kImportCommonJs && from_file != to_message->file()) { // Cross-file ref in CommonJS needs to use the module alias instead of // the global name. return ModuleAlias(to_message->file()->name()) + GetNestedMessageName(to_message->containing_type()) + "." + to_message->name(); } else { // Within a single file we use a full name. return GetMessagePath(options, to_message); } } string SubmessageTypeRef(const GeneratorOptions& options, const FieldDescriptor* field) { GOOGLE_CHECK(field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE); return MaybeCrossFileRef(options, field->file(), field->message_type()); } // - Object field name: LOWER_UNDERSCORE -> LOWER_CAMEL, except for group fields // (UPPER_CAMEL -> LOWER_CAMEL), with "List" (or "Map") appended if appropriate, // and with reserved words triggering a "pb_" prefix. // - Getters/setters: LOWER_UNDERSCORE -> UPPER_CAMEL, except for group fields // (use the name directly), then append "List" if appropriate, then append "$" // if resulting name is equal to a reserved word. // - Enums: just uppercase. // Locale-independent version of ToLower that deals only with ASCII A-Z. char ToLowerASCII(char c) { if (c >= 'A' && c <= 'Z') { return (c - 'A') + 'a'; } else { return c; } } std::vector ParseLowerUnderscore(const string& input) { std::vector words; string running = ""; for (int i = 0; i < input.size(); i++) { if (input[i] == '_') { if (!running.empty()) { words.push_back(running); running.clear(); } } else { running += ToLowerASCII(input[i]); } } if (!running.empty()) { words.push_back(running); } return words; } std::vector ParseUpperCamel(const string& input) { std::vector words; string running = ""; for (int i = 0; i < input.size(); i++) { if (input[i] >= 'A' && input[i] <= 'Z' && !running.empty()) { words.push_back(running); running.clear(); } running += ToLowerASCII(input[i]); } if (!running.empty()) { words.push_back(running); } return words; } string ToLowerCamel(const std::vector& words) { string result; for (int i = 0; i < words.size(); i++) { string word = words[i]; if (i == 0 && (word[0] >= 'A' && word[0] <= 'Z')) { word[0] = (word[0] - 'A') + 'a'; } else if (i != 0 && (word[0] >= 'a' && word[0] <= 'z')) { word[0] = (word[0] - 'a') + 'A'; } result += word; } return result; } string ToUpperCamel(const std::vector& words) { string result; for (int i = 0; i < words.size(); i++) { string word = words[i]; if (word[0] >= 'a' && word[0] <= 'z') { word[0] = (word[0] - 'a') + 'A'; } result += word; } return result; } // Based on code from descriptor.cc (Thanks Kenton!) // Uppercases the entire string, turning ValueName into // VALUENAME. string ToEnumCase(const string& input) { string result; result.reserve(input.size()); for (int i = 0; i < input.size(); i++) { if ('a' <= input[i] && input[i] <= 'z') { result.push_back(input[i] - 'a' + 'A'); } else { result.push_back(input[i]); } } return result; } string ToFileName(const string& input) { string result; result.reserve(input.size()); for (int i = 0; i < input.size(); i++) { if ('A' <= input[i] && input[i] <= 'Z') { result.push_back(input[i] - 'A' + 'a'); } else { result.push_back(input[i]); } } return result; } // When we're generating one output file per type name, this is the filename // that top-level extensions should go in. string GetExtensionFileName(const GeneratorOptions& options, const FileDescriptor* file) { return options.output_dir + "/" + ToFileName(GetFilePath(options, file)) + options.GetFileNameExtension(); } // When we're generating one output file per type name, this is the filename // that a top-level message should go in. string GetMessageFileName(const GeneratorOptions& options, const Descriptor* desc) { return options.output_dir + "/" + ToFileName(desc->name()) + options.GetFileNameExtension(); } // When we're generating one output file per type name, this is the filename // that a top-level message should go in. string GetEnumFileName(const GeneratorOptions& options, const EnumDescriptor* desc) { return options.output_dir + "/" + ToFileName(desc->name()) + options.GetFileNameExtension(); } // Returns the message/response ID, if set. string GetMessageId(const Descriptor* desc) { return string(); } bool IgnoreExtensionField(const FieldDescriptor* field) { // Exclude descriptor extensions from output "to avoid clutter" (from original // codegen). return field->is_extension() && field->containing_type()->file()->name() == "google/protobuf/descriptor.proto"; } // Used inside Google only -- do not remove. bool IsResponse(const Descriptor* desc) { return false; } bool IgnoreField(const FieldDescriptor* field) { return IgnoreExtensionField(field); } // Used inside Google only -- do not remove. bool ShouldTreatMapsAsRepeatedFields(const FileDescriptor& descriptor) { return false; } // Do we ignore this message type? bool IgnoreMessage(const GeneratorOptions& options, const Descriptor* d) { return d->options().map_entry() && !ShouldTreatMapsAsRepeatedFields(*d->file()); } bool IsMap(const GeneratorOptions& options, const FieldDescriptor* field) { return field->is_map() && !ShouldTreatMapsAsRepeatedFields(*field->file()); } // Does JSPB ignore this entire oneof? True only if all fields are ignored. bool IgnoreOneof(const OneofDescriptor* oneof) { for (int i = 0; i < oneof->field_count(); i++) { if (!IgnoreField(oneof->field(i))) { return false; } } return true; } string JSIdent(const GeneratorOptions& options, const FieldDescriptor* field, bool is_upper_camel, bool is_map, bool drop_list) { string result; if (field->type() == FieldDescriptor::TYPE_GROUP) { result = is_upper_camel ? ToUpperCamel(ParseUpperCamel(field->message_type()->name())) : ToLowerCamel(ParseUpperCamel(field->message_type()->name())); } else { result = is_upper_camel ? ToUpperCamel(ParseLowerUnderscore(field->name())) : ToLowerCamel(ParseLowerUnderscore(field->name())); } if (is_map || IsMap(options, field)) { // JSPB-style or proto3-style map. result += "Map"; } else if (!drop_list && field->is_repeated()) { // Repeated field. result += "List"; } return result; } string JSObjectFieldName(const GeneratorOptions& options, const FieldDescriptor* field) { string name = JSIdent(options, field, /* is_upper_camel = */ false, /* is_map = */ false, /* drop_list = */ false); if (IsReserved(name)) { name = "pb_" + name; } return name; } string JSByteGetterSuffix(BytesMode bytes_mode) { switch (bytes_mode) { case BYTES_DEFAULT: return ""; case BYTES_B64: return "B64"; case BYTES_U8: return "U8"; default: assert(false); } return ""; } // Returns the field name as a capitalized portion of a getter/setter method // name, e.g. MyField for .getMyField(). string JSGetterName(const GeneratorOptions& options, const FieldDescriptor* field, BytesMode bytes_mode = BYTES_DEFAULT, bool drop_list = false) { string name = JSIdent(options, field, /* is_upper_camel = */ true, /* is_map = */ false, drop_list); if (field->type() == FieldDescriptor::TYPE_BYTES) { string suffix = JSByteGetterSuffix(bytes_mode); if (!suffix.empty()) { name += "_as" + suffix; } } if (name == "Extension" || name == "JsPbMessageId") { // Avoid conflicts with base-class names. name += "$"; } return name; } string JSOneofName(const OneofDescriptor* oneof) { return ToUpperCamel(ParseLowerUnderscore(oneof->name())); } // Returns the index corresponding to this field in the JSPB array (underlying // data storage array). string JSFieldIndex(const FieldDescriptor* field) { // Determine whether this field is a member of a group. Group fields are a bit // wonky: their "containing type" is a message type created just for the // group, and that type's parent type has a field with the group-message type // as its message type and TYPE_GROUP as its field type. For such fields, the // index we use is relative to the field number of the group submessage field. // For all other fields, we just use the field number. const Descriptor* containing_type = field->containing_type(); const Descriptor* parent_type = containing_type->containing_type(); if (parent_type != NULL) { for (int i = 0; i < parent_type->field_count(); i++) { if (parent_type->field(i)->type() == FieldDescriptor::TYPE_GROUP && parent_type->field(i)->message_type() == containing_type) { return SimpleItoa(field->number() - parent_type->field(i)->number()); } } } return SimpleItoa(field->number()); } string JSOneofIndex(const OneofDescriptor* oneof) { int index = -1; for (int i = 0; i < oneof->containing_type()->oneof_decl_count(); i++) { const OneofDescriptor* o = oneof->containing_type()->oneof_decl(i); // If at least one field in this oneof is not JSPB-ignored, count the oneof. for (int j = 0; j < o->field_count(); j++) { const FieldDescriptor* f = o->field(j); if (!IgnoreField(f)) { index++; break; // inner loop } } if (o == oneof) { break; } } return SimpleItoa(index); } // Decodes a codepoint in \x0000 -- \xFFFF. uint16 DecodeUTF8Codepoint(uint8* bytes, size_t* length) { if (*length == 0) { return 0; } size_t expected = 0; if ((*bytes & 0x80) == 0) { expected = 1; } else if ((*bytes & 0xe0) == 0xc0) { expected = 2; } else if ((*bytes & 0xf0) == 0xe0) { expected = 3; } else { // Too long -- don't accept. *length = 0; return 0; } if (*length < expected) { // Not enough bytes -- don't accept. *length = 0; return 0; } *length = expected; switch (expected) { case 1: return bytes[0]; case 2: return ((bytes[0] & 0x1F) << 6) | ((bytes[1] & 0x3F) << 0); case 3: return ((bytes[0] & 0x0F) << 12) | ((bytes[1] & 0x3F) << 6) | ((bytes[2] & 0x3F) << 0); default: return 0; } } // Escapes the contents of a string to be included within double-quotes ("") in // JavaScript. The input data should be a UTF-8 encoded C++ string of chars. // Returns false if |out| was truncated because |in| contained invalid UTF-8 or // codepoints outside the BMP. // TODO(lukestebbing): Support codepoints outside the BMP. bool EscapeJSString(const string& in, string* out) { size_t decoded = 0; for (size_t i = 0; i < in.size(); i += decoded) { uint16 codepoint = 0; // Decode the next UTF-8 codepoint. size_t have_bytes = in.size() - i; uint8 bytes[3] = { static_cast(in[i]), static_cast(((i + 1) < in.size()) ? in[i + 1] : 0), static_cast(((i + 2) < in.size()) ? in[i + 2] : 0), }; codepoint = DecodeUTF8Codepoint(bytes, &have_bytes); if (have_bytes == 0) { return false; } decoded = have_bytes; switch (codepoint) { case '\'': *out += "\\x27"; break; case '"': *out += "\\x22"; break; case '<': *out += "\\x3c"; break; case '=': *out += "\\x3d"; break; case '>': *out += "\\x3e"; break; case '&': *out += "\\x26"; break; case '\b': *out += "\\b"; break; case '\t': *out += "\\t"; break; case '\n': *out += "\\n"; break; case '\f': *out += "\\f"; break; case '\r': *out += "\\r"; break; case '\\': *out += "\\\\"; break; default: // TODO(lukestebbing): Once we're supporting codepoints outside the BMP, // use a single Unicode codepoint escape if the output language is // ECMAScript 2015 or above. Otherwise, use a surrogate pair. // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#String_literals if (codepoint >= 0x20 && codepoint <= 0x7e) { *out += static_cast(codepoint); } else if (codepoint >= 0x100) { *out += StringPrintf("\\u%04x", codepoint); } else { *out += StringPrintf("\\x%02x", codepoint); } break; } } return true; } string EscapeBase64(const string& in) { static const char* kAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; string result; for (size_t i = 0; i < in.size(); i += 3) { int value = (in[i] << 16) | (((i + 1) < in.size()) ? (in[i + 1] << 8) : 0) | (((i + 2) < in.size()) ? (in[i + 2] << 0) : 0); result += kAlphabet[(value >> 18) & 0x3f]; result += kAlphabet[(value >> 12) & 0x3f]; if ((i + 1) < in.size()) { result += kAlphabet[(value >> 6) & 0x3f]; } else { result += '='; } if ((i + 2) < in.size()) { result += kAlphabet[(value >> 0) & 0x3f]; } else { result += '='; } } return result; } // Post-process the result of SimpleFtoa/SimpleDtoa to *exactly* match the // original codegen's formatting (which is just .toString() on java.lang.Double // or java.lang.Float). string PostProcessFloat(string result) { // If inf, -inf or nan, replace with +Infinity, -Infinity or NaN. if (result == "inf") { return "Infinity"; } else if (result == "-inf") { return "-Infinity"; } else if (result == "nan") { return "NaN"; } // If scientific notation (e.g., "1e10"), (i) capitalize the "e", (ii) // ensure that the mantissa (portion prior to the "e") has at least one // fractional digit (after the decimal point), and (iii) strip any unnecessary // leading zeroes and/or '+' signs from the exponent. string::size_type exp_pos = result.find('e'); if (exp_pos != string::npos) { string mantissa = result.substr(0, exp_pos); string exponent = result.substr(exp_pos + 1); // Add ".0" to mantissa if no fractional part exists. if (mantissa.find('.') == string::npos) { mantissa += ".0"; } // Strip the sign off the exponent and store as |exp_neg|. bool exp_neg = false; if (!exponent.empty() && exponent[0] == '+') { exponent = exponent.substr(1); } else if (!exponent.empty() && exponent[0] == '-') { exp_neg = true; exponent = exponent.substr(1); } // Strip any leading zeroes off the exponent. while (exponent.size() > 1 && exponent[0] == '0') { exponent = exponent.substr(1); } return mantissa + "E" + string(exp_neg ? "-" : "") + exponent; } // Otherwise, this is an ordinary decimal number. Append ".0" if result has no // decimal/fractional part in order to match output of original codegen. if (result.find('.') == string::npos) { result += ".0"; } return result; } string FloatToString(float value) { string result = SimpleFtoa(value); return PostProcessFloat(result); } string DoubleToString(double value) { string result = SimpleDtoa(value); return PostProcessFloat(result); } // Return true if this is an integral field that should be represented as string // in JS. bool IsIntegralFieldWithStringJSType(const FieldDescriptor* field) { switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT64: case FieldDescriptor::CPPTYPE_UINT64: // The default value of JSType is JS_NORMAL, which behaves the same as // JS_NUMBER. return field->options().jstype() == google::protobuf::FieldOptions::JS_STRING; default: return false; } } string MaybeNumberString(const FieldDescriptor* field, const string& orig) { return IsIntegralFieldWithStringJSType(field) ? ("\"" + orig + "\"") : orig; } string JSFieldDefault(const FieldDescriptor* field) { if (field->is_repeated()) { return "[]"; } switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: return MaybeNumberString( field, SimpleItoa(field->default_value_int32())); case FieldDescriptor::CPPTYPE_UINT32: // The original codegen is in Java, and Java protobufs store unsigned // integer values as signed integer values. In order to exactly match the // output, we need to reinterpret as base-2 signed. Ugh. return MaybeNumberString( field, SimpleItoa(static_cast(field->default_value_uint32()))); case FieldDescriptor::CPPTYPE_INT64: return MaybeNumberString( field, SimpleItoa(field->default_value_int64())); case FieldDescriptor::CPPTYPE_UINT64: // See above note for uint32 -- reinterpreting as signed. return MaybeNumberString( field, SimpleItoa(static_cast(field->default_value_uint64()))); case FieldDescriptor::CPPTYPE_ENUM: return SimpleItoa(field->default_value_enum()->number()); case FieldDescriptor::CPPTYPE_BOOL: return field->default_value_bool() ? "true" : "false"; case FieldDescriptor::CPPTYPE_FLOAT: return FloatToString(field->default_value_float()); case FieldDescriptor::CPPTYPE_DOUBLE: return DoubleToString(field->default_value_double()); case FieldDescriptor::CPPTYPE_STRING: if (field->type() == FieldDescriptor::TYPE_STRING) { string out; bool is_valid = EscapeJSString(field->default_value_string(), &out); if (!is_valid) { // TODO(lukestebbing): Decide whether this should be a hard error. GOOGLE_LOG(WARNING) << "The default value for field " << field->full_name() << " was truncated since it contained invalid UTF-8 or" " codepoints outside the basic multilingual plane."; } return "\"" + out + "\""; } else { // Bytes return "\"" + EscapeBase64(field->default_value_string()) + "\""; } case FieldDescriptor::CPPTYPE_MESSAGE: return "null"; } GOOGLE_LOG(FATAL) << "Shouldn't reach here."; return ""; } string ProtoTypeName(const GeneratorOptions& options, const FieldDescriptor* field) { switch (field->type()) { case FieldDescriptor::TYPE_BOOL: return "bool"; case FieldDescriptor::TYPE_INT32: return "int32"; case FieldDescriptor::TYPE_UINT32: return "uint32"; case FieldDescriptor::TYPE_SINT32: return "sint32"; case FieldDescriptor::TYPE_FIXED32: return "fixed32"; case FieldDescriptor::TYPE_SFIXED32: return "sfixed32"; case FieldDescriptor::TYPE_INT64: return "int64"; case FieldDescriptor::TYPE_UINT64: return "uint64"; case FieldDescriptor::TYPE_SINT64: return "sint64"; case FieldDescriptor::TYPE_FIXED64: return "fixed64"; case FieldDescriptor::TYPE_SFIXED64: return "sfixed64"; case FieldDescriptor::TYPE_FLOAT: return "float"; case FieldDescriptor::TYPE_DOUBLE: return "double"; case FieldDescriptor::TYPE_STRING: return "string"; case FieldDescriptor::TYPE_BYTES: return "bytes"; case FieldDescriptor::TYPE_GROUP: return GetMessagePath(options, field->message_type()); case FieldDescriptor::TYPE_ENUM: return GetEnumPath(options, field->enum_type()); case FieldDescriptor::TYPE_MESSAGE: return GetMessagePath(options, field->message_type()); default: return ""; } } string JSIntegerTypeName(const FieldDescriptor* field) { return IsIntegralFieldWithStringJSType(field) ? "string" : "number"; } string JSStringTypeName(const GeneratorOptions& options, const FieldDescriptor* field, BytesMode bytes_mode) { if (field->type() == FieldDescriptor::TYPE_BYTES) { switch (bytes_mode) { case BYTES_DEFAULT: return "(string|Uint8Array)"; case BYTES_B64: return "string"; case BYTES_U8: return "Uint8Array"; default: assert(false); } } return "string"; } string JSTypeName(const GeneratorOptions& options, const FieldDescriptor* field, BytesMode bytes_mode) { switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_BOOL: return "boolean"; case FieldDescriptor::CPPTYPE_INT32: return JSIntegerTypeName(field); case FieldDescriptor::CPPTYPE_INT64: return JSIntegerTypeName(field); case FieldDescriptor::CPPTYPE_UINT32: return JSIntegerTypeName(field); case FieldDescriptor::CPPTYPE_UINT64: return JSIntegerTypeName(field); case FieldDescriptor::CPPTYPE_FLOAT: return "number"; case FieldDescriptor::CPPTYPE_DOUBLE: return "number"; case FieldDescriptor::CPPTYPE_STRING: return JSStringTypeName(options, field, bytes_mode); case FieldDescriptor::CPPTYPE_ENUM: return GetEnumPath(options, field->enum_type()); case FieldDescriptor::CPPTYPE_MESSAGE: return GetMessagePath(options, field->message_type()); default: return ""; } } // Used inside Google only -- do not remove. bool UseBrokenPresenceSemantics(const GeneratorOptions& options, const FieldDescriptor* field) { return false; } // Returns true for fields that return "null" from accessors when they are // unset. This should normally only be true for non-repeated submessages, but // we have legacy users who relied on old behavior where accessors behaved this // way. bool ReturnsNullWhenUnset(const GeneratorOptions& options, const FieldDescriptor* field) { if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && field->is_optional()) { return true; } // TODO(haberman): remove this case and unconditionally return false. return UseBrokenPresenceSemantics(options, field) && !field->is_repeated() && !field->has_default_value(); } // In a sane world, this would be the same as ReturnsNullWhenUnset(). But in // the status quo, some fields declare that they never return null/undefined // even though they actually do: // * required fields // * optional enum fields // * proto3 primitive fields. bool DeclaredReturnTypeIsNullable(const GeneratorOptions& options, const FieldDescriptor* field) { if (field->is_required() || field->type() == FieldDescriptor::TYPE_ENUM) { return false; } if (field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 && field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { return false; } return ReturnsNullWhenUnset(options, field); } bool SetterAcceptsUndefined(const GeneratorOptions& options, const FieldDescriptor* field) { if (ReturnsNullWhenUnset(options, field)) { return true; } // Broken presence semantics always accepts undefined for setters. return UseBrokenPresenceSemantics(options, field); } bool SetterAcceptsNull(const GeneratorOptions& options, const FieldDescriptor* field) { if (ReturnsNullWhenUnset(options, field)) { return true; } // With broken presence semantics, fields with defaults accept "null" for // setters, but other fields do not. This is a strange quirk of the old // codegen. return UseBrokenPresenceSemantics(options, field) && field->has_default_value(); } // Returns types which are known to by non-nullable by default. // The style guide requires that we omit "!" in this case. bool IsPrimitive(const string& type) { return type == "undefined" || type == "string" || type == "number" || type == "boolean"; } string JSFieldTypeAnnotation(const GeneratorOptions& options, const FieldDescriptor* field, bool is_setter_argument, bool force_present, bool singular_if_not_packed, BytesMode bytes_mode = BYTES_DEFAULT) { GOOGLE_CHECK(!(is_setter_argument && force_present)); string jstype = JSTypeName(options, field, bytes_mode); if (field->is_repeated() && (field->is_packed() || !singular_if_not_packed)) { if (field->type() == FieldDescriptor::TYPE_BYTES && bytes_mode == BYTES_DEFAULT) { jstype = "(Array|Array)"; } else { if (!IsPrimitive(jstype)) { jstype = "!" + jstype; } jstype = "Array.<" + jstype + ">"; } } bool is_null_or_undefined = false; if (is_setter_argument) { if (SetterAcceptsNull(options, field)) { jstype = "?" + jstype; is_null_or_undefined = true; } if (SetterAcceptsUndefined(options, field)) { jstype += "|undefined"; is_null_or_undefined = true; } } else if (force_present) { // Don't add null or undefined. } else { if (DeclaredReturnTypeIsNullable(options, field)) { jstype = "?" + jstype; is_null_or_undefined = true; } } if (!is_null_or_undefined && !IsPrimitive(jstype)) { jstype = "!" + jstype; } return jstype; } string JSBinaryReaderMethodType(const FieldDescriptor* field) { string name = field->type_name(); if (name[0] >= 'a' && name[0] <= 'z') { name[0] = (name[0] - 'a') + 'A'; } return IsIntegralFieldWithStringJSType(field) ? (name + "String") : name; } string JSBinaryReadWriteMethodName(const FieldDescriptor* field, bool is_writer) { string name = JSBinaryReaderMethodType(field); if (field->is_packed()) { name = "Packed" + name; } else if (is_writer && field->is_repeated()) { name = "Repeated" + name; } return name; } string JSBinaryReaderMethodName(const GeneratorOptions& options, const FieldDescriptor* field) { return "jspb.BinaryReader.prototype.read" + JSBinaryReadWriteMethodName(field, /* is_writer = */ false); } string JSBinaryWriterMethodName(const GeneratorOptions& options, const FieldDescriptor* field) { return "jspb.BinaryWriter.prototype.write" + JSBinaryReadWriteMethodName(field, /* is_writer = */ true); } string JSReturnClause(const FieldDescriptor* desc) { return ""; } string JSTypeTag(const FieldDescriptor* desc) { switch (desc->type()) { case FieldDescriptor::TYPE_DOUBLE: case FieldDescriptor::TYPE_FLOAT: return "Float"; case FieldDescriptor::TYPE_INT32: case FieldDescriptor::TYPE_UINT32: case FieldDescriptor::TYPE_INT64: case FieldDescriptor::TYPE_UINT64: case FieldDescriptor::TYPE_FIXED32: case FieldDescriptor::TYPE_FIXED64: case FieldDescriptor::TYPE_SINT32: case FieldDescriptor::TYPE_SINT64: case FieldDescriptor::TYPE_SFIXED32: case FieldDescriptor::TYPE_SFIXED64: if (IsIntegralFieldWithStringJSType(desc)) { return "StringInt"; } else { return "Int"; } case FieldDescriptor::TYPE_BOOL: return "Boolean"; case FieldDescriptor::TYPE_STRING: return "String"; case FieldDescriptor::TYPE_BYTES: return "Bytes"; case FieldDescriptor::TYPE_ENUM: return "Enum"; default: assert(false); } return ""; } string JSReturnDoc(const GeneratorOptions& options, const FieldDescriptor* desc) { return ""; } bool HasRepeatedFields(const GeneratorOptions& options, const Descriptor* desc) { for (int i = 0; i < desc->field_count(); i++) { if (desc->field(i)->is_repeated() && !IsMap(options, desc->field(i))) { return true; } } return false; } static const char* kRepeatedFieldArrayName = ".repeatedFields_"; string RepeatedFieldsArrayName(const GeneratorOptions& options, const Descriptor* desc) { return HasRepeatedFields(options, desc) ? (GetMessagePath(options, desc) + kRepeatedFieldArrayName) : "null"; } bool HasOneofFields(const Descriptor* desc) { for (int i = 0; i < desc->field_count(); i++) { if (desc->field(i)->containing_oneof()) { return true; } } return false; } static const char* kOneofGroupArrayName = ".oneofGroups_"; string OneofFieldsArrayName(const GeneratorOptions& options, const Descriptor* desc) { return HasOneofFields(desc) ? (GetMessagePath(options, desc) + kOneofGroupArrayName) : "null"; } string RepeatedFieldNumberList(const GeneratorOptions& options, const Descriptor* desc) { std::vector numbers; for (int i = 0; i < desc->field_count(); i++) { if (desc->field(i)->is_repeated() && !IsMap(options, desc->field(i))) { numbers.push_back(JSFieldIndex(desc->field(i))); } } return "[" + Join(numbers, ",") + "]"; } string OneofGroupList(const Descriptor* desc) { // List of arrays (one per oneof), each of which is a list of field indices std::vector oneof_entries; for (int i = 0; i < desc->oneof_decl_count(); i++) { const OneofDescriptor* oneof = desc->oneof_decl(i); if (IgnoreOneof(oneof)) { continue; } std::vector oneof_fields; for (int j = 0; j < oneof->field_count(); j++) { if (IgnoreField(oneof->field(j))) { continue; } oneof_fields.push_back(JSFieldIndex(oneof->field(j))); } oneof_entries.push_back("[" + Join(oneof_fields, ",") + "]"); } return "[" + Join(oneof_entries, ",") + "]"; } string JSOneofArray(const GeneratorOptions& options, const FieldDescriptor* field) { return OneofFieldsArrayName(options, field->containing_type()) + "[" + JSOneofIndex(field->containing_oneof()) + "]"; } string RelativeTypeName(const FieldDescriptor* field) { assert(field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM || field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE); // For a field with an enum or message type, compute a name relative to the // path name of the message type containing this field. string package = field->file()->package(); string containing_type = field->containing_type()->full_name() + "."; string type = (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) ? field->enum_type()->full_name() : field->message_type()->full_name(); // |prefix| is advanced as we find separators '.' past the common package // prefix that yield common prefixes in the containing type's name and this // type's name. int prefix = 0; for (int i = 0; i < type.size() && i < containing_type.size(); i++) { if (type[i] != containing_type[i]) { break; } if (type[i] == '.' && i >= package.size()) { prefix = i + 1; } } return type.substr(prefix); } string JSExtensionsObjectName(const GeneratorOptions& options, const FileDescriptor* from_file, const Descriptor* desc) { if (desc->full_name() == "google.protobuf.bridge.MessageSet") { // TODO(haberman): fix this for the kImportCommonJs case. return "jspb.Message.messageSetExtensions"; } else { return MaybeCrossFileRef(options, from_file, desc) + ".extensions"; } } static const int kMapKeyField = 1; static const int kMapValueField = 2; const FieldDescriptor* MapFieldKey(const FieldDescriptor* field) { assert(field->is_map()); return field->message_type()->FindFieldByNumber(kMapKeyField); } const FieldDescriptor* MapFieldValue(const FieldDescriptor* field) { assert(field->is_map()); return field->message_type()->FindFieldByNumber(kMapValueField); } string FieldDefinition(const GeneratorOptions& options, const FieldDescriptor* field) { if (IsMap(options, field)) { const FieldDescriptor* key_field = MapFieldKey(field); const FieldDescriptor* value_field = MapFieldValue(field); string key_type = ProtoTypeName(options, key_field); string value_type; if (value_field->type() == FieldDescriptor::TYPE_ENUM || value_field->type() == FieldDescriptor::TYPE_MESSAGE) { value_type = RelativeTypeName(value_field); } else { value_type = ProtoTypeName(options, value_field); } return StringPrintf("map<%s, %s> %s = %d;", key_type.c_str(), value_type.c_str(), field->name().c_str(), field->number()); } else { string qualifier = field->is_repeated() ? "repeated" : (field->is_optional() ? "optional" : "required"); string type, name; if (field->type() == FieldDescriptor::TYPE_ENUM || field->type() == FieldDescriptor::TYPE_MESSAGE) { type = RelativeTypeName(field); name = field->name(); } else if (field->type() == FieldDescriptor::TYPE_GROUP) { type = "group"; name = field->message_type()->name(); } else { type = ProtoTypeName(options, field); name = field->name(); } return StringPrintf("%s %s %s = %d;", qualifier.c_str(), type.c_str(), name.c_str(), field->number()); } } string FieldComments(const FieldDescriptor* field, BytesMode bytes_mode) { string comments; if (field->cpp_type() == FieldDescriptor::CPPTYPE_BOOL) { comments += " * Note that Boolean fields may be set to 0/1 when serialized from " "a Java server.\n" " * You should avoid comparisons like {@code val === true/false} in " "those cases.\n"; } if (field->type() == FieldDescriptor::TYPE_BYTES && bytes_mode == BYTES_U8) { comments += " * Note that Uint8Array is not supported on all browsers.\n" " * @see http://caniuse.com/Uint8Array\n"; } return comments; } bool ShouldGenerateExtension(const FieldDescriptor* field) { return field->is_extension() && !IgnoreField(field); } bool HasExtensions(const Descriptor* desc) { for (int i = 0; i < desc->extension_count(); i++) { if (ShouldGenerateExtension(desc->extension(i))) { return true; } } for (int i = 0; i < desc->nested_type_count(); i++) { if (HasExtensions(desc->nested_type(i))) { return true; } } return false; } bool HasExtensions(const FileDescriptor* file) { for (int i = 0; i < file->extension_count(); i++) { if (ShouldGenerateExtension(file->extension(i))) { return true; } } for (int i = 0; i < file->message_type_count(); i++) { if (HasExtensions(file->message_type(i))) { return true; } } return false; } bool HasMap(const GeneratorOptions& options, const Descriptor* desc) { for (int i = 0; i < desc->field_count(); i++) { if (IsMap(options, desc->field(i))) { return true; } } for (int i = 0; i < desc->nested_type_count(); i++) { if (HasMap(options, desc->nested_type(i))) { return true; } } return false; } bool FileHasMap(const GeneratorOptions& options, const FileDescriptor* desc) { for (int i = 0; i < desc->message_type_count(); i++) { if (HasMap(options, desc->message_type(i))) { return true; } } return false; } bool IsExtendable(const Descriptor* desc) { return desc->extension_range_count() > 0; } // Returns the max index in the underlying data storage array beyond which the // extension object is used. string GetPivot(const Descriptor* desc) { static const int kDefaultPivot = 500; // Find the max field number int max_field_number = 0; for (int i = 0; i < desc->field_count(); i++) { if (!IgnoreField(desc->field(i)) && desc->field(i)->number() > max_field_number) { max_field_number = desc->field(i)->number(); } } int pivot = -1; if (IsExtendable(desc) || (max_field_number >= kDefaultPivot)) { pivot = ((max_field_number + 1) < kDefaultPivot) ? (max_field_number + 1) : kDefaultPivot; } return SimpleItoa(pivot); } // Whether this field represents presence. For fields with presence, we // generate extra methods (clearFoo() and hasFoo()) for this field. bool HasFieldPresence(const GeneratorOptions& options, const FieldDescriptor* field) { if (field->is_repeated() || field->is_map()) { // We say repeated fields and maps don't have presence, but we still do // generate clearFoo() methods for them through a special case elsewhere. return false; } if (UseBrokenPresenceSemantics(options, field)) { // Proto3 files with broken presence semantics have field presence. return true; } return field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE || field->containing_oneof() != NULL || field->file()->syntax() == FileDescriptor::SYNTAX_PROTO2; } // We use this to implement the semantics that same file can be generated // multiple times, but the last one wins. We never actually write the files, // but we keep a set of which descriptors were the final one for a given // filename. class FileDeduplicator { public: explicit FileDeduplicator(const GeneratorOptions& options) : error_on_conflict_(options.error_on_name_conflict) {} bool AddFile(const string& filename, const void* desc, string* error) { if (descs_by_filename_.find(filename) != descs_by_filename_.end()) { if (error_on_conflict_) { *error = "Name conflict: file name " + filename + " would be generated by two descriptors"; return false; } allowed_descs_.erase(descs_by_filename_[filename]); } descs_by_filename_[filename] = desc; allowed_descs_.insert(desc); return true; } void GetAllowedSet(std::set* allowed_set) { *allowed_set = allowed_descs_; } private: bool error_on_conflict_; std::map descs_by_filename_; std::set allowed_descs_; }; void DepthFirstSearch(const FileDescriptor* file, std::vector* list, std::set* seen) { if (!seen->insert(file).second) { return; } // Add all dependencies. for (int i = 0; i < file->dependency_count(); i++) { DepthFirstSearch(file->dependency(i), list, seen); } // Add this file. list->push_back(file); } // A functor for the predicate to remove_if() below. Returns true if a given // FileDescriptor is not in the given set. class NotInSet { public: explicit NotInSet(const std::set& file_set) : file_set_(file_set) {} bool operator()(const FileDescriptor* file) { return file_set_.count(file) == 0; } private: const std::set& file_set_; }; // This function generates an ordering of the input FileDescriptors that matches // the logic of the old code generator. The order is significant because two // different input files can generate the same output file, and the last one // needs to win. void GenerateJspbFileOrder(const std::vector& input, std::vector* ordered) { // First generate an ordering of all reachable files (including dependencies) // with depth-first search. This mimics the behavior of --include_imports, // which is what the old codegen used. ordered->clear(); std::set seen; std::set input_set; for (int i = 0; i < input.size(); i++) { DepthFirstSearch(input[i], ordered, &seen); input_set.insert(input[i]); } // Now remove the entries that are not actually in our input list. ordered->erase( std::remove_if(ordered->begin(), ordered->end(), NotInSet(input_set)), ordered->end()); } // If we're generating code in file-per-type mode, avoid overwriting files // by choosing the last descriptor that writes each filename and permitting // only those to generate code. bool GenerateJspbAllowedSet(const GeneratorOptions& options, const std::vector& files, std::set* allowed_set, string* error) { std::vector files_ordered; GenerateJspbFileOrder(files, &files_ordered); // Choose the last descriptor for each filename. FileDeduplicator dedup(options); for (int i = 0; i < files_ordered.size(); i++) { for (int j = 0; j < files_ordered[i]->message_type_count(); j++) { const Descriptor* desc = files_ordered[i]->message_type(j); if (!dedup.AddFile(GetMessageFileName(options, desc), desc, error)) { return false; } } for (int j = 0; j < files_ordered[i]->enum_type_count(); j++) { const EnumDescriptor* desc = files_ordered[i]->enum_type(j); if (!dedup.AddFile(GetEnumFileName(options, desc), desc, error)) { return false; } } // Pull out all free-floating extensions and generate files for those too. bool has_extension = false; for (int j = 0; j < files_ordered[i]->extension_count(); j++) { if (ShouldGenerateExtension(files_ordered[i]->extension(j))) { has_extension = true; } } if (has_extension) { if (!dedup.AddFile(GetExtensionFileName(options, files_ordered[i]), files_ordered[i], error)) { return false; } } } dedup.GetAllowedSet(allowed_set); return true; } } // anonymous namespace void Generator::GenerateHeader(const GeneratorOptions& options, io::Printer* printer) const { printer->Print("/**\n" " * @fileoverview\n" " * @enhanceable\n" " * @suppress {messageConventions} JS Compiler reports an " "error if a variable or\n" " * field starts with 'MSG_' and isn't a translatable " "message.\n" " * @public\n" " */\n" "// GENERATED CODE -- DO NOT EDIT!\n" "\n"); } void Generator::FindProvidesForFile(const GeneratorOptions& options, io::Printer* printer, const FileDescriptor* file, std::set* provided) const { for (int i = 0; i < file->message_type_count(); i++) { FindProvidesForMessage(options, printer, file->message_type(i), provided); } for (int i = 0; i < file->enum_type_count(); i++) { FindProvidesForEnum(options, printer, file->enum_type(i), provided); } } void Generator::FindProvides(const GeneratorOptions& options, io::Printer* printer, const std::vector& files, std::set* provided) const { for (int i = 0; i < files.size(); i++) { FindProvidesForFile(options, printer, files[i], provided); } printer->Print("\n"); } void Generator::FindProvidesForMessage( const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc, std::set* provided) const { if (IgnoreMessage(options, desc)) { return; } string name = GetMessagePath(options, desc); provided->insert(name); for (int i = 0; i < desc->enum_type_count(); i++) { FindProvidesForEnum(options, printer, desc->enum_type(i), provided); } for (int i = 0; i < desc->nested_type_count(); i++) { FindProvidesForMessage(options, printer, desc->nested_type(i), provided); } } void Generator::FindProvidesForEnum(const GeneratorOptions& options, io::Printer* printer, const EnumDescriptor* enumdesc, std::set* provided) const { string name = GetEnumPath(options, enumdesc); provided->insert(name); } void Generator::FindProvidesForFields( const GeneratorOptions& options, io::Printer* printer, const std::vector& fields, std::set* provided) const { for (int i = 0; i < fields.size(); i++) { const FieldDescriptor* field = fields[i]; if (IgnoreField(field)) { continue; } string name = GetFilePath(options, field->file()) + "." + JSObjectFieldName(options, field); provided->insert(name); } } void Generator::GenerateProvides(const GeneratorOptions& options, io::Printer* printer, std::set* provided) const { for (std::set::iterator it = provided->begin(); it != provided->end(); ++it) { if (options.import_style == GeneratorOptions::kImportClosure) { printer->Print("goog.provide('$name$');\n", "name", *it); } else { // We aren't using Closure's import system, but we use goog.exportSymbol() // to construct the expected tree of objects, eg. // // goog.exportSymbol('foo.bar.Baz', null, this); // // // Later generated code expects foo.bar = {} to exist: // foo.bar.Baz = function() { /* ... */ } printer->Print("goog.exportSymbol('$name$', null, global);\n", "name", *it); } } } void Generator::GenerateRequiresForMessage(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc, std::set* provided) const { std::set required; std::set forwards; bool have_message = false; FindRequiresForMessage(options, desc, &required, &forwards, &have_message); GenerateRequiresImpl(options, printer, &required, &forwards, provided, /* require_jspb = */ have_message, /* require_extension = */ HasExtensions(desc), /* require_map = */ HasMap(options, desc)); } void Generator::GenerateRequiresForLibrary( const GeneratorOptions& options, io::Printer* printer, const std::vector& files, std::set* provided) const { GOOGLE_CHECK_EQ(options.import_style, GeneratorOptions::kImportClosure); // For Closure imports we need to import every message type individually. std::set required; std::set forwards; bool have_extensions = false; bool have_map = false; bool have_message = false; for (int i = 0; i < files.size(); i++) { for (int j = 0; j < files[i]->message_type_count(); j++) { const Descriptor* desc = files[i]->message_type(j); if (!IgnoreMessage(options, desc)) { FindRequiresForMessage(options, desc, &required, &forwards, &have_message); } } if (!have_extensions && HasExtensions(files[i])) { have_extensions = true; } if (!have_map && FileHasMap(options, files[i])) { have_map = true; } for (int j = 0; j < files[i]->extension_count(); j++) { const FieldDescriptor* extension = files[i]->extension(j); if (IgnoreField(extension)) { continue; } if (extension->containing_type()->full_name() != "google.protobuf.bridge.MessageSet") { required.insert(GetMessagePath(options, extension->containing_type())); } FindRequiresForField(options, extension, &required, &forwards); have_extensions = true; } } GenerateRequiresImpl(options, printer, &required, &forwards, provided, /* require_jspb = */ have_message, /* require_extension = */ have_extensions, /* require_map = */ have_map); } void Generator::GenerateRequiresForExtensions( const GeneratorOptions& options, io::Printer* printer, const std::vector& fields, std::set* provided) const { std::set required; std::set forwards; for (int i = 0; i < fields.size(); i++) { const FieldDescriptor* field = fields[i]; if (IgnoreField(field)) { continue; } FindRequiresForExtension(options, field, &required, &forwards); } GenerateRequiresImpl(options, printer, &required, &forwards, provided, /* require_jspb = */ false, /* require_extension = */ fields.size() > 0, /* require_map = */ false); } void Generator::GenerateRequiresImpl(const GeneratorOptions& options, io::Printer* printer, std::set* required, std::set* forwards, std::set* provided, bool require_jspb, bool require_extension, bool require_map) const { if (require_jspb) { required->insert("jspb.Message"); required->insert("jspb.BinaryReader"); required->insert("jspb.BinaryWriter"); } if (require_extension) { required->insert("jspb.ExtensionFieldBinaryInfo"); required->insert("jspb.ExtensionFieldInfo"); } if (require_map) { required->insert("jspb.Map"); } std::set::iterator it; for (it = required->begin(); it != required->end(); ++it) { if (provided->find(*it) != provided->end()) { continue; } printer->Print("goog.require('$name$');\n", "name", *it); } printer->Print("\n"); for (it = forwards->begin(); it != forwards->end(); ++it) { if (provided->find(*it) != provided->end()) { continue; } printer->Print("goog.forwardDeclare('$name$');\n", "name", *it); } } bool NamespaceOnly(const Descriptor* desc) { return false; } void Generator::FindRequiresForMessage( const GeneratorOptions& options, const Descriptor* desc, std::set* required, std::set* forwards, bool* have_message) const { if (!NamespaceOnly(desc)) { *have_message = true; for (int i = 0; i < desc->field_count(); i++) { const FieldDescriptor* field = desc->field(i); if (IgnoreField(field)) { continue; } FindRequiresForField(options, field, required, forwards); } } for (int i = 0; i < desc->extension_count(); i++) { const FieldDescriptor* field = desc->extension(i); if (IgnoreField(field)) { continue; } FindRequiresForExtension(options, field, required, forwards); } for (int i = 0; i < desc->nested_type_count(); i++) { FindRequiresForMessage(options, desc->nested_type(i), required, forwards, have_message); } } void Generator::FindRequiresForField(const GeneratorOptions& options, const FieldDescriptor* field, std::set* required, std::set* forwards) const { if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM && // N.B.: file-level extensions with enum type do *not* create // dependencies, as per original codegen. !(field->is_extension() && field->extension_scope() == NULL)) { if (options.add_require_for_enums) { required->insert(GetEnumPath(options, field->enum_type())); } else { forwards->insert(GetEnumPath(options, field->enum_type())); } } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { if (!IgnoreMessage(options, field->message_type())) { required->insert(GetMessagePath(options, field->message_type())); } } } void Generator::FindRequiresForExtension(const GeneratorOptions& options, const FieldDescriptor* field, std::set* required, std::set* forwards) const { if (field->containing_type()->full_name() != "google.protobuf.bridge.MessageSet") { required->insert(GetMessagePath(options, field->containing_type())); } FindRequiresForField(options, field, required, forwards); } void Generator::GenerateTestOnly(const GeneratorOptions& options, io::Printer* printer) const { if (options.testonly) { printer->Print("goog.setTestOnly();\n\n"); } printer->Print("\n"); } void Generator::GenerateClassesAndEnums(const GeneratorOptions& options, io::Printer* printer, const FileDescriptor* file) const { for (int i = 0; i < file->message_type_count(); i++) { GenerateClass(options, printer, file->message_type(i)); } for (int i = 0; i < file->enum_type_count(); i++) { GenerateEnum(options, printer, file->enum_type(i)); } } void Generator::GenerateClass(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const { if (IgnoreMessage(options, desc)) { return; } if (!NamespaceOnly(desc)) { printer->Print("\n"); GenerateClassConstructor(options, printer, desc); GenerateClassFieldInfo(options, printer, desc); GenerateClassToObject(options, printer, desc); // These must come *before* the extension-field info generation in // GenerateClassRegistration so that references to the binary // serialization/deserialization functions may be placed in the extension // objects. GenerateClassDeserializeBinary(options, printer, desc); GenerateClassSerializeBinary(options, printer, desc); } // Recurse on nested types. These must come *before* the extension-field // info generation in GenerateClassRegistration so that extensions that // reference nested types proceed the definitions of the nested types. for (int i = 0; i < desc->enum_type_count(); i++) { GenerateEnum(options, printer, desc->enum_type(i)); } for (int i = 0; i < desc->nested_type_count(); i++) { GenerateClass(options, printer, desc->nested_type(i)); } if (!NamespaceOnly(desc)) { GenerateClassRegistration(options, printer, desc); GenerateClassFields(options, printer, desc); if (IsExtendable(desc) && desc->full_name() != "google.protobuf.bridge.MessageSet") { GenerateClassExtensionFieldInfo(options, printer, desc); } if (options.import_style != GeneratorOptions::kImportClosure) { for (int i = 0; i < desc->extension_count(); i++) { GenerateExtension(options, printer, desc->extension(i)); } } } } void Generator::GenerateClassConstructor(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const { printer->Print( "/**\n" " * Generated by JsPbCodeGenerator.\n" " * @param {Array=} opt_data Optional initial data array, typically " "from a\n" " * server response, or constructed directly in Javascript. The array " "is used\n" " * in place and becomes part of the constructed object. It is not " "cloned.\n" " * If no data is provided, the constructed object will be empty, but " "still\n" " * valid.\n" " * @extends {jspb.Message}\n" " * @constructor\n" " */\n" "$classprefix$$classname$ = function(opt_data) {\n", "classprefix", GetMessagePathPrefix(options, desc), "classname", desc->name()); printer->Annotate("classname", desc); string message_id = GetMessageId(desc); printer->Print( " jspb.Message.initialize(this, opt_data, $messageId$, $pivot$, " "$rptfields$, $oneoffields$);\n", "messageId", !message_id.empty() ? ("'" + message_id + "'") : (IsResponse(desc) ? "''" : "0"), "pivot", GetPivot(desc), "rptfields", RepeatedFieldsArrayName(options, desc), "oneoffields", OneofFieldsArrayName(options, desc)); printer->Print( "};\n" "goog.inherits($classname$, jspb.Message);\n" "if (goog.DEBUG && !COMPILED) {\n" " $classname$.displayName = '$classname$';\n" "}\n", "classname", GetMessagePath(options, desc)); } void Generator::GenerateClassFieldInfo(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const { if (HasRepeatedFields(options, desc)) { printer->Print( "/**\n" " * List of repeated fields within this message type.\n" " * @private {!Array}\n" " * @const\n" " */\n" "$classname$$rptfieldarray$ = $rptfields$;\n" "\n", "classname", GetMessagePath(options, desc), "rptfieldarray", kRepeatedFieldArrayName, "rptfields", RepeatedFieldNumberList(options, desc)); } if (HasOneofFields(desc)) { printer->Print( "/**\n" " * Oneof group definitions for this message. Each group defines the " "field\n" " * numbers belonging to that group. When of these fields' value is " "set, all\n" " * other fields in the group are cleared. During deserialization, if " "multiple\n" " * fields are encountered for a group, only the last value seen will " "be kept.\n" " * @private {!Array>}\n" " * @const\n" " */\n" "$classname$$oneofgrouparray$ = $oneofgroups$;\n" "\n", "classname", GetMessagePath(options, desc), "oneofgrouparray", kOneofGroupArrayName, "oneofgroups", OneofGroupList(desc)); for (int i = 0; i < desc->oneof_decl_count(); i++) { if (IgnoreOneof(desc->oneof_decl(i))) { continue; } GenerateOneofCaseDefinition(options, printer, desc->oneof_decl(i)); } } } void Generator::GenerateClassXid(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const { printer->Print( "\n" "\n" "$class$.prototype.messageXid = xid('$class$');\n", "class", GetMessagePath(options, desc)); } void Generator::GenerateOneofCaseDefinition( const GeneratorOptions& options, io::Printer* printer, const OneofDescriptor* oneof) const { printer->Print( "/**\n" " * @enum {number}\n" " */\n" "$classname$.$oneof$Case = {\n" " $upcase$_NOT_SET: 0", "classname", GetMessagePath(options, oneof->containing_type()), "oneof", JSOneofName(oneof), "upcase", ToEnumCase(oneof->name())); for (int i = 0; i < oneof->field_count(); i++) { if (IgnoreField(oneof->field(i))) { continue; } printer->Print( ",\n" " $upcase$: $number$", "upcase", ToEnumCase(oneof->field(i)->name()), "number", JSFieldIndex(oneof->field(i))); } printer->Print( "\n" "};\n" "\n" "/**\n" " * @return {$class$.$oneof$Case}\n" " */\n" "$class$.prototype.get$oneof$Case = function() {\n" " return /** @type {$class$.$oneof$Case} */(jspb.Message." "computeOneofCase(this, $class$.oneofGroups_[$oneofindex$]));\n" "};\n" "\n", "class", GetMessagePath(options, oneof->containing_type()), "oneof", JSOneofName(oneof), "oneofindex", JSOneofIndex(oneof)); } void Generator::GenerateClassToObject(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const { printer->Print( "\n" "\n" "if (jspb.Message.GENERATE_TO_OBJECT) {\n" "/**\n" " * Creates an object representation of this proto suitable for use in " "Soy templates.\n" " * Field names that are reserved in JavaScript and will be renamed to " "pb_name.\n" " * To access a reserved field use, foo.pb_, eg, foo.pb_default.\n" " * For the list of reserved names please see:\n" " * com.google.apps.jspb.JsClassTemplate.JS_RESERVED_WORDS.\n" " * @param {boolean=} opt_includeInstance Whether to include the JSPB " "instance\n" " * for transitional soy proto support: http://goto/soy-param-" "migration\n" " * @return {!Object}\n" " */\n" "$classname$.prototype.toObject = function(opt_includeInstance) {\n" " return $classname$.toObject(opt_includeInstance, this);\n" "};\n" "\n" "\n" "/**\n" " * Static version of the {@see toObject} method.\n" " * @param {boolean|undefined} includeInstance Whether to include the " "JSPB\n" " * instance for transitional soy proto support:\n" " * http://goto/soy-param-migration\n" " * @param {!$classname$} msg The msg instance to transform.\n" " * @return {!Object}\n" " * @suppress {unusedLocalVariables} f is only used for nested messages\n" " */\n" "$classname$.toObject = function(includeInstance, msg) {\n" " var f, obj = {", "classname", GetMessagePath(options, desc)); bool first = true; for (int i = 0; i < desc->field_count(); i++) { const FieldDescriptor* field = desc->field(i); if (IgnoreField(field)) { continue; } if (!first) { printer->Print(",\n "); } else { printer->Print("\n "); first = false; } GenerateClassFieldToObject(options, printer, field); } if (!first) { printer->Print("\n };\n\n"); } else { printer->Print("\n\n };\n\n"); } if (IsExtendable(desc)) { printer->Print( " jspb.Message.toObjectExtension(/** @type {!jspb.Message} */ (msg), " "obj,\n" " $extObject$, $class$.prototype.getExtension,\n" " includeInstance);\n", "extObject", JSExtensionsObjectName(options, desc->file(), desc), "class", GetMessagePath(options, desc)); } printer->Print( " if (includeInstance) {\n" " obj.$$jspbMessageInstance = msg;\n" " }\n" " return obj;\n" "};\n" "}\n" "\n" "\n", "classname", GetMessagePath(options, desc)); } void Generator::GenerateFieldValueExpression(io::Printer* printer, const char *obj_reference, const FieldDescriptor* field, bool use_default) const { bool is_float_or_double = field->cpp_type() == FieldDescriptor::CPPTYPE_FLOAT || field->cpp_type() == FieldDescriptor::CPPTYPE_DOUBLE; if (use_default) { if (is_float_or_double) { // Coerce "Nan" and "Infinity" to actual float values. // // This will change null to 0, but that doesn't matter since we're getting // with a default. printer->Print("+"); } printer->Print( "jspb.Message.getFieldWithDefault($obj$, $index$, $default$)", "obj", obj_reference, "index", JSFieldIndex(field), "default", JSFieldDefault(field)); } else { if (is_float_or_double) { if (field->is_required()) { // Use "+" to convert all fields to numeric (including null). printer->Print( "+jspb.Message.getField($obj$, $index$)", "index", JSFieldIndex(field), "obj", obj_reference); } else { // Converts "NaN" and "Infinity" while preserving null. printer->Print( "jspb.Message.get$cardinality$FloatingPointField($obj$, $index$)", "cardinality", field->is_repeated() ? "Repeated" : "Optional", "index", JSFieldIndex(field), "obj", obj_reference); } } else { printer->Print("jspb.Message.get$cardinality$Field($obj$, $index$)", "cardinality", field->is_repeated() ? "Repeated" : "", "index", JSFieldIndex(field), "obj", obj_reference); } } } void Generator::GenerateClassFieldToObject(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const { printer->Print("$fieldname$: ", "fieldname", JSObjectFieldName(options, field)); if (IsMap(options, field)) { const FieldDescriptor* value_field = MapFieldValue(field); // If the map values are of a message type, we must provide their static // toObject() method; otherwise we pass undefined for that argument. string value_to_object; if (value_field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { value_to_object = GetMessagePath(options, value_field->message_type()) + ".toObject"; } else { value_to_object = "undefined"; } printer->Print( "(f = msg.get$name$()) ? f.toObject(includeInstance, $valuetoobject$) " ": []", "name", JSGetterName(options, field), "valuetoobject", value_to_object); } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { // Message field. if (field->is_repeated()) { { printer->Print("jspb.Message.toObjectList(msg.get$getter$(),\n" " $type$.toObject, includeInstance)", "getter", JSGetterName(options, field), "type", SubmessageTypeRef(options, field)); } } else { printer->Print("(f = msg.get$getter$()) && " "$type$.toObject(includeInstance, f)", "getter", JSGetterName(options, field), "type", SubmessageTypeRef(options, field)); } } else if (field->type() == FieldDescriptor::TYPE_BYTES) { // For bytes fields we want to always return the B64 data. printer->Print("msg.get$getter$()", "getter", JSGetterName(options, field, BYTES_B64)); } else { bool use_default = field->has_default_value(); if (field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 && // Repeated fields get initialized to their default in the constructor // (why?), so we emit a plain getField() call for them. !field->is_repeated() && !UseBrokenPresenceSemantics(options, field)) { // Proto3 puts all defaults (including implicit defaults) in toObject(). // But for proto2 we leave the existing semantics unchanged: unset fields // without default are unset. use_default = true; } // We don't implement this by calling the accessors, because the semantics // of the accessors are changing independently of the toObject() semantics. // We are migrating the accessors to return defaults instead of null, but // it may take longer to migrate toObject (or we might not want to do it at // all). So we want to generate independent code. GenerateFieldValueExpression(printer, "msg", field, use_default); } } void Generator::GenerateClassFromObject(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const { printer->Print( "if (jspb.Message.GENERATE_FROM_OBJECT) {\n" "/**\n" " * Loads data from an object into a new instance of this proto.\n" " * @param {!Object} obj The object representation of this proto to\n" " * load the data from.\n" " * @return {!$classname$}\n" " */\n" "$classname$.fromObject = function(obj) {\n" " var f, msg = new $classname$();\n", "classname", GetMessagePath(options, desc)); for (int i = 0; i < desc->field_count(); i++) { const FieldDescriptor* field = desc->field(i); GenerateClassFieldFromObject(options, printer, field); } printer->Print( " return msg;\n" "};\n" "}\n"); } void Generator::GenerateClassFieldFromObject( const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const { if (IsMap(options, field)) { const FieldDescriptor* value_field = MapFieldValue(field); if (value_field->type() == FieldDescriptor::TYPE_MESSAGE) { // Since the map values are of message type, we have to do some extra work // to recursively call fromObject() on them before setting the map field. printer->Print( " goog.isDef(obj.$name$) && jspb.Message.setWrapperField(\n" " msg, $index$, jspb.Map.fromObject(obj.$name$, $fieldclass$, " "$fieldclass$.fromObject));\n", "name", JSObjectFieldName(options, field), "index", JSFieldIndex(field), "fieldclass", GetMessagePath(options, value_field->message_type())); } else { // `msg` is a newly-constructed message object that has not yet built any // map containers wrapping underlying arrays, so we can simply directly // set the array here without fear of a stale wrapper. printer->Print( " goog.isDef(obj.$name$) && " "jspb.Message.setField(msg, $index$, obj.$name$);\n", "name", JSObjectFieldName(options, field), "index", JSFieldIndex(field)); } } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { // Message field (singular or repeated) if (field->is_repeated()) { { printer->Print( " goog.isDef(obj.$name$) && " "jspb.Message.setRepeatedWrapperField(\n" " msg, $index$, goog.array.map(obj.$name$, function(i) {\n" " return $fieldclass$.fromObject(i);\n" " }));\n", "name", JSObjectFieldName(options, field), "index", JSFieldIndex(field), "fieldclass", SubmessageTypeRef(options, field)); } } else { printer->Print( " goog.isDef(obj.$name$) && jspb.Message.setWrapperField(\n" " msg, $index$, $fieldclass$.fromObject(obj.$name$));\n", "name", JSObjectFieldName(options, field), "index", JSFieldIndex(field), "fieldclass", SubmessageTypeRef(options, field)); } } else { // Simple (primitive) field. printer->Print( " goog.isDef(obj.$name$) && jspb.Message.setField(msg, $index$, " "obj.$name$);\n", "name", JSObjectFieldName(options, field), "index", JSFieldIndex(field)); } } void Generator::GenerateClassRegistration(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const { // Register any extensions defined inside this message type. for (int i = 0; i < desc->extension_count(); i++) { const FieldDescriptor* extension = desc->extension(i); if (ShouldGenerateExtension(extension)) { GenerateExtension(options, printer, extension); } } } void Generator::GenerateClassFields(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const { for (int i = 0; i < desc->field_count(); i++) { if (!IgnoreField(desc->field(i))) { GenerateClassField(options, printer, desc->field(i)); } } } void GenerateBytesWrapper(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field, BytesMode bytes_mode) { string type = JSFieldTypeAnnotation( options, field, /* is_setter_argument = */ false, /* force_present = */ false, /* singular_if_not_packed = */ false, bytes_mode); printer->Print( "/**\n" " * $fielddef$\n" "$comment$" " * This is a type-conversion wrapper around `get$defname$()`\n" " * @return {$type$}\n" " */\n" "$class$.prototype.get$name$ = function() {\n" " return /** @type {$type$} */ (jspb.Message.bytes$list$As$suffix$(\n" " this.get$defname$()));\n" "};\n" "\n" "\n", "fielddef", FieldDefinition(options, field), "comment", FieldComments(field, bytes_mode), "type", type, "class", GetMessagePath(options, field->containing_type()), "name", JSGetterName(options, field, bytes_mode), "list", field->is_repeated() ? "List" : "", "suffix", JSByteGetterSuffix(bytes_mode), "defname", JSGetterName(options, field, BYTES_DEFAULT)); } void Generator::GenerateClassField(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const { if (IsMap(options, field)) { const FieldDescriptor* key_field = MapFieldKey(field); const FieldDescriptor* value_field = MapFieldValue(field); // Map field: special handling to instantiate the map object on demand. string key_type = JSFieldTypeAnnotation( options, key_field, /* is_setter_argument = */ false, /* force_present = */ true, /* singular_if_not_packed = */ false); string value_type = JSFieldTypeAnnotation( options, value_field, /* is_setter_argument = */ false, /* force_present = */ true, /* singular_if_not_packed = */ false); printer->Print( "/**\n" " * $fielddef$\n" " * @param {boolean=} opt_noLazyCreate Do not create the map if\n" " * empty, instead returning `undefined`\n" " * @return {!jspb.Map<$keytype$,$valuetype$>}\n" " */\n", "fielddef", FieldDefinition(options, field), "keytype", key_type, "valuetype", value_type); printer->Print( "$class$.prototype.$gettername$ = function(opt_noLazyCreate) {\n" " return /** @type {!jspb.Map<$keytype$,$valuetype$>} */ (\n", "class", GetMessagePath(options, field->containing_type()), "gettername", "get" + JSGetterName(options, field), "keytype", key_type, "valuetype", value_type); printer->Annotate("gettername", field); printer->Print( " jspb.Message.getMapField(this, $index$, opt_noLazyCreate", "index", JSFieldIndex(field)); if (value_field->type() == FieldDescriptor::TYPE_MESSAGE) { printer->Print( ",\n" " $messageType$", "messageType", GetMessagePath(options, value_field->message_type())); } else { printer->Print(",\n" " null"); } printer->Print( "));\n"); printer->Print( "};\n" "\n" "\n"); } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { // Message field: special handling in order to wrap the underlying data // array with a message object. printer->Print( "/**\n" " * $fielddef$\n" "$comment$" " * @return {$type$}\n" " */\n", "fielddef", FieldDefinition(options, field), "comment", FieldComments(field, BYTES_DEFAULT), "type", JSFieldTypeAnnotation(options, field, /* is_setter_argument = */ false, /* force_present = */ false, /* singular_if_not_packed = */ false)); printer->Print( "$class$.prototype.$gettername$ = function() {\n" " return /** @type{$type$} */ (\n" " jspb.Message.get$rpt$WrapperField(this, $wrapperclass$, " "$index$$required$));\n" "};\n" "\n" "\n", "class", GetMessagePath(options, field->containing_type()), "gettername", "get" + JSGetterName(options, field), "type", JSFieldTypeAnnotation(options, field, /* is_setter_argument = */ false, /* force_present = */ false, /* singular_if_not_packed = */ false), "rpt", (field->is_repeated() ? "Repeated" : ""), "index", JSFieldIndex(field), "wrapperclass", SubmessageTypeRef(options, field), "required", (field->label() == FieldDescriptor::LABEL_REQUIRED ? ", 1" : "")); printer->Annotate("gettername", field); printer->Print( "/** @param {$optionaltype$} value$returndoc$ */\n" "$class$.prototype.$settername$ = function(value) {\n" " jspb.Message.set$oneoftag$$repeatedtag$WrapperField(", "optionaltype", JSFieldTypeAnnotation(options, field, /* is_setter_argument = */ true, /* force_present = */ false, /* singular_if_not_packed = */ false), "returndoc", JSReturnDoc(options, field), "class", GetMessagePath(options, field->containing_type()), "settername", "set" + JSGetterName(options, field), "oneoftag", (field->containing_oneof() ? "Oneof" : ""), "repeatedtag", (field->is_repeated() ? "Repeated" : "")); printer->Annotate("settername", field); printer->Print( "this, $index$$oneofgroup$, value);$returnvalue$\n" "};\n" "\n" "\n", "index", JSFieldIndex(field), "oneofgroup", (field->containing_oneof() ? (", " + JSOneofArray(options, field)) : ""), "returnvalue", JSReturnClause(field)); if (field->is_repeated()) { GenerateRepeatedMessageHelperMethods(options, printer, field); } } else { bool untyped = false; // Simple (primitive) field, either singular or repeated. // TODO(b/26173701): Always use BYTES_DEFAULT for the getter return type; // at this point we "lie" to non-binary users and tell the return // type is always base64 string, pending a LSC to migrate to typed getters. BytesMode bytes_mode = field->type() == FieldDescriptor::TYPE_BYTES && !options.binary ? BYTES_B64 : BYTES_DEFAULT; string typed_annotation = JSFieldTypeAnnotation( options, field, /* is_setter_argument = */ false, /* force_present = */ false, /* singular_if_not_packed = */ false, /* bytes_mode = */ bytes_mode); if (untyped) { printer->Print( "/**\n" " * @return {?} Raw field, untyped.\n" " */\n"); } else { printer->Print( "/**\n" " * $fielddef$\n" "$comment$" " * @return {$type$}\n" " */\n", "fielddef", FieldDefinition(options, field), "comment", FieldComments(field, bytes_mode), "type", typed_annotation); } printer->Print( "$class$.prototype.$gettername$ = function() {\n", "class", GetMessagePath(options, field->containing_type()), "gettername", "get" + JSGetterName(options, field)); printer->Annotate("gettername", field); if (untyped) { printer->Print( " return "); } else { printer->Print( " return /** @type {$type$} */ (", "type", typed_annotation); } bool use_default = !ReturnsNullWhenUnset(options, field); // Raw fields with no default set should just return undefined. if (untyped && !field->has_default_value()) { use_default = false; } // Repeated fields get initialized to their default in the constructor // (why?), so we emit a plain getField() call for them. if (field->is_repeated()) { use_default = false; } GenerateFieldValueExpression(printer, "this", field, use_default); if (untyped) { printer->Print( ";\n" "};\n" "\n" "\n"); } else { printer->Print( ");\n" "};\n" "\n" "\n"); } if (field->type() == FieldDescriptor::TYPE_BYTES && !untyped) { GenerateBytesWrapper(options, printer, field, BYTES_B64); GenerateBytesWrapper(options, printer, field, BYTES_U8); } if (untyped) { printer->Print( "/**\n" " * @param {*} value$returndoc$\n" " */\n", "returndoc", JSReturnDoc(options, field)); } else { printer->Print( "/** @param {$optionaltype$} value$returndoc$ */\n", "optionaltype", JSFieldTypeAnnotation( options, field, /* is_setter_argument = */ true, /* force_present = */ false, /* singular_if_not_packed = */ false), "returndoc", JSReturnDoc(options, field)); } if (field->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 && !field->is_repeated() && !field->is_map() && !HasFieldPresence(options, field)) { // Proto3 non-repeated and non-map fields without presence use the // setProto3*Field function. printer->Print( "$class$.prototype.$settername$ = function(value) {\n" " jspb.Message.setProto3$typetag$Field(this, $index$, " "value);$returnvalue$\n" "};\n" "\n" "\n", "class", GetMessagePath(options, field->containing_type()), "settername", "set" + JSGetterName(options, field), "typetag", JSTypeTag(field), "index", JSFieldIndex(field), "returnvalue", JSReturnClause(field)); printer->Annotate("settername", field); } else { // Otherwise, use the regular setField function. printer->Print( "$class$.prototype.$settername$ = function(value) {\n" " jspb.Message.set$oneoftag$Field(this, $index$", "class", GetMessagePath(options, field->containing_type()), "settername", "set" + JSGetterName(options, field), "oneoftag", (field->containing_oneof() ? "Oneof" : ""), "index", JSFieldIndex(field)); printer->Annotate("settername", field); printer->Print( "$oneofgroup$, $type$value$rptvalueinit$$typeclose$);$returnvalue$\n" "};\n" "\n" "\n", "type", untyped ? "/** @type{string|number|boolean|Array|undefined} */(" : "", "typeclose", untyped ? ")" : "", "oneofgroup", (field->containing_oneof() ? (", " + JSOneofArray(options, field)) : ""), "returnvalue", JSReturnClause(field), "rptvalueinit", (field->is_repeated() ? " || []" : "")); } if (untyped) { printer->Print( "/**\n" " * Clears the value.$returndoc$\n" " */\n", "returndoc", JSReturnDoc(options, field)); } if (field->is_repeated()) { GenerateRepeatedPrimitiveHelperMethods(options, printer, field, untyped); } } // Generate clearFoo() method for map fields, repeated fields, and other // fields with presence. if (IsMap(options, field)) { printer->Print( "$class$.prototype.$clearername$ = function() {\n" " this.$gettername$().clear();$returnvalue$\n" "};\n" "\n" "\n", "class", GetMessagePath(options, field->containing_type()), "clearername", "clear" + JSGetterName(options, field), "gettername", "get" + JSGetterName(options, field), "returnvalue", JSReturnClause(field)); printer->Annotate("clearername", field); } else if (field->is_repeated() || (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && !field->is_required())) { // Fields where we can delegate to the regular setter. printer->Print( "$class$.prototype.$clearername$ = function() {\n" " this.$settername$($clearedvalue$);$returnvalue$\n" "};\n" "\n" "\n", "class", GetMessagePath(options, field->containing_type()), "clearername", "clear" + JSGetterName(options, field), "settername", "set" + JSGetterName(options, field), "clearedvalue", (field->is_repeated() ? "[]" : "undefined"), "returnvalue", JSReturnClause(field)); printer->Annotate("clearername", field); } else if (HasFieldPresence(options, field)) { // Fields where we can't delegate to the regular setter because it doesn't // accept "undefined" as an argument. printer->Print( "$class$.prototype.$clearername$ = function() {\n" " jspb.Message.set$maybeoneof$Field(this, " "$index$$maybeoneofgroup$, ", "class", GetMessagePath(options, field->containing_type()), "clearername", "clear" + JSGetterName(options, field), "maybeoneof", (field->containing_oneof() ? "Oneof" : ""), "maybeoneofgroup", (field->containing_oneof() ? (", " + JSOneofArray(options, field)) : ""), "index", JSFieldIndex(field)); printer->Annotate("clearername", field); printer->Print( "$clearedvalue$);$returnvalue$\n" "};\n" "\n" "\n", "clearedvalue", (field->is_repeated() ? "[]" : "undefined"), "returnvalue", JSReturnClause(field)); } if (HasFieldPresence(options, field)) { printer->Print( "/**\n" " * Returns whether this field is set.\n" " * @return {!boolean}\n" " */\n" "$class$.prototype.$hasername$ = function() {\n" " return jspb.Message.getField(this, $index$) != null;\n" "};\n" "\n" "\n", "class", GetMessagePath(options, field->containing_type()), "hasername", "has" + JSGetterName(options, field), "index", JSFieldIndex(field)); printer->Annotate("hasername", field); } } void Generator::GenerateRepeatedPrimitiveHelperMethods( const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field, bool untyped) const { printer->Print( "/**\n" " * @param {!$optionaltype$} value\n" " * @param {number=} opt_index\n" " */\n" "$class$.prototype.$addername$ = function(value, opt_index) {\n" " jspb.Message.addToRepeatedField(this, $index$", "class", GetMessagePath(options, field->containing_type()), "addername", "add" + JSGetterName(options, field, BYTES_DEFAULT, /* drop_list = */ true), "optionaltype", JSTypeName(options, field, BYTES_DEFAULT), "index", JSFieldIndex(field)); printer->Annotate("addername", field); printer->Print( "$oneofgroup$, $type$value$rptvalueinit$$typeclose$, opt_index);\n" "};\n" "\n" "\n", "type", untyped ? "/** @type{string|number|boolean|!Uint8Array} */(" : "", "typeclose", untyped ? ")" : "", "oneofgroup", (field->containing_oneof() ? (", " + JSOneofArray(options, field)) : ""), "rptvalueinit", ""); } void Generator::GenerateRepeatedMessageHelperMethods( const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const { printer->Print( "/**\n" " * @param {!$optionaltype$=} opt_value\n" " * @param {number=} opt_index\n" " * @return {!$optionaltype$}\n" " */\n" "$class$.prototype.add$name$ = function(opt_value, opt_index) {\n" " return jspb.Message.addTo$repeatedtag$WrapperField(", "optionaltype", JSTypeName(options, field, BYTES_DEFAULT), "class", GetMessagePath(options, field->containing_type()), "name", JSGetterName(options, field, BYTES_DEFAULT, /* drop_list = */ true), "repeatedtag", (field->is_repeated() ? "Repeated" : "")); printer->Print( "this, $index$$oneofgroup$, opt_value, $ctor$, opt_index);\n" "};\n" "\n" "\n", "index", JSFieldIndex(field), "oneofgroup", (field->containing_oneof() ? (", " + JSOneofArray(options, field)) : ""), "ctor", GetMessagePath(options, field->message_type())); } void Generator::GenerateClassExtensionFieldInfo(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const { if (IsExtendable(desc)) { printer->Print( "\n" "/**\n" " * The extensions registered with this message class. This is a " "map of\n" " * extension field number to fieldInfo object.\n" " *\n" " * For example:\n" " * { 123: {fieldIndex: 123, fieldName: {my_field_name: 0}, " "ctor: proto.example.MyMessage} }\n" " *\n" " * fieldName contains the JsCompiler renamed field name property " "so that it\n" " * works in OPTIMIZED mode.\n" " *\n" " * @type {!Object.}\n" " */\n" "$class$.extensions = {};\n" "\n", "class", GetMessagePath(options, desc)); printer->Print( "\n" "/**\n" " * The extensions registered with this message class. This is a " "map of\n" " * extension field number to fieldInfo object.\n" " *\n" " * For example:\n" " * { 123: {fieldIndex: 123, fieldName: {my_field_name: 0}, " "ctor: proto.example.MyMessage} }\n" " *\n" " * fieldName contains the JsCompiler renamed field name property " "so that it\n" " * works in OPTIMIZED mode.\n" " *\n" " * @type {!Object.}\n" " */\n" "$class$.extensionsBinary = {};\n" "\n", "class", GetMessagePath(options, desc)); } } void Generator::GenerateClassDeserializeBinary(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const { // TODO(cfallin): Handle lazy decoding when requested by field option and/or // by default for 'bytes' fields and packed repeated fields. printer->Print( "/**\n" " * Deserializes binary data (in protobuf wire format).\n" " * @param {jspb.ByteSource} bytes The bytes to deserialize.\n" " * @return {!$class$}\n" " */\n" "$class$.deserializeBinary = function(bytes) {\n" " var reader = new jspb.BinaryReader(bytes);\n" " var msg = new $class$;\n" " return $class$.deserializeBinaryFromReader(msg, reader);\n" "};\n" "\n" "\n" "/**\n" " * Deserializes binary data (in protobuf wire format) from the\n" " * given reader into the given message object.\n" " * @param {!$class$} msg The message object to deserialize into.\n" " * @param {!jspb.BinaryReader} reader The BinaryReader to use.\n" " * @return {!$class$}\n" " */\n" "$class$.deserializeBinaryFromReader = function(msg, reader) {\n" " while (reader.nextField()) {\n" " if (reader.isEndGroup()) {\n" " break;\n" " }\n" " var field = reader.getFieldNumber();\n" " switch (field) {\n", "class", GetMessagePath(options, desc)); for (int i = 0; i < desc->field_count(); i++) { if (!IgnoreField(desc->field(i))) { GenerateClassDeserializeBinaryField(options, printer, desc->field(i)); } } printer->Print( " default:\n"); if (IsExtendable(desc)) { printer->Print( " jspb.Message.readBinaryExtension(msg, reader, $extobj$Binary,\n" " $class$.prototype.getExtension,\n" " $class$.prototype.setExtension);\n" " break;\n", "extobj", JSExtensionsObjectName(options, desc->file(), desc), "class", GetMessagePath(options, desc)); } else { printer->Print( " reader.skipField();\n" " break;\n"); } printer->Print( " }\n" " }\n" " return msg;\n" "};\n" "\n" "\n"); } void Generator::GenerateClassDeserializeBinaryField( const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const { printer->Print(" case $num$:\n", "num", SimpleItoa(field->number())); if (IsMap(options, field)) { const FieldDescriptor* key_field = MapFieldKey(field); const FieldDescriptor* value_field = MapFieldValue(field); printer->Print( " var value = msg.get$name$();\n" " reader.readMessage(value, function(message, reader) {\n", "name", JSGetterName(options, field)); printer->Print(" jspb.Map.deserializeBinary(message, reader, " "$keyReaderFn$, $valueReaderFn$", "keyReaderFn", JSBinaryReaderMethodName(options, key_field), "valueReaderFn", JSBinaryReaderMethodName(options, value_field)); if (value_field->type() == FieldDescriptor::TYPE_MESSAGE) { printer->Print(", $messageType$.deserializeBinaryFromReader", "messageType", GetMessagePath(options, value_field->message_type())); } printer->Print(");\n"); printer->Print(" });\n"); } else { if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { printer->Print( " var value = new $fieldclass$;\n" " reader.read$msgOrGroup$($grpfield$value," "$fieldclass$.deserializeBinaryFromReader);\n", "fieldclass", SubmessageTypeRef(options, field), "msgOrGroup", (field->type() == FieldDescriptor::TYPE_GROUP) ? "Group" : "Message", "grpfield", (field->type() == FieldDescriptor::TYPE_GROUP) ? (SimpleItoa(field->number()) + ", ") : ""); } else { printer->Print( " var value = /** @type {$fieldtype$} */ " "(reader.read$reader$());\n", "fieldtype", JSFieldTypeAnnotation(options, field, false, true, /* singular_if_not_packed */ true, BYTES_U8), "reader", JSBinaryReadWriteMethodName(field, /* is_writer = */ false)); } if (field->is_repeated() && !field->is_packed()) { printer->Print( " msg.add$name$(value);\n", "name", JSGetterName(options, field, BYTES_DEFAULT, /* drop_list = */ true)); } else { // Singular fields, and packed repeated fields, receive a |value| either // as the field's value or as the array of all the field's values; set // this as the field's value directly. printer->Print( " msg.set$name$(value);\n", "name", JSGetterName(options, field)); } } printer->Print(" break;\n"); } void Generator::GenerateClassSerializeBinary(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const { printer->Print( "/**\n" " * Serializes the message to binary data (in protobuf wire format).\n" " * @return {!Uint8Array}\n" " */\n" "$class$.prototype.serializeBinary = function() {\n" " var writer = new jspb.BinaryWriter();\n" " $class$.serializeBinaryToWriter(this, writer);\n" " return writer.getResultBuffer();\n" "};\n" "\n" "\n" "/**\n" " * Serializes the given message to binary data (in protobuf wire\n" " * format), writing to the given BinaryWriter.\n" " * @param {!$class$} message\n" " * @param {!jspb.BinaryWriter} writer\n" " * @suppress {unusedLocalVariables} f is only used for nested messages\n" " */\n" "$class$.serializeBinaryToWriter = function(message, " "writer) {\n" " var f = undefined;\n", "class", GetMessagePath(options, desc)); for (int i = 0; i < desc->field_count(); i++) { if (!IgnoreField(desc->field(i))) { GenerateClassSerializeBinaryField(options, printer, desc->field(i)); } } if (IsExtendable(desc)) { printer->Print( " jspb.Message.serializeBinaryExtensions(message, writer,\n" " $extobj$Binary, $class$.prototype.getExtension);\n", "extobj", JSExtensionsObjectName(options, desc->file(), desc), "class", GetMessagePath(options, desc)); } printer->Print( "};\n" "\n" "\n"); } void Generator::GenerateClassSerializeBinaryField( const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const { if (HasFieldPresence(options, field) && field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { string typed_annotation = JSFieldTypeAnnotation( options, field, /* is_setter_argument = */ false, /* force_present = */ false, /* singular_if_not_packed = */ false, /* bytes_mode = */ BYTES_DEFAULT); printer->Print( " f = /** @type {$type$} */ " "(jspb.Message.getField(message, $index$));\n", "index", JSFieldIndex(field), "type", typed_annotation); } else { printer->Print( " f = message.get$name$($nolazy$);\n", "name", JSGetterName(options, field, BYTES_U8), // No lazy creation for maps containers -- fastpath the empty case. "nolazy", IsMap(options, field) ? "true" : ""); } // Print an `if (condition)` statement that evaluates to true if the field // goes on the wire. if (IsMap(options, field)) { printer->Print( " if (f && f.getLength() > 0) {\n"); } else if (field->is_repeated()) { printer->Print( " if (f.length > 0) {\n"); } else { if (HasFieldPresence(options, field)) { printer->Print( " if (f != null) {\n"); } else { // No field presence: serialize onto the wire only if value is // non-default. Defaults are documented here: // https://goto.google.com/lhdfm switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: case FieldDescriptor::CPPTYPE_INT64: case FieldDescriptor::CPPTYPE_UINT32: case FieldDescriptor::CPPTYPE_UINT64: { if (IsIntegralFieldWithStringJSType(field)) { // We can use `parseInt` here even though it will not be precise for // 64-bit quantities because we are only testing for zero/nonzero, // and JS numbers (64-bit floating point values, i.e., doubles) are // integer-precise in the range that includes zero. printer->Print(" if (parseInt(f, 10) !== 0) {\n"); } else { printer->Print(" if (f !== 0) {\n"); } break; } case FieldDescriptor::CPPTYPE_ENUM: case FieldDescriptor::CPPTYPE_FLOAT: case FieldDescriptor::CPPTYPE_DOUBLE: printer->Print( " if (f !== 0.0) {\n"); break; case FieldDescriptor::CPPTYPE_BOOL: printer->Print( " if (f) {\n"); break; case FieldDescriptor::CPPTYPE_STRING: printer->Print( " if (f.length > 0) {\n"); break; default: assert(false); break; } } } // Write the field on the wire. if (IsMap(options, field)) { const FieldDescriptor* key_field = MapFieldKey(field); const FieldDescriptor* value_field = MapFieldValue(field); printer->Print( " f.serializeBinary($index$, writer, " "$keyWriterFn$, $valueWriterFn$", "index", SimpleItoa(field->number()), "keyWriterFn", JSBinaryWriterMethodName(options, key_field), "valueWriterFn", JSBinaryWriterMethodName(options, value_field)); if (value_field->type() == FieldDescriptor::TYPE_MESSAGE) { printer->Print(", $messageType$.serializeBinaryToWriter", "messageType", GetMessagePath(options, value_field->message_type())); } printer->Print(");\n"); } else { printer->Print( " writer.write$method$(\n" " $index$,\n" " f", "method", JSBinaryReadWriteMethodName(field, /* is_writer = */ true), "index", SimpleItoa(field->number())); if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && !IsMap(options, field)) { printer->Print( ",\n" " $submsg$.serializeBinaryToWriter\n", "submsg", SubmessageTypeRef(options, field)); } else { printer->Print("\n"); } printer->Print( " );\n"); } // Close the `if`. printer->Print( " }\n"); } void Generator::GenerateEnum(const GeneratorOptions& options, io::Printer* printer, const EnumDescriptor* enumdesc) const { printer->Print( "/**\n" " * @enum {number}\n" " */\n" "$enumprefix$$name$ = {\n", "enumprefix", GetEnumPathPrefix(options, enumdesc), "name", enumdesc->name()); printer->Annotate("name", enumdesc); for (int i = 0; i < enumdesc->value_count(); i++) { const EnumValueDescriptor* value = enumdesc->value(i); printer->Print( " $name$: $value$$comma$\n", "name", ToEnumCase(value->name()), "value", SimpleItoa(value->number()), "comma", (i == enumdesc->value_count() - 1) ? "" : ","); printer->Annotate("name", value); } printer->Print( "};\n" "\n"); } void Generator::GenerateExtension(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const { string extension_scope = (field->extension_scope() ? GetMessagePath(options, field->extension_scope()) : GetFilePath(options, field->file())); printer->Print( "\n" "/**\n" " * A tuple of {field number, class constructor} for the extension\n" " * field named `$name$`.\n" " * @type {!jspb.ExtensionFieldInfo.<$extensionType$>}\n" " */\n" "$class$.$name$ = new jspb.ExtensionFieldInfo(\n", "name", JSObjectFieldName(options, field), "class", extension_scope, "extensionType", JSFieldTypeAnnotation( options, field, /* is_setter_argument = */ false, /* force_present = */ true, /* singular_if_not_packed = */ false)); printer->Print( " $index$,\n" " {$name$: 0},\n" " $ctor$,\n" " /** @type {?function((boolean|undefined),!jspb.Message=): " "!Object} */ (\n" " $toObject$),\n" " $repeated$);\n", "index", SimpleItoa(field->number()), "name", JSObjectFieldName(options, field), "ctor", (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE ? SubmessageTypeRef(options, field) : string("null")), "toObject", (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE ? (SubmessageTypeRef(options, field) + ".toObject") : string("null")), "repeated", (field->is_repeated() ? "1" : "0")); printer->Print( "\n" "$extendName$Binary[$index$] = new jspb.ExtensionFieldBinaryInfo(\n" " $class$.$name$,\n" " $binaryReaderFn$,\n" " $binaryWriterFn$,\n" " $binaryMessageSerializeFn$,\n" " $binaryMessageDeserializeFn$,\n", "extendName", JSExtensionsObjectName(options, field->file(), field->containing_type()), "index", SimpleItoa(field->number()), "class", extension_scope, "name", JSObjectFieldName(options, field), "binaryReaderFn", JSBinaryReaderMethodName(options, field), "binaryWriterFn", JSBinaryWriterMethodName(options, field), "binaryMessageSerializeFn", (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) ? (SubmessageTypeRef(options, field) + ".serializeBinaryToWriter") : "undefined", "binaryMessageDeserializeFn", (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) ? (SubmessageTypeRef(options, field) + ".deserializeBinaryFromReader") : "undefined"); printer->Print(" $isPacked$);\n", "isPacked", (field->is_packed() ? "true" : "false")); printer->Print( "// This registers the extension field with the extended class, so that\n" "// toObject() will function correctly.\n" "$extendName$[$index$] = $class$.$name$;\n" "\n", "extendName", JSExtensionsObjectName(options, field->file(), field->containing_type()), "index", SimpleItoa(field->number()), "class", extension_scope, "name", JSObjectFieldName(options, field)); } bool GeneratorOptions::ParseFromOptions( const std::vector< std::pair< string, string > >& options, string* error) { for (int i = 0; i < options.size(); i++) { if (options[i].first == "add_require_for_enums") { if (options[i].second != "") { *error = "Unexpected option value for add_require_for_enums"; return false; } add_require_for_enums = true; } else if (options[i].first == "binary") { if (options[i].second != "") { *error = "Unexpected option value for binary"; return false; } binary = true; } else if (options[i].first == "testonly") { if (options[i].second != "") { *error = "Unexpected option value for testonly"; return false; } testonly = true; } else if (options[i].first == "error_on_name_conflict") { if (options[i].second != "") { *error = "Unexpected option value for error_on_name_conflict"; return false; } error_on_name_conflict = true; } else if (options[i].first == "output_dir") { output_dir = options[i].second; } else if (options[i].first == "namespace_prefix") { namespace_prefix = options[i].second; } else if (options[i].first == "library") { library = options[i].second; } else if (options[i].first == "import_style") { if (options[i].second == "closure") { import_style = kImportClosure; } else if (options[i].second == "commonjs") { import_style = kImportCommonJs; } else if (options[i].second == "browser") { import_style = kImportBrowser; } else if (options[i].second == "es6") { import_style = kImportEs6; } else { *error = "Unknown import style " + options[i].second + ", expected " + "one of: closure, commonjs, browser, es6."; } } else if (options[i].first == "extension") { extension = options[i].second; } else if (options[i].first == "one_output_file_per_input_file") { if (!options[i].second.empty()) { *error = "Unexpected option value for one_output_file_per_input_file"; return false; } one_output_file_per_input_file = true; } else if (options[i].first == "annotate_code") { if (!options[i].second.empty()) { *error = "Unexpected option value for annotate_code"; return false; } annotate_code = true; } else { // Assume any other option is an output directory, as long as it is a bare // `key` rather than a `key=value` option. if (options[i].second != "") { *error = "Unknown option: " + options[i].first; return false; } output_dir = options[i].first; } } if (import_style != kImportClosure && (add_require_for_enums || testonly || !library.empty() || error_on_name_conflict || extension != ".js" || one_output_file_per_input_file)) { *error = "The add_require_for_enums, testonly, library, error_on_name_conflict, " "extension, and one_output_file_per_input_file options should only be " "used for import_style=closure"; return false; } return true; } GeneratorOptions::OutputMode GeneratorOptions::output_mode() const { // We use one output file per input file if we are not using Closure or if // this is explicitly requested. if (import_style != kImportClosure || one_output_file_per_input_file) { return kOneOutputFilePerInputFile; } // If a library name is provided, we put everything in that one file. if (!library.empty()) { return kEverythingInOneFile; } // Otherwise, we create one output file per type. return kOneOutputFilePerType; } void Generator::GenerateFilesInDepOrder( const GeneratorOptions& options, io::Printer* printer, const std::vector& files) const { // Build a std::set over all files so that the DFS can detect when it recurses // into a dep not specified in the user's command line. std::set all_files(files.begin(), files.end()); // Track the in-progress set of files that have been generated already. std::set generated; for (int i = 0; i < files.size(); i++) { GenerateFileAndDeps(options, printer, files[i], &all_files, &generated); } } void Generator::GenerateFileAndDeps( const GeneratorOptions& options, io::Printer* printer, const FileDescriptor* root, std::set* all_files, std::set* generated) const { // Skip if already generated. if (generated->find(root) != generated->end()) { return; } generated->insert(root); // Generate all dependencies before this file's content. for (int i = 0; i < root->dependency_count(); i++) { const FileDescriptor* dep = root->dependency(i); GenerateFileAndDeps(options, printer, dep, all_files, generated); } // Generate this file's content. Only generate if the file is part of the // original set requested to be generated; i.e., don't take all transitive // deps down to the roots. if (all_files->find(root) != all_files->end()) { GenerateClassesAndEnums(options, printer, root); } } void Generator::GenerateFile(const GeneratorOptions& options, io::Printer* printer, const FileDescriptor* file) const { GenerateHeader(options, printer); // Generate "require" statements. if (options.import_style == GeneratorOptions::kImportCommonJs) { printer->Print("var jspb = require('google-protobuf');\n"); printer->Print("var goog = jspb;\n"); printer->Print("var global = Function('return this')();\n\n"); for (int i = 0; i < file->dependency_count(); i++) { const string& name = file->dependency(i)->name(); printer->Print( "var $alias$ = require('$file$');\n", "alias", ModuleAlias(name), "file", GetRootPath(file->name(), name) + GetJSFilename(options, name)); } } std::set provided; std::set extensions; for (int i = 0; i < file->extension_count(); i++) { // We honor the jspb::ignore option here only when working with // Closure-style imports. Use of this option is discouraged and so we want // to avoid adding new support for it. if (options.import_style == GeneratorOptions::kImportClosure && IgnoreField(file->extension(i))) { continue; } provided.insert(GetFilePath(options, file) + "." + JSObjectFieldName(options, file->extension(i))); extensions.insert(file->extension(i)); } FindProvidesForFile(options, printer, file, &provided); GenerateProvides(options, printer, &provided); std::vector files; files.push_back(file); if (options.import_style == GeneratorOptions::kImportClosure) { GenerateRequiresForLibrary(options, printer, files, &provided); } GenerateClassesAndEnums(options, printer, file); // Generate code for top-level extensions. Extensions nested inside messages // are emitted inside GenerateClassesAndEnums(). for (std::set::const_iterator it = extensions.begin(); it != extensions.end(); ++it) { GenerateExtension(options, printer, *it); } if (options.import_style == GeneratorOptions::kImportCommonJs) { printer->Print("goog.object.extend(exports, $package$);\n", "package", GetFilePath(options, file)); } // Emit well-known type methods. for (FileToc* toc = well_known_types_js; toc->name != NULL; toc++) { string name = string("google/protobuf/") + toc->name; if (name == StripProto(file->name()) + ".js") { printer->Print(toc->data); } } } bool Generator::GenerateAll(const std::vector& files, const string& parameter, GeneratorContext* context, string* error) const { std::vector< std::pair< string, string > > option_pairs; ParseGeneratorParameter(parameter, &option_pairs); GeneratorOptions options; if (!options.ParseFromOptions(option_pairs, error)) { return false; } if (options.output_mode() == GeneratorOptions::kEverythingInOneFile) { // All output should go in a single file. string filename = options.output_dir + "/" + options.library + options.GetFileNameExtension(); google::protobuf::scoped_ptr output(context->Open(filename)); GOOGLE_CHECK(output.get()); io::Printer printer(output.get(), '$'); // Pull out all extensions -- we need these to generate all // provides/requires. std::vector extensions; for (int i = 0; i < files.size(); i++) { for (int j = 0; j < files[i]->extension_count(); j++) { const FieldDescriptor* extension = files[i]->extension(j); extensions.push_back(extension); } } GenerateHeader(options, &printer); std::set provided; FindProvides(options, &printer, files, &provided); FindProvidesForFields(options, &printer, extensions, &provided); GenerateProvides(options, &printer, &provided); GenerateTestOnly(options, &printer); GenerateRequiresForLibrary(options, &printer, files, &provided); GenerateFilesInDepOrder(options, &printer, files); for (int i = 0; i < extensions.size(); i++) { if (ShouldGenerateExtension(extensions[i])) { GenerateExtension(options, &printer, extensions[i]); } } if (printer.failed()) { return false; } } else if (options.output_mode() == GeneratorOptions::kOneOutputFilePerType) { std::set allowed_set; if (!GenerateJspbAllowedSet(options, files, &allowed_set, error)) { return false; } for (int i = 0; i < files.size(); i++) { const FileDescriptor* file = files[i]; for (int j = 0; j < file->message_type_count(); j++) { const Descriptor* desc = file->message_type(j); if (allowed_set.count(desc) == 0) { continue; } string filename = GetMessageFileName(options, desc); google::protobuf::scoped_ptr output( context->Open(filename)); GOOGLE_CHECK(output.get()); io::Printer printer(output.get(), '$'); GenerateHeader(options, &printer); std::set provided; FindProvidesForMessage(options, &printer, desc, &provided); GenerateProvides(options, &printer, &provided); GenerateTestOnly(options, &printer); GenerateRequiresForMessage(options, &printer, desc, &provided); GenerateClass(options, &printer, desc); if (printer.failed()) { return false; } } for (int j = 0; j < file->enum_type_count(); j++) { const EnumDescriptor* enumdesc = file->enum_type(j); if (allowed_set.count(enumdesc) == 0) { continue; } string filename = GetEnumFileName(options, enumdesc); google::protobuf::scoped_ptr output( context->Open(filename)); GOOGLE_CHECK(output.get()); io::Printer printer(output.get(), '$'); GenerateHeader(options, &printer); std::set provided; FindProvidesForEnum(options, &printer, enumdesc, &provided); GenerateProvides(options, &printer, &provided); GenerateTestOnly(options, &printer); GenerateEnum(options, &printer, enumdesc); if (printer.failed()) { return false; } } // File-level extensions (message-level extensions are generated under // the enclosing message). if (allowed_set.count(file) == 1) { string filename = GetExtensionFileName(options, file); google::protobuf::scoped_ptr output( context->Open(filename)); GOOGLE_CHECK(output.get()); io::Printer printer(output.get(), '$'); GenerateHeader(options, &printer); std::set provided; std::vector fields; for (int j = 0; j < files[i]->extension_count(); j++) { if (ShouldGenerateExtension(files[i]->extension(j))) { fields.push_back(files[i]->extension(j)); } } FindProvidesForFields(options, &printer, fields, &provided); GenerateProvides(options, &printer, &provided); GenerateTestOnly(options, &printer); GenerateRequiresForExtensions(options, &printer, fields, &provided); for (int j = 0; j < files[i]->extension_count(); j++) { if (ShouldGenerateExtension(files[i]->extension(j))) { GenerateExtension(options, &printer, files[i]->extension(j)); } } } } } else /* options.output_mode() == kOneOutputFilePerInputFile */ { // Generate one output file per input (.proto) file. for (int i = 0; i < files.size(); i++) { const google::protobuf::FileDescriptor* file = files[i]; string filename = options.output_dir + "/" + GetJSFilename(options, file->name()); google::protobuf::scoped_ptr output(context->Open(filename)); GOOGLE_CHECK(output.get()); GeneratedCodeInfo annotations; io::AnnotationProtoCollector annotation_collector( &annotations); io::Printer printer(output.get(), '$', options.annotate_code ? &annotation_collector : NULL); GenerateFile(options, &printer, file); if (printer.failed()) { return false; } if (options.annotate_code) { const string meta_file = filename + ".meta"; google::protobuf::scoped_ptr info_output( context->Open(meta_file)); annotations.SerializeToZeroCopyStream(info_output.get()); } } } return true; } } // namespace js } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/js/js_generator.h000066400000000000000000000354711334102242000323640ustar00rootroot00000000000000// 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. // Generates JavaScript code for a given .proto file. // #ifndef GOOGLE_PROTOBUF_COMPILER_JS_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_JS_GENERATOR_H__ #include #include #include #include #include namespace google { namespace protobuf { class Descriptor; class EnumDescriptor; class FieldDescriptor; class OneofDescriptor; class FileDescriptor; namespace io { class Printer; } namespace compiler { namespace js { struct GeneratorOptions { // Output path. string output_dir; // Namespace prefix. string namespace_prefix; // Enable binary-format support? bool binary; // What style of imports should be used. enum ImportStyle { kImportClosure, // goog.require() kImportCommonJs, // require() kImportBrowser, // no import statements kImportEs6, // import { member } from '' } import_style; GeneratorOptions() : output_dir("."), namespace_prefix(""), binary(false), import_style(kImportClosure), add_require_for_enums(false), testonly(false), library(""), error_on_name_conflict(false), extension(".js"), one_output_file_per_input_file(false), annotate_code(false) {} bool ParseFromOptions( const std::vector< std::pair< string, string > >& options, string* error); // Returns the file name extension to use for generated code. string GetFileNameExtension() const { return import_style == kImportClosure ? extension : "_pb.js"; } enum OutputMode { // Create an output file for each input .proto file. kOneOutputFilePerInputFile, // Create an output file for each type. kOneOutputFilePerType, // Put everything in a single file named by the library option. kEverythingInOneFile, }; // Indicates how to output the generated code based on the provided options. OutputMode output_mode() const; // The remaining options are only relevant when we are using kImportClosure. // Add a `goog.requires()` call for each enum type used. If not set, a // forward declaration with `goog.forwardDeclare` is produced instead. bool add_require_for_enums; // Set this as a test-only module via `goog.setTestOnly();`. bool testonly; // Create a library with name _lib.js rather than a separate .js file // per type? string library; // Error if there are two types that would generate the same output file? bool error_on_name_conflict; // The extension to use for output file names. string extension; // Create a separate output file for each input file? bool one_output_file_per_input_file; // If true, we should build .meta files that contain annotations for // generated code. See GeneratedCodeInfo in descriptor.proto. bool annotate_code; }; // CodeGenerator implementation which generates a JavaScript source file and // header. If you create your own protocol compiler binary and you want it to // support JavaScript output, you can do so by registering an instance of this // CodeGenerator with the CommandLineInterface in your main() function. class LIBPROTOC_EXPORT Generator : public CodeGenerator { public: Generator() {} virtual ~Generator() {} virtual bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const { *error = "Unimplemented Generate() method. Call GenerateAll() instead."; return false; } virtual bool HasGenerateAll() const { return true; } virtual bool GenerateAll(const std::vector& files, const string& parameter, GeneratorContext* context, string* error) const; private: void GenerateHeader(const GeneratorOptions& options, io::Printer* printer) const; // Generate goog.provides() calls. void FindProvides(const GeneratorOptions& options, io::Printer* printer, const std::vector& file, std::set* provided) const; void FindProvidesForFile(const GeneratorOptions& options, io::Printer* printer, const FileDescriptor* file, std::set* provided) const; void FindProvidesForMessage(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc, std::set* provided) const; void FindProvidesForEnum(const GeneratorOptions& options, io::Printer* printer, const EnumDescriptor* enumdesc, std::set* provided) const; // For extension fields at file scope. void FindProvidesForFields(const GeneratorOptions& options, io::Printer* printer, const std::vector& fields, std::set* provided) const; // Print the goog.provides() found by the methods above. void GenerateProvides(const GeneratorOptions& options, io::Printer* printer, std::set* provided) const; // Generate goog.setTestOnly() if indicated. void GenerateTestOnly(const GeneratorOptions& options, io::Printer* printer) const; // Generate goog.requires() calls. void GenerateRequiresForLibrary( const GeneratorOptions& options, io::Printer* printer, const std::vector& files, std::set* provided) const; void GenerateRequiresForMessage(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc, std::set* provided) const; // For extension fields at file scope. void GenerateRequiresForExtensions( const GeneratorOptions& options, io::Printer* printer, const std::vector& fields, std::set* provided) const; void GenerateRequiresImpl(const GeneratorOptions& options, io::Printer* printer, std::set* required, std::set* forwards, std::set* provided, bool require_jspb, bool require_extension, bool require_map) const; void FindRequiresForMessage(const GeneratorOptions& options, const Descriptor* desc, std::set* required, std::set* forwards, bool* have_message) const; void FindRequiresForField(const GeneratorOptions& options, const FieldDescriptor* field, std::set* required, std::set* forwards) const; void FindRequiresForExtension(const GeneratorOptions& options, const FieldDescriptor* field, std::set* required, std::set* forwards) const; void GenerateFile(const GeneratorOptions& options, io::Printer* printer, const FileDescriptor* file) const; // Generate definitions for all message classes and enums in all files, // processing the files in dependence order. void GenerateFilesInDepOrder( const GeneratorOptions& options, io::Printer* printer, const std::vector& file) const; // Helper for above. void GenerateFileAndDeps(const GeneratorOptions& options, io::Printer* printer, const FileDescriptor* root, std::set* all_files, std::set* generated) const; // Generate definitions for all message classes and enums. void GenerateClassesAndEnums(const GeneratorOptions& options, io::Printer* printer, const FileDescriptor* file) const; void GenerateFieldValueExpression(io::Printer* printer, const char* obj_reference, const FieldDescriptor* field, bool use_default) const; // Generate definition for one class. void GenerateClass(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassConstructor(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassFieldInfo(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassXid(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateOneofCaseDefinition(const GeneratorOptions& options, io::Printer* printer, const OneofDescriptor* oneof) const; void GenerateClassToObject(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassFieldToObject(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const; void GenerateClassFromObject(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassFieldFromObject(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const; void GenerateClassClone(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassRegistration(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassFields(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassField(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* desc) const; void GenerateClassExtensionFieldInfo(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassDeserialize(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassDeserializeBinary(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassDeserializeBinaryField(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const; void GenerateClassSerializeBinary(const GeneratorOptions& options, io::Printer* printer, const Descriptor* desc) const; void GenerateClassSerializeBinaryField(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const; // Generate definition for one enum. void GenerateEnum(const GeneratorOptions& options, io::Printer* printer, const EnumDescriptor* enumdesc) const; // Generate an extension definition. void GenerateExtension(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const; // Generate addFoo() method for repeated primitive fields. void GenerateRepeatedPrimitiveHelperMethods(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field, bool untyped) const; // Generate addFoo() method for repeated message fields. void GenerateRepeatedMessageHelperMethods(const GeneratorOptions& options, io::Printer* printer, const FieldDescriptor* field) const; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Generator); }; } // namespace js } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_JS_GENERATOR_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/js/well_known_types/000077500000000000000000000000001334102242000331225ustar00rootroot00000000000000any.js000066400000000000000000000061661334102242000342010ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/js/well_known_types// 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 code will be inserted into generated code for * google/protobuf/any.proto. */ /** * Returns the type name contained in this instance, if any. * @return {string|undefined} */ proto.google.protobuf.Any.prototype.getTypeName = function() { return this.getTypeUrl().split('/').pop(); }; /** * Packs the given message instance into this Any. * @param {!Uint8Array} serialized The serialized data to pack. * @param {string} name The type name of this message object. * @param {string=} opt_typeUrlPrefix the type URL prefix. */ proto.google.protobuf.Any.prototype.pack = function(serialized, name, opt_typeUrlPrefix) { if (!opt_typeUrlPrefix) { opt_typeUrlPrefix = 'type.googleapis.com/'; } if (opt_typeUrlPrefix.substr(-1) != '/') { this.setTypeUrl(opt_typeUrlPrefix + '/' + name); } else { this.setTypeUrl(opt_typeUrlPrefix + name); } this.setValue(serialized); }; /** * @template T * Unpacks this Any into the given message object. * @param {function(Uint8Array):T} deserialize Function that will deserialize * the binary data properly. * @param {string} name The expected type name of this message object. * @return {?T} If the name matched the expected name, returns the deserialized * object, otherwise returns null. */ proto.google.protobuf.Any.prototype.unpack = function(deserialize, name) { if (this.getTypeName() == name) { return deserialize(this.getValue_asU8()); } else { return null; } }; struct.js000066400000000000000000000126651334102242000347370ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/js/well_known_types// 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 code will be inserted into generated code for * google/protobuf/struct.proto. */ /** * Typedef representing plain JavaScript values that can go into a * Struct. * @typedef {null|number|string|boolean|Array|Object} */ proto.google.protobuf.JavaScriptValue; /** * Converts this Value object to a plain JavaScript value. * @return {?proto.google.protobuf.JavaScriptValue} a plain JavaScript * value representing this Struct. */ proto.google.protobuf.Value.prototype.toJavaScript = function() { var kindCase = proto.google.protobuf.Value.KindCase; switch (this.getKindCase()) { case kindCase.NULL_VALUE: return null; case kindCase.NUMBER_VALUE: return this.getNumberValue(); case kindCase.STRING_VALUE: return this.getStringValue(); case kindCase.BOOL_VALUE: return this.getBoolValue(); case kindCase.STRUCT_VALUE: return this.getStructValue().toJavaScript(); case kindCase.LIST_VALUE: return this.getListValue().toJavaScript(); default: throw new Error('Unexpected struct type'); } }; /** * Converts this JavaScript value to a new Value proto. * @param {!proto.google.protobuf.JavaScriptValue} value The value to * convert. * @return {!proto.google.protobuf.Value} The newly constructed value. */ proto.google.protobuf.Value.fromJavaScript = function(value) { var ret = new proto.google.protobuf.Value(); switch (goog.typeOf(value)) { case 'string': ret.setStringValue(/** @type {string} */ (value)); break; case 'number': ret.setNumberValue(/** @type {number} */ (value)); break; case 'boolean': ret.setBoolValue(/** @type {boolean} */ (value)); break; case 'null': ret.setNullValue(proto.google.protobuf.NullValue.NULL_VALUE); break; case 'array': ret.setListValue(proto.google.protobuf.ListValue.fromJavaScript( /** @type{!Array} */ (value))); break; case 'object': ret.setStructValue(proto.google.protobuf.Struct.fromJavaScript( /** @type{!Object} */ (value))); break; default: throw new Error('Unexpected struct type.'); } return ret; }; /** * Converts this ListValue object to a plain JavaScript array. * @return {!Array} a plain JavaScript array representing this List. */ proto.google.protobuf.ListValue.prototype.toJavaScript = function() { var ret = []; var values = this.getValuesList(); for (var i = 0; i < values.length; i++) { ret[i] = values[i].toJavaScript(); } return ret; }; /** * Constructs a ListValue protobuf from this plain JavaScript array. * @param {!Array} array a plain JavaScript array * @return {proto.google.protobuf.ListValue} a new ListValue object */ proto.google.protobuf.ListValue.fromJavaScript = function(array) { var ret = new proto.google.protobuf.ListValue(); for (var i = 0; i < array.length; i++) { ret.addValues(proto.google.protobuf.Value.fromJavaScript(array[i])); } return ret; }; /** * Converts this Struct object to a plain JavaScript object. * @return {!Object} a plain * JavaScript object representing this Struct. */ proto.google.protobuf.Struct.prototype.toJavaScript = function() { var ret = {}; this.getFieldsMap().forEach(function(value, key) { ret[key] = value.toJavaScript(); }); return ret; }; /** * Constructs a Struct protobuf from this plain JavaScript object. * @param {!Object} obj a plain JavaScript object * @return {proto.google.protobuf.Struct} a new Struct object */ proto.google.protobuf.Struct.fromJavaScript = function(obj) { var ret = new proto.google.protobuf.Struct(); var map = ret.getFieldsMap(); for (var property in obj) { var val = obj[property]; map.set(property, proto.google.protobuf.Value.fromJavaScript(val)); } return ret; }; timestamp.js000066400000000000000000000044451334102242000354130ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/js/well_known_types// 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 code will be inserted into generated code for * google/protobuf/timestamp.proto. */ /** * Returns a JavaScript 'Date' object corresponding to this Timestamp. * @return {!Date} */ proto.google.protobuf.Timestamp.prototype.toDate = function() { var seconds = this.getSeconds(); var nanos = this.getNanos(); return new Date((seconds * 1000) + (nanos / 1000000)); }; /** * Sets the value of this Timestamp object to be the given Date. * @param {!Date} value The value to set. */ proto.google.protobuf.Timestamp.prototype.fromDate = function(value) { this.setSeconds(Math.floor(value.getTime() / 1000)); this.setNanos(value.getMilliseconds() * 1000000); }; well_known_types_embed.h000066400000000000000000000036751334102242000343630ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/js// 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_JS_WELL_KNOWN_TYPES_EMBED_H__ #define GOOGLE_PROTOBUF_COMPILER_JS_WELL_KNOWN_TYPES_EMBED_H__ #include struct FileToc { const char* name; const char* data; }; extern struct FileToc well_known_types_js[]; #endif // GOOGLE_PROTOBUF_COMPILER_JS_WELL_KNOWN_TYPES_EMBED_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/main.cc000066400000000000000000000110211334102242000303310ustar00rootroot00000000000000// 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 #include #ifndef OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP #include #include #endif // ! OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP #ifndef OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP #include #include #include #include #include #include #endif // ! OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP int main(int argc, char* argv[]) { google::protobuf::compiler::CommandLineInterface cli; cli.AllowPlugins("protoc-"); // Proto2 C++ google::protobuf::compiler::cpp::CppGenerator cpp_generator; cli.RegisterGenerator("--cpp_out", "--cpp_opt", &cpp_generator, "Generate C++ header and source."); #ifndef OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP // Proto2 Java google::protobuf::compiler::java::JavaGenerator java_generator; cli.RegisterGenerator("--java_out", "--java_opt", &java_generator, "Generate Java source file."); #endif // !OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP #ifndef OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP // Proto2 Python google::protobuf::compiler::python::Generator py_generator; cli.RegisterGenerator("--python_out", &py_generator, "Generate Python source file."); // Java Nano google::protobuf::compiler::javanano::JavaNanoGenerator javanano_generator; cli.RegisterGenerator("--javanano_out", &javanano_generator, "Generate Java Nano source file."); // PHP google::protobuf::compiler::php::Generator php_generator; cli.RegisterGenerator("--php_out", &php_generator, "Generate PHP source file."); // Ruby google::protobuf::compiler::ruby::Generator rb_generator; cli.RegisterGenerator("--ruby_out", &rb_generator, "Generate Ruby source file."); // CSharp google::protobuf::compiler::csharp::Generator csharp_generator; cli.RegisterGenerator("--csharp_out", "--csharp_opt", &csharp_generator, "Generate C# source file."); // Objective C google::protobuf::compiler::objectivec::ObjectiveCGenerator objc_generator; cli.RegisterGenerator("--objc_out", "--objc_opt", &objc_generator, "Generate Objective C header and source."); // JavaScript google::protobuf::compiler::js::Generator js_generator; cli.RegisterGenerator("--js_out", &js_generator, "Generate JavaScript source."); #endif // !OPENSOURCE_PROTOBUF_CPP_BOOTSTRAP return cli.Run(argc, argv); } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/mock_code_generator.cc000066400000000000000000000313671334102242000334150ustar00rootroot00000000000000// 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 #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef major #undef major #endif #ifdef minor #undef minor #endif namespace google { namespace protobuf { namespace compiler { // Returns the list of the names of files in all_files in the form of a // comma-separated string. string CommaSeparatedList(const std::vector all_files) { std::vector names; for (size_t i = 0; i < all_files.size(); i++) { names.push_back(all_files[i]->name()); } return Join(names, ","); } static const char* kFirstInsertionPointName = "first_mock_insertion_point"; static const char* kSecondInsertionPointName = "second_mock_insertion_point"; static const char* kFirstInsertionPoint = "# @@protoc_insertion_point(first_mock_insertion_point) is here\n"; static const char* kSecondInsertionPoint = " # @@protoc_insertion_point(second_mock_insertion_point) is here\n"; MockCodeGenerator::MockCodeGenerator(const string& name) : name_(name) {} MockCodeGenerator::~MockCodeGenerator() {} void MockCodeGenerator::ExpectGenerated( const string& name, const string& parameter, const string& insertions, const string& file, const string& first_message_name, const string& first_parsed_file_name, const string& output_directory) { string content; GOOGLE_CHECK_OK( File::GetContents(output_directory + "/" + GetOutputFileName(name, file), &content, true)); std::vector lines = Split(content, "\n", true); while (!lines.empty() && lines.back().empty()) { lines.pop_back(); } for (size_t i = 0; i < lines.size(); i++) { lines[i] += "\n"; } std::vector insertion_list; if (!insertions.empty()) { SplitStringUsing(insertions, ",", &insertion_list); } EXPECT_EQ(lines.size(), 3 + insertion_list.size() * 2); EXPECT_EQ(GetOutputFileContent(name, parameter, file, first_parsed_file_name, first_message_name), lines[0]); EXPECT_EQ(kFirstInsertionPoint, lines[1 + insertion_list.size()]); EXPECT_EQ(kSecondInsertionPoint, lines[2 + insertion_list.size() * 2]); for (size_t i = 0; i < insertion_list.size(); i++) { EXPECT_EQ(GetOutputFileContent(insertion_list[i], "first_insert", file, file, first_message_name), lines[1 + i]); // Second insertion point is indented, so the inserted text should // automatically be indented too. EXPECT_EQ(" " + GetOutputFileContent(insertion_list[i], "second_insert", file, file, first_message_name), lines[2 + insertion_list.size() + i]); } } namespace { void CheckSingleAnnotation(const string& expected_file, const string& expected_text, const string& file_content, const GeneratedCodeInfo::Annotation& annotation) { EXPECT_EQ(expected_file, annotation.source_file()); ASSERT_GE(file_content.size(), annotation.begin()); ASSERT_GE(file_content.size(), annotation.end()); ASSERT_LE(annotation.begin(), annotation.end()); EXPECT_EQ(expected_text.size(), annotation.end() - annotation.begin()); EXPECT_EQ(expected_text, file_content.substr(annotation.begin(), expected_text.size())); } } // anonymous namespace void MockCodeGenerator::CheckGeneratedAnnotations( const string& name, const string& file, const string& output_directory) { string file_content; GOOGLE_CHECK_OK( File::GetContents(output_directory + "/" + GetOutputFileName(name, file), &file_content, true)); string meta_content; GOOGLE_CHECK_OK(File::GetContents( output_directory + "/" + GetOutputFileName(name, file) + ".meta", &meta_content, true)); GeneratedCodeInfo annotations; GOOGLE_CHECK(TextFormat::ParseFromString(meta_content, &annotations)); ASSERT_EQ(3, annotations.annotation_size()); CheckSingleAnnotation("first_annotation", "first", file_content, annotations.annotation(0)); CheckSingleAnnotation("second_annotation", "second", file_content, annotations.annotation(1)); CheckSingleAnnotation("third_annotation", "third", file_content, annotations.annotation(2)); } bool MockCodeGenerator::Generate( const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const { bool annotate = false; for (int i = 0; i < file->message_type_count(); i++) { if (HasPrefixString(file->message_type(i)->name(), "MockCodeGenerator_")) { string command = StripPrefixString(file->message_type(i)->name(), "MockCodeGenerator_"); if (command == "Error") { *error = "Saw message type MockCodeGenerator_Error."; return false; } else if (command == "Exit") { std::cerr << "Saw message type MockCodeGenerator_Exit." << std::endl; exit(123); } else if (command == "Abort") { std::cerr << "Saw message type MockCodeGenerator_Abort." << std::endl; abort(); } else if (command == "HasSourceCodeInfo") { FileDescriptorProto file_descriptor_proto; file->CopySourceCodeInfoTo(&file_descriptor_proto); bool has_source_code_info = file_descriptor_proto.has_source_code_info() && file_descriptor_proto.source_code_info().location_size() > 0; std::cerr << "Saw message type MockCodeGenerator_HasSourceCodeInfo: " << has_source_code_info << "." << std::endl; abort(); } else if (command == "HasJsonName") { FieldDescriptorProto field_descriptor_proto; file->message_type(i)->field(0)->CopyTo(&field_descriptor_proto); std::cerr << "Saw json_name: " << field_descriptor_proto.has_json_name() << std::endl; abort(); } else if (command == "Annotate") { annotate = true; } else if (command == "ShowVersionNumber") { Version compiler_version; context->GetCompilerVersion(&compiler_version); std::cerr << "Saw compiler_version: " << compiler_version.major() * 1000000 + compiler_version.minor() * 1000 + compiler_version.patch() << " " << compiler_version.suffix() << std::endl; abort(); } else { GOOGLE_LOG(FATAL) << "Unknown MockCodeGenerator command: " << command; } } } if (HasPrefixString(parameter, "insert=")) { std::vector insert_into; SplitStringUsing(StripPrefixString(parameter, "insert="), ",", &insert_into); for (size_t i = 0; i < insert_into.size(); i++) { { google::protobuf::scoped_ptr output(context->OpenForInsert( GetOutputFileName(insert_into[i], file), kFirstInsertionPointName)); io::Printer printer(output.get(), '$'); printer.PrintRaw(GetOutputFileContent(name_, "first_insert", file, context)); if (printer.failed()) { *error = "MockCodeGenerator detected write error."; return false; } } { google::protobuf::scoped_ptr output( context->OpenForInsert(GetOutputFileName(insert_into[i], file), kSecondInsertionPointName)); io::Printer printer(output.get(), '$'); printer.PrintRaw(GetOutputFileContent(name_, "second_insert", file, context)); if (printer.failed()) { *error = "MockCodeGenerator detected write error."; return false; } } } } else { google::protobuf::scoped_ptr output( context->Open(GetOutputFileName(name_, file))); GeneratedCodeInfo annotations; io::AnnotationProtoCollector annotation_collector( &annotations); io::Printer printer(output.get(), '$', annotate ? &annotation_collector : NULL); printer.PrintRaw(GetOutputFileContent(name_, parameter, file, context)); string annotate_suffix = "_annotation"; if (annotate) { printer.Print("$p$", "p", "first"); printer.Annotate("p", "first" + annotate_suffix); } printer.PrintRaw(kFirstInsertionPoint); if (annotate) { printer.Print("$p$", "p", "second"); printer.Annotate("p", "second" + annotate_suffix); } printer.PrintRaw(kSecondInsertionPoint); if (annotate) { printer.Print("$p$", "p", "third"); printer.Annotate("p", "third" + annotate_suffix); } if (printer.failed()) { *error = "MockCodeGenerator detected write error."; return false; } if (annotate) { google::protobuf::scoped_ptr meta_output( context->Open(GetOutputFileName(name_, file) + ".meta")); if (!TextFormat::Print(annotations, meta_output.get())) { *error = "MockCodeGenerator couldn't write .meta"; return false; } } } return true; } string MockCodeGenerator::GetOutputFileName(const string& generator_name, const FileDescriptor* file) { return GetOutputFileName(generator_name, file->name()); } string MockCodeGenerator::GetOutputFileName(const string& generator_name, const string& file) { return file + ".MockCodeGenerator." + generator_name; } string MockCodeGenerator::GetOutputFileContent( const string& generator_name, const string& parameter, const FileDescriptor* file, GeneratorContext *context) { std::vector all_files; context->ListParsedFiles(&all_files); return GetOutputFileContent( generator_name, parameter, file->name(), CommaSeparatedList(all_files), file->message_type_count() > 0 ? file->message_type(0)->name() : "(none)"); } string MockCodeGenerator::GetOutputFileContent( const string& generator_name, const string& parameter, const string& file, const string& parsed_file_list, const string& first_message_name) { return strings::Substitute("$0: $1, $2, $3, $4\n", generator_name, parameter, file, first_message_name, parsed_file_list); } } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/mock_code_generator.h000066400000000000000000000137611334102242000332550ustar00rootroot00000000000000// 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_COMPILER_MOCK_CODE_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_MOCK_CODE_GENERATOR_H__ #include #include namespace google { namespace protobuf { class FileDescriptor; } // namespace protobuf namespace protobuf { namespace compiler { // A mock CodeGenerator, used by command_line_interface_unittest. This is in // its own file so that it can be used both directly and as a plugin. // // Generate() produces some output which can be checked by ExpectCalled(). The // generator can run in a different process (e.g. a plugin). // // If the parameter is "insert=NAMES", the MockCodeGenerator will insert lines // into the files generated by other MockCodeGenerators instead of creating // its own file. NAMES is a comma-separated list of the names of those other // MockCodeGenerators. // // MockCodeGenerator will also modify its behavior slightly if the input file // contains a message type with one of the following names: // MockCodeGenerator_Error: Causes Generate() to return false and set the // error message to "Saw message type MockCodeGenerator_Error." // MockCodeGenerator_Exit: Generate() prints "Saw message type // MockCodeGenerator_Exit." to stderr and then calls exit(123). // MockCodeGenerator_Abort: Generate() prints "Saw message type // MockCodeGenerator_Abort." to stderr and then calls abort(). // MockCodeGenerator_HasSourceCodeInfo: Causes Generate() to abort after // printing "Saw message type MockCodeGenerator_HasSourceCodeInfo: FOO." to // stderr, where FOO is "1" if the supplied FileDescriptorProto has source // code info, and "0" otherwise. // MockCodeGenerator_Annotate: Generate() will add annotations to its output // that can later be verified with CheckGeneratedAnnotations. class MockCodeGenerator : public CodeGenerator { public: MockCodeGenerator(const string& name); virtual ~MockCodeGenerator(); // Expect (via gTest) that a MockCodeGenerator with the given name was called // with the given parameters by inspecting the output location. // // |insertions| is a comma-separated list of names of MockCodeGenerators which // should have inserted lines into this file. // |parsed_file_list| is a comma-separated list of names of the files // that are being compiled together in this run. static void ExpectGenerated(const string& name, const string& parameter, const string& insertions, const string& file, const string& first_message_name, const string& parsed_file_list, const string& output_directory); // Checks that the correct text ranges were annotated by the // MockCodeGenerator_Annotate directive. static void CheckGeneratedAnnotations(const string& name, const string& file, const string& output_directory); // Get the name of the file which would be written by the given generator. static string GetOutputFileName(const string& generator_name, const FileDescriptor* file); static string GetOutputFileName(const string& generator_name, const string& file); // implements CodeGenerator ---------------------------------------- virtual bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const; private: string name_; static string GetOutputFileContent(const string& generator_name, const string& parameter, const FileDescriptor* file, GeneratorContext *context); static string GetOutputFileContent(const string& generator_name, const string& parameter, const string& file, const string& parsed_file_list, const string& first_message_name); }; } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_MOCK_CODE_GENERATOR_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec/000077500000000000000000000000001334102242000312205ustar00rootroot00000000000000objectivec_enum.cc000066400000000000000000000203511334102242000346120ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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 #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor) : descriptor_(descriptor), name_(EnumName(descriptor_)) { for (int i = 0; i < descriptor_->value_count(); i++) { const EnumValueDescriptor* value = descriptor_->value(i); const EnumValueDescriptor* canonical_value = descriptor_->FindValueByNumber(value->number()); if (value == canonical_value) { base_values_.push_back(value); } all_values_.push_back(value); } } EnumGenerator::~EnumGenerator() {} void EnumGenerator::GenerateHeader(io::Printer* printer) { string enum_comments; SourceLocation location; if (descriptor_->GetSourceLocation(&location)) { enum_comments = BuildCommentsString(location, true); } else { enum_comments = ""; } printer->Print( "#pragma mark - Enum $name$\n" "\n", "name", name_); printer->Print("$comments$typedef$deprecated_attribute$ GPB_ENUM($name$) {\n", "comments", enum_comments, "deprecated_attribute", GetOptionalDeprecatedAttribute(descriptor_, descriptor_->file()), "name", name_); printer->Indent(); if (HasPreservingUnknownEnumSemantics(descriptor_->file())) { // Include the unknown value. printer->Print( "/**\n" " * Value used if any message's field encounters a value that is not defined\n" " * by this enum. The message will also have C functions to get/set the rawValue\n" " * of the field.\n" " **/\n" "$name$_GPBUnrecognizedEnumeratorValue = kGPBUnrecognizedEnumeratorValue,\n", "name", name_); } for (int i = 0; i < all_values_.size(); i++) { SourceLocation location; if (all_values_[i]->GetSourceLocation(&location)) { string comments = BuildCommentsString(location, true).c_str(); if (comments.length() > 0) { if (i > 0) { printer->Print("\n"); } printer->Print(comments.c_str()); } } printer->Print( "$name$$deprecated_attribute$ = $value$,\n", "name", EnumValueName(all_values_[i]), "deprecated_attribute", GetOptionalDeprecatedAttribute(all_values_[i]), "value", SimpleItoa(all_values_[i]->number())); } printer->Outdent(); printer->Print( "};\n" "\n" "GPBEnumDescriptor *$name$_EnumDescriptor(void);\n" "\n" "/**\n" " * Checks to see if the given value is defined by the enum or was not known at\n" " * the time this source was generated.\n" " **/\n" "BOOL $name$_IsValidValue(int32_t value);\n" "\n", "name", name_); } void EnumGenerator::GenerateSource(io::Printer* printer) { printer->Print( "#pragma mark - Enum $name$\n" "\n", "name", name_); // Note: For the TextFormat decode info, we can't use the enum value as // the key because protocol buffer enums have 'allow_alias', which lets // a value be used more than once. Instead, the index into the list of // enum value descriptions is used. Note: start with -1 so the first one // will be zero. TextFormatDecodeData text_format_decode_data; int enum_value_description_key = -1; string text_blob; for (int i = 0; i < all_values_.size(); i++) { ++enum_value_description_key; string short_name(EnumValueShortName(all_values_[i])); text_blob += short_name + '\0'; if (UnCamelCaseEnumShortName(short_name) != all_values_[i]->name()) { text_format_decode_data.AddString(enum_value_description_key, short_name, all_values_[i]->name()); } } printer->Print( "GPBEnumDescriptor *$name$_EnumDescriptor(void) {\n" " static GPBEnumDescriptor *descriptor = NULL;\n" " if (!descriptor) {\n", "name", name_); static const int kBytesPerLine = 40; // allow for escaping printer->Print( " static const char *valueNames ="); for (int i = 0; i < text_blob.size(); i += kBytesPerLine) { printer->Print( "\n \"$data$\"", "data", EscapeTrigraphs(CEscape(text_blob.substr(i, kBytesPerLine)))); } printer->Print( ";\n" " static const int32_t values[] = {\n"); for (int i = 0; i < all_values_.size(); i++) { printer->Print(" $name$,\n", "name", EnumValueName(all_values_[i])); } printer->Print(" };\n"); if (text_format_decode_data.num_entries() == 0) { printer->Print( " GPBEnumDescriptor *worker =\n" " [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol($name$)\n" " valueNames:valueNames\n" " values:values\n" " count:(uint32_t)(sizeof(values) / sizeof(int32_t))\n" " enumVerifier:$name$_IsValidValue];\n", "name", name_); } else { printer->Print( " static const char *extraTextFormatInfo = \"$extraTextFormatInfo$\";\n" " GPBEnumDescriptor *worker =\n" " [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol($name$)\n" " valueNames:valueNames\n" " values:values\n" " count:(uint32_t)(sizeof(values) / sizeof(int32_t))\n" " enumVerifier:$name$_IsValidValue\n" " extraTextFormatInfo:extraTextFormatInfo];\n", "name", name_, "extraTextFormatInfo", CEscape(text_format_decode_data.Data())); } printer->Print( " if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) {\n" " [worker release];\n" " }\n" " }\n" " return descriptor;\n" "}\n\n"); printer->Print( "BOOL $name$_IsValidValue(int32_t value__) {\n" " switch (value__) {\n", "name", name_); for (int i = 0; i < base_values_.size(); i++) { printer->Print( " case $name$:\n", "name", EnumValueName(base_values_[i])); } printer->Print( " return YES;\n" " default:\n" " return NO;\n" " }\n" "}\n\n"); } } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_enum.h000066400000000000000000000051301334102242000344520ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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_OBJECTIVEC_ENUM_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_ENUM_H__ #include #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace objectivec { class EnumGenerator { public: explicit EnumGenerator(const EnumDescriptor* descriptor); ~EnumGenerator(); void GenerateHeader(io::Printer* printer); void GenerateSource(io::Printer* printer); const string& name() const { return name_; } private: const EnumDescriptor* descriptor_; vector base_values_; vector all_values_; const string name_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator); }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_ENUM_H__ objectivec_enum_field.cc000066400000000000000000000145351334102242000357640ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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 #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { namespace { void SetEnumVariables(const FieldDescriptor* descriptor, std::map* variables) { string type = EnumName(descriptor->enum_type()); (*variables)["storage_type"] = type; // For non repeated fields, if it was defined in a different file, the // property decls need to use "enum NAME" rather than just "NAME" to support // the forward declaration of the enums. if (!descriptor->is_repeated() && (descriptor->file() != descriptor->enum_type()->file())) { (*variables)["property_type"] = "enum " + type; } (*variables)["enum_verifier"] = type + "_IsValidValue"; (*variables)["enum_desc_func"] = type + "_EnumDescriptor"; (*variables)["dataTypeSpecific_name"] = "enumDescFunc"; (*variables)["dataTypeSpecific_value"] = (*variables)["enum_desc_func"]; const Descriptor* msg_descriptor = descriptor->containing_type(); (*variables)["owning_message_class"] = ClassName(msg_descriptor); } } // namespace EnumFieldGenerator::EnumFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : SingleFieldGenerator(descriptor, options) { SetEnumVariables(descriptor, &variables_); } EnumFieldGenerator::~EnumFieldGenerator() {} void EnumFieldGenerator::GenerateCFunctionDeclarations( io::Printer* printer) const { if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) { return; } printer->Print( variables_, "/**\n" " * Fetches the raw value of a @c $owning_message_class$'s @c $name$ property, even\n" " * if the value was not defined by the enum at the time the code was generated.\n" " **/\n" "int32_t $owning_message_class$_$capitalized_name$_RawValue($owning_message_class$ *message);\n" "/**\n" " * Sets the raw value of an @c $owning_message_class$'s @c $name$ property, allowing\n" " * it to be set to a value that was not defined by the enum at the time the code\n" " * was generated.\n" " **/\n" "void Set$owning_message_class$_$capitalized_name$_RawValue($owning_message_class$ *message, int32_t value);\n" "\n"); } void EnumFieldGenerator::GenerateCFunctionImplementations( io::Printer* printer) const { if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) return; printer->Print( variables_, "int32_t $owning_message_class$_$capitalized_name$_RawValue($owning_message_class$ *message) {\n" " GPBDescriptor *descriptor = [$owning_message_class$ descriptor];\n" " GPBFieldDescriptor *field = [descriptor fieldWithNumber:$field_number_name$];\n" " return GPBGetMessageInt32Field(message, field);\n" "}\n" "\n" "void Set$owning_message_class$_$capitalized_name$_RawValue($owning_message_class$ *message, int32_t value) {\n" " GPBDescriptor *descriptor = [$owning_message_class$ descriptor];\n" " GPBFieldDescriptor *field = [descriptor fieldWithNumber:$field_number_name$];\n" " GPBSetInt32IvarWithFieldInternal(message, field, value, descriptor.file.syntax);\n" "}\n" "\n"); } void EnumFieldGenerator::DetermineForwardDeclarations( std::set* fwd_decls) const { SingleFieldGenerator::DetermineForwardDeclarations(fwd_decls); // If it is an enum defined in a different file, then we'll need a forward // declaration for it. When it is in our file, all the enums are output // before the message, so it will be declared before it is needed. if (descriptor_->file() != descriptor_->enum_type()->file()) { // Enum name is already in "storage_type". const string& name = variable("storage_type"); fwd_decls->insert("GPB_ENUM_FWD_DECLARE(" + name + ")"); } } RepeatedEnumFieldGenerator::RepeatedEnumFieldGenerator( const FieldDescriptor* descriptor, const Options& options) : RepeatedFieldGenerator(descriptor, options) { SetEnumVariables(descriptor, &variables_); variables_["array_storage_type"] = "GPBEnumArray"; } RepeatedEnumFieldGenerator::~RepeatedEnumFieldGenerator() {} void RepeatedEnumFieldGenerator::FinishInitialization(void) { RepeatedFieldGenerator::FinishInitialization(); variables_["array_comment"] = "// |" + variables_["name"] + "| contains |" + variables_["storage_type"] + "|\n"; } } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_enum_field.h000066400000000000000000000063251334102242000356240ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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_OBJECTIVEC_ENUM_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_ENUM_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { class EnumFieldGenerator : public SingleFieldGenerator { friend FieldGenerator* FieldGenerator::Make(const FieldDescriptor* field, const Options& options); public: virtual void GenerateCFunctionDeclarations(io::Printer* printer) const; virtual void GenerateCFunctionImplementations(io::Printer* printer) const; virtual void DetermineForwardDeclarations(std::set* fwd_decls) const; protected: EnumFieldGenerator(const FieldDescriptor* descriptor, const Options& options); virtual ~EnumFieldGenerator(); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator); }; class RepeatedEnumFieldGenerator : public RepeatedFieldGenerator { friend FieldGenerator* FieldGenerator::Make(const FieldDescriptor* field, const Options& options); public: virtual void FinishInitialization(); protected: RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor, const Options& options); virtual ~RepeatedEnumFieldGenerator(); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator); }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_ENUM_FIELD_H__ objectivec_extension.cc000066400000000000000000000132111334102242000356570ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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 #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { ExtensionGenerator::ExtensionGenerator(const string& root_class_name, const FieldDescriptor* descriptor) : method_name_(ExtensionMethodName(descriptor)), root_class_and_method_name_(root_class_name + "_" + method_name_), descriptor_(descriptor) { if (descriptor->is_map()) { // 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. std::cerr << "error: Extension is a map<>!" << " That used to be blocked by the compiler." << std::endl; std::cerr.flush(); abort(); } } ExtensionGenerator::~ExtensionGenerator() {} void ExtensionGenerator::GenerateMembersHeader(io::Printer* printer) { std::map vars; vars["method_name"] = method_name_; SourceLocation location; if (descriptor_->GetSourceLocation(&location)) { vars["comments"] = BuildCommentsString(location, true); } else { vars["comments"] = ""; } // Unlike normal message fields, check if the file for the extension was // deprecated. vars["deprecated_attribute"] = GetOptionalDeprecatedAttribute(descriptor_, descriptor_->file()); printer->Print(vars, "$comments$" "+ (GPBExtensionDescriptor *)$method_name$$deprecated_attribute$;\n"); } void ExtensionGenerator::GenerateStaticVariablesInitialization( io::Printer* printer) { std::map vars; vars["root_class_and_method_name"] = root_class_and_method_name_; vars["extended_type"] = ClassName(descriptor_->containing_type()); vars["number"] = SimpleItoa(descriptor_->number()); std::vector options; if (descriptor_->is_repeated()) options.push_back("GPBExtensionRepeated"); if (descriptor_->is_packed()) options.push_back("GPBExtensionPacked"); if (descriptor_->containing_type()->options().message_set_wire_format()) options.push_back("GPBExtensionSetWireFormat"); vars["options"] = BuildFlagsString(FLAGTYPE_EXTENSION, options); ObjectiveCType objc_type = GetObjectiveCType(descriptor_); string singular_type; if (objc_type == OBJECTIVECTYPE_MESSAGE) { vars["type"] = string("GPBStringifySymbol(") + ClassName(descriptor_->message_type()) + ")"; } else { vars["type"] = "NULL"; } vars["default_name"] = GPBGenericValueFieldName(descriptor_); if (descriptor_->is_repeated()) { vars["default"] = "nil"; } else { vars["default"] = DefaultValue(descriptor_); } string type = GetCapitalizedType(descriptor_); vars["extension_type"] = string("GPBDataType") + type; if (objc_type == OBJECTIVECTYPE_ENUM) { vars["enum_desc_func_name"] = EnumName(descriptor_->enum_type()) + "_EnumDescriptor"; } else { vars["enum_desc_func_name"] = "NULL"; } printer->Print(vars, "{\n" " .defaultValue.$default_name$ = $default$,\n" " .singletonName = GPBStringifySymbol($root_class_and_method_name$),\n" " .extendedClass = GPBStringifySymbol($extended_type$),\n" " .messageOrGroupClassName = $type$,\n" " .enumDescriptorFunc = $enum_desc_func_name$,\n" " .fieldNumber = $number$,\n" " .dataType = $extension_type$,\n" " .options = $options$,\n" "},\n"); } void ExtensionGenerator::GenerateRegistrationSource(io::Printer* printer) { printer->Print( "[registry addExtension:$root_class_and_method_name$];\n", "root_class_and_method_name", root_class_and_method_name_); } } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_extension.h000066400000000000000000000052051334102242000355250ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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_OBJECTIVEC_EXTENSION_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_EXTENSION_H__ #include namespace google { namespace protobuf { class FieldDescriptor; // descriptor.h namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace objectivec { class ExtensionGenerator { public: ExtensionGenerator(const string& root_class_name, const FieldDescriptor* descriptor); ~ExtensionGenerator(); void GenerateMembersHeader(io::Printer* printer); void GenerateStaticVariablesInitialization(io::Printer* printer); void GenerateRegistrationSource(io::Printer* printer); private: string method_name_; string root_class_and_method_name_; const FieldDescriptor* descriptor_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator); }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_MESSAGE_H__ objectivec_field.cc000066400000000000000000000420241334102242000347320ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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 #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { namespace { void SetCommonFieldVariables(const FieldDescriptor* descriptor, std::map* variables) { string camel_case_name = FieldName(descriptor); string raw_field_name; if (descriptor->type() == FieldDescriptor::TYPE_GROUP) { raw_field_name = descriptor->message_type()->name(); } else { raw_field_name = descriptor->name(); } // The logic here has to match -[GGPBFieldDescriptor textFormatName]. const string un_camel_case_name( UnCamelCaseFieldName(camel_case_name, descriptor)); const bool needs_custom_name = (raw_field_name != un_camel_case_name); SourceLocation location; if (descriptor->GetSourceLocation(&location)) { (*variables)["comments"] = BuildCommentsString(location, true); } else { (*variables)["comments"] = "\n"; } const string& classname = ClassName(descriptor->containing_type()); (*variables)["classname"] = classname; (*variables)["name"] = camel_case_name; const string& capitalized_name = FieldNameCapitalized(descriptor); (*variables)["capitalized_name"] = capitalized_name; (*variables)["raw_field_name"] = raw_field_name; (*variables)["field_number_name"] = classname + "_FieldNumber_" + capitalized_name; (*variables)["field_number"] = SimpleItoa(descriptor->number()); (*variables)["field_type"] = GetCapitalizedType(descriptor); (*variables)["deprecated_attribute"] = GetOptionalDeprecatedAttribute(descriptor); std::vector field_flags; if (descriptor->is_repeated()) field_flags.push_back("GPBFieldRepeated"); if (descriptor->is_required()) field_flags.push_back("GPBFieldRequired"); if (descriptor->is_optional()) field_flags.push_back("GPBFieldOptional"); if (descriptor->is_packed()) field_flags.push_back("GPBFieldPacked"); // ObjC custom flags. if (descriptor->has_default_value()) field_flags.push_back("GPBFieldHasDefaultValue"); if (needs_custom_name) field_flags.push_back("GPBFieldTextFormatNameCustom"); if (descriptor->type() == FieldDescriptor::TYPE_ENUM) { field_flags.push_back("GPBFieldHasEnumDescriptor"); } (*variables)["fieldflags"] = BuildFlagsString(FLAGTYPE_FIELD, field_flags); (*variables)["default"] = DefaultValue(descriptor); (*variables)["default_name"] = GPBGenericValueFieldName(descriptor); (*variables)["dataTypeSpecific_name"] = "className"; (*variables)["dataTypeSpecific_value"] = "NULL"; (*variables)["storage_offset_value"] = "(uint32_t)offsetof(" + classname + "__storage_, " + camel_case_name + ")"; (*variables)["storage_offset_comment"] = ""; // Clear some common things so they can be set just when needed. (*variables)["storage_attribute"] = ""; } } // namespace FieldGenerator* FieldGenerator::Make(const FieldDescriptor* field, const Options& options) { FieldGenerator* result = NULL; if (field->is_repeated()) { switch (GetObjectiveCType(field)) { case OBJECTIVECTYPE_MESSAGE: { if (field->is_map()) { result = new MapFieldGenerator(field, options); } else { result = new RepeatedMessageFieldGenerator(field, options); } break; } case OBJECTIVECTYPE_ENUM: result = new RepeatedEnumFieldGenerator(field, options); break; default: result = new RepeatedPrimitiveFieldGenerator(field, options); break; } } else { switch (GetObjectiveCType(field)) { case OBJECTIVECTYPE_MESSAGE: { result = new MessageFieldGenerator(field, options); break; } case OBJECTIVECTYPE_ENUM: result = new EnumFieldGenerator(field, options); break; default: if (IsReferenceType(field)) { result = new PrimitiveObjFieldGenerator(field, options); } else { result = new PrimitiveFieldGenerator(field, options); } break; } } result->FinishInitialization(); return result; } FieldGenerator::FieldGenerator(const FieldDescriptor* descriptor, const Options& options) : descriptor_(descriptor) { SetCommonFieldVariables(descriptor, &variables_); } FieldGenerator::~FieldGenerator() {} void FieldGenerator::GenerateFieldNumberConstant(io::Printer* printer) const { printer->Print( variables_, "$field_number_name$ = $field_number$,\n"); } void FieldGenerator::GenerateCFunctionDeclarations( io::Printer* printer) const { // Nothing } void FieldGenerator::GenerateCFunctionImplementations( io::Printer* printer) const { // Nothing } void FieldGenerator::DetermineForwardDeclarations( std::set* fwd_decls) const { // Nothing } void FieldGenerator::GenerateFieldDescription( io::Printer* printer, bool include_default) const { // Printed in the same order as the structure decl. if (include_default) { printer->Print( variables_, "{\n" " .defaultValue.$default_name$ = $default$,\n" " .core.name = \"$name$\",\n" " .core.dataTypeSpecific.$dataTypeSpecific_name$ = $dataTypeSpecific_value$,\n" " .core.number = $field_number_name$,\n" " .core.hasIndex = $has_index$,\n" " .core.offset = $storage_offset_value$,$storage_offset_comment$\n" " .core.flags = $fieldflags$,\n" " .core.dataType = GPBDataType$field_type$,\n" "},\n"); } else { printer->Print( variables_, "{\n" " .name = \"$name$\",\n" " .dataTypeSpecific.$dataTypeSpecific_name$ = $dataTypeSpecific_value$,\n" " .number = $field_number_name$,\n" " .hasIndex = $has_index$,\n" " .offset = $storage_offset_value$,$storage_offset_comment$\n" " .flags = $fieldflags$,\n" " .dataType = GPBDataType$field_type$,\n" "},\n"); } } void FieldGenerator::SetRuntimeHasBit(int has_index) { variables_["has_index"] = SimpleItoa(has_index); } void FieldGenerator::SetNoHasBit(void) { variables_["has_index"] = "GPBNoHasBit"; } int FieldGenerator::ExtraRuntimeHasBitsNeeded(void) const { return 0; } void FieldGenerator::SetExtraRuntimeHasBitsBase(int index_base) { // 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. std::cerr << "Error: should have overridden SetExtraRuntimeHasBitsBase()." << std::endl; std::cerr.flush(); abort(); } void FieldGenerator::SetOneofIndexBase(int index_base) { if (descriptor_->containing_oneof() != NULL) { int index = descriptor_->containing_oneof()->index() + index_base; // Flip the sign to mark it as a oneof. variables_["has_index"] = SimpleItoa(-index); } } void FieldGenerator::FinishInitialization(void) { // If "property_type" wasn't set, make it "storage_type". if ((variables_.find("property_type") == variables_.end()) && (variables_.find("storage_type") != variables_.end())) { variables_["property_type"] = variable("storage_type"); } } SingleFieldGenerator::SingleFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : FieldGenerator(descriptor, options) { // Nothing } SingleFieldGenerator::~SingleFieldGenerator() {} void SingleFieldGenerator::GenerateFieldStorageDeclaration( io::Printer* printer) const { printer->Print(variables_, "$storage_type$ $name$;\n"); } void SingleFieldGenerator::GeneratePropertyDeclaration( io::Printer* printer) const { printer->Print(variables_, "$comments$"); printer->Print( variables_, "@property(nonatomic, readwrite) $property_type$ $name$$deprecated_attribute$;\n" "\n"); if (WantsHasProperty()) { printer->Print( variables_, "@property(nonatomic, readwrite) BOOL has$capitalized_name$$deprecated_attribute$;\n"); } } void SingleFieldGenerator::GeneratePropertyImplementation( io::Printer* printer) const { if (WantsHasProperty()) { printer->Print(variables_, "@dynamic has$capitalized_name$, $name$;\n"); } else { printer->Print(variables_, "@dynamic $name$;\n"); } } bool SingleFieldGenerator::WantsHasProperty(void) const { if (descriptor_->containing_oneof() != NULL) { // If in a oneof, it uses the oneofcase instead of a has bit. return false; } if (HasFieldPresence(descriptor_->file())) { // In proto1/proto2, every field has a has_$name$() method. return true; } return false; } bool SingleFieldGenerator::RuntimeUsesHasBit(void) const { if (descriptor_->containing_oneof() != NULL) { // The oneof tracks what is set instead. return false; } return true; } ObjCObjFieldGenerator::ObjCObjFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : SingleFieldGenerator(descriptor, options) { variables_["property_storage_attribute"] = "strong"; if (IsRetainedName(variables_["name"])) { variables_["storage_attribute"] = " NS_RETURNS_NOT_RETAINED"; } } ObjCObjFieldGenerator::~ObjCObjFieldGenerator() {} void ObjCObjFieldGenerator::GenerateFieldStorageDeclaration( io::Printer* printer) const { printer->Print(variables_, "$storage_type$ *$name$;\n"); } void ObjCObjFieldGenerator::GeneratePropertyDeclaration( io::Printer* printer) const { // Differs from SingleFieldGenerator::GeneratePropertyDeclaration() in that // it uses pointers and deals with Objective C's rules around storage name // conventions (init*, new*, etc.) printer->Print(variables_, "$comments$"); printer->Print( variables_, "@property(nonatomic, readwrite, $property_storage_attribute$, null_resettable) $property_type$ *$name$$storage_attribute$$deprecated_attribute$;\n"); if (WantsHasProperty()) { printer->Print( variables_, "/** Test to see if @c $name$ has been set. */\n" "@property(nonatomic, readwrite) BOOL has$capitalized_name$$deprecated_attribute$;\n"); } if (IsInitName(variables_.find("name")->second)) { // If property name starts with init we need to annotate it to get past ARC. // http://stackoverflow.com/questions/18723226/how-do-i-annotate-an-objective-c-property-with-an-objc-method-family/18723227#18723227 printer->Print(variables_, "- ($property_type$ *)$name$ GPB_METHOD_FAMILY_NONE$deprecated_attribute$;\n"); } printer->Print("\n"); } RepeatedFieldGenerator::RepeatedFieldGenerator( const FieldDescriptor* descriptor, const Options& options) : ObjCObjFieldGenerator(descriptor, options) { // Default to no comment and let the cases needing it fill it in. variables_["array_comment"] = ""; } RepeatedFieldGenerator::~RepeatedFieldGenerator() {} void RepeatedFieldGenerator::FinishInitialization(void) { FieldGenerator::FinishInitialization(); if (variables_.find("array_property_type") == variables_.end()) { variables_["array_property_type"] = variable("array_storage_type"); } } void RepeatedFieldGenerator::GenerateFieldStorageDeclaration( io::Printer* printer) const { printer->Print(variables_, "$array_storage_type$ *$name$;\n"); } void RepeatedFieldGenerator::GeneratePropertyImplementation( io::Printer* printer) const { printer->Print(variables_, "@dynamic $name$, $name$_Count;\n"); } void RepeatedFieldGenerator::GeneratePropertyDeclaration( io::Printer* printer) const { // Repeated fields don't need the has* properties, but they do expose a // *Count (to check without autocreation). So for the field property we need // the same logic as ObjCObjFieldGenerator::GeneratePropertyDeclaration() for // dealing with needing Objective C's rules around storage name conventions // (init*, new*, etc.) printer->Print( variables_, "$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" "@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. // http://stackoverflow.com/questions/18723226/how-do-i-annotate-an-objective-c-property-with-an-objc-method-family/18723227#18723227 printer->Print(variables_, "- ($array_property_type$ *)$name$ GPB_METHOD_FAMILY_NONE$deprecated_attribute$;\n"); } printer->Print("\n"); } bool RepeatedFieldGenerator::WantsHasProperty(void) const { // Consumer check the array size/existance rather than a has bit. return false; } bool RepeatedFieldGenerator::RuntimeUsesHasBit(void) const { return false; // The array having anything is what is used. } FieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor, const Options& options) : descriptor_(descriptor), field_generators_( new scoped_ptr[descriptor->field_count()]), extension_generators_( new scoped_ptr[descriptor->extension_count()]) { // Construct all the FieldGenerators. for (int i = 0; i < descriptor->field_count(); i++) { field_generators_[i].reset( FieldGenerator::Make(descriptor->field(i), options)); } for (int i = 0; i < descriptor->extension_count(); i++) { extension_generators_[i].reset( FieldGenerator::Make(descriptor->extension(i), options)); } } FieldGeneratorMap::~FieldGeneratorMap() {} const FieldGenerator& FieldGeneratorMap::get( const FieldDescriptor* field) const { GOOGLE_CHECK_EQ(field->containing_type(), descriptor_); return *field_generators_[field->index()]; } const FieldGenerator& FieldGeneratorMap::get_extension(int index) const { return *extension_generators_[index]; } int FieldGeneratorMap::CalculateHasBits(void) { int total_bits = 0; for (int i = 0; i < descriptor_->field_count(); i++) { if (field_generators_[i]->RuntimeUsesHasBit()) { field_generators_[i]->SetRuntimeHasBit(total_bits); ++total_bits; } else { field_generators_[i]->SetNoHasBit(); } int extra_bits = field_generators_[i]->ExtraRuntimeHasBitsNeeded(); if (extra_bits) { field_generators_[i]->SetExtraRuntimeHasBitsBase(total_bits); total_bits += extra_bits; } } return total_bits; } void FieldGeneratorMap::SetOneofIndexBase(int index_base) { for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_[i]->SetOneofIndexBase(index_base); } } bool FieldGeneratorMap::DoesAnyFieldHaveNonZeroDefault(void) const { for (int i = 0; i < descriptor_->field_count(); i++) { if (HasNonZeroDefaultValue(descriptor_->field(i))) { return true; } } return false; } } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_field.h000066400000000000000000000156601334102242000346020ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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_OBJECTIVEC_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_FIELD_H__ #include #include #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } // namespace io namespace compiler { namespace objectivec { class FieldGenerator { public: static FieldGenerator* Make(const FieldDescriptor* field, const Options& options); virtual ~FieldGenerator(); // Exposed for subclasses to fill in. virtual void GenerateFieldStorageDeclaration(io::Printer* printer) const = 0; virtual void GeneratePropertyDeclaration(io::Printer* printer) const = 0; virtual void GeneratePropertyImplementation(io::Printer* printer) const = 0; // Called by GenerateFieldDescription, exposed for classes that need custom // generation. // Exposed for subclasses to extend, base does nothing. virtual void GenerateCFunctionDeclarations(io::Printer* printer) const; virtual void GenerateCFunctionImplementations(io::Printer* printer) const; // Exposed for subclasses, should always call it on the parent class also. virtual void DetermineForwardDeclarations(std::set* fwd_decls) const; // Used during generation, not intended to be extended by subclasses. void GenerateFieldDescription( io::Printer* printer, bool include_default) const; void GenerateFieldNumberConstant(io::Printer* printer) const; // Exposed to get and set the has bits information. virtual bool RuntimeUsesHasBit(void) const = 0; void SetRuntimeHasBit(int has_index); void SetNoHasBit(void); virtual int ExtraRuntimeHasBitsNeeded(void) const; virtual void SetExtraRuntimeHasBitsBase(int index_base); void SetOneofIndexBase(int index_base); string variable(const char* key) const { return variables_.find(key)->second; } bool needs_textformat_name_support() const { const string& field_flags = variable("fieldflags"); return field_flags.find("GPBFieldTextFormatNameCustom") != string::npos; } string generated_objc_name() const { return variable("name"); } string raw_field_name() const { return variable("raw_field_name"); } protected: FieldGenerator(const FieldDescriptor* descriptor, const Options& options); virtual void FinishInitialization(void); virtual bool WantsHasProperty(void) const = 0; const FieldDescriptor* descriptor_; std::map variables_; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGenerator); }; class SingleFieldGenerator : public FieldGenerator { public: virtual ~SingleFieldGenerator(); virtual void GenerateFieldStorageDeclaration(io::Printer* printer) const; virtual void GeneratePropertyDeclaration(io::Printer* printer) const; virtual void GeneratePropertyImplementation(io::Printer* printer) const; virtual bool RuntimeUsesHasBit(void) const; protected: SingleFieldGenerator(const FieldDescriptor* descriptor, const Options& options); virtual bool WantsHasProperty(void) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SingleFieldGenerator); }; // Subclass with common support for when the field ends up as an ObjC Object. class ObjCObjFieldGenerator : public SingleFieldGenerator { public: virtual ~ObjCObjFieldGenerator(); virtual void GenerateFieldStorageDeclaration(io::Printer* printer) const; virtual void GeneratePropertyDeclaration(io::Printer* printer) const; protected: ObjCObjFieldGenerator(const FieldDescriptor* descriptor, const Options& options); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjCObjFieldGenerator); }; class RepeatedFieldGenerator : public ObjCObjFieldGenerator { public: virtual ~RepeatedFieldGenerator(); virtual void GenerateFieldStorageDeclaration(io::Printer* printer) const; virtual void GeneratePropertyDeclaration(io::Printer* printer) const; virtual void GeneratePropertyImplementation(io::Printer* printer) const; virtual bool RuntimeUsesHasBit(void) const; protected: RepeatedFieldGenerator(const FieldDescriptor* descriptor, const Options& options); virtual void FinishInitialization(void); virtual bool WantsHasProperty(void) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedFieldGenerator); }; // Convenience class which constructs FieldGenerators for a Descriptor. class FieldGeneratorMap { public: FieldGeneratorMap(const Descriptor* descriptor, const Options& options); ~FieldGeneratorMap(); const FieldGenerator& get(const FieldDescriptor* field) const; const FieldGenerator& get_extension(int index) const; // Assigns the has bits and returns the number of bits needed. int CalculateHasBits(void); void SetOneofIndexBase(int index_base); // Check if any field of this message has a non zero default. bool DoesAnyFieldHaveNonZeroDefault(void) const; private: const Descriptor* descriptor_; scoped_array > field_generators_; scoped_array > extension_generators_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap); }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_FIELD_H__ objectivec_file.cc000066400000000000000000000514741334102242000345770ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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 #include #include #include #include #include #include #include #include #include // std::find() #include #include // 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. namespace google { namespace protobuf { namespace compiler { namespace objectivec { namespace { // This is also found in GPBBootstrap.h, and needs to be kept in sync. const int32 GOOGLE_PROTOBUF_OBJC_VERSION = 30002; const char* kHeaderExtension = ".pbobjc.h"; // Checks if a message contains any extension definitions (on the message or // a nested message under it). bool MessageContainsExtensions(const Descriptor* message) { if (message->extension_count() > 0) { return true; } for (int i = 0; i < message->nested_type_count(); i++) { if (MessageContainsExtensions(message->nested_type(i))) { return true; } } return false; } // Checks if the file contains any extensions definitions (at the root or // nested under a message). bool FileContainsExtensions(const FileDescriptor* file) { if (file->extension_count() > 0) { return true; } for (int i = 0; i < file->message_type_count(); i++) { if (MessageContainsExtensions(file->message_type(i))) { return true; } } return false; } // Helper for CollectMinimalFileDepsContainingExtensionsWorker that marks all // deps as visited and prunes them from the needed files list. void PruneFileAndDepsMarkingAsVisited( const FileDescriptor* file, vector* files, std::set* files_visited) { vector::iterator iter = std::find(files->begin(), files->end(), file); if (iter != files->end()) { files->erase(iter); } files_visited->insert(file); for (int i = 0; i < file->dependency_count(); i++) { PruneFileAndDepsMarkingAsVisited(file->dependency(i), files, files_visited); } } // Helper for CollectMinimalFileDepsContainingExtensions. void CollectMinimalFileDepsContainingExtensionsWorker( const FileDescriptor* file, vector* files, std::set* files_visited) { if (files_visited->find(file) != files_visited->end()) { return; } files_visited->insert(file); if (FileContainsExtensions(file)) { files->push_back(file); for (int i = 0; i < file->dependency_count(); i++) { const FileDescriptor* dep = file->dependency(i); PruneFileAndDepsMarkingAsVisited(dep, files, files_visited); } } else { for (int i = 0; i < file->dependency_count(); i++) { const FileDescriptor* dep = file->dependency(i); CollectMinimalFileDepsContainingExtensionsWorker(dep, files, files_visited); } } } // Collect the deps of the given file that contain extensions. This can be used to // create the chain of roots that need to be wired together. // // NOTE: If any changes are made to this and the supporting functions, you will // need to manually validate what the generated code is for the test files: // objectivec/Tests/unittest_extension_chain_*.proto // There are comments about what the expected code should be line and limited // testing objectivec/Tests/GPBUnittestProtos2.m around compilation (#imports // specifically). void CollectMinimalFileDepsContainingExtensions( const FileDescriptor* file, vector* files) { std::set files_visited; for (int i = 0; i < file->dependency_count(); i++) { const FileDescriptor* dep = file->dependency(i); CollectMinimalFileDepsContainingExtensionsWorker(dep, files, &files_visited); } } bool IsDirectDependency(const FileDescriptor* dep, const FileDescriptor* file) { for (int i = 0; i < file->dependency_count(); i++) { if (dep == file->dependency(i)) { return true; } } return false; } } // namespace FileGenerator::FileGenerator(const FileDescriptor *file, const Options& options) : file_(file), root_class_name_(FileClassName(file)), options_(options) { for (int i = 0; i < file_->enum_type_count(); i++) { EnumGenerator *generator = new EnumGenerator(file_->enum_type(i)); enum_generators_.push_back(generator); } for (int i = 0; i < file_->message_type_count(); i++) { MessageGenerator *generator = new MessageGenerator(root_class_name_, file_->message_type(i), options_); message_generators_.push_back(generator); } for (int i = 0; i < file_->extension_count(); i++) { ExtensionGenerator *generator = new ExtensionGenerator(root_class_name_, file_->extension(i)); extension_generators_.push_back(generator); } } FileGenerator::~FileGenerator() { STLDeleteContainerPointers(enum_generators_.begin(), enum_generators_.end()); STLDeleteContainerPointers(message_generators_.begin(), message_generators_.end()); STLDeleteContainerPointers(extension_generators_.begin(), extension_generators_.end()); } void FileGenerator::GenerateHeader(io::Printer *printer) { PrintFileRuntimePreamble(printer, "GPBProtocolBuffers.h"); // Add some verification that the generated code matches the source the // code is being compiled with. // NOTE: This captures the raw numeric values at the time the generator was // compiled, since that will be the versions for the ObjC runtime at that // time. The constants in the generated code will then get their values at // at compile time (so checking against the headers being used to compile). printer->Print( "#if GOOGLE_PROTOBUF_OBJC_VERSION < $google_protobuf_objc_version$\n" "#error This file was generated by a newer version of protoc which is incompatible with your Protocol Buffer library sources.\n" "#endif\n" "#if $google_protobuf_objc_version$ < GOOGLE_PROTOBUF_OBJC_MIN_SUPPORTED_VERSION\n" "#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", SimpleItoa(GOOGLE_PROTOBUF_OBJC_VERSION)); // #import any headers for "public imports" in the proto file. { ImportWriter import_writer( options_.generate_for_named_framework, options_.named_framework_to_proto_path_mappings_path); const string header_extension(kHeaderExtension); for (int i = 0; i < file_->public_dependency_count(); i++) { import_writer.AddFile(file_->public_dependency(i), header_extension); } import_writer.Print(printer); } // Note: // deprecated-declarations suppression is only needed if some place in this // proto file is something deprecated or if it references something from // another file that is deprecated. printer->Print( "// @@protoc_insertion_point(imports)\n" "\n" "#pragma clang diagnostic push\n" "#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n" "\n" "CF_EXTERN_C_BEGIN\n" "\n"); std::set fwd_decls; for (vector::iterator iter = message_generators_.begin(); iter != message_generators_.end(); ++iter) { (*iter)->DetermineForwardDeclarations(&fwd_decls); } for (std::set::const_iterator i(fwd_decls.begin()); i != fwd_decls.end(); ++i) { printer->Print("$value$;\n", "value", *i); } if (fwd_decls.begin() != fwd_decls.end()) { printer->Print("\n"); } printer->Print( "NS_ASSUME_NONNULL_BEGIN\n" "\n"); // need to write out all enums first for (vector::iterator iter = enum_generators_.begin(); iter != enum_generators_.end(); ++iter) { (*iter)->GenerateHeader(printer); } for (vector::iterator iter = message_generators_.begin(); iter != message_generators_.end(); ++iter) { (*iter)->GenerateEnumHeader(printer); } // For extensions to chain together, the Root gets created even if there // are no extensions. printer->Print( "#pragma mark - $root_class_name$\n" "\n" "/**\n" " * Exposes the extension registry for this file.\n" " *\n" " * The base class provides:\n" " * @code\n" " * + (GPBExtensionRegistry *)extensionRegistry;\n" " * @endcode\n" " * which is a @c GPBExtensionRegistry that includes all the extensions defined by\n" " * this file and all files that it depends on.\n" " **/\n" "@interface $root_class_name$ : GPBRootObject\n" "@end\n" "\n", "root_class_name", root_class_name_); if (extension_generators_.size() > 0) { // The dynamic methods block is only needed if there are extensions. printer->Print( "@interface $root_class_name$ (DynamicMethods)\n", "root_class_name", root_class_name_); for (vector::iterator iter = extension_generators_.begin(); iter != extension_generators_.end(); ++iter) { (*iter)->GenerateMembersHeader(printer); } printer->Print("@end\n\n"); } // extension_generators_.size() > 0 for (vector::iterator iter = message_generators_.begin(); iter != message_generators_.end(); ++iter) { (*iter)->GenerateMessageHeader(printer); } printer->Print( "NS_ASSUME_NONNULL_END\n" "\n" "CF_EXTERN_C_END\n" "\n" "#pragma clang diagnostic pop\n" "\n" "// @@protoc_insertion_point(global_scope)\n"); } void FileGenerator::GenerateSource(io::Printer *printer) { // #import the runtime support. PrintFileRuntimePreamble(printer, "GPBProtocolBuffers_RuntimeSupport.h"); vector deps_with_extensions; CollectMinimalFileDepsContainingExtensions(file_, &deps_with_extensions); { ImportWriter import_writer( options_.generate_for_named_framework, options_.named_framework_to_proto_path_mappings_path); const string header_extension(kHeaderExtension); // #import the header for this proto file. import_writer.AddFile(file_, header_extension); // #import the headers for anything that a plain dependency of this proto // file (that means they were just an include, not a "public" include). std::set public_import_names; for (int i = 0; i < file_->public_dependency_count(); i++) { public_import_names.insert(file_->public_dependency(i)->name()); } for (int i = 0; i < file_->dependency_count(); i++) { const FileDescriptor *dep = file_->dependency(i); bool public_import = (public_import_names.count(dep->name()) != 0); if (!public_import) { import_writer.AddFile(dep, header_extension); } } // If any indirect dependency provided extensions, it needs to be directly // imported so it can get merged into the root's extensions registry. // See the Note by CollectMinimalFileDepsContainingExtensions before // changing this. for (vector::iterator iter = deps_with_extensions.begin(); iter != deps_with_extensions.end(); ++iter) { if (!IsDirectDependency(*iter, file_)) { import_writer.AddFile(*iter, header_extension); } } import_writer.Print(printer); } bool includes_oneof = false; for (vector::iterator iter = message_generators_.begin(); iter != message_generators_.end(); ++iter) { if ((*iter)->IncludesOneOfDefinition()) { includes_oneof = true; break; } } // Note: // deprecated-declarations suppression is only needed if some place in this // proto file is something deprecated or if it references something from // another file that is deprecated. printer->Print( "// @@protoc_insertion_point(imports)\n" "\n" "#pragma clang diagnostic push\n" "#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n"); if (includes_oneof) { // The generated code for oneof's uses direct ivar access, suppress the // warning incase developer turn that on in the context they compile the // generated code. printer->Print( "#pragma clang diagnostic ignored \"-Wdirect-ivar-access\"\n"); } printer->Print( "\n" "#pragma mark - $root_class_name$\n" "\n" "@implementation $root_class_name$\n\n", "root_class_name", root_class_name_); const bool file_contains_extensions = FileContainsExtensions(file_); // If there were any extensions or this file has any dependencies, output // a registry to override to create the file specific registry. if (file_contains_extensions || !deps_with_extensions.empty()) { printer->Print( "+ (GPBExtensionRegistry*)extensionRegistry {\n" " // This is called by +initialize so there is no need to worry\n" " // about thread safety and initialization of registry.\n" " static GPBExtensionRegistry* registry = nil;\n" " if (!registry) {\n" " GPB_DEBUG_CHECK_RUNTIME_VERSIONS();\n" " registry = [[GPBExtensionRegistry alloc] init];\n"); printer->Indent(); printer->Indent(); if (file_contains_extensions) { printer->Print( "static GPBExtensionDescription descriptions[] = {\n"); printer->Indent(); for (vector::iterator iter = extension_generators_.begin(); iter != extension_generators_.end(); ++iter) { (*iter)->GenerateStaticVariablesInitialization(printer); } for (vector::iterator iter = message_generators_.begin(); iter != message_generators_.end(); ++iter) { (*iter)->GenerateStaticVariablesInitialization(printer); } printer->Outdent(); printer->Print( "};\n" "for (size_t i = 0; i < sizeof(descriptions) / sizeof(descriptions[0]); ++i) {\n" " GPBExtensionDescriptor *extension =\n" " [[GPBExtensionDescriptor alloc] initWithExtensionDescription:&descriptions[i]];\n" " [registry addExtension:extension];\n" " [self globallyRegisterExtension:extension];\n" " [extension release];\n" "}\n"); } if (deps_with_extensions.empty()) { printer->Print( "// None of the imports (direct or indirect) defined extensions, so no need to add\n" "// them to this registry.\n"); } else { printer->Print( "// Merge in the imports (direct or indirect) that defined extensions.\n"); for (vector::iterator iter = deps_with_extensions.begin(); iter != deps_with_extensions.end(); ++iter) { const string root_class_name(FileClassName((*iter))); printer->Print( "[registry addExtensions:[$dependency$ extensionRegistry]];\n", "dependency", root_class_name); } } printer->Outdent(); printer->Outdent(); printer->Print( " }\n" " return registry;\n" "}\n"); } else { if (file_->dependency_count() > 0) { printer->Print( "// No extensions in the file and none of the imports (direct or indirect)\n" "// defined extensions, so no need to generate +extensionRegistry.\n"); } else { printer->Print( "// No extensions in the file and no imports, so no need to generate\n" "// +extensionRegistry.\n"); } } printer->Print("\n@end\n\n"); // File descriptor only needed if there are messages to use it. if (message_generators_.size() > 0) { std::map vars; vars["root_class_name"] = root_class_name_; vars["package"] = file_->package(); vars["objc_prefix"] = FileClassPrefix(file_); switch (file_->syntax()) { case FileDescriptor::SYNTAX_UNKNOWN: vars["syntax"] = "GPBFileSyntaxUnknown"; break; case FileDescriptor::SYNTAX_PROTO2: vars["syntax"] = "GPBFileSyntaxProto2"; break; case FileDescriptor::SYNTAX_PROTO3: vars["syntax"] = "GPBFileSyntaxProto3"; break; } printer->Print(vars, "#pragma mark - $root_class_name$_FileDescriptor\n" "\n" "static GPBFileDescriptor *$root_class_name$_FileDescriptor(void) {\n" " // This is called by +initialize so there is no need to worry\n" " // about thread safety of the singleton.\n" " static GPBFileDescriptor *descriptor = NULL;\n" " if (!descriptor) {\n" " GPB_DEBUG_CHECK_RUNTIME_VERSIONS();\n"); if (vars["objc_prefix"].size() > 0) { printer->Print( vars, " descriptor = [[GPBFileDescriptor alloc] initWithPackage:@\"$package$\"\n" " objcPrefix:@\"$objc_prefix$\"\n" " syntax:$syntax$];\n"); } else { printer->Print( vars, " descriptor = [[GPBFileDescriptor alloc] initWithPackage:@\"$package$\"\n" " syntax:$syntax$];\n"); } printer->Print( " }\n" " return descriptor;\n" "}\n" "\n"); } for (vector::iterator iter = enum_generators_.begin(); iter != enum_generators_.end(); ++iter) { (*iter)->GenerateSource(printer); } for (vector::iterator iter = message_generators_.begin(); iter != message_generators_.end(); ++iter) { (*iter)->GenerateSource(printer); } printer->Print( "\n" "#pragma clang diagnostic pop\n" "\n" "// @@protoc_insertion_point(global_scope)\n"); } // Helper to print the import of the runtime support at the top of generated // files. This currently only supports the runtime coming from a framework // as defined by the official CocoaPod. void FileGenerator::PrintFileRuntimePreamble( io::Printer* printer, const string& header_to_import) const { printer->Print( "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" "// source: $filename$\n" "\n", "filename", file_->name()); const string framework_name(ProtobufLibraryFrameworkName); const string cpp_symbol(ProtobufFrameworkImportSymbol(framework_name)); printer->Print( "// This CPP symbol can be defined to use imports that match up to the framework\n" "// imports needed when using CocoaPods.\n" "#if !defined($cpp_symbol$)\n" " #define $cpp_symbol$ 0\n" "#endif\n" "\n" "#if $cpp_symbol$\n" " #import <$framework_name$/$header$>\n" "#else\n" " #import \"$header$\"\n" "#endif\n" "\n", "cpp_symbol", cpp_symbol, "header", header_to_import, "framework_name", framework_name); } } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_file.h000066400000000000000000000057271334102242000344410ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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_OBJECTIVEC_FILE_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_FILE_H__ #include #include #include #include #include namespace google { namespace protobuf { class FileDescriptor; // descriptor.h namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace objectivec { class EnumGenerator; class ExtensionGenerator; class MessageGenerator; class FileGenerator { public: FileGenerator(const FileDescriptor* file, const Options& options); ~FileGenerator(); void GenerateSource(io::Printer* printer); void GenerateHeader(io::Printer* printer); const string& RootClassName() const { return root_class_name_; } private: const FileDescriptor* file_; string root_class_name_; vector enum_generators_; vector message_generators_; vector extension_generators_; const Options options_; void PrintFileRuntimePreamble( io::Printer* printer, const string& header_to_import) const; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator); }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_FILE_H__ objectivec_generator.cc000066400000000000000000000162601334102242000356400ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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 #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { ObjectiveCGenerator::ObjectiveCGenerator() {} ObjectiveCGenerator::~ObjectiveCGenerator() {} bool ObjectiveCGenerator::HasGenerateAll() const { return true; } bool ObjectiveCGenerator::Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const { *error = "Unimplemented Generate() method. Call GenerateAll() instead."; return false; } bool ObjectiveCGenerator::GenerateAll(const vector& files, const string& parameter, GeneratorContext* context, string* error) const { // ----------------------------------------------------------------- // Parse generator options. These options are passed to the compiler using the // --objc_opt flag. The options are passed as a comma separated list of // options along with their values. If the option appears multiple times, only // the last value will be considered. // // e.g. protoc ... --objc_opt=expected_prefixes=file.txt,generate_for_named_framework=MyFramework Options generation_options; vector > options; ParseGeneratorParameter(parameter, &options); for (int 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 // generator will then issue warnings/errors if in the proto files being // generated the option is not listed/wrong/etc in the file. // // The format of the file is: // - An entry is a line of "package=prefix". // - Comments start with "#". // - A comment can go on a line after a expected package/prefix pair. // (i.e. - "package=prefix # comment") // // There is no validation that the prefixes are good prefixes, it is // assumed that they are when you create the file. generation_options.expected_prefixes_path = options[i].second; } else if (options[i].first == "generate_for_named_framework") { // The name of the framework that protos are being generated for. This // will cause the #import statements to be framework based using this // name (i.e. - "#import ). // // NOTE: If this option is used with // named_framework_to_proto_path_mappings_path, then this is effectively // the "default" framework name used for everything that wasn't mapped by // the mapping file. generation_options.generate_for_named_framework = options[i].second; } else if (options[i].first == "named_framework_to_proto_path_mappings_path") { // Path to find a file containing the list of framework names and proto // files. The generator uses this to decide if a proto file // referenced should use a framework style import vs. a user level import // (#import vs #import "dir/file.pbobjc.h"). // // The format of the file is: // - An entry is a line of "frameworkName: file.proto, dir/file2.proto". // - Comments start with "#". // - A comment can go on a line after a expected package/prefix pair. // (i.e. - "frameworkName: file.proto # comment") // // Any number of files can be listed for a framework, just separate them // with commas. // // There can be multiple lines listing the same frameworkName incase it // has a lot of proto files included in it; having multiple lines makes // things easier to read. If a proto file is not configured in the // mappings file, it will use the default framework name if one was passed // with generate_for_named_framework, or the relative path to it's include // path otherwise. generation_options.named_framework_to_proto_path_mappings_path = options[i].second; } else { *error = "error: Unknown generator option: " + options[i].first; return false; } } // ----------------------------------------------------------------- // Validate the objc prefix/package pairings. if (!ValidateObjCClassPrefixes(files, generation_options, error)) { // *error will have been filled in. return false; } for (int i = 0; i < files.size(); i++) { const FileDescriptor* file = files[i]; FileGenerator file_generator(file, generation_options); string filepath = FilePath(file); // Generate header. { scoped_ptr output( context->Open(filepath + ".pbobjc.h")); io::Printer printer(output.get(), '$'); file_generator.GenerateHeader(&printer); } // Generate m file. { scoped_ptr output( context->Open(filepath + ".pbobjc.m")); io::Printer printer(output.get(), '$'); file_generator.GenerateSource(&printer); } } return true; } } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_generator.h000066400000000000000000000060611334102242000355000ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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. // Generates ObjectiveC code for a given .proto file. #ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_GENERATOR_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { // CodeGenerator implementation which generates a ObjectiveC source file and // header. If you create your own protocol compiler binary and you want it to // support ObjectiveC output, you can do so by registering an instance of this // CodeGenerator with the CommandLineInterface in your main() function. class LIBPROTOC_EXPORT ObjectiveCGenerator : public CodeGenerator { public: ObjectiveCGenerator(); ~ObjectiveCGenerator(); // implements CodeGenerator ---------------------------------------- bool HasGenerateAll() const; bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const; bool GenerateAll(const vector& files, const string& parameter, GeneratorContext* context, string* error) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ObjectiveCGenerator); }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_GENERATOR_H__ objectivec_helpers.cc000066400000000000000000001532231334102242000353150ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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 _MSC_VER #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // 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. namespace google { namespace protobuf { namespace compiler { namespace objectivec { // is transitively included in this file. Import the functions explicitly // in this port namespace to avoid ambiguous definition. namespace posix { #ifdef _WIN32 using ::google::protobuf::internal::win32::open; #else using ::open; #endif } // namespace port Options::Options() { // Default is the value of the env for the package prefixes. const char* file_path = getenv("GPB_OBJC_EXPECTED_PACKAGE_PREFIXES"); if (file_path) { expected_prefixes_path = file_path; } } namespace { hash_set MakeWordsMap(const char* const words[], size_t num_words) { hash_set result; for (int i = 0; i < num_words; i++) { result.insert(words[i]); } return result; } const char* const kUpperSegmentsList[] = {"url", "http", "https"}; hash_set kUpperSegments = MakeWordsMap(kUpperSegmentsList, GOOGLE_ARRAYSIZE(kUpperSegmentsList)); bool ascii_isnewline(char c) { return c == '\n' || c == '\r'; } // Internal helper for name handing. // Do not expose this outside of helpers, stick to having functions for specific // cases (ClassName(), FieldName()), so there is always consistent suffix rules. string UnderscoresToCamelCase(const string& input, bool first_capitalized) { vector values; string current; bool last_char_was_number = false; bool last_char_was_lower = false; bool last_char_was_upper = false; for (int i = 0; i < input.size(); i++) { char c = input[i]; if (ascii_isdigit(c)) { if (!last_char_was_number) { values.push_back(current); current = ""; } 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)) { // lowercase letter can follow a lowercase or uppercase letter if (!last_char_was_lower && !last_char_was_upper) { values.push_back(current); current = ""; } 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)) { if (!last_char_was_upper) { values.push_back(current); current = ""; } current += ascii_tolower(c); last_char_was_number = last_char_was_lower = last_char_was_upper = false; last_char_was_upper = true; } else { last_char_was_number = last_char_was_lower = last_char_was_upper = false; } } values.push_back(current); string result; bool first_segment_forces_upper = false; for (vector::iterator i = values.begin(); i != values.end(); ++i) { string value = *i; bool all_upper = (kUpperSegments.count(value) > 0); if (all_upper && (result.length() == 0)) { first_segment_forces_upper = true; } for (int j = 0; j < value.length(); j++) { if (j == 0 || all_upper) { value[j] = ascii_toupper(value[j]); } else { // Nothing, already in lower. } } result += value; } if ((result.length() != 0) && !first_capitalized && !first_segment_forces_upper) { result[0] = ascii_tolower(result[0]); } return result; } const char* const kReservedWordList[] = { // Objective C "keywords" that aren't in C // From // http://stackoverflow.com/questions/1873630/reserved-keywords-in-objective-c "id", "_cmd", "super", "in", "out", "inout", "bycopy", "byref", "oneway", "self", // C/C++ keywords (Incl C++ 0x11) // From http://en.cppreference.com/w/cpp/keywords "and", "and_eq", "alignas", "alignof", "asm", "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "char16_t", "char32_t", "class", "compl", "const", "constexpr", "const_cast", "continue", "decltype", "default", "delete", "double", "dynamic_cast", "else", "enum", "explicit", "export", "extern ", "false", "float", "for", "friend", "goto", "if", "inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq", "nullptr", "operator", "or", "or_eq", "private", "protected", "public", "register", "reinterpret_cast", "return", "short", "signed", "sizeof", "static", "static_assert", "static_cast", "struct", "switch", "template", "this", "thread_local", "throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq", // C99 keywords // From // http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fkeyw.htm "restrict", // Objective-C Runtime typedefs // From "Category", "Ivar", "Method", "Protocol", // NSObject Methods // new is covered by C++ keywords. "description", "debugDescription", "finalize", "hash", "dealloc", "init", "class", "superclass", "retain", "release", "autorelease", "retainCount", "zone", "isProxy", "copy", "mutableCopy", "classForCoder", // GPBMessage Methods // Only need to add instance methods that may conflict with // method declared in protos. The main cases are methods // that take no arguments, or setFoo:/hasFoo: type methods. "clear", "data", "delimitedData", "descriptor", "extensionRegistry", "extensionsCurrentlySet", "initialized", "isInitialized", "serializedSize", "sortedExtensionsInUse", "unknownFields", // MacTypes.h names "Fixed", "Fract", "Size", "LogicalAddress", "PhysicalAddress", "ByteCount", "ByteOffset", "Duration", "AbsoluteTime", "OptionBits", "ItemCount", "PBVersion", "ScriptCode", "LangCode", "RegionCode", "OSType", "ProcessSerialNumber", "Point", "Rect", "FixedPoint", "FixedRect", "Style", "StyleParameter", "StyleField", "TimeScale", "TimeBase", "TimeRecord", }; hash_set kReservedWords = MakeWordsMap(kReservedWordList, GOOGLE_ARRAYSIZE(kReservedWordList)); string SanitizeNameForObjC(const string& input, const string& extension, string* out_suffix_added) { if (kReservedWords.count(input) > 0) { if (out_suffix_added) *out_suffix_added = extension; return input + extension; } if (out_suffix_added) out_suffix_added->clear(); return input; } string NameFromFieldDescriptor(const FieldDescriptor* field) { if (field->type() == FieldDescriptor::TYPE_GROUP) { return field->message_type()->name(); } else { return field->name(); } } void PathSplit(const string& path, string* directory, string* basename) { string::size_type last_slash = path.rfind('/'); if (last_slash == string::npos) { if (directory) { *directory = ""; } if (basename) { *basename = path; } } else { if (directory) { *directory = path.substr(0, last_slash); } if (basename) { *basename = path.substr(last_slash + 1); } } } bool IsSpecialName(const string& name, const string* special_names, size_t count) { for (size_t i = 0; i < count; ++i) { 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 // the next character must be not lower case (newton vs newTon vs // new_ton). return !ascii_islower(name[length]); } else { return true; } } } return false; } string GetZeroEnumNameForFlagType(const FlagType flag_type) { switch(flag_type) { case FLAGTYPE_DESCRIPTOR_INITIALIZATION: return "GPBDescriptorInitializationFlag_None"; case FLAGTYPE_EXTENSION: return "GPBExtensionNone"; case FLAGTYPE_FIELD: return "GPBFieldNone"; default: GOOGLE_LOG(FATAL) << "Can't get here."; return "0"; } } string GetEnumNameForFlagType(const FlagType flag_type) { switch(flag_type) { case FLAGTYPE_DESCRIPTOR_INITIALIZATION: return "GPBDescriptorInitializationFlags"; case FLAGTYPE_EXTENSION: return "GPBExtensionOptions"; case FLAGTYPE_FIELD: return "GPBFieldFlags"; default: GOOGLE_LOG(FATAL) << "Can't get here."; return string(); } } } // namespace // Escape C++ trigraphs by escaping question marks to \? string EscapeTrigraphs(const string& to_escape) { return StringReplace(to_escape, "?", "\\?", true); } string StripProto(const string& filename) { if (HasSuffixString(filename, ".protodevel")) { return StripSuffixString(filename, ".protodevel"); } else { return StripSuffixString(filename, ".proto"); } } void StringPieceTrimWhitespace(StringPiece* input) { while (!input->empty() && ascii_isspace(*input->data())) { input->remove_prefix(1); } while (!input->empty() && ascii_isspace((*input)[input->length() - 1])) { input->remove_suffix(1); } } bool IsRetainedName(const string& name) { // List of prefixes from // http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html static const string retained_names[] = {"new", "alloc", "copy", "mutableCopy"}; return IsSpecialName(name, retained_names, sizeof(retained_names) / sizeof(retained_names[0])); } bool IsInitName(const string& name) { static const string init_names[] = {"init"}; return IsSpecialName(name, init_names, sizeof(init_names) / sizeof(init_names[0])); } string BaseFileName(const FileDescriptor* file) { string basename; PathSplit(file->name(), NULL, &basename); return basename; } string FileClassPrefix(const FileDescriptor* file) { // Default is empty string, no need to check has_objc_class_prefix. string result = file->options().objc_class_prefix(); return result; } string FilePath(const FileDescriptor* file) { string output; string basename; string directory; PathSplit(file->name(), &directory, &basename); if (directory.length() > 0) { output = directory + "/"; } basename = StripProto(basename); // CamelCase to be more ObjC friendly. basename = UnderscoresToCamelCase(basename, true); output += basename; return output; } string FilePathBasename(const FileDescriptor* file) { string output; string basename; string directory; PathSplit(file->name(), &directory, &basename); basename = StripProto(basename); // CamelCase to be more ObjC friendly. output = UnderscoresToCamelCase(basename, true); return output; } string FileClassName(const FileDescriptor* file) { string name = FileClassPrefix(file); name += UnderscoresToCamelCase(StripProto(BaseFileName(file)), true); name += "Root"; // There aren't really any reserved words that end in "Root", but playing // it safe and checking. return SanitizeNameForObjC(name, "_RootClass", NULL); } string ClassNameWorker(const Descriptor* descriptor) { string name; if (descriptor->containing_type() != NULL) { name = ClassNameWorker(descriptor->containing_type()); name += "_"; } return name + descriptor->name(); } string ClassNameWorker(const EnumDescriptor* descriptor) { string name; if (descriptor->containing_type() != NULL) { name = ClassNameWorker(descriptor->containing_type()); name += "_"; } return name + descriptor->name(); } string ClassName(const Descriptor* descriptor) { return ClassName(descriptor, NULL); } string ClassName(const Descriptor* descriptor, string* out_suffix_added) { // 1. Message names are used as is (style calls for CamelCase, trust it). // 2. Check for reserved word at the very end and then suffix things. string prefix = FileClassPrefix(descriptor->file()); string name = ClassNameWorker(descriptor); return SanitizeNameForObjC(prefix + name, "_Class", out_suffix_added); } string EnumName(const EnumDescriptor* descriptor) { // 1. Enum names are used as is (style calls for CamelCase, trust it). // 2. Check for reserved word at the every end and then suffix things. // message Fixed { // message Size {...} // enum Mumble {...} // ... // } // yields Fixed_Class, Fixed_Size. string name = FileClassPrefix(descriptor->file()); name += ClassNameWorker(descriptor); return SanitizeNameForObjC(name, "_Enum", NULL); } string EnumValueName(const EnumValueDescriptor* descriptor) { // Because of the Switch enum compatibility, the name on the enum has to have // the suffix handing, so it slightly diverges from how nested classes work. // enum Fixed { // FOO = 1 // } // yields Fixed_Enum and Fixed_Enum_Foo (not Fixed_Foo). const string& class_name = EnumName(descriptor->type()); const string& value_str = UnderscoresToCamelCase(descriptor->name(), true); const string& name = class_name + "_" + value_str; // There aren't really any reserved words with an underscore and a leading // capital letter, but playing it safe and checking. return SanitizeNameForObjC(name, "_Value", NULL); } string EnumValueShortName(const EnumValueDescriptor* descriptor) { // Enum value names (EnumValueName above) are the enum name turned into // a class name and then the value name is CamelCased and concatenated; the // whole thing then gets sanitized for reserved words. // The "short name" is intended to be the final leaf, the value name; but // you can't simply send that off to sanitize as that could result in it // getting modified when the full name didn't. For example enum // "StorageModes" has a value "retain". So the full name is // "StorageModes_Retain", but if we sanitize "retain" it would become // "RetainValue". // So the right way to get the short name is to take the full enum name // and then strip off the enum name (leaving the value name and anything // done by sanitize). const string& class_name = EnumName(descriptor->type()); const string& long_name_prefix = class_name + "_"; const string& long_name = EnumValueName(descriptor); return StripPrefixString(long_name, long_name_prefix); } string UnCamelCaseEnumShortName(const string& name) { string result; for (int i = 0; i < name.size(); i++) { char c = name[i]; if (i > 0 && ascii_isupper(c)) { result += '_'; } result += ascii_toupper(c); } return result; } string ExtensionMethodName(const FieldDescriptor* descriptor) { const string& name = NameFromFieldDescriptor(descriptor); const string& result = UnderscoresToCamelCase(name, false); return SanitizeNameForObjC(result, "_Extension", NULL); } string FieldName(const FieldDescriptor* field) { const string& name = NameFromFieldDescriptor(field); string result = UnderscoresToCamelCase(name, false); if (field->is_repeated() && !field->is_map()) { // Add "Array" before do check for reserved worlds. result += "Array"; } else { // If it wasn't repeated, but ends in "Array", force on the _p suffix. if (HasSuffixString(result, "Array")) { result += "_p"; } } return SanitizeNameForObjC(result, "_p", NULL); } string FieldNameCapitalized(const FieldDescriptor* field) { // Want the same suffix handling, so upcase the first letter of the other // name. string result = FieldName(field); if (result.length() > 0) { result[0] = ascii_toupper(result[0]); } return result; } string OneofEnumName(const OneofDescriptor* descriptor) { const Descriptor* fieldDescriptor = descriptor->containing_type(); string name = ClassName(fieldDescriptor); name += "_" + UnderscoresToCamelCase(descriptor->name(), true) + "_OneOfCase"; // No sanitize needed because the OS never has names that end in _OneOfCase. return name; } string OneofName(const OneofDescriptor* descriptor) { string name = UnderscoresToCamelCase(descriptor->name(), false); // No sanitize needed because it gets OneOfCase added and that shouldn't // ever conflict. return name; } string OneofNameCapitalized(const OneofDescriptor* descriptor) { // Use the common handling and then up-case the first letter. string result = OneofName(descriptor); if (result.length() > 0) { result[0] = ascii_toupper(result[0]); } return result; } string UnCamelCaseFieldName(const string& name, const FieldDescriptor* field) { string worker(name); if (HasSuffixString(worker, "_p")) { worker = StripSuffixString(worker, "_p"); } if (field->is_repeated() && HasSuffixString(worker, "Array")) { worker = StripSuffixString(worker, "Array"); } if (field->type() == FieldDescriptor::TYPE_GROUP) { if (worker.length() > 0) { if (ascii_islower(worker[0])) { worker[0] = ascii_toupper(worker[0]); } } return worker; } else { string result; for (int i = 0; i < worker.size(); i++) { char c = worker[i]; if (ascii_isupper(c)) { if (i > 0) { result += '_'; } result += ascii_tolower(c); } else { result += c; } } return result; } } string GetCapitalizedType(const FieldDescriptor* field) { switch (field->type()) { case FieldDescriptor::TYPE_INT32: return "Int32"; case FieldDescriptor::TYPE_UINT32: return "UInt32"; case FieldDescriptor::TYPE_SINT32: return "SInt32"; case FieldDescriptor::TYPE_FIXED32: return "Fixed32"; case FieldDescriptor::TYPE_SFIXED32: return "SFixed32"; case FieldDescriptor::TYPE_INT64: return "Int64"; case FieldDescriptor::TYPE_UINT64: return "UInt64"; case FieldDescriptor::TYPE_SINT64: return "SInt64"; case FieldDescriptor::TYPE_FIXED64: return "Fixed64"; case FieldDescriptor::TYPE_SFIXED64: return "SFixed64"; case FieldDescriptor::TYPE_FLOAT: return "Float"; case FieldDescriptor::TYPE_DOUBLE: return "Double"; case FieldDescriptor::TYPE_BOOL: return "Bool"; case FieldDescriptor::TYPE_STRING: return "String"; case FieldDescriptor::TYPE_BYTES: return "Bytes"; case FieldDescriptor::TYPE_ENUM: return "Enum"; case FieldDescriptor::TYPE_GROUP: return "Group"; case FieldDescriptor::TYPE_MESSAGE: return "Message"; } // Some compilers report reaching end of function even though all cases of // the enum are handed in the switch. GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } ObjectiveCType GetObjectiveCType(FieldDescriptor::Type field_type) { switch (field_type) { case FieldDescriptor::TYPE_INT32: case FieldDescriptor::TYPE_SINT32: case FieldDescriptor::TYPE_SFIXED32: return OBJECTIVECTYPE_INT32; case FieldDescriptor::TYPE_UINT32: case FieldDescriptor::TYPE_FIXED32: return OBJECTIVECTYPE_UINT32; case FieldDescriptor::TYPE_INT64: case FieldDescriptor::TYPE_SINT64: case FieldDescriptor::TYPE_SFIXED64: return OBJECTIVECTYPE_INT64; case FieldDescriptor::TYPE_UINT64: case FieldDescriptor::TYPE_FIXED64: return OBJECTIVECTYPE_UINT64; case FieldDescriptor::TYPE_FLOAT: return OBJECTIVECTYPE_FLOAT; case FieldDescriptor::TYPE_DOUBLE: return OBJECTIVECTYPE_DOUBLE; case FieldDescriptor::TYPE_BOOL: return OBJECTIVECTYPE_BOOLEAN; case FieldDescriptor::TYPE_STRING: return OBJECTIVECTYPE_STRING; case FieldDescriptor::TYPE_BYTES: return OBJECTIVECTYPE_DATA; case FieldDescriptor::TYPE_ENUM: return OBJECTIVECTYPE_ENUM; case FieldDescriptor::TYPE_GROUP: case FieldDescriptor::TYPE_MESSAGE: return OBJECTIVECTYPE_MESSAGE; } // Some compilers report reaching end of function even though all cases of // the enum are handed in the switch. GOOGLE_LOG(FATAL) << "Can't get here."; return OBJECTIVECTYPE_INT32; } bool IsPrimitiveType(const FieldDescriptor* field) { ObjectiveCType type = GetObjectiveCType(field); switch (type) { case OBJECTIVECTYPE_INT32: case OBJECTIVECTYPE_UINT32: case OBJECTIVECTYPE_INT64: case OBJECTIVECTYPE_UINT64: case OBJECTIVECTYPE_FLOAT: case OBJECTIVECTYPE_DOUBLE: case OBJECTIVECTYPE_BOOLEAN: case OBJECTIVECTYPE_ENUM: return true; break; default: return false; } } bool IsReferenceType(const FieldDescriptor* field) { return !IsPrimitiveType(field); } static string HandleExtremeFloatingPoint(string val, bool add_float_suffix) { if (val == "nan") { return "NAN"; } else if (val == "inf") { return "INFINITY"; } else if (val == "-inf") { return "-INFINITY"; } else { // float strings with ., e or E need to have f appended if (add_float_suffix && (val.find(".") != string::npos || val.find("e") != string::npos || val.find("E") != string::npos)) { val += "f"; } return val; } } string GPBGenericValueFieldName(const FieldDescriptor* field) { // Returns the field within the GPBGenericValue union to use for the given // field. if (field->is_repeated()) { return "valueMessage"; } switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: return "valueInt32"; case FieldDescriptor::CPPTYPE_UINT32: return "valueUInt32"; case FieldDescriptor::CPPTYPE_INT64: return "valueInt64"; case FieldDescriptor::CPPTYPE_UINT64: return "valueUInt64"; case FieldDescriptor::CPPTYPE_FLOAT: return "valueFloat"; case FieldDescriptor::CPPTYPE_DOUBLE: return "valueDouble"; case FieldDescriptor::CPPTYPE_BOOL: return "valueBool"; case FieldDescriptor::CPPTYPE_STRING: if (field->type() == FieldDescriptor::TYPE_BYTES) { return "valueData"; } else { return "valueString"; } case FieldDescriptor::CPPTYPE_ENUM: return "valueEnum"; case FieldDescriptor::CPPTYPE_MESSAGE: return "valueMessage"; } // Some compilers report reaching end of function even though all cases of // the enum are handed in the switch. GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } string DefaultValue(const FieldDescriptor* field) { // Repeated fields don't have defaults. if (field->is_repeated()) { return "nil"; } // Switch on cpp_type since we need to know which default_value_* method // of FieldDescriptor to call. switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: // gcc and llvm reject the decimal form of kint32min and kint64min. if (field->default_value_int32() == INT_MIN) { return "-0x80000000"; } return SimpleItoa(field->default_value_int32()); case FieldDescriptor::CPPTYPE_UINT32: return SimpleItoa(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 SimpleItoa(field->default_value_int64()) + "LL"; case FieldDescriptor::CPPTYPE_UINT64: return SimpleItoa(field->default_value_uint64()) + "ULL"; case FieldDescriptor::CPPTYPE_DOUBLE: return HandleExtremeFloatingPoint( SimpleDtoa(field->default_value_double()), false); case FieldDescriptor::CPPTYPE_FLOAT: return HandleExtremeFloatingPoint( SimpleFtoa(field->default_value_float()), true); case FieldDescriptor::CPPTYPE_BOOL: return field->default_value_bool() ? "YES" : "NO"; case FieldDescriptor::CPPTYPE_STRING: { const bool has_default_value = field->has_default_value(); const string& default_string = field->default_value_string(); if (!has_default_value || default_string.length() == 0) { // If the field is defined as being the empty string, // then we will just assign to nil, as the empty string is the // default for both strings and data. return "nil"; } if (field->type() == FieldDescriptor::TYPE_BYTES) { // We want constant fields in our data structures so we can // declare them as static. To achieve this we cheat and stuff // a escaped c string (prefixed with a length) into the data // field, and cast it to an (NSData*) so it will compile. // The runtime library knows how to handle it. // Must convert to a standard byte order for packing length into // a cstring. uint32 length = ghtonl(default_string.length()); string bytes((const char*)&length, sizeof(length)); bytes.append(default_string); return "(NSData*)\"" + EscapeTrigraphs(CEscape(bytes)) + "\""; } else { return "@\"" + EscapeTrigraphs(CEscape(default_string)) + "\""; } } case FieldDescriptor::CPPTYPE_ENUM: return EnumValueName(field->default_value_enum()); case FieldDescriptor::CPPTYPE_MESSAGE: return "nil"; } // Some compilers report reaching end of function even though all cases of // the enum are handed in the switch. GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } bool HasNonZeroDefaultValue(const FieldDescriptor* field) { // Repeated fields don't have defaults. if (field->is_repeated()) { return false; } // As much as checking field->has_default_value() seems useful, it isn't // because of enums. proto2 syntax allows the first item in an enum (the // default) to be non zero. So checking field->has_default_value() would // result in missing this non zero default. See MessageWithOneBasedEnum in // objectivec/Tests/unittest_objc.proto for a test Message to confirm this. // Some proto file set the default to the zero value, so make sure the value // isn't the zero case. switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: return field->default_value_int32() != 0; case FieldDescriptor::CPPTYPE_UINT32: return field->default_value_uint32() != 0U; case FieldDescriptor::CPPTYPE_INT64: return field->default_value_int64() != 0LL; case FieldDescriptor::CPPTYPE_UINT64: return field->default_value_uint64() != 0ULL; case FieldDescriptor::CPPTYPE_DOUBLE: return field->default_value_double() != 0.0; case FieldDescriptor::CPPTYPE_FLOAT: return field->default_value_float() != 0.0f; case FieldDescriptor::CPPTYPE_BOOL: return field->default_value_bool(); case FieldDescriptor::CPPTYPE_STRING: { const string& default_string = field->default_value_string(); return default_string.length() != 0; } case FieldDescriptor::CPPTYPE_ENUM: return field->default_value_enum()->number() != 0; case FieldDescriptor::CPPTYPE_MESSAGE: return false; } // Some compilers report reaching end of function even though all cases of // the enum are handed in the switch. GOOGLE_LOG(FATAL) << "Can't get here."; return false; } string BuildFlagsString(const FlagType flag_type, const vector& strings) { if (strings.size() == 0) { return GetZeroEnumNameForFlagType(flag_type); } else if (strings.size() == 1) { return strings[0]; } string string("(" + GetEnumNameForFlagType(flag_type) + ")("); for (size_t i = 0; i != strings.size(); ++i) { if (i > 0) { string.append(" | "); } string.append(strings[i]); } string.append(")"); return string; } string BuildCommentsString(const SourceLocation& location, bool prefer_single_line) { const string& comments = location.leading_comments.empty() ? location.trailing_comments : location.leading_comments; vector lines; SplitStringAllowEmpty(comments, "\n", &lines); while (!lines.empty() && lines.back().empty()) { lines.pop_back(); } // If there are no comments, just return an empty string. if (lines.size() == 0) { return ""; } string prefix; string suffix; string final_comments; string epilogue; bool add_leading_space = false; if (prefer_single_line && lines.size() == 1) { prefix = "/** "; suffix = " */\n"; } else { prefix = "* "; suffix = "\n"; final_comments += "/**\n"; epilogue = " **/\n"; add_leading_space = true; } for (int i = 0; i < lines.size(); i++) { 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); line = prefix + line; StripWhitespace(&line); // If not a one line, need to add the first space before *, as // StripWhitespace would have removed it. line = (add_leading_space ? " " : "") + line; final_comments += line + suffix; } final_comments += epilogue; return final_comments; } // Making these a generator option for folks that don't use CocoaPods, but do // want to put the library in a framework is an interesting question. The // problem is it means changing sources shipped with the library to actually // use a different value; so it isn't as simple as a option. const char* const ProtobufLibraryFrameworkName = "Protobuf"; string ProtobufFrameworkImportSymbol(const string& framework_name) { // GPB_USE_[framework_name]_FRAMEWORK_IMPORTS string result = string("GPB_USE_"); result += ToUpper(framework_name); result += "_FRAMEWORK_IMPORTS"; return result; } bool IsProtobufLibraryBundledProtoFile(const FileDescriptor* file) { // We don't check the name prefix or proto package because some files // (descriptor.proto), aren't shipped generated by the library, so this // seems to be the safest way to only catch the ones shipped. const string name = file->name(); if (name == "google/protobuf/any.proto" || name == "google/protobuf/api.proto" || name == "google/protobuf/duration.proto" || name == "google/protobuf/empty.proto" || name == "google/protobuf/field_mask.proto" || name == "google/protobuf/source_context.proto" || name == "google/protobuf/struct.proto" || name == "google/protobuf/timestamp.proto" || name == "google/protobuf/type.proto" || name == "google/protobuf/wrappers.proto") { return true; } return false; } bool ReadLine(StringPiece* input, StringPiece* line) { for (int len = 0; len < input->size(); ++len) { if (ascii_isnewline((*input)[len])) { *line = StringPiece(input->data(), len); ++len; // advance over the newline *input = StringPiece(input->data() + len, input->size() - len); return true; } } return false; // Ran out of input with no newline. } void RemoveComment(StringPiece* input) { int offset = input->find('#'); if (offset != StringPiece::npos) { input->remove_suffix(input->length() - offset); } } namespace { class ExpectedPrefixesCollector : public LineConsumer { public: ExpectedPrefixesCollector(std::map* inout_package_to_prefix_map) : prefix_map_(inout_package_to_prefix_map) {} virtual bool ConsumeLine(const StringPiece& line, string* out_error); private: std::map* prefix_map_; }; bool ExpectedPrefixesCollector::ConsumeLine( const StringPiece& line, string* out_error) { int offset = line.find('='); if (offset == StringPiece::npos) { *out_error = string("Expected prefixes file line without equal sign: '") + line.ToString() + "'."; return false; } StringPiece package(line, 0, offset); StringPiece prefix(line, offset + 1, line.length() - offset - 1); StringPieceTrimWhitespace(&package); StringPieceTrimWhitespace(&prefix); // Don't really worry about error checking the package/prefix for // being valid. Assume the file is validated when it is created/edited. (*prefix_map_)[package.ToString()] = prefix.ToString(); return true; } bool LoadExpectedPackagePrefixes(const Options &generation_options, std::map* prefix_map, string* out_error) { if (generation_options.expected_prefixes_path.empty()) { return true; } ExpectedPrefixesCollector collector(prefix_map); return ParseSimpleFile( generation_options.expected_prefixes_path, &collector, out_error); } bool ValidateObjCClassPrefix( const FileDescriptor* file, const string& expected_prefixes_path, const std::map& expected_package_prefixes, string* out_error) { const string prefix = file->options().objc_class_prefix(); const string package = file->package(); // 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 warnings. // Check: Error - See if there was an expected prefix for the package and // report if it doesn't match (wrong or missing). std::map::const_iterator package_match = expected_package_prefixes.find(package); if (package_match != expected_package_prefixes.end()) { // There was an entry, and... if (package_match->second == prefix) { // ...it matches. All good, out of here! return true; } else { // ...it didn't match! *out_error = "error: Expected 'option objc_class_prefix = \"" + package_match->second + "\";' for package '" + package + "' in '" + file->name() + "'"; if (prefix.length()) { *out_error += "; but found '" + prefix + "' instead"; } *out_error += "."; return false; } } // If there was no prefix option, we're done at this point. if (prefix.empty()) { // No prefix, nothing left to check. return true; } // 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 (!ascii_isupper(prefix[0])) { std::cerr << std::endl << "protoc:0: warning: Invalid 'option objc_class_prefix = \"" << prefix << "\";' in '" << file->name() << "';" << " it should start with a capital letter." << std::endl; std::cerr.flush(); } if (prefix.length() < 3) { // Apple reserves 2 character prefixes for themselves. They do use some // 3 character prefixes, but they haven't updated the rules/docs. std::cerr << std::endl << "protoc:0: warning: Invalid 'option objc_class_prefix = \"" << prefix << "\";' in '" << file->name() << "';" << " Apple recommends they should be at least 3 characters long." << std::endl; std::cerr.flush(); } // Look for any other package that uses the same prefix. string other_package_for_prefix; for (std::map::const_iterator i = expected_package_prefixes.begin(); i != expected_package_prefixes.end(); ++i) { if (i->second == prefix) { other_package_for_prefix = i->first; break; } } // Check: Warning - If the file does not have a package, check whether // the prefix declared is being used by another package or not. if (package.empty()) { // The file does not have a package and ... if (other_package_for_prefix.empty()) { // ... no other package has declared that prefix. std::cerr << std::endl << "protoc:0: warning: File '" << file->name() << "' has no " << "package. Consider adding a new package to the proto and adding '" << "new.package = " << prefix << "' to the expected prefixes file (" << expected_prefixes_path << ")." << std::endl; std::cerr.flush(); } else { // ... another package has declared the same prefix. std::cerr << std::endl << "protoc:0: warning: File '" << file->name() << "' has no package " << "and package '" << other_package_for_prefix << "' already uses '" << prefix << "' as its prefix. Consider either adding a new package " << "to the proto, or reusing one of the packages already using this " << "prefix in the expected prefixes file (" << expected_prefixes_path << ")." << std::endl; std::cerr.flush(); } return true; } // Check: Error - Make sure the prefix wasn't expected for a different // package (overlap is allowed, but it has to be listed as an expected // overlap). if (!other_package_for_prefix.empty()) { *out_error = "error: Found 'option objc_class_prefix = \"" + prefix + "\";' in '" + file->name() + "'; that prefix is already used for 'package " + other_package_for_prefix + ";'. It can only be reused by listing " + "it in the expected file (" + expected_prefixes_path + ")."; return false; // Only report first usage of the prefix. } // Check: Warning - If the given package/prefix pair wasn't expected, issue a // warning issue a warning suggesting it gets added to the file. if (!expected_package_prefixes.empty()) { std::cerr << std::endl << "protoc:0: warning: Found unexpected 'option objc_class_prefix = \"" << prefix << "\";' in '" << file->name() << "';" << " consider adding it to the expected prefixes file (" << expected_prefixes_path << ")." << std::endl; std::cerr.flush(); } return true; } } // namespace bool ValidateObjCClassPrefixes(const vector& files, const Options& generation_options, string* out_error) { // Load the expected package prefixes, if available, to validate against. std::map expected_package_prefixes; if (!LoadExpectedPackagePrefixes(generation_options, &expected_package_prefixes, out_error)) { return false; } for (int i = 0; i < files.size(); i++) { bool is_valid = ValidateObjCClassPrefix(files[i], generation_options.expected_prefixes_path, expected_package_prefixes, out_error); if (!is_valid) { return false; } } return true; } TextFormatDecodeData::TextFormatDecodeData() { } TextFormatDecodeData::~TextFormatDecodeData() { } void TextFormatDecodeData::AddString(int32 key, const string& input_for_decode, const string& desired_output) { for (vector::const_iterator i = entries_.begin(); i != entries_.end(); ++i) { if (i->first == key) { std::cerr << "error: duplicate key (" << key << ") making TextFormat data, input: \"" << input_for_decode << "\", desired: \"" << desired_output << "\"." << std::endl; std::cerr.flush(); abort(); } } const string& data = TextFormatDecodeData::DecodeDataForString( input_for_decode, desired_output); entries_.push_back(DataEntry(key, data)); } string TextFormatDecodeData::Data() const { std::ostringstream data_stringstream; if (num_entries() > 0) { io::OstreamOutputStream data_outputstream(&data_stringstream); io::CodedOutputStream output_stream(&data_outputstream); output_stream.WriteVarint32(num_entries()); for (vector::const_iterator i = entries_.begin(); i != entries_.end(); ++i) { output_stream.WriteVarint32(i->first); output_stream.WriteString(i->second); } } data_stringstream.flush(); return data_stringstream.str(); } namespace { // Helper to build up the decode data for a string. class DecodeDataBuilder { public: DecodeDataBuilder() { Reset(); } bool AddCharacter(const char desired, const char input); void AddUnderscore() { Push(); need_underscore_ = true; } string Finish() { Push(); return decode_data_; } private: static const uint8 kAddUnderscore = 0x80; static const uint8 kOpAsIs = 0x00; static const uint8 kOpFirstUpper = 0x40; static const uint8 kOpFirstLower = 0x20; static const uint8 kOpAllUpper = 0x60; static const int kMaxSegmentLen = 0x1f; void AddChar(const char desired) { ++segment_len_; is_all_upper_ &= ascii_isupper(desired); } void Push() { uint8 op = (op_ | segment_len_); if (need_underscore_) op |= kAddUnderscore; if (op != 0) { decode_data_ += (char)op; } Reset(); } bool AddFirst(const char desired, const char input) { if (desired == input) { op_ = kOpAsIs; } else if (desired == ascii_toupper(input)) { op_ = kOpFirstUpper; } else if (desired == ascii_tolower(input)) { op_ = kOpFirstLower; } else { // Can't be transformed to match. return false; } AddChar(desired); return true; } void Reset() { need_underscore_ = false; op_ = 0; segment_len_ = 0; is_all_upper_ = true; } bool need_underscore_; bool is_all_upper_; uint8 op_; int segment_len_; string decode_data_; }; bool DecodeDataBuilder::AddCharacter(const char desired, const char input) { // If we've hit the max size, push to start a new segment. if (segment_len_ == kMaxSegmentLen) { Push(); } if (segment_len_ == 0) { return AddFirst(desired, input); } // Desired and input match... 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)) { AddChar(desired); return true; } // Add the current segment, and start the next one. Push(); return AddFirst(desired, input); } // If we need to uppercase, and everything so far has been uppercase, // promote op to AllUpper. if ((desired == ascii_toupper(input)) && is_all_upper_) { op_ = kOpAllUpper; AddChar(desired); return true; } // Give up, push and start a new segment. Push(); return AddFirst(desired, input); } // If decode data can't be generated, a directive for the raw string // is used instead. string DirectDecodeString(const string& str) { string result; result += (char)'\0'; // Marker for full string. result += str; result += (char)'\0'; // End of string. return result; } } // namespace // static string TextFormatDecodeData::DecodeDataForString(const string& input_for_decode, const string& desired_output) { if ((input_for_decode.size() == 0) || (desired_output.size() == 0)) { std::cerr << "error: got empty string for making TextFormat data, input: \"" << input_for_decode << "\", desired: \"" << desired_output << "\"." << std::endl; std::cerr.flush(); abort(); } if ((input_for_decode.find('\0') != string::npos) || (desired_output.find('\0') != 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; std::cerr.flush(); abort(); } DecodeDataBuilder builder; // Walk the output building it from the input. int x = 0; for (int y = 0; y < desired_output.size(); y++) { const char d = desired_output[y]; if (d == '_') { builder.AddUnderscore(); continue; } if (x >= input_for_decode.size()) { // Out of input, no way to encode it, just return a full decode. return DirectDecodeString(desired_output); } if (builder.AddCharacter(d, input_for_decode[x])) { ++x; // Consumed one input } else { // Couldn't transform for the next character, just return a full decode. return DirectDecodeString(desired_output); } } if (x != input_for_decode.size()) { // Extra input (suffix from name sanitizing?), just return a full decode. return DirectDecodeString(desired_output); } // Add the end marker. return builder.Finish() + (char)'\0'; } namespace { class Parser { public: Parser(LineConsumer* line_consumer) : line_consumer_(line_consumer), line_(0) {} // Parses a check of input, returning success/failure. bool ParseChunk(StringPiece chunk); // Should be called to finish parsing (after all input has been provided via // ParseChunk()). Returns success/failure. bool Finish(); int last_line() const { return line_; } string error_str() const { return error_str_; } private: bool ParseLoop(); LineConsumer* line_consumer_; int line_; string error_str_; StringPiece p_; string leftover_; }; bool Parser::ParseChunk(StringPiece chunk) { if (!leftover_.empty()) { chunk.AppendToString(&leftover_); p_ = StringPiece(leftover_); } else { p_ = chunk; } bool result = ParseLoop(); if (p_.empty()) { leftover_.clear(); } else { leftover_ = p_.ToString(); } return result; } bool Parser::Finish() { if (leftover_.empty()) { return true; } // Force a newline onto the end to finish parsing. leftover_ += "\n"; p_ = StringPiece(leftover_); if (!ParseLoop()) { return false; } return p_.empty(); // Everything used? } bool Parser::ParseLoop() { StringPiece line; while (ReadLine(&p_, &line)) { ++line_; RemoveComment(&line); StringPieceTrimWhitespace(&line); if (line.size() == 0) { continue; // Blank line. } if (!line_consumer_->ConsumeLine(line, &error_str_)) { return false; } } return true; } } // namespace LineConsumer::LineConsumer() {} LineConsumer::~LineConsumer() {} bool ParseSimpleFile( const string& path, LineConsumer* line_consumer, string* out_error) { int fd; do { fd = posix::open(path.c_str(), O_RDONLY); } while (fd < 0 && errno == EINTR); if (fd < 0) { *out_error = string("error: Unable to open \"") + path + "\", " + strerror(errno); return false; } io::FileInputStream file_stream(fd); file_stream.SetCloseOnDelete(true); Parser parser(line_consumer); const void* buf; int buf_len; while (file_stream.Next(&buf, &buf_len)) { if (buf_len == 0) { continue; } if (!parser.ParseChunk(StringPiece(static_cast(buf), buf_len))) { *out_error = string("error: ") + path + " Line " + SimpleItoa(parser.last_line()) + ", " + parser.error_str(); return false; } } return parser.Finish(); } ImportWriter::ImportWriter( const string& generate_for_named_framework, const string& named_framework_to_proto_path_mappings_path) : generate_for_named_framework_(generate_for_named_framework), named_framework_to_proto_path_mappings_path_( named_framework_to_proto_path_mappings_path), need_to_parse_mapping_file_(true) { } ImportWriter::~ImportWriter() {} void ImportWriter::AddFile(const FileDescriptor* file, const string& header_extension) { const string file_path(FilePath(file)); if (IsProtobufLibraryBundledProtoFile(file)) { protobuf_framework_imports_.push_back( FilePathBasename(file) + header_extension); protobuf_non_framework_imports_.push_back(file_path + header_extension); return; } // Lazy parse any mappings. if (need_to_parse_mapping_file_) { ParseFrameworkMappings(); } std::map::iterator proto_lookup = proto_file_to_framework_name_.find(file->name()); if (proto_lookup != proto_file_to_framework_name_.end()) { other_framework_imports_.push_back( proto_lookup->second + "/" + FilePathBasename(file) + header_extension); return; } if (!generate_for_named_framework_.empty()) { other_framework_imports_.push_back( generate_for_named_framework_ + "/" + FilePathBasename(file) + header_extension); return; } other_imports_.push_back(file_path + header_extension); } void ImportWriter::Print(io::Printer* printer) const { assert(protobuf_non_framework_imports_.size() == protobuf_framework_imports_.size()); bool add_blank_line = false; if (protobuf_framework_imports_.size() > 0) { const string framework_name(ProtobufLibraryFrameworkName); const string cpp_symbol(ProtobufFrameworkImportSymbol(framework_name)); printer->Print( "#if $cpp_symbol$\n", "cpp_symbol", cpp_symbol); for (vector::const_iterator iter = protobuf_framework_imports_.begin(); iter != protobuf_framework_imports_.end(); ++iter) { printer->Print( " #import <$framework_name$/$header$>\n", "framework_name", framework_name, "header", *iter); } printer->Print( "#else\n"); for (vector::const_iterator iter = protobuf_non_framework_imports_.begin(); iter != protobuf_non_framework_imports_.end(); ++iter) { printer->Print( " #import \"$header$\"\n", "header", *iter); } printer->Print( "#endif\n"); add_blank_line = true; } if (other_framework_imports_.size() > 0) { if (add_blank_line) { printer->Print("\n"); } for (vector::const_iterator iter = other_framework_imports_.begin(); iter != other_framework_imports_.end(); ++iter) { printer->Print( " #import <$header$>\n", "header", *iter); } add_blank_line = true; } if (other_imports_.size() > 0) { if (add_blank_line) { printer->Print("\n"); } for (vector::const_iterator iter = other_imports_.begin(); iter != other_imports_.end(); ++iter) { printer->Print( " #import \"$header$\"\n", "header", *iter); } } } void ImportWriter::ParseFrameworkMappings() { need_to_parse_mapping_file_ = false; if (named_framework_to_proto_path_mappings_path_.empty()) { return; // Nothing to do. } ProtoFrameworkCollector collector(&proto_file_to_framework_name_); string parse_error; if (!ParseSimpleFile(named_framework_to_proto_path_mappings_path_, &collector, &parse_error)) { std::cerr << "error parsing " << named_framework_to_proto_path_mappings_path_ << " : " << parse_error << std::endl; std::cerr.flush(); } } bool ImportWriter::ProtoFrameworkCollector::ConsumeLine( const StringPiece& line, string* out_error) { int offset = line.find(':'); if (offset == StringPiece::npos) { *out_error = string("Framework/proto file mapping line without colon sign: '") + line.ToString() + "'."; return false; } StringPiece framework_name(line, 0, offset); StringPiece proto_file_list(line, offset + 1, line.length() - offset - 1); StringPieceTrimWhitespace(&framework_name); int start = 0; while (start < proto_file_list.length()) { offset = proto_file_list.find(',', start); if (offset == StringPiece::npos) { offset = proto_file_list.length(); } StringPiece proto_file(proto_file_list, start, offset - start); StringPieceTrimWhitespace(&proto_file); if (proto_file.size() != 0) { std::map::iterator existing_entry = map_->find(proto_file.ToString()); if (existing_entry != map_->end()) { std::cerr << "warning: duplicate proto file reference, replacing framework entry for '" << proto_file.ToString() << "' with '" << framework_name.ToString() << "' (was '" << existing_entry->second << "')." << std::endl; std::cerr.flush(); } if (proto_file.find(' ') != StringPiece::npos) { std::cerr << "note: framework mapping file had a proto file with a space in, hopefully that isn't a missing comma: '" << proto_file.ToString() << "'" << std::endl; std::cerr.flush(); } (*map_)[proto_file.ToString()] = framework_name.ToString(); } start = offset + 1; } return true; } } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_helpers.h000066400000000000000000000253141334102242000351560ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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_HELPERS_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_HELPERS_H__ #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { // Generator options (see objectivec_generator.cc for a description of each): struct Options { Options(); string expected_prefixes_path; string generate_for_named_framework; string named_framework_to_proto_path_mappings_path; }; // Escape C++ trigraphs by escaping question marks to "\?". string LIBPROTOC_EXPORT EscapeTrigraphs(const string& to_escape); // Strips ".proto" or ".protodevel" from the end of a filename. string LIBPROTOC_EXPORT StripProto(const string& filename); // Remove white space from either end of a StringPiece. void LIBPROTOC_EXPORT StringPieceTrimWhitespace(StringPiece* input); // Returns true if the name requires a ns_returns_not_retained attribute applied // to it. bool LIBPROTOC_EXPORT IsRetainedName(const string& name); // Returns true if the name starts with "init" and will need to have special // handling under ARC. bool LIBPROTOC_EXPORT IsInitName(const string& name); // Gets the objc_class_prefix. string LIBPROTOC_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. string LIBPROTOC_EXPORT FilePath(const FileDescriptor* file); // Just like FilePath(), but without the directory part. string LIBPROTOC_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 string LIBPROTOC_EXPORT FileClassName(const FileDescriptor* file); // These return the fully-qualified class name corresponding to the given // descriptor. string LIBPROTOC_EXPORT ClassName(const Descriptor* descriptor); string LIBPROTOC_EXPORT ClassName(const Descriptor* descriptor, string* out_suffix_added); string LIBPROTOC_EXPORT EnumName(const EnumDescriptor* descriptor); // Returns the fully-qualified name of the enum value corresponding to the // the descriptor. string LIBPROTOC_EXPORT EnumValueName(const EnumValueDescriptor* descriptor); // Returns the name of the enum value corresponding to the descriptor. string LIBPROTOC_EXPORT EnumValueShortName(const EnumValueDescriptor* descriptor); // Reverse what an enum does. string LIBPROTOC_EXPORT UnCamelCaseEnumShortName(const string& name); // Returns the name to use for the extension (used as the method off the file's // Root class). string LIBPROTOC_EXPORT ExtensionMethodName(const FieldDescriptor* descriptor); // Returns the transformed field name. string LIBPROTOC_EXPORT FieldName(const FieldDescriptor* field); string LIBPROTOC_EXPORT FieldNameCapitalized(const FieldDescriptor* field); // Returns the transformed oneof name. string LIBPROTOC_EXPORT OneofEnumName(const OneofDescriptor* descriptor); string LIBPROTOC_EXPORT OneofName(const OneofDescriptor* descriptor); string LIBPROTOC_EXPORT OneofNameCapitalized(const OneofDescriptor* descriptor); inline bool HasFieldPresence(const FileDescriptor* file) { return file->syntax() != FileDescriptor::SYNTAX_PROTO3; } 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. string LIBPROTOC_EXPORT UnCamelCaseFieldName(const 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 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. if (!isDeprecated && file) { isDeprecated = file->options().deprecated(); } if (isDeprecated) { string result = "DEPRECATED_ATTRIBUTE"; if (preSpace) { result.insert(0, " "); } if (postNewline) { result.append("\n"); } return result; } else { return ""; } } string LIBPROTOC_EXPORT GetCapitalizedType(const FieldDescriptor* field); ObjectiveCType LIBPROTOC_EXPORT GetObjectiveCType(FieldDescriptor::Type field_type); inline ObjectiveCType GetObjectiveCType(const FieldDescriptor* field) { return GetObjectiveCType(field->type()); } bool LIBPROTOC_EXPORT IsPrimitiveType(const FieldDescriptor* field); bool LIBPROTOC_EXPORT IsReferenceType(const FieldDescriptor* field); string LIBPROTOC_EXPORT GPBGenericValueFieldName(const FieldDescriptor* field); string LIBPROTOC_EXPORT DefaultValue(const FieldDescriptor* field); bool LIBPROTOC_EXPORT HasNonZeroDefaultValue(const FieldDescriptor* field); string LIBPROTOC_EXPORT BuildFlagsString(const FlagType type, const vector& strings); // Builds HeaderDoc/appledoc style comments out of the comments in the .proto // file. string LIBPROTOC_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 LIBPROTOC_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. string LIBPROTOC_EXPORT ProtobufFrameworkImportSymbol(const string& framework_name); // Checks if the file is one of the proto's bundled with the library. bool LIBPROTOC_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 LIBPROTOC_EXPORT ValidateObjCClassPrefixes(const vector& files, const Options& generation_options, string* out_error); // Generate decode data needed for ObjC's GPBDecodeTextFormatName() to transform // the input into the expected output. class LIBPROTOC_EXPORT TextFormatDecodeData { public: TextFormatDecodeData(); ~TextFormatDecodeData(); void AddString(int32 key, const string& input_for_decode, const string& desired_output); size_t num_entries() const { return entries_.size(); } string Data() const; static string DecodeDataForString(const string& input_for_decode, const string& desired_output); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormatDecodeData); typedef std::pair DataEntry; vector entries_; }; // Helper for parsing simple files. class LIBPROTOC_EXPORT LineConsumer { public: LineConsumer(); virtual ~LineConsumer(); virtual bool ConsumeLine(const StringPiece& line, string* out_error) = 0; }; bool LIBPROTOC_EXPORT ParseSimpleFile( const string& path, LineConsumer* line_consumer, string* out_error); // Helper class for parsing framework import mappings and generating // import statements. class LIBPROTOC_EXPORT ImportWriter { public: ImportWriter(const string& generate_for_named_framework, const string& named_framework_to_proto_path_mappings_path); ~ImportWriter(); void AddFile(const FileDescriptor* file, const string& header_extension); void Print(io::Printer *printer) const; private: class ProtoFrameworkCollector : public LineConsumer { public: ProtoFrameworkCollector(std::map* inout_proto_file_to_framework_name) : map_(inout_proto_file_to_framework_name) {} virtual bool ConsumeLine(const StringPiece& line, string* out_error); private: std::map* map_; }; void ParseFrameworkMappings(); const string generate_for_named_framework_; const string named_framework_to_proto_path_mappings_path_; std::map proto_file_to_framework_name_; bool need_to_parse_mapping_file_; vector protobuf_framework_imports_; vector protobuf_non_framework_imports_; vector other_framework_imports_; vector other_imports_; }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_HELPERS_H__ objectivec_helpers_unittest.cc000066400000000000000000000250301334102242000372460ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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. #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { namespace { TEST(ObjCHelper, TextFormatDecodeData_DecodeDataForString_RawStrings) { string input_for_decode("abcdefghIJ"); string desired_output_for_decode; string expected; string result; // Different data, can't transform. desired_output_for_decode = "zbcdefghIJ"; expected = string("\0zbcdefghIJ\0", 12); result = TextFormatDecodeData::DecodeDataForString(input_for_decode, desired_output_for_decode); EXPECT_EQ(expected, result); desired_output_for_decode = "abcdezghIJ"; expected = string("\0abcdezghIJ\0", 12); result = TextFormatDecodeData::DecodeDataForString(input_for_decode, desired_output_for_decode); EXPECT_EQ(expected, result); // Shortened data, can't transform. desired_output_for_decode = "abcdefghI"; expected = string("\0abcdefghI\0", 11); result = TextFormatDecodeData::DecodeDataForString(input_for_decode, desired_output_for_decode); EXPECT_EQ(expected, result); // Extra data, can't transform. desired_output_for_decode = "abcdefghIJz"; expected = string("\0abcdefghIJz\0", 13); result = TextFormatDecodeData::DecodeDataForString(input_for_decode, desired_output_for_decode); EXPECT_EQ(expected, result); } TEST(ObjCHelper, TextFormatDecodeData_DecodeDataForString_ByteCodes) { string input_for_decode("abcdefghIJ"); string desired_output_for_decode; string expected; string result; desired_output_for_decode = "abcdefghIJ"; expected = string("\x0A\x0", 2); result = TextFormatDecodeData::DecodeDataForString(input_for_decode, desired_output_for_decode); EXPECT_EQ(expected, result); desired_output_for_decode = "_AbcdefghIJ"; expected = string("\xCA\x0", 2); result = TextFormatDecodeData::DecodeDataForString(input_for_decode, desired_output_for_decode); EXPECT_EQ(expected, result); desired_output_for_decode = "ABCD__EfghI_j"; expected = string("\x64\x80\xC5\xA1\x0", 5); result = TextFormatDecodeData::DecodeDataForString(input_for_decode, desired_output_for_decode); EXPECT_EQ(expected, result); // Long name so multiple decode ops are needed. input_for_decode = "longFieldNameIsLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong1000"; desired_output_for_decode = "long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1000"; expected = string("\x04\xA5\xA4\xA2\xBF\x1F\x0E\x84\x0", 9); result = TextFormatDecodeData::DecodeDataForString(input_for_decode, desired_output_for_decode); EXPECT_EQ(expected, result); } // Death tests do not work on Windows as of yet. #ifdef PROTOBUF_HAS_DEATH_TEST TEST(ObjCHelperDeathTest, TextFormatDecodeData_DecodeDataForString_Failures) { // Empty inputs. EXPECT_EXIT(TextFormatDecodeData::DecodeDataForString("", ""), ::testing::KilledBySignal(SIGABRT), "error: got empty string for making TextFormat data, input:"); EXPECT_EXIT(TextFormatDecodeData::DecodeDataForString("a", ""), ::testing::KilledBySignal(SIGABRT), "error: got empty string for making TextFormat data, input:"); EXPECT_EXIT(TextFormatDecodeData::DecodeDataForString("", "a"), ::testing::KilledBySignal(SIGABRT), "error: got empty string for making TextFormat data, input:"); // Null char in the string. string str_with_null_char("ab\0c", 4); EXPECT_EXIT( TextFormatDecodeData::DecodeDataForString(str_with_null_char, "def"), ::testing::KilledBySignal(SIGABRT), "error: got a null char in a string for making TextFormat data, input:"); EXPECT_EXIT( TextFormatDecodeData::DecodeDataForString("def", str_with_null_char), ::testing::KilledBySignal(SIGABRT), "error: got a null char in a string for making TextFormat data, input:"); } #endif // PROTOBUF_HAS_DEATH_TEST TEST(ObjCHelper, TextFormatDecodeData_RawStrings) { TextFormatDecodeData decode_data; // Different data, can't transform. decode_data.AddString(1, "abcdefghIJ", "zbcdefghIJ"); decode_data.AddString(3, "abcdefghIJ", "abcdezghIJ"); // Shortened data, can't transform. decode_data.AddString(2, "abcdefghIJ", "abcdefghI"); // Extra data, can't transform. decode_data.AddString(4, "abcdefghIJ", "abcdefghIJz"); EXPECT_EQ(4, decode_data.num_entries()); uint8 expected_data[] = { 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, }; string expected((const char*)expected_data, sizeof(expected_data)); EXPECT_EQ(expected, decode_data.Data()); } TEST(ObjCHelper, TextFormatDecodeData_ByteCodes) { TextFormatDecodeData decode_data; decode_data.AddString(1, "abcdefghIJ", "abcdefghIJ"); decode_data.AddString(3, "abcdefghIJ", "_AbcdefghIJ"); decode_data.AddString(2, "abcdefghIJ", "Abcd_EfghIJ"); decode_data.AddString(4, "abcdefghIJ", "ABCD__EfghI_j"); decode_data.AddString(1000, "longFieldNameIsLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong1000", "long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1000"); EXPECT_EQ(5, decode_data.num_entries()); uint8 expected_data[] = { 0x5, // All as is (00 op) 0x1, 0x0A, 0x0, // Underscore, upper + 9 (10 op) 0x3, 0xCA, 0x0, // Upper + 3 (10 op), underscore, upper + 5 (10 op) 0x2, 0x44, 0xC6, 0x0, // All Upper for 4 (11 op), underscore, underscore, upper + 5 (10 op), // underscore, lower + 0 (01 op) 0x4, 0x64, 0x80, 0xC5, 0xA1, 0x0, // 2 byte key: as is + 3 (00 op), underscore, lower + 4 (01 op), // underscore, lower + 3 (01 op), underscore, lower + 1 (01 op), // 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, }; string expected((const char*)expected_data, sizeof(expected_data)); EXPECT_EQ(expected, decode_data.Data()); } // Death tests do not work on Windows as of yet. #ifdef PROTOBUF_HAS_DEATH_TEST TEST(ObjCHelperDeathTest, TextFormatDecodeData_Failures) { TextFormatDecodeData decode_data; // Empty inputs. EXPECT_EXIT(decode_data.AddString(1, "", ""), ::testing::KilledBySignal(SIGABRT), "error: got empty string for making TextFormat data, input:"); EXPECT_EXIT(decode_data.AddString(1, "a", ""), ::testing::KilledBySignal(SIGABRT), "error: got empty string for making TextFormat data, input:"); EXPECT_EXIT(decode_data.AddString(1, "", "a"), ::testing::KilledBySignal(SIGABRT), "error: got empty string for making TextFormat data, input:"); // Null char in the string. string str_with_null_char("ab\0c", 4); EXPECT_EXIT( decode_data.AddString(1, str_with_null_char, "def"), ::testing::KilledBySignal(SIGABRT), "error: got a null char in a string for making TextFormat data, input:"); EXPECT_EXIT( decode_data.AddString(1, "def", str_with_null_char), ::testing::KilledBySignal(SIGABRT), "error: got a null char in a string for making TextFormat data, input:"); // Duplicate keys decode_data.AddString(1, "abcdefghIJ", "abcdefghIJ"); decode_data.AddString(3, "abcdefghIJ", "_AbcdefghIJ"); decode_data.AddString(2, "abcdefghIJ", "Abcd_EfghIJ"); EXPECT_EXIT(decode_data.AddString(2, "xyz", "x_yz"), ::testing::KilledBySignal(SIGABRT), "error: duplicate key \\(2\\) making TextFormat data, input:"); } #endif // PROTOBUF_HAS_DEATH_TEST // 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 // use src/google/protobuf/compiler/importer* (like other tests) to support a // virtual file system to feed in protos, once we have the Descriptor tree, the // tests could use the helper methods for generating names and validate the // right things are happening. } // namespace } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_map_field.cc000066400000000000000000000161101334102242000355640ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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. #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { // MapFieldGenerator uses RepeatedFieldGenerator as the parent because it // provides a bunch of things (no has* methods, comments for contained type, // etc.). namespace { const char* MapEntryTypeName(const FieldDescriptor* descriptor, bool isKey) { ObjectiveCType type = GetObjectiveCType(descriptor); switch (type) { case OBJECTIVECTYPE_INT32: return "Int32"; case OBJECTIVECTYPE_UINT32: return "UInt32"; case OBJECTIVECTYPE_INT64: return "Int64"; case OBJECTIVECTYPE_UINT64: return "UInt64"; case OBJECTIVECTYPE_FLOAT: return "Float"; case OBJECTIVECTYPE_DOUBLE: return "Double"; case OBJECTIVECTYPE_BOOLEAN: return "Bool"; case OBJECTIVECTYPE_STRING: return (isKey ? "String" : "Object"); case OBJECTIVECTYPE_DATA: return "Object"; case OBJECTIVECTYPE_ENUM: return "Enum"; case OBJECTIVECTYPE_MESSAGE: return "Object"; } // Some compilers report reaching end of function even though all cases of // the enum are handed in the switch. GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } } // namespace MapFieldGenerator::MapFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : RepeatedFieldGenerator(descriptor, options) { const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); value_field_generator_.reset(FieldGenerator::Make(value_descriptor, options)); // Pull over some variables_ from the value. variables_["field_type"] = value_field_generator_->variable("field_type"); variables_["default"] = value_field_generator_->variable("default"); variables_["default_name"] = value_field_generator_->variable("default_name"); // Build custom field flags. std::vector field_flags; field_flags.push_back("GPBFieldMapKey" + GetCapitalizedType(key_descriptor)); // Pull over the current text format custom name values that was calculated. if (variables_["fieldflags"].find("GPBFieldTextFormatNameCustom") != string::npos) { field_flags.push_back("GPBFieldTextFormatNameCustom"); } // Pull over some info from the value's flags. const string& value_field_flags = value_field_generator_->variable("fieldflags"); if (value_field_flags.find("GPBFieldHasDefaultValue") != string::npos) { field_flags.push_back("GPBFieldHasDefaultValue"); } if (value_field_flags.find("GPBFieldHasEnumDescriptor") != string::npos) { field_flags.push_back("GPBFieldHasEnumDescriptor"); } variables_["fieldflags"] = BuildFlagsString(FLAGTYPE_FIELD, field_flags); ObjectiveCType value_objc_type = GetObjectiveCType(value_descriptor); const bool value_is_object_type = ((value_objc_type == OBJECTIVECTYPE_STRING) || (value_objc_type == OBJECTIVECTYPE_DATA) || (value_objc_type == OBJECTIVECTYPE_MESSAGE)); if ((GetObjectiveCType(key_descriptor) == OBJECTIVECTYPE_STRING) && value_is_object_type) { variables_["array_storage_type"] = "NSMutableDictionary"; variables_["array_property_type"] = "NSMutableDictionaryvariable("storage_type") + "*>"; } else { string class_name("GPB"); class_name += MapEntryTypeName(key_descriptor, true); class_name += MapEntryTypeName(value_descriptor, false); class_name += "Dictionary"; variables_["array_storage_type"] = class_name; if (value_is_object_type) { variables_["array_property_type"] = class_name + "<" + value_field_generator_->variable("storage_type") + "*>"; } } variables_["dataTypeSpecific_name"] = value_field_generator_->variable("dataTypeSpecific_name"); variables_["dataTypeSpecific_value"] = value_field_generator_->variable("dataTypeSpecific_value"); } MapFieldGenerator::~MapFieldGenerator() {} void MapFieldGenerator::FinishInitialization(void) { RepeatedFieldGenerator::FinishInitialization(); // Use the array_comment support in RepeatedFieldGenerator to output what the // values in the map are. const FieldDescriptor* value_descriptor = descriptor_->message_type()->FindFieldByName("value"); if (GetObjectiveCType(value_descriptor) == OBJECTIVECTYPE_ENUM) { variables_["array_comment"] = "// |" + variables_["name"] + "| values are |" + value_field_generator_->variable("storage_type") + "|\n"; } } void MapFieldGenerator::DetermineForwardDeclarations( std::set* fwd_decls) const { RepeatedFieldGenerator::DetermineForwardDeclarations(fwd_decls); const FieldDescriptor* value_descriptor = descriptor_->message_type()->FindFieldByName("value"); if (GetObjectiveCType(value_descriptor) == OBJECTIVECTYPE_MESSAGE) { const string& value_storage_type = value_field_generator_->variable("storage_type"); fwd_decls->insert("@class " + value_storage_type); } } } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_map_field.h000066400000000000000000000052311334102242000354300ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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. #ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_MAP_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_MAP_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { class MapFieldGenerator : public RepeatedFieldGenerator { friend FieldGenerator* FieldGenerator::Make(const FieldDescriptor* field, const Options& options); public: virtual void FinishInitialization(void); protected: MapFieldGenerator(const FieldDescriptor* descriptor, const Options& options); virtual ~MapFieldGenerator(); virtual void DetermineForwardDeclarations(std::set* fwd_decls) const; private: scoped_ptr value_field_generator_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapFieldGenerator); }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_MAP_FIELD_H__ objectivec_message.cc000066400000000000000000000600611334102242000352740ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { using internal::WireFormat; using internal::WireFormatLite; namespace { struct FieldOrderingByNumber { inline bool operator()(const FieldDescriptor* a, const FieldDescriptor* b) const { return a->number() < b->number(); } }; int OrderGroupForFieldDescriptor(const FieldDescriptor* descriptor) { // The first item in the object structure is our uint32[] for has bits. // We then want to order things to make the instances as small as // possible. So we follow the has bits with: // 1. Anything always 4 bytes - float, *32, enums // 2. Anything that is always a pointer (they will be 8 bytes on 64 bit // builds and 4 bytes on 32bit builds. // 3. Anything always 8 bytes - double, *64 // // NOTE: Bools aren't listed, they were stored in the has bits. // // Why? Using 64bit builds as an example, this means worse case, we have // enough bools that we overflow 1 byte from 4 byte alignment, so 3 bytes // are wasted before the 4 byte values. Then if we have an odd number of // those 4 byte values, the 8 byte values will be pushed down by 32bits to // keep them aligned. But the structure will end 8 byte aligned, so no // waste on the end. If you did the reverse order, you could waste 4 bytes // before the first 8 byte value (after the has array), then a single // bool on the end would need 7 bytes of padding to make the overall // structure 8 byte aligned; so 11 bytes, wasted total. // Anything repeated is a GPB*Array/NSArray, so pointer. if (descriptor->is_repeated()) { return 3; } switch (descriptor->type()) { // All always 8 bytes. case FieldDescriptor::TYPE_DOUBLE: case FieldDescriptor::TYPE_INT64: case FieldDescriptor::TYPE_SINT64: case FieldDescriptor::TYPE_UINT64: case FieldDescriptor::TYPE_SFIXED64: case FieldDescriptor::TYPE_FIXED64: return 4; // Pointers (string and bytes are NSString and NSData); 8 or 4 bytes // depending on the build architecture. case FieldDescriptor::TYPE_GROUP: case FieldDescriptor::TYPE_MESSAGE: case FieldDescriptor::TYPE_STRING: case FieldDescriptor::TYPE_BYTES: return 3; // All always 4 bytes (enums are int32s). case FieldDescriptor::TYPE_FLOAT: case FieldDescriptor::TYPE_INT32: case FieldDescriptor::TYPE_SINT32: case FieldDescriptor::TYPE_UINT32: case FieldDescriptor::TYPE_SFIXED32: case FieldDescriptor::TYPE_FIXED32: case FieldDescriptor::TYPE_ENUM: return 2; // 0 bytes. Stored in the has bits. case FieldDescriptor::TYPE_BOOL: return 99; // End of the list (doesn't really matter). } // Some compilers report reaching end of function even though all cases of // the enum are handed in the switch. GOOGLE_LOG(FATAL) << "Can't get here."; return 0; } struct FieldOrderingByStorageSize { inline bool operator()(const FieldDescriptor* a, const FieldDescriptor* b) const { // Order by grouping. const int order_group_a = OrderGroupForFieldDescriptor(a); const int order_group_b = OrderGroupForFieldDescriptor(b); if (order_group_a != order_group_b) { return order_group_a < order_group_b; } // Within the group, order by field number (provides stable ordering). return a->number() < b->number(); } }; struct ExtensionRangeOrdering { bool operator()(const Descriptor::ExtensionRange* a, const Descriptor::ExtensionRange* b) const { return a->start < b->start; } }; // Sort the fields of the given Descriptor by number into a new[]'d array // and return it. const FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor) { const FieldDescriptor** fields = new const FieldDescriptor* [descriptor->field_count()]; for (int i = 0; i < descriptor->field_count(); i++) { fields[i] = descriptor->field(i); } std::sort(fields, fields + descriptor->field_count(), FieldOrderingByNumber()); return fields; } // Sort the fields of the given Descriptor by storage size into a new[]'d // array and return it. const FieldDescriptor** SortFieldsByStorageSize(const Descriptor* descriptor) { const FieldDescriptor** fields = new const FieldDescriptor* [descriptor->field_count()]; for (int i = 0; i < descriptor->field_count(); i++) { fields[i] = descriptor->field(i); } std::sort(fields, fields + descriptor->field_count(), FieldOrderingByStorageSize()); return fields; } } // namespace MessageGenerator::MessageGenerator(const string& root_classname, const Descriptor* descriptor, const Options& options) : root_classname_(root_classname), descriptor_(descriptor), field_generators_(descriptor, options), class_name_(ClassName(descriptor_)), deprecated_attribute_( GetOptionalDeprecatedAttribute(descriptor, descriptor->file(), false, true)) { for (int i = 0; i < descriptor_->extension_count(); i++) { extension_generators_.push_back( new ExtensionGenerator(class_name_, descriptor_->extension(i))); } for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { OneofGenerator* generator = new OneofGenerator(descriptor_->oneof_decl(i)); oneof_generators_.push_back(generator); } for (int i = 0; i < descriptor_->enum_type_count(); i++) { EnumGenerator* generator = new EnumGenerator(descriptor_->enum_type(i)); enum_generators_.push_back(generator); } for (int i = 0; i < descriptor_->nested_type_count(); i++) { MessageGenerator* generator = new MessageGenerator(root_classname_, descriptor_->nested_type(i), options); nested_message_generators_.push_back(generator); } } MessageGenerator::~MessageGenerator() { STLDeleteContainerPointers(extension_generators_.begin(), extension_generators_.end()); STLDeleteContainerPointers(enum_generators_.begin(), enum_generators_.end()); STLDeleteContainerPointers(nested_message_generators_.begin(), nested_message_generators_.end()); STLDeleteContainerPointers(oneof_generators_.begin(), oneof_generators_.end()); } void MessageGenerator::GenerateStaticVariablesInitialization( io::Printer* printer) { for (vector::iterator iter = extension_generators_.begin(); iter != extension_generators_.end(); ++iter) { (*iter)->GenerateStaticVariablesInitialization(printer); } for (vector::iterator iter = nested_message_generators_.begin(); iter != nested_message_generators_.end(); ++iter) { (*iter)->GenerateStaticVariablesInitialization(printer); } } void MessageGenerator::DetermineForwardDeclarations(std::set* fwd_decls) { if (!IsMapEntryMessage(descriptor_)) { for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* fieldDescriptor = descriptor_->field(i); field_generators_.get(fieldDescriptor) .DetermineForwardDeclarations(fwd_decls); } } for (vector::iterator iter = nested_message_generators_.begin(); iter != nested_message_generators_.end(); ++iter) { (*iter)->DetermineForwardDeclarations(fwd_decls); } } bool MessageGenerator::IncludesOneOfDefinition() const { if (!oneof_generators_.empty()) { return true; } for (vector::const_iterator iter = nested_message_generators_.begin(); iter != nested_message_generators_.end(); ++iter) { if ((*iter)->IncludesOneOfDefinition()) { return true; } } return false; } void MessageGenerator::GenerateEnumHeader(io::Printer* printer) { for (vector::iterator iter = enum_generators_.begin(); iter != enum_generators_.end(); ++iter) { (*iter)->GenerateHeader(printer); } for (vector::iterator iter = nested_message_generators_.begin(); iter != nested_message_generators_.end(); ++iter) { (*iter)->GenerateEnumHeader(printer); } } void MessageGenerator::GenerateExtensionRegistrationSource( io::Printer* printer) { for (vector::iterator iter = extension_generators_.begin(); iter != extension_generators_.end(); ++iter) { (*iter)->GenerateRegistrationSource(printer); } for (vector::iterator iter = nested_message_generators_.begin(); iter != nested_message_generators_.end(); ++iter) { (*iter)->GenerateExtensionRegistrationSource(printer); } } void MessageGenerator::GenerateMessageHeader(io::Printer* printer) { // This a a map entry message, just recurse and do nothing directly. if (IsMapEntryMessage(descriptor_)) { for (vector::iterator iter = nested_message_generators_.begin(); iter != nested_message_generators_.end(); ++iter) { (*iter)->GenerateMessageHeader(printer); } return; } printer->Print( "#pragma mark - $classname$\n" "\n", "classname", class_name_); if (descriptor_->field_count()) { scoped_array sorted_fields( SortFieldsByNumber(descriptor_)); printer->Print("typedef GPB_ENUM($classname$_FieldNumber) {\n", "classname", class_name_); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(sorted_fields[i]) .GenerateFieldNumberConstant(printer); } printer->Outdent(); printer->Print("};\n\n"); } for (vector::iterator iter = oneof_generators_.begin(); iter != oneof_generators_.end(); ++iter) { (*iter)->GenerateCaseEnum(printer); } string message_comments; SourceLocation location; if (descriptor_->GetSourceLocation(&location)) { message_comments = BuildCommentsString(location, false); } else { message_comments = ""; } printer->Print( "$comments$$deprecated_attribute$@interface $classname$ : GPBMessage\n\n", "classname", class_name_, "deprecated_attribute", deprecated_attribute_, "comments", message_comments); vector seen_oneofs(descriptor_->oneof_decl_count(), 0); for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->containing_oneof() != NULL) { const int oneof_index = field->containing_oneof()->index(); if (!seen_oneofs[oneof_index]) { seen_oneofs[oneof_index] = 1; oneof_generators_[oneof_index]->GeneratePublicCasePropertyDeclaration( printer); } } field_generators_.get(field).GeneratePropertyDeclaration(printer); } printer->Print("@end\n\n"); for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(descriptor_->field(i)) .GenerateCFunctionDeclarations(printer); } if (!oneof_generators_.empty()) { for (vector::iterator iter = oneof_generators_.begin(); iter != oneof_generators_.end(); ++iter) { (*iter)->GenerateClearFunctionDeclaration(printer); } printer->Print("\n"); } if (descriptor_->extension_count() > 0) { printer->Print("@interface $classname$ (DynamicMethods)\n\n", "classname", class_name_); for (vector::iterator iter = extension_generators_.begin(); iter != extension_generators_.end(); ++iter) { (*iter)->GenerateMembersHeader(printer); } printer->Print("@end\n\n"); } for (vector::iterator iter = nested_message_generators_.begin(); iter != nested_message_generators_.end(); ++iter) { (*iter)->GenerateMessageHeader(printer); } } void MessageGenerator::GenerateSource(io::Printer* printer) { if (!IsMapEntryMessage(descriptor_)) { printer->Print( "#pragma mark - $classname$\n" "\n", "classname", class_name_); if (!deprecated_attribute_.empty()) { // No warnings when compiling the impl of this deprecated class. printer->Print( "#pragma clang diagnostic push\n" "#pragma clang diagnostic ignored \"-Wdeprecated-implementations\"\n" "\n"); } printer->Print("@implementation $classname$\n\n", "classname", class_name_); for (vector::iterator iter = oneof_generators_.begin(); iter != oneof_generators_.end(); ++iter) { (*iter)->GeneratePropertyImplementation(printer); } for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(descriptor_->field(i)) .GeneratePropertyImplementation(printer); } scoped_array sorted_fields( SortFieldsByNumber(descriptor_)); scoped_array size_order_fields( SortFieldsByStorageSize(descriptor_)); vector sorted_extensions; 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()); // Assign has bits: // 1. FieldGeneratorMap::CalculateHasBits() loops through the fields seeing // who needs has bits and assigning them. // 2. FieldGenerator::SetOneofIndexBase() overrides has_bit with a negative // index that groups all the elements in the oneof. size_t num_has_bits = field_generators_.CalculateHasBits(); size_t sizeof_has_storage = (num_has_bits + 31) / 32; if (sizeof_has_storage == 0) { // In the case where no field needs has bits, don't let the _has_storage_ // end up as zero length (zero length arrays are sort of a grey area // since it has to be at the start of the struct). This also ensures a // field with only oneofs keeps the required negative indices they need. sizeof_has_storage = 1; } // Tell all the fields the oneof base. for (vector::iterator iter = oneof_generators_.begin(); iter != oneof_generators_.end(); ++iter) { (*iter)->SetOneofIndexBase(sizeof_has_storage); } field_generators_.SetOneofIndexBase(sizeof_has_storage); // sizeof_has_storage needs enough bits for the single fields that aren't in // any oneof, and then one int32 for each oneof (to store the field number). sizeof_has_storage += descriptor_->oneof_decl_count(); printer->Print( "\n" "typedef struct $classname$__storage_ {\n" " uint32_t _has_storage_[$sizeof_has_storage$];\n", "classname", class_name_, "sizeof_has_storage", SimpleItoa(sizeof_has_storage)); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(size_order_fields[i]) .GenerateFieldStorageDeclaration(printer); } printer->Outdent(); printer->Print("} $classname$__storage_;\n\n", "classname", class_name_); printer->Print( "// This method is threadsafe because it is initially called\n" "// in +initialize for each subclass.\n" "+ (GPBDescriptor *)descriptor {\n" " static GPBDescriptor *descriptor = nil;\n" " if (!descriptor) {\n"); TextFormatDecodeData text_format_decode_data; bool has_fields = descriptor_->field_count() > 0; bool need_defaults = field_generators_.DoesAnyFieldHaveNonZeroDefault(); string field_description_type; if (need_defaults) { field_description_type = "GPBMessageFieldDescriptionWithDefault"; } else { field_description_type = "GPBMessageFieldDescription"; } if (has_fields) { printer->Print( " static $field_description_type$ fields[] = {\n", "field_description_type", field_description_type); printer->Indent(); printer->Indent(); printer->Indent(); for (int i = 0; i < descriptor_->field_count(); ++i) { const FieldGenerator& field_generator = field_generators_.get(sorted_fields[i]); field_generator.GenerateFieldDescription(printer, need_defaults); if (field_generator.needs_textformat_name_support()) { text_format_decode_data.AddString(sorted_fields[i]->number(), field_generator.generated_objc_name(), field_generator.raw_field_name()); } } printer->Outdent(); printer->Outdent(); printer->Outdent(); printer->Print( " };\n"); } std::map vars; vars["classname"] = class_name_; vars["rootclassname"] = root_classname_; vars["fields"] = has_fields ? "fields" : "NULL"; if (has_fields) { vars["fields_count"] = "(uint32_t)(sizeof(fields) / sizeof(" + field_description_type + "))"; } else { vars["fields_count"] = "0"; } std::vector init_flags; if (need_defaults) { init_flags.push_back("GPBDescriptorInitializationFlag_FieldsWithDefault"); } if (descriptor_->options().message_set_wire_format()) { init_flags.push_back("GPBDescriptorInitializationFlag_WireFormat"); } vars["init_flags"] = BuildFlagsString(FLAGTYPE_DESCRIPTOR_INITIALIZATION, init_flags); printer->Print( vars, " GPBDescriptor *localDescriptor =\n" " [GPBDescriptor allocDescriptorForClass:[$classname$ class]\n" " rootClass:[$rootclassname$ class]\n" " file:$rootclassname$_FileDescriptor()\n" " fields:$fields$\n" " fieldCount:$fields_count$\n" " storageSize:sizeof($classname$__storage_)\n" " flags:$init_flags$];\n"); if (oneof_generators_.size() != 0) { printer->Print( " static const char *oneofs[] = {\n"); for (vector::iterator iter = oneof_generators_.begin(); iter != oneof_generators_.end(); ++iter) { printer->Print( " \"$name$\",\n", "name", (*iter)->DescriptorName()); } printer->Print( " };\n" " [localDescriptor setupOneofs:oneofs\n" " count:(uint32_t)(sizeof(oneofs) / sizeof(char*))\n" " firstHasIndex:$first_has_index$];\n", "first_has_index", oneof_generators_[0]->HasIndexAsString()); } if (text_format_decode_data.num_entries() != 0) { const string text_format_data_str(text_format_decode_data.Data()); printer->Print( "#if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n" " static const char *extraTextFormatInfo ="); static const int kBytesPerLine = 40; // allow for escaping for (int i = 0; i < text_format_data_str.size(); i += kBytesPerLine) { printer->Print( "\n \"$data$\"", "data", EscapeTrigraphs( CEscape(text_format_data_str.substr(i, kBytesPerLine)))); } printer->Print( ";\n" " [localDescriptor setupExtraTextInfo:extraTextFormatInfo];\n" "#endif // !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n"); } if (sorted_extensions.size() != 0) { printer->Print( " static const GPBExtensionRange ranges[] = {\n"); for (int i = 0; i < sorted_extensions.size(); i++) { printer->Print(" { .start = $start$, .end = $end$ },\n", "start", SimpleItoa(sorted_extensions[i]->start), "end", SimpleItoa(sorted_extensions[i]->end)); } printer->Print( " };\n" " [localDescriptor setupExtensionRanges:ranges\n" " count:(uint32_t)(sizeof(ranges) / sizeof(GPBExtensionRange))];\n"); } if (descriptor_->containing_type() != NULL) { string parent_class_name = ClassName(descriptor_->containing_type()); printer->Print( " [localDescriptor setupContainingMessageClassName:GPBStringifySymbol($parent_name$)];\n", "parent_name", parent_class_name); } string suffix_added; ClassName(descriptor_, &suffix_added); if (suffix_added.size() > 0) { printer->Print( " [localDescriptor setupMessageClassNameSuffix:@\"$suffix$\"];\n", "suffix", suffix_added); } printer->Print( " NSAssert(descriptor == nil, @\"Startup recursed!\");\n" " descriptor = localDescriptor;\n" " }\n" " return descriptor;\n" "}\n\n" "@end\n\n"); if (!deprecated_attribute_.empty()) { printer->Print( "#pragma clang diagnostic pop\n" "\n"); } for (int i = 0; i < descriptor_->field_count(); i++) { field_generators_.get(descriptor_->field(i)) .GenerateCFunctionImplementations(printer); } for (vector::iterator iter = oneof_generators_.begin(); iter != oneof_generators_.end(); ++iter) { (*iter)->GenerateClearFunctionImplementation(printer); } } for (vector::iterator iter = enum_generators_.begin(); iter != enum_generators_.end(); ++iter) { (*iter)->GenerateSource(printer); } for (vector::iterator iter = nested_message_generators_.begin(); iter != nested_message_generators_.end(); ++iter) { (*iter)->GenerateSource(printer); } } } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_message.h000066400000000000000000000077041334102242000351430ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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_OBJECTIVEC_MESSAGE_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_MESSAGE_H__ #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } // namespace io namespace compiler { namespace objectivec { class ExtensionGenerator; class EnumGenerator; class MessageGenerator { public: MessageGenerator(const string& root_classname, const Descriptor* descriptor, const Options& options); ~MessageGenerator(); void GenerateStaticVariablesInitialization(io::Printer* printer); void GenerateEnumHeader(io::Printer* printer); void GenerateMessageHeader(io::Printer* printer); void GenerateSource(io::Printer* printer); void GenerateExtensionRegistrationSource(io::Printer* printer); void DetermineForwardDeclarations(std::set* fwd_decls); // Checks if the message or a nested message includes a oneof definition. bool IncludesOneOfDefinition() const; private: void GenerateParseFromMethodsHeader(io::Printer* printer); void GenerateSerializeOneFieldSource(io::Printer* printer, const FieldDescriptor* field); void GenerateSerializeOneExtensionRangeSource( io::Printer* printer, const Descriptor::ExtensionRange* range); void GenerateMessageDescriptionSource(io::Printer* printer); void GenerateDescriptionOneFieldSource(io::Printer* printer, const FieldDescriptor* field); const string root_classname_; const Descriptor* descriptor_; FieldGeneratorMap field_generators_; const string class_name_; const string deprecated_attribute_; vector extension_generators_; vector enum_generators_; vector nested_message_generators_; vector oneof_generators_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator); }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_MESSAGE_H__ objectivec_message_field.cc000066400000000000000000000104321334102242000364340ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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 #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { namespace { void SetMessageVariables(const FieldDescriptor* descriptor, std::map* variables) { const string& message_type = ClassName(descriptor->message_type()); (*variables)["type"] = message_type; (*variables)["containing_class"] = ClassName(descriptor->containing_type()); (*variables)["storage_type"] = message_type; (*variables)["group_or_message"] = (descriptor->type() == FieldDescriptor::TYPE_GROUP) ? "Group" : "Message"; (*variables)["dataTypeSpecific_value"] = "GPBStringifySymbol(" + message_type + ")"; } } // namespace MessageFieldGenerator::MessageFieldGenerator(const FieldDescriptor* descriptor, const Options& options) : ObjCObjFieldGenerator(descriptor, options) { SetMessageVariables(descriptor, &variables_); } MessageFieldGenerator::~MessageFieldGenerator() {} void MessageFieldGenerator::DetermineForwardDeclarations( std::set* fwd_decls) const { ObjCObjFieldGenerator::DetermineForwardDeclarations(fwd_decls); // Class name is already in "storage_type". fwd_decls->insert("@class " + variable("storage_type")); } bool MessageFieldGenerator::WantsHasProperty(void) const { if (descriptor_->containing_oneof() != NULL) { // If in a oneof, it uses the oneofcase instead of a has bit. return false; } // In both proto2 & proto3, message fields have a has* property to tell // when it is a non default value. return true; } RepeatedMessageFieldGenerator::RepeatedMessageFieldGenerator( const FieldDescriptor* descriptor, const Options& options) : RepeatedFieldGenerator(descriptor, options) { SetMessageVariables(descriptor, &variables_); variables_["array_storage_type"] = "NSMutableArray"; variables_["array_property_type"] = "NSMutableArray<" + variables_["storage_type"] + "*>"; } RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {} void RepeatedMessageFieldGenerator::DetermineForwardDeclarations( std::set* fwd_decls) const { RepeatedFieldGenerator::DetermineForwardDeclarations(fwd_decls); // Class name is already in "storage_type". fwd_decls->insert("@class " + variable("storage_type")); } } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_message_field.h000066400000000000000000000063221334102242000363010ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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_OBJECTIVEC_MESSAGE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_MESSAGE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { class MessageFieldGenerator : public ObjCObjFieldGenerator { friend FieldGenerator* FieldGenerator::Make(const FieldDescriptor* field, const Options& options); protected: MessageFieldGenerator(const FieldDescriptor* descriptor, const Options& options); virtual ~MessageFieldGenerator(); virtual bool WantsHasProperty(void) const; public: virtual void DetermineForwardDeclarations(std::set* fwd_decls) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator); }; class RepeatedMessageFieldGenerator : public RepeatedFieldGenerator { friend FieldGenerator* FieldGenerator::Make(const FieldDescriptor* field, const Options& options); protected: RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, const Options& options); virtual ~RepeatedMessageFieldGenerator(); public: virtual void DetermineForwardDeclarations(std::set* fwd_decls) const; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator); }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_MESSAGE_FIELD_H__ objectivec_oneof.cc000066400000000000000000000117531334102242000347620ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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 #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { OneofGenerator::OneofGenerator(const OneofDescriptor* descriptor) : descriptor_(descriptor) { variables_["enum_name"] = OneofEnumName(descriptor_); variables_["name"] = OneofName(descriptor_); variables_["capitalized_name"] = OneofNameCapitalized(descriptor_); variables_["raw_index"] = SimpleItoa(descriptor_->index()); const Descriptor* msg_descriptor = descriptor_->containing_type(); variables_["owning_message_class"] = ClassName(msg_descriptor); string comments; SourceLocation location; if (descriptor_->GetSourceLocation(&location)) { comments = BuildCommentsString(location, true); } else { comments = ""; } variables_["comments"] = comments; } OneofGenerator::~OneofGenerator() {} void OneofGenerator::SetOneofIndexBase(int index_base) { int index = descriptor_->index() + index_base; // Flip the sign to mark it as a oneof. variables_["index"] = SimpleItoa(-index); } void OneofGenerator::GenerateCaseEnum(io::Printer* printer) { printer->Print( variables_, "typedef GPB_ENUM($enum_name$) {\n"); printer->Indent(); printer->Print( variables_, "$enum_name$_GPBUnsetOneOfCase = 0,\n"); string enum_name = variables_["enum_name"]; for (int j = 0; j < descriptor_->field_count(); j++) { const FieldDescriptor* field = descriptor_->field(j); string field_name = FieldNameCapitalized(field); printer->Print( "$enum_name$_$field_name$ = $field_number$,\n", "enum_name", enum_name, "field_name", field_name, "field_number", SimpleItoa(field->number())); } printer->Outdent(); printer->Print( "};\n" "\n"); } void OneofGenerator::GeneratePublicCasePropertyDeclaration( io::Printer* printer) { printer->Print( variables_, "$comments$" "@property(nonatomic, readonly) $enum_name$ $name$OneOfCase;\n" "\n"); } void OneofGenerator::GenerateClearFunctionDeclaration(io::Printer* printer) { printer->Print( variables_, "/**\n" " * Clears whatever value was set for the oneof '$name$'.\n" " **/\n" "void $owning_message_class$_Clear$capitalized_name$OneOfCase($owning_message_class$ *message);\n"); } void OneofGenerator::GeneratePropertyImplementation(io::Printer* printer) { printer->Print( variables_, "@dynamic $name$OneOfCase;\n"); } void OneofGenerator::GenerateClearFunctionImplementation(io::Printer* printer) { printer->Print( variables_, "void $owning_message_class$_Clear$capitalized_name$OneOfCase($owning_message_class$ *message) {\n" " GPBDescriptor *descriptor = [message descriptor];\n" " GPBOneofDescriptor *oneof = [descriptor.oneofs objectAtIndex:$raw_index$];\n" " GPBMaybeClearOneof(message, oneof, $index$, 0);\n" "}\n"); } string OneofGenerator::DescriptorName(void) const { return variables_.find("name")->second; } string OneofGenerator::HasIndexAsString(void) const { return variables_.find("index")->second; } } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_oneof.h000066400000000000000000000054561334102242000346270ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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_OBJECTIVEC_ONEOF_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_ONEOF_H__ #include #include #include #include namespace google { namespace protobuf { namespace io { class Printer; // printer.h } } namespace protobuf { namespace compiler { namespace objectivec { class OneofGenerator { public: explicit OneofGenerator(const OneofDescriptor* descriptor); ~OneofGenerator(); void SetOneofIndexBase(int index_base); void GenerateCaseEnum(io::Printer* printer); void GeneratePublicCasePropertyDeclaration(io::Printer* printer); void GenerateClearFunctionDeclaration(io::Printer* printer); void GeneratePropertyImplementation(io::Printer* printer); void GenerateClearFunctionImplementation(io::Printer* printer); string DescriptorName(void) const; string HasIndexAsString(void) const; private: const OneofDescriptor* descriptor_; std::map variables_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OneofGenerator); }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_ONEOF_H__ objectivec_primitive_field.cc000066400000000000000000000152031334102242000370210ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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 #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { using internal::WireFormat; using internal::WireFormatLite; namespace { const char* PrimitiveTypeName(const FieldDescriptor* descriptor) { ObjectiveCType type = GetObjectiveCType(descriptor); switch (type) { case OBJECTIVECTYPE_INT32: return "int32_t"; case OBJECTIVECTYPE_UINT32: return "uint32_t"; case OBJECTIVECTYPE_INT64: return "int64_t"; case OBJECTIVECTYPE_UINT64: return "uint64_t"; case OBJECTIVECTYPE_FLOAT: return "float"; case OBJECTIVECTYPE_DOUBLE: return "double"; case OBJECTIVECTYPE_BOOLEAN: return "BOOL"; case OBJECTIVECTYPE_STRING: return "NSString"; case OBJECTIVECTYPE_DATA: return "NSData"; case OBJECTIVECTYPE_ENUM: return "int32_t"; case OBJECTIVECTYPE_MESSAGE: return NULL; // Messages go through objectivec_message_field.cc|h. } // Some compilers report reaching end of function even though all cases of // the enum are handed in the switch. GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } const char* PrimitiveArrayTypeName(const FieldDescriptor* descriptor) { ObjectiveCType type = GetObjectiveCType(descriptor); switch (type) { case OBJECTIVECTYPE_INT32: return "Int32"; case OBJECTIVECTYPE_UINT32: return "UInt32"; case OBJECTIVECTYPE_INT64: return "Int64"; case OBJECTIVECTYPE_UINT64: return "UInt64"; case OBJECTIVECTYPE_FLOAT: return "Float"; case OBJECTIVECTYPE_DOUBLE: return "Double"; case OBJECTIVECTYPE_BOOLEAN: return "Bool"; case OBJECTIVECTYPE_STRING: return ""; // Want NSArray case OBJECTIVECTYPE_DATA: return ""; // Want NSArray case OBJECTIVECTYPE_ENUM: return "Enum"; case OBJECTIVECTYPE_MESSAGE: // Want NSArray (but goes through objectivec_message_field.cc|h). return ""; } // Some compilers report reaching end of function even though all cases of // the enum are handed in the switch. GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } void SetPrimitiveVariables(const FieldDescriptor* descriptor, std::map* variables) { std::string primitive_name = PrimitiveTypeName(descriptor); (*variables)["type"] = primitive_name; (*variables)["storage_type"] = primitive_name; } } // namespace PrimitiveFieldGenerator::PrimitiveFieldGenerator( const FieldDescriptor* descriptor, const Options& options) : SingleFieldGenerator(descriptor, options) { SetPrimitiveVariables(descriptor, &variables_); } PrimitiveFieldGenerator::~PrimitiveFieldGenerator() {} void PrimitiveFieldGenerator::GenerateFieldStorageDeclaration( io::Printer* printer) const { if (GetObjectiveCType(descriptor_) == OBJECTIVECTYPE_BOOLEAN) { // Nothing, BOOLs are stored in the has bits. } else { SingleFieldGenerator::GenerateFieldStorageDeclaration(printer); } } int PrimitiveFieldGenerator::ExtraRuntimeHasBitsNeeded(void) const { if (GetObjectiveCType(descriptor_) == OBJECTIVECTYPE_BOOLEAN) { // Reserve a bit for the storage of the boolean. return 1; } return 0; } 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"] = SimpleItoa(has_base); variables_["storage_offset_comment"] = " // Stored in _has_storage_ to save space."; } } PrimitiveObjFieldGenerator::PrimitiveObjFieldGenerator( const FieldDescriptor* descriptor, const Options& options) : ObjCObjFieldGenerator(descriptor, options) { SetPrimitiveVariables(descriptor, &variables_); variables_["property_storage_attribute"] = "copy"; } PrimitiveObjFieldGenerator::~PrimitiveObjFieldGenerator() {} RepeatedPrimitiveFieldGenerator::RepeatedPrimitiveFieldGenerator( const FieldDescriptor* descriptor, const Options& options) : RepeatedFieldGenerator(descriptor, options) { SetPrimitiveVariables(descriptor, &variables_); string base_name = PrimitiveArrayTypeName(descriptor); if (base_name.length()) { variables_["array_storage_type"] = "GPB" + base_name + "Array"; } else { variables_["array_storage_type"] = "NSMutableArray"; variables_["array_property_type"] = "NSMutableArray<" + variables_["storage_type"] + "*>"; } } RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {} } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google objectivec_primitive_field.h000066400000000000000000000072311334102242000366650ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/objectivec// 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_OBJECTIVEC_PRIMITIVE_FIELD_H__ #define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_PRIMITIVE_FIELD_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace objectivec { class PrimitiveFieldGenerator : public SingleFieldGenerator { friend FieldGenerator* FieldGenerator::Make(const FieldDescriptor* field, const Options& options); protected: PrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Options& options); virtual ~PrimitiveFieldGenerator(); virtual void GenerateFieldStorageDeclaration(io::Printer* printer) const; virtual int ExtraRuntimeHasBitsNeeded(void) const; virtual void SetExtraRuntimeHasBitsBase(int index_base); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator); }; class PrimitiveObjFieldGenerator : public ObjCObjFieldGenerator { friend FieldGenerator* FieldGenerator::Make(const FieldDescriptor* field, const Options& options); protected: PrimitiveObjFieldGenerator(const FieldDescriptor* descriptor, const Options& options); virtual ~PrimitiveObjFieldGenerator(); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveObjFieldGenerator); }; class RepeatedPrimitiveFieldGenerator : public RepeatedFieldGenerator { friend FieldGenerator* FieldGenerator::Make(const FieldDescriptor* field, const Options& options); protected: RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Options& options); virtual ~RepeatedPrimitiveFieldGenerator(); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator); }; } // namespace objectivec } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_PRIMITIVE_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/package_info.h000066400000000000000000000062141334102242000316650ustar00rootroot00000000000000// 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. // // This file exists solely to document the google::protobuf::compiler namespace. // It is not compiled into anything, but it may be read by an automated // documentation generator. namespace google { namespace protobuf { // Implementation of the Protocol Buffer compiler. // // This package contains code for parsing .proto files and generating code // based on them. There are two reasons you might be interested in this // package: // - You want to parse .proto files at runtime. In this case, you should // look at importer.h. Since this functionality is widely useful, it is // included in the libprotobuf base library; you do not have to link against // libprotoc. // - You want to write a custom protocol compiler which generates different // kinds of code, e.g. code in a different language which is not supported // by the official compiler. For this purpose, command_line_interface.h // provides you with a complete compiler front-end, so all you need to do // is write a custom implementation of CodeGenerator and a trivial main() // function. You can even make your compiler support the official languages // in addition to your own. Since this functionality is only useful to those // writing custom compilers, it is in a separate library called "libprotoc" // which you will have to link against. namespace compiler {} } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/parser.cc000066400000000000000000002302551334102242000307150ustar00rootroot00000000000000// 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. // // Recursive descent FTW. #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { using internal::WireFormat; namespace { typedef hash_map TypeNameMap; TypeNameMap MakeTypeNameTable() { TypeNameMap result; result["double" ] = FieldDescriptorProto::TYPE_DOUBLE; result["float" ] = FieldDescriptorProto::TYPE_FLOAT; result["uint64" ] = FieldDescriptorProto::TYPE_UINT64; result["fixed64" ] = FieldDescriptorProto::TYPE_FIXED64; result["fixed32" ] = FieldDescriptorProto::TYPE_FIXED32; result["bool" ] = FieldDescriptorProto::TYPE_BOOL; result["string" ] = FieldDescriptorProto::TYPE_STRING; result["group" ] = FieldDescriptorProto::TYPE_GROUP; result["bytes" ] = FieldDescriptorProto::TYPE_BYTES; result["uint32" ] = FieldDescriptorProto::TYPE_UINT32; result["sfixed32"] = FieldDescriptorProto::TYPE_SFIXED32; result["sfixed64"] = FieldDescriptorProto::TYPE_SFIXED64; result["int32" ] = FieldDescriptorProto::TYPE_INT32; result["int64" ] = FieldDescriptorProto::TYPE_INT64; result["sint32" ] = FieldDescriptorProto::TYPE_SINT32; result["sint64" ] = FieldDescriptorProto::TYPE_SINT64; return result; } const TypeNameMap kTypeNames = MakeTypeNameTable(); // Camel-case the field name and append "Entry" for generated map entry name. // e.g. map foo_map => FooMapEntry string MapEntryName(const string& field_name) { string result; static const char kSuffix[] = "Entry"; result.reserve(field_name.size() + sizeof(kSuffix)); bool cap_next = true; for (int i = 0; i < field_name.size(); ++i) { if (field_name[i] == '_') { cap_next = true; } else if (cap_next) { // Note: Do not use ctype.h due to locales. if ('a' <= field_name[i] && field_name[i] <= 'z') { result.push_back(field_name[i] - 'a' + 'A'); } else { result.push_back(field_name[i]); } cap_next = false; } else { result.push_back(field_name[i]); } } result.append(kSuffix); return result; } } // anonymous namespace // Makes code slightly more readable. The meaning of "DO(foo)" is // "Execute foo and fail if it fails.", where failure is indicated by // returning false. #define DO(STATEMENT) if (STATEMENT) {} else return false // =================================================================== Parser::Parser() : input_(NULL), error_collector_(NULL), source_location_table_(NULL), had_errors_(false), require_syntax_identifier_(false), stop_after_syntax_identifier_(false) { } Parser::~Parser() { } // =================================================================== inline bool Parser::LookingAt(const char* text) { return input_->current().text == text; } inline bool Parser::LookingAtType(io::Tokenizer::TokenType token_type) { return input_->current().type == token_type; } inline bool Parser::AtEnd() { return LookingAtType(io::Tokenizer::TYPE_END); } bool Parser::TryConsume(const char* text) { if (LookingAt(text)) { input_->Next(); return true; } else { return false; } } bool Parser::Consume(const char* text, const char* error) { if (TryConsume(text)) { return true; } else { AddError(error); return false; } } bool Parser::Consume(const char* text) { if (TryConsume(text)) { return true; } else { AddError("Expected \"" + string(text) + "\"."); return false; } } bool Parser::ConsumeIdentifier(string* output, const char* error) { if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { *output = input_->current().text; input_->Next(); return true; } else { AddError(error); return false; } } bool Parser::ConsumeInteger(int* output, const char* error) { if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { uint64 value = 0; if (!io::Tokenizer::ParseInteger(input_->current().text, kint32max, &value)) { AddError("Integer out of range."); // We still return true because we did, in fact, parse an integer. } *output = value; input_->Next(); return true; } else { AddError(error); return false; } } bool Parser::ConsumeSignedInteger(int* output, const char* error) { bool is_negative = false; uint64 max_value = kint32max; if (TryConsume("-")) { is_negative = true; max_value += 1; } uint64 value = 0; DO(ConsumeInteger64(max_value, &value, error)); if (is_negative) value *= -1; *output = value; return true; } bool Parser::ConsumeInteger64(uint64 max_value, uint64* output, const char* error) { if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { if (!io::Tokenizer::ParseInteger(input_->current().text, max_value, output)) { AddError("Integer out of range."); // We still return true because we did, in fact, parse an integer. *output = 0; } input_->Next(); return true; } else { AddError(error); return false; } } bool Parser::ConsumeNumber(double* output, const char* error) { if (LookingAtType(io::Tokenizer::TYPE_FLOAT)) { *output = io::Tokenizer::ParseFloat(input_->current().text); input_->Next(); return true; } else if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { // Also accept integers. uint64 value = 0; if (!io::Tokenizer::ParseInteger(input_->current().text, kuint64max, &value)) { 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")) { *output = std::numeric_limits::infinity(); input_->Next(); return true; } else if (LookingAt("nan")) { *output = std::numeric_limits::quiet_NaN(); input_->Next(); return true; } else { AddError(error); return false; } } bool Parser::ConsumeString(string* output, const char* error) { if (LookingAtType(io::Tokenizer::TYPE_STRING)) { io::Tokenizer::ParseString(input_->current().text, output); input_->Next(); // Allow C++ like concatenation of adjacent string tokens. while (LookingAtType(io::Tokenizer::TYPE_STRING)) { io::Tokenizer::ParseStringAppend(input_->current().text, output); input_->Next(); } return true; } else { AddError(error); return false; } } bool Parser::TryConsumeEndOfDeclaration( const char* text, const LocationRecorder* location) { if (LookingAt(text)) { string leading, trailing; std::vector detached; input_->NextWithComments(&trailing, &detached, &leading); // Save the leading comments for next time, and recall the leading comments // from last time. leading.swap(upcoming_doc_comments_); if (location != NULL) { upcoming_detached_comments_.swap(detached); location->AttachComments(&leading, &trailing, &detached); } else if (strcmp(text, "}") == 0) { // If the current location is null and we are finishing the current scope, // drop pending upcoming detached comments. upcoming_detached_comments_.swap(detached); } else { // Otherwise, append the new detached comments to the existing upcoming // detached comments. upcoming_detached_comments_.insert(upcoming_detached_comments_.end(), detached.begin(), detached.end()); } return true; } else { return false; } } bool Parser::ConsumeEndOfDeclaration( const char* text, const LocationRecorder* location) { if (TryConsumeEndOfDeclaration(text, location)) { return true; } else { AddError("Expected \"" + string(text) + "\"."); return false; } } // ------------------------------------------------------------------- void Parser::AddError(int line, int column, const string& error) { if (error_collector_ != NULL) { error_collector_->AddError(line, column, error); } had_errors_ = true; } void Parser::AddError(const string& error) { AddError(input_->current().line, input_->current().column, error); } // ------------------------------------------------------------------- Parser::LocationRecorder::LocationRecorder(Parser* parser) : parser_(parser), location_(parser_->source_code_info_->add_location()) { location_->add_span(parser_->input_->current().line); location_->add_span(parser_->input_->current().column); } Parser::LocationRecorder::LocationRecorder(const LocationRecorder& parent) { Init(parent); } Parser::LocationRecorder::LocationRecorder(const LocationRecorder& parent, int path1) { Init(parent); AddPath(path1); } Parser::LocationRecorder::LocationRecorder(const LocationRecorder& parent, int path1, int path2) { Init(parent); AddPath(path1); AddPath(path2); } void Parser::LocationRecorder::Init(const LocationRecorder& parent) { parser_ = parent.parser_; location_ = parser_->source_code_info_->add_location(); location_->mutable_path()->CopyFrom(parent.location_->path()); location_->add_span(parser_->input_->current().line); location_->add_span(parser_->input_->current().column); } Parser::LocationRecorder::~LocationRecorder() { if (location_->span_size() <= 2) { EndAt(parser_->input_->previous()); } } void Parser::LocationRecorder::AddPath(int path_component) { location_->add_path(path_component); } void Parser::LocationRecorder::StartAt(const io::Tokenizer::Token& token) { location_->set_span(0, token.line); location_->set_span(1, token.column); } void Parser::LocationRecorder::StartAt(const LocationRecorder& other) { location_->set_span(0, other.location_->span(0)); location_->set_span(1, other.location_->span(1)); } void Parser::LocationRecorder::EndAt(const io::Tokenizer::Token& token) { if (token.line != location_->span(0)) { location_->add_span(token.line); } location_->add_span(token.end_column); } void Parser::LocationRecorder::RecordLegacyLocation(const Message* descriptor, DescriptorPool::ErrorCollector::ErrorLocation location) { if (parser_->source_location_table_ != NULL) { parser_->source_location_table_->Add( descriptor, location, location_->span(0), location_->span(1)); } } void Parser::LocationRecorder::AttachComments( string* leading, string* trailing, std::vector* detached_comments) const { GOOGLE_CHECK(!location_->has_leading_comments()); GOOGLE_CHECK(!location_->has_trailing_comments()); if (!leading->empty()) { location_->mutable_leading_comments()->swap(*leading); } if (!trailing->empty()) { location_->mutable_trailing_comments()->swap(*trailing); } for (int i = 0; i < detached_comments->size(); ++i) { location_->add_leading_detached_comments()->swap( (*detached_comments)[i]); } detached_comments->clear(); } // ------------------------------------------------------------------- void Parser::SkipStatement() { while (true) { if (AtEnd()) { return; } else if (LookingAtType(io::Tokenizer::TYPE_SYMBOL)) { if (TryConsumeEndOfDeclaration(";", NULL)) { return; } else if (TryConsume("{")) { SkipRestOfBlock(); return; } else if (LookingAt("}")) { return; } } input_->Next(); } } void Parser::SkipRestOfBlock() { while (true) { if (AtEnd()) { return; } else if (LookingAtType(io::Tokenizer::TYPE_SYMBOL)) { if (TryConsumeEndOfDeclaration("}", NULL)) { return; } else if (TryConsume("{")) { SkipRestOfBlock(); } } input_->Next(); } } // =================================================================== bool Parser::ValidateEnum(const EnumDescriptorProto* proto) { bool has_allow_alias = false; bool allow_alias = false; for (int i = 0; i < proto->options().uninterpreted_option_size(); i++) { const UninterpretedOption option = proto->options().uninterpreted_option(i); if (option.name_size() > 1) { continue; } if (!option.name(0).is_extension() && option.name(0).name_part() == "allow_alias") { has_allow_alias = true; if (option.identifier_value() == "true") { allow_alias = true; } break; } } if (has_allow_alias && !allow_alias) { string error = "\"" + proto->name() + "\" declares 'option allow_alias = false;' which has no effect. " "Please remove the declaration."; // This needlessly clutters declarations with nops. AddError(error); return false; } std::set used_values; bool has_duplicates = false; for (int i = 0; i < proto->value_size(); ++i) { const EnumValueDescriptorProto enum_value = proto->value(i); if (used_values.find(enum_value.number()) != used_values.end()) { has_duplicates = true; break; } else { used_values.insert(enum_value.number()); } } if (allow_alias && !has_duplicates) { string error = "\"" + proto->name() + "\" declares support for enum aliases but no enum values share field " "numbers. Please remove the unnecessary 'option allow_alias = true;' " "declaration."; // Generate an error if an enum declares support for duplicate enum values // and does not use it protect future authors. AddError(error); return false; } return true; } bool Parser::Parse(io::Tokenizer* input, FileDescriptorProto* file) { input_ = input; had_errors_ = false; syntax_identifier_.clear(); // Note that |file| could be NULL at this point if // stop_after_syntax_identifier_ is true. So, we conservatively allocate // SourceCodeInfo on the stack, then swap it into the FileDescriptorProto // later on. SourceCodeInfo source_code_info; source_code_info_ = &source_code_info; if (LookingAtType(io::Tokenizer::TYPE_START)) { // Advance to first token. input_->NextWithComments(NULL, &upcoming_detached_comments_, &upcoming_doc_comments_); } { LocationRecorder root_location(this); 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 != NULL) 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\";' " << "or 'syntax = \"proto3\";' to specify a syntax " << "version. (Defaulted to proto2 syntax.)"; syntax_identifier_ = "proto2"; } if (stop_after_syntax_identifier_) return !had_errors_; // Repeatedly parse statements until we reach the end of the file. while (!AtEnd()) { if (!ParseTopLevelStatement(file, root_location)) { // This statement failed to parse. Skip it, but keep looping to parse // other statements. SkipStatement(); if (LookingAt("}")) { AddError("Unmatched \"}\"."); input_->NextWithComments(NULL, &upcoming_detached_comments_, &upcoming_doc_comments_); } } } } input_ = NULL; source_code_info_ = NULL; assert(file != NULL); source_code_info.Swap(file->mutable_source_code_info()); return !had_errors_; } 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("=")); io::Tokenizer::Token syntax_token = input_->current(); string syntax; DO(ConsumeString(&syntax, "Expected syntax identifier.")); DO(ConsumeEndOfDeclaration(";", &syntax_location)); syntax_identifier_ = syntax; if (syntax != "proto2" && syntax != "proto3" && !stop_after_syntax_identifier_) { AddError(syntax_token.line, syntax_token.column, "Unrecognized syntax identifier \"" + syntax + "\". This parser " "only recognizes \"proto2\" and \"proto3\"."); return false; } return true; } bool Parser::ParseTopLevelStatement(FileDescriptorProto* file, const LocationRecorder& root_location) { if (TryConsumeEndOfDeclaration(";", NULL)) { // empty statement; ignore return true; } else if (LookingAt("message")) { LocationRecorder location(root_location, FileDescriptorProto::kMessageTypeFieldNumber, file->message_type_size()); return ParseMessageDefinition(file->add_message_type(), location, file); } else if (LookingAt("enum")) { LocationRecorder location(root_location, FileDescriptorProto::kEnumTypeFieldNumber, file->enum_type_size()); return ParseEnumDefinition(file->add_enum_type(), location, file); } else if (LookingAt("service")) { LocationRecorder location(root_location, FileDescriptorProto::kServiceFieldNumber, file->service_size()); return ParseServiceDefinition(file->add_service(), location, file); } else if (LookingAt("extend")) { LocationRecorder location(root_location, FileDescriptorProto::kExtensionFieldNumber); return ParseExtend(file->mutable_extension(), file->mutable_message_type(), root_location, FileDescriptorProto::kMessageTypeFieldNumber, location, file); } else if (LookingAt("import")) { return ParseImport(file->mutable_dependency(), file->mutable_public_dependency(), file->mutable_weak_dependency(), root_location, file); } else if (LookingAt("package")) { return ParsePackage(file, root_location, file); } else if (LookingAt("option")) { LocationRecorder location(root_location, FileDescriptorProto::kOptionsFieldNumber); return ParseOption(file->mutable_options(), location, file, OPTION_STATEMENT); } else { AddError("Expected top-level statement (e.g. \"message\")."); return false; } } // ------------------------------------------------------------------- // Messages bool Parser::ParseMessageDefinition( DescriptorProto* message, const LocationRecorder& message_location, const FileDescriptorProto* containing_file) { DO(Consume("message")); { LocationRecorder location(message_location, DescriptorProto::kNameFieldNumber); location.RecordLegacyLocation( message, DescriptorPool::ErrorCollector::NAME); DO(ConsumeIdentifier(message->mutable_name(), "Expected message name.")); } DO(ParseMessageBlock(message, message_location, containing_file)); return true; } namespace { const int kMaxRangeSentinel = -1; bool IsMessageSetWireFormatMessage(const DescriptorProto& message) { const MessageOptions& options = message.options(); for (int i = 0; i < options.uninterpreted_option_size(); ++i) { const UninterpretedOption& uninterpreted = options.uninterpreted_option(i); if (uninterpreted.name_size() == 1 && uninterpreted.name(0).name_part() == "message_set_wire_format" && uninterpreted.identifier_value() == "true") { return true; } } return false; } // Modifies any extension ranges that specified 'max' as the end of the // extension range, and sets them to the type-specific maximum. The actual max // tag number can only be determined after all options have been parsed. void AdjustExtensionRangesWithMaxEndNumber(DescriptorProto* message) { const bool is_message_set = IsMessageSetWireFormatMessage(*message); const int max_extension_number = is_message_set ? kint32max : FieldDescriptor::kMaxNumber + 1; for (int i = 0; i < message->extension_range_size(); ++i) { if (message->extension_range(i).end() == kMaxRangeSentinel) { message->mutable_extension_range(i)->set_end(max_extension_number); } } } // Modifies any reserved ranges that specified 'max' as the end of the // reserved range, and sets them to the type-specific maximum. The actual max // tag number can only be determined after all options have been parsed. void AdjustReservedRangesWithMaxEndNumber(DescriptorProto* message) { const bool is_message_set = IsMessageSetWireFormatMessage(*message); const int max_field_number = is_message_set ? kint32max : FieldDescriptor::kMaxNumber + 1; for (int i = 0; i < message->reserved_range_size(); ++i) { if (message->reserved_range(i).end() == kMaxRangeSentinel) { message->mutable_reserved_range(i)->set_end(max_field_number); } } } } // namespace bool Parser::ParseMessageBlock(DescriptorProto* message, const LocationRecorder& message_location, const FileDescriptorProto* containing_file) { DO(ConsumeEndOfDeclaration("{", &message_location)); while (!TryConsumeEndOfDeclaration("}", NULL)) { if (AtEnd()) { AddError("Reached end of input in message definition (missing '}')."); return false; } if (!ParseMessageStatement(message, message_location, containing_file)) { // This statement failed to parse. Skip it, but keep looping to parse // other statements. SkipStatement(); } } if (message->extension_range_size() > 0) { AdjustExtensionRangesWithMaxEndNumber(message); } if (message->reserved_range_size() > 0) { AdjustReservedRangesWithMaxEndNumber(message); } return true; } bool Parser::ParseMessageStatement(DescriptorProto* message, const LocationRecorder& message_location, const FileDescriptorProto* containing_file) { if (TryConsumeEndOfDeclaration(";", NULL)) { // empty statement; ignore return true; } else if (LookingAt("message")) { LocationRecorder location(message_location, DescriptorProto::kNestedTypeFieldNumber, message->nested_type_size()); return ParseMessageDefinition(message->add_nested_type(), location, containing_file); } else if (LookingAt("enum")) { LocationRecorder location(message_location, DescriptorProto::kEnumTypeFieldNumber, message->enum_type_size()); return ParseEnumDefinition(message->add_enum_type(), location, containing_file); } else if (LookingAt("extensions")) { LocationRecorder location(message_location, DescriptorProto::kExtensionRangeFieldNumber); return ParseExtensions(message, location, containing_file); } else if (LookingAt("reserved")) { return ParseReserved(message, message_location); } else if (LookingAt("extend")) { LocationRecorder location(message_location, DescriptorProto::kExtensionFieldNumber); return ParseExtend(message->mutable_extension(), message->mutable_nested_type(), message_location, DescriptorProto::kNestedTypeFieldNumber, location, containing_file); } else if (LookingAt("option")) { LocationRecorder location(message_location, DescriptorProto::kOptionsFieldNumber); return ParseOption(message->mutable_options(), location, containing_file, OPTION_STATEMENT); } else if (LookingAt("oneof")) { int oneof_index = message->oneof_decl_size(); LocationRecorder oneof_location(message_location, DescriptorProto::kOneofDeclFieldNumber, oneof_index); return ParseOneof(message->add_oneof_decl(), message, oneof_index, oneof_location, message_location, containing_file); } else { LocationRecorder location(message_location, DescriptorProto::kFieldFieldNumber, message->field_size()); return ParseMessageField(message->add_field(), message->mutable_nested_type(), message_location, DescriptorProto::kNestedTypeFieldNumber, location, containing_file); } } bool Parser::ParseMessageField(FieldDescriptorProto* field, RepeatedPtrField* messages, const LocationRecorder& parent_location, int location_field_number_for_nested_type, const LocationRecorder& field_location, const FileDescriptorProto* containing_file) { { LocationRecorder location(field_location, FieldDescriptorProto::kLabelFieldNumber); FieldDescriptorProto::Label label; if (ParseLabel(&label, containing_file)) { field->set_label(label); if (label == FieldDescriptorProto::LABEL_OPTIONAL && syntax_identifier_ == "proto3") { AddError( "Explicit 'optional' labels are disallowed in the Proto3 syntax. " "To define 'optional' fields in Proto3, simply remove the " "'optional' label, as fields are 'optional' by default."); } } } return ParseMessageFieldNoLabel(field, messages, parent_location, location_field_number_for_nested_type, field_location, containing_file); } bool Parser::ParseMessageFieldNoLabel( FieldDescriptorProto* field, RepeatedPtrField* messages, const LocationRecorder& parent_location, int location_field_number_for_nested_type, const LocationRecorder& field_location, const FileDescriptorProto* containing_file) { MapField map_field; // Parse type. { LocationRecorder location(field_location); // add path later location.RecordLegacyLocation(field, DescriptorPool::ErrorCollector::TYPE); bool type_parsed = false; FieldDescriptorProto::Type type = FieldDescriptorProto::TYPE_INT32; string type_name; // Special case map field. We only treat the field as a map field if the // field type name starts with the word "map" with a following "<". if (TryConsume("map")) { if (LookingAt("<")) { map_field.is_map_field = true; } else { // False positive type_parsed = true; type_name = "map"; } } if (map_field.is_map_field) { if (field->has_oneof_index()) { AddError("Map fields are not allowed in oneofs."); return false; } if (field->has_label()) { AddError( "Field labels (required/optional/repeated) are not allowed on " "map fields."); return false; } if (field->has_extendee()) { AddError("Map fields are not allowed to be extensions."); return false; } field->set_label(FieldDescriptorProto::LABEL_REPEATED); DO(Consume("<")); DO(ParseType(&map_field.key_type, &map_field.key_type_name)); DO(Consume(",")); DO(ParseType(&map_field.value_type, &map_field.value_type_name)); DO(Consume(">")); // Defer setting of the type name of the map field until the // field name is parsed. Add the source location though. location.AddPath(FieldDescriptorProto::kTypeNameFieldNumber); } else { // Handle the case where no explicit label is given for a non-map field. if (!field->has_label() && DefaultToOptionalFields()) { field->set_label(FieldDescriptorProto::LABEL_OPTIONAL); } if (!field->has_label()) { AddError("Expected \"required\", \"optional\", or \"repeated\"."); // We can actually reasonably recover here by just assuming the user // forgot the label altogether. field->set_label(FieldDescriptorProto::LABEL_OPTIONAL); } // Handle the case where the actual type is a message or enum named "map", // which we already consumed in the code above. if (!type_parsed) { DO(ParseType(&type, &type_name)); } if (type_name.empty()) { location.AddPath(FieldDescriptorProto::kTypeFieldNumber); field->set_type(type); } else { location.AddPath(FieldDescriptorProto::kTypeNameFieldNumber); field->set_type_name(type_name); } } } // Parse name and '='. io::Tokenizer::Token name_token = input_->current(); { LocationRecorder location(field_location, FieldDescriptorProto::kNameFieldNumber); location.RecordLegacyLocation(field, DescriptorPool::ErrorCollector::NAME); DO(ConsumeIdentifier(field->mutable_name(), "Expected field name.")); } DO(Consume("=", "Missing field number.")); // Parse field number. { LocationRecorder location(field_location, FieldDescriptorProto::kNumberFieldNumber); location.RecordLegacyLocation( field, DescriptorPool::ErrorCollector::NUMBER); int number; DO(ConsumeInteger(&number, "Expected field number.")); field->set_number(number); } // Parse options. DO(ParseFieldOptions(field, field_location, containing_file)); // Deal with groups. if (field->has_type() && field->type() == FieldDescriptorProto::TYPE_GROUP) { // Awkward: Since a group declares both a message type and a field, we // have to create overlapping locations. LocationRecorder group_location(parent_location); group_location.StartAt(field_location); group_location.AddPath(location_field_number_for_nested_type); group_location.AddPath(messages->size()); DescriptorProto* group = messages->Add(); group->set_name(field->name()); // Record name location to match the field name's location. { LocationRecorder location(group_location, DescriptorProto::kNameFieldNumber); location.StartAt(name_token); location.EndAt(name_token); location.RecordLegacyLocation( group, DescriptorPool::ErrorCollector::NAME); } // The field's type_name also comes from the name. Confusing! { LocationRecorder location(field_location, FieldDescriptorProto::kTypeNameFieldNumber); location.StartAt(name_token); location.EndAt(name_token); } // As a hack for backwards-compatibility, we force the group name to start // with a capital letter and lower-case the field name. New code should // not use groups; it should use nested messages. if (group->name()[0] < 'A' || 'Z' < group->name()[0]) { AddError(name_token.line, name_token.column, "Group names must start with a capital letter."); } LowerString(field->mutable_name()); field->set_type_name(group->name()); if (LookingAt("{")) { DO(ParseMessageBlock(group, group_location, containing_file)); } else { AddError("Missing group body."); return false; } } else { DO(ConsumeEndOfDeclaration(";", &field_location)); } // Create a map entry type if this is a map field. if (map_field.is_map_field) { GenerateMapEntry(map_field, field, messages); } return true; } void Parser::GenerateMapEntry(const MapField& map_field, FieldDescriptorProto* field, RepeatedPtrField* messages) { DescriptorProto* entry = messages->Add(); string entry_name = MapEntryName(field->name()); field->set_type_name(entry_name); entry->set_name(entry_name); entry->mutable_options()->set_map_entry(true); FieldDescriptorProto* key_field = entry->add_field(); key_field->set_name("key"); key_field->set_label(FieldDescriptorProto::LABEL_OPTIONAL); key_field->set_number(1); if (map_field.key_type_name.empty()) { key_field->set_type(map_field.key_type); } else { key_field->set_type_name(map_field.key_type_name); } FieldDescriptorProto* value_field = entry->add_field(); value_field->set_name("value"); value_field->set_label(FieldDescriptorProto::LABEL_OPTIONAL); value_field->set_number(2); if (map_field.value_type_name.empty()) { value_field->set_type(map_field.value_type); } else { value_field->set_type_name(map_field.value_type_name); } // Propagate the "enforce_utf8" option to key and value fields if they // are strings. This helps simplify the implementation of code generators // and also reflection-based parsing code. // // The following definition: // message Foo { // map value = 1 [enforce_utf8 = false]; // } // will be interpreted as: // message Foo { // message ValueEntry { // option map_entry = true; // string key = 1 [enforce_utf8 = false]; // string value = 2 [enforce_utf8 = false]; // } // repeated ValueEntry value = 1 [enforce_utf8 = false]; // } // // TODO(xiaofeng): Remove this when the "enforce_utf8" option is removed // from protocol compiler. for (int i = 0; i < field->options().uninterpreted_option_size(); ++i) { const UninterpretedOption& option = field->options().uninterpreted_option(i); if (option.name_size() == 1 && option.name(0).name_part() == "enforce_utf8" && !option.name(0).is_extension()) { if (key_field->type() == FieldDescriptorProto::TYPE_STRING) { key_field->mutable_options()->add_uninterpreted_option() ->CopyFrom(option); } if (value_field->type() == FieldDescriptorProto::TYPE_STRING) { value_field->mutable_options()->add_uninterpreted_option() ->CopyFrom(option); } } } } bool Parser::ParseFieldOptions(FieldDescriptorProto* field, const LocationRecorder& field_location, const FileDescriptorProto* containing_file) { if (!LookingAt("[")) return true; LocationRecorder location(field_location, FieldDescriptorProto::kOptionsFieldNumber); DO(Consume("[")); // Parse field options. do { if (LookingAt("default")) { // We intentionally pass field_location rather than location here, since // the default value is not actually an option. DO(ParseDefaultAssignment(field, field_location, containing_file)); } else if (LookingAt("json_name")) { // Like default value, this "json_name" is not an actual option. DO(ParseJsonName(field, field_location, containing_file)); } else { DO(ParseOption(field->mutable_options(), location, containing_file, OPTION_ASSIGNMENT)); } } while (TryConsume(",")); DO(Consume("]")); return true; } bool Parser::ParseDefaultAssignment( FieldDescriptorProto* field, const LocationRecorder& field_location, const FileDescriptorProto* containing_file) { if (field->has_default_value()) { AddError("Already set option \"default\"."); field->clear_default_value(); } DO(Consume("default")); DO(Consume("=")); LocationRecorder location(field_location, FieldDescriptorProto::kDefaultValueFieldNumber); location.RecordLegacyLocation( field, DescriptorPool::ErrorCollector::DEFAULT_VALUE); string* default_value = field->mutable_default_value(); if (!field->has_type()) { // The field has a type name, but we don't know if it is a message or an // enum yet. (If it were a primitive type, |field| would have a type set // already.) In this case, simply take the current string as the default // value; we will catch the error later if it is not a valid enum value. // (N.B. that we do not check whether the current token is an identifier: // doing so throws strange errors when the user mistypes a primitive // typename and we assume it's an enum. E.g.: "optional int foo = 1 [default // = 42]". In such a case the fundamental error is really that "int" is not // a type, not that "42" is not an identifier. See b/12533582.) *default_value = input_->current().text; input_->Next(); return true; } switch (field->type()) { case FieldDescriptorProto::TYPE_INT32: case FieldDescriptorProto::TYPE_INT64: case FieldDescriptorProto::TYPE_SINT32: case FieldDescriptorProto::TYPE_SINT64: case FieldDescriptorProto::TYPE_SFIXED32: case FieldDescriptorProto::TYPE_SFIXED64: { uint64 max_value = kint64max; if (field->type() == FieldDescriptorProto::TYPE_INT32 || field->type() == FieldDescriptorProto::TYPE_SINT32 || field->type() == FieldDescriptorProto::TYPE_SFIXED32) { max_value = kint32max; } // These types can be negative. if (TryConsume("-")) { default_value->append("-"); // Two's complement always has one more negative value than positive. ++max_value; } // Parse the integer to verify that it is not out-of-range. uint64 value; DO(ConsumeInteger64(max_value, &value, "Expected integer for field default value.")); // And stringify it again. default_value->append(SimpleItoa(value)); break; } case FieldDescriptorProto::TYPE_UINT32: case FieldDescriptorProto::TYPE_UINT64: case FieldDescriptorProto::TYPE_FIXED32: case FieldDescriptorProto::TYPE_FIXED64: { uint64 max_value = kuint64max; if (field->type() == FieldDescriptorProto::TYPE_UINT32 || field->type() == FieldDescriptorProto::TYPE_FIXED32) { max_value = kuint32max; } // Numeric, not negative. if (TryConsume("-")) { AddError("Unsigned field can't have negative default value."); } // Parse the integer to verify that it is not out-of-range. uint64 value; DO(ConsumeInteger64(max_value, &value, "Expected integer for field default value.")); // And stringify it again. default_value->append(SimpleItoa(value)); break; } case FieldDescriptorProto::TYPE_FLOAT: case FieldDescriptorProto::TYPE_DOUBLE: // These types can be negative. if (TryConsume("-")) { default_value->append("-"); } // Parse the integer because we have to convert hex integers to decimal // floats. double value; DO(ConsumeNumber(&value, "Expected number.")); // And stringify it again. default_value->append(SimpleDtoa(value)); break; case FieldDescriptorProto::TYPE_BOOL: if (TryConsume("true")) { default_value->assign("true"); } else if (TryConsume("false")) { default_value->assign("false"); } else { AddError("Expected \"true\" or \"false\"."); return false; } break; case FieldDescriptorProto::TYPE_STRING: // Note: When file opton java_string_check_utf8 is true, if a // non-string representation (eg byte[]) is later supported, it must // be checked for UTF-8-ness. DO(ConsumeString(default_value, "Expected string for field default " "value.")); break; case FieldDescriptorProto::TYPE_BYTES: DO(ConsumeString(default_value, "Expected string.")); *default_value = CEscape(*default_value); break; case FieldDescriptorProto::TYPE_ENUM: DO(ConsumeIdentifier(default_value, "Expected enum identifier for field " "default value.")); break; case FieldDescriptorProto::TYPE_MESSAGE: case FieldDescriptorProto::TYPE_GROUP: AddError("Messages can't have default values."); return false; } return true; } bool Parser::ParseJsonName( FieldDescriptorProto* field, const LocationRecorder& field_location, const FileDescriptorProto* containing_file) { if (field->has_json_name()) { AddError("Already set option \"json_name\"."); field->clear_json_name(); } DO(Consume("json_name")); DO(Consume("=")); LocationRecorder location(field_location, FieldDescriptorProto::kJsonNameFieldNumber); location.RecordLegacyLocation( field, DescriptorPool::ErrorCollector::OPTION_VALUE); DO(ConsumeString(field->mutable_json_name(), "Expected string for JSON name.")); return true; } bool Parser::ParseOptionNamePart(UninterpretedOption* uninterpreted_option, const LocationRecorder& part_location, const FileDescriptorProto* containing_file) { UninterpretedOption::NamePart* name = uninterpreted_option->add_name(); string identifier; // We parse identifiers into this string. if (LookingAt("(")) { // This is an extension. DO(Consume("(")); { LocationRecorder location( part_location, UninterpretedOption::NamePart::kNamePartFieldNumber); // An extension name consists of dot-separated identifiers, and may begin // with a dot. if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { DO(ConsumeIdentifier(&identifier, "Expected identifier.")); name->mutable_name_part()->append(identifier); } while (LookingAt(".")) { DO(Consume(".")); name->mutable_name_part()->append("."); DO(ConsumeIdentifier(&identifier, "Expected identifier.")); name->mutable_name_part()->append(identifier); } } DO(Consume(")")); name->set_is_extension(true); } else { // This is a regular field. LocationRecorder location( part_location, UninterpretedOption::NamePart::kNamePartFieldNumber); DO(ConsumeIdentifier(&identifier, "Expected identifier.")); name->mutable_name_part()->append(identifier); name->set_is_extension(false); } return true; } bool Parser::ParseUninterpretedBlock(string* value) { // Note that enclosing braces are not added to *value. // We do NOT use ConsumeEndOfStatement for this brace because it's delimiting // an expression, not a block of statements. DO(Consume("{")); int brace_depth = 1; while (!AtEnd()) { if (LookingAt("{")) { brace_depth++; } else if (LookingAt("}")) { brace_depth--; if (brace_depth == 0) { input_->Next(); return true; } } // TODO(sanjay): Interpret line/column numbers to preserve formatting if (!value->empty()) value->push_back(' '); value->append(input_->current().text); input_->Next(); } AddError("Unexpected end of stream while parsing aggregate value."); return false; } // We don't interpret the option here. Instead we store it in an // UninterpretedOption, to be interpreted later. bool Parser::ParseOption(Message* options, const LocationRecorder& options_location, const FileDescriptorProto* containing_file, OptionStyle style) { // Create an entry in the uninterpreted_option field. const FieldDescriptor* uninterpreted_option_field = options->GetDescriptor()-> FindFieldByName("uninterpreted_option"); GOOGLE_CHECK(uninterpreted_option_field != NULL) << "No field named \"uninterpreted_option\" in the Options proto."; const Reflection* reflection = options->GetReflection(); LocationRecorder location( options_location, uninterpreted_option_field->number(), reflection->FieldSize(*options, uninterpreted_option_field)); if (style == OPTION_STATEMENT) { DO(Consume("option")); } UninterpretedOption* uninterpreted_option = down_cast( options->GetReflection()->AddMessage(options, uninterpreted_option_field)); // Parse dot-separated name. { LocationRecorder name_location(location, UninterpretedOption::kNameFieldNumber); name_location.RecordLegacyLocation( uninterpreted_option, DescriptorPool::ErrorCollector::OPTION_NAME); { LocationRecorder part_location(name_location, uninterpreted_option->name_size()); DO(ParseOptionNamePart(uninterpreted_option, part_location, containing_file)); } while (LookingAt(".")) { DO(Consume(".")); LocationRecorder part_location(name_location, uninterpreted_option->name_size()); DO(ParseOptionNamePart(uninterpreted_option, part_location, containing_file)); } } DO(Consume("=")); { LocationRecorder value_location(location); value_location.RecordLegacyLocation( uninterpreted_option, DescriptorPool::ErrorCollector::OPTION_VALUE); // All values are a single token, except for negative numbers, which consist // of a single '-' symbol, followed by a positive number. bool is_negative = TryConsume("-"); switch (input_->current().type) { case io::Tokenizer::TYPE_START: GOOGLE_LOG(FATAL) << "Trying to read value before any tokens have been read."; return false; case io::Tokenizer::TYPE_END: AddError("Unexpected end of stream while parsing option value."); return false; case io::Tokenizer::TYPE_IDENTIFIER: { value_location.AddPath( UninterpretedOption::kIdentifierValueFieldNumber); if (is_negative) { AddError("Invalid '-' symbol before identifier."); return false; } string value; DO(ConsumeIdentifier(&value, "Expected identifier.")); uninterpreted_option->set_identifier_value(value); break; } case io::Tokenizer::TYPE_INTEGER: { uint64 value; uint64 max_value = is_negative ? static_cast(kint64max) + 1 : kuint64max; DO(ConsumeInteger64(max_value, &value, "Expected integer.")); if (is_negative) { value_location.AddPath( UninterpretedOption::kNegativeIntValueFieldNumber); uninterpreted_option->set_negative_int_value( static_cast(-value)); } else { value_location.AddPath( UninterpretedOption::kPositiveIntValueFieldNumber); uninterpreted_option->set_positive_int_value(value); } break; } case io::Tokenizer::TYPE_FLOAT: { value_location.AddPath(UninterpretedOption::kDoubleValueFieldNumber); double value; DO(ConsumeNumber(&value, "Expected number.")); uninterpreted_option->set_double_value(is_negative ? -value : value); break; } case io::Tokenizer::TYPE_STRING: { value_location.AddPath(UninterpretedOption::kStringValueFieldNumber); if (is_negative) { AddError("Invalid '-' symbol before string."); return false; } string value; DO(ConsumeString(&value, "Expected string.")); uninterpreted_option->set_string_value(value); break; } case io::Tokenizer::TYPE_SYMBOL: if (LookingAt("{")) { value_location.AddPath( UninterpretedOption::kAggregateValueFieldNumber); DO(ParseUninterpretedBlock( uninterpreted_option->mutable_aggregate_value())); } else { AddError("Expected option value."); return false; } break; } } if (style == OPTION_STATEMENT) { DO(ConsumeEndOfDeclaration(";", &location)); } return true; } bool Parser::ParseExtensions(DescriptorProto* message, const LocationRecorder& extensions_location, const FileDescriptorProto* containing_file) { // Parse the declaration. DO(Consume("extensions")); int old_range_size = message->extension_range_size(); do { // Note that kExtensionRangeFieldNumber was already pushed by the parent. LocationRecorder location(extensions_location, message->extension_range_size()); DescriptorProto::ExtensionRange* range = message->add_extension_range(); location.RecordLegacyLocation( range, DescriptorPool::ErrorCollector::NUMBER); int start, end; io::Tokenizer::Token start_token; { LocationRecorder start_location( location, DescriptorProto::ExtensionRange::kStartFieldNumber); start_token = input_->current(); DO(ConsumeInteger(&start, "Expected field number range.")); } if (TryConsume("to")) { LocationRecorder end_location( location, DescriptorProto::ExtensionRange::kEndFieldNumber); if (TryConsume("max")) { // Set to the sentinel value - 1 since we increment the value below. // The actual value of the end of the range should be set with // AdjustExtensionRangesWithMaxEndNumber. end = kMaxRangeSentinel - 1; } else { DO(ConsumeInteger(&end, "Expected integer.")); } } else { LocationRecorder end_location( location, DescriptorProto::ExtensionRange::kEndFieldNumber); end_location.StartAt(start_token); end_location.EndAt(start_token); end = start; } // Users like to specify inclusive ranges, but in code we like the end // number to be exclusive. ++end; range->set_start(start); range->set_end(end); } while (TryConsume(",")); if (LookingAt("[")) { LocationRecorder location( extensions_location, DescriptorProto::ExtensionRange::kOptionsFieldNumber); DO(Consume("[")); // Parse extension range options in the first range. ExtensionRangeOptions* options = message->mutable_extension_range(old_range_size)->mutable_options(); do { DO(ParseOption(options, location, containing_file, OPTION_ASSIGNMENT)); } while (TryConsume(",")); DO(Consume("]")); // Then copy the extension range options to all of the other ranges we've // parsed. for (int i = old_range_size + 1; i < message->extension_range_size(); i++) { message->mutable_extension_range(i)->mutable_options() ->CopyFrom(*options); } } DO(ConsumeEndOfDeclaration(";", &extensions_location)); return true; } // This is similar to extension range parsing, except that it accepts field // name literals. bool Parser::ParseReserved(DescriptorProto* message, const LocationRecorder& message_location) { // Parse the declaration. DO(Consume("reserved")); if (LookingAtType(io::Tokenizer::TYPE_STRING)) { LocationRecorder location(message_location, DescriptorProto::kReservedNameFieldNumber); return ParseReservedNames(message, location); } else { LocationRecorder location(message_location, DescriptorProto::kReservedRangeFieldNumber); return ParseReservedNumbers(message, location); } } 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.")); } while (TryConsume(",")); DO(ConsumeEndOfDeclaration(";", &parent_location)); return true; } bool Parser::ParseReservedNumbers(DescriptorProto* message, const LocationRecorder& parent_location) { bool first = true; do { LocationRecorder location(parent_location, message->reserved_range_size()); DescriptorProto::ReservedRange* range = message->add_reserved_range(); int start, end; io::Tokenizer::Token start_token; { LocationRecorder start_location( location, DescriptorProto::ReservedRange::kStartFieldNumber); start_token = input_->current(); DO(ConsumeInteger(&start, (first ? "Expected field name or number range." : "Expected field number range."))); } if (TryConsume("to")) { LocationRecorder end_location( location, DescriptorProto::ReservedRange::kEndFieldNumber); if (TryConsume("max")) { // Set to the sentinel value - 1 since we increment the value below. // The actual value of the end of the range should be set with // AdjustExtensionRangesWithMaxEndNumber. end = kMaxRangeSentinel - 1; } else { DO(ConsumeInteger(&end, "Expected integer.")); } } else { LocationRecorder end_location( location, DescriptorProto::ReservedRange::kEndFieldNumber); end_location.StartAt(start_token); end_location.EndAt(start_token); end = start; } // Users like to specify inclusive ranges, but in code we like the end // number to be exclusive. ++end; range->set_start(start); range->set_end(end); first = false; } while (TryConsume(",")); DO(ConsumeEndOfDeclaration(";", &parent_location)); return true; } bool Parser::ParseReserved(EnumDescriptorProto* message, const LocationRecorder& message_location) { // Parse the declaration. DO(Consume("reserved")); if (LookingAtType(io::Tokenizer::TYPE_STRING)) { LocationRecorder location(message_location, DescriptorProto::kReservedNameFieldNumber); return ParseReservedNames(message, location); } else { LocationRecorder location(message_location, DescriptorProto::kReservedRangeFieldNumber); return ParseReservedNumbers(message, location); } } bool Parser::ParseReservedNames(EnumDescriptorProto* message, const LocationRecorder& parent_location) { do { LocationRecorder location(parent_location, message->reserved_name_size()); DO(ConsumeString(message->add_reserved_name(), "Expected enum value.")); } while (TryConsume(",")); DO(ConsumeEndOfDeclaration(";", &parent_location)); return true; } bool Parser::ParseReservedNumbers(EnumDescriptorProto* message, const LocationRecorder& parent_location) { bool first = true; do { LocationRecorder location(parent_location, message->reserved_range_size()); EnumDescriptorProto::EnumReservedRange* range = message->add_reserved_range(); int start, end; io::Tokenizer::Token start_token; { LocationRecorder start_location( location, EnumDescriptorProto::EnumReservedRange::kStartFieldNumber); start_token = input_->current(); DO(ConsumeSignedInteger(&start, (first ? "Expected enum value or number range." : "Expected enum number range."))); } if (TryConsume("to")) { LocationRecorder end_location( location, EnumDescriptorProto::EnumReservedRange::kEndFieldNumber); if (TryConsume("max")) { // This is in the enum descriptor path, which doesn't have the message // set duality to fix up, so it doesn't integrate with the sentinel. // Evaluate 'max' to INT_MAX - 1 so that incrementing to create the // exclusive range end doesn't cause an overflow. // Note, this prevents reserving the actual INT_MAX enum value. end = INT_MAX; } else { DO(ConsumeSignedInteger(&end, "Expected integer.")); } } else { LocationRecorder end_location( location, EnumDescriptorProto::EnumReservedRange::kEndFieldNumber); end_location.StartAt(start_token); end_location.EndAt(start_token); end = start; } range->set_start(start); range->set_end(end); first = false; } while (TryConsume(",")); DO(ConsumeEndOfDeclaration(";", &parent_location)); return true; } bool Parser::ParseExtend(RepeatedPtrField* extensions, RepeatedPtrField* messages, const LocationRecorder& parent_location, int location_field_number_for_nested_type, const LocationRecorder& extend_location, const FileDescriptorProto* containing_file) { DO(Consume("extend")); // Parse the extendee type. io::Tokenizer::Token extendee_start = input_->current(); string extendee; DO(ParseUserDefinedType(&extendee)); io::Tokenizer::Token extendee_end = input_->previous(); // Parse the block. DO(ConsumeEndOfDeclaration("{", &extend_location)); bool is_first = true; do { if (AtEnd()) { AddError("Reached end of input in extend definition (missing '}')."); return false; } // Note that kExtensionFieldNumber was already pushed by the parent. LocationRecorder location(extend_location, extensions->size()); FieldDescriptorProto* field = extensions->Add(); { LocationRecorder extendee_location( location, FieldDescriptorProto::kExtendeeFieldNumber); extendee_location.StartAt(extendee_start); extendee_location.EndAt(extendee_end); if (is_first) { extendee_location.RecordLegacyLocation( field, DescriptorPool::ErrorCollector::EXTENDEE); is_first = false; } } field->set_extendee(extendee); if (!ParseMessageField(field, messages, parent_location, location_field_number_for_nested_type, location, containing_file)) { // This statement failed to parse. Skip it, but keep looping to parse // other statements. SkipStatement(); } } while (!TryConsumeEndOfDeclaration("}", NULL)); return true; } bool Parser::ParseOneof(OneofDescriptorProto* oneof_decl, DescriptorProto* containing_type, int oneof_index, const LocationRecorder& oneof_location, const LocationRecorder& containing_type_location, const FileDescriptorProto* containing_file) { DO(Consume("oneof")); { LocationRecorder name_location(oneof_location, OneofDescriptorProto::kNameFieldNumber); DO(ConsumeIdentifier(oneof_decl->mutable_name(), "Expected oneof name.")); } DO(ConsumeEndOfDeclaration("{", &oneof_location)); do { if (AtEnd()) { AddError("Reached end of input in oneof definition (missing '}')."); return false; } if (LookingAt("option")) { LocationRecorder option_location( oneof_location, OneofDescriptorProto::kOptionsFieldNumber); if (!ParseOption(oneof_decl->mutable_options(), option_location, containing_file, OPTION_STATEMENT)) { return false; } continue; } // Print a nice error if the user accidentally tries to place a label // on an individual member of a oneof. if (LookingAt("required") || LookingAt("optional") || LookingAt("repeated")) { AddError("Fields in oneofs must not have labels (required / optional " "/ repeated)."); // We can continue parsing here because we understand what the user // meant. The error report will still make parsing fail overall. input_->Next(); } LocationRecorder field_location(containing_type_location, DescriptorProto::kFieldFieldNumber, containing_type->field_size()); FieldDescriptorProto* field = containing_type->add_field(); field->set_label(FieldDescriptorProto::LABEL_OPTIONAL); field->set_oneof_index(oneof_index); if (!ParseMessageFieldNoLabel(field, containing_type->mutable_nested_type(), containing_type_location, DescriptorProto::kNestedTypeFieldNumber, field_location, containing_file)) { // This statement failed to parse. Skip it, but keep looping to parse // other statements. SkipStatement(); } } while (!TryConsumeEndOfDeclaration("}", NULL)); return true; } // ------------------------------------------------------------------- // Enums bool Parser::ParseEnumDefinition(EnumDescriptorProto* enum_type, const LocationRecorder& enum_location, const FileDescriptorProto* containing_file) { DO(Consume("enum")); { LocationRecorder location(enum_location, EnumDescriptorProto::kNameFieldNumber); location.RecordLegacyLocation( enum_type, DescriptorPool::ErrorCollector::NAME); DO(ConsumeIdentifier(enum_type->mutable_name(), "Expected enum name.")); } DO(ParseEnumBlock(enum_type, enum_location, containing_file)); DO(ValidateEnum(enum_type)); return true; } bool Parser::ParseEnumBlock(EnumDescriptorProto* enum_type, const LocationRecorder& enum_location, const FileDescriptorProto* containing_file) { DO(ConsumeEndOfDeclaration("{", &enum_location)); while (!TryConsumeEndOfDeclaration("}", NULL)) { if (AtEnd()) { AddError("Reached end of input in enum definition (missing '}')."); return false; } if (!ParseEnumStatement(enum_type, enum_location, containing_file)) { // This statement failed to parse. Skip it, but keep looping to parse // other statements. SkipStatement(); } } return true; } bool Parser::ParseEnumStatement(EnumDescriptorProto* enum_type, const LocationRecorder& enum_location, const FileDescriptorProto* containing_file) { if (TryConsumeEndOfDeclaration(";", NULL)) { // empty statement; ignore return true; } else if (LookingAt("option")) { LocationRecorder location(enum_location, EnumDescriptorProto::kOptionsFieldNumber); return ParseOption(enum_type->mutable_options(), location, containing_file, OPTION_STATEMENT); } else if (LookingAt("reserved")) { return ParseReserved(enum_type, enum_location); } else { LocationRecorder location(enum_location, EnumDescriptorProto::kValueFieldNumber, enum_type->value_size()); return ParseEnumConstant(enum_type->add_value(), location, containing_file); } } bool Parser::ParseEnumConstant(EnumValueDescriptorProto* enum_value, const LocationRecorder& enum_value_location, const FileDescriptorProto* containing_file) { // Parse name. { LocationRecorder location(enum_value_location, EnumValueDescriptorProto::kNameFieldNumber); location.RecordLegacyLocation( enum_value, DescriptorPool::ErrorCollector::NAME); DO(ConsumeIdentifier(enum_value->mutable_name(), "Expected enum constant name.")); } DO(Consume("=", "Missing numeric value for enum constant.")); // Parse value. { LocationRecorder location( enum_value_location, EnumValueDescriptorProto::kNumberFieldNumber); location.RecordLegacyLocation( enum_value, DescriptorPool::ErrorCollector::NUMBER); int number; DO(ConsumeSignedInteger(&number, "Expected integer.")); enum_value->set_number(number); } DO(ParseEnumConstantOptions(enum_value, enum_value_location, containing_file)); DO(ConsumeEndOfDeclaration(";", &enum_value_location)); return true; } bool Parser::ParseEnumConstantOptions( EnumValueDescriptorProto* value, const LocationRecorder& enum_value_location, const FileDescriptorProto* containing_file) { if (!LookingAt("[")) return true; LocationRecorder location( enum_value_location, EnumValueDescriptorProto::kOptionsFieldNumber); DO(Consume("[")); do { DO(ParseOption(value->mutable_options(), location, containing_file, OPTION_ASSIGNMENT)); } while (TryConsume(",")); DO(Consume("]")); return true; } // ------------------------------------------------------------------- // Services bool Parser::ParseServiceDefinition( ServiceDescriptorProto* service, const LocationRecorder& service_location, const FileDescriptorProto* containing_file) { DO(Consume("service")); { LocationRecorder location(service_location, ServiceDescriptorProto::kNameFieldNumber); location.RecordLegacyLocation( service, DescriptorPool::ErrorCollector::NAME); DO(ConsumeIdentifier(service->mutable_name(), "Expected service name.")); } DO(ParseServiceBlock(service, service_location, containing_file)); return true; } bool Parser::ParseServiceBlock(ServiceDescriptorProto* service, const LocationRecorder& service_location, const FileDescriptorProto* containing_file) { DO(ConsumeEndOfDeclaration("{", &service_location)); while (!TryConsumeEndOfDeclaration("}", NULL)) { if (AtEnd()) { AddError("Reached end of input in service definition (missing '}')."); return false; } if (!ParseServiceStatement(service, service_location, containing_file)) { // This statement failed to parse. Skip it, but keep looping to parse // other statements. SkipStatement(); } } return true; } bool Parser::ParseServiceStatement(ServiceDescriptorProto* service, const LocationRecorder& service_location, const FileDescriptorProto* containing_file) { if (TryConsumeEndOfDeclaration(";", NULL)) { // empty statement; ignore return true; } else if (LookingAt("option")) { LocationRecorder location( service_location, ServiceDescriptorProto::kOptionsFieldNumber); return ParseOption(service->mutable_options(), location, containing_file, OPTION_STATEMENT); } else { LocationRecorder location(service_location, ServiceDescriptorProto::kMethodFieldNumber, service->method_size()); return ParseServiceMethod(service->add_method(), location, containing_file); } } bool Parser::ParseServiceMethod(MethodDescriptorProto* method, const LocationRecorder& method_location, const FileDescriptorProto* containing_file) { DO(Consume("rpc")); { LocationRecorder location(method_location, MethodDescriptorProto::kNameFieldNumber); location.RecordLegacyLocation( method, DescriptorPool::ErrorCollector::NAME); DO(ConsumeIdentifier(method->mutable_name(), "Expected method name.")); } // Parse input type. DO(Consume("(")); { if (LookingAt("stream")) { LocationRecorder location( method_location, MethodDescriptorProto::kClientStreamingFieldNumber); location.RecordLegacyLocation( method, DescriptorPool::ErrorCollector::OTHER); method->set_client_streaming(true); DO(Consume("stream")); } LocationRecorder location(method_location, MethodDescriptorProto::kInputTypeFieldNumber); location.RecordLegacyLocation( method, DescriptorPool::ErrorCollector::INPUT_TYPE); DO(ParseUserDefinedType(method->mutable_input_type())); } DO(Consume(")")); // Parse output type. DO(Consume("returns")); DO(Consume("(")); { if (LookingAt("stream")) { LocationRecorder location( method_location, MethodDescriptorProto::kServerStreamingFieldNumber); location.RecordLegacyLocation( method, DescriptorPool::ErrorCollector::OTHER); DO(Consume("stream")); method->set_server_streaming(true); } LocationRecorder location(method_location, MethodDescriptorProto::kOutputTypeFieldNumber); location.RecordLegacyLocation( method, DescriptorPool::ErrorCollector::OUTPUT_TYPE); DO(ParseUserDefinedType(method->mutable_output_type())); } DO(Consume(")")); if (LookingAt("{")) { // Options! DO(ParseMethodOptions(method_location, containing_file, MethodDescriptorProto::kOptionsFieldNumber, method->mutable_options())); } else { DO(ConsumeEndOfDeclaration(";", &method_location)); } return true; } bool Parser::ParseMethodOptions(const LocationRecorder& parent_location, const FileDescriptorProto* containing_file, const int optionsFieldNumber, Message* mutable_options) { // Options! ConsumeEndOfDeclaration("{", &parent_location); while (!TryConsumeEndOfDeclaration("}", NULL)) { if (AtEnd()) { AddError("Reached end of input in method options (missing '}')."); return false; } if (TryConsumeEndOfDeclaration(";", NULL)) { // empty statement; ignore } else { LocationRecorder location(parent_location, optionsFieldNumber); if (!ParseOption(mutable_options, location, containing_file, OPTION_STATEMENT)) { // This statement failed to parse. Skip it, but keep looping to // parse other statements. SkipStatement(); } } } return true; } // ------------------------------------------------------------------- bool Parser::ParseLabel(FieldDescriptorProto::Label* label, const FileDescriptorProto* containing_file) { if (TryConsume("optional")) { *label = FieldDescriptorProto::LABEL_OPTIONAL; return true; } else if (TryConsume("repeated")) { *label = FieldDescriptorProto::LABEL_REPEATED; return true; } else if (TryConsume("required")) { *label = FieldDescriptorProto::LABEL_REQUIRED; return true; } return false; } bool Parser::ParseType(FieldDescriptorProto::Type* type, string* type_name) { TypeNameMap::const_iterator iter = kTypeNames.find(input_->current().text); if (iter != kTypeNames.end()) { *type = iter->second; input_->Next(); } else { DO(ParseUserDefinedType(type_name)); } return true; } bool Parser::ParseUserDefinedType(string* type_name) { type_name->clear(); TypeNameMap::const_iterator iter = kTypeNames.find(input_->current().text); if (iter != kTypeNames.end()) { // Note: The only place enum types are allowed is for field types, but // if we are parsing a field type then we would not get here because // primitives are allowed there as well. So this error message doesn't // need to account for enums. AddError("Expected message type."); // Pretend to accept this type so that we can go on parsing. *type_name = input_->current().text; input_->Next(); return true; } // A leading "." means the name is fully-qualified. if (TryConsume(".")) type_name->append("."); // Consume the first part of the name. string identifier; DO(ConsumeIdentifier(&identifier, "Expected type name.")); type_name->append(identifier); // Consume more parts. while (TryConsume(".")) { type_name->append("."); DO(ConsumeIdentifier(&identifier, "Expected identifier.")); type_name->append(identifier); } return true; } // =================================================================== bool Parser::ParsePackage(FileDescriptorProto* file, const LocationRecorder& root_location, const FileDescriptorProto* containing_file) { if (file->has_package()) { AddError("Multiple package definitions."); // Don't append the new package to the old one. Just replace it. Not // that it really matters since this is an error anyway. file->clear_package(); } DO(Consume("package")); { LocationRecorder location(root_location, FileDescriptorProto::kPackageFieldNumber); location.RecordLegacyLocation(file, DescriptorPool::ErrorCollector::NAME); while (true) { string identifier; DO(ConsumeIdentifier(&identifier, "Expected identifier.")); file->mutable_package()->append(identifier); if (!TryConsume(".")) break; file->mutable_package()->append("."); } location.EndAt(input_->previous()); DO(ConsumeEndOfDeclaration(";", &location)); } return true; } bool Parser::ParseImport(RepeatedPtrField* dependency, RepeatedField* public_dependency, RepeatedField* weak_dependency, const LocationRecorder& root_location, const FileDescriptorProto* containing_file) { DO(Consume("import")); if (LookingAt("public")) { LocationRecorder location( root_location, FileDescriptorProto::kPublicDependencyFieldNumber, public_dependency->size()); DO(Consume("public")); *public_dependency->Add() = dependency->size(); } else if (LookingAt("weak")) { LocationRecorder location( root_location, FileDescriptorProto::kWeakDependencyFieldNumber, weak_dependency->size()); DO(Consume("weak")); *weak_dependency->Add() = dependency->size(); } { LocationRecorder location(root_location, FileDescriptorProto::kDependencyFieldNumber, dependency->size()); DO(ConsumeString(dependency->Add(), "Expected a string naming the file to import.")); location.EndAt(input_->previous()); DO(ConsumeEndOfDeclaration(";", &location)); } return true; } // =================================================================== SourceLocationTable::SourceLocationTable() {} SourceLocationTable::~SourceLocationTable() {} bool SourceLocationTable::Find( const Message* descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, int* line, int* column) const { const std::pair* result = FindOrNull(location_map_, std::make_pair(descriptor, location)); if (result == NULL) { *line = -1; *column = 0; return false; } else { *line = result->first; *column = result->second; return true; } } void SourceLocationTable::Add( const Message* descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, int line, int column) { location_map_[std::make_pair(descriptor, location)] = std::make_pair(line, column); } void SourceLocationTable::Clear() { location_map_.clear(); } } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/parser.h000066400000000000000000000637301334102242000305610ustar00rootroot00000000000000// 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. // // Implements parsing of .proto files to FileDescriptorProtos. #ifndef GOOGLE_PROTOBUF_COMPILER_PARSER_H__ #define GOOGLE_PROTOBUF_COMPILER_PARSER_H__ #include #include #include #include #include #include #include namespace google { namespace protobuf { class Message; } namespace protobuf { namespace compiler { // Defined in this file. class Parser; class SourceLocationTable; // Implements parsing of protocol definitions (such as .proto files). // // Note that most users will be more interested in the Importer class. // Parser is a lower-level class which simply converts a single .proto file // to a FileDescriptorProto. It does not resolve import directives or perform // many other kinds of validation needed to construct a complete // FileDescriptor. class LIBPROTOBUF_EXPORT Parser { public: Parser(); ~Parser(); // Parse the entire input and construct a FileDescriptorProto representing // it. Returns true if no errors occurred, false otherwise. bool Parse(io::Tokenizer* input, FileDescriptorProto* file); // Optional features: // DEPRECATED: New code should use the SourceCodeInfo embedded in the // FileDescriptorProto. // // Requests that locations of certain definitions be recorded to the given // SourceLocationTable while parsing. This can be used to look up exact line // and column numbers for errors reported by DescriptorPool during validation. // Set to NULL (the default) to discard source location information. void RecordSourceLocationsTo(SourceLocationTable* location_table) { source_location_table_ = location_table; } // Requests that errors be recorded to the given ErrorCollector while // parsing. Set to NULL (the default) to discard error messages. void RecordErrorsTo(io::ErrorCollector* error_collector) { error_collector_ = error_collector; } // Returns the identifier used in the "syntax = " declaration, if one was // seen during the last call to Parse(), or the empty string otherwise. const string& GetSyntaxIdentifier() { return syntax_identifier_; } // If set true, input files will be required to begin with a syntax // identifier. Otherwise, files may omit this. If a syntax identifier // is provided, it must be 'syntax = "proto2";' and must appear at the // top of this file regardless of whether or not it was required. void SetRequireSyntaxIdentifier(bool value) { require_syntax_identifier_ = value; } // Call SetStopAfterSyntaxIdentifier(true) to tell the parser to stop // parsing as soon as it has seen the syntax identifier, or lack thereof. // This is useful for quickly identifying the syntax of the file without // parsing the whole thing. If this is enabled, no error will be recorded // if the syntax identifier is something other than "proto2" (since // presumably the caller intends to deal with that), but other kinds of // errors (e.g. parse errors) will still be reported. When this is enabled, // you may pass a NULL FileDescriptorProto to Parse(). void SetStopAfterSyntaxIdentifier(bool value) { stop_after_syntax_identifier_ = value; } private: class LocationRecorder; // ================================================================= // Error recovery helpers // Consume the rest of the current statement. This consumes tokens // until it sees one of: // ';' Consumes the token and returns. // '{' Consumes the brace then calls SkipRestOfBlock(). // '}' Returns without consuming. // EOF Returns (can't consume). // The Parser often calls SkipStatement() after encountering a syntax // error. This allows it to go on parsing the following lines, allowing // it to report more than just one error in the file. void SkipStatement(); // Consume the rest of the current block, including nested blocks, // ending after the closing '}' is encountered and consumed, or at EOF. void SkipRestOfBlock(); // ----------------------------------------------------------------- // Single-token consuming helpers // // These make parsing code more readable. // True if the current token is TYPE_END. inline bool AtEnd(); // True if the next token matches the given text. inline bool LookingAt(const char* text); // True if the next token is of the given type. inline bool LookingAtType(io::Tokenizer::TokenType token_type); // If the next token exactly matches the text given, consume it and return // true. Otherwise, return false without logging an error. bool TryConsume(const char* text); // These attempt to read some kind of token from the input. If successful, // they return true. Otherwise they return false and add the given error // to the error list. // Consume a token with the exact text given. bool Consume(const char* text, const char* error); // Same as above, but automatically generates the error "Expected \"text\".", // where "text" is the expected token text. bool Consume(const char* text); // Consume a token of type IDENTIFIER and store its text in "output". bool ConsumeIdentifier(string* output, const char* error); // Consume an integer and store its value in "output". bool ConsumeInteger(int* output, const char* error); // Consume a signed integer and store its value in "output". bool ConsumeSignedInteger(int* output, const char* error); // Consume a 64-bit integer and store its value in "output". If the value // is greater than max_value, an error will be reported. bool ConsumeInteger64(uint64 max_value, uint64* output, const char* error); // 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); // Consume a string literal and store its (unescaped) value in "output". bool ConsumeString(string* output, const char* error); // Consume a token representing the end of the statement. Comments between // this token and the next will be harvested for documentation. The given // LocationRecorder should refer to the declaration that was just parsed; // it will be populated with these comments. // // TODO(kenton): The LocationRecorder is const because historically locations // have been passed around by const reference, for no particularly good // reason. We should probably go through and change them all to mutable // pointer to make this more intuitive. bool TryConsumeEndOfDeclaration( const char* text, const LocationRecorder* location); bool TryConsumeEndOfDeclarationFinishScope( const char* text, const LocationRecorder* location); bool ConsumeEndOfDeclaration( const char* text, const LocationRecorder* location); // ----------------------------------------------------------------- // Error logging helpers // Invokes error_collector_->AddError(), if error_collector_ is not NULL. void AddError(int line, int column, const string& error); // Invokes error_collector_->AddError() with the line and column number // of the current token. void AddError(const string& error); // Records a location in the SourceCodeInfo.location table (see // descriptor.proto). We use RAII to ensure that the start and end locations // are recorded -- the constructor records the start location and the // destructor records the end location. Since the parser is // recursive-descent, this works out beautifully. class LIBPROTOBUF_EXPORT LocationRecorder { public: // Construct the file's "root" location. LocationRecorder(Parser* parser); // Construct a location that represents a declaration nested within the // given parent. E.g. a field's location is nested within the location // for a message type. The parent's path will be copied, so you should // call AddPath() only to add the path components leading from the parent // to the child (as opposed to leading from the root to the child). LocationRecorder(const LocationRecorder& parent); // Convenience constructors that call AddPath() one or two times. LocationRecorder(const LocationRecorder& parent, int path1); LocationRecorder(const LocationRecorder& parent, int path1, int path2); ~LocationRecorder(); // Add a path component. See SourceCodeInfo.Location.path in // descriptor.proto. void AddPath(int path_component); // By default the location is considered to start at the current token at // the time the LocationRecorder is created. StartAt() sets the start // location to the given token instead. void StartAt(const io::Tokenizer::Token& token); // Start at the same location as some other LocationRecorder. void StartAt(const LocationRecorder& other); // By default the location is considered to end at the previous token at // the time the LocationRecorder is destroyed. EndAt() sets the end // location to the given token instead. void EndAt(const io::Tokenizer::Token& token); // Records the start point of this location to the SourceLocationTable that // was passed to RecordSourceLocationsTo(), if any. SourceLocationTable // is an older way of keeping track of source locations which is still // used in some places. void RecordLegacyLocation(const Message* descriptor, DescriptorPool::ErrorCollector::ErrorLocation location); // Attaches leading and trailing comments to the location. The two strings // will be swapped into place, so after this is called *leading and // *trailing will be empty. // // TODO(kenton): See comment on TryConsumeEndOfDeclaration(), above, for // why this is const. void AttachComments(string* leading, string* trailing, std::vector* detached_comments) const; private: // Indexes of parent and current location in the parent // SourceCodeInfo.location repeated field. For top-level elements, // parent_index_ is -1. Parser* parser_; SourceCodeInfo::Location* location_; void Init(const LocationRecorder& parent); }; // ================================================================= // Parsers for various language constructs // Parses the "syntax = \"proto2\";" line at the top of the file. Returns // false if it failed to parse or if the syntax identifier was not // recognized. bool ParseSyntaxIdentifier(const LocationRecorder& parent); // These methods parse various individual bits of code. They return // false if they completely fail to parse the construct. In this case, // it is probably necessary to skip the rest of the statement to recover. // However, if these methods return true, it does NOT mean that there // were no errors; only that there were no *syntax* errors. For instance, // if a service method is defined using proper syntax but uses a primitive // type as its input or output, ParseMethodField() still returns true // and only reports the error by calling AddError(). In practice, this // makes logic much simpler for the caller. // Parse a top-level message, enum, service, etc. bool ParseTopLevelStatement(FileDescriptorProto* file, const LocationRecorder& root_location); // Parse various language high-level language construrcts. bool ParseMessageDefinition(DescriptorProto* message, const LocationRecorder& message_location, const FileDescriptorProto* containing_file); bool ParseEnumDefinition(EnumDescriptorProto* enum_type, const LocationRecorder& enum_location, const FileDescriptorProto* containing_file); bool ParseServiceDefinition(ServiceDescriptorProto* service, const LocationRecorder& service_location, const FileDescriptorProto* containing_file); bool ParsePackage(FileDescriptorProto* file, const LocationRecorder& root_location, const FileDescriptorProto* containing_file); bool ParseImport(RepeatedPtrField* dependency, RepeatedField* public_dependency, RepeatedField* weak_dependency, const LocationRecorder& root_location, const FileDescriptorProto* containing_file); // These methods parse the contents of a message, enum, or service type and // add them to the given object. They consume the entire block including // the beginning and ending brace. bool ParseMessageBlock(DescriptorProto* message, const LocationRecorder& message_location, const FileDescriptorProto* containing_file); bool ParseEnumBlock(EnumDescriptorProto* enum_type, const LocationRecorder& enum_location, const FileDescriptorProto* containing_file); bool ParseServiceBlock(ServiceDescriptorProto* service, const LocationRecorder& service_location, const FileDescriptorProto* containing_file); // Parse one statement within a message, enum, or service block, including // final semicolon. bool ParseMessageStatement(DescriptorProto* message, const LocationRecorder& message_location, const FileDescriptorProto* containing_file); bool ParseEnumStatement(EnumDescriptorProto* message, const LocationRecorder& enum_location, const FileDescriptorProto* containing_file); bool ParseServiceStatement(ServiceDescriptorProto* message, const LocationRecorder& service_location, const FileDescriptorProto* containing_file); // Parse a field of a message. If the field is a group, its type will be // added to "messages". // // parent_location and location_field_number_for_nested_type are needed when // parsing groups -- we need to generate a nested message type within the // parent and record its location accordingly. Since the parent could be // either a FileDescriptorProto or a DescriptorProto, we must pass in the // correct field number to use. bool ParseMessageField(FieldDescriptorProto* field, RepeatedPtrField* messages, const LocationRecorder& parent_location, int location_field_number_for_nested_type, const LocationRecorder& field_location, const FileDescriptorProto* containing_file); // Like ParseMessageField() but expects the label has already been filled in // by the caller. bool ParseMessageFieldNoLabel(FieldDescriptorProto* field, RepeatedPtrField* messages, const LocationRecorder& parent_location, int location_field_number_for_nested_type, const LocationRecorder& field_location, const FileDescriptorProto* containing_file); // Parse an "extensions" declaration. bool ParseExtensions(DescriptorProto* message, const LocationRecorder& extensions_location, const FileDescriptorProto* containing_file); // Parse a "reserved" declaration. bool ParseReserved(DescriptorProto* message, const LocationRecorder& message_location); bool ParseReservedNames(DescriptorProto* message, const LocationRecorder& parent_location); bool ParseReservedNumbers(DescriptorProto* message, const LocationRecorder& parent_location); bool ParseReserved(EnumDescriptorProto* message, const LocationRecorder& message_location); bool ParseReservedNames(EnumDescriptorProto* message, const LocationRecorder& parent_location); bool ParseReservedNumbers(EnumDescriptorProto* message, const LocationRecorder& parent_location); // Parse an "extend" declaration. (See also comments for // ParseMessageField().) bool ParseExtend(RepeatedPtrField* extensions, RepeatedPtrField* messages, const LocationRecorder& parent_location, int location_field_number_for_nested_type, const LocationRecorder& extend_location, const FileDescriptorProto* containing_file); // Parse a "oneof" declaration. The caller is responsible for setting // oneof_decl->label() since it will have had to parse the label before it // knew it was parsing a oneof. bool ParseOneof(OneofDescriptorProto* oneof_decl, DescriptorProto* containing_type, int oneof_index, const LocationRecorder& oneof_location, const LocationRecorder& containing_type_location, const FileDescriptorProto* containing_file); // Parse a single enum value within an enum block. bool ParseEnumConstant(EnumValueDescriptorProto* enum_value, const LocationRecorder& enum_value_location, const FileDescriptorProto* containing_file); // Parse enum constant options, i.e. the list in square brackets at the end // of the enum constant value definition. bool ParseEnumConstantOptions(EnumValueDescriptorProto* value, const LocationRecorder& enum_value_location, const FileDescriptorProto* containing_file); // Parse a single method within a service definition. bool ParseServiceMethod(MethodDescriptorProto* method, const LocationRecorder& method_location, const FileDescriptorProto* containing_file); // Parse options of a single method or stream. bool ParseMethodOptions(const LocationRecorder& parent_location, const FileDescriptorProto* containing_file, const int optionsFieldNumber, Message* mutable_options); // Parse "required", "optional", or "repeated" and fill in "label" // with the value. Returns true if such a label is consumed. bool ParseLabel(FieldDescriptorProto::Label* label, const FileDescriptorProto* containing_file); // Parse a type name and fill in "type" (if it is a primitive) or // "type_name" (if it is not) with the type parsed. bool ParseType(FieldDescriptorProto::Type* type, string* type_name); // Parse a user-defined type and fill in "type_name" with the name. // If a primitive type is named, it is treated as an error. bool ParseUserDefinedType(string* type_name); // Parses field options, i.e. the stuff in square brackets at the end // of a field definition. Also parses default value. bool ParseFieldOptions(FieldDescriptorProto* field, const LocationRecorder& field_location, const FileDescriptorProto* containing_file); // Parse the "default" option. This needs special handling because its // type is the field's type. bool ParseDefaultAssignment(FieldDescriptorProto* field, const LocationRecorder& field_location, const FileDescriptorProto* containing_file); bool ParseJsonName(FieldDescriptorProto* field, const LocationRecorder& field_location, const FileDescriptorProto* containing_file); enum OptionStyle { OPTION_ASSIGNMENT, // just "name = value" OPTION_STATEMENT // "option name = value;" }; // Parse a single option name/value pair, e.g. "ctype = CORD". The name // identifies a field of the given Message, and the value of that field // is set to the parsed value. bool ParseOption(Message* options, const LocationRecorder& options_location, const FileDescriptorProto* containing_file, OptionStyle style); // Parses a single part of a multipart option name. A multipart name consists // of names separated by dots. Each name is either an identifier or a series // of identifiers separated by dots and enclosed in parentheses. E.g., // "foo.(bar.baz).qux". bool ParseOptionNamePart(UninterpretedOption* uninterpreted_option, const LocationRecorder& part_location, const FileDescriptorProto* containing_file); // Parses a string surrounded by balanced braces. Strips off the outer // braces and stores the enclosed string in *value. // E.g., // { foo } *value gets 'foo' // { foo { bar: box } } *value gets 'foo { bar: box }' // {} *value gets '' // // REQUIRES: LookingAt("{") // When finished successfully, we are looking at the first token past // the ending brace. bool ParseUninterpretedBlock(string* value); struct MapField { // Whether the field is a map field. bool is_map_field; // The types of the key and value if they are primitive types. FieldDescriptorProto::Type key_type; FieldDescriptorProto::Type value_type; // Or the type names string if the types are customized types. string key_type_name; string value_type_name; MapField() : is_map_field(false) {} }; // Desugar the map syntax to generate a nested map entry message. void GenerateMapEntry(const MapField& map_field, FieldDescriptorProto* field, RepeatedPtrField* messages); // Whether fields without label default to optional fields. bool DefaultToOptionalFields() const { return syntax_identifier_ == "proto3"; } bool ValidateEnum(const EnumDescriptorProto* proto); // ================================================================= io::Tokenizer* input_; io::ErrorCollector* error_collector_; SourceCodeInfo* source_code_info_; SourceLocationTable* source_location_table_; // legacy bool had_errors_; bool require_syntax_identifier_; bool stop_after_syntax_identifier_; string syntax_identifier_; // Leading doc comments for the next declaration. These are not complete // yet; use ConsumeEndOfDeclaration() to get the complete comments. string upcoming_doc_comments_; // Detached comments are not connected to any syntax entities. Elements in // this vector are paragraphs of comments separated by empty lines. The // detached comments will be put into the leading_detached_comments field for // the next element (See SourceCodeInfo.Location in descriptor.proto), when // ConsumeEndOfDeclaration() is called. std::vector upcoming_detached_comments_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Parser); }; // A table mapping (descriptor, ErrorLocation) pairs -- as reported by // DescriptorPool when validating descriptors -- to line and column numbers // within the original source code. // // This is semi-obsolete: FileDescriptorProto.source_code_info now contains // far more complete information about source locations. However, as of this // writing you still need to use SourceLocationTable when integrating with // DescriptorPool. class LIBPROTOBUF_EXPORT SourceLocationTable { public: SourceLocationTable(); ~SourceLocationTable(); // Finds the precise location of the given error and fills in *line and // *column with the line and column numbers. If not found, sets *line to // -1 and *column to 0 (since line = -1 is used to mean "error has no exact // location" in the ErrorCollector interface). Returns true if found, false // otherwise. bool Find(const Message* descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, int* line, int* column) const; // Adds a location to the table. void Add(const Message* descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, int line, int column); // Clears the contents of the table. void Clear(); private: typedef std::map< std::pair, std::pair > LocationMap; LocationMap location_map_; }; } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_PARSER_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/parser_unittest.cc000066400000000000000000003307001334102242000326500ustar00rootroot00000000000000// 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 #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace { class MockErrorCollector : public io::ErrorCollector { public: MockErrorCollector() {} ~MockErrorCollector() {} string text_; // implements ErrorCollector --------------------------------------- void AddError(int line, int column, const string& message) { strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", line, column, message); } }; class MockValidationErrorCollector : public DescriptorPool::ErrorCollector { public: MockValidationErrorCollector(const SourceLocationTable& source_locations, io::ErrorCollector* wrapped_collector) : source_locations_(source_locations), wrapped_collector_(wrapped_collector) {} ~MockValidationErrorCollector() {} // implements ErrorCollector --------------------------------------- void AddError(const string& filename, const string& element_name, const Message* descriptor, ErrorLocation location, const string& message) { int line, column; source_locations_.Find(descriptor, location, &line, &column); wrapped_collector_->AddError(line, column, message); } private: const SourceLocationTable& source_locations_; io::ErrorCollector* wrapped_collector_; }; class ParserTest : public testing::Test { protected: ParserTest() : require_syntax_identifier_(false) {} // Set up the parser to parse the given text. void SetupParser(const char* text) { raw_input_.reset(new io::ArrayInputStream(text, strlen(text))); input_.reset(new io::Tokenizer(raw_input_.get(), &error_collector_)); parser_.reset(new Parser()); parser_->RecordErrorsTo(&error_collector_); parser_->SetRequireSyntaxIdentifier(require_syntax_identifier_); } // Parse the input and expect that the resulting FileDescriptorProto matches // the given output. The output is a FileDescriptorProto in protocol buffer // text format. void ExpectParsesTo(const char* input, const char* output) { SetupParser(input); FileDescriptorProto actual, expected; parser_->Parse(input_.get(), &actual); EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); ASSERT_EQ("", error_collector_.text_); // We don't cover SourceCodeInfo in these tests. actual.clear_source_code_info(); // Parse the ASCII representation in order to canonicalize it. We could // just compare directly to actual.DebugString(), but that would require // that the caller precisely match the formatting that DebugString() // produces. ASSERT_TRUE(TextFormat::ParseFromString(output, &expected)); // Compare by comparing debug strings. // TODO(kenton): Use differencer, once it is available. EXPECT_EQ(expected.DebugString(), actual.DebugString()); } // Parse the text and expect that the given errors are reported. void ExpectHasErrors(const char* text, const char* expected_errors) { ExpectHasEarlyExitErrors(text, expected_errors); EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); } // Same as above but does not expect that the parser parses the complete // input. void ExpectHasEarlyExitErrors(const char* text, const char* expected_errors) { SetupParser(text); FileDescriptorProto file; parser_->Parse(input_.get(), &file); EXPECT_EQ(expected_errors, error_collector_.text_); } // Parse the text as a file and validate it (with a DescriptorPool), and // expect that the validation step reports the given errors. void ExpectHasValidationErrors(const char* text, const char* expected_errors) { SetupParser(text); SourceLocationTable source_locations; parser_->RecordSourceLocationsTo(&source_locations); FileDescriptorProto file; file.set_name("foo.proto"); parser_->Parse(input_.get(), &file); EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); ASSERT_EQ("", error_collector_.text_); MockValidationErrorCollector validation_error_collector( source_locations, &error_collector_); EXPECT_TRUE(pool_.BuildFileCollectingErrors( file, &validation_error_collector) == NULL); EXPECT_EQ(expected_errors, error_collector_.text_); } MockErrorCollector error_collector_; DescriptorPool pool_; google::protobuf::scoped_ptr raw_input_; google::protobuf::scoped_ptr input_; google::protobuf::scoped_ptr parser_; bool require_syntax_identifier_; }; // =================================================================== TEST_F(ParserTest, StopAfterSyntaxIdentifier) { SetupParser( "// blah\n" "syntax = \"foobar\";\n" "this line will not be parsed\n"); parser_->SetStopAfterSyntaxIdentifier(true); EXPECT_TRUE(parser_->Parse(input_.get(), NULL)); EXPECT_EQ("", error_collector_.text_); EXPECT_EQ("foobar", parser_->GetSyntaxIdentifier()); } TEST_F(ParserTest, StopAfterOmittedSyntaxIdentifier) { SetupParser( "// blah\n" "this line will not be parsed\n"); parser_->SetStopAfterSyntaxIdentifier(true); EXPECT_TRUE(parser_->Parse(input_.get(), NULL)); EXPECT_EQ("", error_collector_.text_); EXPECT_EQ("", parser_->GetSyntaxIdentifier()); } TEST_F(ParserTest, StopAfterSyntaxIdentifierWithErrors) { SetupParser( "// blah\n" "syntax = error;\n"); parser_->SetStopAfterSyntaxIdentifier(true); EXPECT_FALSE(parser_->Parse(input_.get(), NULL)); EXPECT_EQ("1:9: Expected syntax identifier.\n", error_collector_.text_); } TEST_F(ParserTest, WarnIfSyntaxIdentifierOmmitted) { SetupParser("message A {}"); FileDescriptorProto file; CaptureTestStderr(); EXPECT_TRUE(parser_->Parse(input_.get(), &file)); EXPECT_TRUE( GetCapturedTestStderr().find("No syntax specified") != string::npos); } // =================================================================== typedef ParserTest ParseMessageTest; TEST_F(ParseMessageTest, IgnoreBOM) { char input[] = " message TestMessage {\n" " required int32 foo = 1;\n" "}\n"; // Set UTF-8 BOM. input[0] = (char)0xEF; input[1] = (char)0xBB; input[2] = (char)0xBF; ExpectParsesTo(input, "message_type {" " name: \"TestMessage\"" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" "}"); } TEST_F(ParseMessageTest, BOMError) { char input[] = " message TestMessage {\n" " required int32 foo = 1;\n" "}\n"; input[0] = (char)0xEF; ExpectHasErrors(input, "0:1: Proto file starts with 0xEF but not UTF-8 BOM. " "Only UTF-8 is accepted for proto file.\n" "0:0: Expected top-level statement (e.g. \"message\").\n"); } TEST_F(ParseMessageTest, SimpleMessage) { ExpectParsesTo( "message TestMessage {\n" " required int32 foo = 1;\n" "}\n", "message_type {" " name: \"TestMessage\"" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" "}"); } TEST_F(ParseMessageTest, ImplicitSyntaxIdentifier) { require_syntax_identifier_ = false; ExpectParsesTo( "message TestMessage {\n" " required int32 foo = 1;\n" "}\n", "message_type {" " name: \"TestMessage\"" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" "}"); EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); } TEST_F(ParseMessageTest, ExplicitSyntaxIdentifier) { ExpectParsesTo( "syntax = \"proto2\";\n" "message TestMessage {\n" " required int32 foo = 1;\n" "}\n", "syntax: 'proto2' " "message_type {" " name: \"TestMessage\"" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" "}"); EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); } TEST_F(ParseMessageTest, ExplicitRequiredSyntaxIdentifier) { require_syntax_identifier_ = true; ExpectParsesTo( "syntax = \"proto2\";\n" "message TestMessage {\n" " required int32 foo = 1;\n" "}\n", "syntax: 'proto2' " "message_type {" " name: \"TestMessage\"" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" "}"); EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); } TEST_F(ParseMessageTest, SimpleFields) { ExpectParsesTo( "message TestMessage {\n" " required int32 foo = 15;\n" " optional int32 bar = 34;\n" " repeated int32 baz = 3;\n" "}\n", "message_type {" " name: \"TestMessage\"" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:15 }" " field { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:34 }" " field { name:\"baz\" label:LABEL_REPEATED type:TYPE_INT32 number:3 }" "}"); } TEST_F(ParseMessageTest, PrimitiveFieldTypes) { ExpectParsesTo( "message TestMessage {\n" " required int32 foo = 1;\n" " required int64 foo = 1;\n" " required uint32 foo = 1;\n" " required uint64 foo = 1;\n" " required sint32 foo = 1;\n" " required sint64 foo = 1;\n" " required fixed32 foo = 1;\n" " required fixed64 foo = 1;\n" " required sfixed32 foo = 1;\n" " required sfixed64 foo = 1;\n" " required float foo = 1;\n" " required double foo = 1;\n" " required string foo = 1;\n" " required bytes foo = 1;\n" " required bool foo = 1;\n" "}\n", "message_type {" " name: \"TestMessage\"" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT64 number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT32 number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT64 number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT32 number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT64 number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED32 number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED64 number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED32 number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED64 number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FLOAT number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_DOUBLE number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_STRING number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BYTES number:1 }" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BOOL number:1 }" "}"); } TEST_F(ParseMessageTest, FieldDefaults) { ExpectParsesTo( "message TestMessage {\n" " required int32 foo = 1 [default= 1 ];\n" " required int32 foo = 1 [default= -2 ];\n" " required int64 foo = 1 [default= 3 ];\n" " required int64 foo = 1 [default= -4 ];\n" " required uint32 foo = 1 [default= 5 ];\n" " required uint64 foo = 1 [default= 6 ];\n" " required float foo = 1 [default= 7.5];\n" " required float foo = 1 [default= -8.5];\n" " required float foo = 1 [default= 9 ];\n" " required double foo = 1 [default= 10.5];\n" " required double foo = 1 [default=-11.5];\n" " required double foo = 1 [default= 12 ];\n" " required double foo = 1 [default= inf ];\n" " required double foo = 1 [default=-inf ];\n" " required double foo = 1 [default= nan ];\n" " required string foo = 1 [default='13\\001'];\n" " required string foo = 1 [default='a' \"b\" \n \"c\"];\n" " required bytes foo = 1 [default='14\\002'];\n" " required bytes foo = 1 [default='a' \"b\" \n 'c'];\n" " required bool foo = 1 [default=true ];\n" " required Foo foo = 1 [default=FOO ];\n" " required int32 foo = 1 [default= 0x7FFFFFFF];\n" " required int32 foo = 1 [default=-0x80000000];\n" " required uint32 foo = 1 [default= 0xFFFFFFFF];\n" " required int64 foo = 1 [default= 0x7FFFFFFFFFFFFFFF];\n" " required int64 foo = 1 [default=-0x8000000000000000];\n" " required uint64 foo = 1 [default= 0xFFFFFFFFFFFFFFFF];\n" " required double foo = 1 [default= 0xabcd];\n" "}\n", #define ETC "name:\"foo\" label:LABEL_REQUIRED number:1" "message_type {" " name: \"TestMessage\"" " field { type:TYPE_INT32 default_value:\"1\" " ETC " }" " field { type:TYPE_INT32 default_value:\"-2\" " ETC " }" " field { type:TYPE_INT64 default_value:\"3\" " ETC " }" " field { type:TYPE_INT64 default_value:\"-4\" " ETC " }" " field { type:TYPE_UINT32 default_value:\"5\" " ETC " }" " field { type:TYPE_UINT64 default_value:\"6\" " ETC " }" " field { type:TYPE_FLOAT default_value:\"7.5\" " ETC " }" " field { type:TYPE_FLOAT default_value:\"-8.5\" " ETC " }" " field { type:TYPE_FLOAT default_value:\"9\" " ETC " }" " field { type:TYPE_DOUBLE default_value:\"10.5\" " ETC " }" " field { type:TYPE_DOUBLE default_value:\"-11.5\" " ETC " }" " field { type:TYPE_DOUBLE default_value:\"12\" " ETC " }" " field { type:TYPE_DOUBLE default_value:\"inf\" " ETC " }" " field { type:TYPE_DOUBLE default_value:\"-inf\" " ETC " }" " field { type:TYPE_DOUBLE default_value:\"nan\" " ETC " }" " field { type:TYPE_STRING default_value:\"13\\001\" " ETC " }" " field { type:TYPE_STRING default_value:\"abc\" " ETC " }" " field { type:TYPE_BYTES default_value:\"14\\\\002\" " ETC " }" " field { type:TYPE_BYTES default_value:\"abc\" " ETC " }" " field { type:TYPE_BOOL default_value:\"true\" " ETC " }" " field { type_name:\"Foo\" default_value:\"FOO\" " ETC " }" " field {" " type:TYPE_INT32 default_value:\"2147483647\" " ETC " }" " field {" " type:TYPE_INT32 default_value:\"-2147483648\" " ETC " }" " field {" " type:TYPE_UINT32 default_value:\"4294967295\" " ETC " }" " field {" " type:TYPE_INT64 default_value:\"9223372036854775807\" " ETC " }" " field {" " type:TYPE_INT64 default_value:\"-9223372036854775808\" " ETC " }" " field {" " type:TYPE_UINT64 default_value:\"18446744073709551615\" " ETC " }" " field {" " type:TYPE_DOUBLE default_value:\"43981\" " ETC " }" "}"); #undef ETC } TEST_F(ParseMessageTest, FieldJsonName) { ExpectParsesTo( "message TestMessage {\n" " optional string foo = 1 [json_name = \"@type\"];\n" "}\n", "message_type {" " name: \"TestMessage\"" " field {\n" " name: \"foo\" label: LABEL_OPTIONAL type: TYPE_STRING number: 1" " json_name: \"@type\"\n" " }\n" "}\n"); } TEST_F(ParseMessageTest, FieldOptions) { ExpectParsesTo( "message TestMessage {\n" " optional string foo = 1\n" " [ctype=CORD, (foo)=7, foo.(.bar.baz).qux.quux.(corge)=-33, \n" " (quux)=\"x\040y\", (baz.qux)=hey];\n" "}\n", "message_type {" " name: \"TestMessage\"" " field { name: \"foo\" label: LABEL_OPTIONAL type: TYPE_STRING number: 1" " options { uninterpreted_option: { name { name_part: \"ctype\" " " is_extension: false } " " identifier_value: \"CORD\" }" " uninterpreted_option: { name { name_part: \"foo\" " " is_extension: true } " " positive_int_value: 7 }" " uninterpreted_option: { name { name_part: \"foo\" " " is_extension: false } " " name { name_part: \".bar.baz\"" " is_extension: true } " " name { name_part: \"qux\" " " is_extension: false } " " name { name_part: \"quux\" " " is_extension: false } " " name { name_part: \"corge\" " " is_extension: true } " " negative_int_value: -33 }" " uninterpreted_option: { name { name_part: \"quux\" " " is_extension: true } " " string_value: \"x y\" }" " uninterpreted_option: { name { name_part: \"baz.qux\" " " is_extension: true } " " identifier_value: \"hey\" }" " }" " }" "}"); } TEST_F(ParseMessageTest, Oneof) { ExpectParsesTo( "message TestMessage {\n" " oneof foo {\n" " int32 a = 1;\n" " string b = 2;\n" " TestMessage c = 3;\n" " group D = 4 { optional int32 i = 5; }\n" " }\n" "}\n", "message_type {" " name: \"TestMessage\"" " field { name:\"a\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 " " oneof_index:0 }" " field { name:\"b\" label:LABEL_OPTIONAL type:TYPE_STRING number:2 " " oneof_index:0 }" " field { name:\"c\" label:LABEL_OPTIONAL type_name:\"TestMessage\" " " number:3 oneof_index:0 }" " field { name:\"d\" label:LABEL_OPTIONAL type:TYPE_GROUP " " type_name:\"D\" number:4 oneof_index:0 }" " oneof_decl {" " name: \"foo\"" " }" " nested_type {" " name: \"D\"" " field { name:\"i\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 }" " }" "}"); } TEST_F(ParseMessageTest, MultipleOneofs) { ExpectParsesTo( "message TestMessage {\n" " oneof foo {\n" " int32 a = 1;\n" " string b = 2;\n" " }\n" " oneof bar {\n" " int32 c = 3;\n" " string d = 4;\n" " }\n" "}\n", "message_type {" " name: \"TestMessage\"" " field { name:\"a\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 " " oneof_index:0 }" " field { name:\"b\" label:LABEL_OPTIONAL type:TYPE_STRING number:2 " " oneof_index:0 }" " field { name:\"c\" label:LABEL_OPTIONAL type:TYPE_INT32 number:3 " " oneof_index:1 }" " field { name:\"d\" label:LABEL_OPTIONAL type:TYPE_STRING number:4 " " oneof_index:1 }" " oneof_decl {" " name: \"foo\"" " }" " oneof_decl {" " name: \"bar\"" " }" "}"); } TEST_F(ParseMessageTest, Maps) { ExpectParsesTo( "message TestMessage {\n" " map primitive_type_map = 1;\n" " map composite_type_map = 2;\n" "}\n", "message_type {" " name: \"TestMessage\"" " nested_type {" " name: \"PrimitiveTypeMapEntry\"" " field { " " name: \"key\" number: 1 label:LABEL_OPTIONAL" " type:TYPE_INT32" " }" " field { " " name: \"value\" number: 2 label:LABEL_OPTIONAL" " type:TYPE_STRING" " }" " options { map_entry: true }" " }" " nested_type {" " name: \"CompositeTypeMapEntry\"" " field { " " name: \"key\" number: 1 label:LABEL_OPTIONAL" " type_name: \"KeyType\"" " }" " field { " " name: \"value\" number: 2 label:LABEL_OPTIONAL" " type_name: \"ValueType\"" " }" " options { map_entry: true }" " }" " field {" " name: \"primitive_type_map\"" " label: LABEL_REPEATED" " type_name: \"PrimitiveTypeMapEntry\"" " number: 1" " }" " field {" " name: \"composite_type_map\"" " label: LABEL_REPEATED" " type_name: \"CompositeTypeMapEntry\"" " number: 2" " }" "}"); } TEST_F(ParseMessageTest, Group) { ExpectParsesTo( "message TestMessage {\n" " optional group TestGroup = 1 {};\n" "}\n", "message_type {" " name: \"TestMessage\"" " nested_type { name: \"TestGroup\" }" " field { name:\"testgroup\" label:LABEL_OPTIONAL number:1" " type:TYPE_GROUP type_name: \"TestGroup\" }" "}"); } TEST_F(ParseMessageTest, NestedMessage) { ExpectParsesTo( "message TestMessage {\n" " message Nested {}\n" " optional Nested test_nested = 1;\n" "}\n", "message_type {" " name: \"TestMessage\"" " nested_type { name: \"Nested\" }" " field { name:\"test_nested\" label:LABEL_OPTIONAL number:1" " type_name: \"Nested\" }" "}"); } TEST_F(ParseMessageTest, NestedEnum) { ExpectParsesTo( "message TestMessage {\n" " enum NestedEnum {}\n" " optional NestedEnum test_enum = 1;\n" "}\n", "message_type {" " name: \"TestMessage\"" " enum_type { name: \"NestedEnum\" }" " field { name:\"test_enum\" label:LABEL_OPTIONAL number:1" " type_name: \"NestedEnum\" }" "}"); } TEST_F(ParseMessageTest, ReservedRange) { ExpectParsesTo( "message TestMessage {\n" " required int32 foo = 1;\n" " reserved 2, 15, 9 to 11, 3, 20 to max;\n" "}\n", "message_type {" " name: \"TestMessage\"" " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" " reserved_range { start:2 end:3 }" " reserved_range { start:15 end:16 }" " reserved_range { start:9 end:12 }" " reserved_range { start:3 end:4 }" " reserved_range { start:20 end:536870912 }" "}"); } TEST_F(ParseMessageTest, ReservedRangeOnMessageSet) { ExpectParsesTo( "message TestMessage {\n" " option message_set_wire_format = true;\n" " reserved 20 to max;\n" "}\n", "message_type {" " name: \"TestMessage\"" " options {" " uninterpreted_option {" " name {" " name_part: \"message_set_wire_format\"" " is_extension: false" " }" " identifier_value: \"true\"" " }" " }" " reserved_range { start:20 end:2147483647 }" "}"); } TEST_F(ParseMessageTest, ReservedNames) { ExpectParsesTo( "message TestMessage {\n" " reserved \"foo\", \"bar\";\n" "}\n", "message_type {" " name: \"TestMessage\"" " reserved_name: \"foo\"" " reserved_name: \"bar\"" "}"); } TEST_F(ParseMessageTest, ExtensionRange) { ExpectParsesTo( "message TestMessage {\n" " extensions 10 to 19;\n" " extensions 30 to max;\n" "}\n", "message_type {" " name: \"TestMessage\"" " extension_range { start:10 end:20 }" " extension_range { start:30 end:536870912 }" "}"); } TEST_F(ParseMessageTest, ExtensionRangeWithOptions) { ExpectParsesTo( "message TestMessage {\n" " extensions 10 to 19 [(i) = 5];\n" "}\n", "message_type {" " name: \"TestMessage\"" " extension_range {" " start:10" " end:20" " options {" " uninterpreted_option {" " name {" " name_part: \"i\"" " is_extension: true" " }" " positive_int_value: 5" " }" " }" " }" "}"); } TEST_F(ParseMessageTest, CompoundExtensionRange) { ExpectParsesTo( "message TestMessage {\n" " extensions 2, 15, 9 to 11, 100 to max, 3;\n" "}\n", "message_type {" " name: \"TestMessage\"" " extension_range { start:2 end:3 }" " extension_range { start:15 end:16 }" " extension_range { start:9 end:12 }" " extension_range { start:100 end:536870912 }" " extension_range { start:3 end:4 }" "}"); } TEST_F(ParseMessageTest, CompoundExtensionRangeWithOptions) { ExpectParsesTo( "message TestMessage {\n" " extensions 2, 15, 9 to 11, 100 to max, 3 [(i) = 5];\n" "}\n", "message_type {" " name: \"TestMessage\"" " extension_range {" " start:2" " end:3" " options {" " uninterpreted_option {" " name {" " name_part: \"i\"" " is_extension: true" " }" " positive_int_value: 5" " }" " }" " }" " extension_range {" " start:15" " end:16" " options {" " uninterpreted_option {" " name {" " name_part: \"i\"" " is_extension: true" " }" " positive_int_value: 5" " }" " }" " }" " extension_range {" " start:9" " end:12" " options {" " uninterpreted_option {" " name {" " name_part: \"i\"" " is_extension: true" " }" " positive_int_value: 5" " }" " }" " }" " extension_range {" " start:100" " end:536870912" " options {" " uninterpreted_option {" " name {" " name_part: \"i\"" " is_extension: true" " }" " positive_int_value: 5" " }" " }" " }" " extension_range {" " start:3" " end:4" " options {" " uninterpreted_option {" " name {" " name_part: \"i\"" " is_extension: true" " }" " positive_int_value: 5" " }" " }" " }" "}"); } TEST_F(ParseMessageTest, LargerMaxForMessageSetWireFormatMessages) { // Messages using the message_set_wire_format option can accept larger // extension numbers, as the numbers are not encoded as int32 field values // rather than tags. ExpectParsesTo( "message TestMessage {\n" " extensions 4 to max;\n" " option message_set_wire_format = true;\n" "}\n", "message_type {" " name: \"TestMessage\"" " extension_range { start:4 end: 0x7fffffff }" " options {\n" " uninterpreted_option { \n" " name {\n" " name_part: \"message_set_wire_format\"\n" " is_extension: false\n" " }\n" " identifier_value: \"true\"\n" " }\n" " }\n" "}"); } TEST_F(ParseMessageTest, Extensions) { ExpectParsesTo( "extend Extendee1 { optional int32 foo = 12; }\n" "extend Extendee2 { repeated TestMessage bar = 22; }\n", "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12" " extendee: \"Extendee1\" } " "extension { name:\"bar\" label:LABEL_REPEATED number:22" " type_name:\"TestMessage\" extendee: \"Extendee2\" }"); } TEST_F(ParseMessageTest, ExtensionsInMessageScope) { ExpectParsesTo( "message TestMessage {\n" " extend Extendee1 { optional int32 foo = 12; }\n" " extend Extendee2 { repeated TestMessage bar = 22; }\n" "}\n", "message_type {" " name: \"TestMessage\"" " extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12" " extendee: \"Extendee1\" }" " extension { name:\"bar\" label:LABEL_REPEATED number:22" " type_name:\"TestMessage\" extendee: \"Extendee2\" }" "}"); } TEST_F(ParseMessageTest, MultipleExtensionsOneExtendee) { ExpectParsesTo( "extend Extendee1 {\n" " optional int32 foo = 12;\n" " repeated TestMessage bar = 22;\n" "}\n", "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12" " extendee: \"Extendee1\" } " "extension { name:\"bar\" label:LABEL_REPEATED number:22" " type_name:\"TestMessage\" extendee: \"Extendee1\" }"); } TEST_F(ParseMessageTest, OptionalLabelProto3) { ExpectParsesTo( "syntax = \"proto3\";\n" "message TestMessage {\n" " int32 foo = 1;\n" "}\n", "syntax: \"proto3\" " "message_type {" " name: \"TestMessage\"" " field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 } }"); } // =================================================================== typedef ParserTest ParseEnumTest; TEST_F(ParseEnumTest, SimpleEnum) { ExpectParsesTo( "enum TestEnum {\n" " FOO = 0;\n" "}\n", "enum_type {" " name: \"TestEnum\"" " value { name:\"FOO\" number:0 }" "}"); } TEST_F(ParseEnumTest, Values) { ExpectParsesTo( "enum TestEnum {\n" " FOO = 13;\n" " BAR = -10;\n" " BAZ = 500;\n" " HEX_MAX = 0x7FFFFFFF;\n" " HEX_MIN = -0x80000000;\n" " INT_MAX = 2147483647;\n" " INT_MIN = -2147483648;\n" "}\n", "enum_type {" " name: \"TestEnum\"" " value { name:\"FOO\" number:13 }" " value { name:\"BAR\" number:-10 }" " value { name:\"BAZ\" number:500 }" " value { name:\"HEX_MAX\" number:2147483647 }" " value { name:\"HEX_MIN\" number:-2147483648 }" " value { name:\"INT_MAX\" number:2147483647 }" " value { name:\"INT_MIN\" number:-2147483648 }" "}"); } TEST_F(ParseEnumTest, ValueOptions) { ExpectParsesTo( "enum TestEnum {\n" " FOO = 13;\n" " BAR = -10 [ (something.text) = 'abc' ];\n" " BAZ = 500 [ (something.text) = 'def', other = 1 ];\n" "}\n", "enum_type {" " name: \"TestEnum\"" " value { name: \"FOO\" number: 13 }" " value { name: \"BAR\" number: -10 " " options { " " uninterpreted_option { " " name { name_part: \"something.text\" is_extension: true } " " string_value: \"abc\" " " } " " } " " } " " value { name: \"BAZ\" number: 500 " " options { " " uninterpreted_option { " " name { name_part: \"something.text\" is_extension: true } " " string_value: \"def\" " " } " " uninterpreted_option { " " name { name_part: \"other\" is_extension: false } " " positive_int_value: 1 " " } " " } " " } " "}"); } TEST_F(ParseEnumTest, ReservedRange) { ExpectParsesTo( "enum TestEnum {\n" " FOO = 0;\n" " reserved -2147483648, -6 to -4, -1 to 1, 2, 15, 9 to 11, 3, 20 to max;\n" "}\n", "enum_type {" " name: \"TestEnum\"" " value { name:\"FOO\" number:0 }" " reserved_range { start:-2147483648 end:-2147483648 }" " reserved_range { start:-6 end:-4 }" " reserved_range { start:-1 end:1 }" " reserved_range { start:2 end:2 }" " reserved_range { start:15 end:15 }" " reserved_range { start:9 end:11 }" " reserved_range { start:3 end:3 }" " reserved_range { start:20 end:2147483647 }" "}"); } TEST_F(ParseEnumTest, ReservedNames) { ExpectParsesTo( "enum TestEnum {\n" " FOO = 0;\n" " reserved \"foo\", \"bar\";\n" "}\n", "enum_type {" " name: \"TestEnum\"" " value { name:\"FOO\" number:0 }" " reserved_name: \"foo\"" " reserved_name: \"bar\"" "}"); } // =================================================================== typedef ParserTest ParseServiceTest; TEST_F(ParseServiceTest, SimpleService) { ExpectParsesTo( "service TestService {\n" " rpc Foo(In) returns (Out);\n" "}\n", "service {" " name: \"TestService\"" " method { name:\"Foo\" input_type:\"In\" output_type:\"Out\" }" "}"); } TEST_F(ParseServiceTest, MethodsAndStreams) { ExpectParsesTo( "service TestService {\n" " rpc Foo(In1) returns (Out1);\n" " rpc Bar(In2) returns (Out2);\n" " rpc Baz(In3) returns (Out3);\n" "}\n", "service {" " name: \"TestService\"" " method { name:\"Foo\" input_type:\"In1\" output_type:\"Out1\" }" " method { name:\"Bar\" input_type:\"In2\" output_type:\"Out2\" }" " method { name:\"Baz\" input_type:\"In3\" output_type:\"Out3\" }" "}"); } // =================================================================== // imports and packages typedef ParserTest ParseMiscTest; TEST_F(ParseMiscTest, ParseImport) { ExpectParsesTo( "import \"foo/bar/baz.proto\";\n", "dependency: \"foo/bar/baz.proto\""); } TEST_F(ParseMiscTest, ParseMultipleImports) { ExpectParsesTo( "import \"foo.proto\";\n" "import \"bar.proto\";\n" "import \"baz.proto\";\n", "dependency: \"foo.proto\"" "dependency: \"bar.proto\"" "dependency: \"baz.proto\""); } TEST_F(ParseMiscTest, ParsePublicImports) { ExpectParsesTo( "import \"foo.proto\";\n" "import public \"bar.proto\";\n" "import \"baz.proto\";\n" "import public \"qux.proto\";\n", "dependency: \"foo.proto\"" "dependency: \"bar.proto\"" "dependency: \"baz.proto\"" "dependency: \"qux.proto\"" "public_dependency: 1 " "public_dependency: 3 "); } TEST_F(ParseMiscTest, ParsePackage) { ExpectParsesTo( "package foo.bar.baz;\n", "package: \"foo.bar.baz\""); } TEST_F(ParseMiscTest, ParsePackageWithSpaces) { ExpectParsesTo( "package foo . bar. \n" " baz;\n", "package: \"foo.bar.baz\""); } // =================================================================== // options TEST_F(ParseMiscTest, ParseFileOptions) { ExpectParsesTo( "option java_package = \"com.google.foo\";\n" "option optimize_for = CODE_SIZE;", "options {" "uninterpreted_option { name { name_part: \"java_package\" " " is_extension: false }" " string_value: \"com.google.foo\"} " "uninterpreted_option { name { name_part: \"optimize_for\" " " is_extension: false }" " identifier_value: \"CODE_SIZE\" } " "}"); } // =================================================================== // Error tests // // There are a very large number of possible errors that the parser could // report, so it's infeasible to test every single one of them. Instead, // we test each unique call to AddError() in parser.h. This does not mean // we are testing every possible error that Parser can generate because // each variant of the Consume() helper only counts as one unique call to // AddError(). typedef ParserTest ParseErrorTest; TEST_F(ParseErrorTest, MissingSyntaxIdentifier) { require_syntax_identifier_ = true; ExpectHasEarlyExitErrors("message TestMessage {}", "0:0: File must begin with a syntax statement, e.g. " "'syntax = \"proto2\";'.\n"); EXPECT_EQ("", parser_->GetSyntaxIdentifier()); } TEST_F(ParseErrorTest, UnknownSyntaxIdentifier) { ExpectHasEarlyExitErrors( "syntax = \"no_such_syntax\";", "0:9: Unrecognized syntax identifier \"no_such_syntax\". This parser " "only recognizes \"proto2\" and \"proto3\".\n"); EXPECT_EQ("no_such_syntax", parser_->GetSyntaxIdentifier()); } TEST_F(ParseErrorTest, SimpleSyntaxError) { ExpectHasErrors( "message TestMessage @#$ { blah }", "0:20: Expected \"{\".\n"); EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); } TEST_F(ParseErrorTest, ExpectedTopLevel) { ExpectHasErrors( "blah;", "0:0: Expected top-level statement (e.g. \"message\").\n"); } TEST_F(ParseErrorTest, UnmatchedCloseBrace) { // This used to cause an infinite loop. Doh. ExpectHasErrors( "}", "0:0: Expected top-level statement (e.g. \"message\").\n" "0:0: Unmatched \"}\".\n"); } // ------------------------------------------------------------------- // Message errors TEST_F(ParseErrorTest, MessageMissingName) { ExpectHasErrors( "message {}", "0:8: Expected message name.\n"); } TEST_F(ParseErrorTest, MessageMissingBody) { ExpectHasErrors( "message TestMessage;", "0:19: Expected \"{\".\n"); } TEST_F(ParseErrorTest, EofInMessage) { ExpectHasErrors( "message TestMessage {", "0:21: Reached end of input in message definition (missing '}').\n"); } TEST_F(ParseErrorTest, MissingFieldNumber) { ExpectHasErrors( "message TestMessage {\n" " optional int32 foo;\n" "}\n", "1:20: Missing field number.\n"); } TEST_F(ParseErrorTest, ExpectedFieldNumber) { ExpectHasErrors( "message TestMessage {\n" " optional int32 foo = ;\n" "}\n", "1:23: Expected field number.\n"); } TEST_F(ParseErrorTest, FieldNumberOutOfRange) { ExpectHasErrors( "message TestMessage {\n" " optional int32 foo = 0x100000000;\n" "}\n", "1:23: Integer out of range.\n"); } TEST_F(ParseErrorTest, MissingLabel) { ExpectHasErrors( "message TestMessage {\n" " int32 foo = 1;\n" "}\n", "1:2: Expected \"required\", \"optional\", or \"repeated\".\n"); } TEST_F(ParseErrorTest, ExpectedOptionName) { ExpectHasErrors( "message TestMessage {\n" " optional uint32 foo = 1 [];\n" "}\n", "1:27: Expected identifier.\n"); } TEST_F(ParseErrorTest, NonExtensionOptionNameBeginningWithDot) { ExpectHasErrors( "message TestMessage {\n" " optional uint32 foo = 1 [.foo=1];\n" "}\n", "1:27: Expected identifier.\n"); } TEST_F(ParseErrorTest, DefaultValueTypeMismatch) { ExpectHasErrors( "message TestMessage {\n" " optional uint32 foo = 1 [default=true];\n" "}\n", "1:35: Expected integer for field default value.\n"); } TEST_F(ParseErrorTest, DefaultValueNotBoolean) { ExpectHasErrors( "message TestMessage {\n" " optional bool foo = 1 [default=blah];\n" "}\n", "1:33: Expected \"true\" or \"false\".\n"); } TEST_F(ParseErrorTest, DefaultValueNotString) { ExpectHasErrors( "message TestMessage {\n" " optional string foo = 1 [default=1];\n" "}\n", "1:35: Expected string for field default value.\n"); } TEST_F(ParseErrorTest, DefaultValueUnsignedNegative) { ExpectHasErrors( "message TestMessage {\n" " optional uint32 foo = 1 [default=-1];\n" "}\n", "1:36: Unsigned field can't have negative default value.\n"); } TEST_F(ParseErrorTest, DefaultValueTooLarge) { ExpectHasErrors( "message TestMessage {\n" " optional int32 foo = 1 [default= 0x80000000];\n" " optional int32 foo = 1 [default=-0x80000001];\n" " optional uint32 foo = 1 [default= 0x100000000];\n" " optional int64 foo = 1 [default= 0x80000000000000000];\n" " optional int64 foo = 1 [default=-0x80000000000000001];\n" " optional uint64 foo = 1 [default= 0x100000000000000000];\n" "}\n", "1:36: Integer out of range.\n" "2:36: Integer out of range.\n" "3:36: Integer out of range.\n" "4:36: Integer out of range.\n" "5:36: Integer out of range.\n" "6:36: Integer out of range.\n"); } TEST_F(ParseErrorTest, JsonNameNotString) { ExpectHasErrors( "message TestMessage {\n" " optional string foo = 1 [json_name=1];\n" "}\n", "1:37: Expected string for JSON name.\n"); } TEST_F(ParseErrorTest, DuplicateJsonName) { ExpectHasErrors( "message TestMessage {\n" " optional uint32 foo = 1 [json_name=\"a\",json_name=\"b\"];\n" "}\n", "1:41: Already set option \"json_name\".\n"); } TEST_F(ParseErrorTest, EnumValueOutOfRange) { ExpectHasErrors( "enum TestEnum {\n" " HEX_TOO_BIG = 0x80000000;\n" " HEX_TOO_SMALL = -0x80000001;\n" " INT_TOO_BIG = 2147483648;\n" " INT_TOO_SMALL = -2147483649;\n" "}\n", "1:19: Integer out of range.\n" "2:19: Integer out of range.\n" "3:19: Integer out of range.\n" "4:19: Integer out of range.\n"); } TEST_F(ParseErrorTest, EnumAllowAliasFalse) { ExpectHasErrors( "enum Foo {\n" " option allow_alias = false;\n" " BAR = 1;\n" " BAZ = 2;\n" "}\n", "5:0: \"Foo\" declares 'option allow_alias = false;' which has no effect. " "Please remove the declaration.\n"); } TEST_F(ParseErrorTest, UnnecessaryEnumAllowAlias) { ExpectHasErrors( "enum Foo {\n" " option allow_alias = true;\n" " BAR = 1;\n" " BAZ = 2;\n" "}\n", "5:0: \"Foo\" declares support for enum aliases but no enum values share " "field numbers. Please remove the unnecessary 'option allow_alias = true;' " "declaration.\n"); } TEST_F(ParseErrorTest, DefaultValueMissing) { ExpectHasErrors( "message TestMessage {\n" " optional uint32 foo = 1 [default=];\n" "}\n", "1:35: Expected integer for field default value.\n"); } TEST_F(ParseErrorTest, DefaultValueForGroup) { ExpectHasErrors( "message TestMessage {\n" " optional group Foo = 1 [default=blah] {}\n" "}\n", "1:34: Messages can't have default values.\n"); } TEST_F(ParseErrorTest, DuplicateDefaultValue) { ExpectHasErrors( "message TestMessage {\n" " optional uint32 foo = 1 [default=1,default=2];\n" "}\n", "1:37: Already set option \"default\".\n"); } TEST_F(ParseErrorTest, MissingOneofName) { ExpectHasErrors( "message TestMessage {\n" " oneof {\n" " int32 bar = 1;\n" " }\n" "}\n", "1:8: Expected oneof name.\n"); } TEST_F(ParseErrorTest, LabelInOneof) { ExpectHasErrors( "message TestMessage {\n" " oneof foo {\n" " optional int32 bar = 1;\n" " }\n" "}\n", "2:4: Fields in oneofs must not have labels (required / optional " "/ repeated).\n"); } TEST_F(ParseErrorTest, MapInOneof) { ExpectHasErrors( "message TestMessage {\n" " oneof foo {\n" " map foo_map = 1;\n" " map message_field = 2;\n" // a normal message field is OK " }\n" "}\n", "2:7: Map fields are not allowed in oneofs.\n"); } TEST_F(ParseErrorTest, LabelForMap) { ExpectHasErrors( "message TestMessage {\n" " optional map int_map = 1;\n" " required map int_map2 = 2;\n" " repeated map int_map3 = 3;\n" " optional map map_message = 4;\n" // a normal message field is OK "}\n", "1:14: Field labels (required/optional/repeated) are not allowed on map " "fields.\n" "2:14: Field labels (required/optional/repeated) are not allowed on map " "fields.\n" "3:14: Field labels (required/optional/repeated) are not allowed on map " "fields.\n"); } TEST_F(ParseErrorTest, MalformedMaps) { ExpectHasErrors( "message TestMessage {\n" " map map_message = 1;\n" // a normal message field lacking label " map str_map = 2;\n" " map str_map2 = 3;\n" " map<,string> str_map3 = 4;\n" " map<> empty_map = 5;\n" " map int_map = 1;\n" "}", "1:6: Expected \"required\", \"optional\", or \"repeated\".\n" "2:12: Expected \",\".\n" "3:13: Expected type name.\n" "4:6: Expected type name.\n" "5:6: Expected type name.\n" "6:20: Expected \">\".\n" "8:5: Map fields are not allowed to be extensions.\n"); } TEST_F(ParseErrorTest, GroupNotCapitalized) { ExpectHasErrors( "message TestMessage {\n" " optional group foo = 1 {}\n" "}\n", "1:17: Group names must start with a capital letter.\n"); } TEST_F(ParseErrorTest, GroupMissingBody) { ExpectHasErrors( "message TestMessage {\n" " optional group Foo = 1;\n" "}\n", "1:24: Missing group body.\n"); } TEST_F(ParseErrorTest, ExtendingPrimitive) { ExpectHasErrors( "extend int32 { optional string foo = 4; }\n", "0:7: Expected message type.\n"); } TEST_F(ParseErrorTest, ErrorInExtension) { ExpectHasErrors( "message Foo { extensions 100 to 199; }\n" "extend Foo { optional string foo; }\n", "1:32: Missing field number.\n"); } TEST_F(ParseErrorTest, MultipleParseErrors) { // When a statement has a parse error, the parser should be able to continue // parsing at the next statement. ExpectHasErrors( "message TestMessage {\n" " optional int32 foo;\n" " !invalid statement ending in a block { blah blah { blah } blah }\n" " optional int32 bar = 3 {}\n" "}\n", "1:20: Missing field number.\n" "2:2: Expected \"required\", \"optional\", or \"repeated\".\n" "2:2: Expected type name.\n" "3:25: Expected \";\".\n"); } TEST_F(ParseErrorTest, EofInAggregateValue) { ExpectHasErrors( "option (fileopt) = { i:100\n", "1:0: Unexpected end of stream while parsing aggregate value.\n"); } TEST_F(ParseErrorTest, ExplicitOptionalLabelProto3) { ExpectHasErrors( "syntax = 'proto3';\n" "message TestMessage {\n" " optional int32 foo = 1;\n" "}\n", "2:11: Explicit 'optional' labels are disallowed in the Proto3 syntax. " "To define 'optional' fields in Proto3, simply remove the 'optional' " "label, as fields are 'optional' by default.\n"); } // ------------------------------------------------------------------- // Enum errors TEST_F(ParseErrorTest, EofInEnum) { ExpectHasErrors( "enum TestEnum {", "0:15: Reached end of input in enum definition (missing '}').\n"); } TEST_F(ParseErrorTest, EnumValueMissingNumber) { ExpectHasErrors( "enum TestEnum {\n" " FOO;\n" "}\n", "1:5: Missing numeric value for enum constant.\n"); } TEST_F(ParseErrorTest, EnumReservedStandaloneMaxNotAllowed) { ExpectHasErrors( "enum TestEnum {\n" " FOO = 1;\n" " reserved max;\n" "}\n", "2:11: Expected enum value or number range.\n"); } TEST_F(ParseErrorTest, EnumReservedMixNameAndNumber) { ExpectHasErrors( "enum TestEnum {\n" " FOO = 1;\n" " reserved 10, \"foo\";\n" "}\n", "2:15: Expected enum number range.\n"); } TEST_F(ParseErrorTest, EnumReservedPositiveNumberOutOfRange) { ExpectHasErrors( "enum TestEnum {\n" "FOO = 1;\n" " reserved 2147483648;\n" "}\n", "2:11: Integer out of range.\n"); } TEST_F(ParseErrorTest, EnumReservedNegativeNumberOutOfRange) { ExpectHasErrors( "enum TestEnum {\n" "FOO = 1;\n" " reserved -2147483649;\n" "}\n", "2:12: Integer out of range.\n"); } TEST_F(ParseErrorTest, EnumReservedMissingQuotes) { ExpectHasErrors( "enum TestEnum {\n" " FOO = 1;\n" " reserved foo;\n" "}\n", "2:11: Expected enum value or number range.\n"); } // ------------------------------------------------------------------- // Reserved field number errors TEST_F(ParseErrorTest, ReservedStandaloneMaxNotAllowed) { ExpectHasErrors( "message Foo {\n" " reserved max;\n" "}\n", "1:11: Expected field name or number range.\n"); } TEST_F(ParseErrorTest, ReservedMixNameAndNumber) { ExpectHasErrors( "message Foo {\n" " reserved 10, \"foo\";\n" "}\n", "1:15: Expected field number range.\n"); } TEST_F(ParseErrorTest, ReservedMissingQuotes) { ExpectHasErrors( "message Foo {\n" " reserved foo;\n" "}\n", "1:11: Expected field name or number range.\n"); } TEST_F(ParseErrorTest, ReservedNegativeNumber) { ExpectHasErrors( "message Foo {\n" " reserved -10;\n" "}\n", "1:11: Expected field name or number range.\n"); } TEST_F(ParseErrorTest, ReservedNumberOutOfRange) { ExpectHasErrors( "message Foo {\n" " reserved 2147483648;\n" "}\n", "1:11: Integer out of range.\n"); } // ------------------------------------------------------------------- // Service errors TEST_F(ParseErrorTest, EofInService) { ExpectHasErrors( "service TestService {", "0:21: Reached end of input in service definition (missing '}').\n"); } TEST_F(ParseErrorTest, ServiceMethodPrimitiveParams) { ExpectHasErrors( "service TestService {\n" " rpc Foo(int32) returns (string);\n" "}\n", "1:10: Expected message type.\n" "1:26: Expected message type.\n"); } TEST_F(ParseErrorTest, EofInMethodOptions) { ExpectHasErrors( "service TestService {\n" " rpc Foo(Bar) returns(Bar) {", "1:29: Reached end of input in method options (missing '}').\n" "1:29: Reached end of input in service definition (missing '}').\n"); } TEST_F(ParseErrorTest, PrimitiveMethodInput) { ExpectHasErrors( "service TestService {\n" " rpc Foo(int32) returns(Bar);\n" "}\n", "1:10: Expected message type.\n"); } TEST_F(ParseErrorTest, MethodOptionTypeError) { // This used to cause an infinite loop. ExpectHasErrors( "message Baz {}\n" "service Foo {\n" " rpc Bar(Baz) returns(Baz) { option invalid syntax; }\n" "}\n", "2:45: Expected \"=\".\n"); } // ------------------------------------------------------------------- // Import and package errors TEST_F(ParseErrorTest, ImportNotQuoted) { ExpectHasErrors( "import foo;\n", "0:7: Expected a string naming the file to import.\n"); } TEST_F(ParseErrorTest, MultiplePackagesInFile) { ExpectHasErrors( "package foo;\n" "package bar;\n", "1:0: Multiple package definitions.\n"); } // =================================================================== // Test that errors detected by DescriptorPool correctly report line and // column numbers. We have one test for every call to RecordLocation() in // parser.cc. typedef ParserTest ParserValidationErrorTest; TEST_F(ParserValidationErrorTest, PackageNameError) { // Create another file which defines symbol "foo". FileDescriptorProto other_file; other_file.set_name("bar.proto"); other_file.add_message_type()->set_name("foo"); EXPECT_TRUE(pool_.BuildFile(other_file) != NULL); // Now try to define it as a package. ExpectHasValidationErrors( "package foo.bar;", "0:8: \"foo\" is already defined (as something other than a package) " "in file \"bar.proto\".\n"); } TEST_F(ParserValidationErrorTest, MessageNameError) { ExpectHasValidationErrors( "message Foo {}\n" "message Foo {}\n", "1:8: \"Foo\" is already defined.\n"); } TEST_F(ParserValidationErrorTest, FieldNameError) { ExpectHasValidationErrors( "message Foo {\n" " optional int32 bar = 1;\n" " optional int32 bar = 2;\n" "}\n", "2:17: \"bar\" is already defined in \"Foo\".\n"); } TEST_F(ParserValidationErrorTest, FieldTypeError) { ExpectHasValidationErrors( "message Foo {\n" " optional Baz bar = 1;\n" "}\n", "1:11: \"Baz\" is not defined.\n"); } TEST_F(ParserValidationErrorTest, FieldNumberError) { ExpectHasValidationErrors( "message Foo {\n" " optional int32 bar = 0;\n" "}\n", "1:23: Field numbers must be positive integers.\n"); } TEST_F(ParserValidationErrorTest, FieldExtendeeError) { ExpectHasValidationErrors( "extend Baz { optional int32 bar = 1; }\n", "0:7: \"Baz\" is not defined.\n"); } TEST_F(ParserValidationErrorTest, FieldDefaultValueError) { ExpectHasValidationErrors( "enum Baz { QUX = 1; }\n" "message Foo {\n" " optional Baz bar = 1 [default=NO_SUCH_VALUE];\n" "}\n", "2:32: Enum type \"Baz\" has no value named \"NO_SUCH_VALUE\".\n"); } TEST_F(ParserValidationErrorTest, FileOptionNameError) { ExpectHasValidationErrors( "option foo = 5;", "0:7: Option \"foo\" unknown.\n"); } TEST_F(ParserValidationErrorTest, FileOptionValueError) { ExpectHasValidationErrors( "option java_outer_classname = 5;", "0:30: Value must be quoted string for string option " "\"google.protobuf.FileOptions.java_outer_classname\".\n"); } TEST_F(ParserValidationErrorTest, FieldOptionNameError) { ExpectHasValidationErrors( "message Foo {\n" " optional bool bar = 1 [foo=1];\n" "}\n", "1:25: Option \"foo\" unknown.\n"); } TEST_F(ParserValidationErrorTest, FieldOptionValueError) { ExpectHasValidationErrors( "message Foo {\n" " optional int32 bar = 1 [ctype=1];\n" "}\n", "1:32: Value must be identifier for enum-valued option " "\"google.protobuf.FieldOptions.ctype\".\n"); } TEST_F(ParserValidationErrorTest, ExtensionRangeNumberError) { ExpectHasValidationErrors( "message Foo {\n" " extensions 0;\n" "}\n", "1:13: Extension numbers must be positive integers.\n"); } TEST_F(ParserValidationErrorTest, EnumNameError) { ExpectHasValidationErrors( "enum Foo {A = 1;}\n" "enum Foo {B = 1;}\n", "1:5: \"Foo\" is already defined.\n"); } TEST_F(ParserValidationErrorTest, EnumValueNameError) { ExpectHasValidationErrors( "enum Foo {\n" " BAR = 1;\n" " BAR = 1;\n" "}\n", "2:2: \"BAR\" is already defined.\n"); } TEST_F(ParserValidationErrorTest, ServiceNameError) { ExpectHasValidationErrors( "service Foo {}\n" "service Foo {}\n", "1:8: \"Foo\" is already defined.\n"); } TEST_F(ParserValidationErrorTest, MethodNameError) { ExpectHasValidationErrors( "message Baz {}\n" "service Foo {\n" " rpc Bar(Baz) returns(Baz);\n" " rpc Bar(Baz) returns(Baz);\n" "}\n", "3:6: \"Bar\" is already defined in \"Foo\".\n"); } TEST_F(ParserValidationErrorTest, MethodInputTypeError) { ExpectHasValidationErrors( "message Baz {}\n" "service Foo {\n" " rpc Bar(Qux) returns(Baz);\n" "}\n", "2:10: \"Qux\" is not defined.\n"); } TEST_F(ParserValidationErrorTest, MethodOutputTypeError) { ExpectHasValidationErrors( "message Baz {}\n" "service Foo {\n" " rpc Bar(Baz) returns(Qux);\n" "}\n", "2:23: \"Qux\" is not defined.\n"); } TEST_F(ParserValidationErrorTest, ResovledUndefinedError) { // Create another file which defines symbol ".base.bar". FileDescriptorProto other_file; other_file.set_name("base.proto"); other_file.set_package("base"); other_file.add_message_type()->set_name("bar"); EXPECT_TRUE(pool_.BuildFile(other_file) != NULL); // Define "foo.base" and try "base.bar". // "base.bar" is resolved to "foo.base.bar" which is not defined. ExpectHasValidationErrors( "package foo.base;\n" "import \"base.proto\";\n" "message qux {\n" " optional base.bar baz = 1;\n" " optional .base.bar quz = 2;\n" "}\n", "3:11: \"base.bar\" is resolved to \"foo.base.bar\"," " which is not defined. The innermost scope is searched first " "in name resolution. Consider using a leading '.'(i.e., \".base.bar\")" " to start from the outermost scope.\n"); } TEST_F(ParserValidationErrorTest, ResovledUndefinedOptionError) { // Build descriptor message in test pool FileDescriptorProto descriptor_proto; DescriptorProto::descriptor()->file()->CopyTo(&descriptor_proto); ASSERT_TRUE(pool_.BuildFile(descriptor_proto) != NULL); // base2.proto: // package baz // import google/protobuf/descriptor.proto // message Bar { optional int32 foo = 1; } // extend FileOptions { optional Bar bar = 7672757; } FileDescriptorProto other_file; other_file.set_name("base2.proto"); other_file.set_package("baz"); other_file.add_dependency(); other_file.set_dependency(0, descriptor_proto.name()); DescriptorProto* message(other_file.add_message_type()); message->set_name("Bar"); FieldDescriptorProto* field(message->add_field()); field->set_name("foo"); field->set_number(1); field->set_label(FieldDescriptorProto_Label_LABEL_OPTIONAL); field->set_type(FieldDescriptorProto_Type_TYPE_INT32); FieldDescriptorProto* extension(other_file.add_extension()); extension->set_name("bar"); extension->set_number(7672757); extension->set_label(FieldDescriptorProto_Label_LABEL_OPTIONAL); extension->set_type(FieldDescriptorProto_Type_TYPE_MESSAGE); extension->set_type_name("Bar"); extension->set_extendee("google.protobuf.FileOptions"); EXPECT_TRUE(pool_.BuildFile(other_file) != NULL); // qux.proto: // package qux.baz // option (baz.bar).foo = 1; // // Although "baz.bar" is already defined, the lookup code will try // "qux.baz.bar", since it's the match from the innermost scope, // which will cause a symbol not defined error. ExpectHasValidationErrors( "package qux.baz;\n" "import \"base2.proto\";\n" "option (baz.bar).foo = 1;\n", "2:7: Option \"(baz.bar)\" is resolved to \"(qux.baz.bar)\"," " which is not defined. The innermost scope is searched first " "in name resolution. Consider using a leading '.'(i.e., \"(.baz.bar)\")" " to start from the outermost scope.\n"); } // =================================================================== // Test that the output from FileDescriptor::DebugString() (and all other // descriptor types) is parseable, and results in the same Descriptor // definitions again afoter parsing (note, however, that the order of messages // cannot be guaranteed to be the same) typedef ParserTest ParseDescriptorDebugTest; class CompareDescriptorNames { public: bool operator()(const DescriptorProto* left, const DescriptorProto* right) const { return left->name() < right->name(); } }; // Sorts nested DescriptorProtos of a DescriptoProto, by name. void SortMessages(DescriptorProto *descriptor_proto) { int size = descriptor_proto->nested_type_size(); // recursively sort; we can't guarantee the order of nested messages either for (int i = 0; i < size; ++i) { SortMessages(descriptor_proto->mutable_nested_type(i)); } DescriptorProto **data = descriptor_proto->mutable_nested_type()->mutable_data(); std::sort(data, data + size, CompareDescriptorNames()); } // Sorts DescriptorProtos belonging to a FileDescriptorProto, by name. void SortMessages(FileDescriptorProto *file_descriptor_proto) { int size = file_descriptor_proto->message_type_size(); // recursively sort; we can't guarantee the order of nested messages either for (int i = 0; i < size; ++i) { SortMessages(file_descriptor_proto->mutable_message_type(i)); } DescriptorProto **data = file_descriptor_proto->mutable_message_type()->mutable_data(); std::sort(data, data + size, CompareDescriptorNames()); } // Strips the message and enum field type names for comparison purpose only. void StripFieldTypeName(DescriptorProto* proto) { for (int i = 0; i < proto->field_size(); ++i) { string type_name = proto->field(i).type_name(); string::size_type pos = type_name.find_last_of("."); if (pos != string::npos) { proto->mutable_field(i)->mutable_type_name()->assign( type_name.begin() + pos + 1, type_name.end()); } } for (int i = 0; i < proto->nested_type_size(); ++i) { StripFieldTypeName(proto->mutable_nested_type(i)); } } void StripFieldTypeName(FileDescriptorProto* file_proto) { for (int i = 0; i < file_proto->message_type_size(); ++i) { StripFieldTypeName(file_proto->mutable_message_type(i)); } } TEST_F(ParseDescriptorDebugTest, TestAllDescriptorTypes) { const FileDescriptor* original_file = protobuf_unittest::TestAllTypes::descriptor()->file(); FileDescriptorProto expected; original_file->CopyTo(&expected); // Get the DebugString of the unittest.proto FileDecriptor, which includes // all other descriptor types string debug_string = original_file->DebugString(); // Parse the debug string SetupParser(debug_string.c_str()); FileDescriptorProto parsed; parser_->Parse(input_.get(), &parsed); EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); ASSERT_EQ("", error_collector_.text_) << "Failed to parse:\n" << debug_string; // We now have a FileDescriptorProto, but to compare with the expected we // need to link to a FileDecriptor, then output back to a proto. We'll // also need to give it the same name as the original. parsed.set_name("google/protobuf/unittest.proto"); // We need the imported dependency before we can build our parsed proto const FileDescriptor* public_import = protobuf_unittest_import::PublicImportMessage::descriptor()->file(); FileDescriptorProto public_import_proto; public_import->CopyTo(&public_import_proto); ASSERT_TRUE(pool_.BuildFile(public_import_proto) != NULL); const FileDescriptor* import = protobuf_unittest_import::ImportMessage::descriptor()->file(); FileDescriptorProto import_proto; import->CopyTo(&import_proto); ASSERT_TRUE(pool_.BuildFile(import_proto) != NULL); const FileDescriptor* actual = pool_.BuildFile(parsed); parsed.Clear(); ASSERT_TRUE(actual != NULL) << "Failed to validate:\n" << debug_string; actual->CopyTo(&parsed); ASSERT_TRUE(actual != NULL); // The messages might be in different orders, making them hard to compare. // So, sort the messages in the descriptor protos (including nested messages, // recursively). SortMessages(&expected); SortMessages(&parsed); // I really wanted to use StringDiff here for the debug output on fail, // but the strings are too long for it, and if I increase its max size, // we get a memory allocation failure :( EXPECT_EQ(expected.DebugString(), parsed.DebugString()); } TEST_F(ParseDescriptorDebugTest, TestCustomOptions) { const FileDescriptor* original_file = protobuf_unittest::AggregateMessage::descriptor()->file(); FileDescriptorProto expected; original_file->CopyTo(&expected); string debug_string = original_file->DebugString(); // Parse the debug string SetupParser(debug_string.c_str()); FileDescriptorProto parsed; parser_->Parse(input_.get(), &parsed); EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); ASSERT_EQ("", error_collector_.text_); // We now have a FileDescriptorProto, but to compare with the expected we // need to link to a FileDecriptor, then output back to a proto. We'll // also need to give it the same name as the original. parsed.set_name(original_file->name()); // unittest_custom_options.proto depends on descriptor.proto. const FileDescriptor* import = FileDescriptorProto::descriptor()->file(); FileDescriptorProto import_proto; import->CopyTo(&import_proto); ASSERT_TRUE(pool_.BuildFile(import_proto) != NULL); const FileDescriptor* actual = pool_.BuildFile(parsed); ASSERT_TRUE(actual != NULL); parsed.Clear(); actual->CopyTo(&parsed); // The messages might be in different orders, making them hard to compare. // So, sort the messages in the descriptor protos (including nested messages, // recursively). SortMessages(&expected); SortMessages(&parsed); EXPECT_EQ(expected.DebugString(), parsed.DebugString()); } // Ensure that DebugStringWithOptions(), with |include_comments| set to true, // includes comments from the original parser input in all of the appropriate // places. TEST_F(ParseDescriptorDebugTest, TestCommentsInDebugString) { SetupParser( "// Detached comment before syntax.\n" "\n" "// Syntax comment.\n" "syntax = \"proto2\";\n" "\n" "// Detached comment before package.\n" "\n" "// Package comment.\n" "package comment_test;\n" "\n" "// Detached comment before TestMessage1.\n" "\n" "// Message comment.\n" "//\n" "// More detail in message comment.\n" "message TestMessage1 {\n" "\n" " // Detached comment before foo.\n" "\n" " // Field comment.\n" " optional int32 foo = 1;\n" "\n" " // Detached comment before NestedMessage.\n" "\n" " // Nested-message comment.\n" " message NestedMessage {\n" " optional int32 bar = 1;\n" " }\n" "}\n" "\n" "// Detached comment before MyEnumType.\n" "\n" "// Enum comment.\n" "enum MyEnumType {\n" "\n" " // Detached comment before ASDF.\n" "\n" " // Enum-value comment.\n" " ASDF = 1;\n" "}\n" "\n" "// Detached comment before MyService.\n" "\n" "// Service comment.\n" "service MyService {\n" "\n" " // Detached comment before MyRPCCall.\n" "\n" " // RPC comment.\n" " rpc MyRPCCall(TestMessage1) returns (TestMessage1) { }\n" "}\n"); FileDescriptorProto parsed_desc; parsed_desc.set_name("foo.proto"); SourceLocationTable source_locations; parser_->RecordSourceLocationsTo(&source_locations); parser_->Parse(input_.get(), &parsed_desc); EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); ASSERT_EQ("", error_collector_.text_); // We need to import the FileDescriptorProto to get a FileDescriptor. MockValidationErrorCollector collector(source_locations, &error_collector_); const FileDescriptor* descriptor = pool_.BuildFileCollectingErrors(parsed_desc, &collector); ASSERT_TRUE(descriptor != NULL); // Ensure that each of the comments appears somewhere in the DebugString(). // We don't test the exact comment placement or formatting, because we do not // want to be too fragile here. const char* expected_comments[] = { "Detached comment before syntax.", "Syntax comment.", "Detached comment before package.", "Package comment.", "Detached comment before TestMessage1.", "Message comment.", "More detail in message comment.", "Detached comment before foo.", "Field comment", "Detached comment before NestedMessage.", "Nested-message comment", "Detached comment before MyEnumType.", "Enum comment", "Detached comment before ASDF.", "Enum-value comment", "Detached comment before MyService.", "Service comment", "Detached comment before MyRPCCall.", "RPC comment", }; DebugStringOptions debug_string_options; debug_string_options.include_comments = true; { const string debug_string = descriptor->DebugStringWithOptions(debug_string_options); for (int i = 0; i < GOOGLE_ARRAYSIZE(expected_comments); ++i) { string::size_type found_pos = debug_string.find(expected_comments[i]); EXPECT_TRUE(found_pos != string::npos) << "\"" << expected_comments[i] << "\" not found."; } // Result of DebugStringWithOptions should be parseable. SetupParser(debug_string.c_str()); FileDescriptorProto parsed; parser_->Parse(input_.get(), &parsed); EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); ASSERT_EQ("", error_collector_.text_) << "Failed to parse:\n" << debug_string; } } TEST_F(ParseDescriptorDebugTest, TestMaps) { SetupParser( "syntax = \"proto3\"; " "message Foo { " " message Bar { } " " map enum_message_map = 1; " " map primitive_map = 2; " "} "); FileDescriptorProto original; EXPECT_TRUE(parser_->Parse(input_.get(), &original)); original.set_name("foo.proto"); const FileDescriptor* file = pool_.BuildFile(original); ASSERT_TRUE(file != NULL); // Make sure the debug string uses map syntax and does not have the auto // generated entry. string debug_string = file->DebugString(); EXPECT_TRUE(debug_string.find("map<") != string::npos); EXPECT_TRUE(debug_string.find("option map_entry") == string::npos); EXPECT_TRUE(debug_string.find("MapEntry") == string::npos); // Make sure the descriptor debug string is parsable. FileDescriptorProto parsed; SetupParser(debug_string.c_str()); parsed.set_name("foo.proto"); ASSERT_TRUE(parser_->Parse(input_.get(), &parsed)); original.clear_source_code_info(); parsed.clear_source_code_info(); StripFieldTypeName(&original); StripFieldTypeName(&parsed); EXPECT_EQ(original.DebugString(), parsed.DebugString()); } // =================================================================== // SourceCodeInfo tests. // Follows a path -- as defined by SourceCodeInfo.Location.path -- from a // message to a particular sub-field. // * If the target is itself a message, sets *output_message to point at it, // *output_field to NULL, and *output_index to -1. // * Otherwise, if the target is an element of a repeated field, sets // *output_message to the containing message, *output_field to the descriptor // of the field, and *output_index to the index of the element. // * Otherwise, the target is a field (possibly a repeated field, but not any // one element). Sets *output_message to the containing message, // *output_field to the descriptor of the field, and *output_index to -1. // Returns true if the path was valid, false otherwise. A gTest failure is // recorded before returning false. bool FollowPath(const Message& root, const int* path_begin, const int* path_end, const Message** output_message, const FieldDescriptor** output_field, int* output_index) { if (path_begin == path_end) { // Path refers to this whole message. *output_message = &root; *output_field = NULL; *output_index = -1; return true; } const Descriptor* descriptor = root.GetDescriptor(); const Reflection* reflection = root.GetReflection(); const FieldDescriptor* field = descriptor->FindFieldByNumber(*path_begin); if (field == NULL) { ADD_FAILURE() << descriptor->name() << " has no field number: " << *path_begin; return false; } ++path_begin; if (field->is_repeated()) { if (path_begin == path_end) { // Path refers to the whole repeated field. *output_message = &root; *output_field = field; *output_index = -1; return true; } int index = *path_begin++; int size = reflection->FieldSize(root, field); if (index >= size) { ADD_FAILURE() << descriptor->name() << "." << field->name() << " has size " << size << ", but path contained index: " << index; return false; } if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { // Descend into child message. const Message& child = reflection->GetRepeatedMessage(root, field, index); return FollowPath(child, path_begin, path_end, output_message, output_field, output_index); } else if (path_begin == path_end) { // Path refers to this element. *output_message = &root; *output_field = field; *output_index = index; return true; } else { ADD_FAILURE() << descriptor->name() << "." << field->name() << " is not a message; cannot descend into it."; return false; } } else { if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { const Message& child = reflection->GetMessage(root, field); return FollowPath(child, path_begin, path_end, output_message, output_field, output_index); } else if (path_begin == path_end) { // Path refers to this field. *output_message = &root; *output_field = field; *output_index = -1; return true; } else { ADD_FAILURE() << descriptor->name() << "." << field->name() << " is not a message; cannot descend into it."; return false; } } } // Check if two spans are equal. bool CompareSpans(const RepeatedField& span1, const RepeatedField& span2) { if (span1.size() != span2.size()) return false; for (int i = 0; i < span1.size(); i++) { if (span1.Get(i) != span2.Get(i)) return false; } return true; } // Test fixture for source info tests, which check that source locations are // recorded correctly in FileDescriptorProto.source_code_info.location. class SourceInfoTest : public ParserTest { protected: // The parsed file (initialized by Parse()). FileDescriptorProto file_; // Parse the given text as a .proto file and populate the spans_ map with // all the source location spans in its SourceCodeInfo table. bool Parse(const char* text) { ExtractMarkers(text); SetupParser(text_without_markers_.c_str()); if (!parser_->Parse(input_.get(), &file_)) { return false; } const SourceCodeInfo& source_info = file_.source_code_info(); for (int i = 0; i < source_info.location_size(); i++) { const SourceCodeInfo::Location& location = source_info.location(i); const Message* descriptor_proto = NULL; const FieldDescriptor* field = NULL; int index = 0; if (!FollowPath(file_, location.path().begin(), location.path().end(), &descriptor_proto, &field, &index)) { return false; } spans_.insert( std::make_pair(SpanKey(*descriptor_proto, field, index), &location)); } return true; } virtual void TearDown() { EXPECT_TRUE(spans_.empty()) << "Forgot to call HasSpan() for:\n" << spans_.begin()->second->DebugString(); } // ----------------------------------------------------------------- // HasSpan() checks that the span of source code delimited by the given // tags (comments) correspond via the SourceCodeInfo table to the given // part of the FileDescriptorProto. (If unclear, look at the actual tests; // it should quickly become obvious.) bool HasSpan(char start_marker, char end_marker, const Message& descriptor_proto) { return HasSpanWithComment( start_marker, end_marker, descriptor_proto, NULL, -1, NULL, NULL, NULL); } bool HasSpanWithComment(char start_marker, char end_marker, const Message& descriptor_proto, const char* expected_leading_comments, const char* expected_trailing_comments, const char* expected_leading_detached_comments) { return HasSpanWithComment( start_marker, end_marker, descriptor_proto, NULL, -1, expected_leading_comments, expected_trailing_comments, expected_leading_detached_comments); } bool HasSpan(char start_marker, char end_marker, const Message& descriptor_proto, const string& field_name) { return HasSpan(start_marker, end_marker, descriptor_proto, field_name, -1); } bool HasSpan(char start_marker, char end_marker, const Message& descriptor_proto, const string& field_name, int index) { return HasSpan(start_marker, end_marker, descriptor_proto, field_name, index, NULL, NULL, NULL); } bool HasSpan(char start_marker, char end_marker, const Message& descriptor_proto, const string& field_name, int index, const char* expected_leading_comments, const char* expected_trailing_comments, const char* expected_leading_detached_comments) { const FieldDescriptor* field = descriptor_proto.GetDescriptor()->FindFieldByName(field_name); if (field == NULL) { ADD_FAILURE() << descriptor_proto.GetDescriptor()->name() << " has no such field: " << field_name; return false; } return HasSpanWithComment( start_marker, end_marker, descriptor_proto, field, index, expected_leading_comments, expected_trailing_comments, expected_leading_detached_comments); } bool HasSpan(const Message& descriptor_proto) { return HasSpanWithComment( '\0', '\0', descriptor_proto, NULL, -1, NULL, NULL, NULL); } bool HasSpan(const Message& descriptor_proto, const string& field_name) { return HasSpan('\0', '\0', descriptor_proto, field_name, -1); } bool HasSpan(const Message& descriptor_proto, const string& field_name, int index) { return HasSpan('\0', '\0', descriptor_proto, field_name, index); } bool HasSpanWithComment( char start_marker, char end_marker, const Message& descriptor_proto, const FieldDescriptor* field, int index, const char* expected_leading_comments, const char* expected_trailing_comments, const char* expected_leading_detached_comments) { std::pair range = spans_.equal_range(SpanKey(descriptor_proto, field, index)); if (start_marker == '\0') { if (range.first == range.second) { return false; } else { spans_.erase(range.first); return true; } } else { std::pair start_pos = FindOrDie(markers_, start_marker); std::pair end_pos = FindOrDie(markers_, end_marker); RepeatedField expected_span; expected_span.Add(start_pos.first); expected_span.Add(start_pos.second); if (end_pos.first != start_pos.first) { expected_span.Add(end_pos.first); } expected_span.Add(end_pos.second); for (SpanMap::iterator iter = range.first; iter != range.second; ++iter) { if (CompareSpans(expected_span, iter->second->span())) { if (expected_leading_comments == NULL) { EXPECT_FALSE(iter->second->has_leading_comments()); } else { EXPECT_TRUE(iter->second->has_leading_comments()); EXPECT_EQ(expected_leading_comments, iter->second->leading_comments()); } if (expected_trailing_comments == NULL) { EXPECT_FALSE(iter->second->has_trailing_comments()); } else { EXPECT_TRUE(iter->second->has_trailing_comments()); EXPECT_EQ(expected_trailing_comments, iter->second->trailing_comments()); } if (expected_leading_detached_comments == NULL) { EXPECT_EQ(0, iter->second->leading_detached_comments_size()); } else { EXPECT_EQ( expected_leading_detached_comments, Join(iter->second->leading_detached_comments(), "\n")); } spans_.erase(iter); return true; } } return false; } } private: struct SpanKey { const Message* descriptor_proto; const FieldDescriptor* field; int index; inline SpanKey() {} inline SpanKey(const Message& descriptor_proto_param, const FieldDescriptor* field_param, int index_param) : descriptor_proto(&descriptor_proto_param), field(field_param), index(index_param) {} inline bool operator<(const SpanKey& other) const { if (descriptor_proto < other.descriptor_proto) return true; if (descriptor_proto > other.descriptor_proto) return false; if (field < other.field) return true; if (field > other.field) return false; return index < other.index; } }; typedef std::multimap SpanMap; SpanMap spans_; std::map > markers_; string text_without_markers_; void ExtractMarkers(const char* text) { markers_.clear(); text_without_markers_.clear(); int line = 0; int column = 0; while (*text != '\0') { if (*text == '$') { ++text; GOOGLE_CHECK_NE('\0', *text); if (*text == '$') { text_without_markers_ += '$'; ++column; } else { markers_[*text] = std::make_pair(line, column); ++text; GOOGLE_CHECK_EQ('$', *text); } } else if (*text == '\n') { ++line; column = 0; text_without_markers_ += *text; } else { text_without_markers_ += *text; ++column; } ++text; } } }; TEST_F(SourceInfoTest, BasicFileDecls) { EXPECT_TRUE(Parse( "$a$syntax = \"proto2\";$i$\n" "package $b$foo.bar$c$;\n" "import $d$\"baz.proto\"$e$;\n" "import $f$\"qux.proto\"$g$;$h$\n" "\n" "// comment ignored\n")); EXPECT_TRUE(HasSpan('a', 'h', file_)); EXPECT_TRUE(HasSpan('b', 'c', file_, "package")); EXPECT_TRUE(HasSpan('d', 'e', file_, "dependency", 0)); EXPECT_TRUE(HasSpan('f', 'g', file_, "dependency", 1)); EXPECT_TRUE(HasSpan('a', 'i', file_, "syntax")); } TEST_F(SourceInfoTest, Messages) { EXPECT_TRUE(Parse( "$a$message $b$Foo$c$ {}$d$\n" "$e$message $f$Bar$g$ {}$h$\n")); EXPECT_TRUE(HasSpan('a', 'd', file_.message_type(0))); EXPECT_TRUE(HasSpan('b', 'c', file_.message_type(0), "name")); EXPECT_TRUE(HasSpan('e', 'h', file_.message_type(1))); EXPECT_TRUE(HasSpan('f', 'g', file_.message_type(1), "name")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); } TEST_F(SourceInfoTest, Fields) { EXPECT_TRUE(Parse( "message Foo {\n" " $a$optional$b$ $c$int32$d$ $e$bar$f$ = $g$1$h$;$i$\n" " $j$repeated$k$ $l$X.Y$m$ $n$baz$o$ = $p$2$q$;$r$\n" "}\n")); const FieldDescriptorProto& field1 = file_.message_type(0).field(0); const FieldDescriptorProto& field2 = file_.message_type(0).field(1); EXPECT_TRUE(HasSpan('a', 'i', field1)); EXPECT_TRUE(HasSpan('a', 'b', field1, "label")); EXPECT_TRUE(HasSpan('c', 'd', field1, "type")); EXPECT_TRUE(HasSpan('e', 'f', field1, "name")); EXPECT_TRUE(HasSpan('g', 'h', field1, "number")); EXPECT_TRUE(HasSpan('j', 'r', field2)); EXPECT_TRUE(HasSpan('j', 'k', field2, "label")); EXPECT_TRUE(HasSpan('l', 'm', field2, "type_name")); EXPECT_TRUE(HasSpan('n', 'o', field2, "name")); EXPECT_TRUE(HasSpan('p', 'q', field2, "number")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.message_type(0))); EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); } TEST_F(SourceInfoTest, Extensions) { EXPECT_TRUE(Parse( "$a$extend $b$Foo$c$ {\n" " $d$optional$e$ int32 bar = 1;$f$\n" " $g$repeated$h$ X.Y baz = 2;$i$\n" "}$j$\n" "$k$extend $l$Bar$m$ {\n" " $n$optional int32 qux = 1;$o$\n" "}$p$\n")); const FieldDescriptorProto& field1 = file_.extension(0); const FieldDescriptorProto& field2 = file_.extension(1); const FieldDescriptorProto& field3 = file_.extension(2); EXPECT_TRUE(HasSpan('a', 'j', file_, "extension")); EXPECT_TRUE(HasSpan('k', 'p', file_, "extension")); EXPECT_TRUE(HasSpan('d', 'f', field1)); EXPECT_TRUE(HasSpan('d', 'e', field1, "label")); EXPECT_TRUE(HasSpan('b', 'c', field1, "extendee")); EXPECT_TRUE(HasSpan('g', 'i', field2)); EXPECT_TRUE(HasSpan('g', 'h', field2, "label")); EXPECT_TRUE(HasSpan('b', 'c', field2, "extendee")); EXPECT_TRUE(HasSpan('n', 'o', field3)); EXPECT_TRUE(HasSpan('l', 'm', field3, "extendee")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(field1, "type")); EXPECT_TRUE(HasSpan(field1, "name")); EXPECT_TRUE(HasSpan(field1, "number")); EXPECT_TRUE(HasSpan(field2, "type_name")); EXPECT_TRUE(HasSpan(field2, "name")); EXPECT_TRUE(HasSpan(field2, "number")); EXPECT_TRUE(HasSpan(field3, "label")); EXPECT_TRUE(HasSpan(field3, "type")); EXPECT_TRUE(HasSpan(field3, "name")); EXPECT_TRUE(HasSpan(field3, "number")); } TEST_F(SourceInfoTest, NestedExtensions) { EXPECT_TRUE(Parse( "message Message {\n" " $a$extend $b$Foo$c$ {\n" " $d$optional$e$ int32 bar = 1;$f$\n" " $g$repeated$h$ X.Y baz = 2;$i$\n" " }$j$\n" " $k$extend $l$Bar$m$ {\n" " $n$optional int32 qux = 1;$o$\n" " }$p$\n" "}\n")); const FieldDescriptorProto& field1 = file_.message_type(0).extension(0); const FieldDescriptorProto& field2 = file_.message_type(0).extension(1); const FieldDescriptorProto& field3 = file_.message_type(0).extension(2); EXPECT_TRUE(HasSpan('a', 'j', file_.message_type(0), "extension")); EXPECT_TRUE(HasSpan('k', 'p', file_.message_type(0), "extension")); EXPECT_TRUE(HasSpan('d', 'f', field1)); EXPECT_TRUE(HasSpan('d', 'e', field1, "label")); EXPECT_TRUE(HasSpan('b', 'c', field1, "extendee")); EXPECT_TRUE(HasSpan('g', 'i', field2)); EXPECT_TRUE(HasSpan('g', 'h', field2, "label")); EXPECT_TRUE(HasSpan('b', 'c', field2, "extendee")); EXPECT_TRUE(HasSpan('n', 'o', field3)); EXPECT_TRUE(HasSpan('l', 'm', field3, "extendee")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.message_type(0))); EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); EXPECT_TRUE(HasSpan(field1, "type")); EXPECT_TRUE(HasSpan(field1, "name")); EXPECT_TRUE(HasSpan(field1, "number")); EXPECT_TRUE(HasSpan(field2, "type_name")); EXPECT_TRUE(HasSpan(field2, "name")); EXPECT_TRUE(HasSpan(field2, "number")); EXPECT_TRUE(HasSpan(field3, "label")); EXPECT_TRUE(HasSpan(field3, "type")); EXPECT_TRUE(HasSpan(field3, "name")); EXPECT_TRUE(HasSpan(field3, "number")); } TEST_F(SourceInfoTest, ExtensionRanges) { EXPECT_TRUE(Parse( "message Message {\n" " $a$extensions $b$1$c$ to $d$4$e$, $f$6$g$;$h$\n" " $i$extensions $j$8$k$ to $l$max$m$;$n$\n" "}\n")); const DescriptorProto::ExtensionRange& range1 = file_.message_type(0).extension_range(0); const DescriptorProto::ExtensionRange& range2 = file_.message_type(0).extension_range(1); const DescriptorProto::ExtensionRange& range3 = file_.message_type(0).extension_range(2); EXPECT_TRUE(HasSpan('a', 'h', file_.message_type(0), "extension_range")); EXPECT_TRUE(HasSpan('i', 'n', file_.message_type(0), "extension_range")); EXPECT_TRUE(HasSpan('b', 'e', range1)); EXPECT_TRUE(HasSpan('b', 'c', range1, "start")); EXPECT_TRUE(HasSpan('d', 'e', range1, "end")); EXPECT_TRUE(HasSpan('f', 'g', range2)); EXPECT_TRUE(HasSpan('f', 'g', range2, "start")); EXPECT_TRUE(HasSpan('f', 'g', range2, "end")); EXPECT_TRUE(HasSpan('j', 'm', range3)); EXPECT_TRUE(HasSpan('j', 'k', range3, "start")); EXPECT_TRUE(HasSpan('l', 'm', range3, "end")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.message_type(0))); EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); } TEST_F(SourceInfoTest, Oneofs) { EXPECT_TRUE(Parse( "message Foo {\n" " $a$oneof $c$foo$d$ {\n" " $e$int32$f$ $g$a$h$ = $i$1$j$;$k$\n" " }$r$\n" "}\n")); const OneofDescriptorProto& oneof_decl = file_.message_type(0).oneof_decl(0); const FieldDescriptorProto& field = file_.message_type(0).field(0); EXPECT_TRUE(HasSpan('a', 'r', oneof_decl)); EXPECT_TRUE(HasSpan('c', 'd', oneof_decl, "name")); EXPECT_TRUE(HasSpan('e', 'k', field)); EXPECT_TRUE(HasSpan('e', 'f', field, "type")); EXPECT_TRUE(HasSpan('g', 'h', field, "name")); EXPECT_TRUE(HasSpan('i', 'j', field, "number")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.message_type(0))); EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); } TEST_F(SourceInfoTest, NestedMessages) { EXPECT_TRUE(Parse( "message Foo {\n" " $a$message $b$Bar$c$ {\n" " $d$message $e$Baz$f$ {}$g$\n" " }$h$\n" " $i$message $j$Qux$k$ {}$l$\n" "}\n")); const DescriptorProto& bar = file_.message_type(0).nested_type(0); const DescriptorProto& baz = bar.nested_type(0); const DescriptorProto& qux = file_.message_type(0).nested_type(1); EXPECT_TRUE(HasSpan('a', 'h', bar)); EXPECT_TRUE(HasSpan('b', 'c', bar, "name")); EXPECT_TRUE(HasSpan('d', 'g', baz)); EXPECT_TRUE(HasSpan('e', 'f', baz, "name")); EXPECT_TRUE(HasSpan('i', 'l', qux)); EXPECT_TRUE(HasSpan('j', 'k', qux, "name")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.message_type(0))); EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); } TEST_F(SourceInfoTest, Groups) { EXPECT_TRUE(Parse( "message Foo {\n" " message Bar {}\n" " $a$optional$b$ $c$group$d$ $e$Baz$f$ = $g$1$h$ {\n" " $i$message Qux {}$j$\n" " }$k$\n" "}\n")); const DescriptorProto& bar = file_.message_type(0).nested_type(0); const DescriptorProto& baz = file_.message_type(0).nested_type(1); const DescriptorProto& qux = baz.nested_type(0); const FieldDescriptorProto& field = file_.message_type(0).field(0); EXPECT_TRUE(HasSpan('a', 'k', field)); EXPECT_TRUE(HasSpan('a', 'b', field, "label")); EXPECT_TRUE(HasSpan('c', 'd', field, "type")); EXPECT_TRUE(HasSpan('e', 'f', field, "name")); EXPECT_TRUE(HasSpan('e', 'f', field, "type_name")); EXPECT_TRUE(HasSpan('g', 'h', field, "number")); EXPECT_TRUE(HasSpan('a', 'k', baz)); EXPECT_TRUE(HasSpan('e', 'f', baz, "name")); EXPECT_TRUE(HasSpan('i', 'j', qux)); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.message_type(0))); EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); EXPECT_TRUE(HasSpan(bar)); EXPECT_TRUE(HasSpan(bar, "name")); EXPECT_TRUE(HasSpan(qux, "name")); } TEST_F(SourceInfoTest, Enums) { EXPECT_TRUE(Parse( "$a$enum $b$Foo$c$ {}$d$\n" "$e$enum $f$Bar$g$ {}$h$\n")); EXPECT_TRUE(HasSpan('a', 'd', file_.enum_type(0))); EXPECT_TRUE(HasSpan('b', 'c', file_.enum_type(0), "name")); EXPECT_TRUE(HasSpan('e', 'h', file_.enum_type(1))); EXPECT_TRUE(HasSpan('f', 'g', file_.enum_type(1), "name")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); } TEST_F(SourceInfoTest, EnumValues) { EXPECT_TRUE(Parse( "enum Foo {\n" " $a$BAR$b$ = $c$1$d$;$e$\n" " $f$BAZ$g$ = $h$2$i$;$j$\n" "}")); const EnumValueDescriptorProto& bar = file_.enum_type(0).value(0); const EnumValueDescriptorProto& baz = file_.enum_type(0).value(1); EXPECT_TRUE(HasSpan('a', 'e', bar)); EXPECT_TRUE(HasSpan('a', 'b', bar, "name")); EXPECT_TRUE(HasSpan('c', 'd', bar, "number")); EXPECT_TRUE(HasSpan('f', 'j', baz)); EXPECT_TRUE(HasSpan('f', 'g', baz, "name")); EXPECT_TRUE(HasSpan('h', 'i', baz, "number")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.enum_type(0))); EXPECT_TRUE(HasSpan(file_.enum_type(0), "name")); } TEST_F(SourceInfoTest, NestedEnums) { EXPECT_TRUE(Parse( "message Foo {\n" " $a$enum $b$Bar$c$ {}$d$\n" " $e$enum $f$Baz$g$ {}$h$\n" "}\n")); const EnumDescriptorProto& bar = file_.message_type(0).enum_type(0); const EnumDescriptorProto& baz = file_.message_type(0).enum_type(1); EXPECT_TRUE(HasSpan('a', 'd', bar)); EXPECT_TRUE(HasSpan('b', 'c', bar, "name")); EXPECT_TRUE(HasSpan('e', 'h', baz)); EXPECT_TRUE(HasSpan('f', 'g', baz, "name")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.message_type(0))); EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); } TEST_F(SourceInfoTest, Services) { EXPECT_TRUE(Parse( "$a$service $b$Foo$c$ {}$d$\n" "$e$service $f$Bar$g$ {}$h$\n")); EXPECT_TRUE(HasSpan('a', 'd', file_.service(0))); EXPECT_TRUE(HasSpan('b', 'c', file_.service(0), "name")); EXPECT_TRUE(HasSpan('e', 'h', file_.service(1))); EXPECT_TRUE(HasSpan('f', 'g', file_.service(1), "name")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); } TEST_F(SourceInfoTest, MethodsAndStreams) { EXPECT_TRUE(Parse( "service Foo {\n" " $a$rpc $b$Bar$c$($d$X$e$) returns($f$Y$g$);$h$" " $i$rpc $j$Baz$k$($l$Z$m$) returns($n$W$o$);$p$" "}")); const MethodDescriptorProto& bar = file_.service(0).method(0); const MethodDescriptorProto& baz = file_.service(0).method(1); EXPECT_TRUE(HasSpan('a', 'h', bar)); EXPECT_TRUE(HasSpan('b', 'c', bar, "name")); EXPECT_TRUE(HasSpan('d', 'e', bar, "input_type")); EXPECT_TRUE(HasSpan('f', 'g', bar, "output_type")); EXPECT_TRUE(HasSpan('i', 'p', baz)); EXPECT_TRUE(HasSpan('j', 'k', baz, "name")); EXPECT_TRUE(HasSpan('l', 'm', baz, "input_type")); EXPECT_TRUE(HasSpan('n', 'o', baz, "output_type")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.service(0))); EXPECT_TRUE(HasSpan(file_.service(0), "name")); } TEST_F(SourceInfoTest, Options) { EXPECT_TRUE(Parse( "$a$option $b$foo$c$.$d$($e$bar.baz$f$)$g$ = " "$h$123$i$;$j$\n" "$k$option qux = $l$-123$m$;$n$\n" "$o$option corge = $p$abc$q$;$r$\n" "$s$option grault = $t$'blah'$u$;$v$\n" "$w$option garply = $x${ yadda yadda }$y$;$z$\n" "$0$option waldo = $1$123.0$2$;$3$\n" )); const UninterpretedOption& option1 = file_.options().uninterpreted_option(0); const UninterpretedOption& option2 = file_.options().uninterpreted_option(1); const UninterpretedOption& option3 = file_.options().uninterpreted_option(2); const UninterpretedOption& option4 = file_.options().uninterpreted_option(3); const UninterpretedOption& option5 = file_.options().uninterpreted_option(4); const UninterpretedOption& option6 = file_.options().uninterpreted_option(5); EXPECT_TRUE(HasSpan('a', 'j', file_.options())); EXPECT_TRUE(HasSpan('a', 'j', option1)); EXPECT_TRUE(HasSpan('b', 'g', option1, "name")); EXPECT_TRUE(HasSpan('b', 'c', option1.name(0))); EXPECT_TRUE(HasSpan('b', 'c', option1.name(0), "name_part")); EXPECT_TRUE(HasSpan('d', 'g', option1.name(1))); EXPECT_TRUE(HasSpan('e', 'f', option1.name(1), "name_part")); EXPECT_TRUE(HasSpan('h', 'i', option1, "positive_int_value")); EXPECT_TRUE(HasSpan('k', 'n', file_.options())); EXPECT_TRUE(HasSpan('l', 'm', option2, "negative_int_value")); EXPECT_TRUE(HasSpan('o', 'r', file_.options())); EXPECT_TRUE(HasSpan('p', 'q', option3, "identifier_value")); EXPECT_TRUE(HasSpan('s', 'v', file_.options())); EXPECT_TRUE(HasSpan('t', 'u', option4, "string_value")); EXPECT_TRUE(HasSpan('w', 'z', file_.options())); EXPECT_TRUE(HasSpan('x', 'y', option5, "aggregate_value")); EXPECT_TRUE(HasSpan('0', '3', file_.options())); EXPECT_TRUE(HasSpan('1', '2', option6, "double_value")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(option2)); EXPECT_TRUE(HasSpan(option3)); EXPECT_TRUE(HasSpan(option4)); EXPECT_TRUE(HasSpan(option5)); EXPECT_TRUE(HasSpan(option6)); EXPECT_TRUE(HasSpan(option2, "name")); EXPECT_TRUE(HasSpan(option3, "name")); EXPECT_TRUE(HasSpan(option4, "name")); EXPECT_TRUE(HasSpan(option5, "name")); EXPECT_TRUE(HasSpan(option6, "name")); EXPECT_TRUE(HasSpan(option2.name(0))); EXPECT_TRUE(HasSpan(option3.name(0))); EXPECT_TRUE(HasSpan(option4.name(0))); EXPECT_TRUE(HasSpan(option5.name(0))); EXPECT_TRUE(HasSpan(option6.name(0))); EXPECT_TRUE(HasSpan(option2.name(0), "name_part")); EXPECT_TRUE(HasSpan(option3.name(0), "name_part")); EXPECT_TRUE(HasSpan(option4.name(0), "name_part")); EXPECT_TRUE(HasSpan(option5.name(0), "name_part")); EXPECT_TRUE(HasSpan(option6.name(0), "name_part")); } TEST_F(SourceInfoTest, ScopedOptions) { EXPECT_TRUE(Parse( "message Foo {\n" " $a$option mopt = 1;$b$\n" "}\n" "enum Bar {\n" " $c$option eopt = 1;$d$\n" "}\n" "service Baz {\n" " $e$option sopt = 1;$f$\n" " rpc M(X) returns(Y) {\n" " $g$option mopt = 1;$h$\n" " }\n" " rpc MS4($1$stream$2$ X) returns($3$stream$4$ Y) {\n" " $k$option mopt = 1;$l$\n" " }\n" "}\n")); EXPECT_TRUE(HasSpan('a', 'b', file_.message_type(0).options())); EXPECT_TRUE(HasSpan('c', 'd', file_.enum_type(0).options())); EXPECT_TRUE(HasSpan('e', 'f', file_.service(0).options())); EXPECT_TRUE(HasSpan('g', 'h', file_.service(0).method(0).options())); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.message_type(0))); EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); EXPECT_TRUE(HasSpan(file_.message_type(0).options() .uninterpreted_option(0))); EXPECT_TRUE(HasSpan(file_.message_type(0).options() .uninterpreted_option(0), "name")); EXPECT_TRUE(HasSpan(file_.message_type(0).options() .uninterpreted_option(0).name(0))); EXPECT_TRUE(HasSpan(file_.message_type(0).options() .uninterpreted_option(0).name(0), "name_part")); EXPECT_TRUE(HasSpan(file_.message_type(0).options() .uninterpreted_option(0), "positive_int_value")); EXPECT_TRUE(HasSpan(file_.enum_type(0))); EXPECT_TRUE(HasSpan(file_.enum_type(0), "name")); EXPECT_TRUE(HasSpan(file_.enum_type(0).options() .uninterpreted_option(0))); EXPECT_TRUE(HasSpan(file_.enum_type(0).options() .uninterpreted_option(0), "name")); EXPECT_TRUE(HasSpan(file_.enum_type(0).options() .uninterpreted_option(0).name(0))); EXPECT_TRUE(HasSpan(file_.enum_type(0).options() .uninterpreted_option(0).name(0), "name_part")); EXPECT_TRUE(HasSpan(file_.enum_type(0).options() .uninterpreted_option(0), "positive_int_value")); EXPECT_TRUE(HasSpan(file_.service(0))); EXPECT_TRUE(HasSpan(file_.service(0), "name")); EXPECT_TRUE(HasSpan(file_.service(0).method(0))); EXPECT_TRUE(HasSpan(file_.service(0).options() .uninterpreted_option(0))); EXPECT_TRUE(HasSpan(file_.service(0).options() .uninterpreted_option(0), "name")); EXPECT_TRUE(HasSpan(file_.service(0).options() .uninterpreted_option(0).name(0))); EXPECT_TRUE(HasSpan(file_.service(0).options() .uninterpreted_option(0).name(0), "name_part")); EXPECT_TRUE(HasSpan(file_.service(0).options() .uninterpreted_option(0), "positive_int_value")); EXPECT_TRUE(HasSpan(file_.service(0).method(0), "name")); EXPECT_TRUE(HasSpan(file_.service(0).method(0), "input_type")); EXPECT_TRUE(HasSpan(file_.service(0).method(0), "output_type")); EXPECT_TRUE(HasSpan(file_.service(0).method(0).options() .uninterpreted_option(0))); EXPECT_TRUE(HasSpan(file_.service(0).method(0).options() .uninterpreted_option(0), "name")); EXPECT_TRUE(HasSpan(file_.service(0).method(0).options() .uninterpreted_option(0).name(0))); EXPECT_TRUE(HasSpan(file_.service(0).method(0).options() .uninterpreted_option(0).name(0), "name_part")); EXPECT_TRUE(HasSpan(file_.service(0).method(0).options() .uninterpreted_option(0), "positive_int_value")); EXPECT_TRUE(HasSpan('k', 'l', file_.service(0).method(1).options())); EXPECT_TRUE(HasSpan(file_.service(0).method(1))); EXPECT_TRUE(HasSpan(file_.service(0).method(1), "name")); EXPECT_TRUE(HasSpan(file_.service(0).method(1), "input_type")); EXPECT_TRUE(HasSpan(file_.service(0).method(1), "output_type")); EXPECT_TRUE(HasSpan(file_.service(0).method(1).options() .uninterpreted_option(0))); EXPECT_TRUE(HasSpan(file_.service(0).method(1).options() .uninterpreted_option(0), "name")); EXPECT_TRUE(HasSpan(file_.service(0).method(1).options() .uninterpreted_option(0).name(0))); EXPECT_TRUE(HasSpan(file_.service(0).method(1).options() .uninterpreted_option(0).name(0), "name_part")); EXPECT_TRUE(HasSpan(file_.service(0).method(1).options() .uninterpreted_option(0), "positive_int_value")); EXPECT_TRUE(HasSpan('1', '2', file_.service(0).method(1), "client_streaming")); EXPECT_TRUE(HasSpan('3', '4', file_.service(0).method(1), "server_streaming")); } TEST_F(SourceInfoTest, FieldOptions) { // The actual "name = value" pairs are parsed by the same code as for // top-level options so we won't re-test that -- just make sure that the // syntax used for field options is understood. EXPECT_TRUE(Parse( "message Foo {" " optional int32 bar = 1 " "$a$[default=$b$123$c$,$d$opt1=123$e$," "$f$opt2='hi'$g$]$h$;" "}\n" )); const FieldDescriptorProto& field = file_.message_type(0).field(0); const UninterpretedOption& option1 = field.options().uninterpreted_option(0); const UninterpretedOption& option2 = field.options().uninterpreted_option(1); EXPECT_TRUE(HasSpan('a', 'h', field.options())); EXPECT_TRUE(HasSpan('b', 'c', field, "default_value")); EXPECT_TRUE(HasSpan('d', 'e', option1)); EXPECT_TRUE(HasSpan('f', 'g', option2)); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.message_type(0))); EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); EXPECT_TRUE(HasSpan(field)); EXPECT_TRUE(HasSpan(field, "label")); EXPECT_TRUE(HasSpan(field, "type")); EXPECT_TRUE(HasSpan(field, "name")); EXPECT_TRUE(HasSpan(field, "number")); EXPECT_TRUE(HasSpan(option1, "name")); EXPECT_TRUE(HasSpan(option2, "name")); EXPECT_TRUE(HasSpan(option1.name(0))); EXPECT_TRUE(HasSpan(option2.name(0))); EXPECT_TRUE(HasSpan(option1.name(0), "name_part")); EXPECT_TRUE(HasSpan(option2.name(0), "name_part")); EXPECT_TRUE(HasSpan(option1, "positive_int_value")); EXPECT_TRUE(HasSpan(option2, "string_value")); } TEST_F(SourceInfoTest, EnumValueOptions) { // The actual "name = value" pairs are parsed by the same code as for // top-level options so we won't re-test that -- just make sure that the // syntax used for enum options is understood. EXPECT_TRUE(Parse( "enum Foo {" " BAR = 1 $a$[$b$opt1=123$c$,$d$opt2='hi'$e$]$f$;" "}\n" )); const EnumValueDescriptorProto& value = file_.enum_type(0).value(0); const UninterpretedOption& option1 = value.options().uninterpreted_option(0); const UninterpretedOption& option2 = value.options().uninterpreted_option(1); EXPECT_TRUE(HasSpan('a', 'f', value.options())); EXPECT_TRUE(HasSpan('b', 'c', option1)); EXPECT_TRUE(HasSpan('d', 'e', option2)); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(file_.enum_type(0))); EXPECT_TRUE(HasSpan(file_.enum_type(0), "name")); EXPECT_TRUE(HasSpan(value)); EXPECT_TRUE(HasSpan(value, "name")); EXPECT_TRUE(HasSpan(value, "number")); EXPECT_TRUE(HasSpan(option1, "name")); EXPECT_TRUE(HasSpan(option2, "name")); EXPECT_TRUE(HasSpan(option1.name(0))); EXPECT_TRUE(HasSpan(option2.name(0))); EXPECT_TRUE(HasSpan(option1.name(0), "name_part")); EXPECT_TRUE(HasSpan(option2.name(0), "name_part")); EXPECT_TRUE(HasSpan(option1, "positive_int_value")); EXPECT_TRUE(HasSpan(option2, "string_value")); } TEST_F(SourceInfoTest, DocComments) { EXPECT_TRUE(Parse( "// Foo leading\n" "// line 2\n" "$a$message Foo {\n" " // Foo trailing\n" " // line 2\n" "\n" " // detached\n" "\n" " // bar leading\n" " $b$optional int32 bar = 1;$c$\n" " // bar trailing\n" "}$d$\n" "// ignored\n" )); const DescriptorProto& foo = file_.message_type(0); const FieldDescriptorProto& bar = foo.field(0); EXPECT_TRUE(HasSpanWithComment('a', 'd', foo, " Foo leading\n line 2\n", " Foo trailing\n line 2\n", NULL)); EXPECT_TRUE(HasSpanWithComment('b', 'c', bar, " bar leading\n", " bar trailing\n", " detached\n")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(foo, "name")); EXPECT_TRUE(HasSpan(bar, "label")); EXPECT_TRUE(HasSpan(bar, "type")); EXPECT_TRUE(HasSpan(bar, "name")); EXPECT_TRUE(HasSpan(bar, "number")); } TEST_F(SourceInfoTest, DocComments2) { EXPECT_TRUE(Parse( "// detached before message.\n" "\n" "// Foo leading\n" "// line 2\n" "$a$message Foo {\n" " /* Foo trailing\n" " * line 2 */\n" " // detached\n" " /* bar leading\n" " */" " $b$optional int32 bar = 1;$c$ // bar trailing\n" " // ignored detached\n" "}$d$\n" "// ignored\n" "\n" "// detached before option\n" "\n" "// option leading\n" "$e$option baz = 123;$f$\n" "// option trailing\n" )); const DescriptorProto& foo = file_.message_type(0); const FieldDescriptorProto& bar = foo.field(0); const UninterpretedOption& baz = file_.options().uninterpreted_option(0); EXPECT_TRUE(HasSpanWithComment('a', 'd', foo, " Foo leading\n line 2\n", " Foo trailing\n line 2 ", " detached before message.\n")); EXPECT_TRUE(HasSpanWithComment('b', 'c', bar, " bar leading\n", " bar trailing\n", " detached\n")); EXPECT_TRUE(HasSpanWithComment('e', 'f', baz, " option leading\n", " option trailing\n", " detached before option\n")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(foo, "name")); EXPECT_TRUE(HasSpan(bar, "label")); EXPECT_TRUE(HasSpan(bar, "type")); EXPECT_TRUE(HasSpan(bar, "name")); EXPECT_TRUE(HasSpan(bar, "number")); EXPECT_TRUE(HasSpan(file_.options())); EXPECT_TRUE(HasSpan(baz, "name")); EXPECT_TRUE(HasSpan(baz.name(0))); EXPECT_TRUE(HasSpan(baz.name(0), "name_part")); EXPECT_TRUE(HasSpan(baz, "positive_int_value")); } TEST_F(SourceInfoTest, DocComments3) { EXPECT_TRUE(Parse( "$a$message Foo {\n" " // bar leading\n" " $b$optional int32 bar = 1 [(baz.qux) = {}];$c$\n" " // bar trailing\n" "}$d$\n" "// ignored\n" )); const DescriptorProto& foo = file_.message_type(0); const FieldDescriptorProto& bar = foo.field(0); EXPECT_TRUE(HasSpanWithComment('b', 'c', bar, " bar leading\n", " bar trailing\n", NULL)); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(foo)); EXPECT_TRUE(HasSpan(foo, "name")); EXPECT_TRUE(HasSpan(bar, "label")); EXPECT_TRUE(HasSpan(bar, "type")); EXPECT_TRUE(HasSpan(bar, "name")); EXPECT_TRUE(HasSpan(bar, "number")); EXPECT_TRUE(HasSpan(bar.options())); EXPECT_TRUE(HasSpan(bar.options().uninterpreted_option(0))); EXPECT_TRUE(HasSpan(bar.options().uninterpreted_option(0), "name")); EXPECT_TRUE(HasSpan(bar.options().uninterpreted_option(0).name(0))); EXPECT_TRUE(HasSpan( bar.options().uninterpreted_option(0).name(0), "name_part")); EXPECT_TRUE(HasSpan( bar.options().uninterpreted_option(0), "aggregate_value")); } TEST_F(SourceInfoTest, DocCommentsTopLevel) { EXPECT_TRUE(Parse( "// detached before syntax paragraph 1\n" "\n" "// detached before syntax paragraph 2\n" "\n" "// syntax leading\n" "$a$syntax = \"proto2\";$b$\n" "// syntax trailing\n" "\n" "// syntax-package detached comments\n" "\n" ";\n" "\n" "// detached after empty before package\n" "\n" "// package leading\n" "package $c$foo$d$;\n" "// package trailing\n" "\n" "// ignored detach\n" "\n")); EXPECT_TRUE(HasSpan('a', 'b', file_, "syntax", -1, " syntax leading\n", " syntax trailing\n", " detached before syntax paragraph 1\n" "\n" " detached before syntax paragraph 2\n")); EXPECT_TRUE(HasSpan('c', 'd', file_, "package", -1, " package leading\n", " package trailing\n", " syntax-package detached comments\n" "\n" " detached after empty before package\n")); // ignore these. EXPECT_TRUE(HasSpan(file_)); } TEST_F(SourceInfoTest, DocCommentsOneof) { EXPECT_TRUE(Parse( "// Foo leading\n" "$a$message Foo {\n" " /* Foo trailing\n" " */\n" " // detached before oneof\n" " /* bar leading\n" " * line 2 */\n" " $b$oneof bar {\n" " /* bar trailing\n" " * line 2 */\n" " // detached before bar_int\n" " /* bar_int leading\n" " */\n" " $c$int32 bar_int = 1;$d$ // bar_int trailing\n" " // detach comment ignored\n" " }$e$\n" "}$f$\n")); const DescriptorProto& foo = file_.message_type(0); const OneofDescriptorProto& bar = foo.oneof_decl(0); const FieldDescriptorProto& bar_int = foo.field(0); EXPECT_TRUE(HasSpanWithComment('a', 'f', foo, " Foo leading\n", " Foo trailing\n", NULL)); EXPECT_TRUE(HasSpanWithComment('b', 'e', bar, " bar leading\n line 2 ", " bar trailing\n line 2 ", " detached before oneof\n")); EXPECT_TRUE(HasSpanWithComment('c', 'd', bar_int, " bar_int leading\n", " bar_int trailing\n", " detached before bar_int\n")); // Ignore these. EXPECT_TRUE(HasSpan(file_)); EXPECT_TRUE(HasSpan(foo, "name")); EXPECT_TRUE(HasSpan(bar, "name")); EXPECT_TRUE(HasSpan(bar_int, "type")); EXPECT_TRUE(HasSpan(bar_int, "name")); EXPECT_TRUE(HasSpan(bar_int, "number")); } // =================================================================== } // anonymous namespace } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/php/000077500000000000000000000000001334102242000276725ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/php/php_generator.cc000066400000000000000000001356461334102242000330550ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include using google::protobuf::internal::scoped_ptr; 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"; const std::string kDescriptorMetadataFile = "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", "for", "foreach", "function", "global", "goto", "if", "implements", "include", "include_once", "instanceof", "insteadof", "interface", "isset", "list", "namespace", "new", "or", "print", "private", "protected", "public", "require", "require_once", "return", "static", "switch", "throw", "trait", "try", "unset", "use", "var", "while", "xor", "int", "float", "bool", "string", "true", "false", "null", "void", "iterable"}; const char* const kValidConstantNames[] = { "int", "float", "bool", "string", "true", "false", "null", "void", "iterable", }; const int kReservedNamesSize = 73; const int kValidConstantNamesSize = 9; const int kFieldSetter = 1; const int kFieldGetter = 2; const int kFieldProperty = 3; namespace google { namespace protobuf { namespace compiler { namespace php { // Forward decls. std::string PhpName(const std::string& full_name, bool is_descriptor); std::string DefaultForField(FieldDescriptor* field); std::string IntToString(int32 value); std::string FilenameToClassname(const string& filename); std::string GeneratedMetadataFileName(const std::string& proto_file, bool is_descriptor); std::string LabelForField(FieldDescriptor* field); std::string TypeName(FieldDescriptor* field); std::string UnderscoresToCamelCase(const string& name, bool cap_first_letter); std::string EscapeDollor(const string& to_escape); std::string BinaryToHex(const string& binary); void Indent(io::Printer* printer); void Outdent(io::Printer* printer); void GenerateMessageDocComment(io::Printer* printer, const Descriptor* message, int is_descriptor); void GenerateFieldDocComment(io::Printer* printer, const FieldDescriptor* field, int is_descriptor, int function_type); void GenerateEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_, int is_descriptor); void GenerateEnumValueDocComment(io::Printer* printer, const EnumValueDescriptor* value); void GenerateServiceDocComment(io::Printer* printer, const ServiceDescriptor* service); void GenerateServiceMethodDocComment(io::Printer* printer, const MethodDescriptor* method); std::string RenameEmpty(const std::string& name) { if (name == "Empty") { return "GPBEmpty"; } else { return name; } } std::string MessageFullName(const Descriptor* message, bool is_descriptor) { if (is_descriptor) { return StringReplace(message->full_name(), "google.protobuf", "google.protobuf.internal", false); } else { return message->full_name(); } } std::string EnumFullName(const EnumDescriptor* envm, bool is_descriptor) { if (is_descriptor) { return StringReplace(envm->full_name(), "google.protobuf", "google.protobuf.internal", false); } else { return envm->full_name(); } } template std::string ClassNamePrefix(const string& classname, const DescriptorType* desc) { const string& prefix = (desc->file()->options()).php_class_prefix(); if (prefix != "") { return prefix; } bool is_reserved = false; string lower = classname; 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 (desc->file()->package() == "google.protobuf") { return "GPB"; } else { return "PB"; } } return ""; } std::string ConstantNamePrefix(const string& classname) { bool is_reserved = false; string lower = classname; transform(lower.begin(), lower.end(), lower.begin(), ::tolower); for (int i = 0; i < kReservedNamesSize; i++) { if (lower == kReservedNames[i]) { is_reserved = true; break; } } for (int i = 0; i < kValidConstantNamesSize; i++) { if (lower == kValidConstantNames[i]) { is_reserved = false; break; } } if (is_reserved) { return "PB"; } return ""; } template std::string NamespacedName(const string& classname, const DescriptorType* desc, bool is_descriptor) { if (desc->file()->options().has_php_namespace()) { const string& php_namespace = desc->file()->options().php_namespace(); if (php_namespace != "") { return php_namespace + '\\' + classname; } else { return classname; } } if (desc->file()->package() == "") { return classname; } else { return PhpName(desc->file()->package(), is_descriptor) + '\\' + classname; } } template std::string FullClassName(const DescriptorType* desc, bool is_descriptor) { string classname = GeneratedClassName(desc); return NamespacedName(classname, desc, is_descriptor); } std::string FullClassName(const ServiceDescriptor* desc, bool is_descriptor) { string classname = GeneratedClassName(desc); return NamespacedName(classname, desc, is_descriptor); } std::string PhpName(const std::string& full_name, bool is_descriptor) { if (is_descriptor) { return kDescriptorPackageName; } std::string result; bool cap_next_letter = true; for (int i = 0; i < full_name.size(); i++) { if ('a' <= full_name[i] && full_name[i] <= 'z' && cap_next_letter) { result += full_name[i] + ('A' - 'a'); cap_next_letter = false; } else if (full_name[i] == '.') { result += '\\'; cap_next_letter = true; } else { result += full_name[i]; cap_next_letter = false; } } return result; } std::string DefaultForField(const FieldDescriptor* field) { switch (field->type()) { case FieldDescriptor::TYPE_INT32: case FieldDescriptor::TYPE_INT64: case FieldDescriptor::TYPE_UINT32: case FieldDescriptor::TYPE_UINT64: case FieldDescriptor::TYPE_SINT32: case FieldDescriptor::TYPE_SINT64: case FieldDescriptor::TYPE_FIXED32: case FieldDescriptor::TYPE_FIXED64: case FieldDescriptor::TYPE_SFIXED32: case FieldDescriptor::TYPE_SFIXED64: case FieldDescriptor::TYPE_ENUM: return "0"; case FieldDescriptor::TYPE_DOUBLE: case FieldDescriptor::TYPE_FLOAT: return "0.0"; case FieldDescriptor::TYPE_BOOL: return "false"; case FieldDescriptor::TYPE_STRING: case FieldDescriptor::TYPE_BYTES: return "''"; case FieldDescriptor::TYPE_MESSAGE: case FieldDescriptor::TYPE_GROUP: return "null"; default: assert(false); return ""; } } std::string GeneratedMetadataFileName(const std::string& proto_file, bool is_descriptor) { int start_index = 0; int first_index = proto_file.find_first_of("/", start_index); std::string result = "GPBMetadata/"; if (proto_file == kEmptyFile) { return kEmptyMetadataFile; } if (is_descriptor) { return kDescriptorMetadataFile; } // Append directory name. std::string file_no_suffix; int lastindex = proto_file.find_last_of("."); if (proto_file == kEmptyFile) { return kEmptyMetadataFile; } else { file_no_suffix = proto_file.substr(0, lastindex); } while (first_index != string::npos) { result += UnderscoresToCamelCase( file_no_suffix.substr(start_index, first_index - start_index), true); result += "/"; start_index = first_index + 1; first_index = file_no_suffix.find_first_of("/", start_index); } // Append file name. result += RenameEmpty(UnderscoresToCamelCase( file_no_suffix.substr(start_index, first_index - start_index), true)); return result += ".php"; } std::string GeneratedMessageFileName(const Descriptor* message, bool is_descriptor) { std::string result = FullClassName(message, is_descriptor); for (int i = 0; i < result.size(); i++) { if (result[i] == '\\') { result[i] = '/'; } } return result + ".php"; } std::string GeneratedEnumFileName(const EnumDescriptor* en, bool is_descriptor) { std::string result = FullClassName(en, is_descriptor); for (int i = 0; i < result.size(); i++) { if (result[i] == '\\') { result[i] = '/'; } } return result + ".php"; } std::string GeneratedServiceFileName(const ServiceDescriptor* service, bool is_descriptor) { std::string result = FullClassName(service, is_descriptor) + "Interface"; for (int i = 0; i < result.size(); i++) { if (result[i] == '\\') { result[i] = '/'; } } return result + ".php"; } std::string IntToString(int32 value) { std::ostringstream os; os << value; return os.str(); } std::string LabelForField(const FieldDescriptor* field) { switch (field->label()) { case FieldDescriptor::LABEL_OPTIONAL: return "optional"; case FieldDescriptor::LABEL_REQUIRED: return "required"; case FieldDescriptor::LABEL_REPEATED: return "repeated"; default: assert(false); return ""; } } std::string TypeName(const FieldDescriptor* field) { switch (field->type()) { case FieldDescriptor::TYPE_INT32: return "int32"; case FieldDescriptor::TYPE_INT64: return "int64"; case FieldDescriptor::TYPE_UINT32: return "uint32"; case FieldDescriptor::TYPE_UINT64: return "uint64"; case FieldDescriptor::TYPE_SINT32: return "sint32"; case FieldDescriptor::TYPE_SINT64: return "sint64"; case FieldDescriptor::TYPE_FIXED32: return "fixed32"; case FieldDescriptor::TYPE_FIXED64: return "fixed64"; case FieldDescriptor::TYPE_SFIXED32: return "sfixed32"; case FieldDescriptor::TYPE_SFIXED64: return "sfixed64"; case FieldDescriptor::TYPE_DOUBLE: return "double"; case FieldDescriptor::TYPE_FLOAT: return "float"; case FieldDescriptor::TYPE_BOOL: return "bool"; case FieldDescriptor::TYPE_ENUM: return "enum"; case FieldDescriptor::TYPE_STRING: return "string"; case FieldDescriptor::TYPE_BYTES: return "bytes"; case FieldDescriptor::TYPE_MESSAGE: return "message"; case FieldDescriptor::TYPE_GROUP: return "group"; default: assert(false); return ""; } } std::string PhpSetterTypeName(const FieldDescriptor* field, bool is_descriptor) { if (field->is_map()) { return "array|\\Google\\Protobuf\\Internal\\MapField"; } string type; switch (field->type()) { case FieldDescriptor::TYPE_INT32: case FieldDescriptor::TYPE_UINT32: case FieldDescriptor::TYPE_SINT32: case FieldDescriptor::TYPE_FIXED32: case FieldDescriptor::TYPE_SFIXED32: case FieldDescriptor::TYPE_ENUM: type = "int"; break; case FieldDescriptor::TYPE_INT64: case FieldDescriptor::TYPE_UINT64: case FieldDescriptor::TYPE_SINT64: case FieldDescriptor::TYPE_FIXED64: case FieldDescriptor::TYPE_SFIXED64: type = "int|string"; break; case FieldDescriptor::TYPE_DOUBLE: case FieldDescriptor::TYPE_FLOAT: type = "float"; break; case FieldDescriptor::TYPE_BOOL: type = "bool"; break; case FieldDescriptor::TYPE_STRING: case FieldDescriptor::TYPE_BYTES: type = "string"; break; case FieldDescriptor::TYPE_MESSAGE: type = "\\" + FullClassName(field->message_type(), is_descriptor); break; case FieldDescriptor::TYPE_GROUP: return "null"; default: assert(false); return ""; } if (field->is_repeated()) { // accommodate for edge case with multiple types. size_t start_pos = type.find("|"); if (start_pos != std::string::npos) { type.replace(start_pos, 1, "[]|"); } type += "[]|\\Google\\Protobuf\\Internal\\RepeatedField"; } return type; } std::string PhpGetterTypeName(const FieldDescriptor* field, bool is_descriptor) { if (field->is_map()) { return "\\Google\\Protobuf\\Internal\\MapField"; } if (field->is_repeated()) { return "\\Google\\Protobuf\\Internal\\RepeatedField"; } switch (field->type()) { case FieldDescriptor::TYPE_INT32: case FieldDescriptor::TYPE_UINT32: case FieldDescriptor::TYPE_SINT32: case FieldDescriptor::TYPE_FIXED32: case FieldDescriptor::TYPE_SFIXED32: case FieldDescriptor::TYPE_ENUM: return "int"; case FieldDescriptor::TYPE_INT64: case FieldDescriptor::TYPE_UINT64: case FieldDescriptor::TYPE_SINT64: case FieldDescriptor::TYPE_FIXED64: case FieldDescriptor::TYPE_SFIXED64: return "int|string"; case FieldDescriptor::TYPE_DOUBLE: case FieldDescriptor::TYPE_FLOAT: return "float"; case FieldDescriptor::TYPE_BOOL: return "bool"; case FieldDescriptor::TYPE_STRING: case FieldDescriptor::TYPE_BYTES: return "string"; case FieldDescriptor::TYPE_MESSAGE: return "\\" + FullClassName(field->message_type(), is_descriptor); case FieldDescriptor::TYPE_GROUP: return "null"; default: assert(false); return ""; } } std::string EnumOrMessageSuffix( const FieldDescriptor* field, bool is_descriptor) { if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { return ", '" + MessageFullName(field->message_type(), is_descriptor) + "'"; } if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { return ", '" + EnumFullName(field->enum_type(), is_descriptor) + "'"; } return ""; } // Converts a name to camel-case. If cap_first_letter is true, capitalize the // first letter. std::string UnderscoresToCamelCase(const string& input, bool cap_first_letter) { std::string result; for (int i = 0; i < input.size(); i++) { if ('a' <= input[i] && input[i] <= 'z') { if (cap_first_letter) { result += input[i] + ('A' - 'a'); } else { result += input[i]; } cap_first_letter = false; } else if ('A' <= input[i] && input[i] <= 'Z') { if (i == 0 && !cap_first_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_first_letter = false; } else if ('0' <= input[i] && input[i] <= '9') { result += input[i]; cap_first_letter = true; } else { cap_first_letter = true; } } // Add a trailing "_" if the name should be altered. if (input[input.size() - 1] == '#') { result += '_'; } return result; } std::string EscapeDollor(const string& to_escape) { return StringReplace(to_escape, "$", "\\$", true); } std::string BinaryToHex(const string& src) { string dest; size_t i; unsigned char symbol[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', }; dest.resize(src.size() * 2); char* append_ptr = &dest[0]; for (i = 0; i < src.size(); i++) { *append_ptr++ = symbol[(src[i] & 0xf0) >> 4]; *append_ptr++ = symbol[src[i] & 0x0f]; } return dest; } void Indent(io::Printer* printer) { printer->Indent(); printer->Indent(); } void Outdent(io::Printer* printer) { printer->Outdent(); printer->Outdent(); } void GenerateField(const FieldDescriptor* field, io::Printer* printer, bool is_descriptor) { if (field->is_repeated()) { GenerateFieldDocComment(printer, field, is_descriptor, kFieldProperty); printer->Print( "private $^name^;\n", "name", field->name()); } else if (field->containing_oneof()) { // Oneof fields are handled by GenerateOneofField. return; } else { GenerateFieldDocComment(printer, field, is_descriptor, kFieldProperty); printer->Print( "private $^name^ = ^default^;\n", "name", field->name(), "default", DefaultForField(field)); } if (is_descriptor) { printer->Print( "private $has_^name^ = false;\n", "name", field->name()); } } void GenerateOneofField(const OneofDescriptor* oneof, io::Printer* printer) { // Oneof property needs to be protected in order to be accessed by parent // class in implementation. printer->Print( "protected $^name^;\n", "name", oneof->name()); } void GenerateFieldAccessor(const FieldDescriptor* field, bool is_descriptor, io::Printer* printer) { const OneofDescriptor* oneof = field->containing_oneof(); // Generate getter. if (oneof != NULL) { GenerateFieldDocComment(printer, field, is_descriptor, kFieldGetter); printer->Print( "public function get^camel_name^()\n" "{\n" " return $this->readOneof(^number^);\n" "}\n\n", "camel_name", UnderscoresToCamelCase(field->name(), true), "number", IntToString(field->number())); } else { GenerateFieldDocComment(printer, field, is_descriptor, kFieldGetter); printer->Print( "public function get^camel_name^()\n" "{\n" " return $this->^name^;\n" "}\n\n", "camel_name", UnderscoresToCamelCase(field->name(), true), "name", field->name()); } // Generate setter. GenerateFieldDocComment(printer, field, is_descriptor, kFieldSetter); printer->Print( "public function set^camel_name^($var)\n" "{\n", "camel_name", UnderscoresToCamelCase(field->name(), true)); Indent(printer); // Type check. if (field->is_map()) { const Descriptor* map_entry = field->message_type(); const FieldDescriptor* key = map_entry->FindFieldByName("key"); const FieldDescriptor* value = map_entry->FindFieldByName("value"); printer->Print( "$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())); if (value->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { printer->Print( ", \\^class_name^);\n", "class_name", FullClassName(value->message_type(), is_descriptor) + "::class"); } else if (value->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { printer->Print( ", \\^class_name^);\n", "class_name", FullClassName(value->enum_type(), is_descriptor) + "::class"); } else { printer->Print(");\n"); } } else if (field->is_repeated()) { printer->Print( "$arr = GPBUtil::checkRepeatedField($var, " "\\Google\\Protobuf\\Internal\\GPBType::^type^", "type", ToUpper(field->type_name())); if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { printer->Print( ", \\^class_name^);\n", "class_name", FullClassName(field->message_type(), is_descriptor) + "::class"); } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { printer->Print( ", \\^class_name^);\n", "class_name", FullClassName(field->enum_type(), is_descriptor) + "::class"); } else { printer->Print(");\n"); } } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { printer->Print( "GPBUtil::checkMessage($var, \\^class_name^::class);\n", "class_name", FullClassName(field->message_type(), is_descriptor)); } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { printer->Print( "GPBUtil::checkEnum($var, \\^class_name^::class);\n", "class_name", FullClassName(field->enum_type(), is_descriptor)); } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { printer->Print( "GPBUtil::checkString($var, ^utf8^);\n", "utf8", field->type() == FieldDescriptor::TYPE_STRING ? "True": "False"); } else { printer->Print( "GPBUtil::check^type^($var);\n", "type", UnderscoresToCamelCase(field->cpp_type_name(), true)); } if (oneof != NULL) { printer->Print( "$this->writeOneof(^number^, $var);\n", "number", IntToString(field->number())); } else if (field->is_repeated()) { printer->Print( "$this->^name^ = $arr;\n", "name", field->name()); } else { printer->Print( "$this->^name^ = $var;\n", "name", field->name()); } // Set has bit for proto2 only. if (is_descriptor) { printer->Print( "$this->has_^field_name^ = true;\n", "field_name", field->name()); } printer->Print("\nreturn $this;\n"); Outdent(printer); printer->Print( "}\n\n"); // Generate has method for proto2 only. if (is_descriptor) { printer->Print( "public function has^camel_name^()\n" "{\n" " return $this->has_^field_name^;\n" "}\n\n", "camel_name", UnderscoresToCamelCase(field->name(), true), "field_name", field->name()); } } void GenerateEnumToPool(const EnumDescriptor* en, io::Printer* printer) { printer->Print( "$pool->addEnum('^name^', " "\\Google\\Protobuf\\Internal\\^class_name^::class)\n", "name", EnumFullName(en, true), "class_name", en->name()); Indent(printer); for (int i = 0; i < en->value_count(); i++) { const EnumValueDescriptor* value = en->value(i); printer->Print( "->value(\"^name^\", ^number^)\n", "name", ConstantNamePrefix(value->name()) + value->name(), "number", IntToString(value->number())); } printer->Print("->finalizeToPool();\n\n"); Outdent(printer); } void GenerateServiceMethod(const MethodDescriptor* method, io::Printer* printer) { printer->Print( "public function ^camel_name^(\\^request_name^ $request);\n\n", "camel_name", UnderscoresToCamelCase(method->name(), false), "request_name", FullClassName( method->input_type(), false) ); } void GenerateMessageToPool(const string& name_prefix, const Descriptor* message, io::Printer* printer) { // Don't generate MapEntry messages -- we use the PHP extension's native // support for map fields instead. if (message->options().map_entry()) { return; } string class_name = name_prefix.empty()? message->name() : name_prefix + "_" + message->name(); printer->Print( "$pool->addMessage('^message^', " "\\Google\\Protobuf\\Internal\\^class_name^::class)\n", "message", MessageFullName(message, true), "class_name", class_name); Indent(printer); for (int i = 0; i < message->field_count(); i++) { const FieldDescriptor* field = message->field(i); if (field->is_map()) { const FieldDescriptor* key = field->message_type()->FindFieldByName("key"); const FieldDescriptor* val = field->message_type()->FindFieldByName("value"); printer->Print( "->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", SimpleItoa(field->number()), "other", EnumOrMessageSuffix(val, true)); } else if (!field->containing_oneof()) { printer->Print( "->^label^('^field^', " "\\Google\\Protobuf\\Internal\\GPBType::^type^, ^number^^other^)\n", "field", field->name(), "label", LabelForField(field), "type", ToUpper(field->type_name()), "number", SimpleItoa(field->number()), "other", EnumOrMessageSuffix(field, true)); } } // oneofs. for (int i = 0; i < message->oneof_decl_count(); i++) { const OneofDescriptor* oneof = message->oneof_decl(i); printer->Print("->oneof(^name^)\n", "name", oneof->name()); Indent(printer); for (int index = 0; index < oneof->field_count(); index++) { const FieldDescriptor* field = oneof->field(index); printer->Print( "->value('^field^', " "\\Google\\Protobuf\\Internal\\GPBType::^type^, ^number^^other^)\n", "field", field->name(), "type", ToUpper(field->type_name()), "number", SimpleItoa(field->number()), "other", EnumOrMessageSuffix(field, true)); } printer->Print("->finish()\n"); Outdent(printer); } printer->Print( "->finalizeToPool();\n"); Outdent(printer); printer->Print( "\n"); for (int i = 0; i < message->nested_type_count(); i++) { GenerateMessageToPool(class_name, message->nested_type(i), printer); } for (int i = 0; i < message->enum_type_count(); i++) { GenerateEnumToPool(message->enum_type(i), printer); } } void GenerateAddFileToPool(const FileDescriptor* file, bool is_descriptor, io::Printer* printer) { printer->Print( "public static $is_initialized = false;\n\n" "public static function initOnce() {\n"); Indent(printer); printer->Print( "$pool = \\Google\\Protobuf\\Internal\\" "DescriptorPool::getGeneratedPool();\n\n" "if (static::$is_initialized == true) {\n" " return;\n" "}\n"); if (is_descriptor) { for (int i = 0; i < file->message_type_count(); i++) { GenerateMessageToPool("", file->message_type(i), printer); } for (int i = 0; i < file->enum_type_count(); i++) { GenerateEnumToPool(file->enum_type(i), printer); } printer->Print( "$pool->finish();\n"); } else { for (int i = 0; i < file->dependency_count(); i++) { const std::string& name = file->dependency(i)->name(); // Currently, descriptor.proto is not ready for external usage. Skip to // import it for now, so that its dependencies can still work as long as // they don't use protos defined in descriptor.proto. if (name == kDescriptorFile) { continue; } std::string dependency_filename = GeneratedMetadataFileName(name, is_descriptor); printer->Print( "\\^name^::initOnce();\n", "name", FilenameToClassname(dependency_filename)); } // Add messages and enums to descriptor pool. FileDescriptorSet files; FileDescriptorProto* file_proto = files.add_file(); file->CopyTo(file_proto); // Filter out descriptor.proto as it cannot be depended on for now. RepeatedPtrField* dependency = file_proto->mutable_dependency(); for (RepeatedPtrField::iterator it = dependency->begin(); it != dependency->end(); ++it) { if (*it != kDescriptorFile) { dependency->erase(it); break; } } // Filter out all extensions, since we do not support extension yet. file_proto->clear_extension(); RepeatedPtrField* message_type = file_proto->mutable_message_type(); for (RepeatedPtrField::iterator it = message_type->begin(); it != message_type->end(); ++it) { it->clear_extension(); } string files_data; files.SerializeToString(&files_data); printer->Print("$pool->internalAddGeneratedFile(hex2bin(\n"); Indent(printer); // Only write 30 bytes per line. static const int kBytesPerLine = 30; for (int i = 0; i < files_data.size(); i += kBytesPerLine) { printer->Print( "\"^data^\"^dot^\n", "data", BinaryToHex(files_data.substr(i, kBytesPerLine)), "dot", i + kBytesPerLine < files_data.size() ? " ." : ""); } Outdent(printer); printer->Print( "));\n\n"); } printer->Print( "static::$is_initialized = true;\n"); Outdent(printer); printer->Print("}\n"); } void GenerateUseDeclaration(bool is_descriptor, io::Printer* printer) { if (!is_descriptor) { printer->Print( "use Google\\Protobuf\\Internal\\GPBType;\n" "use Google\\Protobuf\\Internal\\RepeatedField;\n" "use Google\\Protobuf\\Internal\\GPBUtil;\n\n"); } else { printer->Print( "use Google\\Protobuf\\Internal\\GPBType;\n" "use Google\\Protobuf\\Internal\\GPBWire;\n" "use Google\\Protobuf\\Internal\\RepeatedField;\n" "use Google\\Protobuf\\Internal\\InputStream;\n" "use Google\\Protobuf\\Internal\\GPBUtil;\n\n"); } } void GenerateHead(const FileDescriptor* file, io::Printer* printer) { printer->Print( "name()); } std::string FilenameToClassname(const string& filename) { int lastindex = filename.find_last_of("."); std::string result = filename.substr(0, lastindex); for (int i = 0; i < result.size(); i++) { if (result[i] == '/') { result[i] = '\\'; } } return result; } void GenerateMetadataFile(const FileDescriptor* file, bool is_descriptor, GeneratorContext* generator_context) { std::string filename = GeneratedMetadataFileName(file->name(), is_descriptor); scoped_ptr output( generator_context->Open(filename)); io::Printer printer(output.get(), '^'); GenerateHead(file, &printer); std::string fullname = FilenameToClassname(filename); int lastindex = fullname.find_last_of("\\"); printer.Print( "namespace ^name^;\n\n", "name", fullname.substr(0, lastindex)); if (lastindex != string::npos) { printer.Print( "class ^name^\n" "{\n", "name", fullname.substr(lastindex + 1)); } else { printer.Print( "class ^name^\n" "{\n", "name", fullname); } Indent(&printer); GenerateAddFileToPool(file, is_descriptor, &printer); Outdent(&printer); printer.Print("}\n\n"); } void GenerateEnumFile(const FileDescriptor* file, const EnumDescriptor* en, bool is_descriptor, GeneratorContext* generator_context) { std::string filename = GeneratedEnumFileName(en, is_descriptor); scoped_ptr output( generator_context->Open(filename)); io::Printer printer(output.get(), '^'); GenerateHead(file, &printer); std::string fullname = FilenameToClassname(filename); int lastindex = fullname.find_last_of("\\"); if (file->options().has_php_namespace()) { const string& php_namespace = file->options().php_namespace(); if (!php_namespace.empty()) { printer.Print( "namespace ^name^;\n\n", "name", php_namespace); } } else if (!file->package().empty()) { printer.Print( "namespace ^name^;\n\n", "name", fullname.substr(0, lastindex)); } GenerateEnumDocComment(&printer, en, is_descriptor); if (lastindex != string::npos) { printer.Print( "class ^name^\n" "{\n", "name", fullname.substr(lastindex + 1)); } else { printer.Print( "class ^name^\n" "{\n", "name", fullname); } Indent(&printer); for (int i = 0; i < en->value_count(); i++) { const EnumValueDescriptor* value = en->value(i); GenerateEnumValueDocComment(&printer, value); printer.Print("const ^name^ = ^number^;\n", "name", ConstantNamePrefix(value->name()) + value->name(), "number", IntToString(value->number())); } Outdent(&printer); printer.Print("}\n\n"); } void GenerateMessageFile(const FileDescriptor* file, const Descriptor* message, bool is_descriptor, GeneratorContext* generator_context) { // Don't generate MapEntry messages -- we use the PHP extension's native // support for map fields instead. if (message->options().map_entry()) { return; } std::string filename = GeneratedMessageFileName(message, is_descriptor); scoped_ptr output( generator_context->Open(filename)); io::Printer printer(output.get(), '^'); GenerateHead(file, &printer); std::string fullname = FilenameToClassname(filename); int lastindex = fullname.find_last_of("\\"); if (file->options().has_php_namespace()) { const string& php_namespace = file->options().php_namespace(); if (!php_namespace.empty()) { printer.Print( "namespace ^name^;\n\n", "name", php_namespace); } } else if (!file->package().empty()) { printer.Print( "namespace ^name^;\n\n", "name", fullname.substr(0, lastindex)); } GenerateUseDeclaration(is_descriptor, &printer); GenerateMessageDocComment(&printer, message, is_descriptor); if (lastindex != string::npos) { printer.Print( "class ^name^ extends \\Google\\Protobuf\\Internal\\Message\n" "{\n", "name", fullname.substr(lastindex + 1)); } else { printer.Print( "class ^name^ extends \\Google\\Protobuf\\Internal\\Message\n" "{\n", "name", fullname); } Indent(&printer); // Field and oneof definitions. for (int i = 0; i < message->field_count(); i++) { const FieldDescriptor* field = message->field(i); GenerateField(field, &printer, is_descriptor); } for (int i = 0; i < message->oneof_decl_count(); i++) { const OneofDescriptor* oneof = message->oneof_decl(i); GenerateOneofField(oneof, &printer); } printer.Print("\n"); printer.Print( "public function __construct() {\n"); Indent(&printer); std::string metadata_filename = GeneratedMetadataFileName(file->name(), is_descriptor); std::string metadata_fullname = FilenameToClassname(metadata_filename); printer.Print( "\\^fullname^::initOnce();\n" "parent::__construct();\n", "fullname", metadata_fullname); Outdent(&printer); printer.Print("}\n\n"); // Field and oneof accessors. for (int i = 0; i < message->field_count(); i++) { const FieldDescriptor* field = message->field(i); GenerateFieldAccessor(field, is_descriptor, &printer); } for (int i = 0; i < message->oneof_decl_count(); i++) { const OneofDescriptor* oneof = message->oneof_decl(i); printer.Print( "/**\n" " * @return string\n" " */\n" "public function get^camel_name^()\n" "{\n" " return $this->whichOneof(\"^name^\");\n" "}\n\n", "camel_name", UnderscoresToCamelCase(oneof->name(), true), "name", oneof->name()); } Outdent(&printer); printer.Print("}\n\n"); // Nested messages and enums. for (int i = 0; i < message->nested_type_count(); i++) { GenerateMessageFile(file, message->nested_type(i), is_descriptor, generator_context); } for (int i = 0; i < message->enum_type_count(); i++) { GenerateEnumFile(file, message->enum_type(i), is_descriptor, generator_context); } } void GenerateServiceFile(const FileDescriptor* file, const ServiceDescriptor* service, bool is_descriptor, GeneratorContext* generator_context) { std::string filename = GeneratedServiceFileName(service, is_descriptor); scoped_ptr output( generator_context->Open(filename)); io::Printer printer(output.get(), '^'); GenerateHead(file, &printer); std::string fullname = FilenameToClassname(filename); int lastindex = fullname.find_last_of("\\"); if (file->options().has_php_namespace()) { const string& php_namespace = file->options().php_namespace(); if (!php_namespace.empty()) { printer.Print( "namespace ^name^;\n\n", "name", php_namespace); } } else if (!file->package().empty()) { printer.Print( "namespace ^name^;\n\n", "name", fullname.substr(0, lastindex)); } GenerateServiceDocComment(&printer, service); if (lastindex != string::npos) { printer.Print( "interface ^name^\n" "{\n", "name", fullname.substr(lastindex + 1)); } else { printer.Print( "interface ^name^\n" "{\n", "name", fullname); } Indent(&printer); for (int i = 0; i < service->method_count(); i++) { const MethodDescriptor* method = service->method(i); GenerateServiceMethodDocComment(&printer, method); GenerateServiceMethod(method, &printer); } Outdent(&printer); printer.Print("}\n\n"); } void GenerateFile(const FileDescriptor* file, bool is_descriptor, GeneratorContext* generator_context) { GenerateMetadataFile(file, is_descriptor, generator_context); for (int i = 0; i < file->message_type_count(); i++) { GenerateMessageFile(file, file->message_type(i), is_descriptor, generator_context); } for (int i = 0; i < file->enum_type_count(); i++) { GenerateEnumFile(file, file->enum_type(i), is_descriptor, generator_context); } if (file->options().php_generic_services()) { for (int i = 0; i < file->service_count(); i++) { GenerateServiceFile(file, file->service(i), is_descriptor, generator_context); } } } static string EscapePhpdoc(const string& input) { string result; result.reserve(input.size() * 2); char prev = '*'; for (string::size_type i = 0; i < input.size(); i++) { char c = input[i]; 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; case '@': // '@' starts phpdoc tags including the @deprecated tag, which will // cause a compile-time error if inserted before a declaration that // does not have a corresponding @Deprecated annotation. result.append("@"); break; default: result.push_back(c); break; } prev = c; } return result; } static void GenerateDocCommentBodyForLocation( io::Printer* printer, const SourceLocation& location) { string comments = location.leading_comments.empty() ? location.trailing_comments : location.leading_comments; if (!comments.empty()) { // TODO(teboring): 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 the proto comments unchanged. // 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 = EscapePhpdoc(comments); vector lines = Split(comments, "\n"); while (!lines.empty() && lines.back().empty()) { lines.pop_back(); } 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 // close the comment. if (!lines[i].empty() && lines[i][0] == '/') { printer->Print(" * ^line^\n", "line", lines[i]); } else { printer->Print(" *^line^\n", "line", lines[i]); } } printer->Print( " *\n"); } } template static void GenerateDocCommentBody( io::Printer* printer, const DescriptorType* descriptor) { SourceLocation location; if (descriptor->GetSourceLocation(&location)) { GenerateDocCommentBodyForLocation(printer, location); } } static string FirstLineOf(const string& value) { string result = value; string::size_type pos = result.find_first_of('\n'); if (pos != string::npos) { result.erase(pos); } return result; } void GenerateMessageDocComment(io::Printer* printer, const Descriptor* message, int is_descriptor) { printer->Print("/**\n"); GenerateDocCommentBody(printer, message); printer->Print( " * Generated from protobuf message ^messagename^\n" " */\n", "fullname", EscapePhpdoc(PhpName(message->full_name(), is_descriptor)), "messagename", EscapePhpdoc(message->full_name())); } void GenerateServiceDocComment(io::Printer* printer, const ServiceDescriptor* service) { printer->Print("/**\n"); GenerateDocCommentBody(printer, service); printer->Print( " * Protobuf type ^fullname^\n" " */\n", "fullname", EscapePhpdoc(service->full_name())); } void GenerateFieldDocComment(io::Printer* printer, const FieldDescriptor* field, int is_descriptor, int function_type) { // In theory we should have slightly different comments for setters, getters, // etc., but in practice everyone already knows the difference between these // so it's redundant information. // We start the comment with the main body based on the comments from the // .proto file (if present). We then end with the field declaration, e.g.: // optional string foo = 5; // If the field is a group, the debug string might end with {. printer->Print("/**\n"); GenerateDocCommentBody(printer, field); printer->Print( " * Generated from protobuf field ^def^\n", "def", EscapePhpdoc(FirstLineOf(field->DebugString()))); if (function_type == kFieldSetter) { printer->Print(" * @param ^php_type^ $var\n", "php_type", PhpSetterTypeName(field, is_descriptor)); printer->Print(" * @return $this\n"); } else if (function_type == kFieldGetter) { printer->Print(" * @return ^php_type^\n", "php_type", PhpGetterTypeName(field, is_descriptor)); } printer->Print(" */\n"); } void GenerateEnumDocComment(io::Printer* printer, const EnumDescriptor* enum_, int is_descriptor) { printer->Print("/**\n"); GenerateDocCommentBody(printer, enum_); printer->Print( " * Protobuf enum ^fullname^\n" " */\n", "fullname", EscapePhpdoc(PhpName(enum_->full_name(), is_descriptor))); } void GenerateEnumValueDocComment(io::Printer* printer, const EnumValueDescriptor* value) { printer->Print("/**\n"); GenerateDocCommentBody(printer, value); printer->Print( " * Generated from protobuf enum ^def^\n" " */\n", "def", EscapePhpdoc(FirstLineOf(value->DebugString()))); } void GenerateServiceMethodDocComment(io::Printer* printer, const MethodDescriptor* method) { printer->Print("/**\n"); GenerateDocCommentBody(printer, method); printer->Print( " * Method ^method_name^\n" " *\n", "method_name", EscapePhpdoc(UnderscoresToCamelCase(method->name(), false))); printer->Print( " * @param \\^input_type^ $request\n", "input_type", EscapePhpdoc(FullClassName(method->input_type(), false))); printer->Print( " * @return \\^return_type^\n" " */\n", "return_type", EscapePhpdoc(FullClassName(method->output_type(), false))); } bool Generator::Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* generator_context, string* error) const { bool is_descriptor = parameter == "internal"; if (is_descriptor && file->name() != kDescriptorFile) { *error = "Can only generate PHP code for google/protobuf/descriptor.proto.\n"; return false; } if (!is_descriptor && file->syntax() != FileDescriptor::SYNTAX_PROTO3) { *error = "Can only generate PHP code for proto3 .proto files.\n" "Please add 'syntax = \"proto3\";' to the top of your .proto file.\n"; return false; } GenerateFile(file, is_descriptor, generator_context); return true; } std::string GeneratedClassName(const Descriptor* desc) { std::string classname = desc->name(); const Descriptor* containing = desc->containing_type(); while (containing != NULL) { classname = containing->name() + '_' + classname; containing = containing->containing_type(); } return ClassNamePrefix(classname, desc) + classname; } std::string GeneratedClassName(const EnumDescriptor* desc) { std::string classname = desc->name(); const Descriptor* containing = desc->containing_type(); while (containing != NULL) { classname = containing->name() + '_' + classname; containing = containing->containing_type(); } return ClassNamePrefix(classname, desc) + classname; } std::string GeneratedClassName(const ServiceDescriptor* desc) { std::string classname = desc->name(); return ClassNamePrefix(classname, desc) + classname; } } // namespace php } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/php/php_generator.h000066400000000000000000000053031334102242000327010ustar00rootroot00000000000000// 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_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_PHP_GENERATOR_H__ #include #include #include namespace google { namespace protobuf { namespace compiler { namespace php { class LIBPROTOC_EXPORT Generator : public google::protobuf::compiler::CodeGenerator { virtual bool Generate( const FileDescriptor* file, const string& parameter, GeneratorContext* generator_context, 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. std::string GeneratedClassName(const google::protobuf::Descriptor* desc); std::string GeneratedClassName(const google::protobuf::EnumDescriptor* desc); std::string GeneratedClassName(const google::protobuf::ServiceDescriptor* desc); } // namespace php } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_PHP_GENERATOR_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/plugin.cc000066400000000000000000000136301334102242000307130ustar00rootroot00000000000000// 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 #include #include #ifdef _WIN32 #include #else #include #endif #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { #if defined(_WIN32) // DO NOT include , instead create functions in io_win32.{h,cc} and import // them like we do below. using google::protobuf::internal::win32::setmode; #endif class GeneratorResponseContext : public GeneratorContext { public: GeneratorResponseContext( const Version& compiler_version, CodeGeneratorResponse* response, const std::vector& parsed_files) : compiler_version_(compiler_version), response_(response), parsed_files_(parsed_files) {} virtual ~GeneratorResponseContext() {} // implements GeneratorContext -------------------------------------- virtual io::ZeroCopyOutputStream* Open(const string& filename) { CodeGeneratorResponse::File* file = response_->add_file(); file->set_name(filename); return new io::StringOutputStream(file->mutable_content()); } virtual io::ZeroCopyOutputStream* OpenForInsert( const string& filename, const string& insertion_point) { CodeGeneratorResponse::File* file = response_->add_file(); file->set_name(filename); file->set_insertion_point(insertion_point); return new io::StringOutputStream(file->mutable_content()); } void ListParsedFiles(std::vector* output) { *output = parsed_files_; } void GetCompilerVersion(Version* version) const { *version = compiler_version_; } private: Version compiler_version_; CodeGeneratorResponse* response_; const std::vector& parsed_files_; }; bool GenerateCode(const CodeGeneratorRequest& request, const CodeGenerator& generator, CodeGeneratorResponse* response, string* error_msg) { DescriptorPool pool; for (int i = 0; i < request.proto_file_size(); i++) { const FileDescriptor* file = pool.BuildFile(request.proto_file(i)); if (file == NULL) { // BuildFile() already wrote an error message. return false; } } std::vector parsed_files; for (int i = 0; i < request.file_to_generate_size(); i++) { parsed_files.push_back(pool.FindFileByName(request.file_to_generate(i))); if (parsed_files.back() == NULL) { *error_msg = "protoc asked plugin to generate a file but " "did not provide a descriptor for the file: " + request.file_to_generate(i); return false; } } GeneratorResponseContext context( request.compiler_version(), response, parsed_files); string error; bool succeeded = generator.GenerateAll( parsed_files, request.parameter(), &context, &error); if (!succeeded && error.empty()) { error = "Code generator returned false but provided no error " "description."; } if (!error.empty()) { response->set_error(error); } return true; } int PluginMain(int argc, char* argv[], const CodeGenerator* generator) { if (argc > 1) { std::cerr << argv[0] << ": Unknown option: " << argv[1] << std::endl; return 1; } #ifdef _WIN32 setmode(STDIN_FILENO, _O_BINARY); setmode(STDOUT_FILENO, _O_BINARY); #endif CodeGeneratorRequest request; if (!request.ParseFromFileDescriptor(STDIN_FILENO)) { std::cerr << argv[0] << ": protoc sent unparseable request to plugin." << std::endl; return 1; } string error_msg; CodeGeneratorResponse response; if (GenerateCode(request, *generator, &response, &error_msg)) { if (!response.SerializeToFileDescriptor(STDOUT_FILENO)) { std::cerr << argv[0] << ": Error writing to stdout." << std::endl; return 1; } } else { if (!error_msg.empty()) { std::cerr << argv[0] << ": " << error_msg << std::endl; } return 1; } return 0; } } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/plugin.h000066400000000000000000000102321334102242000305500ustar00rootroot00000000000000// 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) // // Front-end for protoc code generator plugins written in C++. // // To implement a protoc plugin in C++, simply write an implementation of // CodeGenerator, then create a main() function like: // int main(int argc, char* argv[]) { // MyCodeGenerator generator; // return google::protobuf::compiler::PluginMain(argc, argv, &generator); // } // You must link your plugin against libprotobuf and libprotoc. // // The core part of PluginMain is to invoke the given CodeGenerator on a // CodeGeneratorRequest to generate a CodeGeneratorResponse. This part is // abstracted out and made into function GenerateCode so that it can be reused, // for example, to implement a variant of PluginMain that does some // preprocessing on the input CodeGeneratorRequest before feeding the request // to the given code generator. // // To get protoc to use the plugin, do one of the following: // * Place the plugin binary somewhere in the PATH and give it the name // "protoc-gen-NAME" (replacing "NAME" with the name of your plugin). If you // then invoke protoc with the parameter --NAME_out=OUT_DIR (again, replace // "NAME" with your plugin's name), protoc will invoke your plugin to generate // the output, which will be placed in OUT_DIR. // * Place the plugin binary anywhere, with any name, and pass the --plugin // parameter to protoc to direct it to your plugin like so: // protoc --plugin=protoc-gen-NAME=path/to/mybinary --NAME_out=OUT_DIR // On Windows, make sure to include the .exe suffix: // protoc --plugin=protoc-gen-NAME=path/to/mybinary.exe --NAME_out=OUT_DIR #ifndef GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__ #define GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__ #include #include namespace google { namespace protobuf { namespace compiler { class CodeGenerator; // code_generator.h class CodeGeneratorRequest; class CodeGeneratorResponse; // Implements main() for a protoc plugin exposing the given code generator. LIBPROTOC_EXPORT int PluginMain(int argc, char* argv[], const CodeGenerator* generator); // Generates code using the given code generator. Returns true if the code // generation is successful. If the code geneartion fails, error_msg may be // populated to describe the failure cause. bool GenerateCode(const CodeGeneratorRequest& request, const CodeGenerator& generator, CodeGeneratorResponse* response, string* error_msg); } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.cc000066400000000000000000002125211334102242000313130ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/compiler/plugin.proto #include #include #include #include #include #include #include #include #include #include #include // This is a temporary google only hack #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS #include "third_party/protobuf/version.h" #endif // @@protoc_insertion_point(includes) namespace google { namespace protobuf { namespace compiler { class VersionDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Version_default_instance_; class CodeGeneratorRequestDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _CodeGeneratorRequest_default_instance_; class CodeGeneratorResponse_FileDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _CodeGeneratorResponse_File_default_instance_; class CodeGeneratorResponseDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _CodeGeneratorResponse_default_instance_; } // namespace compiler } // namespace protobuf } // namespace google namespace protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto { void InitDefaultsVersionImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::compiler::_Version_default_instance_; new (ptr) ::google::protobuf::compiler::Version(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::compiler::Version::InitAsDefaultInstance(); } void InitDefaultsVersion() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsVersionImpl); } void InitDefaultsCodeGeneratorRequestImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProto(); protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsVersion(); { void* ptr = &::google::protobuf::compiler::_CodeGeneratorRequest_default_instance_; new (ptr) ::google::protobuf::compiler::CodeGeneratorRequest(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::compiler::CodeGeneratorRequest::InitAsDefaultInstance(); } void InitDefaultsCodeGeneratorRequest() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsCodeGeneratorRequestImpl); } void InitDefaultsCodeGeneratorResponse_FileImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::compiler::_CodeGeneratorResponse_File_default_instance_; new (ptr) ::google::protobuf::compiler::CodeGeneratorResponse_File(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::compiler::CodeGeneratorResponse_File::InitAsDefaultInstance(); } void InitDefaultsCodeGeneratorResponse_File() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsCodeGeneratorResponse_FileImpl); } void InitDefaultsCodeGeneratorResponseImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse_File(); { void* ptr = &::google::protobuf::compiler::_CodeGeneratorResponse_default_instance_; new (ptr) ::google::protobuf::compiler::CodeGeneratorResponse(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::compiler::CodeGeneratorResponse::InitAsDefaultInstance(); } void InitDefaultsCodeGeneratorResponse() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsCodeGeneratorResponseImpl); } ::google::protobuf::Metadata file_level_metadata[4]; const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, major_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, minor_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, patch_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::Version, suffix_), 1, 2, 3, 0, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, file_to_generate_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, parameter_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, proto_file_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorRequest, compiler_version_), ~0u, 0, ~0u, 1, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse_File, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse_File, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse_File, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse_File, insertion_point_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse_File, content_), 0, 1, 2, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse, error_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::compiler::CodeGeneratorResponse, file_), 0, ~0u, }; static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { { 0, 9, sizeof(::google::protobuf::compiler::Version)}, { 13, 22, sizeof(::google::protobuf::compiler::CodeGeneratorRequest)}, { 26, 34, sizeof(::google::protobuf::compiler::CodeGeneratorResponse_File)}, { 37, 44, sizeof(::google::protobuf::compiler::CodeGeneratorResponse)}, }; static ::google::protobuf::Message const * const file_default_instances[] = { reinterpret_cast(&::google::protobuf::compiler::_Version_default_instance_), reinterpret_cast(&::google::protobuf::compiler::_CodeGeneratorRequest_default_instance_), reinterpret_cast(&::google::protobuf::compiler::_CodeGeneratorResponse_File_default_instance_), reinterpret_cast(&::google::protobuf::compiler::_CodeGeneratorResponse_default_instance_), }; void protobuf_AssignDescriptors() { AddDescriptors(); ::google::protobuf::MessageFactory* factory = NULL; AssignDescriptors( "google/protobuf/compiler/plugin.proto", schemas, file_default_instances, TableStruct::offsets, factory, file_level_metadata, NULL, NULL); } void protobuf_AssignDescriptorsOnce() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors); } void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD; void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 4); } void AddDescriptorsImpl() { InitDefaults(); static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_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" "\"\252\001\n\025CodeGeneratorResponse\022\r\n\005error\030\001 \001(" "\t\022B\n\004file\030\017 \003(\01324.google.protobuf.compil" "er.CodeGeneratorResponse.File\032>\n\004File\022\014\n" "\004name\030\001 \001(\t\022\027\n\017insertion_point\030\002 \001(\t\022\017\n\007" "content\030\017 \001(\tBg\n\034com.google.protobuf.com" "pilerB\014PluginProtosZ9github.com/golang/p" "rotobuf/protoc-gen-go/plugin;plugin_go" }; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( descriptor, 638); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "google/protobuf/compiler/plugin.proto", &protobuf_RegisterTypes); ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::AddDescriptors(); } void AddDescriptors() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl); } // Force AddDescriptors() to be called at dynamic initialization time. struct StaticDescriptorInitializer { StaticDescriptorInitializer() { AddDescriptors(); } } static_descriptor_initializer; } // namespace protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto namespace google { namespace protobuf { namespace compiler { // =================================================================== void Version::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int Version::kMajorFieldNumber; const int Version::kMinorFieldNumber; const int Version::kPatchFieldNumber; const int Version::kSuffixFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Version::Version() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsVersion(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.compiler.Version) } Version::Version(const Version& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); suffix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_suffix()) { suffix_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.suffix_); } ::memcpy(&major_, &from.major_, static_cast(reinterpret_cast(&patch_) - reinterpret_cast(&major_)) + sizeof(patch_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.compiler.Version) } void Version::SharedCtor() { _cached_size_ = 0; suffix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(&major_, 0, static_cast( reinterpret_cast(&patch_) - reinterpret_cast(&major_)) + sizeof(patch_)); } Version::~Version() { // @@protoc_insertion_point(destructor:google.protobuf.compiler.Version) SharedDtor(); } void Version::SharedDtor() { suffix_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void Version::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* Version::descriptor() { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const Version& Version::default_instance() { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsVersion(); return *internal_default_instance(); } Version* Version::New(::google::protobuf::Arena* arena) const { Version* n = new Version; if (arena != NULL) { arena->Own(n); } return n; } void Version::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.compiler.Version) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; cached_has_bits = _has_bits_[0]; if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!suffix_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); (*suffix_.UnsafeRawStringPointer())->clear(); } if (cached_has_bits & 14u) { ::memset(&major_, 0, static_cast( reinterpret_cast(&patch_) - reinterpret_cast(&major_)) + sizeof(patch_)); } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool Version::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.compiler.Version) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional int32 major = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { set_has_major(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &major_))); } else { goto handle_unusual; } break; } // optional int32 minor = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { set_has_minor(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &minor_))); } else { goto handle_unusual; } break; } // optional int32 patch = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) { set_has_patch(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &patch_))); } else { goto handle_unusual; } break; } // optional string suffix = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_suffix())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->suffix().data(), static_cast(this->suffix().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.compiler.Version.suffix"); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.compiler.Version) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.compiler.Version) return false; #undef DO_ } void Version::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.compiler.Version) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional int32 major = 1; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->major(), output); } // optional int32 minor = 2; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->minor(), output); } // optional int32 patch = 3; if (cached_has_bits & 0x00000008u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->patch(), output); } // optional string suffix = 4; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->suffix().data(), static_cast(this->suffix().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.Version.suffix"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 4, this->suffix(), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.compiler.Version) } ::google::protobuf::uint8* Version::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.Version) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional int32 major = 1; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->major(), target); } // optional int32 minor = 2; if (cached_has_bits & 0x00000004u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->minor(), target); } // optional int32 patch = 3; if (cached_has_bits & 0x00000008u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(3, this->patch(), target); } // optional string suffix = 4; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->suffix().data(), static_cast(this->suffix().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.Version.suffix"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 4, this->suffix(), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.compiler.Version) return target; } size_t Version::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.compiler.Version) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } if (_has_bits_[0 / 32] & 15u) { // optional string suffix = 4; if (has_suffix()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->suffix()); } // optional int32 major = 1; if (has_major()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->major()); } // optional int32 minor = 2; if (has_minor()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->minor()); } // optional int32 patch = 3; if (has_patch()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->patch()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void Version::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.compiler.Version) GOOGLE_DCHECK_NE(&from, this); const Version* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.compiler.Version) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.compiler.Version) MergeFrom(*source); } } void Version::MergeFrom(const Version& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.compiler.Version) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 15u) { if (cached_has_bits & 0x00000001u) { set_has_suffix(); suffix_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.suffix_); } if (cached_has_bits & 0x00000002u) { major_ = from.major_; } if (cached_has_bits & 0x00000004u) { minor_ = from.minor_; } if (cached_has_bits & 0x00000008u) { patch_ = from.patch_; } _has_bits_[0] |= cached_has_bits; } } void Version::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.compiler.Version) if (&from == this) return; Clear(); MergeFrom(from); } void Version::CopyFrom(const Version& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.compiler.Version) if (&from == this) return; Clear(); MergeFrom(from); } bool Version::IsInitialized() const { return true; } void Version::Swap(Version* other) { if (other == this) return; InternalSwap(other); } void Version::InternalSwap(Version* other) { using std::swap; suffix_.Swap(&other->suffix_); swap(major_, other->major_); swap(minor_, other->minor_); swap(patch_, other->patch_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata Version::GetMetadata() const { protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void CodeGeneratorRequest::InitAsDefaultInstance() { ::google::protobuf::compiler::_CodeGeneratorRequest_default_instance_._instance.get_mutable()->compiler_version_ = const_cast< ::google::protobuf::compiler::Version*>( ::google::protobuf::compiler::Version::internal_default_instance()); } void CodeGeneratorRequest::clear_proto_file() { proto_file_.Clear(); } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int CodeGeneratorRequest::kFileToGenerateFieldNumber; const int CodeGeneratorRequest::kParameterFieldNumber; const int CodeGeneratorRequest::kProtoFileFieldNumber; const int CodeGeneratorRequest::kCompilerVersionFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 CodeGeneratorRequest::CodeGeneratorRequest() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorRequest(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.compiler.CodeGeneratorRequest) } CodeGeneratorRequest::CodeGeneratorRequest(const CodeGeneratorRequest& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), file_to_generate_(from.file_to_generate_), proto_file_(from.proto_file_) { _internal_metadata_.MergeFrom(from._internal_metadata_); parameter_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_parameter()) { parameter_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.parameter_); } if (from.has_compiler_version()) { compiler_version_ = new ::google::protobuf::compiler::Version(*from.compiler_version_); } else { compiler_version_ = NULL; } // @@protoc_insertion_point(copy_constructor:google.protobuf.compiler.CodeGeneratorRequest) } void CodeGeneratorRequest::SharedCtor() { _cached_size_ = 0; parameter_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); compiler_version_ = NULL; } CodeGeneratorRequest::~CodeGeneratorRequest() { // @@protoc_insertion_point(destructor:google.protobuf.compiler.CodeGeneratorRequest) SharedDtor(); } void CodeGeneratorRequest::SharedDtor() { parameter_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (this != internal_default_instance()) delete compiler_version_; } void CodeGeneratorRequest::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* CodeGeneratorRequest::descriptor() { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const CodeGeneratorRequest& CodeGeneratorRequest::default_instance() { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorRequest(); return *internal_default_instance(); } CodeGeneratorRequest* CodeGeneratorRequest::New(::google::protobuf::Arena* arena) const { CodeGeneratorRequest* n = new CodeGeneratorRequest; if (arena != NULL) { arena->Own(n); } return n; } void CodeGeneratorRequest::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.compiler.CodeGeneratorRequest) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; file_to_generate_.Clear(); proto_file_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!parameter_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); (*parameter_.UnsafeRawStringPointer())->clear(); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(compiler_version_ != NULL); compiler_version_->Clear(); } } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool CodeGeneratorRequest::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.compiler.CodeGeneratorRequest) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated string file_to_generate = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->add_file_to_generate())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->file_to_generate(this->file_to_generate_size() - 1).data(), static_cast(this->file_to_generate(this->file_to_generate_size() - 1).length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.compiler.CodeGeneratorRequest.file_to_generate"); } else { goto handle_unusual; } break; } // optional string parameter = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_parameter())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->parameter().data(), static_cast(this->parameter().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.compiler.CodeGeneratorRequest.parameter"); } else { goto handle_unusual; } break; } // optional .google.protobuf.compiler.Version compiler_version = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_compiler_version())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.FileDescriptorProto proto_file = 15; case 15: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(122u /* 122 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_proto_file())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.compiler.CodeGeneratorRequest) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.compiler.CodeGeneratorRequest) return false; #undef DO_ } void CodeGeneratorRequest::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.compiler.CodeGeneratorRequest) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated string file_to_generate = 1; for (int i = 0, n = this->file_to_generate_size(); i < n; i++) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->file_to_generate(i).data(), static_cast(this->file_to_generate(i).length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorRequest.file_to_generate"); ::google::protobuf::internal::WireFormatLite::WriteString( 1, this->file_to_generate(i), output); } cached_has_bits = _has_bits_[0]; // optional string parameter = 2; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->parameter().data(), static_cast(this->parameter().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorRequest.parameter"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 2, this->parameter(), output); } // optional .google.protobuf.compiler.Version compiler_version = 3; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 3, *this->compiler_version_, output); } // repeated .google.protobuf.FileDescriptorProto proto_file = 15; for (unsigned int i = 0, n = static_cast(this->proto_file_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 15, this->proto_file(static_cast(i)), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.compiler.CodeGeneratorRequest) } ::google::protobuf::uint8* CodeGeneratorRequest::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.CodeGeneratorRequest) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated string file_to_generate = 1; for (int i = 0, n = this->file_to_generate_size(); i < n; i++) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->file_to_generate(i).data(), static_cast(this->file_to_generate(i).length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorRequest.file_to_generate"); target = ::google::protobuf::internal::WireFormatLite:: WriteStringToArray(1, this->file_to_generate(i), target); } cached_has_bits = _has_bits_[0]; // optional string parameter = 2; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->parameter().data(), static_cast(this->parameter().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorRequest.parameter"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 2, this->parameter(), target); } // optional .google.protobuf.compiler.Version compiler_version = 3; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 3, *this->compiler_version_, deterministic, target); } // repeated .google.protobuf.FileDescriptorProto proto_file = 15; for (unsigned int i = 0, n = static_cast(this->proto_file_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 15, this->proto_file(static_cast(i)), deterministic, target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.compiler.CodeGeneratorRequest) return target; } size_t CodeGeneratorRequest::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.compiler.CodeGeneratorRequest) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated string file_to_generate = 1; total_size += 1 * ::google::protobuf::internal::FromIntSize(this->file_to_generate_size()); for (int i = 0, n = this->file_to_generate_size(); i < n; i++) { total_size += ::google::protobuf::internal::WireFormatLite::StringSize( this->file_to_generate(i)); } // repeated .google.protobuf.FileDescriptorProto proto_file = 15; { unsigned int count = static_cast(this->proto_file_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->proto_file(static_cast(i))); } } if (_has_bits_[0 / 32] & 3u) { // optional string parameter = 2; if (has_parameter()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->parameter()); } // optional .google.protobuf.compiler.Version compiler_version = 3; if (has_compiler_version()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->compiler_version_); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void CodeGeneratorRequest::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.compiler.CodeGeneratorRequest) GOOGLE_DCHECK_NE(&from, this); const CodeGeneratorRequest* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.compiler.CodeGeneratorRequest) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.compiler.CodeGeneratorRequest) MergeFrom(*source); } } void CodeGeneratorRequest::MergeFrom(const CodeGeneratorRequest& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.compiler.CodeGeneratorRequest) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; file_to_generate_.MergeFrom(from.file_to_generate_); proto_file_.MergeFrom(from.proto_file_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { set_has_parameter(); parameter_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.parameter_); } if (cached_has_bits & 0x00000002u) { mutable_compiler_version()->::google::protobuf::compiler::Version::MergeFrom(from.compiler_version()); } } } void CodeGeneratorRequest::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.compiler.CodeGeneratorRequest) if (&from == this) return; Clear(); MergeFrom(from); } void CodeGeneratorRequest::CopyFrom(const CodeGeneratorRequest& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.compiler.CodeGeneratorRequest) if (&from == this) return; Clear(); MergeFrom(from); } bool CodeGeneratorRequest::IsInitialized() const { if (!::google::protobuf::internal::AllAreInitialized(this->proto_file())) return false; return true; } void CodeGeneratorRequest::Swap(CodeGeneratorRequest* other) { if (other == this) return; InternalSwap(other); } void CodeGeneratorRequest::InternalSwap(CodeGeneratorRequest* other) { using std::swap; file_to_generate_.InternalSwap(&other->file_to_generate_); proto_file_.InternalSwap(&other->proto_file_); parameter_.Swap(&other->parameter_); swap(compiler_version_, other->compiler_version_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata CodeGeneratorRequest::GetMetadata() const { protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void CodeGeneratorResponse_File::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int CodeGeneratorResponse_File::kNameFieldNumber; const int CodeGeneratorResponse_File::kInsertionPointFieldNumber; const int CodeGeneratorResponse_File::kContentFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 CodeGeneratorResponse_File::CodeGeneratorResponse_File() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse_File(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.compiler.CodeGeneratorResponse.File) } CodeGeneratorResponse_File::CodeGeneratorResponse_File(const CodeGeneratorResponse_File& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_name()) { name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_); } insertion_point_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_insertion_point()) { insertion_point_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.insertion_point_); } content_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_content()) { content_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.content_); } // @@protoc_insertion_point(copy_constructor:google.protobuf.compiler.CodeGeneratorResponse.File) } void CodeGeneratorResponse_File::SharedCtor() { _cached_size_ = 0; name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); insertion_point_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); content_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } CodeGeneratorResponse_File::~CodeGeneratorResponse_File() { // @@protoc_insertion_point(destructor:google.protobuf.compiler.CodeGeneratorResponse.File) SharedDtor(); } void CodeGeneratorResponse_File::SharedDtor() { name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); insertion_point_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); content_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void CodeGeneratorResponse_File::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* CodeGeneratorResponse_File::descriptor() { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const CodeGeneratorResponse_File& CodeGeneratorResponse_File::default_instance() { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse_File(); return *internal_default_instance(); } CodeGeneratorResponse_File* CodeGeneratorResponse_File::New(::google::protobuf::Arena* arena) const { CodeGeneratorResponse_File* n = new CodeGeneratorResponse_File; if (arena != NULL) { arena->Own(n); } return n; } void CodeGeneratorResponse_File::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.compiler.CodeGeneratorResponse.File) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; cached_has_bits = _has_bits_[0]; if (cached_has_bits & 7u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); (*name_.UnsafeRawStringPointer())->clear(); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(!insertion_point_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); (*insertion_point_.UnsafeRawStringPointer())->clear(); } if (cached_has_bits & 0x00000004u) { GOOGLE_DCHECK(!content_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); (*content_.UnsafeRawStringPointer())->clear(); } } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool CodeGeneratorResponse_File::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.compiler.CodeGeneratorResponse.File) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.compiler.CodeGeneratorResponse.File.name"); } else { goto handle_unusual; } break; } // optional string insertion_point = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_insertion_point())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->insertion_point().data(), static_cast(this->insertion_point().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point"); } else { goto handle_unusual; } break; } // optional string content = 15; case 15: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(122u /* 122 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_content())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->content().data(), static_cast(this->content().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.compiler.CodeGeneratorResponse.File.content"); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.compiler.CodeGeneratorResponse.File) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.compiler.CodeGeneratorResponse.File) return false; #undef DO_ } void CodeGeneratorResponse_File::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.compiler.CodeGeneratorResponse.File) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorResponse.File.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // optional string insertion_point = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->insertion_point().data(), static_cast(this->insertion_point().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 2, this->insertion_point(), output); } // optional string content = 15; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->content().data(), static_cast(this->content().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorResponse.File.content"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 15, this->content(), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.compiler.CodeGeneratorResponse.File) } ::google::protobuf::uint8* CodeGeneratorResponse_File::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.CodeGeneratorResponse.File) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorResponse.File.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // optional string insertion_point = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->insertion_point().data(), static_cast(this->insertion_point().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 2, this->insertion_point(), target); } // optional string content = 15; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->content().data(), static_cast(this->content().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorResponse.File.content"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 15, this->content(), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.compiler.CodeGeneratorResponse.File) return target; } size_t CodeGeneratorResponse_File::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.compiler.CodeGeneratorResponse.File) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } if (_has_bits_[0 / 32] & 7u) { // optional string name = 1; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // optional string insertion_point = 2; if (has_insertion_point()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->insertion_point()); } // optional string content = 15; if (has_content()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->content()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void CodeGeneratorResponse_File::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.compiler.CodeGeneratorResponse.File) GOOGLE_DCHECK_NE(&from, this); const CodeGeneratorResponse_File* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.compiler.CodeGeneratorResponse.File) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.compiler.CodeGeneratorResponse.File) MergeFrom(*source); } } void CodeGeneratorResponse_File::MergeFrom(const CodeGeneratorResponse_File& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.compiler.CodeGeneratorResponse.File) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 7u) { if (cached_has_bits & 0x00000001u) { set_has_name(); name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_); } if (cached_has_bits & 0x00000002u) { set_has_insertion_point(); insertion_point_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.insertion_point_); } if (cached_has_bits & 0x00000004u) { set_has_content(); content_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.content_); } } } void CodeGeneratorResponse_File::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.compiler.CodeGeneratorResponse.File) if (&from == this) return; Clear(); MergeFrom(from); } void CodeGeneratorResponse_File::CopyFrom(const CodeGeneratorResponse_File& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.compiler.CodeGeneratorResponse.File) if (&from == this) return; Clear(); MergeFrom(from); } bool CodeGeneratorResponse_File::IsInitialized() const { return true; } void CodeGeneratorResponse_File::Swap(CodeGeneratorResponse_File* other) { if (other == this) return; InternalSwap(other); } void CodeGeneratorResponse_File::InternalSwap(CodeGeneratorResponse_File* other) { using std::swap; name_.Swap(&other->name_); insertion_point_.Swap(&other->insertion_point_); content_.Swap(&other->content_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata CodeGeneratorResponse_File::GetMetadata() const { protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void CodeGeneratorResponse::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int CodeGeneratorResponse::kErrorFieldNumber; const int CodeGeneratorResponse::kFileFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 CodeGeneratorResponse::CodeGeneratorResponse() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.compiler.CodeGeneratorResponse) } CodeGeneratorResponse::CodeGeneratorResponse(const CodeGeneratorResponse& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), file_(from.file_) { _internal_metadata_.MergeFrom(from._internal_metadata_); error_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_error()) { error_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.error_); } // @@protoc_insertion_point(copy_constructor:google.protobuf.compiler.CodeGeneratorResponse) } void CodeGeneratorResponse::SharedCtor() { _cached_size_ = 0; error_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } CodeGeneratorResponse::~CodeGeneratorResponse() { // @@protoc_insertion_point(destructor:google.protobuf.compiler.CodeGeneratorResponse) SharedDtor(); } void CodeGeneratorResponse::SharedDtor() { error_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void CodeGeneratorResponse::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* CodeGeneratorResponse::descriptor() { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const CodeGeneratorResponse& CodeGeneratorResponse::default_instance() { ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse(); return *internal_default_instance(); } CodeGeneratorResponse* CodeGeneratorResponse::New(::google::protobuf::Arena* arena) const { CodeGeneratorResponse* n = new CodeGeneratorResponse; if (arena != NULL) { arena->Own(n); } return n; } void CodeGeneratorResponse::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.compiler.CodeGeneratorResponse) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; file_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!error_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); (*error_.UnsafeRawStringPointer())->clear(); } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool CodeGeneratorResponse::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.compiler.CodeGeneratorResponse) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional string error = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_error())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->error().data(), static_cast(this->error().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.compiler.CodeGeneratorResponse.error"); } else { goto handle_unusual; } break; } // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; case 15: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(122u /* 122 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_file())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.compiler.CodeGeneratorResponse) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.compiler.CodeGeneratorResponse) return false; #undef DO_ } void CodeGeneratorResponse::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.compiler.CodeGeneratorResponse) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string error = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->error().data(), static_cast(this->error().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorResponse.error"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->error(), output); } // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; for (unsigned int i = 0, n = static_cast(this->file_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 15, this->file(static_cast(i)), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.compiler.CodeGeneratorResponse) } ::google::protobuf::uint8* CodeGeneratorResponse::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.compiler.CodeGeneratorResponse) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string error = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->error().data(), static_cast(this->error().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.compiler.CodeGeneratorResponse.error"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->error(), target); } // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; for (unsigned int i = 0, n = static_cast(this->file_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 15, this->file(static_cast(i)), deterministic, target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.compiler.CodeGeneratorResponse) return target; } size_t CodeGeneratorResponse::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.compiler.CodeGeneratorResponse) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; { unsigned int count = static_cast(this->file_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->file(static_cast(i))); } } // optional string error = 1; if (has_error()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->error()); } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void CodeGeneratorResponse::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.compiler.CodeGeneratorResponse) GOOGLE_DCHECK_NE(&from, this); const CodeGeneratorResponse* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.compiler.CodeGeneratorResponse) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.compiler.CodeGeneratorResponse) MergeFrom(*source); } } void CodeGeneratorResponse::MergeFrom(const CodeGeneratorResponse& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.compiler.CodeGeneratorResponse) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; file_.MergeFrom(from.file_); if (from.has_error()) { set_has_error(); error_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.error_); } } void CodeGeneratorResponse::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.compiler.CodeGeneratorResponse) if (&from == this) return; Clear(); MergeFrom(from); } void CodeGeneratorResponse::CopyFrom(const CodeGeneratorResponse& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.compiler.CodeGeneratorResponse) if (&from == this) return; Clear(); MergeFrom(from); } bool CodeGeneratorResponse::IsInitialized() const { return true; } void CodeGeneratorResponse::Swap(CodeGeneratorResponse* other) { if (other == this) return; InternalSwap(other); } void CodeGeneratorResponse::InternalSwap(CodeGeneratorResponse* other) { using std::swap; file_.InternalSwap(&other->file_); error_.Swap(&other->error_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata CodeGeneratorResponse::GetMetadata() const { protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::file_level_metadata[kIndexInFileMessages]; } // @@protoc_insertion_point(namespace_scope) } // namespace compiler } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/plugin.pb.h000066400000000000000000001562471334102242000311710ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/compiler/plugin.proto #ifndef PROTOBUF_google_2fprotobuf_2fcompiler_2fplugin_2eproto__INCLUDED #define PROTOBUF_google_2fprotobuf_2fcompiler_2fplugin_2eproto__INCLUDED #include #include #if GOOGLE_PROTOBUF_VERSION < 3005000 #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 3005001 < GOOGLE_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 #include #include #include #include #include #include #include #include // IWYU pragma: export #include // IWYU pragma: export #include #include // @@protoc_insertion_point(includes) #ifdef major #undef major #endif #ifdef minor #undef minor #endif namespace protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto { // Internal implementation detail -- do not use these members. struct LIBPROTOC_EXPORT TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; static const ::google::protobuf::internal::ParseTable schema[4]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; }; void LIBPROTOC_EXPORT AddDescriptors(); void LIBPROTOC_EXPORT InitDefaultsVersionImpl(); void LIBPROTOC_EXPORT InitDefaultsVersion(); void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorRequestImpl(); void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorRequest(); void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorResponse_FileImpl(); void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorResponse_File(); void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorResponseImpl(); void LIBPROTOC_EXPORT InitDefaultsCodeGeneratorResponse(); inline void LIBPROTOC_EXPORT InitDefaults() { InitDefaultsVersion(); InitDefaultsCodeGeneratorRequest(); InitDefaultsCodeGeneratorResponse_File(); InitDefaultsCodeGeneratorResponse(); } } // namespace protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto namespace google { namespace protobuf { namespace compiler { class CodeGeneratorRequest; class CodeGeneratorRequestDefaultTypeInternal; LIBPROTOC_EXPORT extern CodeGeneratorRequestDefaultTypeInternal _CodeGeneratorRequest_default_instance_; class CodeGeneratorResponse; class CodeGeneratorResponseDefaultTypeInternal; LIBPROTOC_EXPORT extern CodeGeneratorResponseDefaultTypeInternal _CodeGeneratorResponse_default_instance_; class CodeGeneratorResponse_File; class CodeGeneratorResponse_FileDefaultTypeInternal; LIBPROTOC_EXPORT extern CodeGeneratorResponse_FileDefaultTypeInternal _CodeGeneratorResponse_File_default_instance_; class Version; class VersionDefaultTypeInternal; LIBPROTOC_EXPORT extern VersionDefaultTypeInternal _Version_default_instance_; } // namespace compiler } // namespace protobuf } // namespace google namespace google { namespace protobuf { namespace compiler { // =================================================================== class LIBPROTOC_EXPORT Version : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.Version) */ { public: Version(); virtual ~Version(); Version(const Version& from); inline Version& operator=(const Version& from) { CopyFrom(from); return *this; } #if LANG_CXX11 Version(Version&& from) noexcept : Version() { *this = ::std::move(from); } inline Version& operator=(Version&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } static const ::google::protobuf::Descriptor* descriptor(); static const Version& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const Version* internal_default_instance() { return reinterpret_cast( &_Version_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 0; void Swap(Version* other); friend void swap(Version& a, Version& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline Version* New() const PROTOBUF_FINAL { return New(NULL); } Version* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const Version& from); void MergeFrom(const Version& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(Version* other); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return NULL; } inline void* MaybeArenaPtr() const { return NULL; } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // optional string suffix = 4; bool has_suffix() const; void clear_suffix(); static const int kSuffixFieldNumber = 4; const ::std::string& suffix() const; void set_suffix(const ::std::string& value); #if LANG_CXX11 void set_suffix(::std::string&& value); #endif void set_suffix(const char* value); void set_suffix(const char* value, size_t size); ::std::string* mutable_suffix(); ::std::string* release_suffix(); void set_allocated_suffix(::std::string* suffix); // optional int32 major = 1; bool has_major() const; void clear_major(); static const int kMajorFieldNumber = 1; ::google::protobuf::int32 major() const; void set_major(::google::protobuf::int32 value); // optional int32 minor = 2; bool has_minor() const; void clear_minor(); static const int kMinorFieldNumber = 2; ::google::protobuf::int32 minor() const; void set_minor(::google::protobuf::int32 value); // optional int32 patch = 3; bool has_patch() const; void clear_patch(); static const int kPatchFieldNumber = 3; ::google::protobuf::int32 patch() const; void set_patch(::google::protobuf::int32 value); // @@protoc_insertion_point(class_scope:google.protobuf.compiler.Version) private: void set_has_major(); void clear_has_major(); void set_has_minor(); void clear_has_minor(); void set_has_patch(); void clear_has_patch(); void set_has_suffix(); void clear_has_suffix(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::internal::ArenaStringPtr suffix_; ::google::protobuf::int32 major_; ::google::protobuf::int32 minor_; ::google::protobuf::int32 patch_; friend struct ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsVersionImpl(); }; // ------------------------------------------------------------------- class LIBPROTOC_EXPORT CodeGeneratorRequest : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.CodeGeneratorRequest) */ { public: CodeGeneratorRequest(); virtual ~CodeGeneratorRequest(); CodeGeneratorRequest(const CodeGeneratorRequest& from); inline CodeGeneratorRequest& operator=(const CodeGeneratorRequest& from) { CopyFrom(from); return *this; } #if LANG_CXX11 CodeGeneratorRequest(CodeGeneratorRequest&& from) noexcept : CodeGeneratorRequest() { *this = ::std::move(from); } inline CodeGeneratorRequest& operator=(CodeGeneratorRequest&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } static const ::google::protobuf::Descriptor* descriptor(); static const CodeGeneratorRequest& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const CodeGeneratorRequest* internal_default_instance() { return reinterpret_cast( &_CodeGeneratorRequest_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 1; void Swap(CodeGeneratorRequest* other); friend void swap(CodeGeneratorRequest& a, CodeGeneratorRequest& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline CodeGeneratorRequest* New() const PROTOBUF_FINAL { return New(NULL); } CodeGeneratorRequest* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const CodeGeneratorRequest& from); void MergeFrom(const CodeGeneratorRequest& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(CodeGeneratorRequest* other); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return NULL; } inline void* MaybeArenaPtr() const { return NULL; } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated string file_to_generate = 1; int file_to_generate_size() const; void clear_file_to_generate(); static const int kFileToGenerateFieldNumber = 1; const ::std::string& file_to_generate(int index) const; ::std::string* mutable_file_to_generate(int index); void set_file_to_generate(int index, const ::std::string& value); #if LANG_CXX11 void set_file_to_generate(int index, ::std::string&& value); #endif void set_file_to_generate(int index, const char* value); void set_file_to_generate(int index, const char* value, size_t size); ::std::string* add_file_to_generate(); void add_file_to_generate(const ::std::string& value); #if LANG_CXX11 void add_file_to_generate(::std::string&& value); #endif void add_file_to_generate(const char* value); void add_file_to_generate(const char* value, size_t size); const ::google::protobuf::RepeatedPtrField< ::std::string>& file_to_generate() const; ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_file_to_generate(); // repeated .google.protobuf.FileDescriptorProto proto_file = 15; int proto_file_size() const; void clear_proto_file(); static const int kProtoFileFieldNumber = 15; const ::google::protobuf::FileDescriptorProto& proto_file(int index) const; ::google::protobuf::FileDescriptorProto* mutable_proto_file(int index); ::google::protobuf::FileDescriptorProto* add_proto_file(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >* mutable_proto_file(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >& proto_file() const; // optional string parameter = 2; bool has_parameter() const; void clear_parameter(); static const int kParameterFieldNumber = 2; const ::std::string& parameter() const; void set_parameter(const ::std::string& value); #if LANG_CXX11 void set_parameter(::std::string&& value); #endif void set_parameter(const char* value); void set_parameter(const char* value, size_t size); ::std::string* mutable_parameter(); ::std::string* release_parameter(); void set_allocated_parameter(::std::string* parameter); // optional .google.protobuf.compiler.Version compiler_version = 3; bool has_compiler_version() const; void clear_compiler_version(); static const int kCompilerVersionFieldNumber = 3; const ::google::protobuf::compiler::Version& compiler_version() const; ::google::protobuf::compiler::Version* release_compiler_version(); ::google::protobuf::compiler::Version* mutable_compiler_version(); void set_allocated_compiler_version(::google::protobuf::compiler::Version* compiler_version); // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorRequest) private: void set_has_parameter(); void clear_has_parameter(); void set_has_compiler_version(); void clear_has_compiler_version(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::std::string> file_to_generate_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto > proto_file_; ::google::protobuf::internal::ArenaStringPtr parameter_; ::google::protobuf::compiler::Version* compiler_version_; friend struct ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorRequestImpl(); }; // ------------------------------------------------------------------- class LIBPROTOC_EXPORT CodeGeneratorResponse_File : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.CodeGeneratorResponse.File) */ { public: CodeGeneratorResponse_File(); virtual ~CodeGeneratorResponse_File(); CodeGeneratorResponse_File(const CodeGeneratorResponse_File& from); inline CodeGeneratorResponse_File& operator=(const CodeGeneratorResponse_File& from) { CopyFrom(from); return *this; } #if LANG_CXX11 CodeGeneratorResponse_File(CodeGeneratorResponse_File&& from) noexcept : CodeGeneratorResponse_File() { *this = ::std::move(from); } inline CodeGeneratorResponse_File& operator=(CodeGeneratorResponse_File&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } static const ::google::protobuf::Descriptor* descriptor(); static const CodeGeneratorResponse_File& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const CodeGeneratorResponse_File* internal_default_instance() { return reinterpret_cast( &_CodeGeneratorResponse_File_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 2; void Swap(CodeGeneratorResponse_File* other); friend void swap(CodeGeneratorResponse_File& a, CodeGeneratorResponse_File& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline CodeGeneratorResponse_File* New() const PROTOBUF_FINAL { return New(NULL); } CodeGeneratorResponse_File* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const CodeGeneratorResponse_File& from); void MergeFrom(const CodeGeneratorResponse_File& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(CodeGeneratorResponse_File* other); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return NULL; } inline void* MaybeArenaPtr() const { return NULL; } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // optional string name = 1; bool has_name() const; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); // optional string insertion_point = 2; bool has_insertion_point() const; void clear_insertion_point(); static const int kInsertionPointFieldNumber = 2; const ::std::string& insertion_point() const; void set_insertion_point(const ::std::string& value); #if LANG_CXX11 void set_insertion_point(::std::string&& value); #endif void set_insertion_point(const char* value); void set_insertion_point(const char* value, size_t size); ::std::string* mutable_insertion_point(); ::std::string* release_insertion_point(); void set_allocated_insertion_point(::std::string* insertion_point); // optional string content = 15; bool has_content() const; void clear_content(); static const int kContentFieldNumber = 15; const ::std::string& content() const; void set_content(const ::std::string& value); #if LANG_CXX11 void set_content(::std::string&& value); #endif void set_content(const char* value); void set_content(const char* value, size_t size); ::std::string* mutable_content(); ::std::string* release_content(); void set_allocated_content(::std::string* content); // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse.File) private: void set_has_name(); void clear_has_name(); void set_has_insertion_point(); void clear_has_insertion_point(); void set_has_content(); void clear_has_content(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::internal::ArenaStringPtr insertion_point_; ::google::protobuf::internal::ArenaStringPtr content_; friend struct ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponse_FileImpl(); }; // ------------------------------------------------------------------- class LIBPROTOC_EXPORT CodeGeneratorResponse : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.compiler.CodeGeneratorResponse) */ { public: CodeGeneratorResponse(); virtual ~CodeGeneratorResponse(); CodeGeneratorResponse(const CodeGeneratorResponse& from); inline CodeGeneratorResponse& operator=(const CodeGeneratorResponse& from) { CopyFrom(from); return *this; } #if LANG_CXX11 CodeGeneratorResponse(CodeGeneratorResponse&& from) noexcept : CodeGeneratorResponse() { *this = ::std::move(from); } inline CodeGeneratorResponse& operator=(CodeGeneratorResponse&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } static const ::google::protobuf::Descriptor* descriptor(); static const CodeGeneratorResponse& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const CodeGeneratorResponse* internal_default_instance() { return reinterpret_cast( &_CodeGeneratorResponse_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 3; void Swap(CodeGeneratorResponse* other); friend void swap(CodeGeneratorResponse& a, CodeGeneratorResponse& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline CodeGeneratorResponse* New() const PROTOBUF_FINAL { return New(NULL); } CodeGeneratorResponse* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const CodeGeneratorResponse& from); void MergeFrom(const CodeGeneratorResponse& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(CodeGeneratorResponse* other); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return NULL; } inline void* MaybeArenaPtr() const { return NULL; } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- typedef CodeGeneratorResponse_File File; // accessors ------------------------------------------------------- // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; int file_size() const; void clear_file(); static const int kFileFieldNumber = 15; const ::google::protobuf::compiler::CodeGeneratorResponse_File& file(int index) const; ::google::protobuf::compiler::CodeGeneratorResponse_File* mutable_file(int index); ::google::protobuf::compiler::CodeGeneratorResponse_File* add_file(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >* mutable_file(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >& file() const; // optional string error = 1; bool has_error() const; void clear_error(); static const int kErrorFieldNumber = 1; const ::std::string& error() const; void set_error(const ::std::string& value); #if LANG_CXX11 void set_error(::std::string&& value); #endif void set_error(const char* value); void set_error(const char* value, size_t size); ::std::string* mutable_error(); ::std::string* release_error(); void set_allocated_error(::std::string* error); // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse) private: void set_has_error(); void clear_has_error(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File > file_; ::google::protobuf::internal::ArenaStringPtr error_; friend struct ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fcompiler_2fplugin_2eproto::InitDefaultsCodeGeneratorResponseImpl(); }; // =================================================================== // =================================================================== #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif // __GNUC__ // Version // optional int32 major = 1; inline bool Version::has_major() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void Version::set_has_major() { _has_bits_[0] |= 0x00000002u; } inline void Version::clear_has_major() { _has_bits_[0] &= ~0x00000002u; } inline void Version::clear_major() { major_ = 0; clear_has_major(); } inline ::google::protobuf::int32 Version::major() const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.Version.major) return major_; } inline void Version::set_major(::google::protobuf::int32 value) { set_has_major(); major_ = value; // @@protoc_insertion_point(field_set:google.protobuf.compiler.Version.major) } // optional int32 minor = 2; inline bool Version::has_minor() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void Version::set_has_minor() { _has_bits_[0] |= 0x00000004u; } inline void Version::clear_has_minor() { _has_bits_[0] &= ~0x00000004u; } inline void Version::clear_minor() { minor_ = 0; clear_has_minor(); } inline ::google::protobuf::int32 Version::minor() const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.Version.minor) return minor_; } inline void Version::set_minor(::google::protobuf::int32 value) { set_has_minor(); minor_ = value; // @@protoc_insertion_point(field_set:google.protobuf.compiler.Version.minor) } // optional int32 patch = 3; inline bool Version::has_patch() const { return (_has_bits_[0] & 0x00000008u) != 0; } inline void Version::set_has_patch() { _has_bits_[0] |= 0x00000008u; } inline void Version::clear_has_patch() { _has_bits_[0] &= ~0x00000008u; } inline void Version::clear_patch() { patch_ = 0; clear_has_patch(); } inline ::google::protobuf::int32 Version::patch() const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.Version.patch) return patch_; } inline void Version::set_patch(::google::protobuf::int32 value) { set_has_patch(); patch_ = value; // @@protoc_insertion_point(field_set:google.protobuf.compiler.Version.patch) } // optional string suffix = 4; inline bool Version::has_suffix() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void Version::set_has_suffix() { _has_bits_[0] |= 0x00000001u; } inline void Version::clear_has_suffix() { _has_bits_[0] &= ~0x00000001u; } inline void Version::clear_suffix() { suffix_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); clear_has_suffix(); } inline const ::std::string& Version::suffix() const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.Version.suffix) return suffix_.GetNoArena(); } inline void Version::set_suffix(const ::std::string& value) { set_has_suffix(); suffix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.compiler.Version.suffix) } #if LANG_CXX11 inline void Version::set_suffix(::std::string&& value) { set_has_suffix(); suffix_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.Version.suffix) } #endif inline void Version::set_suffix(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_suffix(); suffix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.Version.suffix) } inline void Version::set_suffix(const char* value, size_t size) { set_has_suffix(); suffix_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.Version.suffix) } inline ::std::string* Version::mutable_suffix() { set_has_suffix(); // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.Version.suffix) return suffix_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* Version::release_suffix() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.Version.suffix) clear_has_suffix(); return suffix_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void Version::set_allocated_suffix(::std::string* suffix) { if (suffix != NULL) { set_has_suffix(); } else { clear_has_suffix(); } suffix_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), suffix); // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.Version.suffix) } // ------------------------------------------------------------------- // CodeGeneratorRequest // repeated string file_to_generate = 1; inline int CodeGeneratorRequest::file_to_generate_size() const { return file_to_generate_.size(); } inline void CodeGeneratorRequest::clear_file_to_generate() { file_to_generate_.Clear(); } inline const ::std::string& CodeGeneratorRequest::file_to_generate(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate) return file_to_generate_.Get(index); } inline ::std::string* CodeGeneratorRequest::mutable_file_to_generate(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate) return file_to_generate_.Mutable(index); } inline void CodeGeneratorRequest::set_file_to_generate(int index, const ::std::string& value) { // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate) file_to_generate_.Mutable(index)->assign(value); } #if LANG_CXX11 inline void CodeGeneratorRequest::set_file_to_generate(int index, ::std::string&& value) { // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate) file_to_generate_.Mutable(index)->assign(std::move(value)); } #endif inline void CodeGeneratorRequest::set_file_to_generate(int index, const char* value) { GOOGLE_DCHECK(value != NULL); 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) { file_to_generate_.Mutable(index)->assign( reinterpret_cast(value), size); // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate) } inline ::std::string* CodeGeneratorRequest::add_file_to_generate() { // @@protoc_insertion_point(field_add_mutable:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate) return file_to_generate_.Add(); } inline void CodeGeneratorRequest::add_file_to_generate(const ::std::string& value) { file_to_generate_.Add()->assign(value); // @@protoc_insertion_point(field_add:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate) } #if LANG_CXX11 inline void CodeGeneratorRequest::add_file_to_generate(::std::string&& value) { file_to_generate_.Add(std::move(value)); // @@protoc_insertion_point(field_add:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate) } #endif inline void CodeGeneratorRequest::add_file_to_generate(const char* value) { GOOGLE_DCHECK(value != NULL); 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) { file_to_generate_.Add()->assign(reinterpret_cast(value), size); // @@protoc_insertion_point(field_add_pointer:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate) } inline const ::google::protobuf::RepeatedPtrField< ::std::string>& CodeGeneratorRequest::file_to_generate() const { // @@protoc_insertion_point(field_list:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate) return file_to_generate_; } inline ::google::protobuf::RepeatedPtrField< ::std::string>* CodeGeneratorRequest::mutable_file_to_generate() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.compiler.CodeGeneratorRequest.file_to_generate) return &file_to_generate_; } // optional string parameter = 2; inline bool CodeGeneratorRequest::has_parameter() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void CodeGeneratorRequest::set_has_parameter() { _has_bits_[0] |= 0x00000001u; } inline void CodeGeneratorRequest::clear_has_parameter() { _has_bits_[0] &= ~0x00000001u; } inline void CodeGeneratorRequest::clear_parameter() { parameter_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); clear_has_parameter(); } inline const ::std::string& CodeGeneratorRequest::parameter() const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorRequest.parameter) return parameter_.GetNoArena(); } inline void CodeGeneratorRequest::set_parameter(const ::std::string& value) { set_has_parameter(); parameter_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorRequest.parameter) } #if LANG_CXX11 inline void CodeGeneratorRequest::set_parameter(::std::string&& value) { set_has_parameter(); parameter_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.CodeGeneratorRequest.parameter) } #endif inline void CodeGeneratorRequest::set_parameter(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_parameter(); parameter_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorRequest.parameter) } inline void CodeGeneratorRequest::set_parameter(const char* value, size_t size) { set_has_parameter(); parameter_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorRequest.parameter) } inline ::std::string* CodeGeneratorRequest::mutable_parameter() { set_has_parameter(); // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorRequest.parameter) return parameter_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* CodeGeneratorRequest::release_parameter() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorRequest.parameter) clear_has_parameter(); return parameter_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void CodeGeneratorRequest::set_allocated_parameter(::std::string* parameter) { if (parameter != NULL) { set_has_parameter(); } else { clear_has_parameter(); } parameter_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), parameter); // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorRequest.parameter) } // repeated .google.protobuf.FileDescriptorProto proto_file = 15; inline int CodeGeneratorRequest::proto_file_size() const { return proto_file_.size(); } inline const ::google::protobuf::FileDescriptorProto& CodeGeneratorRequest::proto_file(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorRequest.proto_file) return proto_file_.Get(index); } inline ::google::protobuf::FileDescriptorProto* CodeGeneratorRequest::mutable_proto_file(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorRequest.proto_file) return proto_file_.Mutable(index); } inline ::google::protobuf::FileDescriptorProto* CodeGeneratorRequest::add_proto_file() { // @@protoc_insertion_point(field_add:google.protobuf.compiler.CodeGeneratorRequest.proto_file) return proto_file_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >* CodeGeneratorRequest::mutable_proto_file() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.compiler.CodeGeneratorRequest.proto_file) return &proto_file_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >& CodeGeneratorRequest::proto_file() const { // @@protoc_insertion_point(field_list:google.protobuf.compiler.CodeGeneratorRequest.proto_file) return proto_file_; } // optional .google.protobuf.compiler.Version compiler_version = 3; inline bool CodeGeneratorRequest::has_compiler_version() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void CodeGeneratorRequest::set_has_compiler_version() { _has_bits_[0] |= 0x00000002u; } inline void CodeGeneratorRequest::clear_has_compiler_version() { _has_bits_[0] &= ~0x00000002u; } inline void CodeGeneratorRequest::clear_compiler_version() { if (compiler_version_ != NULL) compiler_version_->Clear(); clear_has_compiler_version(); } inline const ::google::protobuf::compiler::Version& CodeGeneratorRequest::compiler_version() const { const ::google::protobuf::compiler::Version* p = compiler_version_; // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorRequest.compiler_version) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::compiler::_Version_default_instance_); } inline ::google::protobuf::compiler::Version* CodeGeneratorRequest::release_compiler_version() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorRequest.compiler_version) clear_has_compiler_version(); ::google::protobuf::compiler::Version* temp = compiler_version_; compiler_version_ = NULL; return temp; } inline ::google::protobuf::compiler::Version* CodeGeneratorRequest::mutable_compiler_version() { set_has_compiler_version(); if (compiler_version_ == NULL) { compiler_version_ = new ::google::protobuf::compiler::Version; } // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorRequest.compiler_version) return compiler_version_; } inline void CodeGeneratorRequest::set_allocated_compiler_version(::google::protobuf::compiler::Version* compiler_version) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete compiler_version_; } if (compiler_version) { ::google::protobuf::Arena* submessage_arena = NULL; if (message_arena != submessage_arena) { compiler_version = ::google::protobuf::internal::GetOwnedMessage( message_arena, compiler_version, submessage_arena); } set_has_compiler_version(); } else { clear_has_compiler_version(); } compiler_version_ = compiler_version; // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorRequest.compiler_version) } // ------------------------------------------------------------------- // CodeGeneratorResponse_File // optional string name = 1; inline bool CodeGeneratorResponse_File::has_name() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void CodeGeneratorResponse_File::set_has_name() { _has_bits_[0] |= 0x00000001u; } inline void CodeGeneratorResponse_File::clear_has_name() { _has_bits_[0] &= ~0x00000001u; } inline void CodeGeneratorResponse_File::clear_name() { name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); clear_has_name(); } inline const ::std::string& CodeGeneratorResponse_File::name() const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.File.name) return name_.GetNoArena(); } inline void CodeGeneratorResponse_File::set_name(const ::std::string& value) { set_has_name(); name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.File.name) } #if LANG_CXX11 inline void CodeGeneratorResponse_File::set_name(::std::string&& value) { set_has_name(); name_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.CodeGeneratorResponse.File.name) } #endif inline void CodeGeneratorResponse_File::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_name(); name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.File.name) } inline void CodeGeneratorResponse_File::set_name(const char* value, size_t size) { set_has_name(); name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorResponse.File.name) } inline ::std::string* CodeGeneratorResponse_File::mutable_name() { set_has_name(); // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorResponse.File.name) return name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* CodeGeneratorResponse_File::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.File.name) clear_has_name(); return name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void CodeGeneratorResponse_File::set_allocated_name(::std::string* name) { if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name); // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorResponse.File.name) } // optional string insertion_point = 2; inline bool CodeGeneratorResponse_File::has_insertion_point() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void CodeGeneratorResponse_File::set_has_insertion_point() { _has_bits_[0] |= 0x00000002u; } inline void CodeGeneratorResponse_File::clear_has_insertion_point() { _has_bits_[0] &= ~0x00000002u; } inline void CodeGeneratorResponse_File::clear_insertion_point() { insertion_point_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); clear_has_insertion_point(); } inline const ::std::string& CodeGeneratorResponse_File::insertion_point() const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point) return insertion_point_.GetNoArena(); } inline void CodeGeneratorResponse_File::set_insertion_point(const ::std::string& value) { set_has_insertion_point(); insertion_point_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point) } #if LANG_CXX11 inline void CodeGeneratorResponse_File::set_insertion_point(::std::string&& value) { set_has_insertion_point(); insertion_point_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point) } #endif inline void CodeGeneratorResponse_File::set_insertion_point(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_insertion_point(); insertion_point_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point) } inline void CodeGeneratorResponse_File::set_insertion_point(const char* value, size_t size) { set_has_insertion_point(); insertion_point_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point) } inline ::std::string* CodeGeneratorResponse_File::mutable_insertion_point() { set_has_insertion_point(); // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point) return insertion_point_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* CodeGeneratorResponse_File::release_insertion_point() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point) clear_has_insertion_point(); return insertion_point_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void CodeGeneratorResponse_File::set_allocated_insertion_point(::std::string* insertion_point) { if (insertion_point != NULL) { set_has_insertion_point(); } else { clear_has_insertion_point(); } insertion_point_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), insertion_point); // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point) } // optional string content = 15; inline bool CodeGeneratorResponse_File::has_content() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void CodeGeneratorResponse_File::set_has_content() { _has_bits_[0] |= 0x00000004u; } inline void CodeGeneratorResponse_File::clear_has_content() { _has_bits_[0] &= ~0x00000004u; } inline void CodeGeneratorResponse_File::clear_content() { content_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); clear_has_content(); } inline const ::std::string& CodeGeneratorResponse_File::content() const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.File.content) return content_.GetNoArena(); } inline void CodeGeneratorResponse_File::set_content(const ::std::string& value) { set_has_content(); content_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.File.content) } #if LANG_CXX11 inline void CodeGeneratorResponse_File::set_content(::std::string&& value) { set_has_content(); content_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.CodeGeneratorResponse.File.content) } #endif inline void CodeGeneratorResponse_File::set_content(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_content(); content_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.File.content) } inline void CodeGeneratorResponse_File::set_content(const char* value, size_t size) { set_has_content(); content_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorResponse.File.content) } inline ::std::string* CodeGeneratorResponse_File::mutable_content() { set_has_content(); // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorResponse.File.content) return content_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* CodeGeneratorResponse_File::release_content() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.File.content) clear_has_content(); return content_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void CodeGeneratorResponse_File::set_allocated_content(::std::string* content) { if (content != NULL) { set_has_content(); } else { clear_has_content(); } content_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), content); // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorResponse.File.content) } // ------------------------------------------------------------------- // CodeGeneratorResponse // optional string error = 1; inline bool CodeGeneratorResponse::has_error() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void CodeGeneratorResponse::set_has_error() { _has_bits_[0] |= 0x00000001u; } inline void CodeGeneratorResponse::clear_has_error() { _has_bits_[0] &= ~0x00000001u; } inline void CodeGeneratorResponse::clear_error() { error_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); clear_has_error(); } inline const ::std::string& CodeGeneratorResponse::error() const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.error) return error_.GetNoArena(); } inline void CodeGeneratorResponse::set_error(const ::std::string& value) { set_has_error(); error_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.compiler.CodeGeneratorResponse.error) } #if LANG_CXX11 inline void CodeGeneratorResponse::set_error(::std::string&& value) { set_has_error(); error_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.compiler.CodeGeneratorResponse.error) } #endif inline void CodeGeneratorResponse::set_error(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_error(); error_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.compiler.CodeGeneratorResponse.error) } inline void CodeGeneratorResponse::set_error(const char* value, size_t size) { set_has_error(); error_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.compiler.CodeGeneratorResponse.error) } inline ::std::string* CodeGeneratorResponse::mutable_error() { set_has_error(); // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorResponse.error) return error_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* CodeGeneratorResponse::release_error() { // @@protoc_insertion_point(field_release:google.protobuf.compiler.CodeGeneratorResponse.error) clear_has_error(); return error_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void CodeGeneratorResponse::set_allocated_error(::std::string* error) { if (error != NULL) { set_has_error(); } else { clear_has_error(); } error_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), error); // @@protoc_insertion_point(field_set_allocated:google.protobuf.compiler.CodeGeneratorResponse.error) } // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; inline int CodeGeneratorResponse::file_size() const { return file_.size(); } inline void CodeGeneratorResponse::clear_file() { file_.Clear(); } inline const ::google::protobuf::compiler::CodeGeneratorResponse_File& CodeGeneratorResponse::file(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.compiler.CodeGeneratorResponse.file) return file_.Get(index); } inline ::google::protobuf::compiler::CodeGeneratorResponse_File* CodeGeneratorResponse::mutable_file(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.compiler.CodeGeneratorResponse.file) return file_.Mutable(index); } inline ::google::protobuf::compiler::CodeGeneratorResponse_File* CodeGeneratorResponse::add_file() { // @@protoc_insertion_point(field_add:google.protobuf.compiler.CodeGeneratorResponse.file) return file_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >* CodeGeneratorResponse::mutable_file() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.compiler.CodeGeneratorResponse.file) return &file_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >& CodeGeneratorResponse::file() const { // @@protoc_insertion_point(field_list:google.protobuf.compiler.CodeGeneratorResponse.file) return file_; } #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // @@protoc_insertion_point(namespace_scope) } // namespace compiler } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) #endif // PROTOBUF_google_2fprotobuf_2fcompiler_2fplugin_2eproto__INCLUDED python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/plugin.proto000066400000000000000000000200101334102242000314570ustar00rootroot00000000000000// 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) // // 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. // // Plugins written using C++ can use google/protobuf/compiler/plugin.h instead // of dealing with the raw protocol defined here. // // A plugin executable needs only to be placed somewhere in the path. The // plugin should be named "protoc-gen-$NAME", and will then be used when the // flag "--${NAME}_out" is passed to protoc. syntax = "proto2"; package google.protobuf.compiler; option java_package = "com.google.protobuf.compiler"; option java_outer_classname = "PluginProtos"; option go_package = "github.com/golang/protobuf/protoc-gen-go/plugin;plugin_go"; import "google/protobuf/descriptor.proto"; // The version number of protocol compiler. message Version { optional int32 major = 1; optional int32 minor = 2; optional int32 patch = 3; // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should // be empty for mainline stable releases. optional string suffix = 4; } // An encoded CodeGeneratorRequest is written to the plugin's stdin. message CodeGeneratorRequest { // 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. repeated string file_to_generate = 1; // The generator parameter passed on the command-line. optional string parameter = 2; // 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. repeated FileDescriptorProto proto_file = 15; // The version number of protocol compiler. optional Version compiler_version = 3; } // The plugin writes an encoded CodeGeneratorResponse to stdout. message CodeGeneratorResponse { // 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. optional string error = 1; // Represents a single generated file. message File { // 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. optional string name = 1; // 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. optional string insertion_point = 2; // The file contents. optional string content = 15; } repeated File file = 15; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/python/000077500000000000000000000000001334102242000304245ustar00rootroot00000000000000python_generator.cc000066400000000000000000001560721334102242000342560ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/python// 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. //#PY25 compatible generated code for GAE. // Copyright 2007 Google Inc. All Rights Reserved. // Author: robinson@google.com (Will Robinson) // // This module outputs pure-Python protocol message classes that will // largely be constructed at runtime via the metaclass in reflection.py. // In other words, our job is basically to output a Python equivalent // of the C++ *Descriptor objects, and fix up all circular references // within these objects. // // Note that the runtime performance of protocol message classes created in // this way is expected to be lousy. The plan is to create an alternate // generator that outputs a Python/C extension module that lets // performance-minded Python code leverage the fast C++ implementation // directly. #include #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace python { namespace { // Reimplemented here because we can't bring in // absl/strings/string_view_utils.h because it needs C++11. bool StrStartsWith(StringPiece sp, StringPiece x) { return sp.size() >= x.size() && sp.substr(0, x.size()) == x; } bool StrEndsWith(StringPiece sp, StringPiece x) { return sp.size() >= x.size() && sp.substr(sp.size() - x.size()) == x; } // Returns a copy of |filename| with any trailing ".protodevel" or ".proto // suffix stripped. // TODO(robinson): Unify with copy in compiler/cpp/internal/helpers.cc. string StripProto(const string& filename) { const char* suffix = StrEndsWith(filename, ".protodevel") ? ".protodevel" : ".proto"; return StripSuffixString(filename, suffix); } // Returns the Python module name expected for a given .proto filename. string ModuleName(const string& filename) { string basename = StripProto(filename); ReplaceCharacters(&basename, "-", '_'); ReplaceCharacters(&basename, "/", '.'); return basename + "_pb2"; } // Returns the alias we assign to the module of the given .proto filename // when importing. See testPackageInitializationImport in // google/protobuf/python/reflection_test.py // to see why we need the alias. string ModuleAlias(const string& filename) { string module_name = ModuleName(filename); // 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); return module_name; } // Keywords reserved by the Python language. const char* const kKeywords[] = { "False", "None", "True", "and", "as", "assert", "break", "class", "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global", "if", "import", "in", "is", "lambda", "nonlocal", "not", "or", "pass", "raise", "return", "try", "while", "with", "yield", }; const char* const* kKeywordsEnd = kKeywords + (sizeof(kKeywords) / sizeof(kKeywords[0])); bool ContainsPythonKeyword(const string& module_name) { std::vector tokens = Split(module_name, "."); for (int i = 0; i < tokens.size(); ++i) { if (std::find(kKeywords, kKeywordsEnd, tokens[i]) != kKeywordsEnd) { return true; } } return false; } // Returns the name of all containing types for descriptor, // in order from outermost to innermost, followed by descriptor's // own name. Each name is separated by |separator|. template string NamePrefixedWithNestedTypes(const DescriptorT& descriptor, const string& separator) { string name = descriptor.name(); for (const Descriptor* current = descriptor.containing_type(); current != NULL; current = current->containing_type()) { name = current->name() + separator + name; } return name; } // Name of the class attribute where we store the Python // descriptor.Descriptor instance for the generated class. // Must stay consistent with the _DESCRIPTOR_KEY constant // in proto2/public/reflection.py. const char kDescriptorKey[] = "DESCRIPTOR"; // Does the file have top-level enums? inline bool HasTopLevelEnums(const FileDescriptor *file) { return file->enum_type_count() > 0; } // Should we generate generic services for this file? inline bool HasGenericServices(const FileDescriptor *file) { return file->service_count() > 0 && file->options().py_generic_services(); } // Prints the common boilerplate needed at the top of every .py // 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( "# Generated by the protocol buffer compiler. DO NOT EDIT!\n" "# source: $filename$\n" "\nimport sys\n_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))" //##PY25 "\n", "filename", file->name()); if (HasTopLevelEnums(file)) { printer->Print( "from google.protobuf.internal import enum_type_wrapper\n"); } printer->Print( "from google.protobuf import descriptor as _descriptor\n" "from google.protobuf import message as _message\n" "from google.protobuf import reflection as _reflection\n" "from google.protobuf import symbol_database as " "_symbol_database\n"); if (HasGenericServices(file)) { printer->Print( "from google.protobuf import service as _service\n" "from google.protobuf import service_reflection\n"); } // Avoid circular imports if this module is descriptor_pb2. if (!descriptor_proto) { printer->Print( "from google.protobuf import descriptor_pb2\n"); } printer->Print( "# @@protoc_insertion_point(imports)\n\n" "_sym_db = _symbol_database.Default()\n"); printer->Print("\n\n"); } // Returns a Python literal giving the default value for a field. // If the field specifies no explicit default value, we'll return // the default default value for the field type (zero for numbers, // empty string for strings, empty list for repeated fields, and // None for non-repeated, composite fields). // // TODO(robinson): Unify with code from // //compiler/cpp/internal/primitive_field.cc // //compiler/cpp/internal/enum_field.cc // //compiler/cpp/internal/string_field.cc string StringifyDefaultValue(const FieldDescriptor& field) { if (field.is_repeated()) { return "[]"; } switch (field.cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: return SimpleItoa(field.default_value_int32()); case FieldDescriptor::CPPTYPE_UINT32: return SimpleItoa(field.default_value_uint32()); case FieldDescriptor::CPPTYPE_INT64: return SimpleItoa(field.default_value_int64()); case FieldDescriptor::CPPTYPE_UINT64: return SimpleItoa(field.default_value_uint64()); case FieldDescriptor::CPPTYPE_DOUBLE: { double value = field.default_value_double(); if (value == std::numeric_limits::infinity()) { // Python pre-2.6 on Windows does not parse "inf" correctly. However, // a numeric literal that is too big for a double will become infinity. return "1e10000"; } else if (value == -std::numeric_limits::infinity()) { // See above. return "-1e10000"; } else if (value != value) { // infinity * 0 = nan return "(1e10000 * 0)"; } else { return "float(" + SimpleDtoa(value) + ")"; } } case FieldDescriptor::CPPTYPE_FLOAT: { float value = field.default_value_float(); if (value == std::numeric_limits::infinity()) { // Python pre-2.6 on Windows does not parse "inf" correctly. However, // a numeric literal that is too big for a double will become infinity. return "1e10000"; } else if (value == -std::numeric_limits::infinity()) { // See above. return "-1e10000"; } else if (value != value) { // infinity - infinity = nan return "(1e10000 * 0)"; } else { return "float(" + SimpleFtoa(value) + ")"; } } case FieldDescriptor::CPPTYPE_BOOL: return field.default_value_bool() ? "True" : "False"; case FieldDescriptor::CPPTYPE_ENUM: return SimpleItoa(field.default_value_enum()->number()); case FieldDescriptor::CPPTYPE_STRING: //##!PY25 return "b\"" + CEscape(field.default_value_string()) + //##!PY25 (field.type() != FieldDescriptor::TYPE_STRING ? "\"" : //##!PY25 "\".decode('utf-8')"); return "_b(\"" + CEscape(field.default_value_string()) + //##PY25 (field.type() != FieldDescriptor::TYPE_STRING ? "\")" : //##PY25 "\").decode('utf-8')"); //##PY25 case FieldDescriptor::CPPTYPE_MESSAGE: return "None"; } // (We could add a default case above but then we wouldn't get the nice // compiler warning when a new type is added.) GOOGLE_LOG(FATAL) << "Not reached."; return ""; } string StringifySyntax(FileDescriptor::Syntax syntax) { switch (syntax) { case FileDescriptor::SYNTAX_PROTO2: return "proto2"; case FileDescriptor::SYNTAX_PROTO3: return "proto3"; case FileDescriptor::SYNTAX_UNKNOWN: default: GOOGLE_LOG(FATAL) << "Unsupported syntax; this generator only supports proto2 " "and proto3 syntax."; return ""; } } } // namespace Generator::Generator() : file_(NULL) { } Generator::~Generator() { } bool Generator::Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const { // Completely serialize all Generate() calls on this instance. The // thread-safety constraints of the CodeGenerator interface aren't clear so // just be as conservative as possible. It's easier to relax this later if // we need to, but I doubt it will be an issue. // 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_); file_ = file; string module_name = ModuleName(file->name()); string filename = module_name; ReplaceCharacters(&filename, ".", '/'); filename += ".py"; FileDescriptorProto fdp; file_->CopyTo(&fdp); fdp.SerializeToString(&file_descriptor_serialized_); google::protobuf::scoped_ptr output(context->Open(filename)); GOOGLE_CHECK(output.get()); io::Printer printer(output.get(), '$'); printer_ = &printer; PrintTopBoilerplate(printer_, file_, GeneratingDescriptorProto()); PrintImports(); PrintFileDescriptor(); PrintTopLevelEnums(); PrintTopLevelExtensions(); PrintAllNestedEnumsInFile(); PrintMessageDescriptors(); FixForeignFieldsInDescriptors(); PrintMessages(); // 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(); PrintServiceDescriptors(); if (HasGenericServices(file)) { PrintServices(); } printer.Print( "# @@protoc_insertion_point(module_scope)\n"); return !printer.failed(); } // Prints Python imports for all modules imported by |file|. void Generator::PrintImports() const { for (int i = 0; i < file_->dependency_count(); ++i) { const string& filename = file_->dependency(i)->name(); string module_name = ModuleName(filename); string module_alias = ModuleAlias(filename); 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 // import statement would result in a syntax error from the presence of // the keyword. printer_->Print("import importlib\n"); printer_->Print("$alias$ = importlib.import_module('$name$')\n", "alias", module_alias, "name", module_name); } else { int last_dot_pos = module_name.rfind('.'); string import_statement; if (last_dot_pos == string::npos) { // NOTE(petya): this is not tested as it would require a protocol buffer // outside of any package, and I don't think that is easily achievable. import_statement = "import " + module_name; } else { import_statement = "from " + module_name.substr(0, last_dot_pos) + " import " + module_name.substr(last_dot_pos + 1); } printer_->Print("$statement$ as $alias$\n", "statement", import_statement, "alias", module_alias); } CopyPublicDependenciesAliases(module_alias, file_->dependency(i)); } printer_->Print("\n"); // Print public imports. for (int i = 0; i < file_->public_dependency_count(); ++i) { string module_name = ModuleName(file_->public_dependency(i)->name()); printer_->Print("from $module$ import *\n", "module", module_name); } printer_->Print("\n"); } // Prints the single file descriptor for this file. void Generator::PrintFileDescriptor() const { std::map m; m["descriptor_name"] = kDescriptorKey; m["name"] = file_->name(); m["package"] = file_->package(); m["syntax"] = StringifySyntax(file_->syntax()); const char file_descriptor_template[] = "$descriptor_name$ = _descriptor.FileDescriptor(\n" " name='$name$',\n" " package='$package$',\n" " syntax='$syntax$',\n"; printer_->Print(m, file_descriptor_template); printer_->Indent(); printer_->Print( //##!PY25 "serialized_pb=b'$value$'\n", "serialized_pb=_b('$value$')\n", //##PY25 "value", strings::CHexEscape(file_descriptor_serialized_)); if (file_->dependency_count() != 0) { printer_->Print(",\ndependencies=["); for (int i = 0; i < file_->dependency_count(); ++i) { string module_alias = ModuleAlias(file_->dependency(i)->name()); printer_->Print("$module_alias$.DESCRIPTOR,", "module_alias", module_alias); } printer_->Print("]"); } if (file_->public_dependency_count() > 0) { printer_->Print(",\npublic_dependencies=["); for (int i = 0; i < file_->public_dependency_count(); ++i) { string module_alias = ModuleAlias(file_->public_dependency(i)->name()); printer_->Print("$module_alias$.DESCRIPTOR,", "module_alias", module_alias); } printer_->Print("]"); } // TODO(falk): Also print options and fix the message_type, enum_type, // service and extension later in the generation. printer_->Outdent(); printer_->Print(")\n"); printer_->Print("\n"); } // Prints descriptors and module-level constants for all top-level // enums defined in |file|. void Generator::PrintTopLevelEnums() const { std::vector > top_level_enum_values; for (int i = 0; i < file_->enum_type_count(); ++i) { const EnumDescriptor& enum_descriptor = *file_->enum_type(i); PrintEnum(enum_descriptor); printer_->Print("$name$ = " "enum_type_wrapper.EnumTypeWrapper($descriptor_name$)", "name", enum_descriptor.name(), "descriptor_name", ModuleLevelDescriptorName(enum_descriptor)); printer_->Print("\n"); for (int j = 0; j < enum_descriptor.value_count(); ++j) { const EnumValueDescriptor& value_descriptor = *enum_descriptor.value(j); top_level_enum_values.push_back( std::make_pair(value_descriptor.name(), value_descriptor.number())); } } for (int i = 0; i < top_level_enum_values.size(); ++i) { printer_->Print("$name$ = $value$\n", "name", top_level_enum_values[i].first, "value", SimpleItoa(top_level_enum_values[i].second)); } printer_->Print("\n"); } // Prints all enums contained in all message types in |file|. void Generator::PrintAllNestedEnumsInFile() const { for (int i = 0; i < file_->message_type_count(); ++i) { PrintNestedEnums(*file_->message_type(i)); } } // Prints a Python statement assigning the appropriate module-level // enum name to a Python EnumDescriptor object equivalent to // enum_descriptor. void Generator::PrintEnum(const EnumDescriptor& enum_descriptor) const { std::map m; string module_level_descriptor_name = ModuleLevelDescriptorName(enum_descriptor); m["descriptor_name"] = module_level_descriptor_name; m["name"] = enum_descriptor.name(); m["full_name"] = enum_descriptor.full_name(); m["file"] = kDescriptorKey; const char enum_descriptor_template[] = "$descriptor_name$ = _descriptor.EnumDescriptor(\n" " name='$name$',\n" " full_name='$full_name$',\n" " filename=None,\n" " file=$file$,\n" " values=[\n"; string options_string; enum_descriptor.options().SerializeToString(&options_string); printer_->Print(m, enum_descriptor_template); printer_->Indent(); printer_->Indent(); for (int i = 0; i < enum_descriptor.value_count(); ++i) { PrintEnumValueDescriptor(*enum_descriptor.value(i)); printer_->Print(",\n"); } printer_->Outdent(); printer_->Print("],\n"); printer_->Print("containing_type=None,\n"); printer_->Print("options=$options_value$,\n", "options_value", OptionsValue("EnumOptions", options_string)); EnumDescriptorProto edp; PrintSerializedPbInterval(enum_descriptor, edp); printer_->Outdent(); printer_->Print(")\n"); printer_->Print("_sym_db.RegisterEnumDescriptor($name$)\n", "name", module_level_descriptor_name); printer_->Print("\n"); } // Recursively prints enums in nested types within descriptor, then // prints enums contained at the top level in descriptor. void Generator::PrintNestedEnums(const Descriptor& descriptor) const { for (int i = 0; i < descriptor.nested_type_count(); ++i) { PrintNestedEnums(*descriptor.nested_type(i)); } for (int i = 0; i < descriptor.enum_type_count(); ++i) { PrintEnum(*descriptor.enum_type(i)); } } void Generator::PrintTopLevelExtensions() const { const bool is_extension = true; for (int i = 0; i < file_->extension_count(); ++i) { const FieldDescriptor& extension_field = *file_->extension(i); string constant_name = extension_field.name() + "_FIELD_NUMBER"; UpperString(&constant_name); printer_->Print("$constant_name$ = $number$\n", "constant_name", constant_name, "number", SimpleItoa(extension_field.number())); printer_->Print("$name$ = ", "name", extension_field.name()); PrintFieldDescriptor(extension_field, is_extension); printer_->Print("\n"); } printer_->Print("\n"); } // Prints Python equivalents of all Descriptors in |file|. void Generator::PrintMessageDescriptors() const { for (int i = 0; i < file_->message_type_count(); ++i) { PrintDescriptor(*file_->message_type(i)); printer_->Print("\n"); } } void Generator::PrintServiceDescriptors() const { for (int i = 0; i < file_->service_count(); ++i) { PrintServiceDescriptor(*file_->service(i)); AddServiceToFileDescriptor(*file_->service(i)); printer_->Print("\n"); } } void Generator::PrintServices() const { for (int i = 0; i < file_->service_count(); ++i) { PrintServiceClass(*file_->service(i)); PrintServiceStub(*file_->service(i)); printer_->Print("\n"); } } void Generator::PrintServiceDescriptor( const ServiceDescriptor& descriptor) const { printer_->Print("\n"); string service_name = ModuleLevelServiceDescriptorName(descriptor); string options_string; descriptor.options().SerializeToString(&options_string); printer_->Print( "$service_name$ = _descriptor.ServiceDescriptor(\n", "service_name", service_name); printer_->Indent(); std::map m; m["name"] = descriptor.name(); m["full_name"] = descriptor.full_name(); m["file"] = kDescriptorKey; m["index"] = SimpleItoa(descriptor.index()); m["options_value"] = OptionsValue("ServiceOptions", options_string); const char required_function_arguments[] = "name='$name$',\n" "full_name='$full_name$',\n" "file=$file$,\n" "index=$index$,\n" "options=$options_value$,\n"; printer_->Print(m, required_function_arguments); ServiceDescriptorProto sdp; PrintSerializedPbInterval(descriptor, sdp); printer_->Print("methods=[\n"); for (int i = 0; i < descriptor.method_count(); ++i) { const MethodDescriptor* method = descriptor.method(i); method->options().SerializeToString(&options_string); m.clear(); m["name"] = method->name(); m["full_name"] = method->full_name(); m["index"] = SimpleItoa(method->index()); m["serialized_options"] = CEscape(options_string); m["input_type"] = ModuleLevelDescriptorName(*(method->input_type())); m["output_type"] = ModuleLevelDescriptorName(*(method->output_type())); m["options_value"] = OptionsValue("MethodOptions", options_string); printer_->Print("_descriptor.MethodDescriptor(\n"); printer_->Indent(); printer_->Print( m, "name='$name$',\n" "full_name='$full_name$',\n" "index=$index$,\n" "containing_service=None,\n" "input_type=$input_type$,\n" "output_type=$output_type$,\n" "options=$options_value$,\n"); printer_->Outdent(); printer_->Print("),\n"); } printer_->Outdent(); printer_->Print("])\n"); printer_->Print("_sym_db.RegisterServiceDescriptor($name$)\n", "name", service_name); printer_->Print("\n"); } void Generator::PrintDescriptorKeyAndModuleName( const ServiceDescriptor& descriptor) const { printer_->Print( "$descriptor_key$ = $descriptor_name$,\n", "descriptor_key", kDescriptorKey, "descriptor_name", ModuleLevelServiceDescriptorName(descriptor)); printer_->Print( "__module__ = '$module_name$'\n", "module_name", ModuleName(file_->name())); } void Generator::PrintServiceClass(const ServiceDescriptor& descriptor) const { // Print the service. printer_->Print("$class_name$ = service_reflection.GeneratedServiceType(" "'$class_name$', (_service.Service,), dict(\n", "class_name", descriptor.name()); printer_->Indent(); Generator::PrintDescriptorKeyAndModuleName(descriptor); printer_->Print("))\n\n"); printer_->Outdent(); } void Generator::PrintServiceStub(const ServiceDescriptor& descriptor) const { // Print the service stub. printer_->Print("$class_name$_Stub = " "service_reflection.GeneratedServiceStubType(" "'$class_name$_Stub', ($class_name$,), dict(\n", "class_name", descriptor.name()); printer_->Indent(); Generator::PrintDescriptorKeyAndModuleName(descriptor); printer_->Print("))\n\n"); printer_->Outdent(); } // Prints statement assigning ModuleLevelDescriptorName(message_descriptor) // to a Python Descriptor object for message_descriptor. // // Mutually recursive with PrintNestedDescriptors(). void Generator::PrintDescriptor(const Descriptor& message_descriptor) const { PrintNestedDescriptors(message_descriptor); printer_->Print("\n"); printer_->Print("$descriptor_name$ = _descriptor.Descriptor(\n", "descriptor_name", ModuleLevelDescriptorName(message_descriptor)); printer_->Indent(); std::map m; m["name"] = message_descriptor.name(); m["full_name"] = message_descriptor.full_name(); m["file"] = kDescriptorKey; const char required_function_arguments[] = "name='$name$',\n" "full_name='$full_name$',\n" "filename=None,\n" "file=$file$,\n" "containing_type=None,\n"; printer_->Print(m, required_function_arguments); PrintFieldsInDescriptor(message_descriptor); PrintExtensionsInDescriptor(message_descriptor); // Nested types printer_->Print("nested_types=["); for (int i = 0; i < message_descriptor.nested_type_count(); ++i) { const string nested_name = ModuleLevelDescriptorName( *message_descriptor.nested_type(i)); printer_->Print("$name$, ", "name", nested_name); } printer_->Print("],\n"); // Enum types printer_->Print("enum_types=[\n"); printer_->Indent(); for (int i = 0; i < message_descriptor.enum_type_count(); ++i) { const string descriptor_name = ModuleLevelDescriptorName( *message_descriptor.enum_type(i)); printer_->Print(descriptor_name.c_str()); printer_->Print(",\n"); } printer_->Outdent(); printer_->Print("],\n"); string options_string; message_descriptor.options().SerializeToString(&options_string); printer_->Print( "options=$options_value$,\n" "is_extendable=$extendable$,\n" "syntax='$syntax$'", "options_value", OptionsValue("MessageOptions", options_string), "extendable", message_descriptor.extension_range_count() > 0 ? "True" : "False", "syntax", StringifySyntax(message_descriptor.file()->syntax())); printer_->Print(",\n"); // Extension ranges printer_->Print("extension_ranges=["); 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", SimpleItoa(range->start), "end", SimpleItoa(range->end)); } printer_->Print("],\n"); printer_->Print("oneofs=[\n"); printer_->Indent(); for (int i = 0; i < message_descriptor.oneof_decl_count(); ++i) { const OneofDescriptor* desc = message_descriptor.oneof_decl(i); std::map m; m["name"] = desc->name(); m["full_name"] = desc->full_name(); m["index"] = SimpleItoa(desc->index()); string options_string = OptionsValue("OneofOptions", desc->options().SerializeAsString()); if (options_string == "None") { m["options"] = ""; } else { m["options"] = ", options=" + options_string; } printer_->Print( m, "_descriptor.OneofDescriptor(\n" " name='$name$', full_name='$full_name$',\n" " index=$index$, containing_type=None, fields=[]$options$),\n"); } printer_->Outdent(); printer_->Print("],\n"); // Serialization of proto DescriptorProto edp; PrintSerializedPbInterval(message_descriptor, edp); printer_->Outdent(); printer_->Print(")\n"); } // Prints Python Descriptor objects for all nested types contained in // message_descriptor. // // Mutually recursive with PrintDescriptor(). void Generator::PrintNestedDescriptors( const Descriptor& containing_descriptor) const { for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) { PrintDescriptor(*containing_descriptor.nested_type(i)); } } // Prints all messages in |file|. void Generator::PrintMessages() const { for (int i = 0; i < file_->message_type_count(); ++i) { std::vector to_register; PrintMessage(*file_->message_type(i), "", &to_register); for (int j = 0; j < to_register.size(); ++j) { printer_->Print("_sym_db.RegisterMessage($name$)\n", "name", to_register[j]); } printer_->Print("\n"); } } // Prints a Python class for the given message descriptor. We defer to the // metaclass to do almost all of the work of actually creating a useful class. // The purpose of this function and its many helper functions above is merely // to output a Python version of the descriptors, which the metaclass in // reflection.py will use to construct the meat of the class itself. // // Mutually recursive with PrintNestedMessages(). // Collect nested message names to_register for the symbol_database. void Generator::PrintMessage(const Descriptor& message_descriptor, const string& prefix, std::vector* to_register) const { string qualified_name(prefix + message_descriptor.name()); to_register->push_back(qualified_name); printer_->Print( "$name$ = _reflection.GeneratedProtocolMessageType('$name$', " "(_message.Message,), dict(\n", "name", message_descriptor.name()); printer_->Indent(); PrintNestedMessages(message_descriptor, qualified_name + ".", to_register); std::map m; m["descriptor_key"] = kDescriptorKey; m["descriptor_name"] = ModuleLevelDescriptorName(message_descriptor); printer_->Print(m, "$descriptor_key$ = $descriptor_name$,\n"); printer_->Print("__module__ = '$module_name$'\n", "module_name", ModuleName(file_->name())); printer_->Print("# @@protoc_insertion_point(class_scope:$full_name$)\n", "full_name", message_descriptor.full_name()); printer_->Print("))\n"); printer_->Outdent(); } // Prints all nested messages within |containing_descriptor|. // Mutually recursive with PrintMessage(). void Generator::PrintNestedMessages(const Descriptor& containing_descriptor, const string& prefix, std::vector* to_register) const { for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) { printer_->Print("\n"); PrintMessage(*containing_descriptor.nested_type(i), prefix, to_register); printer_->Print(",\n"); } } // Recursively fixes foreign fields in all nested types in |descriptor|, then // sets the message_type and enum_type of all message and enum fields to point // to their respective descriptors. // Args: // descriptor: descriptor to print fields for. // containing_descriptor: if descriptor is a nested type, this is its // containing type, or NULL if this is a root/top-level type. void Generator::FixForeignFieldsInDescriptor( const Descriptor& descriptor, const Descriptor* containing_descriptor) const { for (int i = 0; i < descriptor.nested_type_count(); ++i) { FixForeignFieldsInDescriptor(*descriptor.nested_type(i), &descriptor); } for (int i = 0; i < descriptor.field_count(); ++i) { const FieldDescriptor& field_descriptor = *descriptor.field(i); FixForeignFieldsInField(&descriptor, field_descriptor, "fields_by_name"); } FixContainingTypeInDescriptor(descriptor, containing_descriptor); for (int i = 0; i < descriptor.enum_type_count(); ++i) { const EnumDescriptor& enum_descriptor = *descriptor.enum_type(i); FixContainingTypeInDescriptor(enum_descriptor, &descriptor); } for (int i = 0; i < descriptor.oneof_decl_count(); ++i) { std::map m; const OneofDescriptor* oneof = descriptor.oneof_decl(i); m["descriptor_name"] = ModuleLevelDescriptorName(descriptor); m["oneof_name"] = oneof->name(); for (int j = 0; j < oneof->field_count(); ++j) { m["field_name"] = oneof->field(j)->name(); printer_->Print( m, "$descriptor_name$.oneofs_by_name['$oneof_name$'].fields.append(\n" " $descriptor_name$.fields_by_name['$field_name$'])\n"); printer_->Print( m, "$descriptor_name$.fields_by_name['$field_name$'].containing_oneof = " "$descriptor_name$.oneofs_by_name['$oneof_name$']\n"); } } } void Generator::AddMessageToFileDescriptor(const Descriptor& descriptor) const { std::map m; m["descriptor_name"] = kDescriptorKey; m["message_name"] = descriptor.name(); m["message_descriptor_name"] = ModuleLevelDescriptorName(descriptor); const char file_descriptor_template[] = "$descriptor_name$.message_types_by_name['$message_name$'] = " "$message_descriptor_name$\n"; printer_->Print(m, file_descriptor_template); } void Generator::AddServiceToFileDescriptor( const ServiceDescriptor& descriptor) const { std::map m; m["descriptor_name"] = kDescriptorKey; m["service_name"] = descriptor.name(); m["service_descriptor_name"] = ModuleLevelServiceDescriptorName(descriptor); const char file_descriptor_template[] = "$descriptor_name$.services_by_name['$service_name$'] = " "$service_descriptor_name$\n"; printer_->Print(m, file_descriptor_template); } void Generator::AddEnumToFileDescriptor( const EnumDescriptor& descriptor) const { std::map m; m["descriptor_name"] = kDescriptorKey; m["enum_name"] = descriptor.name(); m["enum_descriptor_name"] = ModuleLevelDescriptorName(descriptor); const char file_descriptor_template[] = "$descriptor_name$.enum_types_by_name['$enum_name$'] = " "$enum_descriptor_name$\n"; printer_->Print(m, file_descriptor_template); } void Generator::AddExtensionToFileDescriptor( const FieldDescriptor& descriptor) const { std::map m; m["descriptor_name"] = kDescriptorKey; m["field_name"] = descriptor.name(); const char file_descriptor_template[] = "$descriptor_name$.extensions_by_name['$field_name$'] = " "$field_name$\n"; printer_->Print(m, file_descriptor_template); } // Sets any necessary message_type and enum_type attributes // for the Python version of |field|. // // containing_type may be NULL, in which case this is a module-level field. // // python_dict_name is the name of the Python dict where we should // look the field up in the containing type. (e.g., fields_by_name // or extensions_by_name). We ignore python_dict_name if containing_type // is NULL. void Generator::FixForeignFieldsInField(const Descriptor* containing_type, const FieldDescriptor& field, const string& python_dict_name) const { const string field_referencing_expression = FieldReferencingExpression( containing_type, field, python_dict_name); std::map m; m["field_ref"] = field_referencing_expression; const Descriptor* foreign_message_type = field.message_type(); if (foreign_message_type) { m["foreign_type"] = ModuleLevelDescriptorName(*foreign_message_type); printer_->Print(m, "$field_ref$.message_type = $foreign_type$\n"); } const EnumDescriptor* enum_type = field.enum_type(); if (enum_type) { m["enum_type"] = ModuleLevelDescriptorName(*enum_type); printer_->Print(m, "$field_ref$.enum_type = $enum_type$\n"); } } // Returns the module-level expression for the given FieldDescriptor. // Only works for fields in the .proto file this Generator is generating for. // // containing_type may be NULL, in which case this is a module-level field. // // python_dict_name is the name of the Python dict where we should // look the field up in the containing type. (e.g., fields_by_name // or extensions_by_name). We ignore python_dict_name if containing_type // is NULL. string Generator::FieldReferencingExpression( const Descriptor* containing_type, const FieldDescriptor& field, const string& python_dict_name) const { // We should only ever be looking up fields in the current file. // The only things we refer to from other files are message descriptors. GOOGLE_CHECK_EQ(field.file(), file_) << field.file()->name() << " vs. " << file_->name(); if (!containing_type) { return field.name(); } return strings::Substitute( "$0.$1['$2']", ModuleLevelDescriptorName(*containing_type), python_dict_name, field.name()); } // Prints containing_type for nested descriptors or enum descriptors. template void Generator::FixContainingTypeInDescriptor( const DescriptorT& descriptor, const Descriptor* containing_descriptor) const { if (containing_descriptor != NULL) { const string nested_name = ModuleLevelDescriptorName(descriptor); const string parent_name = ModuleLevelDescriptorName( *containing_descriptor); printer_->Print( "$nested_name$.containing_type = $parent_name$\n", "nested_name", nested_name, "parent_name", parent_name); } } // Prints statements setting the message_type and enum_type fields in the // Python descriptor objects we've already output in ths file. We must // do this in a separate step due to circular references (otherwise, we'd // just set everything in the initial assignment statements). void Generator::FixForeignFieldsInDescriptors() const { for (int i = 0; i < file_->message_type_count(); ++i) { FixForeignFieldsInDescriptor(*file_->message_type(i), NULL); } for (int i = 0; i < file_->message_type_count(); ++i) { AddMessageToFileDescriptor(*file_->message_type(i)); } for (int i = 0; i < file_->enum_type_count(); ++i) { AddEnumToFileDescriptor(*file_->enum_type(i)); } for (int i = 0; i < file_->extension_count(); ++i) { AddExtensionToFileDescriptor(*file_->extension(i)); } // TODO(jieluo): Move this register to PrintFileDescriptor() when // FieldDescriptor.file is added in generated file. printer_->Print("_sym_db.RegisterFileDescriptor($name$)\n", "name", kDescriptorKey); printer_->Print("\n"); } // We need to not only set any necessary message_type fields, but // also need to call RegisterExtension() on each message we're // extending. void Generator::FixForeignFieldsInExtensions() const { // Top-level extensions. for (int i = 0; i < file_->extension_count(); ++i) { FixForeignFieldsInExtension(*file_->extension(i)); } // Nested extensions. for (int i = 0; i < file_->message_type_count(); ++i) { FixForeignFieldsInNestedExtensions(*file_->message_type(i)); } printer_->Print("\n"); } void Generator::FixForeignFieldsInExtension( const FieldDescriptor& extension_field) const { GOOGLE_CHECK(extension_field.is_extension()); // extension_scope() will be NULL for top-level extensions, which is // exactly what FixForeignFieldsInField() wants. FixForeignFieldsInField(extension_field.extension_scope(), extension_field, "extensions_by_name"); std::map m; // Confusingly, for FieldDescriptors that happen to be extensions, // containing_type() means "extended type." // On the other hand, extension_scope() will give us what we normally // mean by containing_type(). m["extended_message_class"] = ModuleLevelMessageName( *extension_field.containing_type()); m["field"] = FieldReferencingExpression(extension_field.extension_scope(), extension_field, "extensions_by_name"); printer_->Print(m, "$extended_message_class$.RegisterExtension($field$)\n"); } void Generator::FixForeignFieldsInNestedExtensions( const Descriptor& descriptor) const { // Recursively fix up extensions in all nested types. for (int i = 0; i < descriptor.nested_type_count(); ++i) { FixForeignFieldsInNestedExtensions(*descriptor.nested_type(i)); } // Fix up extensions directly contained within this type. for (int i = 0; i < descriptor.extension_count(); ++i) { FixForeignFieldsInExtension(*descriptor.extension(i)); } } // Returns a Python expression that instantiates a Python EnumValueDescriptor // object for the given C++ descriptor. void Generator::PrintEnumValueDescriptor( const EnumValueDescriptor& descriptor) const { // TODO(robinson): Fix up EnumValueDescriptor "type" fields. // More circular references. ::sigh:: string options_string; descriptor.options().SerializeToString(&options_string); std::map m; m["name"] = descriptor.name(); m["index"] = SimpleItoa(descriptor.index()); m["number"] = SimpleItoa(descriptor.number()); m["options"] = OptionsValue("EnumValueOptions", options_string); printer_->Print( m, "_descriptor.EnumValueDescriptor(\n" " name='$name$', index=$index$, number=$number$,\n" " options=$options$,\n" " type=None)"); } // Returns a Python expression that calls descriptor._ParseOptions using // the given descriptor class name and serialized options protobuf string. string Generator::OptionsValue( const string& class_name, const string& serialized_options) const { if (serialized_options.length() == 0 || GeneratingDescriptorProto()) { return "None"; } else { string full_class_name = "descriptor_pb2." + class_name; //##!PY25 return "_descriptor._ParseOptions(" + full_class_name + "(), b'" //##!PY25 + CEscape(serialized_options)+ "')"; return "_descriptor._ParseOptions(" + full_class_name + "(), _b('" //##PY25 + CEscape(serialized_options)+ "'))"; //##PY25 } } // Prints an expression for a Python FieldDescriptor for |field|. void Generator::PrintFieldDescriptor( const FieldDescriptor& field, bool is_extension) const { string options_string; field.options().SerializeToString(&options_string); std::map m; m["name"] = field.name(); m["full_name"] = field.full_name(); m["index"] = SimpleItoa(field.index()); m["number"] = SimpleItoa(field.number()); m["type"] = SimpleItoa(field.type()); m["cpp_type"] = SimpleItoa(field.cpp_type()); m["label"] = SimpleItoa(field.label()); m["has_default_value"] = field.has_default_value() ? "True" : "False"; m["default_value"] = StringifyDefaultValue(field); m["is_extension"] = is_extension ? "True" : "False"; m["options"] = OptionsValue("FieldOptions", options_string); m["json_name"] = field.has_json_name() ? ", json_name='" + field.json_name() + "'": ""; // We always set message_type and enum_type to None at this point, and then // these fields in correctly after all referenced descriptors have been // defined and/or imported (see FixForeignFieldsInDescriptors()). const char field_descriptor_decl[] = "_descriptor.FieldDescriptor(\n" " name='$name$', full_name='$full_name$', index=$index$,\n" " number=$number$, type=$type$, cpp_type=$cpp_type$, label=$label$,\n" " has_default_value=$has_default_value$, default_value=$default_value$,\n" " message_type=None, enum_type=None, containing_type=None,\n" " is_extension=$is_extension$, extension_scope=None,\n" " options=$options$$json_name$, file=DESCRIPTOR)"; printer_->Print(m, field_descriptor_decl); } // Helper for Print{Fields,Extensions}InDescriptor(). void Generator::PrintFieldDescriptorsInDescriptor( const Descriptor& message_descriptor, bool is_extension, const string& list_variable_name, int (Descriptor::*CountFn)() const, const FieldDescriptor* (Descriptor::*GetterFn)(int) const) const { printer_->Print("$list$=[\n", "list", list_variable_name); printer_->Indent(); for (int i = 0; i < (message_descriptor.*CountFn)(); ++i) { PrintFieldDescriptor(*(message_descriptor.*GetterFn)(i), is_extension); printer_->Print(",\n"); } printer_->Outdent(); printer_->Print("],\n"); } // Prints a statement assigning "fields" to a list of Python FieldDescriptors, // one for each field present in message_descriptor. void Generator::PrintFieldsInDescriptor( const Descriptor& message_descriptor) const { const bool is_extension = false; PrintFieldDescriptorsInDescriptor( message_descriptor, is_extension, "fields", &Descriptor::field_count, &Descriptor::field); } // Prints a statement assigning "extensions" to a list of Python // FieldDescriptors, one for each extension present in message_descriptor. void Generator::PrintExtensionsInDescriptor( const Descriptor& message_descriptor) const { const bool is_extension = true; PrintFieldDescriptorsInDescriptor( message_descriptor, is_extension, "extensions", &Descriptor::extension_count, &Descriptor::extension); } bool Generator::GeneratingDescriptorProto() const { return file_->name() == "google/protobuf/descriptor.proto"; } // Returns the unique Python module-level identifier given to a descriptor. // This name is module-qualified iff the given descriptor describes an // entity that doesn't come from the current file. template string Generator::ModuleLevelDescriptorName( const DescriptorT& descriptor) const { // FIXME(robinson): // We currently don't worry about collisions with underscores in the type // names, so these would collide in nasty ways if found in the same file: // OuterProto.ProtoA.ProtoB // OuterProto_ProtoA.ProtoB # Underscore instead of period. // As would these: // OuterProto.ProtoA_.ProtoB // OuterProto.ProtoA._ProtoB # Leading vs. trailing underscore. // (Contrived, but certainly possible). // // The C++ implementation doesn't guard against this either. Leaving // it for now... string name = NamePrefixedWithNestedTypes(descriptor, "_"); UpperString(&name); // Module-private for now. Easy to make public later; almost impossible // to make private later. name = "_" + name; // We now have the name relative to its own module. Also qualify with // the module name iff this descriptor is from a different .proto file. if (descriptor.file() != file_) { name = ModuleAlias(descriptor.file()->name()) + "." + name; } return name; } // Returns the name of the message class itself, not the descriptor. // Like ModuleLevelDescriptorName(), module-qualifies the name iff // the given descriptor describes an entity that doesn't come from // the current file. string Generator::ModuleLevelMessageName(const Descriptor& descriptor) const { string name = NamePrefixedWithNestedTypes(descriptor, "."); if (descriptor.file() != file_) { name = ModuleAlias(descriptor.file()->name()) + "." + name; } return name; } // Returns the unique Python module-level identifier given to a service // descriptor. string Generator::ModuleLevelServiceDescriptorName( const ServiceDescriptor& descriptor) const { string name = descriptor.name(); UpperString(&name); name = "_" + name; if (descriptor.file() != file_) { name = ModuleAlias(descriptor.file()->name()) + "." + name; } return name; } // Prints standard constructor arguments serialized_start and serialized_end. // Args: // descriptor: The cpp descriptor to have a serialized reference. // proto: A proto // Example printer output: // serialized_start=41, // serialized_end=43, // template void Generator::PrintSerializedPbInterval( const DescriptorT& descriptor, DescriptorProtoT& proto) const { descriptor.CopyTo(&proto); string sp; proto.SerializeToString(&sp); int offset = file_descriptor_serialized_.find(sp); GOOGLE_CHECK_GE(offset, 0); printer_->Print("serialized_start=$serialized_start$,\n" "serialized_end=$serialized_end$,\n", "serialized_start", SimpleItoa(offset), "serialized_end", SimpleItoa(offset + sp.size())); } namespace { void PrintDescriptorOptionsFixingCode(const string& descriptor, const string& options, io::Printer* printer) { // TODO(xiaofeng): I have added a method _SetOptions() to DescriptorBase // in proto2 python runtime but it couldn't be used here because appengine // uses a snapshot version of the library in which the new method is not // yet present. After appengine has synced their runtime library, the code // below should be cleaned up to use _SetOptions(). printer->Print( "$descriptor$.has_options = True\n" "$descriptor$._options = $options$\n", "descriptor", descriptor, "options", options); } } // namespace // Prints expressions that set the options field of all descriptors. void Generator::FixAllDescriptorOptions() const { // Prints an expression that sets the file descriptor's options. string file_options = OptionsValue( "FileOptions", file_->options().SerializeAsString()); if (file_options != "None") { PrintDescriptorOptionsFixingCode(kDescriptorKey, file_options, printer_); } // Prints expressions that set the options for all top level enums. for (int i = 0; i < file_->enum_type_count(); ++i) { const EnumDescriptor& enum_descriptor = *file_->enum_type(i); FixOptionsForEnum(enum_descriptor); } // Prints expressions that set the options for all top level extensions. for (int i = 0; i < file_->extension_count(); ++i) { const FieldDescriptor& field = *file_->extension(i); FixOptionsForField(field); } // Prints expressions that set the options for all messages, nested enums, // nested extensions and message fields. for (int i = 0; i < file_->message_type_count(); ++i) { FixOptionsForMessage(*file_->message_type(i)); } } void Generator::FixOptionsForOneof(const OneofDescriptor& oneof) const { string oneof_options = OptionsValue( "OneofOptions", oneof.options().SerializeAsString()); if (oneof_options != "None") { string oneof_name = strings::Substitute( "$0.$1['$2']", ModuleLevelDescriptorName(*oneof.containing_type()), "oneofs_by_name", oneof.name()); PrintDescriptorOptionsFixingCode(oneof_name, oneof_options, printer_); } } // Prints expressions that set the options for an enum descriptor and its // value descriptors. void Generator::FixOptionsForEnum(const EnumDescriptor& enum_descriptor) const { string descriptor_name = ModuleLevelDescriptorName(enum_descriptor); string enum_options = OptionsValue( "EnumOptions", enum_descriptor.options().SerializeAsString()); if (enum_options != "None") { PrintDescriptorOptionsFixingCode(descriptor_name, enum_options, printer_); } for (int i = 0; i < enum_descriptor.value_count(); ++i) { const EnumValueDescriptor& value_descriptor = *enum_descriptor.value(i); string value_options = OptionsValue( "EnumValueOptions", value_descriptor.options().SerializeAsString()); if (value_options != "None") { PrintDescriptorOptionsFixingCode( StringPrintf("%s.values_by_name[\"%s\"]", descriptor_name.c_str(), value_descriptor.name().c_str()), value_options, printer_); } } } // Prints expressions that set the options for field descriptors (including // extensions). void Generator::FixOptionsForField( const FieldDescriptor& field) const { string field_options = OptionsValue( "FieldOptions", field.options().SerializeAsString()); if (field_options != "None") { string field_name; if (field.is_extension()) { if (field.extension_scope() == NULL) { // Top level extensions. field_name = field.name(); } else { field_name = FieldReferencingExpression( field.extension_scope(), field, "extensions_by_name"); } } else { field_name = FieldReferencingExpression( field.containing_type(), field, "fields_by_name"); } PrintDescriptorOptionsFixingCode(field_name, field_options, printer_); } } // Prints expressions that set the options for a message and all its inner // types (nested messages, nested enums, extensions, fields). void Generator::FixOptionsForMessage(const Descriptor& descriptor) const { // Nested messages. for (int i = 0; i < descriptor.nested_type_count(); ++i) { FixOptionsForMessage(*descriptor.nested_type(i)); } // Oneofs. for (int i = 0; i < descriptor.oneof_decl_count(); ++i) { FixOptionsForOneof(*descriptor.oneof_decl(i)); } // Enums. for (int i = 0; i < descriptor.enum_type_count(); ++i) { FixOptionsForEnum(*descriptor.enum_type(i)); } // Fields. for (int i = 0; i < descriptor.field_count(); ++i) { const FieldDescriptor& field = *descriptor.field(i); FixOptionsForField(field); } // Extensions. for (int i = 0; i < descriptor.extension_count(); ++i) { const FieldDescriptor& field = *descriptor.extension(i); FixOptionsForField(field); } // Message option for this message. string message_options = OptionsValue( "MessageOptions", descriptor.options().SerializeAsString()); if (message_options != "None") { string descriptor_name = ModuleLevelDescriptorName(descriptor); PrintDescriptorOptionsFixingCode(descriptor_name, message_options, printer_); } } // If a dependency forwards other files through public dependencies, let's // copy over the corresponding module aliases. void Generator::CopyPublicDependenciesAliases( const string& copy_from, const FileDescriptor* file) const { for (int i = 0; i < file->public_dependency_count(); ++i) { string module_name = ModuleName(file->public_dependency(i)->name()); string module_alias = ModuleAlias(file->public_dependency(i)->name()); // There's no module alias in the dependent file if it was generated by // an old protoc (less than 3.0.0-alpha-1). Use module name in this // situation. printer_->Print("try:\n" " $alias$ = $copy_from$.$alias$\n" "except AttributeError:\n" " $alias$ = $copy_from$.$module$\n", "alias", module_alias, "module", module_name, "copy_from", copy_from); CopyPublicDependenciesAliases(copy_from, file->public_dependency(i)); } } } // namespace python } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/python/python_generator.h000066400000000000000000000165761334102242000342030ustar00rootroot00000000000000// 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: robinson@google.com (Will Robinson) // // Generates Python code for a given .proto file. #ifndef GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__ #include #include #include #include namespace google { namespace protobuf { class Descriptor; class EnumDescriptor; class EnumValueDescriptor; class FieldDescriptor; class OneofDescriptor; class ServiceDescriptor; namespace io { class Printer; } namespace compiler { namespace python { // CodeGenerator implementation for generated Python protocol buffer classes. // 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. class LIBPROTOC_EXPORT Generator : public CodeGenerator { public: Generator(); virtual ~Generator(); // CodeGenerator methods. virtual bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* generator_context, string* error) const; private: void PrintImports() const; void PrintFileDescriptor() const; void PrintTopLevelEnums() const; void PrintAllNestedEnumsInFile() const; void PrintNestedEnums(const Descriptor& descriptor) const; void PrintEnum(const EnumDescriptor& enum_descriptor) const; void PrintTopLevelExtensions() const; void PrintFieldDescriptor( const FieldDescriptor& field, bool is_extension) const; void PrintFieldDescriptorsInDescriptor( const Descriptor& message_descriptor, bool is_extension, const string& list_variable_name, int (Descriptor::*CountFn)() const, const FieldDescriptor* (Descriptor::*GetterFn)(int) const) const; void PrintFieldsInDescriptor(const Descriptor& message_descriptor) const; void PrintExtensionsInDescriptor(const Descriptor& message_descriptor) const; void PrintMessageDescriptors() const; void PrintDescriptor(const Descriptor& message_descriptor) const; void PrintNestedDescriptors(const Descriptor& containing_descriptor) const; void PrintMessages() const; void PrintMessage(const Descriptor& message_descriptor, const string& prefix, std::vector* to_register) const; void PrintNestedMessages(const Descriptor& containing_descriptor, const string& prefix, std::vector* to_register) const; void FixForeignFieldsInDescriptors() const; void FixForeignFieldsInDescriptor( const Descriptor& descriptor, const Descriptor* containing_descriptor) const; void FixForeignFieldsInField(const Descriptor* containing_type, const FieldDescriptor& field, const string& python_dict_name) const; void AddMessageToFileDescriptor(const Descriptor& descriptor) const; void AddEnumToFileDescriptor(const EnumDescriptor& descriptor) const; void AddExtensionToFileDescriptor(const FieldDescriptor& descriptor) const; void AddServiceToFileDescriptor(const ServiceDescriptor& descriptor) const; string FieldReferencingExpression(const Descriptor* containing_type, const FieldDescriptor& field, const string& python_dict_name) const; template void FixContainingTypeInDescriptor( const DescriptorT& descriptor, const Descriptor* containing_descriptor) const; void FixForeignFieldsInExtensions() const; void FixForeignFieldsInExtension( const FieldDescriptor& extension_field) const; void FixForeignFieldsInNestedExtensions(const Descriptor& descriptor) const; void PrintServices() const; void PrintServiceDescriptors() const; void PrintServiceDescriptor(const ServiceDescriptor& descriptor) const; void PrintServiceClass(const ServiceDescriptor& descriptor) const; void PrintServiceStub(const ServiceDescriptor& descriptor) const; void PrintDescriptorKeyAndModuleName( const ServiceDescriptor& descriptor) const; void PrintEnumValueDescriptor(const EnumValueDescriptor& descriptor) const; string OptionsValue(const string& class_name, const string& serialized_options) const; bool GeneratingDescriptorProto() const; template string ModuleLevelDescriptorName(const DescriptorT& descriptor) const; string ModuleLevelMessageName(const Descriptor& descriptor) const; string ModuleLevelServiceDescriptorName( const ServiceDescriptor& descriptor) const; template void PrintSerializedPbInterval( const DescriptorT& descriptor, DescriptorProtoT& proto) const; void FixAllDescriptorOptions() const; void FixOptionsForField(const FieldDescriptor& field) const; void FixOptionsForOneof(const OneofDescriptor& oneof) const; void FixOptionsForEnum(const EnumDescriptor& descriptor) const; void FixOptionsForMessage(const Descriptor& descriptor) const; void CopyPublicDependenciesAliases( const string& copy_from, const FileDescriptor* file) const; // Very coarse-grained lock to ensure that Generate() is reentrant. // Guards file_, printer_ and file_descriptor_serialized_. mutable Mutex mutex_; mutable const FileDescriptor* file_; // Set in Generate(). Under mutex_. mutable string file_descriptor_serialized_; mutable io::Printer* printer_; // Set in Generate(). Under mutex_. GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Generator); }; } // namespace python } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__ python_plugin_unittest.cc000066400000000000000000000152531334102242000355200ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/python// 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) // // TODO(kenton): Share code with the versions of this test in other languages? // It seemed like parameterizing it would add more complexity than it is // worth. #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace python { namespace { class TestGenerator : public CodeGenerator { public: TestGenerator() {} ~TestGenerator() {} virtual bool Generate(const FileDescriptor* file, const string& parameter, GeneratorContext* context, string* error) const { TryInsert("test_pb2.py", "imports", context); TryInsert("test_pb2.py", "module_scope", context); TryInsert("test_pb2.py", "class_scope:foo.Bar", context); TryInsert("test_pb2.py", "class_scope:foo.Bar.Baz", context); return true; } void TryInsert(const string& filename, const string& insertion_point, GeneratorContext* context) const { google::protobuf::scoped_ptr output( context->OpenForInsert(filename, insertion_point)); io::Printer printer(output.get(), '$'); printer.Print("// inserted $name$\n", "name", insertion_point); } }; // This test verifies that all the expected insertion points exist. It does // not verify that they are correctly-placed; that would require actually // compiling the output which is a bit more than I care to do for this test. TEST(PythonPluginTest, PluginTest) { GOOGLE_CHECK_OK(File::SetContents(TestTempDir() + "/test.proto", "syntax = \"proto2\";\n" "package foo;\n" "message Bar {\n" " message Baz {}\n" "}\n", true)); google::protobuf::compiler::CommandLineInterface cli; cli.SetInputsAreProtoPathRelative(true); python::Generator python_generator; TestGenerator test_generator; cli.RegisterGenerator("--python_out", &python_generator, ""); cli.RegisterGenerator("--test_out", &test_generator, ""); string proto_path = "-I" + TestTempDir(); string python_out = "--python_out=" + TestTempDir(); string test_out = "--test_out=" + TestTempDir(); const char* argv[] = { "protoc", proto_path.c_str(), python_out.c_str(), test_out.c_str(), "test.proto" }; EXPECT_EQ(0, cli.Run(5, argv)); } // This test verifies that the generated Python output uses regular imports (as // opposed to importlib) in the usual case where the .proto file paths do not // not contain any Python keywords. TEST(PythonPluginTest, ImportTest) { // Create files test1.proto and test2.proto with the former importing the // latter. GOOGLE_CHECK_OK(File::SetContents(TestTempDir() + "/test1.proto", "syntax = \"proto3\";\n" "package foo;\n" "import \"test2.proto\";" "message Message1 {\n" " Message2 message_2 = 1;\n" "}\n", true)); GOOGLE_CHECK_OK(File::SetContents(TestTempDir() + "/test2.proto", "syntax = \"proto3\";\n" "package foo;\n" "message Message2 {}\n", true)); google::protobuf::compiler::CommandLineInterface cli; cli.SetInputsAreProtoPathRelative(true); python::Generator python_generator; cli.RegisterGenerator("--python_out", &python_generator, ""); string proto_path = "-I" + TestTempDir(); string python_out = "--python_out=" + TestTempDir(); const char* argv[] = {"protoc", proto_path.c_str(), "-I.", python_out.c_str(), "test1.proto"}; ASSERT_EQ(0, cli.Run(5, argv)); // Loop over the lines of the generated code and verify that we find an // ordinary Python import but do not find the string "importlib". string output; GOOGLE_CHECK_OK(File::GetContents(TestTempDir() + "/test1_pb2.py", &output, true)); std::vector lines = Split(output, "\n"); string expected_import = "import test2_pb2"; bool found_expected_import = false; for (int i = 0; i < lines.size(); ++i) { if (lines[i].find(expected_import) != string::npos) { found_expected_import = true; } EXPECT_EQ(string::npos, lines[i].find("importlib")); } EXPECT_TRUE(found_expected_import); } } // namespace } // namespace python } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/ruby/000077500000000000000000000000001334102242000300645ustar00rootroot00000000000000ruby_generated_code.proto000066400000000000000000000033331334102242000350650ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/rubysyntax = "proto3"; package A.B.C; message TestMessage { int32 optional_int32 = 1; int64 optional_int64 = 2; uint32 optional_uint32 = 3; uint64 optional_uint64 = 4; bool optional_bool = 5; double optional_double = 6; float optional_float = 7; string optional_string = 8; bytes optional_bytes = 9; TestEnum optional_enum = 10; TestMessage optional_msg = 11; repeated int32 repeated_int32 = 21; repeated int64 repeated_int64 = 22; repeated uint32 repeated_uint32 = 23; repeated uint64 repeated_uint64 = 24; repeated bool repeated_bool = 25; repeated double repeated_double = 26; repeated float repeated_float = 27; repeated string repeated_string = 28; repeated bytes repeated_bytes = 29; repeated TestEnum repeated_enum = 30; repeated TestMessage repeated_msg = 31; oneof my_oneof { int32 oneof_int32 = 41; int64 oneof_int64 = 42; uint32 oneof_uint32 = 43; uint64 oneof_uint64 = 44; bool oneof_bool = 45; double oneof_double = 46; float oneof_float = 47; string oneof_string = 48; bytes oneof_bytes = 49; TestEnum oneof_enum = 50; TestMessage oneof_msg = 51; } map map_int32_string = 61; map map_int64_string = 62; map map_uint32_string = 63; map map_uint64_string = 64; map map_bool_string = 65; map map_string_string = 66; map map_string_msg = 67; map map_string_enum = 68; map map_string_int32 = 69; map map_string_bool = 70; message NestedMessage { int32 foo = 1; } NestedMessage nested_message = 80; } enum TestEnum { Default = 0; A = 1; B = 2; C = 3; } ruby_generated_code_pb.rb000066400000000000000000000055141334102242000350110ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/ruby# Generated by the protocol buffer compiler. DO NOT EDIT! # source: ruby_generated_code.proto require 'google/protobuf' Google::Protobuf::DescriptorPool.generated_pool.build do add_message "A.B.C.TestMessage" do optional :optional_int32, :int32, 1 optional :optional_int64, :int64, 2 optional :optional_uint32, :uint32, 3 optional :optional_uint64, :uint64, 4 optional :optional_bool, :bool, 5 optional :optional_double, :double, 6 optional :optional_float, :float, 7 optional :optional_string, :string, 8 optional :optional_bytes, :bytes, 9 optional :optional_enum, :enum, 10, "A.B.C.TestEnum" optional :optional_msg, :message, 11, "A.B.C.TestMessage" repeated :repeated_int32, :int32, 21 repeated :repeated_int64, :int64, 22 repeated :repeated_uint32, :uint32, 23 repeated :repeated_uint64, :uint64, 24 repeated :repeated_bool, :bool, 25 repeated :repeated_double, :double, 26 repeated :repeated_float, :float, 27 repeated :repeated_string, :string, 28 repeated :repeated_bytes, :bytes, 29 repeated :repeated_enum, :enum, 30, "A.B.C.TestEnum" repeated :repeated_msg, :message, 31, "A.B.C.TestMessage" map :map_int32_string, :int32, :string, 61 map :map_int64_string, :int64, :string, 62 map :map_uint32_string, :uint32, :string, 63 map :map_uint64_string, :uint64, :string, 64 map :map_bool_string, :bool, :string, 65 map :map_string_string, :string, :string, 66 map :map_string_msg, :string, :message, 67, "A.B.C.TestMessage" map :map_string_enum, :string, :enum, 68, "A.B.C.TestEnum" map :map_string_int32, :string, :int32, 69 map :map_string_bool, :string, :bool, 70 optional :nested_message, :message, 80, "A.B.C.TestMessage.NestedMessage" oneof :my_oneof do optional :oneof_int32, :int32, 41 optional :oneof_int64, :int64, 42 optional :oneof_uint32, :uint32, 43 optional :oneof_uint64, :uint64, 44 optional :oneof_bool, :bool, 45 optional :oneof_double, :double, 46 optional :oneof_float, :float, 47 optional :oneof_string, :string, 48 optional :oneof_bytes, :bytes, 49 optional :oneof_enum, :enum, 50, "A.B.C.TestEnum" optional :oneof_msg, :message, 51, "A.B.C.TestMessage" end end add_message "A.B.C.TestMessage.NestedMessage" do optional :foo, :int32, 1 end add_enum "A.B.C.TestEnum" do value :Default, 0 value :A, 1 value :B, 2 value :C, 3 end end module A module B module C TestMessage = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage").msgclass TestMessage::NestedMessage = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestMessage.NestedMessage").msgclass TestEnum = Google::Protobuf::DescriptorPool.generated_pool.lookup("A.B.C.TestEnum").enummodule end end end python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/ruby/ruby_generator.cc000066400000000000000000000406501334102242000334270ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include using google::protobuf::internal::scoped_ptr; namespace google { namespace protobuf { namespace compiler { namespace ruby { // Forward decls. std::string IntToString(int32 value); std::string GetRequireName(const std::string& proto_file); std::string LabelForField(google::protobuf::FieldDescriptor* field); std::string TypeName(google::protobuf::FieldDescriptor* field); void GenerateMessage(const google::protobuf::Descriptor* message, google::protobuf::io::Printer* printer); void GenerateEnum(const google::protobuf::EnumDescriptor* en, google::protobuf::io::Printer* printer); void GenerateMessageAssignment( const std::string& prefix, const google::protobuf::Descriptor* message, google::protobuf::io::Printer* printer); void GenerateEnumAssignment( const std::string& prefix, const google::protobuf::EnumDescriptor* en, google::protobuf::io::Printer* printer); std::string IntToString(int32 value) { std::ostringstream os; os << value; return os.str(); } std::string GetRequireName(const std::string& proto_file) { int lastindex = proto_file.find_last_of("."); return proto_file.substr(0, lastindex) + "_pb"; } std::string GetOutputFilename(const std::string& proto_file) { return GetRequireName(proto_file) + ".rb"; } std::string LabelForField(const google::protobuf::FieldDescriptor* field) { switch (field->label()) { case FieldDescriptor::LABEL_OPTIONAL: return "optional"; case FieldDescriptor::LABEL_REQUIRED: return "required"; case FieldDescriptor::LABEL_REPEATED: return "repeated"; default: assert(false); return ""; } } std::string TypeName(const google::protobuf::FieldDescriptor* field) { switch (field->type()) { case FieldDescriptor::TYPE_INT32: return "int32"; case FieldDescriptor::TYPE_INT64: return "int64"; case FieldDescriptor::TYPE_UINT32: return "uint32"; case FieldDescriptor::TYPE_UINT64: return "uint64"; case FieldDescriptor::TYPE_SINT32: return "sint32"; case FieldDescriptor::TYPE_SINT64: return "sint64"; case FieldDescriptor::TYPE_FIXED32: return "fixed32"; case FieldDescriptor::TYPE_FIXED64: return "fixed64"; case FieldDescriptor::TYPE_SFIXED32: return "sfixed32"; case FieldDescriptor::TYPE_SFIXED64: return "sfixed64"; case FieldDescriptor::TYPE_DOUBLE: return "double"; case FieldDescriptor::TYPE_FLOAT: return "float"; case FieldDescriptor::TYPE_BOOL: return "bool"; case FieldDescriptor::TYPE_ENUM: return "enum"; case FieldDescriptor::TYPE_STRING: return "string"; case FieldDescriptor::TYPE_BYTES: return "bytes"; case FieldDescriptor::TYPE_MESSAGE: return "message"; case FieldDescriptor::TYPE_GROUP: return "group"; default: assert(false); return ""; } } void GenerateField(const google::protobuf::FieldDescriptor* field, google::protobuf::io::Printer* printer) { if (field->is_map()) { const FieldDescriptor* key_field = field->message_type()->FindFieldByNumber(1); const FieldDescriptor* value_field = field->message_type()->FindFieldByNumber(2); printer->Print( "map :$name$, :$key_type$, :$value_type$, $number$", "name", field->name(), "key_type", TypeName(key_field), "value_type", TypeName(value_field), "number", IntToString(field->number())); if (value_field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { printer->Print( ", \"$subtype$\"\n", "subtype", value_field->message_type()->full_name()); } else if (value_field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { printer->Print( ", \"$subtype$\"\n", "subtype", value_field->enum_type()->full_name()); } else { printer->Print("\n"); } } else { printer->Print( "$label$ :$name$, ", "label", LabelForField(field), "name", field->name()); printer->Print( ":$type$, $number$", "type", TypeName(field), "number", IntToString(field->number())); if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { printer->Print( ", \"$subtype$\"\n", "subtype", field->message_type()->full_name()); } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { printer->Print( ", \"$subtype$\"\n", "subtype", field->enum_type()->full_name()); } else { printer->Print("\n"); } } } void GenerateOneof(const google::protobuf::OneofDescriptor* oneof, google::protobuf::io::Printer* printer) { printer->Print( "oneof :$name$ do\n", "name", oneof->name()); printer->Indent(); for (int i = 0; i < oneof->field_count(); i++) { const FieldDescriptor* field = oneof->field(i); GenerateField(field, printer); } printer->Outdent(); printer->Print("end\n"); } void GenerateMessage(const google::protobuf::Descriptor* message, google::protobuf::io::Printer* printer) { // Don't generate MapEntry messages -- we use the Ruby extension's native // support for map fields instead. if (message->options().map_entry()) { return; } printer->Print( "add_message \"$name$\" do\n", "name", message->full_name()); printer->Indent(); for (int i = 0; i < message->field_count(); i++) { const FieldDescriptor* field = message->field(i); if (!field->containing_oneof()) { GenerateField(field, printer); } } for (int i = 0; i < message->oneof_decl_count(); i++) { const OneofDescriptor* oneof = message->oneof_decl(i); GenerateOneof(oneof, printer); } printer->Outdent(); printer->Print("end\n"); for (int i = 0; i < message->nested_type_count(); i++) { GenerateMessage(message->nested_type(i), printer); } for (int i = 0; i < message->enum_type_count(); i++) { GenerateEnum(message->enum_type(i), printer); } } void GenerateEnum(const google::protobuf::EnumDescriptor* en, google::protobuf::io::Printer* printer) { printer->Print( "add_enum \"$name$\" do\n", "name", en->full_name()); printer->Indent(); for (int i = 0; i < en->value_count(); i++) { const EnumValueDescriptor* value = en->value(i); printer->Print( "value :$name$, $number$\n", "name", value->name(), "number", IntToString(value->number())); } printer->Outdent(); printer->Print( "end\n"); } // Locale-agnostic utility functions. bool IsLower(char ch) { return ch >= 'a' && ch <= 'z'; } bool IsUpper(char ch) { return ch >= 'A' && ch <= 'Z'; } bool IsAlpha(char ch) { return IsLower(ch) || IsUpper(ch); } char ToUpper(char ch) { return IsLower(ch) ? (ch - 'a' + 'A') : ch; } // Package names in protobuf are snake_case by convention, but Ruby module // names must be PascalCased. // // foo_bar_baz -> FooBarBaz std::string PackageToModule(const std::string& name) { bool next_upper = true; std::string result; result.reserve(name.size()); for (int i = 0; i < name.size(); i++) { if (name[i] == '_') { next_upper = true; } else { if (next_upper) { result.push_back(ToUpper(name[i])); } else { result.push_back(name[i]); } next_upper = false; } } return result; } // Class and enum names in protobuf should be PascalCased by convention, but // since there is nothing enforcing this we need to ensure that they are valid // Ruby constants. That mainly means making sure that the first character is // an upper-case letter. std::string RubifyConstant(const std::string& name) { std::string ret = name; if (!ret.empty()) { if (IsLower(ret[0])) { // If it starts with a lowercase letter, capitalize it. ret[0] = ToUpper(ret[0]); } else if (!IsAlpha(ret[0])) { // Otherwise (e.g. if it begins with an underscore), we need to come up // with some prefix that starts with a capital letter. We could be smarter // here, e.g. try to strip leading underscores, but this may cause other // problems if the user really intended the name. So let's just prepend a // well-known suffix. ret = "PB_" + ret; } } return ret; } void GenerateMessageAssignment( const std::string& prefix, const google::protobuf::Descriptor* message, google::protobuf::io::Printer* printer) { // Don't generate MapEntry messages -- we use the Ruby extension's native // support for map fields instead. if (message->options().map_entry()) { return; } printer->Print( "$prefix$$name$ = ", "prefix", prefix, "name", RubifyConstant(message->name())); printer->Print( "Google::Protobuf::DescriptorPool.generated_pool." "lookup(\"$full_name$\").msgclass\n", "full_name", message->full_name()); std::string nested_prefix = prefix + message->name() + "::"; for (int i = 0; i < message->nested_type_count(); i++) { GenerateMessageAssignment(nested_prefix, message->nested_type(i), printer); } for (int i = 0; i < message->enum_type_count(); i++) { GenerateEnumAssignment(nested_prefix, message->enum_type(i), printer); } } void GenerateEnumAssignment( const std::string& prefix, const google::protobuf::EnumDescriptor* en, google::protobuf::io::Printer* printer) { printer->Print( "$prefix$$name$ = ", "prefix", prefix, "name", RubifyConstant(en->name())); printer->Print( "Google::Protobuf::DescriptorPool.generated_pool." "lookup(\"$full_name$\").enummodule\n", "full_name", en->full_name()); } int GeneratePackageModules( std::string package_name, google::protobuf::io::Printer* printer) { int levels = 0; while (!package_name.empty()) { size_t dot_index = package_name.find("."); string component; if (dot_index == string::npos) { component = package_name; package_name = ""; } else { component = package_name.substr(0, dot_index); package_name = package_name.substr(dot_index + 1); } component = PackageToModule(component); printer->Print( "module $name$\n", "name", component); printer->Indent(); levels++; } return levels; } void EndPackageModules( int levels, google::protobuf::io::Printer* printer) { while (levels > 0) { levels--; printer->Outdent(); printer->Print( "end\n"); } } bool UsesTypeFromFile(const Descriptor* message, const FileDescriptor* file, string* error) { for (int i = 0; i < message->field_count(); i++) { const FieldDescriptor* field = message->field(i); if ((field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && field->message_type()->file() == file) || (field->type() == FieldDescriptor::TYPE_ENUM && field->enum_type()->file() == file)) { *error = "proto3 message field " + field->full_name() + " in file " + file->name() + " has a dependency on a type from proto2 file " + file->name() + ". Ruby doesn't support proto2 yet, so we must fail."; return true; } } for (int i = 0; i < message->nested_type_count(); i++) { if (UsesTypeFromFile(message->nested_type(i), file, error)) { return true; } } return false; } // Ruby doesn't currently support proto2. This causes a failure even for proto3 // files that import proto2. But in some cases, the proto2 file is only being // imported to extend another proto2 message. The prime example is declaring // custom options by extending FileOptions/FieldOptions/etc. // // If the proto3 messages don't have any proto2 submessages, it is safe to omit // the dependency completely. Users won't be able to use any proto2 extensions, // but they already couldn't because proto2 messages aren't supported. // // If/when we add proto2 support, we should remove this. bool MaybeEmitDependency(const FileDescriptor* import, const FileDescriptor* from, io::Printer* printer, string* error) { if (import->syntax() == FileDescriptor::SYNTAX_PROTO2) { for (int i = 0; i < from->message_type_count(); i++) { if (UsesTypeFromFile(from->message_type(i), import, error)) { // Error text was already set by UsesTypeFromFile(). return false; } } // Ok to omit this proto2 dependency -- so we won't print anything. GOOGLE_LOG(WARNING) << "Omitting proto2 dependency '" << import->name() << "' from proto3 output file '" << GetOutputFilename(from->name()) << "' because we don't support proto2 and no proto2 " "types from that file are being used."; return true; } else { printer->Print( "require '$name$'\n", "name", GetRequireName(import->name())); return true; } } bool GenerateFile(const FileDescriptor* file, io::Printer* printer, string* error) { printer->Print( "# Generated by the protocol buffer compiler. DO NOT EDIT!\n" "# source: $filename$\n" "\n", "filename", file->name()); printer->Print( "require 'google/protobuf'\n\n"); for (int i = 0; i < file->dependency_count(); i++) { if (!MaybeEmitDependency(file->dependency(i), file, printer, error)) { return false; } } printer->Print( "Google::Protobuf::DescriptorPool.generated_pool.build do\n"); printer->Indent(); for (int i = 0; i < file->message_type_count(); i++) { GenerateMessage(file->message_type(i), printer); } for (int i = 0; i < file->enum_type_count(); i++) { GenerateEnum(file->enum_type(i), printer); } printer->Outdent(); printer->Print( "end\n\n"); int levels = GeneratePackageModules(file->package(), printer); for (int i = 0; i < file->message_type_count(); i++) { GenerateMessageAssignment("", file->message_type(i), printer); } for (int i = 0; i < file->enum_type_count(); i++) { GenerateEnumAssignment("", file->enum_type(i), printer); } EndPackageModules(levels, printer); return true; } bool Generator::Generate( const FileDescriptor* file, const string& parameter, GeneratorContext* generator_context, string* error) const { if (file->syntax() != FileDescriptor::SYNTAX_PROTO3) { *error = "Can only generate Ruby code for proto3 .proto files.\n" "Please add 'syntax = \"proto3\";' to the top of your .proto file.\n"; return false; } scoped_ptr output( generator_context->Open(GetOutputFilename(file->name()))); io::Printer printer(output.get(), '$'); return GenerateFile(file, &printer, error); } } // namespace ruby } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/ruby/ruby_generator.h000066400000000000000000000051471334102242000332730ustar00rootroot00000000000000// 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. // Generates Ruby code for a given .proto file. #ifndef GOOGLE_PROTOBUF_COMPILER_RUBY_GENERATOR_H__ #define GOOGLE_PROTOBUF_COMPILER_RUBY_GENERATOR_H__ #include #include namespace google { namespace protobuf { namespace compiler { namespace ruby { // CodeGenerator implementation for generated Ruby protocol buffer classes. // If you create your own protocol compiler binary and you want it to support // Ruby output, you can do so by registering an instance of this // CodeGenerator with the CommandLineInterface in your main() function. class LIBPROTOC_EXPORT Generator : public google::protobuf::compiler::CodeGenerator { virtual bool Generate( const FileDescriptor* file, const string& parameter, GeneratorContext* generator_context, string* error) const; }; } // namespace ruby } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_RUBY_GENERATOR_H__ ruby_generator_unittest.cc000066400000000000000000000100151334102242000352770ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/ruby// 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. #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace ruby { namespace { string FindRubyTestDir() { return TestSourceDir() + "/google/protobuf/compiler/ruby"; } // This test is a simple golden-file test over the output of the Ruby code // generator. When we make changes to the Ruby extension and alter the Ruby code // generator to use those changes, we should (i) manually test the output of the // code generator with the extension, and (ii) update the golden output above. // Some day, we may integrate build systems between protoc and the language // extensions to the point where we can do this test in a more automated way. TEST(RubyGeneratorTest, GeneratorTest) { string ruby_tests = FindRubyTestDir(); google::protobuf::compiler::CommandLineInterface cli; cli.SetInputsAreProtoPathRelative(true); ruby::Generator ruby_generator; cli.RegisterGenerator("--ruby_out", &ruby_generator, ""); // Copy generated_code.proto to the temporary test directory. string test_input; GOOGLE_CHECK_OK(File::GetContents( ruby_tests + "/ruby_generated_code.proto", &test_input, true)); GOOGLE_CHECK_OK(File::SetContents( TestTempDir() + "/ruby_generated_code.proto", test_input, true)); // Invoke the proto compiler (we will be inside TestTempDir() at this point). string ruby_out = "--ruby_out=" + TestTempDir(); string proto_path = "--proto_path=" + TestTempDir(); const char* argv[] = { "protoc", ruby_out.c_str(), proto_path.c_str(), "ruby_generated_code.proto", }; EXPECT_EQ(0, cli.Run(4, argv)); // Load the generated output and compare to the expected result. string output; GOOGLE_CHECK_OK(File::GetContents( TestTempDir() + "/ruby_generated_code_pb.rb", &output, true)); string expected_output; GOOGLE_CHECK_OK(File::GetContents( ruby_tests + "/ruby_generated_code_pb.rb", &expected_output, true)); EXPECT_EQ(expected_output, output); } } // namespace } // namespace ruby } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/subprocess.cc000066400000000000000000000340561334102242000316120ustar00rootroot00000000000000// 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 #include #include #include #ifndef _WIN32 #include #include #include #include #endif #include #include #include #include namespace google { namespace protobuf { namespace compiler { namespace { char* portable_strdup(const char* s) { char* ns = (char*) malloc(strlen(s) + 1); if (ns != NULL) { strcpy(ns, s); } return ns; } } // namespace #ifdef _WIN32 static void CloseHandleOrDie(HANDLE handle) { if (!CloseHandle(handle)) { GOOGLE_LOG(FATAL) << "CloseHandle: " << Subprocess::Win32ErrorMessage(GetLastError()); } } Subprocess::Subprocess() : process_start_error_(ERROR_SUCCESS), child_handle_(NULL), child_stdin_(NULL), child_stdout_(NULL) {} Subprocess::~Subprocess() { if (child_stdin_ != NULL) { CloseHandleOrDie(child_stdin_); } if (child_stdout_ != NULL) { CloseHandleOrDie(child_stdout_); } } void Subprocess::Start(const string& program, SearchMode search_mode) { // Create the pipes. HANDLE stdin_pipe_read; HANDLE stdin_pipe_write; HANDLE stdout_pipe_read; HANDLE stdout_pipe_write; if (!CreatePipe(&stdin_pipe_read, &stdin_pipe_write, NULL, 0)) { GOOGLE_LOG(FATAL) << "CreatePipe: " << Win32ErrorMessage(GetLastError()); } if (!CreatePipe(&stdout_pipe_read, &stdout_pipe_write, NULL, 0)) { GOOGLE_LOG(FATAL) << "CreatePipe: " << Win32ErrorMessage(GetLastError()); } // Make child side of the pipes inheritable. if (!SetHandleInformation(stdin_pipe_read, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) { GOOGLE_LOG(FATAL) << "SetHandleInformation: " << Win32ErrorMessage(GetLastError()); } if (!SetHandleInformation(stdout_pipe_write, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) { GOOGLE_LOG(FATAL) << "SetHandleInformation: " << Win32ErrorMessage(GetLastError()); } // Setup STARTUPINFO to redirect handles. STARTUPINFOA startup_info; ZeroMemory(&startup_info, sizeof(startup_info)); startup_info.cb = sizeof(startup_info); startup_info.dwFlags = STARTF_USESTDHANDLES; startup_info.hStdInput = stdin_pipe_read; startup_info.hStdOutput = stdout_pipe_write; startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE); if (startup_info.hStdError == INVALID_HANDLE_VALUE) { GOOGLE_LOG(FATAL) << "GetStdHandle: " << Win32ErrorMessage(GetLastError()); } // CreateProcess() mutates its second parameter. WTF? char* name_copy = portable_strdup(program.c_str()); // Create the process. PROCESS_INFORMATION process_info; if (CreateProcessA((search_mode == SEARCH_PATH) ? NULL : program.c_str(), (search_mode == SEARCH_PATH) ? name_copy : NULL, NULL, // process security attributes NULL, // thread security attributes TRUE, // inherit handles? 0, // obscure creation flags NULL, // environment (inherit from parent) NULL, // current directory (inherit from parent) &startup_info, &process_info)) { child_handle_ = process_info.hProcess; CloseHandleOrDie(process_info.hThread); child_stdin_ = stdin_pipe_write; child_stdout_ = stdout_pipe_read; } else { process_start_error_ = GetLastError(); CloseHandleOrDie(stdin_pipe_write); CloseHandleOrDie(stdout_pipe_read); } CloseHandleOrDie(stdin_pipe_read); CloseHandleOrDie(stdout_pipe_write); free(name_copy); } bool Subprocess::Communicate(const Message& input, Message* output, string* error) { if (process_start_error_ != ERROR_SUCCESS) { *error = Win32ErrorMessage(process_start_error_); return false; } GOOGLE_CHECK(child_handle_ != NULL) << "Must call Start() first."; string input_data = input.SerializeAsString(); string output_data; int input_pos = 0; while (child_stdout_ != NULL) { HANDLE handles[2]; int handle_count = 0; if (child_stdin_ != NULL) { handles[handle_count++] = child_stdin_; } if (child_stdout_ != NULL) { handles[handle_count++] = child_stdout_; } DWORD wait_result = WaitForMultipleObjects(handle_count, handles, FALSE, INFINITE); HANDLE signaled_handle = NULL; if (wait_result >= WAIT_OBJECT_0 && wait_result < WAIT_OBJECT_0 + handle_count) { signaled_handle = handles[wait_result - WAIT_OBJECT_0]; } else if (wait_result == WAIT_FAILED) { GOOGLE_LOG(FATAL) << "WaitForMultipleObjects: " << Win32ErrorMessage(GetLastError()); } else { GOOGLE_LOG(FATAL) << "WaitForMultipleObjects: Unexpected return code: " << wait_result; } if (signaled_handle == child_stdin_) { DWORD n; if (!WriteFile(child_stdin_, input_data.data() + input_pos, input_data.size() - input_pos, &n, NULL)) { // Child closed pipe. Presumably it will report an error later. // Pretend we're done for now. input_pos = input_data.size(); } else { input_pos += n; } if (input_pos == input_data.size()) { // We're done writing. Close. CloseHandleOrDie(child_stdin_); child_stdin_ = NULL; } } else if (signaled_handle == child_stdout_) { char buffer[4096]; DWORD n; if (!ReadFile(child_stdout_, buffer, sizeof(buffer), &n, NULL)) { // We're done reading. Close. CloseHandleOrDie(child_stdout_); child_stdout_ = NULL; } else { output_data.append(buffer, n); } } } if (child_stdin_ != NULL) { // Child did not finish reading input before it closed the output. // Presumably it exited with an error. CloseHandleOrDie(child_stdin_); child_stdin_ = NULL; } DWORD wait_result = WaitForSingleObject(child_handle_, INFINITE); if (wait_result == WAIT_FAILED) { GOOGLE_LOG(FATAL) << "WaitForSingleObject: " << Win32ErrorMessage(GetLastError()); } else if (wait_result != WAIT_OBJECT_0) { GOOGLE_LOG(FATAL) << "WaitForSingleObject: Unexpected return code: " << wait_result; } DWORD exit_code; if (!GetExitCodeProcess(child_handle_, &exit_code)) { GOOGLE_LOG(FATAL) << "GetExitCodeProcess: " << Win32ErrorMessage(GetLastError()); } CloseHandleOrDie(child_handle_); child_handle_ = NULL; if (exit_code != 0) { *error = strings::Substitute( "Plugin failed with status code $0.", exit_code); return false; } if (!output->ParseFromString(output_data)) { *error = "Plugin output is unparseable: " + CEscape(output_data); return false; } return true; } string Subprocess::Win32ErrorMessage(DWORD error_code) { char* message; // WTF? FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error_code, 0, (LPSTR)&message, // NOT A BUG! 0, NULL); string result = message; LocalFree(message); return result; } // =================================================================== #else // _WIN32 Subprocess::Subprocess() : child_pid_(-1), child_stdin_(-1), child_stdout_(-1) {} Subprocess::~Subprocess() { if (child_stdin_ != -1) { close(child_stdin_); } if (child_stdout_ != -1) { close(child_stdout_); } } void Subprocess::Start(const 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. // [0] is read end, [1] is write end. int stdin_pipe[2]; int stdout_pipe[2]; GOOGLE_CHECK(pipe(stdin_pipe) != -1); GOOGLE_CHECK(pipe(stdout_pipe) != -1); char* argv[2] = { portable_strdup(program.c_str()), NULL }; child_pid_ = fork(); if (child_pid_ == -1) { GOOGLE_LOG(FATAL) << "fork: " << strerror(errno); } else if (child_pid_ == 0) { // We are the child. dup2(stdin_pipe[0], STDIN_FILENO); dup2(stdout_pipe[1], STDOUT_FILENO); close(stdin_pipe[0]); close(stdin_pipe[1]); close(stdout_pipe[0]); close(stdout_pipe[1]); switch (search_mode) { case SEARCH_PATH: execvp(argv[0], argv); break; case EXACT_NAME: execv(argv[0], argv); break; } // Write directly to STDERR_FILENO to avoid stdio code paths that may do // stuff that is unsafe here. int ignored; ignored = write(STDERR_FILENO, argv[0], strlen(argv[0])); const char* message = ": program not found or is not executable\n"; ignored = write(STDERR_FILENO, message, strlen(message)); (void) ignored; // Must use _exit() rather than exit() to avoid flushing output buffers // that will also be flushed by the parent. _exit(1); } else { free(argv[0]); close(stdin_pipe[0]); close(stdout_pipe[1]); child_stdin_ = stdin_pipe[1]; child_stdout_ = stdout_pipe[0]; } } bool Subprocess::Communicate(const Message& input, Message* output, string* error) { GOOGLE_CHECK_NE(child_stdin_, -1) << "Must call Start() first."; // The "sighandler_t" typedef is GNU-specific, so define our own. typedef void SignalHandler(int); // Make sure SIGPIPE is disabled so that if the child dies it doesn't kill us. SignalHandler* old_pipe_handler = signal(SIGPIPE, SIG_IGN); string input_data = input.SerializeAsString(); string output_data; int input_pos = 0; int max_fd = std::max(child_stdin_, child_stdout_); while (child_stdout_ != -1) { fd_set read_fds; fd_set write_fds; FD_ZERO(&read_fds); FD_ZERO(&write_fds); if (child_stdout_ != -1) { FD_SET(child_stdout_, &read_fds); } if (child_stdin_ != -1) { FD_SET(child_stdin_, &write_fds); } if (select(max_fd + 1, &read_fds, &write_fds, NULL, NULL) < 0) { if (errno == EINTR) { // Interrupted by signal. Try again. continue; } else { GOOGLE_LOG(FATAL) << "select: " << strerror(errno); } } if (child_stdin_ != -1 && FD_ISSET(child_stdin_, &write_fds)) { int n = write(child_stdin_, input_data.data() + input_pos, input_data.size() - input_pos); if (n < 0) { // Child closed pipe. Presumably it will report an error later. // Pretend we're done for now. input_pos = input_data.size(); } else { input_pos += n; } if (input_pos == input_data.size()) { // We're done writing. Close. close(child_stdin_); child_stdin_ = -1; } } if (child_stdout_ != -1 && FD_ISSET(child_stdout_, &read_fds)) { char buffer[4096]; int n = read(child_stdout_, buffer, sizeof(buffer)); if (n > 0) { output_data.append(buffer, n); } else { // We're done reading. Close. close(child_stdout_); child_stdout_ = -1; } } } if (child_stdin_ != -1) { // Child did not finish reading input before it closed the output. // Presumably it exited with an error. close(child_stdin_); child_stdin_ = -1; } int status; while (waitpid(child_pid_, &status, 0) == -1) { if (errno != EINTR) { GOOGLE_LOG(FATAL) << "waitpid: " << strerror(errno); } } // Restore SIGPIPE handling. signal(SIGPIPE, old_pipe_handler); if (WIFEXITED(status)) { if (WEXITSTATUS(status) != 0) { int error_code = WEXITSTATUS(status); *error = strings::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); return false; } else { *error = "Neither WEXITSTATUS nor WTERMSIG is true?"; return false; } if (!output->ParseFromString(output_data)) { *error = "Plugin output is unparseable: " + CEscape(output_data); return false; } return true; } #endif // !_WIN32 } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/subprocess.h000066400000000000000000000073201334102242000314460ustar00rootroot00000000000000// 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_COMPILER_SUBPROCESS_H__ #define GOOGLE_PROTOBUF_COMPILER_SUBPROCESS_H__ #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN // right... #include #else // _WIN32 #include #include #endif // !_WIN32 #include #include namespace google { namespace protobuf { class Message; namespace compiler { // Utility class for launching sub-processes. class LIBPROTOC_EXPORT Subprocess { public: Subprocess(); ~Subprocess(); enum SearchMode { SEARCH_PATH, // Use PATH environment variable. EXACT_NAME // Program is an exact file name; don't use the PATH. }; // Start the subprocess. Currently we don't provide a way to specify // arguments as protoc plugins don't have any. void Start(const string& program, SearchMode search_mode); // Serialize the input message and pipe it to the subprocess's stdin, then // close the pipe. Meanwhile, read from the subprocess's stdout and parse // the data into *output. All this is done carefully to avoid deadlocks. // Returns true if successful. On any sort of error, returns false and sets // *error to a description of the problem. bool Communicate(const Message& input, Message* output, string* error); #ifdef _WIN32 // Given an error code, returns a human-readable error message. This is // defined here so that CommandLineInterface can share it. static string Win32ErrorMessage(DWORD error_code); #endif private: #ifdef _WIN32 DWORD process_start_error_; HANDLE child_handle_; // The file handles for our end of the child's pipes. We close each and // set it to NULL when no longer needed. HANDLE child_stdin_; HANDLE child_stdout_; #else // _WIN32 pid_t child_pid_; // The file descriptors for our end of the child's pipes. We close each and // set it to -1 when no longer needed. int child_stdin_; int child_stdout_; #endif // !_WIN32 }; } // namespace compiler } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMPILER_SUBPROCESS_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/test_plugin.cc000066400000000000000000000043411334102242000317510ustar00rootroot00000000000000// 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) // // This is a dummy code generator plugin used by // command_line_interface_unittest. #include #include #include #include int main(int argc, char* argv[]) { #ifdef _MSC_VER // Don't print a silly message or stick a modal dialog box in my face, // please. _set_abort_behavior(0, ~0); #endif // !_MSC_VER google::protobuf::compiler::MockCodeGenerator generator("test_plugin"); return google::protobuf::compiler::PluginMain(argc, argv, &generator); } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh000066400000000000000000000074711334102242000336310ustar00rootroot00000000000000#!/bin/sh # # Protocol Buffers - Google's data interchange format # Copyright 2009 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) # # Test protoc's zip output mode. fail() { echo "$@" >&2 exit 1 } TEST_TMPDIR=. PROTOC=./protoc JAR=jar UNZIP=unzip echo ' syntax = "proto2"; option java_multiple_files = true; option java_package = "test.jar"; option java_outer_classname = "Outer"; message Foo {} message Bar {} ' > $TEST_TMPDIR/testzip.proto $PROTOC \ --cpp_out=$TEST_TMPDIR/testzip.zip --python_out=$TEST_TMPDIR/testzip.zip \ --java_out=$TEST_TMPDIR/testzip.jar -I$TEST_TMPDIR testzip.proto \ || fail 'protoc failed.' echo "Testing output to zip..." if $UNZIP -h > /dev/null; then $UNZIP -t $TEST_TMPDIR/testzip.zip > $TEST_TMPDIR/testzip.list \ || fail 'unzip failed.' grep 'testing: testzip\.pb\.cc *OK$' $TEST_TMPDIR/testzip.list > /dev/null \ || fail 'testzip.pb.cc not found in output zip.' grep 'testing: testzip\.pb\.h *OK$' $TEST_TMPDIR/testzip.list > /dev/null \ || fail 'testzip.pb.h not found in output zip.' grep 'testing: testzip_pb2\.py *OK$' $TEST_TMPDIR/testzip.list > /dev/null \ || fail 'testzip_pb2.py not found in output zip.' grep -i 'manifest' $TEST_TMPDIR/testzip.list > /dev/null \ && fail 'Zip file contained manifest.' else echo "Warning: 'unzip' command not available. Skipping test." fi echo "Testing output to jar..." if $JAR c $TEST_TMPDIR/testzip.proto > /dev/null; then $JAR tf $TEST_TMPDIR/testzip.jar > $TEST_TMPDIR/testzip.list \ || fail 'jar failed.' # Check that -interface.jar timestamps are normalized: if [[ "$(TZ=UTC $JAR tvf $TEST_TMPDIR/testzip.jar)" != *'Tue Jan 01 00:00:00 UTC 1980'* ]]; then fail 'Zip did not contain normalized timestamps' fi grep '^test/jar/Foo\.java$' $TEST_TMPDIR/testzip.list > /dev/null \ || fail 'Foo.java not found in output jar.' grep '^test/jar/Bar\.java$' $TEST_TMPDIR/testzip.list > /dev/null \ || fail 'Bar.java not found in output jar.' grep '^test/jar/Outer\.java$' $TEST_TMPDIR/testzip.list > /dev/null \ || fail 'Outer.java not found in output jar.' grep '^META-INF/MANIFEST\.MF$' $TEST_TMPDIR/testzip.list > /dev/null \ || fail 'Manifest not found in output jar.' else echo "Warning: 'jar' command not available. Skipping test." fi echo PASS python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/zip_writer.cc000066400000000000000000000246751334102242000316260ustar00rootroot00000000000000// 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. // 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: ambrose@google.com (Ambrose Feinstein), // kenton@google.com (Kenton Varda) // // Based on http://www.pkware.com/documents/casestudies/APPNOTE.TXT #include #include namespace google { namespace protobuf { namespace compiler { // January 1, 1980 as a DOS date. // see https://msdn.microsoft.com/en-us/library/9kkf9tah.aspx static const uint16 kDosEpoch = 1 << 5 | 1; static const uint32 kCRC32Table[256] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; static uint32 ComputeCRC32(const string &buf) { uint32 x = ~0U; for (int i = 0; i < buf.size(); ++i) { unsigned char c = buf[i]; x = kCRC32Table[(x ^ c) & 0xff] ^ (x >> 8); } return ~x; } static void WriteShort(io::CodedOutputStream *out, uint16 val) { uint8 p[2]; p[0] = static_cast(val); p[1] = static_cast(val >> 8); out->WriteRaw(p, 2); } ZipWriter::ZipWriter(io::ZeroCopyOutputStream* raw_output) : raw_output_(raw_output) {} ZipWriter::~ZipWriter() {} bool ZipWriter::Write(const string& filename, const string& contents) { FileInfo info; info.name = filename; uint16 filename_size = filename.size(); info.offset = raw_output_->ByteCount(); info.size = contents.size(); info.crc32 = ComputeCRC32(contents); files_.push_back(info); // write file header io::CodedOutputStream output(raw_output_); output.WriteLittleEndian32(0x04034b50); // magic WriteShort(&output, 10); // version needed to extract WriteShort(&output, 0); // flags WriteShort(&output, 0); // compression method: stored WriteShort(&output, 0); // last modified time WriteShort(&output, kDosEpoch); // last modified date output.WriteLittleEndian32(info.crc32); // crc-32 output.WriteLittleEndian32(info.size); // compressed size output.WriteLittleEndian32(info.size); // uncompressed size WriteShort(&output, filename_size); // file name length WriteShort(&output, 0); // extra field length output.WriteString(filename); // file name output.WriteString(contents); // file data return !output.HadError(); } bool ZipWriter::WriteDirectory() { uint16 num_entries = files_.size(); uint32 dir_ofs = raw_output_->ByteCount(); // write central directory io::CodedOutputStream output(raw_output_); for (int i = 0; i < num_entries; ++i) { const string &filename = files_[i].name; uint16 filename_size = filename.size(); uint32 crc32 = files_[i].crc32; uint32 size = files_[i].size; uint32 offset = files_[i].offset; output.WriteLittleEndian32(0x02014b50); // magic WriteShort(&output, 10); // version made by WriteShort(&output, 10); // version needed to extract WriteShort(&output, 0); // flags WriteShort(&output, 0); // compression method: stored WriteShort(&output, 0); // last modified time WriteShort(&output, kDosEpoch); // last modified date output.WriteLittleEndian32(crc32); // crc-32 output.WriteLittleEndian32(size); // compressed size output.WriteLittleEndian32(size); // uncompressed size WriteShort(&output, filename_size); // file name length WriteShort(&output, 0); // extra field length WriteShort(&output, 0); // file comment length WriteShort(&output, 0); // starting disk number WriteShort(&output, 0); // internal file attributes output.WriteLittleEndian32(0); // external file attributes output.WriteLittleEndian32(offset); // local header offset output.WriteString(filename); // file name } uint32 dir_len = output.ByteCount(); // write end of central directory marker output.WriteLittleEndian32(0x06054b50); // magic WriteShort(&output, 0); // disk number WriteShort(&output, 0); // disk with start of central directory WriteShort(&output, num_entries); // central directory entries (this disk) WriteShort(&output, num_entries); // central directory entries (total) output.WriteLittleEndian32(dir_len); // central directory byte size output.WriteLittleEndian32(dir_ofs); // central directory offset WriteShort(&output, 0); // comment length return output.HadError(); } } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/compiler/zip_writer.h000066400000000000000000000076111334102242000314570ustar00rootroot00000000000000// 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. // 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 #include #include namespace google { namespace protobuf { namespace compiler { class ZipWriter { public: ZipWriter(io::ZeroCopyOutputStream* raw_output); ~ZipWriter(); bool Write(const string& filename, const string& contents); bool WriteDirectory(); private: struct FileInfo { string name; uint32 offset; uint32 size; uint32 crc32; }; io::ZeroCopyOutputStream* raw_output_; std::vector files_; }; } // namespace compiler } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/descriptor.cc000066400000000000000000010227151334102242000277660ustar00rootroot00000000000000// 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 #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef PACKAGE // autoheader #defines this. :( namespace google { namespace protobuf { struct Symbol { enum Type { NULL_SYMBOL, MESSAGE, FIELD, ONEOF, ENUM, ENUM_VALUE, SERVICE, METHOD, PACKAGE }; Type type; union { const Descriptor* descriptor; const FieldDescriptor* field_descriptor; const OneofDescriptor* oneof_descriptor; const EnumDescriptor* enum_descriptor; const EnumValueDescriptor* enum_value_descriptor; const ServiceDescriptor* service_descriptor; const MethodDescriptor* method_descriptor; const FileDescriptor* package_file_descriptor; }; inline Symbol() : type(NULL_SYMBOL) { descriptor = NULL; } inline bool IsNull() const { return type == NULL_SYMBOL; } inline bool IsType() const { return type == MESSAGE || type == ENUM; } inline bool IsAggregate() const { return type == MESSAGE || type == PACKAGE || type == ENUM || type == SERVICE; } #define CONSTRUCTOR(TYPE, TYPE_CONSTANT, FIELD) \ inline explicit Symbol(const TYPE* value) { \ type = TYPE_CONSTANT; \ this->FIELD = value; \ } CONSTRUCTOR(Descriptor, MESSAGE, descriptor) CONSTRUCTOR(FieldDescriptor, FIELD, field_descriptor) CONSTRUCTOR(OneofDescriptor, ONEOF, oneof_descriptor) CONSTRUCTOR(EnumDescriptor, ENUM, enum_descriptor) CONSTRUCTOR(EnumValueDescriptor, ENUM_VALUE, enum_value_descriptor) CONSTRUCTOR(ServiceDescriptor, SERVICE, service_descriptor) CONSTRUCTOR(MethodDescriptor, METHOD, method_descriptor) CONSTRUCTOR(FileDescriptor, PACKAGE, package_file_descriptor) #undef CONSTRUCTOR const FileDescriptor* GetFile() const { switch (type) { case NULL_SYMBOL: return NULL; case MESSAGE: return descriptor->file(); case FIELD: return field_descriptor->file(); case ONEOF: return oneof_descriptor->containing_type()->file(); case ENUM: return enum_descriptor->file(); case ENUM_VALUE: return enum_value_descriptor->type()->file(); case SERVICE: return service_descriptor->file(); case METHOD: return method_descriptor->service()->file(); case PACKAGE: return package_file_descriptor; } return NULL; } }; const FieldDescriptor::CppType FieldDescriptor::kTypeToCppTypeMap[MAX_TYPE + 1] = { static_cast(0), // 0 is reserved for errors CPPTYPE_DOUBLE, // TYPE_DOUBLE CPPTYPE_FLOAT, // TYPE_FLOAT CPPTYPE_INT64, // TYPE_INT64 CPPTYPE_UINT64, // TYPE_UINT64 CPPTYPE_INT32, // TYPE_INT32 CPPTYPE_UINT64, // TYPE_FIXED64 CPPTYPE_UINT32, // TYPE_FIXED32 CPPTYPE_BOOL, // TYPE_BOOL CPPTYPE_STRING, // TYPE_STRING CPPTYPE_MESSAGE, // TYPE_GROUP CPPTYPE_MESSAGE, // TYPE_MESSAGE CPPTYPE_STRING, // TYPE_BYTES CPPTYPE_UINT32, // TYPE_UINT32 CPPTYPE_ENUM, // TYPE_ENUM CPPTYPE_INT32, // TYPE_SFIXED32 CPPTYPE_INT64, // TYPE_SFIXED64 CPPTYPE_INT32, // TYPE_SINT32 CPPTYPE_INT64, // TYPE_SINT64 }; const char * const FieldDescriptor::kTypeToName[MAX_TYPE + 1] = { "ERROR", // 0 is reserved for errors "double", // TYPE_DOUBLE "float", // TYPE_FLOAT "int64", // TYPE_INT64 "uint64", // TYPE_UINT64 "int32", // TYPE_INT32 "fixed64", // TYPE_FIXED64 "fixed32", // TYPE_FIXED32 "bool", // TYPE_BOOL "string", // TYPE_STRING "group", // TYPE_GROUP "message", // TYPE_MESSAGE "bytes", // TYPE_BYTES "uint32", // TYPE_UINT32 "enum", // TYPE_ENUM "sfixed32", // TYPE_SFIXED32 "sfixed64", // TYPE_SFIXED64 "sint32", // TYPE_SINT32 "sint64", // TYPE_SINT64 }; const char * const FieldDescriptor::kCppTypeToName[MAX_CPPTYPE + 1] = { "ERROR", // 0 is reserved for errors "int32", // CPPTYPE_INT32 "int64", // CPPTYPE_INT64 "uint32", // CPPTYPE_UINT32 "uint64", // CPPTYPE_UINT64 "double", // CPPTYPE_DOUBLE "float", // CPPTYPE_FLOAT "bool", // CPPTYPE_BOOL "enum", // CPPTYPE_ENUM "string", // CPPTYPE_STRING "message", // CPPTYPE_MESSAGE }; const char * const FieldDescriptor::kLabelToName[MAX_LABEL + 1] = { "ERROR", // 0 is reserved for errors "optional", // LABEL_OPTIONAL "required", // LABEL_REQUIRED "repeated", // LABEL_REPEATED }; const char* FileDescriptor::SyntaxName(FileDescriptor::Syntax syntax) { switch (syntax) { case SYNTAX_PROTO2: return "proto2"; case SYNTAX_PROTO3: return "proto3"; case SYNTAX_UNKNOWN: return "unknown"; } GOOGLE_LOG(FATAL) << "can't reach here."; return NULL; } static const char * const kNonLinkedWeakMessageReplacementName = "google.protobuf.Empty"; #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int FieldDescriptor::kMaxNumber; const int FieldDescriptor::kFirstReservedNumber; const int FieldDescriptor::kLastReservedNumber; #endif namespace { // 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; } string ToCamelCase(const string& input, bool lower_first) { bool capitalize_next = !lower_first; string result; result.reserve(input.size()); for (int i = 0; i < input.size(); i++) { if (input[i] == '_') { capitalize_next = true; } else if (capitalize_next) { result.push_back(ToUpper(input[i])); capitalize_next = false; } else { result.push_back(input[i]); } } // Lower-case the first letter. if (lower_first && !result.empty()) { result[0] = ToLower(result[0]); } return result; } string ToJsonName(const string& input) { bool capitalize_next = false; string result; result.reserve(input.size()); for (int i = 0; i < input.size(); i++) { if (input[i] == '_') { capitalize_next = true; } else if (capitalize_next) { result.push_back(ToUpper(input[i])); capitalize_next = false; } else { result.push_back(input[i]); } } return result; } string EnumValueToPascalCase(const string& input) { bool next_upper = true; string result; result.reserve(input.size()); for (int i = 0; i < input.size(); i++) { if (input[i] == '_') { next_upper = true; } else { if (next_upper) { result.push_back(ToUpper(input[i])); } else { result.push_back(ToLower(input[i])); } next_upper = false; } } return result; } // Class to remove an enum prefix from enum values. class PrefixRemover { public: PrefixRemover(StringPiece prefix) { // Strip underscores and lower-case the prefix. for (int i = 0; i < prefix.size(); i++) { if (prefix[i] != '_') { prefix_ += ascii_tolower(prefix[i]); } } } // Tries to remove the enum prefix from this enum value. // If this is not possible, returns the input verbatim. string MaybeRemove(StringPiece str) { // We can't just lowercase and strip str and look for a prefix. // We need to properly recognize the difference between: // // enum Foo { // FOO_BAR_BAZ = 0; // FOO_BARBAZ = 1; // } // // This is acceptable (though perhaps not advisable) because even when // we PascalCase, these two will still be distinct (BarBaz vs. Barbaz). size_t i, j; // Skip past prefix_ in str if we can. for (i = 0, j = 0; i < str.size() && j < prefix_.size(); i++) { if (str[i] == '_') { continue; } if (ascii_tolower(str[i]) != prefix_[j++]) { return str.as_string(); } } // If we didn't make it through the prefix, we've failed to strip the // prefix. if (j < prefix_.size()) { return str.as_string(); } // Skip underscores between prefix and further characters. while (i < str.size() && str[i] == '_') { i++; } // Enum label can't be the empty string. if (i == str.size()) { return str.as_string(); } // We successfully stripped the prefix. str.remove_prefix(i); return str.as_string(); } private: string prefix_; }; // A DescriptorPool contains a bunch of hash_maps to implement the // various Find*By*() methods. Since hashtable lookups are O(1), it's // most efficient to construct a fixed set of large hash_maps used by // all objects in the pool rather than construct one or more small // hash_maps for each object. // // The keys to these hash_maps are (parent, name) or (parent, number) // pairs. Unfortunately STL doesn't provide hash functions for pair<>, // so we must invent our own. // // TODO(kenton): Use StringPiece rather than const char* in keys? It would // be a lot cleaner but we'd just have to convert it back to const char* // for the open source release. typedef std::pair PointerStringPair; struct PointerStringPairEqual { inline bool operator()(const PointerStringPair& a, const PointerStringPair& b) const { return a.first == b.first && strcmp(a.second, b.second) == 0; } }; template struct PointerIntegerPairHash { size_t operator()(const PairType& p) const { // FIXME(kenton): What is the best way to compute this hash? I have // no idea! This seems a bit better than an XOR. return reinterpret_cast(p.first) * ((1 << 16) - 1) + 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 PairType& a, const PairType& b) const { return a.first < b.first || (a.first == b.first && a.second < b.second); } }; typedef std::pair DescriptorIntPair; typedef std::pair EnumIntPair; struct PointerStringPairHash { size_t operator()(const PointerStringPair& p) const { // FIXME(kenton): What is the best way to compute this hash? I have // no idea! This seems a bit better than an XOR. hash cstring_hash; return reinterpret_cast(p.first) * ((1 << 16) - 1) + cstring_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 { if (a.first < b.first) return true; if (a.first > b.first) return false; return strcmp(a.second, b.second) < 0; } }; const Symbol kNullSymbol; typedef hash_map, streq> SymbolsByNameMap; typedef hash_map SymbolsByParentMap; typedef hash_map, streq> FilesByNameMap; typedef hash_map FieldsByNameMap; typedef hash_map > FieldsByNumberMap; typedef hash_map > EnumValuesByNumberMap; // 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 ExtensionsGroupedByDescriptorMap; typedef hash_map LocationsByPathMap; std::set* allowed_proto3_extendees_ = NULL; GOOGLE_PROTOBUF_DECLARE_ONCE(allowed_proto3_extendees_init_); void DeleteAllowedProto3Extendee() { delete allowed_proto3_extendees_; } void InitAllowedProto3Extendee() { allowed_proto3_extendees_ = new std::set; const char* kOptionNames[] = { "FileOptions", "MessageOptions", "FieldOptions", "EnumOptions", "EnumValueOptions", "ServiceOptions", "MethodOptions", "OneofOptions"}; for (int i = 0; i < GOOGLE_ARRAYSIZE(kOptionNames); ++i) { // descriptor.proto has a different package name in opensource. We allow // both so the opensource protocol compiler can also compile internal // proto3 files with custom options. See: b/27567912 allowed_proto3_extendees_->insert(string("google.protobuf.") + kOptionNames[i]); // Split the word to trick the opensource processing scripts so they // will keep the origial package name. allowed_proto3_extendees_->insert(string("proto") + "2." + kOptionNames[i]); } google::protobuf::internal::OnShutdown(&DeleteAllowedProto3Extendee); } // Checks whether the extendee type is allowed in proto3. // Only extensions to descriptor options are allowed. We use name comparison // instead of comparing the descriptor directly because the extensions may be // defined in a different pool. bool AllowedExtendeeInProto3(const string& name) { ::google::protobuf::GoogleOnceInit(&allowed_proto3_extendees_init_, &InitAllowedProto3Extendee); return allowed_proto3_extendees_->find(name) != allowed_proto3_extendees_->end(); } } // anonymous namespace // =================================================================== // DescriptorPool::Tables class DescriptorPool::Tables { public: Tables(); ~Tables(); // Record the current state of the tables to the stack of checkpoints. // Each call to AddCheckpoint() must be paired with exactly one call to either // ClearLastCheckpoint() or RollbackToLastCheckpoint(). // // This is used when building files, since some kinds of validation errors // cannot be detected until the file's descriptors have already been added to // the tables. // // This supports recursive checkpoints, since building a file may trigger // recursive building of other files. Note that recursive checkpoints are not // normally necessary; explicit dependencies are built prior to checkpointing. // So although we recursively build transitive imports, there is at most one // checkpoint in the stack during dependency building. // // Recursive checkpoints only arise during cross-linking of the descriptors. // Symbol references must be resolved, via DescriptorBuilder::FindSymbol and // friends. If the pending file references an unknown symbol // (e.g., it is not defined in the pending file's explicit dependencies), and // the pool is using a fallback database, and that database contains a file // defining that symbol, and that file has not yet been built by the pool, // the pool builds the file during cross-linking, leading to another // checkpoint. void AddCheckpoint(); // Mark the last checkpoint as having cleared successfully, removing it from // the stack. If the stack is empty, all pending symbols will be committed. // // Note that this does not guarantee that the symbols added since the last // checkpoint won't be rolled back: if a checkpoint gets rolled back, // everything past that point gets rolled back, including symbols added after // checkpoints that were pushed onto the stack after it and marked as cleared. void ClearLastCheckpoint(); // Roll back the Tables to the state of the checkpoint at the top of the // stack, removing everything that was added after that point. void RollbackToLastCheckpoint(); // The stack of files which are currently being built. Used to detect // cyclic dependencies when loading files from a DescriptorDatabase. Not // used when fallback_database_ == NULL. std::vector pending_files_; // A set of files 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. // Not used when fallback_database_ == NULL. hash_set 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 known_bad_symbols_; // The set of descriptors for which we've already loaded the full // set of extensions numbers from fallback_database_. hash_set extensions_loaded_from_db_; // ----------------------------------------------------------------- // Finding items. // Find symbols. This returns a null Symbol (symbol.IsNull() is true) // if not found. inline Symbol FindSymbol(const string& 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, const string& name); // These return NULL if not found. inline const FileDescriptor* FindFile(const string& key) const; inline const FieldDescriptor* FindExtension(const Descriptor* extendee, int number) const; inline void FindAllExtensions(const Descriptor* extendee, std::vector* out) const; // ----------------------------------------------------------------- // Adding items. // These add items to the corresponding tables. They return false if // the key already exists in the table. For AddSymbol(), the string passed // in must be one that was constructed using AllocateString(), as it will // be used as a key in the symbols_by_name_ map without copying. bool AddSymbol(const string& full_name, Symbol symbol); bool AddFile(const FileDescriptor* file); bool AddExtension(const FieldDescriptor* field); // ----------------------------------------------------------------- // Allocating memory. // Allocate an object which will be reclaimed when the pool is // destroyed. Note that the object's destructor will never be called, // so its fields must be plain old data (primitive data types and // pointers). All of the descriptor types are such objects. template Type* Allocate(); // Allocate an array of objects which will be reclaimed when the // pool in destroyed. Again, destructors are never called. template Type* AllocateArray(int count); // Allocate a string which will be destroyed when the pool is destroyed. // The string is initialized to the given value for convenience. string* AllocateString(const string& value); // Allocate a GoogleOnceDynamic which will be destroyed when the pool is // destroyed. GoogleOnceDynamic* AllocateOnceDynamic(); // Allocate a protocol message object. Some older versions of GCC have // trouble understanding explicit template instantiations in some cases, so // in those cases we have to pass a dummy pointer of the right type as the // parameter instead of specifying the type explicitly. template Type* AllocateMessage(Type* dummy = NULL); // Allocate a FileDescriptorTables object. FileDescriptorTables* AllocateFileTables(); private: std::vector strings_; // All strings in the pool. std::vector messages_; // All messages in the pool. std::vector once_dynamics_; // All GoogleOnceDynamics in the pool. std::vector file_tables_; // All file tables in the pool. std::vector allocations_; // All other memory allocated in the pool. SymbolsByNameMap symbols_by_name_; FilesByNameMap files_by_name_; ExtensionsGroupedByDescriptorMap extensions_; struct CheckPoint { explicit CheckPoint(const Tables* tables) : strings_before_checkpoint(tables->strings_.size()), messages_before_checkpoint(tables->messages_.size()), once_dynamics_before_checkpoint(tables->once_dynamics_.size()), file_tables_before_checkpoint(tables->file_tables_.size()), allocations_before_checkpoint(tables->allocations_.size()), pending_symbols_before_checkpoint( tables->symbols_after_checkpoint_.size()), pending_files_before_checkpoint( tables->files_after_checkpoint_.size()), pending_extensions_before_checkpoint( tables->extensions_after_checkpoint_.size()) {} int strings_before_checkpoint; int messages_before_checkpoint; int once_dynamics_before_checkpoint; int file_tables_before_checkpoint; int allocations_before_checkpoint; int pending_symbols_before_checkpoint; int pending_files_before_checkpoint; int pending_extensions_before_checkpoint; }; std::vector checkpoints_; std::vector symbols_after_checkpoint_; std::vector files_after_checkpoint_; std::vector extensions_after_checkpoint_; // Allocate some bytes which will be reclaimed when the pool is // destroyed. void* AllocateBytes(int size); }; // Contains tables specific to a particular file. These tables are not // modified once the file has been constructed, so they need not be // protected by a mutex. This makes operations that depend only on the // contents of a single file -- e.g. Descriptor::FindFieldByName() -- // lock-free. // // For historical reasons, the definitions of the methods of // FileDescriptorTables and DescriptorPool::Tables are interleaved below. // These used to be a single class. class FileDescriptorTables { public: FileDescriptorTables(); ~FileDescriptorTables(); // Empty table, used with placeholder files. inline static const FileDescriptorTables& GetEmptyInstance(); // ----------------------------------------------------------------- // Finding items. // Find symbols. These return a null Symbol (symbol.IsNull() is true) // if not found. inline Symbol FindNestedSymbol(const void* parent, const string& name) const; inline Symbol FindNestedSymbolOfType(const void* parent, const string& name, const Symbol::Type type) const; // These return NULL if not found. inline const FieldDescriptor* FindFieldByNumber( const Descriptor* parent, int number) const; inline const FieldDescriptor* FindFieldByLowercaseName( const void* parent, const string& lowercase_name) const; inline const FieldDescriptor* FindFieldByCamelcaseName( const void* parent, const string& 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. inline const EnumValueDescriptor* FindEnumValueByNumberCreatingIfUnknown( const EnumDescriptor* parent, int number) const; // ----------------------------------------------------------------- // Adding items. // These add items to the corresponding tables. They return false if // the key already exists in the table. For AddAliasUnderParent(), the // string passed in must be one that was constructed using AllocateString(), // as it will be used as a key in the symbols_by_parent_ map without copying. bool AddAliasUnderParent(const void* parent, const string& name, Symbol symbol); bool AddFieldByNumber(const FieldDescriptor* field); bool AddEnumValueByNumber(const EnumValueDescriptor* value); // Adds the field to the lowercase_name and camelcase_name maps. Never // fails because we allow duplicates; the first field by the name wins. void AddFieldByStylizedNames(const FieldDescriptor* field); // Populates p->first->locations_by_path_ from p->second. // Unusual signature dictated by GoogleOnceDynamic. static void BuildLocationsByPath( std::pair* p); // Returns the location denoted by the specified path through info, // or NULL if not found. // The value of info must be that of the corresponding FileDescriptor. // (Conceptually a pure function, but stateful as an optimisation.) const SourceCodeInfo_Location* GetSourceLocation( const std::vector& path, const SourceCodeInfo* info) const; // Must be called after BuildFileImpl(), even if the build failed and // we are going to roll back to the last checkpoint. void FinalizeTables(); private: const void* FindParentForFieldsByMap(const FieldDescriptor* field) const; static void FieldsByLowercaseNamesLazyInitStatic( const FileDescriptorTables* tables); void FieldsByLowercaseNamesLazyInitInternal() const; static void FieldsByCamelcaseNamesLazyInitStatic( const FileDescriptorTables* tables); void FieldsByCamelcaseNamesLazyInitInternal() const; SymbolsByParentMap symbols_by_parent_; mutable FieldsByNameMap fields_by_lowercase_name_; mutable FieldsByNameMap* fields_by_lowercase_name_tmp_; mutable GoogleOnceDynamic fields_by_lowercase_name_once_; mutable FieldsByNameMap fields_by_camelcase_name_; mutable FieldsByNameMap* fields_by_camelcase_name_tmp_; mutable GoogleOnceDynamic fields_by_camelcase_name_once_; FieldsByNumberMap fields_by_number_; // Not including extensions. EnumValuesByNumberMap enum_values_by_number_; mutable EnumValuesByNumberMap unknown_enum_values_by_number_ GOOGLE_GUARDED_BY(unknown_enum_values_mu_); // Populated on first request to save space, hence constness games. mutable GoogleOnceDynamic 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 Mutex unknown_enum_values_mu_; }; DescriptorPool::Tables::Tables() // Start some hash_map and hash_set objects with a small # of buckets : known_bad_files_(3), known_bad_symbols_(3), extensions_loaded_from_db_(3), symbols_by_name_(3), files_by_name_(3) {} DescriptorPool::Tables::~Tables() { GOOGLE_DCHECK(checkpoints_.empty()); // Note that the deletion order is important, since the destructors of some // messages may refer to objects in allocations_. STLDeleteElements(&messages_); for (int i = 0; i < allocations_.size(); i++) { operator delete(allocations_[i]); } STLDeleteElements(&strings_); STLDeleteElements(&file_tables_); STLDeleteElements(&once_dynamics_); } FileDescriptorTables::FileDescriptorTables() // Initialize all the hash tables to start out with a small # of buckets. : symbols_by_parent_(3), fields_by_lowercase_name_(3), fields_by_lowercase_name_tmp_(new FieldsByNameMap()), fields_by_camelcase_name_(3), fields_by_camelcase_name_tmp_(new FieldsByNameMap()), fields_by_number_(3), enum_values_by_number_(3), unknown_enum_values_by_number_(3), locations_by_path_(3) {} FileDescriptorTables::~FileDescriptorTables() {} namespace { FileDescriptorTables* file_descriptor_tables_ = NULL; GOOGLE_PROTOBUF_DECLARE_ONCE(file_descriptor_tables_once_init_); void DeleteFileDescriptorTables() { delete file_descriptor_tables_; file_descriptor_tables_ = NULL; } void InitFileDescriptorTables() { file_descriptor_tables_ = new FileDescriptorTables(); internal::OnShutdown(&DeleteFileDescriptorTables); } inline void InitFileDescriptorTablesOnce() { ::google::protobuf::GoogleOnceInit( &file_descriptor_tables_once_init_, &InitFileDescriptorTables); } } // anonymous namespace inline const FileDescriptorTables& FileDescriptorTables::GetEmptyInstance() { InitFileDescriptorTablesOnce(); return *file_descriptor_tables_; } void DescriptorPool::Tables::AddCheckpoint() { checkpoints_.push_back(CheckPoint(this)); } void DescriptorPool::Tables::ClearLastCheckpoint() { GOOGLE_DCHECK(!checkpoints_.empty()); checkpoints_.pop_back(); if (checkpoints_.empty()) { // All checkpoints have been cleared: we can now commit all of the pending // data. symbols_after_checkpoint_.clear(); files_after_checkpoint_.clear(); extensions_after_checkpoint_.clear(); } } void DescriptorPool::Tables::RollbackToLastCheckpoint() { GOOGLE_DCHECK(!checkpoints_.empty()); const CheckPoint& checkpoint = checkpoints_.back(); for (int i = checkpoint.pending_symbols_before_checkpoint; i < symbols_after_checkpoint_.size(); i++) { symbols_by_name_.erase(symbols_after_checkpoint_[i]); } for (int i = checkpoint.pending_files_before_checkpoint; i < files_after_checkpoint_.size(); i++) { files_by_name_.erase(files_after_checkpoint_[i]); } for (int i = checkpoint.pending_extensions_before_checkpoint; i < extensions_after_checkpoint_.size(); i++) { extensions_.erase(extensions_after_checkpoint_[i]); } symbols_after_checkpoint_.resize( checkpoint.pending_symbols_before_checkpoint); files_after_checkpoint_.resize(checkpoint.pending_files_before_checkpoint); extensions_after_checkpoint_.resize( checkpoint.pending_extensions_before_checkpoint); STLDeleteContainerPointers( strings_.begin() + checkpoint.strings_before_checkpoint, strings_.end()); STLDeleteContainerPointers( messages_.begin() + checkpoint.messages_before_checkpoint, messages_.end()); STLDeleteContainerPointers( once_dynamics_.begin() + checkpoint.once_dynamics_before_checkpoint, once_dynamics_.end()); STLDeleteContainerPointers( file_tables_.begin() + checkpoint.file_tables_before_checkpoint, file_tables_.end()); for (int i = checkpoint.allocations_before_checkpoint; i < allocations_.size(); i++) { operator delete(allocations_[i]); } strings_.resize(checkpoint.strings_before_checkpoint); messages_.resize(checkpoint.messages_before_checkpoint); once_dynamics_.resize(checkpoint.once_dynamics_before_checkpoint); file_tables_.resize(checkpoint.file_tables_before_checkpoint); allocations_.resize(checkpoint.allocations_before_checkpoint); checkpoints_.pop_back(); } // ------------------------------------------------------------------- inline Symbol DescriptorPool::Tables::FindSymbol(const string& key) const { const Symbol* result = FindOrNull(symbols_by_name_, key.c_str()); if (result == NULL) { return kNullSymbol; } else { return *result; } } inline Symbol FileDescriptorTables::FindNestedSymbol( const void* parent, const string& name) const { const Symbol* result = FindOrNull(symbols_by_parent_, PointerStringPair(parent, name.c_str())); if (result == NULL) { return kNullSymbol; } else { return *result; } } inline Symbol FileDescriptorTables::FindNestedSymbolOfType( const void* parent, const string& name, const Symbol::Type type) const { Symbol result = FindNestedSymbol(parent, name); if (result.type != type) return kNullSymbol; return result; } Symbol DescriptorPool::Tables::FindByNameHelper( const DescriptorPool* pool, const string& name) { MutexLockMaybe lock(pool->mutex_); known_bad_symbols_.clear(); known_bad_files_.clear(); Symbol result = FindSymbol(name); if (result.IsNull() && pool->underlay_ != NULL) { // Symbol not found; check the underlay. result = pool->underlay_->tables_->FindByNameHelper(pool->underlay_, name); } if (result.IsNull()) { // Symbol still not found, so check fallback database. if (pool->TryFindSymbolInFallbackDatabase(name)) { result = FindSymbol(name); } } return result; } inline const FileDescriptor* DescriptorPool::Tables::FindFile( const string& key) const { return FindPtrOrNull(files_by_name_, key.c_str()); } inline const FieldDescriptor* FileDescriptorTables::FindFieldByNumber( const Descriptor* parent, int number) const { return FindPtrOrNull(fields_by_number_, std::make_pair(parent, number)); } const void* FileDescriptorTables::FindParentForFieldsByMap( const FieldDescriptor* field) const { if (field->is_extension()) { if (field->extension_scope() == NULL) { return field->file(); } else { return field->extension_scope(); } } else { return field->containing_type(); } } void FileDescriptorTables::FieldsByLowercaseNamesLazyInitStatic( const FileDescriptorTables* tables) { tables->FieldsByLowercaseNamesLazyInitInternal(); } void FileDescriptorTables::FieldsByLowercaseNamesLazyInitInternal() const { for (FieldsByNumberMap::const_iterator it = fields_by_number_.begin(); it != fields_by_number_.end(); it++) { PointerStringPair lowercase_key(FindParentForFieldsByMap(it->second), it->second->lowercase_name().c_str()); InsertIfNotPresent(&fields_by_lowercase_name_, lowercase_key, it->second); } } inline const FieldDescriptor* FileDescriptorTables::FindFieldByLowercaseName( const void* parent, const string& lowercase_name) const { fields_by_lowercase_name_once_.Init( &FileDescriptorTables::FieldsByLowercaseNamesLazyInitStatic, this); return FindPtrOrNull(fields_by_lowercase_name_, PointerStringPair(parent, lowercase_name.c_str())); } void FileDescriptorTables::FieldsByCamelcaseNamesLazyInitStatic( const FileDescriptorTables* tables) { tables->FieldsByCamelcaseNamesLazyInitInternal(); } void FileDescriptorTables::FieldsByCamelcaseNamesLazyInitInternal() const { for (FieldsByNumberMap::const_iterator it = fields_by_number_.begin(); it != fields_by_number_.end(); it++) { PointerStringPair camelcase_key(FindParentForFieldsByMap(it->second), it->second->camelcase_name().c_str()); InsertIfNotPresent(&fields_by_camelcase_name_, camelcase_key, it->second); } } inline const FieldDescriptor* FileDescriptorTables::FindFieldByCamelcaseName( const void* parent, const string& camelcase_name) const { fields_by_camelcase_name_once_.Init( &FileDescriptorTables::FieldsByCamelcaseNamesLazyInitStatic, this); return FindPtrOrNull(fields_by_camelcase_name_, PointerStringPair(parent, camelcase_name.c_str())); } inline const EnumValueDescriptor* FileDescriptorTables::FindEnumValueByNumber( const EnumDescriptor* parent, int number) const { return FindPtrOrNull(enum_values_by_number_, std::make_pair(parent, number)); } inline const EnumValueDescriptor* FileDescriptorTables::FindEnumValueByNumberCreatingIfUnknown( const EnumDescriptor* parent, int number) const { // First try, with map of compiled-in values. { const EnumValueDescriptor* desc = FindPtrOrNull(enum_values_by_number_, std::make_pair(parent, number)); if (desc != NULL) { return desc; } } // Second try, with reader lock held on unknown enum values: common case. { ReaderMutexLock l(&unknown_enum_values_mu_); const EnumValueDescriptor* desc = FindPtrOrNull( unknown_enum_values_by_number_, std::make_pair(parent, number)); if (desc != NULL) { return desc; } } // If not found, try again with writer lock held, and create new descriptor if // necessary. { WriterMutexLock l(&unknown_enum_values_mu_); const EnumValueDescriptor* desc = FindPtrOrNull( unknown_enum_values_by_number_, std::make_pair(parent, number)); if (desc != NULL) { return desc; } // 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. string enum_value_name = StringPrintf( "UNKNOWN_ENUM_VALUE_%s_%d", parent->name().c_str(), number); DescriptorPool::Tables* tables = const_cast(DescriptorPool::generated_pool()-> tables_.get()); EnumValueDescriptor* result = tables->Allocate(); result->name_ = tables->AllocateString(enum_value_name); result->full_name_ = tables->AllocateString(parent->full_name() + "." + enum_value_name); result->number_ = number; result->type_ = parent; result->options_ = &EnumValueOptions::default_instance(); InsertIfNotPresent(&unknown_enum_values_by_number_, std::make_pair(parent, number), result); return result; } } inline const FieldDescriptor* DescriptorPool::Tables::FindExtension( const Descriptor* extendee, int number) const { return FindPtrOrNull(extensions_, std::make_pair(extendee, number)); } inline void DescriptorPool::Tables::FindAllExtensions( const Descriptor* extendee, std::vector* out) const { ExtensionsGroupedByDescriptorMap::const_iterator it = extensions_.lower_bound(std::make_pair(extendee, 0)); for (; it != extensions_.end() && it->first.first == extendee; ++it) { out->push_back(it->second); } } // ------------------------------------------------------------------- bool DescriptorPool::Tables::AddSymbol( const string& full_name, Symbol symbol) { if (InsertIfNotPresent(&symbols_by_name_, full_name.c_str(), symbol)) { symbols_after_checkpoint_.push_back(full_name.c_str()); return true; } else { return false; } } bool FileDescriptorTables::AddAliasUnderParent( const void* parent, const string& name, Symbol symbol) { PointerStringPair by_parent_key(parent, name.c_str()); return InsertIfNotPresent(&symbols_by_parent_, by_parent_key, symbol); } bool DescriptorPool::Tables::AddFile(const FileDescriptor* file) { if (InsertIfNotPresent(&files_by_name_, file->name().c_str(), file)) { files_after_checkpoint_.push_back(file->name().c_str()); return true; } else { return false; } } void FileDescriptorTables::FinalizeTables() { // Clean up the temporary maps used by AddFieldByStylizedNames(). delete fields_by_lowercase_name_tmp_; fields_by_lowercase_name_tmp_ = NULL; delete fields_by_camelcase_name_tmp_; fields_by_camelcase_name_tmp_ = NULL; } void FileDescriptorTables::AddFieldByStylizedNames( const FieldDescriptor* field) { const void* parent = FindParentForFieldsByMap(field); // We want fields_by_{lower,camel}case_name_ to be lazily built, but // cross-link order determines which entry will be present in the case of a // conflict. So we use the temporary maps that get destroyed after // BuildFileImpl() to detect the conflicts, and only store the conflicts in // the map that will persist. We will then lazily populate the rest of the // entries from fields_by_number_. PointerStringPair lowercase_key(parent, field->lowercase_name().c_str()); if (!InsertIfNotPresent(fields_by_lowercase_name_tmp_, lowercase_key, field)) { InsertIfNotPresent( &fields_by_lowercase_name_, lowercase_key, FindPtrOrNull(*fields_by_lowercase_name_tmp_, lowercase_key)); } PointerStringPair camelcase_key(parent, field->camelcase_name().c_str()); if (!InsertIfNotPresent(fields_by_camelcase_name_tmp_, camelcase_key, field)) { InsertIfNotPresent( &fields_by_camelcase_name_, camelcase_key, FindPtrOrNull(*fields_by_camelcase_name_tmp_, camelcase_key)); } } bool FileDescriptorTables::AddFieldByNumber(const FieldDescriptor* field) { DescriptorIntPair key(field->containing_type(), field->number()); return InsertIfNotPresent(&fields_by_number_, key, field); } bool FileDescriptorTables::AddEnumValueByNumber( const EnumValueDescriptor* value) { EnumIntPair key(value->type(), value->number()); return InsertIfNotPresent(&enum_values_by_number_, key, value); } 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); return true; } else { return false; } } // ------------------------------------------------------------------- template Type* DescriptorPool::Tables::Allocate() { return reinterpret_cast(AllocateBytes(sizeof(Type))); } template Type* DescriptorPool::Tables::AllocateArray(int count) { return reinterpret_cast(AllocateBytes(sizeof(Type) * count)); } string* DescriptorPool::Tables::AllocateString(const string& value) { string* result = new string(value); strings_.push_back(result); return result; } GoogleOnceDynamic* DescriptorPool::Tables::AllocateOnceDynamic() { GoogleOnceDynamic* result = new GoogleOnceDynamic(); once_dynamics_.push_back(result); return result; } template Type* DescriptorPool::Tables::AllocateMessage(Type* /* dummy */) { Type* result = new Type; messages_.push_back(result); return result; } FileDescriptorTables* DescriptorPool::Tables::AllocateFileTables() { FileDescriptorTables* result = new FileDescriptorTables; file_tables_.push_back(result); return result; } void* DescriptorPool::Tables::AllocateBytes(int size) { // TODO(kenton): Would it be worthwhile to implement this in some more // sophisticated way? Probably not for the open source release, but for // internal use we could easily plug in one of our existing memory pool // allocators... if (size == 0) return NULL; void* result = operator new(size); allocations_.push_back(result); return result; } void FileDescriptorTables::BuildLocationsByPath( std::pair* 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; } } const SourceCodeInfo_Location* FileDescriptorTables::GetSourceLocation( const std::vector& path, const SourceCodeInfo* info) const { std::pair p( std::make_pair(this, info)); locations_by_path_once_.Init(&FileDescriptorTables::BuildLocationsByPath, &p); return FindPtrOrNull(locations_by_path_, Join(path, ",")); } // =================================================================== // DescriptorPool DescriptorPool::ErrorCollector::~ErrorCollector() {} DescriptorPool::DescriptorPool() : mutex_(NULL), fallback_database_(NULL), default_error_collector_(NULL), underlay_(NULL), tables_(new Tables), enforce_dependencies_(true), lazily_build_dependencies_(false), allow_unknown_(false), enforce_weak_(false), disallow_enforce_utf8_(false) {} DescriptorPool::DescriptorPool(DescriptorDatabase* fallback_database, ErrorCollector* error_collector) : mutex_(new Mutex), fallback_database_(fallback_database), default_error_collector_(error_collector), underlay_(NULL), tables_(new Tables), enforce_dependencies_(true), lazily_build_dependencies_(false), allow_unknown_(false), enforce_weak_(false), disallow_enforce_utf8_(false) { } DescriptorPool::DescriptorPool(const DescriptorPool* underlay) : mutex_(NULL), fallback_database_(NULL), default_error_collector_(NULL), underlay_(underlay), tables_(new Tables), enforce_dependencies_(true), lazily_build_dependencies_(false), allow_unknown_(false), enforce_weak_(false), disallow_enforce_utf8_(false) {} DescriptorPool::~DescriptorPool() { if (mutex_ != NULL) delete mutex_; } // DescriptorPool::BuildFile() defined later. // DescriptorPool::BuildFileCollectingErrors() defined later. void DescriptorPool::InternalDontEnforceDependencies() { enforce_dependencies_ = false; } void DescriptorPool::AddUnusedImportTrackFile(const string& file_name) { unused_import_track_files_.insert(file_name); } void DescriptorPool::ClearUnusedImportTrackFiles() { unused_import_track_files_.clear(); } bool DescriptorPool::InternalIsFileLoaded(const string& filename) const { MutexLockMaybe lock(mutex_); return tables_->FindFile(filename) != NULL; } // generated_pool ==================================================== namespace { EncodedDescriptorDatabase* generated_database_ = NULL; DescriptorPool* generated_pool_ = NULL; GOOGLE_PROTOBUF_DECLARE_ONCE(generated_pool_init_); void DeleteGeneratedPool() { delete generated_database_; generated_database_ = NULL; delete generated_pool_; generated_pool_ = NULL; } static void InitGeneratedPool() { generated_database_ = new EncodedDescriptorDatabase; generated_pool_ = new DescriptorPool(generated_database_); generated_pool_->InternalSetLazilyBuildDependencies(); internal::OnShutdown(&DeleteGeneratedPool); } inline void InitGeneratedPoolOnce() { ::google::protobuf::GoogleOnceInit(&generated_pool_init_, &InitGeneratedPool); } } // anonymous namespace const DescriptorPool* DescriptorPool::generated_pool() { InitGeneratedPoolOnce(); return generated_pool_; } DescriptorPool* DescriptorPool::internal_generated_pool() { InitGeneratedPoolOnce(); return generated_pool_; } void DescriptorPool::InternalAddGeneratedFile( const void* encoded_file_descriptor, int size) { // So, this function is called in the process of initializing the // descriptors for generated proto classes. Each generated .pb.cc file // has an internal procedure called AddDescriptors() which is called at // process startup, and that function calls this one in order to register // the raw bytes of the FileDescriptorProto representing the file. // // We do not actually construct the descriptor objects right away. We just // hang on to the bytes until they are actually needed. We actually construct // the descriptor the first time one of the following things happens: // * Someone calls a method like descriptor(), GetDescriptor(), or // GetReflection() on the generated types, which requires returning the // descriptor or an object based on it. // * Someone looks up the descriptor in DescriptorPool::generated_pool(). // // Once one of these happens, the DescriptorPool actually parses the // FileDescriptorProto and generates a FileDescriptor (and all its children) // based on it. // // Note that FileDescriptorProto is itself a generated protocol message. // Therefore, when we parse one, we have to be very careful to avoid using // any descriptor-based operations, since this might cause infinite recursion // or deadlock. InitGeneratedPoolOnce(); GOOGLE_CHECK(generated_database_->Add(encoded_file_descriptor, size)); } // Find*By* methods ================================================== // TODO(kenton): There's a lot of repeated code here, but I'm not sure if // there's any good way to factor it out. Think about this some time when // there's nothing more important to do (read: never). const FileDescriptor* DescriptorPool::FindFileByName(const string& name) const { MutexLockMaybe lock(mutex_); tables_->known_bad_symbols_.clear(); tables_->known_bad_files_.clear(); const FileDescriptor* result = tables_->FindFile(name); if (result != NULL) return result; if (underlay_ != NULL) { result = underlay_->FindFileByName(name); if (result != NULL) return result; } if (TryFindFileInFallbackDatabase(name)) { result = tables_->FindFile(name); if (result != NULL) return result; } return NULL; } const FileDescriptor* DescriptorPool::FindFileContainingSymbol( const string& symbol_name) const { MutexLockMaybe lock(mutex_); tables_->known_bad_symbols_.clear(); tables_->known_bad_files_.clear(); Symbol result = tables_->FindSymbol(symbol_name); if (!result.IsNull()) return result.GetFile(); if (underlay_ != NULL) { const FileDescriptor* file_result = underlay_->FindFileContainingSymbol(symbol_name); if (file_result != NULL) return file_result; } if (TryFindSymbolInFallbackDatabase(symbol_name)) { result = tables_->FindSymbol(symbol_name); if (!result.IsNull()) return result.GetFile(); } return NULL; } const Descriptor* DescriptorPool::FindMessageTypeByName( const string& name) const { Symbol result = tables_->FindByNameHelper(this, name); return (result.type == Symbol::MESSAGE) ? result.descriptor : NULL; } const FieldDescriptor* DescriptorPool::FindFieldByName( const string& name) const { Symbol result = tables_->FindByNameHelper(this, name); if (result.type == Symbol::FIELD && !result.field_descriptor->is_extension()) { return result.field_descriptor; } else { return NULL; } } const FieldDescriptor* DescriptorPool::FindExtensionByName( const string& name) const { Symbol result = tables_->FindByNameHelper(this, name); if (result.type == Symbol::FIELD && result.field_descriptor->is_extension()) { return result.field_descriptor; } else { return NULL; } } const OneofDescriptor* DescriptorPool::FindOneofByName( const string& name) const { Symbol result = tables_->FindByNameHelper(this, name); return (result.type == Symbol::ONEOF) ? result.oneof_descriptor : NULL; } const EnumDescriptor* DescriptorPool::FindEnumTypeByName( const string& name) const { Symbol result = tables_->FindByNameHelper(this, name); return (result.type == Symbol::ENUM) ? result.enum_descriptor : NULL; } const EnumValueDescriptor* DescriptorPool::FindEnumValueByName( const string& name) const { Symbol result = tables_->FindByNameHelper(this, name); return (result.type == Symbol::ENUM_VALUE) ? result.enum_value_descriptor : NULL; } const ServiceDescriptor* DescriptorPool::FindServiceByName( const string& name) const { Symbol result = tables_->FindByNameHelper(this, name); return (result.type == Symbol::SERVICE) ? result.service_descriptor : NULL; } const MethodDescriptor* DescriptorPool::FindMethodByName( const string& name) const { Symbol result = tables_->FindByNameHelper(this, name); return (result.type == Symbol::METHOD) ? result.method_descriptor : NULL; } const FieldDescriptor* DescriptorPool::FindExtensionByNumber( const Descriptor* extendee, int number) const { // A faster path to reduce lock contention in finding extensions, assuming // most extensions will be cache hit. if (mutex_ != NULL) { ReaderMutexLock lock(mutex_); const FieldDescriptor* result = tables_->FindExtension(extendee, number); if (result != NULL) { return result; } } MutexLockMaybe lock(mutex_); tables_->known_bad_symbols_.clear(); tables_->known_bad_files_.clear(); const FieldDescriptor* result = tables_->FindExtension(extendee, number); if (result != NULL) { return result; } if (underlay_ != NULL) { result = underlay_->FindExtensionByNumber(extendee, number); if (result != NULL) return result; } if (TryFindExtensionInFallbackDatabase(extendee, number)) { result = tables_->FindExtension(extendee, number); if (result != NULL) { return result; } } return NULL; } void DescriptorPool::FindAllExtensions( const Descriptor* extendee, std::vector* out) const { MutexLockMaybe lock(mutex_); tables_->known_bad_symbols_.clear(); tables_->known_bad_files_.clear(); // Initialize tables_->extensions_ from the fallback database first // (but do this only once per descriptor). if (fallback_database_ != NULL && tables_->extensions_loaded_from_db_.count(extendee) == 0) { std::vector numbers; if (fallback_database_->FindAllExtensionNumbers(extendee->full_name(), &numbers)) { for (int i = 0; i < numbers.size(); ++i) { int number = numbers[i]; if (tables_->FindExtension(extendee, number) == NULL) { TryFindExtensionInFallbackDatabase(extendee, number); } } tables_->extensions_loaded_from_db_.insert(extendee); } } tables_->FindAllExtensions(extendee, out); if (underlay_ != NULL) { underlay_->FindAllExtensions(extendee, out); } } // ------------------------------------------------------------------- const FieldDescriptor* Descriptor::FindFieldByNumber(int key) const { const FieldDescriptor* result = file()->tables_->FindFieldByNumber(this, key); if (result == NULL || result->is_extension()) { return NULL; } else { return result; } } const FieldDescriptor* Descriptor::FindFieldByLowercaseName(const string& key) const { const FieldDescriptor* result = file()->tables_->FindFieldByLowercaseName(this, key); if (result == NULL || result->is_extension()) { return NULL; } else { return result; } } const FieldDescriptor* Descriptor::FindFieldByCamelcaseName(const string& key) const { const FieldDescriptor* result = file()->tables_->FindFieldByCamelcaseName(this, key); if (result == NULL || result->is_extension()) { return NULL; } else { return result; } } const FieldDescriptor* Descriptor::FindFieldByName(const string& key) const { Symbol result = file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD); if (!result.IsNull() && !result.field_descriptor->is_extension()) { return result.field_descriptor; } else { return NULL; } } const OneofDescriptor* Descriptor::FindOneofByName(const string& key) const { Symbol result = file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ONEOF); if (!result.IsNull()) { return result.oneof_descriptor; } else { return NULL; } } const FieldDescriptor* Descriptor::FindExtensionByName(const string& key) const { Symbol result = file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD); if (!result.IsNull() && result.field_descriptor->is_extension()) { return result.field_descriptor; } else { return NULL; } } const FieldDescriptor* Descriptor::FindExtensionByLowercaseName(const string& key) const { const FieldDescriptor* result = file()->tables_->FindFieldByLowercaseName(this, key); if (result == NULL || !result->is_extension()) { return NULL; } else { return result; } } const FieldDescriptor* Descriptor::FindExtensionByCamelcaseName(const string& key) const { const FieldDescriptor* result = file()->tables_->FindFieldByCamelcaseName(this, key); if (result == NULL || !result->is_extension()) { return NULL; } else { return result; } } const Descriptor* Descriptor::FindNestedTypeByName(const string& key) const { Symbol result = file()->tables_->FindNestedSymbolOfType(this, key, Symbol::MESSAGE); if (!result.IsNull()) { return result.descriptor; } else { return NULL; } } const EnumDescriptor* Descriptor::FindEnumTypeByName(const string& key) const { Symbol result = file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM); if (!result.IsNull()) { return result.enum_descriptor; } else { return NULL; } } const EnumValueDescriptor* Descriptor::FindEnumValueByName(const string& key) const { Symbol result = file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE); if (!result.IsNull()) { return result.enum_value_descriptor; } else { return NULL; } } const EnumValueDescriptor* EnumDescriptor::FindValueByName(const string& key) const { Symbol result = file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE); if (!result.IsNull()) { return result.enum_value_descriptor; } else { return NULL; } } const EnumValueDescriptor* EnumDescriptor::FindValueByNumber(int key) const { return file()->tables_->FindEnumValueByNumber(this, key); } const EnumValueDescriptor* EnumDescriptor::FindValueByNumberCreatingIfUnknown(int key) const { return file()->tables_->FindEnumValueByNumberCreatingIfUnknown(this, key); } const MethodDescriptor* ServiceDescriptor::FindMethodByName(const string& key) const { Symbol result = file()->tables_->FindNestedSymbolOfType(this, key, Symbol::METHOD); if (!result.IsNull()) { return result.method_descriptor; } else { return NULL; } } const Descriptor* FileDescriptor::FindMessageTypeByName(const string& key) const { Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::MESSAGE); if (!result.IsNull()) { return result.descriptor; } else { return NULL; } } const EnumDescriptor* FileDescriptor::FindEnumTypeByName(const string& key) const { Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM); if (!result.IsNull()) { return result.enum_descriptor; } else { return NULL; } } const EnumValueDescriptor* FileDescriptor::FindEnumValueByName(const string& key) const { Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE); if (!result.IsNull()) { return result.enum_value_descriptor; } else { return NULL; } } const ServiceDescriptor* FileDescriptor::FindServiceByName(const string& key) const { Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::SERVICE); if (!result.IsNull()) { return result.service_descriptor; } else { return NULL; } } const FieldDescriptor* FileDescriptor::FindExtensionByName(const string& key) const { Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD); if (!result.IsNull() && result.field_descriptor->is_extension()) { return result.field_descriptor; } else { return NULL; } } const FieldDescriptor* FileDescriptor::FindExtensionByLowercaseName(const string& key) const { const FieldDescriptor* result = tables_->FindFieldByLowercaseName(this, key); if (result == NULL || !result->is_extension()) { return NULL; } else { return result; } } const FieldDescriptor* FileDescriptor::FindExtensionByCamelcaseName(const string& key) const { const FieldDescriptor* result = tables_->FindFieldByCamelcaseName(this, key); if (result == NULL || !result->is_extension()) { return NULL; } else { return result; } } const Descriptor::ExtensionRange* Descriptor::FindExtensionRangeContainingNumber(int number) const { // Linear search should be fine because we don't expect a message to have // more than a couple extension ranges. for (int i = 0; i < extension_range_count(); i++) { if (number >= extension_range(i)->start && number < extension_range(i)->end) { return extension_range(i); } } return NULL; } const Descriptor::ReservedRange* Descriptor::FindReservedRangeContainingNumber(int number) const { // TODO(chrisn): Consider a non-linear search. for (int i = 0; i < reserved_range_count(); i++) { if (number >= reserved_range(i)->start && number < reserved_range(i)->end) { return reserved_range(i); } } return NULL; } const EnumDescriptor::ReservedRange* EnumDescriptor::FindReservedRangeContainingNumber(int number) const { // TODO(chrisn): Consider a non-linear search. for (int i = 0; i < reserved_range_count(); i++) { if (number >= reserved_range(i)->start && number <= reserved_range(i)->end) { return reserved_range(i); } } return NULL; } // ------------------------------------------------------------------- bool DescriptorPool::TryFindFileInFallbackDatabase(const string& name) const { if (fallback_database_ == NULL) return false; if (tables_->known_bad_files_.count(name) > 0) return false; FileDescriptorProto file_proto; if (!fallback_database_->FindFileByName(name, &file_proto) || BuildFileFromDatabase(file_proto) == NULL) { tables_->known_bad_files_.insert(name); return false; } return true; } bool DescriptorPool::IsSubSymbolOfBuiltType(const string& name) const { string prefix = name; for (;;) { string::size_type dot_pos = prefix.find_last_of('.'); if (dot_pos == string::npos) { break; } prefix = prefix.substr(0, dot_pos); Symbol symbol = tables_->FindSymbol(prefix); // If the symbol type is anything other than PACKAGE, then its complete // definition is already known. if (!symbol.IsNull() && symbol.type != Symbol::PACKAGE) { return true; } } if (underlay_ != NULL) { // Check to see if any prefix of this symbol exists in the underlay. return underlay_->IsSubSymbolOfBuiltType(name); } return false; } bool DescriptorPool::TryFindSymbolInFallbackDatabase(const string& name) const { if (fallback_database_ == NULL) return false; if (tables_->known_bad_symbols_.count(name) > 0) return false; FileDescriptorProto file_proto; if (// We skip looking in the fallback database if the name is a sub-symbol // of any descriptor that already exists in the descriptor pool (except // for package descriptors). This is valid because all symbols except // for packages are defined in a single file, so if the symbol exists // then we should already have its definition. // // The other reason to do this is to support "overriding" type // definitions by merging two databases that define the same type. (Yes, // people do this.) The main difficulty with making this work is that // FindFileContainingSymbol() is allowed to return both false positives // (e.g., SimpleDescriptorDatabase, UpgradedDescriptorDatabase) and false // negatives (e.g. ProtoFileParser, SourceTreeDescriptorDatabase). // When two such databases are merged, looking up a non-existent // sub-symbol of a type that already exists in the descriptor pool can // result in an attempt to load multiple definitions of the same type. // The check below avoids this. IsSubSymbolOfBuiltType(name) // Look up file containing this symbol in fallback database. || !fallback_database_->FindFileContainingSymbol(name, &file_proto) // Check if we've already built this file. If so, it apparently doesn't // contain the symbol we're looking for. Some DescriptorDatabases // return false positives. || tables_->FindFile(file_proto.name()) != NULL // Build the file. || BuildFileFromDatabase(file_proto) == NULL) { tables_->known_bad_symbols_.insert(name); return false; } return true; } bool DescriptorPool::TryFindExtensionInFallbackDatabase( const Descriptor* containing_type, int field_number) const { if (fallback_database_ == NULL) return false; FileDescriptorProto file_proto; if (!fallback_database_->FindFileContainingExtension( containing_type->full_name(), field_number, &file_proto)) { return false; } if (tables_->FindFile(file_proto.name()) != NULL) { // We've already loaded this file, and it apparently doesn't contain the // extension we're looking for. Some DescriptorDatabases return false // positives. return false; } if (BuildFileFromDatabase(file_proto) == NULL) { return false; } return true; } // =================================================================== bool FieldDescriptor::is_map_message_type() const { return message_type_->options().map_entry(); } string FieldDescriptor::DefaultValueAsString(bool quote_string_type) const { GOOGLE_CHECK(has_default_value()) << "No default value"; switch (cpp_type()) { case CPPTYPE_INT32: return SimpleItoa(default_value_int32()); break; case CPPTYPE_INT64: return SimpleItoa(default_value_int64()); break; case CPPTYPE_UINT32: return SimpleItoa(default_value_uint32()); break; case CPPTYPE_UINT64: return SimpleItoa(default_value_uint64()); break; case CPPTYPE_FLOAT: return SimpleFtoa(default_value_float()); break; case CPPTYPE_DOUBLE: return SimpleDtoa(default_value_double()); break; case CPPTYPE_BOOL: return default_value_bool() ? "true" : "false"; break; case CPPTYPE_STRING: if (quote_string_type) { return "\"" + CEscape(default_value_string()) + "\""; } else { if (type() == TYPE_BYTES) { return CEscape(default_value_string()); } else { return default_value_string(); } } break; case CPPTYPE_ENUM: return default_value_enum()->name(); break; case CPPTYPE_MESSAGE: GOOGLE_LOG(DFATAL) << "Messages can't have default values!"; break; } GOOGLE_LOG(FATAL) << "Can't get here: failed to get default value as string"; return ""; } // 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())); for (int i = 0; i < dependency_count(); i++) { proto->add_dependency(dependency(i)->name()); } for (int i = 0; i < public_dependency_count(); i++) { proto->add_public_dependency(public_dependencies_[i]); } for (int i = 0; i < weak_dependency_count(); i++) { proto->add_weak_dependency(weak_dependencies_[i]); } for (int i = 0; i < message_type_count(); i++) { message_type(i)->CopyTo(proto->add_message_type()); } for (int i = 0; i < enum_type_count(); i++) { enum_type(i)->CopyTo(proto->add_enum_type()); } for (int i = 0; i < service_count(); i++) { service(i)->CopyTo(proto->add_service()); } for (int i = 0; i < extension_count(); i++) { extension(i)->CopyTo(proto->add_extension()); } if (&options() != &FileOptions::default_instance()) { proto->mutable_options()->CopyFrom(options()); } } void FileDescriptor::CopyJsonNameTo(FileDescriptorProto* proto) const { if (message_type_count() != proto->message_type_size() || extension_count() != proto->extension_size()) { GOOGLE_LOG(ERROR) << "Cannot copy json_name to a proto of a different size."; return; } for (int i = 0; i < message_type_count(); i++) { message_type(i)->CopyJsonNameTo(proto->mutable_message_type(i)); } for (int i = 0; i < extension_count(); i++) { extension(i)->CopyJsonNameTo(proto->mutable_extension(i)); } } void FileDescriptor::CopySourceCodeInfoTo(FileDescriptorProto* proto) const { if (source_code_info_ && source_code_info_ != &SourceCodeInfo::default_instance()) { proto->mutable_source_code_info()->CopyFrom(*source_code_info_); } } void Descriptor::CopyTo(DescriptorProto* proto) const { proto->set_name(name()); for (int i = 0; i < field_count(); i++) { field(i)->CopyTo(proto->add_field()); } for (int i = 0; i < oneof_decl_count(); i++) { oneof_decl(i)->CopyTo(proto->add_oneof_decl()); } for (int i = 0; i < nested_type_count(); i++) { nested_type(i)->CopyTo(proto->add_nested_type()); } for (int i = 0; i < enum_type_count(); i++) { enum_type(i)->CopyTo(proto->add_enum_type()); } for (int i = 0; i < extension_range_count(); i++) { DescriptorProto::ExtensionRange* range = proto->add_extension_range(); range->set_start(extension_range(i)->start); range->set_end(extension_range(i)->end); const ExtensionRangeOptions* options = extension_range(i)->options_; if (options != &ExtensionRangeOptions::default_instance()) { range->mutable_options()->CopyFrom(*options); } } for (int i = 0; i < extension_count(); i++) { extension(i)->CopyTo(proto->add_extension()); } for (int i = 0; i < reserved_range_count(); i++) { DescriptorProto::ReservedRange* range = proto->add_reserved_range(); range->set_start(reserved_range(i)->start); range->set_end(reserved_range(i)->end); } for (int i = 0; i < reserved_name_count(); i++) { proto->add_reserved_name(reserved_name(i)); } if (&options() != &MessageOptions::default_instance()) { proto->mutable_options()->CopyFrom(options()); } } void Descriptor::CopyJsonNameTo(DescriptorProto* proto) const { if (field_count() != proto->field_size() || nested_type_count() != proto->nested_type_size() || extension_count() != proto->extension_size()) { GOOGLE_LOG(ERROR) << "Cannot copy json_name to a proto of a different size."; return; } for (int i = 0; i < field_count(); i++) { field(i)->CopyJsonNameTo(proto->mutable_field(i)); } for (int i = 0; i < nested_type_count(); i++) { nested_type(i)->CopyJsonNameTo(proto->mutable_nested_type(i)); } for (int i = 0; i < extension_count(); i++) { extension(i)->CopyJsonNameTo(proto->mutable_extension(i)); } } void FieldDescriptor::CopyTo(FieldDescriptorProto* proto) const { proto->set_name(name()); proto->set_number(number()); if (has_json_name_) { proto->set_json_name(json_name()); } // Some compilers do not allow static_cast directly between two enum types, // so we must cast to int first. proto->set_label(static_cast( implicit_cast(label()))); proto->set_type(static_cast( implicit_cast(type()))); if (is_extension()) { if (!containing_type()->is_unqualified_placeholder_) { proto->set_extendee("."); } proto->mutable_extendee()->append(containing_type()->full_name()); } if (cpp_type() == CPPTYPE_MESSAGE) { if (message_type()->is_placeholder_) { // We don't actually know if the type is a message type. It could be // an enum. proto->clear_type(); } if (!message_type()->is_unqualified_placeholder_) { proto->set_type_name("."); } proto->mutable_type_name()->append(message_type()->full_name()); } else if (cpp_type() == CPPTYPE_ENUM) { if (!enum_type()->is_unqualified_placeholder_) { proto->set_type_name("."); } proto->mutable_type_name()->append(enum_type()->full_name()); } if (has_default_value()) { proto->set_default_value(DefaultValueAsString(false)); } if (containing_oneof() != NULL && !is_extension()) { proto->set_oneof_index(containing_oneof()->index()); } if (&options() != &FieldOptions::default_instance()) { proto->mutable_options()->CopyFrom(options()); } } void FieldDescriptor::CopyJsonNameTo(FieldDescriptorProto* proto) const { proto->set_json_name(json_name()); } void OneofDescriptor::CopyTo(OneofDescriptorProto* proto) const { proto->set_name(name()); if (&options() != &OneofOptions::default_instance()) { proto->mutable_options()->CopyFrom(options()); } } void EnumDescriptor::CopyTo(EnumDescriptorProto* proto) const { proto->set_name(name()); for (int i = 0; i < value_count(); i++) { value(i)->CopyTo(proto->add_value()); } for (int i = 0; i < reserved_range_count(); i++) { EnumDescriptorProto::EnumReservedRange* range = proto->add_reserved_range(); range->set_start(reserved_range(i)->start); range->set_end(reserved_range(i)->end); } for (int i = 0; i < reserved_name_count(); i++) { proto->add_reserved_name(reserved_name(i)); } if (&options() != &EnumOptions::default_instance()) { proto->mutable_options()->CopyFrom(options()); } } void EnumValueDescriptor::CopyTo(EnumValueDescriptorProto* proto) const { proto->set_name(name()); proto->set_number(number()); if (&options() != &EnumValueOptions::default_instance()) { proto->mutable_options()->CopyFrom(options()); } } void ServiceDescriptor::CopyTo(ServiceDescriptorProto* proto) const { proto->set_name(name()); for (int i = 0; i < method_count(); i++) { method(i)->CopyTo(proto->add_method()); } if (&options() != &ServiceOptions::default_instance()) { proto->mutable_options()->CopyFrom(options()); } } void MethodDescriptor::CopyTo(MethodDescriptorProto* proto) const { proto->set_name(name()); if (!input_type()->is_unqualified_placeholder_) { proto->set_input_type("."); } proto->mutable_input_type()->append(input_type()->full_name()); if (!output_type()->is_unqualified_placeholder_) { proto->set_output_type("."); } proto->mutable_output_type()->append(output_type()->full_name()); if (&options() != &MethodOptions::default_instance()) { proto->mutable_options()->CopyFrom(options()); } if (client_streaming_) { proto->set_client_streaming(true); } if (server_streaming_) { proto->set_server_streaming(true); } } // DebugString methods =============================================== namespace { bool RetrieveOptionsAssumingRightPool(int depth, const Message& options, std::vector* option_entries) { option_entries->clear(); const Reflection* reflection = options.GetReflection(); std::vector fields; reflection->ListFields(options, &fields); for (int i = 0; i < fields.size(); i++) { int count = 1; bool repeated = false; if (fields[i]->is_repeated()) { count = reflection->FieldSize(options, fields[i]); repeated = true; } for (int j = 0; j < count; j++) { string fieldval; if (fields[i]->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { string tmp; TextFormat::Printer printer; printer.SetInitialIndentLevel(depth + 1); printer.PrintFieldValueToString(options, fields[i], repeated ? j : -1, &tmp); fieldval.append("{\n"); fieldval.append(tmp); fieldval.append(depth * 2, ' '); fieldval.append("}"); } else { TextFormat::PrintFieldValueToString(options, fields[i], repeated ? j : -1, &fieldval); } string name; if (fields[i]->is_extension()) { name = "(." + fields[i]->full_name() + ")"; } else { name = fields[i]->name(); } option_entries->push_back(name + " = " + fieldval); } } return !option_entries->empty(); } // Used by each of the option formatters. bool RetrieveOptions(int depth, const Message& options, const DescriptorPool* pool, std::vector* option_entries) { // When printing custom options for a descriptor, we must use an options // message built on top of the same DescriptorPool where the descriptor // is coming from. This is to ensure we are interpreting custom options // against the right pool. if (options.GetDescriptor()->file()->pool() == pool) { return RetrieveOptionsAssumingRightPool(depth, options, option_entries); } else { const Descriptor* option_descriptor = pool->FindMessageTypeByName(options.GetDescriptor()->full_name()); if (option_descriptor == NULL) { // google/protobuf/descriptor.proto is not in the pool. This means no // custom options are used so we are safe to proceed with the compiled // options message type. return RetrieveOptionsAssumingRightPool(depth, options, option_entries); } DynamicMessageFactory factory; google::protobuf::scoped_ptr dynamic_options( factory.GetPrototype(option_descriptor)->New()); if (dynamic_options->ParseFromString(options.SerializeAsString())) { return RetrieveOptionsAssumingRightPool(depth, *dynamic_options, option_entries); } else { GOOGLE_LOG(ERROR) << "Found invalid proto option data for: " << options.GetDescriptor()->full_name(); return RetrieveOptionsAssumingRightPool(depth, options, option_entries); } } } // Formats options that all appear together in brackets. Does not include // brackets. bool FormatBracketedOptions(int depth, const Message& options, const DescriptorPool* pool, string* output) { std::vector all_options; if (RetrieveOptions(depth, options, pool, &all_options)) { output->append(Join(all_options, ", ")); } return !all_options.empty(); } // Formats options one per line bool FormatLineOptions(int depth, const Message& options, const DescriptorPool* pool, string* output) { string prefix(depth * 2, ' '); std::vector all_options; if (RetrieveOptions(depth, options, pool, &all_options)) { for (int i = 0; i < all_options.size(); i++) { strings::SubstituteAndAppend(output, "$0option $1;\n", prefix, all_options[i]); } } return !all_options.empty(); } class SourceLocationCommentPrinter { public: template SourceLocationCommentPrinter(const DescType* desc, const string& prefix, const DebugStringOptions& options) : options_(options), prefix_(prefix) { // Perform the SourceLocation lookup only if we're including user comments, // because the lookup is fairly expensive. have_source_loc_ = options.include_comments && desc->GetSourceLocation(&source_loc_); } SourceLocationCommentPrinter(const FileDescriptor* file, const std::vector& path, const string& prefix, const DebugStringOptions& options) : options_(options), prefix_(prefix) { // Perform the SourceLocation lookup only if we're including user comments, // because the lookup is fairly expensive. have_source_loc_ = options.include_comments && file->GetSourceLocation(path, &source_loc_); } void AddPreComment(string* output) { if (have_source_loc_) { // Detached leading comments. for (int i = 0 ; i < source_loc_.leading_detached_comments.size(); ++i) { *output += FormatComment(source_loc_.leading_detached_comments[i]); *output += "\n"; } // Attached leading comments. if (!source_loc_.leading_comments.empty()) { *output += FormatComment(source_loc_.leading_comments); } } } void AddPostComment(string* output) { if (have_source_loc_ && source_loc_.trailing_comments.size() > 0) { *output += FormatComment(source_loc_.trailing_comments); } } // Format comment such that each line becomes a full-line C++-style comment in // the DebugString() output. string FormatComment(const string& comment_text) { string stripped_comment = comment_text; StripWhitespace(&stripped_comment); std::vector lines = Split(stripped_comment, "\n"); string output; for (int i = 0; i < lines.size(); ++i) { const string& line = lines[i]; strings::SubstituteAndAppend(&output, "$0// $1\n", prefix_, line); } return output; } private: bool have_source_loc_; SourceLocation source_loc_; DebugStringOptions options_; string prefix_; }; } // anonymous namespace string FileDescriptor::DebugString() const { DebugStringOptions options; // default options return DebugStringWithOptions(options); } string FileDescriptor::DebugStringWithOptions( const DebugStringOptions& debug_string_options) const { string contents; { std::vector path; path.push_back(FileDescriptorProto::kSyntaxFieldNumber); SourceLocationCommentPrinter syntax_comment( this, path, "", debug_string_options); syntax_comment.AddPreComment(&contents); strings::SubstituteAndAppend(&contents, "syntax = \"$0\";\n\n", SyntaxName(syntax())); syntax_comment.AddPostComment(&contents); } SourceLocationCommentPrinter comment_printer(this, "", debug_string_options); comment_printer.AddPreComment(&contents); std::set public_dependencies; std::set weak_dependencies; public_dependencies.insert(public_dependencies_, public_dependencies_ + public_dependency_count_); weak_dependencies.insert(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", dependency(i)->name()); } else if (weak_dependencies.count(i) > 0) { strings::SubstituteAndAppend(&contents, "import weak \"$0\";\n", dependency(i)->name()); } else { strings::SubstituteAndAppend(&contents, "import \"$0\";\n", dependency(i)->name()); } } if (!package().empty()) { std::vector path; path.push_back(FileDescriptorProto::kPackageFieldNumber); SourceLocationCommentPrinter package_comment( this, path, "", debug_string_options); package_comment.AddPreComment(&contents); strings::SubstituteAndAppend(&contents, "package $0;\n\n", package()); package_comment.AddPostComment(&contents); } if (FormatLineOptions(0, options(), pool(), &contents)) { contents.append("\n"); // add some space if we had options } for (int i = 0; i < enum_type_count(); i++) { enum_type(i)->DebugString(0, &contents, debug_string_options); contents.append("\n"); } // Find all the 'group' type extensions; we will not output their nested // definitions (those will be done with their group field descriptor). std::set groups; for (int i = 0; i < extension_count(); i++) { if (extension(i)->type() == FieldDescriptor::TYPE_GROUP) { groups.insert(extension(i)->message_type()); } } for (int i = 0; i < message_type_count(); i++) { if (groups.count(message_type(i)) == 0) { message_type(i)->DebugString(0, &contents, debug_string_options, /* include_opening_clause */ true); contents.append("\n"); } } for (int i = 0; i < service_count(); i++) { service(i)->DebugString(&contents, debug_string_options); contents.append("\n"); } const Descriptor* containing_type = NULL; for (int i = 0; i < extension_count(); i++) { 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", containing_type->full_name()); } extension(i)->DebugString(1, FieldDescriptor::PRINT_LABEL, &contents, debug_string_options); } if (extension_count() > 0) contents.append("}\n\n"); comment_printer.AddPostComment(&contents); return contents; } string Descriptor::DebugString() const { DebugStringOptions options; // default options return DebugStringWithOptions(options); } string Descriptor::DebugStringWithOptions( const DebugStringOptions& options) const { string contents; DebugString(0, &contents, options, /* include_opening_clause */ true); return contents; } void Descriptor::DebugString(int depth, string *contents, const DebugStringOptions& debug_string_options, bool include_opening_clause) const { if (options().map_entry()) { // Do not generate debug string for auto-generated map-entry type. return; } string prefix(depth * 2, ' '); ++depth; SourceLocationCommentPrinter comment_printer(this, prefix, debug_string_options); comment_printer.AddPreComment(contents); if (include_opening_clause) { strings::SubstituteAndAppend(contents, "$0message $1", prefix, name()); } contents->append(" {\n"); FormatLineOptions(depth, options(), file()->pool(), contents); // 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 groups; for (int i = 0; i < field_count(); i++) { if (field(i)->type() == FieldDescriptor::TYPE_GROUP) { groups.insert(field(i)->message_type()); } } for (int i = 0; i < extension_count(); i++) { if (extension(i)->type() == FieldDescriptor::TYPE_GROUP) { groups.insert(extension(i)->message_type()); } } for (int i = 0; i < nested_type_count(); i++) { if (groups.count(nested_type(i)) == 0) { nested_type(i)->DebugString(depth, contents, debug_string_options, /* include_opening_clause */ true); } } for (int i = 0; i < enum_type_count(); i++) { enum_type(i)->DebugString(depth, contents, debug_string_options); } for (int i = 0; i < field_count(); i++) { if (field(i)->containing_oneof() == NULL) { field(i)->DebugString(depth, FieldDescriptor::PRINT_LABEL, contents, debug_string_options); } else if (field(i)->containing_oneof()->field(0) == field(i)) { // This is the first field in this oneof, so print the whole oneof. field(i)->containing_oneof()->DebugString(depth, contents, debug_string_options); } } for (int i = 0; i < extension_range_count(); i++) { strings::SubstituteAndAppend(contents, "$0 extensions $1 to $2;\n", prefix, extension_range(i)->start, extension_range(i)->end - 1); } // Group extensions by what they extend, so they can be printed out together. const Descriptor* containing_type = NULL; for (int i = 0; i < extension_count(); i++) { if (extension(i)->containing_type() != containing_type) { if (i > 0) strings::SubstituteAndAppend(contents, "$0 }\n", prefix); containing_type = extension(i)->containing_type(); strings::SubstituteAndAppend(contents, "$0 extend .$1 {\n", prefix, containing_type->full_name()); } extension(i)->DebugString( depth + 1, FieldDescriptor::PRINT_LABEL, contents, debug_string_options); } if (extension_count() > 0) strings::SubstituteAndAppend(contents, "$0 }\n", prefix); if (reserved_range_count() > 0) { strings::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); } else { strings::SubstituteAndAppend(contents, "$0 to $1, ", range->start, range->end - 1); } } contents->replace(contents->size() - 2, 2, ";\n"); } if (reserved_name_count() > 0) { strings::SubstituteAndAppend(contents, "$0 reserved ", prefix); for (int i = 0; i < reserved_name_count(); i++) { strings::SubstituteAndAppend(contents, "\"$0\", ", CEscape(reserved_name(i))); } contents->replace(contents->size() - 2, 2, ";\n"); } strings::SubstituteAndAppend(contents, "$0}\n", prefix); comment_printer.AddPostComment(contents); } string FieldDescriptor::DebugString() const { DebugStringOptions options; // default options return DebugStringWithOptions(options); } string FieldDescriptor::DebugStringWithOptions( const DebugStringOptions& debug_string_options) const { string contents; int depth = 0; if (is_extension()) { strings::SubstituteAndAppend(&contents, "extend .$0 {\n", containing_type()->full_name()); depth = 1; } DebugString(depth, PRINT_LABEL, &contents, debug_string_options); if (is_extension()) { contents.append("}\n"); } return contents; } // The field type string used in FieldDescriptor::DebugString() string FieldDescriptor::FieldTypeNameDebugString() const { switch(type()) { case TYPE_MESSAGE: return "." + message_type()->full_name(); case TYPE_ENUM: return "." + enum_type()->full_name(); default: return kTypeToName[type()]; } } void FieldDescriptor::DebugString(int depth, PrintLabelFlag print_label_flag, string *contents, const DebugStringOptions& debug_string_options) const { string prefix(depth * 2, ' '); string field_type; // Special case map fields. if (is_map()) { strings::SubstituteAndAppend( &field_type, "map<$0, $1>", message_type()->field(0)->FieldTypeNameDebugString(), message_type()->field(1)->FieldTypeNameDebugString()); } else { field_type = FieldTypeNameDebugString(); } bool print_label = true; // Determine whether to omit label: // 1. For an optional field, omit label if it's in oneof or in proto3. // 2. For a repeated field, omit label if it's a map. if (is_optional() && (print_label_flag == OMIT_LABEL || file()->syntax() == FileDescriptor::SYNTAX_PROTO3)) { print_label = false; } else if (is_map()) { print_label = false; } string label; if (print_label) { label = kLabelToName[this->label()]; label.push_back(' '); } SourceLocationCommentPrinter comment_printer(this, prefix, debug_string_options); comment_printer.AddPreComment(contents); strings::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", DefaultValueAsString(true)); } if (has_json_name_) { if (!bracketed) { bracketed = true; contents->append("["); } else { contents->append(", "); } contents->append("json_name = \""); contents->append(CEscape(json_name())); contents->append("\""); } string formatted_options; if (FormatBracketedOptions(depth, options(), file()->pool(), &formatted_options)) { contents->append(bracketed ? ", " : " ["); bracketed = true; contents->append(formatted_options); } if (bracketed) { contents->append("]"); } if (type() == TYPE_GROUP) { if (debug_string_options.elide_group_body) { contents->append(" { ... };\n"); } else { message_type()->DebugString(depth, contents, debug_string_options, /* include_opening_clause */ false); } } else { contents->append(";\n"); } comment_printer.AddPostComment(contents); } string OneofDescriptor::DebugString() const { DebugStringOptions options; // default values return DebugStringWithOptions(options); } string OneofDescriptor::DebugStringWithOptions( const DebugStringOptions& options) const { string contents; DebugString(0, &contents, options); return contents; } void OneofDescriptor::DebugString(int depth, string* contents, const DebugStringOptions& debug_string_options) const { string prefix(depth * 2, ' '); ++depth; SourceLocationCommentPrinter comment_printer(this, prefix, debug_string_options); comment_printer.AddPreComment(contents); strings::SubstituteAndAppend(contents, "$0oneof $1 {", prefix, name()); FormatLineOptions(depth, options(), containing_type()->file()->pool(), contents); if (debug_string_options.elide_oneof_body) { contents->append(" ... }\n"); } else { contents->append("\n"); for (int i = 0; i < field_count(); i++) { field(i)->DebugString(depth, FieldDescriptor::OMIT_LABEL, contents, debug_string_options); } strings::SubstituteAndAppend(contents, "$0}\n", prefix); } comment_printer.AddPostComment(contents); } string EnumDescriptor::DebugString() const { DebugStringOptions options; // default values return DebugStringWithOptions(options); } string EnumDescriptor::DebugStringWithOptions( const DebugStringOptions& options) const { string contents; DebugString(0, &contents, options); return contents; } void EnumDescriptor::DebugString(int depth, string *contents, const DebugStringOptions& debug_string_options) const { string prefix(depth * 2, ' '); ++depth; SourceLocationCommentPrinter comment_printer(this, prefix, debug_string_options); comment_printer.AddPreComment(contents); strings::SubstituteAndAppend(contents, "$0enum $1 {\n", prefix, name()); FormatLineOptions(depth, options(), file()->pool(), contents); for (int i = 0; i < value_count(); i++) { value(i)->DebugString(depth, contents, debug_string_options); } if (reserved_range_count() > 0) { strings::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); } else { strings::SubstituteAndAppend(contents, "$0 to $1, ", range->start, range->end); } } contents->replace(contents->size() - 2, 2, ";\n"); } if (reserved_name_count() > 0) { strings::SubstituteAndAppend(contents, "$0 reserved ", prefix); for (int i = 0; i < reserved_name_count(); i++) { strings::SubstituteAndAppend(contents, "\"$0\", ", CEscape(reserved_name(i))); } contents->replace(contents->size() - 2, 2, ";\n"); } strings::SubstituteAndAppend(contents, "$0}\n", prefix); comment_printer.AddPostComment(contents); } string EnumValueDescriptor::DebugString() const { DebugStringOptions options; // default values return DebugStringWithOptions(options); } string EnumValueDescriptor::DebugStringWithOptions( const DebugStringOptions& options) const { string contents; DebugString(0, &contents, options); return contents; } void EnumValueDescriptor::DebugString(int depth, string *contents, const DebugStringOptions& debug_string_options) const { string prefix(depth * 2, ' '); SourceLocationCommentPrinter comment_printer(this, prefix, debug_string_options); comment_printer.AddPreComment(contents); strings::SubstituteAndAppend(contents, "$0$1 = $2", prefix, name(), number()); string formatted_options; if (FormatBracketedOptions(depth, options(), type()->file()->pool(), &formatted_options)) { strings::SubstituteAndAppend(contents, " [$0]", formatted_options); } contents->append(";\n"); comment_printer.AddPostComment(contents); } string ServiceDescriptor::DebugString() const { DebugStringOptions options; // default values return DebugStringWithOptions(options); } string ServiceDescriptor::DebugStringWithOptions( const DebugStringOptions& options) const { string contents; DebugString(&contents, options); return contents; } void ServiceDescriptor::DebugString(string *contents, const DebugStringOptions& debug_string_options) const { SourceLocationCommentPrinter comment_printer(this, /* prefix */ "", debug_string_options); comment_printer.AddPreComment(contents); strings::SubstituteAndAppend(contents, "service $0 {\n", name()); FormatLineOptions(1, options(), file()->pool(), contents); for (int i = 0; i < method_count(); i++) { method(i)->DebugString(1, contents, debug_string_options); } contents->append("}\n"); comment_printer.AddPostComment(contents); } string MethodDescriptor::DebugString() const { DebugStringOptions options; // default values return DebugStringWithOptions(options); } string MethodDescriptor::DebugStringWithOptions( const DebugStringOptions& options) const { string contents; DebugString(0, &contents, options); return contents; } void MethodDescriptor::DebugString(int depth, string *contents, const DebugStringOptions& debug_string_options) const { string prefix(depth * 2, ' '); ++depth; SourceLocationCommentPrinter comment_printer(this, prefix, debug_string_options); comment_printer.AddPreComment(contents); strings::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 " : ""); string formatted_options; if (FormatLineOptions(depth, options(), service()->file()->pool(), &formatted_options)) { strings::SubstituteAndAppend(contents, " {\n$0$1}\n", formatted_options, prefix); } else { contents->append(";\n"); } comment_printer.AddPostComment(contents); } // Location methods =============================================== bool FileDescriptor::GetSourceLocation(const std::vector& path, SourceLocation* out_location) const { GOOGLE_CHECK_NOTNULL(out_location); if (source_code_info_) { if (const SourceCodeInfo_Location* loc = tables_->GetSourceLocation(path, source_code_info_)) { const RepeatedField& span = loc->span(); if (span.size() == 3 || span.size() == 4) { out_location->start_line = span.Get(0); out_location->start_column = span.Get(1); out_location->end_line = span.Get(span.size() == 3 ? 0 : 2); out_location->end_column = span.Get(span.size() - 1); out_location->leading_comments = loc->leading_comments(); out_location->trailing_comments = loc->trailing_comments(); out_location->leading_detached_comments.assign( loc->leading_detached_comments().begin(), loc->leading_detached_comments().end()); return true; } } } return false; } bool FileDescriptor::GetSourceLocation(SourceLocation* out_location) const { std::vector path; // empty path for root FileDescriptor return GetSourceLocation(path, out_location); } bool FieldDescriptor::is_packed() const { if (!is_packable()) return false; if (file_->syntax() == FileDescriptor::SYNTAX_PROTO2) { return (options_ != NULL) && options_->packed(); } else { return options_ == NULL || !options_->has_packed() || options_->packed(); } } bool Descriptor::GetSourceLocation(SourceLocation* out_location) const { std::vector path; GetLocationPath(&path); return file()->GetSourceLocation(path, out_location); } bool FieldDescriptor::GetSourceLocation(SourceLocation* out_location) const { std::vector path; GetLocationPath(&path); return file()->GetSourceLocation(path, out_location); } bool OneofDescriptor::GetSourceLocation(SourceLocation* out_location) const { std::vector path; GetLocationPath(&path); return containing_type()->file()->GetSourceLocation(path, out_location); } bool EnumDescriptor::GetSourceLocation(SourceLocation* out_location) const { std::vector path; GetLocationPath(&path); return file()->GetSourceLocation(path, out_location); } bool MethodDescriptor::GetSourceLocation(SourceLocation* out_location) const { std::vector path; GetLocationPath(&path); return service()->file()->GetSourceLocation(path, out_location); } bool ServiceDescriptor::GetSourceLocation(SourceLocation* out_location) const { std::vector path; GetLocationPath(&path); return file()->GetSourceLocation(path, out_location); } bool EnumValueDescriptor::GetSourceLocation( SourceLocation* out_location) const { std::vector path; GetLocationPath(&path); return type()->file()->GetSourceLocation(path, out_location); } void Descriptor::GetLocationPath(std::vector* output) const { if (containing_type()) { containing_type()->GetLocationPath(output); output->push_back(DescriptorProto::kNestedTypeFieldNumber); output->push_back(index()); } else { output->push_back(FileDescriptorProto::kMessageTypeFieldNumber); output->push_back(index()); } } void FieldDescriptor::GetLocationPath(std::vector* output) const { if (is_extension()) { if (extension_scope() == NULL) { output->push_back(FileDescriptorProto::kExtensionFieldNumber); output->push_back(index()); } else { extension_scope()->GetLocationPath(output); output->push_back(DescriptorProto::kExtensionFieldNumber); output->push_back(index()); } } else { containing_type()->GetLocationPath(output); output->push_back(DescriptorProto::kFieldFieldNumber); output->push_back(index()); } } void OneofDescriptor::GetLocationPath(std::vector* output) const { containing_type()->GetLocationPath(output); output->push_back(DescriptorProto::kOneofDeclFieldNumber); output->push_back(index()); } void EnumDescriptor::GetLocationPath(std::vector* output) const { if (containing_type()) { containing_type()->GetLocationPath(output); output->push_back(DescriptorProto::kEnumTypeFieldNumber); output->push_back(index()); } else { output->push_back(FileDescriptorProto::kEnumTypeFieldNumber); output->push_back(index()); } } void EnumValueDescriptor::GetLocationPath(std::vector* output) const { type()->GetLocationPath(output); output->push_back(EnumDescriptorProto::kValueFieldNumber); output->push_back(index()); } void ServiceDescriptor::GetLocationPath(std::vector* output) const { output->push_back(FileDescriptorProto::kServiceFieldNumber); output->push_back(index()); } void MethodDescriptor::GetLocationPath(std::vector* output) const { service()->GetLocationPath(output); output->push_back(ServiceDescriptorProto::kMethodFieldNumber); output->push_back(index()); } // =================================================================== namespace { // Represents an options message to interpret. Extension names in the option // name are resolved relative to name_scope. element_name and orig_opt are // used only for error reporting (since the parser records locations against // pointers in the original options, not the mutable copy). The Message must be // one of the Options messages in descriptor.proto. struct OptionsToInterpret { OptionsToInterpret(const string& ns, const string& el, const Message* orig_opt, Message* opt) : name_scope(ns), element_name(el), original_options(orig_opt), options(opt) { } string name_scope; string element_name; const Message* original_options; Message* options; }; } // namespace class DescriptorBuilder { public: DescriptorBuilder(const DescriptorPool* pool, DescriptorPool::Tables* tables, DescriptorPool::ErrorCollector* error_collector); ~DescriptorBuilder(); const FileDescriptor* BuildFile(const FileDescriptorProto& proto); private: friend class OptionInterpreter; // Non-recursive part of BuildFile functionality. FileDescriptor* BuildFileImpl(const FileDescriptorProto& proto); const DescriptorPool* pool_; DescriptorPool::Tables* tables_; // for convenience DescriptorPool::ErrorCollector* error_collector_; // As we build descriptors we store copies of the options messages in // them. We put pointers to those copies in this vector, as we build, so we // can later (after cross-linking) interpret those options. std::vector options_to_interpret_; bool had_errors_; string filename_; FileDescriptor* file_; FileDescriptorTables* file_tables_; std::set dependencies_; // unused_dependency_ is used to record the unused imported files. // Note: public import is not considered. std::set 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 // possible_undeclared_dependency_ to point at that file. This is only used // by AddNotDefinedError() to report a more useful error message. // possible_undeclared_dependency_name_ is the name of the symbol that was // actually found in possible_undeclared_dependency_, which may be a parent // of the symbol actually looked for. const FileDescriptor* possible_undeclared_dependency_; string possible_undeclared_dependency_name_; // If LookupSymbol() could resolve a symbol which is not defined, // record the resolved name. This is only used by AddNotDefinedError() // to report a more useful error message. string undefine_resolved_name_; void AddError(const string& element_name, const Message& descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, const string& error); void AddError(const string& element_name, const Message& descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, const char* error); void AddRecursiveImportError(const FileDescriptorProto& proto, int from_here); void AddTwiceListedError(const FileDescriptorProto& proto, int index); void AddImportError(const FileDescriptorProto& proto, int index); // Adds an error indicating that undefined_symbol was not defined. Must // only be called after LookupSymbol() fails. void AddNotDefinedError( const string& element_name, const Message& descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, const string& undefined_symbol); void AddWarning(const string& element_name, const Message& descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, const string& error); // Silly helper which determines if the given file is in the given package. // I.e., either file->package() == package_name or file->package() is a // nested package within package_name. bool IsInPackage(const FileDescriptor* file, const string& package_name); // Helper function which finds all public dependencies of the given file, and // stores the them in the dependencies_ set in the builder. void RecordPublicDependencies(const FileDescriptor* file); // Like tables_->FindSymbol(), but additionally: // - Search the pool's underlay if not found in tables_. // - Insure that the resulting Symbol is from one of the file's declared // dependencies. Symbol FindSymbol(const string& name, bool build_it = true); // Like FindSymbol() but does not require that the symbol is in one of the // file's declared dependencies. Symbol FindSymbolNotEnforcingDeps(const string& name, bool build_it = true); // This implements the body of FindSymbolNotEnforcingDeps(). Symbol FindSymbolNotEnforcingDepsHelper(const DescriptorPool* pool, const string& name, bool build_it = true); // Like FindSymbol(), but looks up the name relative to some other symbol // name. This first searches siblings of relative_to, then siblings of its // parents, etc. For example, LookupSymbol("foo.bar", "baz.qux.corge") makes // the following calls, returning the first non-null result: // FindSymbol("baz.qux.foo.bar"), FindSymbol("baz.foo.bar"), // FindSymbol("foo.bar"). If AllowUnknownDependencies() has been called // on the DescriptorPool, this will generate a placeholder type if // the name is not found (unless the name itself is malformed). The // placeholder_type parameter indicates what kind of placeholder should be // constructed in this case. The resolve_mode parameter determines whether // any symbol is returned, or only symbols that are types. Note, however, // that LookupSymbol may still return a non-type symbol in LOOKUP_TYPES mode, // if it believes that's all it could refer to. The caller should always // check that it receives the type of symbol it was expecting. enum ResolveMode { LOOKUP_ALL, LOOKUP_TYPES }; Symbol LookupSymbol(const string& name, const string& relative_to, DescriptorPool::PlaceholderType placeholder_type = DescriptorPool::PLACEHOLDER_MESSAGE, ResolveMode resolve_mode = LOOKUP_ALL, bool build_it = true); // Like LookupSymbol() but will not return a placeholder even if // AllowUnknownDependencies() has been used. Symbol LookupSymbolNoPlaceholder(const string& name, const string& relative_to, ResolveMode resolve_mode = LOOKUP_ALL, bool build_it = true); // Calls tables_->AddSymbol() and records an error if it fails. Returns // true if successful or false if failed, though most callers can ignore // the return value since an error has already been recorded. bool AddSymbol(const string& full_name, const void* parent, const string& name, const Message& proto, Symbol symbol); // Like AddSymbol(), but succeeds if the symbol is already defined as long // as the existing definition is also a package (because it's OK to define // the same package in two different files). Also adds all parents of the // packgae to the symbol table (e.g. AddPackage("foo.bar", ...) will add // "foo.bar" and "foo" to the table). void AddPackage(const string& name, const Message& proto, const FileDescriptor* file); // Checks that the symbol name contains only alphanumeric characters and // underscores. Records an error otherwise. void ValidateSymbolName(const string& name, const string& full_name, const Message& proto); // Used by BUILD_ARRAY macro (below) to avoid having to have the type // specified as a macro parameter. template inline void AllocateArray(int size, Type** output) { *output = tables_->AllocateArray(size); } // Allocates a copy of orig_options in tables_ and stores it in the // descriptor. Remembers its uninterpreted options, to be interpreted // later. DescriptorT must be one of the Descriptor messages from // descriptor.proto. template void AllocateOptions( const typename DescriptorT::OptionsType& orig_options, DescriptorT* descriptor); // Specialization for FileOptions. void AllocateOptions(const FileOptions& orig_options, FileDescriptor* descriptor); // Implementation for AllocateOptions(). Don't call this directly. template void AllocateOptionsImpl( const string& name_scope, const string& element_name, const typename DescriptorT::OptionsType& orig_options, DescriptorT* descriptor); // These methods all have the same signature for the sake of the BUILD_ARRAY // macro, below. void BuildMessage(const DescriptorProto& proto, const Descriptor* parent, Descriptor* result); void BuildFieldOrExtension(const FieldDescriptorProto& proto, const Descriptor* parent, FieldDescriptor* result, bool is_extension); void BuildField(const FieldDescriptorProto& proto, const Descriptor* parent, FieldDescriptor* result) { BuildFieldOrExtension(proto, parent, result, false); } void BuildExtension(const FieldDescriptorProto& proto, const Descriptor* parent, FieldDescriptor* result) { BuildFieldOrExtension(proto, parent, result, true); } void BuildExtensionRange(const DescriptorProto::ExtensionRange& proto, const Descriptor* parent, Descriptor::ExtensionRange* result); void BuildReservedRange(const DescriptorProto::ReservedRange& proto, const Descriptor* parent, Descriptor::ReservedRange* result); void BuildReservedRange(const EnumDescriptorProto::EnumReservedRange& proto, const EnumDescriptor* parent, EnumDescriptor::ReservedRange* result); void BuildOneof(const OneofDescriptorProto& proto, Descriptor* parent, OneofDescriptor* result); void CheckEnumValueUniqueness(const EnumDescriptorProto& proto, const EnumDescriptor* result); void BuildEnum(const EnumDescriptorProto& proto, const Descriptor* parent, EnumDescriptor* result); void BuildEnumValue(const EnumValueDescriptorProto& proto, const EnumDescriptor* parent, EnumValueDescriptor* result); void BuildService(const ServiceDescriptorProto& proto, const void* dummy, ServiceDescriptor* result); void BuildMethod(const MethodDescriptorProto& proto, const ServiceDescriptor* parent, MethodDescriptor* result); void LogUnusedDependency(const FileDescriptorProto& proto, const FileDescriptor* result); // Must be run only after building. // // NOTE: Options will not be available during cross-linking, as they // have not yet been interpreted. Defer any handling of options to the // Validate*Options methods. void CrossLinkFile(FileDescriptor* file, const FileDescriptorProto& proto); void CrossLinkMessage(Descriptor* message, const DescriptorProto& proto); void CrossLinkField(FieldDescriptor* field, const FieldDescriptorProto& proto); void CrossLinkExtensionRange(Descriptor::ExtensionRange* range, const DescriptorProto::ExtensionRange& proto); void CrossLinkEnum(EnumDescriptor* enum_type, const EnumDescriptorProto& proto); void CrossLinkEnumValue(EnumValueDescriptor* enum_value, const EnumValueDescriptorProto& proto); void CrossLinkService(ServiceDescriptor* service, const ServiceDescriptorProto& proto); void CrossLinkMethod(MethodDescriptor* method, const MethodDescriptorProto& proto); // Must be run only after cross-linking. void InterpretOptions(); // A helper class for interpreting options. class OptionInterpreter { public: // Creates an interpreter that operates in the context of the pool of the // specified builder, which must not be NULL. We don't take ownership of the // builder. explicit OptionInterpreter(DescriptorBuilder* builder); ~OptionInterpreter(); // Interprets the uninterpreted options in the specified Options message. // On error, calls AddError() on the underlying builder and returns false. // Otherwise returns true. bool InterpretOptions(OptionsToInterpret* options_to_interpret); class AggregateOptionFinder; private: // Interprets uninterpreted_option_ on the specified message, which // must be the mutable copy of the original options message to which // uninterpreted_option_ belongs. bool InterpretSingleOption(Message* options); // Adds the uninterpreted_option to the given options message verbatim. // Used when AllowUnknownDependencies() is in effect and we can't find // the option's definition. void AddWithoutInterpreting(const UninterpretedOption& uninterpreted_option, Message* options); // A recursive helper function that drills into the intermediate fields // in unknown_fields to check if field innermost_field is set on the // innermost message. Returns false and sets an error if so. bool ExamineIfOptionIsSet( std::vector::const_iterator intermediate_fields_iter, std::vector::const_iterator intermediate_fields_end, const FieldDescriptor* innermost_field, const string& debug_msg_name, const UnknownFieldSet& unknown_fields); // Validates the value for the option field of the currently interpreted // option and then sets it on the unknown_field. bool SetOptionValue(const FieldDescriptor* option_field, UnknownFieldSet* unknown_fields); // Parses an aggregate value for a CPPTYPE_MESSAGE option and // saves it into *unknown_fields. bool SetAggregateOption(const FieldDescriptor* option_field, UnknownFieldSet* unknown_fields); // Convenience functions to set an int field the right way, depending on // its wire type (a single int CppType can represent multiple wire types). void SetInt32(int number, int32 value, FieldDescriptor::Type type, UnknownFieldSet* unknown_fields); void SetInt64(int number, int64 value, FieldDescriptor::Type type, UnknownFieldSet* unknown_fields); void SetUInt32(int number, uint32 value, FieldDescriptor::Type type, UnknownFieldSet* unknown_fields); void SetUInt64(int number, uint64 value, FieldDescriptor::Type type, UnknownFieldSet* unknown_fields); // A helper function that adds an error at the specified location of the // option we're currently interpreting, and returns false. bool AddOptionError(DescriptorPool::ErrorCollector::ErrorLocation location, const string& msg) { builder_->AddError(options_to_interpret_->element_name, *uninterpreted_option_, location, msg); return false; } // A helper function that adds an error at the location of the option name // and returns false. bool AddNameError(const string& msg) { return AddOptionError(DescriptorPool::ErrorCollector::OPTION_NAME, msg); } // A helper function that adds an error at the location of the option name // and returns false. bool AddValueError(const string& msg) { return AddOptionError(DescriptorPool::ErrorCollector::OPTION_VALUE, msg); } // We interpret against this builder's pool. Is never NULL. We don't own // this pointer. DescriptorBuilder* builder_; // The options we're currently interpreting, or NULL if we're not in a call // to InterpretOptions. const OptionsToInterpret* options_to_interpret_; // The option we're currently interpreting within options_to_interpret_, or // NULL if we're not in a call to InterpretOptions(). This points to a // submessage of the original option, not the mutable copy. Therefore we // can use it to find locations recorded by the parser. const UninterpretedOption* uninterpreted_option_; // 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, // OptionInterpreter should have access to the private members of any class // which has declared DescriptorBuilder as a friend. Unfortunately some old // versions of GCC and other compilers do not implement this correctly. So, // we have to have these intermediate methods to provide access. We also // redundantly declare OptionInterpreter a friend just to make things extra // clear for these bad compilers. friend class OptionInterpreter; friend class OptionInterpreter::AggregateOptionFinder; static inline bool get_allow_unknown(const DescriptorPool* pool) { return pool->allow_unknown_; } static inline bool get_enforce_weak(const DescriptorPool* pool) { return pool->enforce_weak_; } static inline bool get_is_placeholder(const Descriptor* descriptor) { return descriptor->is_placeholder_; } static inline void assert_mutex_held(const DescriptorPool* pool) { if (pool->mutex_ != NULL) { pool->mutex_->AssertHeld(); } } // Must be run only after options have been interpreted. // // NOTE: Validation code must only reference the options in the mutable // descriptors, which are the ones that have been interpreted. The const // proto references are passed in only so they can be provided to calls to // AddError(). Do not look at their options, which have not been interpreted. void ValidateFileOptions(FileDescriptor* file, const FileDescriptorProto& proto); void ValidateMessageOptions(Descriptor* message, const DescriptorProto& proto); void ValidateFieldOptions(FieldDescriptor* field, const FieldDescriptorProto& proto); void ValidateEnumOptions(EnumDescriptor* enm, const EnumDescriptorProto& proto); void ValidateEnumValueOptions(EnumValueDescriptor* enum_value, const EnumValueDescriptorProto& proto); void ValidateServiceOptions(ServiceDescriptor* service, const ServiceDescriptorProto& proto); void ValidateMethodOptions(MethodDescriptor* method, const MethodDescriptorProto& proto); void ValidateProto3(FileDescriptor* file, const FileDescriptorProto& proto); void ValidateProto3Message(Descriptor* message, const DescriptorProto& proto); void ValidateProto3Field(FieldDescriptor* field, const FieldDescriptorProto& proto); void ValidateProto3Enum(EnumDescriptor* enm, const EnumDescriptorProto& proto); // Returns true if the map entry message is compatible with the // auto-generated entry message from map fields syntax. bool ValidateMapEntry(FieldDescriptor* field, const FieldDescriptorProto& proto); // Recursively detects naming conflicts with map entry types for a // better error message. void DetectMapConflicts(const Descriptor* message, const DescriptorProto& proto); void ValidateJSType(FieldDescriptor* field, const FieldDescriptorProto& proto); }; const FileDescriptor* DescriptorPool::BuildFile( const FileDescriptorProto& proto) { GOOGLE_CHECK(fallback_database_ == NULL) << "Cannot call BuildFile on a DescriptorPool that uses a " "DescriptorDatabase. You must instead find a way to get your file " "into the underlying database."; GOOGLE_CHECK(mutex_ == NULL); // Implied by the above GOOGLE_CHECK. tables_->known_bad_symbols_.clear(); tables_->known_bad_files_.clear(); return DescriptorBuilder(this, tables_.get(), NULL).BuildFile(proto); } const FileDescriptor* DescriptorPool::BuildFileCollectingErrors( const FileDescriptorProto& proto, ErrorCollector* error_collector) { GOOGLE_CHECK(fallback_database_ == NULL) << "Cannot call BuildFile on a DescriptorPool that uses a " "DescriptorDatabase. You must instead find a way to get your file " "into the underlying database."; GOOGLE_CHECK(mutex_ == NULL); // Implied by the above GOOGLE_CHECK. tables_->known_bad_symbols_.clear(); tables_->known_bad_files_.clear(); return DescriptorBuilder(this, tables_.get(), error_collector).BuildFile(proto); } const FileDescriptor* DescriptorPool::BuildFileFromDatabase( const FileDescriptorProto& proto) const { mutex_->AssertHeld(); if (tables_->known_bad_files_.count(proto.name()) > 0) { return NULL; } const FileDescriptor* result = DescriptorBuilder(this, tables_.get(), default_error_collector_).BuildFile(proto); if (result == NULL) { tables_->known_bad_files_.insert(proto.name()); } return result; } DescriptorBuilder::DescriptorBuilder( const DescriptorPool* pool, DescriptorPool::Tables* tables, DescriptorPool::ErrorCollector* error_collector) : pool_(pool), tables_(tables), error_collector_(error_collector), had_errors_(false), possible_undeclared_dependency_(NULL), undefine_resolved_name_("") {} DescriptorBuilder::~DescriptorBuilder() {} void DescriptorBuilder::AddError( const string& element_name, const Message& descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, const string& error) { if (error_collector_ == NULL) { if (!had_errors_) { GOOGLE_LOG(ERROR) << "Invalid proto descriptor for file \"" << filename_ << "\":"; } GOOGLE_LOG(ERROR) << " " << element_name << ": " << error; } else { error_collector_->AddError(filename_, element_name, &descriptor, location, error); } had_errors_ = true; } void DescriptorBuilder::AddError( const string& element_name, const Message& descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, const char* error) { AddError(element_name, descriptor, location, string(error)); } void DescriptorBuilder::AddNotDefinedError( const string& element_name, const Message& descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, const string& undefined_symbol) { if (possible_undeclared_dependency_ == NULL && undefine_resolved_name_.empty()) { AddError(element_name, descriptor, location, "\"" + undefined_symbol + "\" is not defined."); } else { if (possible_undeclared_dependency_ != NULL) { AddError(element_name, descriptor, location, "\"" + possible_undeclared_dependency_name_ + "\" seems to be defined in \"" + possible_undeclared_dependency_->name() + "\", which is not " "imported by \"" + filename_ + "\". To use it here, please " "add the necessary import."); } if (!undefine_resolved_name_.empty()) { AddError(element_name, descriptor, location, "\"" + undefined_symbol + "\" is resolved to \"" + undefine_resolved_name_ + "\", which is not defined. " "The innermost scope is searched first in name resolution. " "Consider using a leading '.'(i.e., \"." + undefined_symbol + "\") to start from the outermost scope."); } } } void DescriptorBuilder::AddWarning( const string& element_name, const Message& descriptor, DescriptorPool::ErrorCollector::ErrorLocation location, const string& error) { if (error_collector_ == NULL) { GOOGLE_LOG(WARNING) << filename_ << " " << element_name << ": " << error; } else { error_collector_->AddWarning(filename_, element_name, &descriptor, location, error); } } bool DescriptorBuilder::IsInPackage(const FileDescriptor* file, const string& package_name) { return HasPrefixString(file->package(), package_name) && (file->package().size() == package_name.size() || file->package()[package_name.size()] == '.'); } void DescriptorBuilder::RecordPublicDependencies(const FileDescriptor* file) { if (file == NULL || !dependencies_.insert(file).second) return; for (int i = 0; file != NULL && i < file->public_dependency_count(); i++) { RecordPublicDependencies(file->public_dependency(i)); } } Symbol DescriptorBuilder::FindSymbolNotEnforcingDepsHelper( const DescriptorPool* pool, const 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_) ? NULL : pool->mutex_); Symbol result = pool->tables_->FindSymbol(name); if (result.IsNull() && pool->underlay_ != NULL) { // Symbol not found; check the underlay. result = FindSymbolNotEnforcingDepsHelper(pool->underlay_, name); } if (result.IsNull()) { // With lazily_build_dependencies_, a symbol lookup at cross link time is // not guaranteed to be successful. In most cases, build_it will be false, // which intentionally prevents us from building an import until it's // actually needed. In some cases, like registering an extension, we want // to build the file containing the symbol, and build_it will be set. // Also, build_it will be true when !lazily_build_dependencies_, to provide // better error reporting of missing dependencies. if (build_it && pool->TryFindSymbolInFallbackDatabase(name)) { result = pool->tables_->FindSymbol(name); } } return result; } Symbol DescriptorBuilder::FindSymbolNotEnforcingDeps(const string& name, bool build_it) { return FindSymbolNotEnforcingDepsHelper(pool_, name, build_it); } Symbol DescriptorBuilder::FindSymbol(const string& name, bool build_it) { Symbol result = FindSymbolNotEnforcingDeps(name, build_it); if (result.IsNull()) return result; if (!pool_->enforce_dependencies_) { // Hack for CompilerUpgrader, and also used for lazily_build_dependencies_ return result; } // 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) { unused_dependency_.erase(file); return result; } if (result.type == Symbol::PACKAGE) { // Arg, this is overcomplicated. The symbol is a package name. It could // be that the package was defined in multiple files. result.GetFile() // returns the first file we saw that used this package. We've determined // that that file is not a direct dependency of the file we are currently // building, but it could be that some other file which *is* a direct // 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_iterator it = dependencies_.begin(); it != dependencies_.end(); ++it) { // Note: A dependency may be NULL if it was not found or had errors. if (*it != NULL && IsInPackage(*it, name)) return result; } } possible_undeclared_dependency_ = file; possible_undeclared_dependency_name_ = name; return kNullSymbol; } Symbol DescriptorBuilder::LookupSymbolNoPlaceholder(const string& name, const string& relative_to, ResolveMode resolve_mode, bool build_it) { possible_undeclared_dependency_ = NULL; undefine_resolved_name_.clear(); if (!name.empty() && name[0] == '.') { // Fully-qualified name. return FindSymbol(name.substr(1), build_it); } // If name is something like "Foo.Bar.baz", and symbols named "Foo" are // defined in multiple parent scopes, we only want to find "Bar.baz" in the // innermost one. E.g., the following should produce an error: // message Bar { message Baz {} } // message Foo { // message Bar { // } // optional Bar.Baz baz = 1; // } // So, we look for just "Foo" first, then look for "Bar.baz" within it if // found. string::size_type name_dot_pos = name.find_first_of('.'); string first_part_of_name; if (name_dot_pos == string::npos) { first_part_of_name = name; } else { first_part_of_name = name.substr(0, name_dot_pos); } string scope_to_try(relative_to); while (true) { // Chop off the last component of the scope. string::size_type dot_pos = scope_to_try.find_last_of('.'); if (dot_pos == string::npos) { return FindSymbol(name, build_it); } else { scope_to_try.erase(dot_pos); } // Append ".first_part_of_name" and try to find. string::size_type old_size = scope_to_try.size(); scope_to_try.append(1, '.'); scope_to_try.append(first_part_of_name); Symbol result = FindSymbol(scope_to_try, build_it); if (!result.IsNull()) { if (first_part_of_name.size() < name.size()) { // name is a compound symbol, of which we only found the first part. // Now try to look up the rest of it. if (result.IsAggregate()) { scope_to_try.append(name, first_part_of_name.size(), name.size() - first_part_of_name.size()); result = FindSymbol(scope_to_try, build_it); if (result.IsNull()) { undefine_resolved_name_ = scope_to_try; } return result; } else { // We found a symbol but it's not an aggregate. Continue the loop. } } else { if (resolve_mode == LOOKUP_TYPES && !result.IsType()) { // We found a symbol but it's not a type. Continue the loop. } else { return result; } } } // Not found. Remove the name so we can try again. scope_to_try.erase(old_size); } } Symbol DescriptorBuilder::LookupSymbol( const string& name, const string& relative_to, DescriptorPool::PlaceholderType placeholder_type, ResolveMode resolve_mode, bool build_it) { Symbol result = LookupSymbolNoPlaceholder(name, relative_to, resolve_mode, build_it); if (result.IsNull() && pool_->allow_unknown_) { // Not found, but AllowUnknownDependencies() is enabled. Return a // placeholder instead. result = pool_->NewPlaceholderWithMutexHeld(name, placeholder_type); } return result; } static bool ValidateQualifiedName(const string& name) { bool last_was_period = false; for (int i = 0; i < name.size(); i++) { // I don't trust isalnum() due to locales. :( if (('a' <= name[i] && name[i] <= 'z') || ('A' <= name[i] && name[i] <= 'Z') || ('0' <= name[i] && name[i] <= '9') || (name[i] == '_')) { last_was_period = false; } else if (name[i] == '.') { if (last_was_period) return false; last_was_period = true; } else { return false; } } return !name.empty() && !last_was_period; } Symbol DescriptorPool::NewPlaceholder(const string& name, PlaceholderType placeholder_type) const { MutexLockMaybe lock(mutex_); return NewPlaceholderWithMutexHeld(name, placeholder_type); } Symbol DescriptorPool::NewPlaceholderWithMutexHeld( const string& name, PlaceholderType placeholder_type) const { if (mutex_) { mutex_->AssertHeld(); } // Compute names. const string* placeholder_full_name; const string* placeholder_name; const string* placeholder_package; if (!ValidateQualifiedName(name)) return kNullSymbol; if (name[0] == '.') { // Fully-qualified. placeholder_full_name = tables_->AllocateString(name.substr(1)); } else { placeholder_full_name = tables_->AllocateString(name); } string::size_type dotpos = placeholder_full_name->find_last_of('.'); if (dotpos != string::npos) { placeholder_package = tables_->AllocateString( placeholder_full_name->substr(0, dotpos)); placeholder_name = tables_->AllocateString( placeholder_full_name->substr(dotpos + 1)); } else { placeholder_package = &internal::GetEmptyString(); placeholder_name = placeholder_full_name; } // Create the placeholders. FileDescriptor* placeholder_file = NewPlaceholderFileWithMutexHeld( *placeholder_full_name + ".placeholder.proto"); placeholder_file->package_ = placeholder_package; if (placeholder_type == PLACEHOLDER_ENUM) { placeholder_file->enum_type_count_ = 1; placeholder_file->enum_types_ = tables_->AllocateArray(1); EnumDescriptor* placeholder_enum = &placeholder_file->enum_types_[0]; memset(placeholder_enum, 0, sizeof(*placeholder_enum)); placeholder_enum->full_name_ = placeholder_full_name; placeholder_enum->name_ = placeholder_name; placeholder_enum->file_ = placeholder_file; placeholder_enum->options_ = &EnumOptions::default_instance(); placeholder_enum->is_placeholder_ = true; placeholder_enum->is_unqualified_placeholder_ = (name[0] != '.'); // Enums must have at least one value. placeholder_enum->value_count_ = 1; placeholder_enum->values_ = tables_->AllocateArray(1); EnumValueDescriptor* placeholder_value = &placeholder_enum->values_[0]; memset(placeholder_value, 0, sizeof(*placeholder_value)); placeholder_value->name_ = tables_->AllocateString("PLACEHOLDER_VALUE"); // Note that enum value names are siblings of their type, not children. placeholder_value->full_name_ = placeholder_package->empty() ? placeholder_value->name_ : tables_->AllocateString(*placeholder_package + ".PLACEHOLDER_VALUE"); placeholder_value->number_ = 0; placeholder_value->type_ = placeholder_enum; placeholder_value->options_ = &EnumValueOptions::default_instance(); return Symbol(placeholder_enum); } else { placeholder_file->message_type_count_ = 1; placeholder_file->message_types_ = tables_->AllocateArray(1); Descriptor* placeholder_message = &placeholder_file->message_types_[0]; memset(placeholder_message, 0, sizeof(*placeholder_message)); placeholder_message->full_name_ = placeholder_full_name; placeholder_message->name_ = placeholder_name; placeholder_message->file_ = placeholder_file; placeholder_message->options_ = &MessageOptions::default_instance(); placeholder_message->is_placeholder_ = true; placeholder_message->is_unqualified_placeholder_ = (name[0] != '.'); if (placeholder_type == PLACEHOLDER_EXTENDABLE_MESSAGE) { placeholder_message->extension_range_count_ = 1; placeholder_message->extension_ranges_ = tables_->AllocateArray(1); placeholder_message->extension_ranges_->start = 1; // kMaxNumber + 1 because ExtensionRange::end is exclusive. placeholder_message->extension_ranges_->end = FieldDescriptor::kMaxNumber + 1; } return Symbol(placeholder_message); } } FileDescriptor* DescriptorPool::NewPlaceholderFile(const string& name) const { MutexLockMaybe lock(mutex_); return NewPlaceholderFileWithMutexHeld(name); } FileDescriptor* DescriptorPool::NewPlaceholderFileWithMutexHeld( const string& name) const { if (mutex_) { mutex_->AssertHeld(); } FileDescriptor* placeholder = tables_->Allocate(); memset(placeholder, 0, sizeof(*placeholder)); placeholder->name_ = tables_->AllocateString(name); placeholder->package_ = &internal::GetEmptyString(); placeholder->pool_ = this; placeholder->options_ = &FileOptions::default_instance(); placeholder->tables_ = &FileDescriptorTables::GetEmptyInstance(); placeholder->source_code_info_ = &SourceCodeInfo::default_instance(); placeholder->is_placeholder_ = true; placeholder->syntax_ = FileDescriptor::SYNTAX_PROTO2; placeholder->finished_building_ = true; // All other fields are zero or NULL. return placeholder; } bool DescriptorBuilder::AddSymbol( const string& full_name, const void* parent, const string& name, const Message& proto, Symbol symbol) { // If the caller passed NULL for the parent, the symbol is at file scope. // Use its file as the parent instead. if (parent == NULL) parent = file_; if (tables_->AddSymbol(full_name, symbol)) { if (!file_tables_->AddAliasUnderParent(parent, name, symbol)) { // This is only possible if there was already an error adding something of // the same name. if (!had_errors_) { GOOGLE_LOG(DFATAL) << "\"" << full_name << "\" not previously defined in " "symbols_by_name_, but was defined in " "symbols_by_parent_; this shouldn't be possible."; } return false; } return true; } else { const FileDescriptor* other_file = tables_->FindSymbol(full_name).GetFile(); if (other_file == file_) { string::size_type dot_pos = full_name.find_last_of('.'); if (dot_pos == string::npos) { AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, "\"" + full_name + "\" is already defined."); } else { AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, "\"" + full_name.substr(dot_pos + 1) + "\" is already defined in \"" + full_name.substr(0, dot_pos) + "\"."); } } else { // Symbol seems to have been defined in a different file. AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, "\"" + full_name + "\" is already defined in file \"" + other_file->name() + "\"."); } return false; } } void DescriptorBuilder::AddPackage( const string& name, const Message& proto, const FileDescriptor* file) { if (tables_->AddSymbol(name, Symbol(file))) { // Success. Also add parent package, if any. string::size_type dot_pos = name.find_last_of('.'); if (dot_pos == string::npos) { // No parents. ValidateSymbolName(name, name, proto); } else { // Has parent. string* parent_name = tables_->AllocateString(name.substr(0, dot_pos)); AddPackage(*parent_name, proto, file); ValidateSymbolName(name.substr(dot_pos + 1), name, proto); } } else { Symbol existing_symbol = tables_->FindSymbol(name); // It's OK to redefine a package. if (existing_symbol.type != Symbol::PACKAGE) { // Symbol seems to have been defined in a different file. AddError(name, proto, DescriptorPool::ErrorCollector::NAME, "\"" + name + "\" is already defined (as something other than " "a package) in file \"" + existing_symbol.GetFile()->name() + "\"."); } } } void DescriptorBuilder::ValidateSymbolName( const string& name, const string& full_name, const Message& proto) { if (name.empty()) { AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, "Missing name."); } else { for (int i = 0; i < name.size(); i++) { // I don't trust isalnum() due to locales. :( if ((name[i] < 'a' || 'z' < name[i]) && (name[i] < 'A' || 'Z' < name[i]) && (name[i] < '0' || '9' < name[i]) && (name[i] != '_')) { AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, "\"" + name + "\" is not a valid identifier."); } } } } // ------------------------------------------------------------------- // This generic implementation is good for all descriptors except // FileDescriptor. template void DescriptorBuilder::AllocateOptions( const typename DescriptorT::OptionsType& orig_options, DescriptorT* descriptor) { AllocateOptionsImpl(descriptor->full_name(), descriptor->full_name(), orig_options, descriptor); } // We specialize for FileDescriptor. void DescriptorBuilder::AllocateOptions(const FileOptions& orig_options, FileDescriptor* descriptor) { // We add the dummy token so that LookupSymbol does the right thing. AllocateOptionsImpl(descriptor->package() + ".dummy", descriptor->name(), orig_options, descriptor); } template void DescriptorBuilder::AllocateOptionsImpl( const string& name_scope, const string& element_name, const typename DescriptorT::OptionsType& orig_options, DescriptorT* descriptor) { // We need to use a dummy pointer to work around a bug in older versions of // GCC. Otherwise, the following two lines could be replaced with: // typename DescriptorT::OptionsType* options = // tables_->AllocateMessage(); typename DescriptorT::OptionsType* const dummy = NULL; typename DescriptorT::OptionsType* options = tables_->AllocateMessage(dummy); // Avoid using MergeFrom()/CopyFrom() in this class to make it -fno-rtti // friendly. Without RTTI, MergeFrom() and CopyFrom() will fallback to the // reflection based method, which requires the Descriptor. However, we are in // the middle of building the descriptors, thus the deadlock. options->ParseFromString(orig_options.SerializeAsString()); descriptor->options_ = options; // Don't add to options_to_interpret_ unless there were uninterpreted // options. This not only avoids unnecessary work, but prevents a // bootstrapping problem when building descriptors for descriptor.proto. // descriptor.proto does not contain any uninterpreted options, but // attempting to interpret options anyway will cause // OptionsType::GetDescriptor() to be called which may then deadlock since // we're still trying to build it. if (options->uninterpreted_option_size() > 0) { options_to_interpret_.push_back( OptionsToInterpret(name_scope, element_name, &orig_options, options)); } } // A common pattern: We want to convert a repeated field in the descriptor // to an array of values, calling some method to build each value. #define BUILD_ARRAY(INPUT, OUTPUT, NAME, METHOD, PARENT) \ OUTPUT->NAME##_count_ = INPUT.NAME##_size(); \ AllocateArray(INPUT.NAME##_size(), &OUTPUT->NAME##s_); \ for (int i = 0; i < INPUT.NAME##_size(); i++) { \ METHOD(INPUT.NAME(i), PARENT, OUTPUT->NAME##s_ + i); \ } void DescriptorBuilder::AddRecursiveImportError( const FileDescriptorProto& proto, int from_here) { string error_message("File recursively imports itself: "); for (int i = from_here; i < tables_->pending_files_.size(); i++) { error_message.append(tables_->pending_files_[i]); error_message.append(" -> "); } error_message.append(proto.name()); AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, error_message); } void DescriptorBuilder::AddTwiceListedError(const FileDescriptorProto& proto, int index) { AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, "Import \"" + proto.dependency(index) + "\" was listed twice."); } void DescriptorBuilder::AddImportError(const FileDescriptorProto& proto, int index) { string message; if (pool_->fallback_database_ == NULL) { message = "Import \"" + proto.dependency(index) + "\" has not been loaded."; } else { message = "Import \"" + proto.dependency(index) + "\" was not found or had errors."; } AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, message); } static bool ExistingFileMatchesProto(const FileDescriptor* existing_file, const FileDescriptorProto& proto) { FileDescriptorProto existing_proto; existing_file->CopyTo(&existing_proto); // TODO(liujisi): Remove it when CopyTo supports copying syntax params when // syntax="proto2". if (existing_file->syntax() == FileDescriptor::SYNTAX_PROTO2 && proto.has_syntax()) { existing_proto.set_syntax( existing_file->SyntaxName(existing_file->syntax())); } return existing_proto.SerializeAsString() == proto.SerializeAsString(); } const FileDescriptor* DescriptorBuilder::BuildFile( const FileDescriptorProto& proto) { filename_ = proto.name(); // Check if the file already exists and is identical to the one being built. // Note: This only works if the input is canonical -- that is, it // fully-qualifies all type names, has no UninterpretedOptions, etc. // This is fine, because this idempotency "feature" really only exists to // accommodate one hack in the proto1->proto2 migration layer. const FileDescriptor* existing_file = tables_->FindFile(filename_); if (existing_file != NULL) { // File already in pool. Compare the existing one to the input. if (ExistingFileMatchesProto(existing_file, proto)) { // They're identical. Return the existing descriptor. return existing_file; } // Not a match. The error will be detected and handled later. } // Check to see if this file is already on the pending files list. // TODO(kenton): Allow recursive imports? It may not work with some // (most?) programming languages. E.g., in C++, a forward declaration // of a type is not sufficient to allow it to be used even in a // generated header file due to inlining. This could perhaps be // worked around using tricks involving inserting #include statements // mid-file, but that's pretty ugly, and I'm pretty sure there are // some languages out there that do not allow recursive dependencies // at all. for (int i = 0; i < tables_->pending_files_.size(); i++) { if (tables_->pending_files_[i] == proto.name()) { AddRecursiveImportError(proto, i); return NULL; } } // If we have a fallback_database_, and we aren't doing lazy import building, // attempt to load all dependencies now, before checkpointing tables_. This // avoids confusion with recursive checkpoints. if (!pool_->lazily_build_dependencies_) { if (pool_->fallback_database_ != NULL) { tables_->pending_files_.push_back(proto.name()); for (int i = 0; i < proto.dependency_size(); i++) { if (tables_->FindFile(proto.dependency(i)) == NULL && (pool_->underlay_ == NULL || pool_->underlay_->FindFileByName(proto.dependency(i)) == NULL)) { // We don't care what this returns since we'll find out below anyway. pool_->TryFindFileInFallbackDatabase(proto.dependency(i)); } } tables_->pending_files_.pop_back(); } } // Checkpoint the tables so that we can roll back if something goes wrong. tables_->AddCheckpoint(); FileDescriptor* result = BuildFileImpl(proto); file_tables_->FinalizeTables(); if (result) { tables_->ClearLastCheckpoint(); result->finished_building_ = true; } else { tables_->RollbackToLastCheckpoint(); } return result; } FileDescriptor* DescriptorBuilder::BuildFileImpl( const FileDescriptorProto& proto) { FileDescriptor* result = tables_->Allocate(); file_ = result; result->is_placeholder_ = false; result->finished_building_ = false; if (proto.has_source_code_info()) { SourceCodeInfo *info = tables_->AllocateMessage(); info->CopyFrom(proto.source_code_info()); result->source_code_info_ = info; } else { result->source_code_info_ = &SourceCodeInfo::default_instance(); } file_tables_ = tables_->AllocateFileTables(); file_->tables_ = file_tables_; if (!proto.has_name()) { AddError("", proto, DescriptorPool::ErrorCollector::OTHER, "Missing field: FileDescriptorProto.name."); } // TODO(liujisi): Report error when the syntax is empty after all the protos // have added the syntax statement. if (proto.syntax().empty() || proto.syntax() == "proto2") { file_->syntax_ = FileDescriptor::SYNTAX_PROTO2; } else if (proto.syntax() == "proto3") { file_->syntax_ = FileDescriptor::SYNTAX_PROTO3; } else { file_->syntax_ = FileDescriptor::SYNTAX_UNKNOWN; AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, "Unrecognized syntax: " + proto.syntax()); } result->name_ = tables_->AllocateString(proto.name()); if (proto.has_package()) { result->package_ = tables_->AllocateString(proto.package()); } else { // We cannot rely on proto.package() returning a valid string if // proto.has_package() is false, because we might be running at static // initialization time, in which case default values have not yet been // initialized. result->package_ = tables_->AllocateString(""); } result->pool_ = pool_; // Add to tables. if (!tables_->AddFile(result)) { AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, "A file with this name is already in the pool."); // Bail out early so that if this is actually the exact same file, we // don't end up reporting that every single symbol is already defined. return NULL; } if (!result->package().empty()) { AddPackage(result->package(), proto, result); } // Make sure all dependencies are loaded. std::set seen_dependencies; result->dependency_count_ = proto.dependency_size(); result->dependencies_ = tables_->AllocateArray(proto.dependency_size()); if (pool_->lazily_build_dependencies_) { result->dependencies_once_ = tables_->AllocateOnceDynamic(); result->dependencies_names_ = tables_->AllocateArray(proto.dependency_size()); if (proto.dependency_size() > 0) { memset(result->dependencies_names_, 0, sizeof(*result->dependencies_names_) * proto.dependency_size()); } } else { result->dependencies_once_ = NULL; result->dependencies_names_ = NULL; } unused_dependency_.clear(); std::set weak_deps; for (int i = 0; i < proto.weak_dependency_size(); ++i) { weak_deps.insert(proto.weak_dependency(i)); } for (int i = 0; i < proto.dependency_size(); i++) { if (!seen_dependencies.insert(proto.dependency(i)).second) { AddTwiceListedError(proto, i); } const FileDescriptor* dependency = tables_->FindFile(proto.dependency(i)); if (dependency == NULL && pool_->underlay_ != NULL) { dependency = pool_->underlay_->FindFileByName(proto.dependency(i)); } if (dependency == result) { // Recursive import. dependency/result is not fully initialized, and it's // dangerous to try to do anything with it. The recursive import error // will be detected and reported in DescriptorBuilder::BuildFile(). return NULL; } if (dependency == NULL) { if (!pool_->lazily_build_dependencies_) { if (pool_->allow_unknown_ || (!pool_->enforce_weak_ && weak_deps.find(i) != weak_deps.end())) { dependency = pool_->NewPlaceholderFileWithMutexHeld(proto.dependency(i)); } else { AddImportError(proto, i); } } } else { // Add to unused_dependency_ to track unused imported files. // Note: do not track unused imported files for public import. if (pool_->enforce_dependencies_ && (pool_->unused_import_track_files_.find(proto.name()) != pool_->unused_import_track_files_.end()) && (dependency->public_dependency_count() == 0)) { unused_dependency_.insert(dependency); } } result->dependencies_[i] = dependency; if (pool_->lazily_build_dependencies_ && !dependency) { result->dependencies_names_[i] = tables_->AllocateString(proto.dependency(i)); } } // Check public dependencies. int public_dependency_count = 0; result->public_dependencies_ = tables_->AllocateArray( proto.public_dependency_size()); for (int i = 0; i < proto.public_dependency_size(); i++) { // Only put valid public dependency indexes. int index = proto.public_dependency(i); if (index >= 0 && index < proto.dependency_size()) { result->public_dependencies_[public_dependency_count++] = index; // Do not track unused imported files for public import. // Calling dependency(i) builds that file when doing lazy imports, // need to avoid doing this. Unused dependency detection isn't done // when building lazily, anyways. if (!pool_->lazily_build_dependencies_) { unused_dependency_.erase(result->dependency(index)); } } else { AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, "Invalid public dependency index."); } } result->public_dependency_count_ = public_dependency_count; // Build dependency set dependencies_.clear(); // We don't/can't do proper dependency error checking when // lazily_build_dependencies_, and calling dependency(i) will force // a dependency to be built, which we don't want. if (!pool_->lazily_build_dependencies_) { for (int i = 0; i < result->dependency_count(); i++) { RecordPublicDependencies(result->dependency(i)); } } // Check weak dependencies. int weak_dependency_count = 0; result->weak_dependencies_ = tables_->AllocateArray( proto.weak_dependency_size()); for (int i = 0; i < proto.weak_dependency_size(); i++) { int index = proto.weak_dependency(i); if (index >= 0 && index < proto.dependency_size()) { result->weak_dependencies_[weak_dependency_count++] = index; } else { AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, "Invalid weak dependency index."); } } result->weak_dependency_count_ = weak_dependency_count; // Convert children. BUILD_ARRAY(proto, result, message_type, BuildMessage , NULL); BUILD_ARRAY(proto, result, enum_type , BuildEnum , NULL); BUILD_ARRAY(proto, result, service , BuildService , NULL); BUILD_ARRAY(proto, result, extension , BuildExtension, NULL); // Copy options. if (!proto.has_options()) { result->options_ = NULL; // Will set to default_instance later. } else { AllocateOptions(proto.options(), result); } // Note that the following steps must occur in exactly the specified order. // Cross-link. CrossLinkFile(result, proto); // Interpret any remaining uninterpreted options gathered into // options_to_interpret_ during descriptor building. Cross-linking has made // extension options known, so all interpretations should now succeed. if (!had_errors_) { OptionInterpreter option_interpreter(this); for (std::vector::iterator iter = options_to_interpret_.begin(); iter != options_to_interpret_.end(); ++iter) { option_interpreter.InterpretOptions(&(*iter)); } options_to_interpret_.clear(); } // Validate options. See comments at InternalSetLazilyBuildDependencies about // error checking and lazy import building. if (!had_errors_ && !pool_->lazily_build_dependencies_) { ValidateFileOptions(result, proto); } // Additional naming conflict check for map entry types. Only need to check // this if there are already errors. if (had_errors_) { for (int i = 0; i < proto.message_type_size(); ++i) { DetectMapConflicts(result->message_type(i), proto.message_type(i)); } } // Again, see comments at InternalSetLazilyBuildDependencies about error // checking. if (!unused_dependency_.empty() && !pool_->lazily_build_dependencies_) { LogUnusedDependency(proto, result); } if (had_errors_) { return NULL; } else { return result; } } void DescriptorBuilder::BuildMessage(const DescriptorProto& proto, const Descriptor* parent, Descriptor* result) { const string& scope = (parent == NULL) ? file_->package() : parent->full_name(); string* full_name = tables_->AllocateString(scope); if (!full_name->empty()) full_name->append(1, '.'); full_name->append(proto.name()); ValidateSymbolName(proto.name(), *full_name, proto); result->name_ = tables_->AllocateString(proto.name()); result->full_name_ = full_name; result->file_ = file_; result->containing_type_ = parent; result->is_placeholder_ = false; result->is_unqualified_placeholder_ = false; // Build oneofs first so that fields and extension ranges can refer to them. BUILD_ARRAY(proto, result, oneof_decl , BuildOneof , result); BUILD_ARRAY(proto, result, field , BuildField , result); BUILD_ARRAY(proto, result, nested_type , BuildMessage , result); BUILD_ARRAY(proto, result, enum_type , BuildEnum , result); BUILD_ARRAY(proto, result, extension_range, BuildExtensionRange, result); BUILD_ARRAY(proto, result, extension , BuildExtension , result); BUILD_ARRAY(proto, result, reserved_range , BuildReservedRange , result); // Copy reserved names. int reserved_name_count = proto.reserved_name_size(); result->reserved_name_count_ = reserved_name_count; result->reserved_names_ = tables_->AllocateArray(reserved_name_count); for (int i = 0; i < reserved_name_count; ++i) { result->reserved_names_[i] = tables_->AllocateString(proto.reserved_name(i)); } // Copy options. if (!proto.has_options()) { result->options_ = NULL; // Will set to default_instance later. } else { AllocateOptions(proto.options(), result); } AddSymbol(result->full_name(), parent, result->name(), proto, Symbol(result)); for (int i = 0; i < proto.reserved_range_size(); i++) { const DescriptorProto_ReservedRange& range1 = proto.reserved_range(i); for (int j = i + 1; j < proto.reserved_range_size(); j++) { const DescriptorProto_ReservedRange& range2 = proto.reserved_range(j); 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 " "already-defined range $2 to $3.", range2.start(), range2.end() - 1, range1.start(), range1.end() - 1)); } } } hash_set reserved_name_set; for (int i = 0; i < proto.reserved_name_size(); i++) { const 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( "Field name \"$0\" is reserved multiple times.", name)); } } for (int i = 0; i < result->field_count(); i++) { const FieldDescriptor* field = result->field(i); for (int j = 0; j < result->extension_range_count(); j++) { const Descriptor::ExtensionRange* range = result->extension_range(j); if (range->start <= field->number() && field->number() < range->end) { AddError(field->full_name(), proto.extension_range(j), DescriptorPool::ErrorCollector::NUMBER, strings::Substitute( "Extension range $0 to $1 includes field \"$2\" ($3).", range->start, range->end - 1, field->name(), field->number())); } } for (int j = 0; j < result->reserved_range_count(); j++) { const Descriptor::ReservedRange* range = result->reserved_range(j); if (range->start <= field->number() && field->number() < range->end) { AddError(field->full_name(), proto.reserved_range(j), DescriptorPool::ErrorCollector::NUMBER, strings::Substitute( "Field \"$0\" uses reserved number $1.", field->name(), field->number())); } } if (reserved_name_set.find(field->name()) != reserved_name_set.end()) { AddError(field->full_name(), proto.field(i), DescriptorPool::ErrorCollector::NAME, strings::Substitute( "Field name \"$0\" is reserved.", field->name())); } } // Check that extension ranges don't overlap and don't include // reserved field numbers. for (int i = 0; i < result->extension_range_count(); i++) { const Descriptor::ExtensionRange* range1 = result->extension_range(i); for (int j = 0; j < result->reserved_range_count(); j++) { const Descriptor::ReservedRange* range2 = result->reserved_range(j); 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 " "reserved range $2 to $3.", range1->start, range1->end - 1, range2->start, range2->end - 1)); } } for (int j = i + 1; j < result->extension_range_count(); j++) { const Descriptor::ExtensionRange* range2 = result->extension_range(j); 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 " "already-defined range $2 to $3.", range2->start, range2->end - 1, range1->start, range1->end - 1)); } } } } void DescriptorBuilder::BuildFieldOrExtension(const FieldDescriptorProto& proto, const Descriptor* parent, FieldDescriptor* result, bool is_extension) { const string& scope = (parent == NULL) ? file_->package() : parent->full_name(); string* full_name = tables_->AllocateString(scope); if (!full_name->empty()) full_name->append(1, '.'); full_name->append(proto.name()); ValidateSymbolName(proto.name(), *full_name, proto); result->name_ = tables_->AllocateString(proto.name()); result->full_name_ = full_name; result->file_ = file_; result->number_ = proto.number(); result->is_extension_ = is_extension; // If .proto files follow the style guide then the name should already be // lower-cased. If that's the case we can just reuse the string we already // allocated rather than allocate a new one. string lowercase_name(proto.name()); LowerString(&lowercase_name); if (lowercase_name == proto.name()) { result->lowercase_name_ = result->name_; } else { result->lowercase_name_ = tables_->AllocateString(lowercase_name); } // Don't bother with the above optimization for camel-case names since // .proto files that follow the guide shouldn't be using names in this // format, so the optimization wouldn't help much. result->camelcase_name_ = tables_->AllocateString(ToCamelCase(proto.name(), /* lower_first = */ true)); if (proto.has_json_name()) { result->has_json_name_ = true; result->json_name_ = tables_->AllocateString(proto.json_name()); } else { result->has_json_name_ = false; result->json_name_ = tables_->AllocateString(ToJsonName(proto.name())); } // Some compilers do not allow static_cast directly between two enum types, // so we must cast to int first. result->type_ = static_cast( implicit_cast(proto.type())); result->label_ = static_cast( implicit_cast(proto.label())); // An extension cannot have a required field (b/13365836). if (result->is_extension_ && result->label_ == FieldDescriptor::LABEL_REQUIRED) { AddError(result->full_name(), proto, // Error location `TYPE`: we would really like to indicate // `LABEL`, but the `ErrorLocation` enum has no entry for this, and // we don't necessarily know about all implementations of the // `ErrorCollector` interface to extend them to handle the new // error location type properly. DescriptorPool::ErrorCollector::TYPE, "Message extensions cannot have required fields."); } // Some of these may be filled in when cross-linking. result->containing_type_ = NULL; result->extension_scope_ = NULL; result->message_type_ = NULL; result->enum_type_ = NULL; result->type_name_ = NULL; result->type_once_ = NULL; result->default_value_enum_ = NULL; result->default_value_enum_name_ = NULL; result->has_default_value_ = proto.has_default_value(); if (proto.has_default_value() && result->is_repeated()) { AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::DEFAULT_VALUE, "Repeated fields can't have default values."); } if (proto.has_type()) { if (proto.has_default_value()) { char* end_pos = NULL; switch (result->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: result->default_value_int32_ = strtol(proto.default_value().c_str(), &end_pos, 0); break; case FieldDescriptor::CPPTYPE_INT64: result->default_value_int64_ = strto64(proto.default_value().c_str(), &end_pos, 0); break; case FieldDescriptor::CPPTYPE_UINT32: result->default_value_uint32_ = strtoul(proto.default_value().c_str(), &end_pos, 0); break; case FieldDescriptor::CPPTYPE_UINT64: result->default_value_uint64_ = strtou64(proto.default_value().c_str(), &end_pos, 0); break; case FieldDescriptor::CPPTYPE_FLOAT: if (proto.default_value() == "inf") { result->default_value_float_ = std::numeric_limits::infinity(); } else if (proto.default_value() == "-inf") { result->default_value_float_ = -std::numeric_limits::infinity(); } else if (proto.default_value() == "nan") { result->default_value_float_ = std::numeric_limits::quiet_NaN(); } else { result->default_value_float_ = io::SafeDoubleToFloat( io::NoLocaleStrtod(proto.default_value().c_str(), &end_pos)); } break; case FieldDescriptor::CPPTYPE_DOUBLE: if (proto.default_value() == "inf") { result->default_value_double_ = std::numeric_limits::infinity(); } else if (proto.default_value() == "-inf") { result->default_value_double_ = -std::numeric_limits::infinity(); } else if (proto.default_value() == "nan") { result->default_value_double_ = std::numeric_limits::quiet_NaN(); } else { result->default_value_double_ = io::NoLocaleStrtod(proto.default_value().c_str(), &end_pos); } break; case FieldDescriptor::CPPTYPE_BOOL: if (proto.default_value() == "true") { result->default_value_bool_ = true; } else if (proto.default_value() == "false") { result->default_value_bool_ = false; } else { AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::DEFAULT_VALUE, "Boolean default must be true or false."); } break; case FieldDescriptor::CPPTYPE_ENUM: // This will be filled in when cross-linking. result->default_value_enum_ = NULL; break; case FieldDescriptor::CPPTYPE_STRING: if (result->type() == FieldDescriptor::TYPE_BYTES) { result->default_value_string_ = tables_->AllocateString( UnescapeCEscapeString(proto.default_value())); } else { result->default_value_string_ = tables_->AllocateString(proto.default_value()); } break; case FieldDescriptor::CPPTYPE_MESSAGE: AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::DEFAULT_VALUE, "Messages can't have default values."); result->has_default_value_ = false; break; } if (end_pos != NULL) { // end_pos is only set non-NULL by the parsers for numeric types, above. // This checks that the default was non-empty and had no extra junk // after the end of the number. if (proto.default_value().empty() || *end_pos != '\0') { AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::DEFAULT_VALUE, "Couldn't parse default value \"" + proto.default_value() + "\"."); } } } else { // No explicit default value switch (result->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: result->default_value_int32_ = 0; break; case FieldDescriptor::CPPTYPE_INT64: result->default_value_int64_ = 0; break; case FieldDescriptor::CPPTYPE_UINT32: result->default_value_uint32_ = 0; break; case FieldDescriptor::CPPTYPE_UINT64: result->default_value_uint64_ = 0; break; case FieldDescriptor::CPPTYPE_FLOAT: result->default_value_float_ = 0.0f; break; case FieldDescriptor::CPPTYPE_DOUBLE: result->default_value_double_ = 0.0; break; case FieldDescriptor::CPPTYPE_BOOL: result->default_value_bool_ = false; break; case FieldDescriptor::CPPTYPE_ENUM: // This will be filled in when cross-linking. result->default_value_enum_ = NULL; break; case FieldDescriptor::CPPTYPE_STRING: result->default_value_string_ = &internal::GetEmptyString(); break; case FieldDescriptor::CPPTYPE_MESSAGE: break; } } } if (result->number() <= 0) { AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, "Field numbers must be positive integers."); } else if (!is_extension && result->number() > FieldDescriptor::kMaxNumber) { // Only validate that the number is within the valid field range if it is // not an extension. Since extension numbers are validated with the // extendee's valid set of extension numbers, and those are in turn // validated against the max allowed number, the check is unnecessary for // extension fields. // This avoids cross-linking issues that arise when attempting to check if // the extendee is a message_set_wire_format message, which has a higher max // on extension numbers. AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, strings::Substitute("Field numbers cannot be greater than $0.", FieldDescriptor::kMaxNumber)); } else if (result->number() >= FieldDescriptor::kFirstReservedNumber && result->number() <= FieldDescriptor::kLastReservedNumber) { AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, strings::Substitute( "Field numbers $0 through $1 are reserved for the protocol " "buffer library implementation.", FieldDescriptor::kFirstReservedNumber, FieldDescriptor::kLastReservedNumber)); } if (is_extension) { if (!proto.has_extendee()) { AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::EXTENDEE, "FieldDescriptorProto.extendee not set for extension field."); } result->extension_scope_ = parent; if (proto.has_oneof_index()) { AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::OTHER, "FieldDescriptorProto.oneof_index should not be set for " "extensions."); } // Fill in later (maybe). result->containing_oneof_ = NULL; } else { if (proto.has_extendee()) { AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::EXTENDEE, "FieldDescriptorProto.extendee set for non-extension field."); } result->containing_type_ = parent; if (proto.has_oneof_index()) { if (proto.oneof_index() < 0 || proto.oneof_index() >= parent->oneof_decl_count()) { AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::OTHER, strings::Substitute("FieldDescriptorProto.oneof_index $0 is " "out of range for type \"$1\".", proto.oneof_index(), parent->name())); result->containing_oneof_ = NULL; } else { result->containing_oneof_ = parent->oneof_decl(proto.oneof_index()); } } else { result->containing_oneof_ = NULL; } } // Copy options. if (!proto.has_options()) { result->options_ = NULL; // Will set to default_instance later. } else { AllocateOptions(proto.options(), result); } AddSymbol(result->full_name(), parent, result->name(), proto, Symbol(result)); } void DescriptorBuilder::BuildExtensionRange( const DescriptorProto::ExtensionRange& proto, const Descriptor* parent, Descriptor::ExtensionRange* result) { result->start = proto.start(); result->end = proto.end(); if (result->start <= 0) { AddError(parent->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, "Extension numbers must be positive integers."); } // Checking of the upper bound of the extension range is deferred until after // options interpreting. This allows messages with message_set_wire_format to // have extensions beyond FieldDescriptor::kMaxNumber, since the extension // numbers are actually used as int32s in the message_set_wire_format. if (result->start >= result->end) { AddError(parent->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, "Extension range end number must be greater than start number."); } if (!proto.has_options()) { result->options_ = NULL; // Will set to default_instance later. } else { AllocateOptionsImpl(parent->full_name(), parent->full_name(), proto.options(), result); } } void DescriptorBuilder::BuildReservedRange( const DescriptorProto::ReservedRange& proto, const Descriptor* parent, Descriptor::ReservedRange* result) { result->start = proto.start(); result->end = proto.end(); if (result->start <= 0) { AddError(parent->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, "Reserved numbers must be positive integers."); } } void DescriptorBuilder::BuildReservedRange( const EnumDescriptorProto::EnumReservedRange& proto, const EnumDescriptor* parent, EnumDescriptor::ReservedRange* result) { result->start = proto.start(); result->end = proto.end(); if (result->start > result->end) { AddError(parent->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, "Reserved range end number must be greater than start number."); } } void DescriptorBuilder::BuildOneof(const OneofDescriptorProto& proto, Descriptor* parent, OneofDescriptor* result) { string* full_name = tables_->AllocateString(parent->full_name()); full_name->append(1, '.'); full_name->append(proto.name()); ValidateSymbolName(proto.name(), *full_name, proto); result->name_ = tables_->AllocateString(proto.name()); result->full_name_ = full_name; result->containing_type_ = parent; // We need to fill these in later. result->field_count_ = 0; result->fields_ = NULL; // Copy options. if (!proto.has_options()) { result->options_ = NULL; // Will set to default_instance later. } else { AllocateOptions(proto.options(), result); } AddSymbol(result->full_name(), parent, result->name(), proto, Symbol(result)); } void DescriptorBuilder::CheckEnumValueUniqueness( const EnumDescriptorProto& proto, const EnumDescriptor* result) { // Check that enum labels are still unique when we remove the enum prefix from // values that have it. // // This will fail for something like: // // enum MyEnum { // MY_ENUM_FOO = 0; // FOO = 1; // } // // By enforcing this reasonable constraint, we allow code generators to strip // the prefix and/or PascalCase it without creating conflicts. This can lead // to much nicer language-specific enums like: // // enum NameType { // FirstName = 1, // LastName = 2, // } // // Instead of: // // enum NameType { // NAME_TYPE_FIRST_NAME = 1, // NAME_TYPE_LAST_NAME = 2, // } PrefixRemover remover(result->name()); std::map values; for (int i = 0; i < result->value_count(); i++) { const google::protobuf::EnumValueDescriptor* value = result->value(i); string stripped = EnumValueToPascalCase(remover.MaybeRemove(value->name())); std::pair::iterator, bool> insert_result = values.insert(std::make_pair(stripped, value)); bool inserted = insert_result.second; // We don't throw the error if the two conflicting symbols are identical, or // if they map to the same number. In the former case, the normal symbol // duplication error will fire so we don't need to (and its error message // will make more sense). We allow the latter case so users can create // aliases which add or remove the prefix (code generators that do prefix // stripping should de-dup the labels in this case). if (!inserted && insert_result.first->second->name() != value->name() && insert_result.first->second->number() != value->number()) { string error_message = "When enum name is stripped and label is PascalCased (" + stripped + "), this value label conflicts with " + values[stripped]->name() + ". This will make the proto fail to compile for some languages, such " "as C#."; // There are proto2 enums out there with conflicting names, so to preserve // compatibility we issue only a warning for proto2. if (result->file()->syntax() == FileDescriptor::SYNTAX_PROTO2) { AddWarning(value->full_name(), proto.value(i), DescriptorPool::ErrorCollector::NAME, error_message); } else { AddError(value->full_name(), proto.value(i), DescriptorPool::ErrorCollector::NAME, error_message); } } } } void DescriptorBuilder::BuildEnum(const EnumDescriptorProto& proto, const Descriptor* parent, EnumDescriptor* result) { const string& scope = (parent == NULL) ? file_->package() : parent->full_name(); string* full_name = tables_->AllocateString(scope); if (!full_name->empty()) full_name->append(1, '.'); full_name->append(proto.name()); ValidateSymbolName(proto.name(), *full_name, proto); result->name_ = tables_->AllocateString(proto.name()); result->full_name_ = full_name; result->file_ = file_; result->containing_type_ = parent; result->is_placeholder_ = false; result->is_unqualified_placeholder_ = false; if (proto.value_size() == 0) { // We cannot allow enums with no values because this would mean there // would be no valid default value for fields of this type. AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NAME, "Enums must contain at least one value."); } BUILD_ARRAY(proto, result, value, BuildEnumValue, result); BUILD_ARRAY(proto, result, reserved_range, BuildReservedRange, result); // Copy reserved names. int reserved_name_count = proto.reserved_name_size(); result->reserved_name_count_ = reserved_name_count; result->reserved_names_ = tables_->AllocateArray(reserved_name_count); for (int i = 0; i < reserved_name_count; ++i) { result->reserved_names_[i] = tables_->AllocateString(proto.reserved_name(i)); } CheckEnumValueUniqueness(proto, result); // Copy options. if (!proto.has_options()) { result->options_ = NULL; // Will set to default_instance later. } else { AllocateOptions(proto.options(), result); } AddSymbol(result->full_name(), parent, result->name(), proto, Symbol(result)); for (int i = 0; i < proto.reserved_range_size(); i++) { const EnumDescriptorProto_EnumReservedRange& range1 = proto.reserved_range(i); for (int j = i + 1; j < proto.reserved_range_size(); j++) { const EnumDescriptorProto_EnumReservedRange& range2 = proto.reserved_range(j); 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 " "already-defined range $2 to $3.", range2.start(), range2.end() - 1, range1.start(), range1.end() - 1)); } } } hash_set reserved_name_set; for (int i = 0; i < proto.reserved_name_size(); i++) { const 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.", name)); } } for (int i = 0; i < result->value_count(); i++) { const EnumValueDescriptor* value = result->value(i); for (int j = 0; j < result->reserved_range_count(); j++) { const EnumDescriptor::ReservedRange* range = result->reserved_range(j); 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.", value->name(), value->number())); } } if (reserved_name_set.find(value->name()) != reserved_name_set.end()) { AddError(value->full_name(), proto.value(i), DescriptorPool::ErrorCollector::NAME, strings::Substitute( "Enum value \"$0\" is reserved.", value->name())); } } } void DescriptorBuilder::BuildEnumValue(const EnumValueDescriptorProto& proto, const EnumDescriptor* parent, EnumValueDescriptor* result) { result->name_ = tables_->AllocateString(proto.name()); result->number_ = proto.number(); result->type_ = parent; // Note: full_name for enum values is a sibling to the parent's name, not a // child of it. string* full_name = tables_->AllocateString(*parent->full_name_); full_name->resize(full_name->size() - parent->name_->size()); full_name->append(*result->name_); result->full_name_ = full_name; ValidateSymbolName(proto.name(), *full_name, proto); // Copy options. if (!proto.has_options()) { result->options_ = NULL; // Will set to default_instance later. } else { AllocateOptions(proto.options(), result); } // Again, enum values are weird because we makes them appear as siblings // of the enum type instead of children of it. So, we use // parent->containing_type() as the value's parent. bool added_to_outer_scope = AddSymbol(result->full_name(), parent->containing_type(), result->name(), proto, Symbol(result)); // However, we also want to be able to search for values within a single // enum type, so we add it as a child of the enum type itself, too. // Note: This could fail, but if it does, the error has already been // reported by the above AddSymbol() call, so we ignore the return code. bool added_to_inner_scope = file_tables_->AddAliasUnderParent(parent, result->name(), Symbol(result)); if (added_to_inner_scope && !added_to_outer_scope) { // This value did not conflict with any values defined in the same enum, // but it did conflict with some other symbol defined in the enum type's // scope. Let's print an additional error to explain this. string outer_scope; if (parent->containing_type() == NULL) { outer_scope = file_->package(); } else { outer_scope = parent->containing_type()->full_name(); } if (outer_scope.empty()) { outer_scope = "the global scope"; } else { outer_scope = "\"" + outer_scope + "\""; } AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NAME, "Note that enum values use C++ scoping rules, meaning that " "enum values are siblings of their type, not children of it. " "Therefore, \"" + result->name() + "\" must be unique within " + outer_scope + ", not just within \"" + parent->name() + "\"."); } // An enum is allowed to define two numbers that refer to the same value. // FindValueByNumber() should return the first such value, so we simply // ignore AddEnumValueByNumber()'s return code. file_tables_->AddEnumValueByNumber(result); } void DescriptorBuilder::BuildService(const ServiceDescriptorProto& proto, const void* /* dummy */, ServiceDescriptor* result) { string* full_name = tables_->AllocateString(file_->package()); if (!full_name->empty()) full_name->append(1, '.'); full_name->append(proto.name()); ValidateSymbolName(proto.name(), *full_name, proto); result->name_ = tables_->AllocateString(proto.name()); result->full_name_ = full_name; result->file_ = file_; BUILD_ARRAY(proto, result, method, BuildMethod, result); // Copy options. if (!proto.has_options()) { result->options_ = NULL; // Will set to default_instance later. } else { AllocateOptions(proto.options(), result); } AddSymbol(result->full_name(), NULL, result->name(), proto, Symbol(result)); } void DescriptorBuilder::BuildMethod(const MethodDescriptorProto& proto, const ServiceDescriptor* parent, MethodDescriptor* result) { result->name_ = tables_->AllocateString(proto.name()); result->service_ = parent; string* full_name = tables_->AllocateString(parent->full_name()); full_name->append(1, '.'); full_name->append(*result->name_); result->full_name_ = full_name; ValidateSymbolName(proto.name(), *full_name, proto); // These will be filled in when cross-linking. result->input_type_.Init(); result->output_type_.Init(); // Copy options. if (!proto.has_options()) { result->options_ = NULL; // Will set to default_instance later. } else { AllocateOptions(proto.options(), result); } result->client_streaming_ = proto.client_streaming(); result->server_streaming_ = proto.server_streaming(); AddSymbol(result->full_name(), parent, result->name(), proto, Symbol(result)); } #undef BUILD_ARRAY // ------------------------------------------------------------------- void DescriptorBuilder::CrossLinkFile( FileDescriptor* file, const FileDescriptorProto& proto) { if (file->options_ == NULL) { file->options_ = &FileOptions::default_instance(); } for (int i = 0; i < file->message_type_count(); i++) { CrossLinkMessage(&file->message_types_[i], proto.message_type(i)); } for (int i = 0; i < file->extension_count(); i++) { CrossLinkField(&file->extensions_[i], proto.extension(i)); } for (int i = 0; i < file->enum_type_count(); i++) { CrossLinkEnum(&file->enum_types_[i], proto.enum_type(i)); } for (int i = 0; i < file->service_count(); i++) { CrossLinkService(&file->services_[i], proto.service(i)); } } void DescriptorBuilder::CrossLinkMessage( Descriptor* message, const DescriptorProto& proto) { if (message->options_ == NULL) { message->options_ = &MessageOptions::default_instance(); } for (int i = 0; i < message->nested_type_count(); i++) { CrossLinkMessage(&message->nested_types_[i], proto.nested_type(i)); } for (int i = 0; i < message->enum_type_count(); i++) { CrossLinkEnum(&message->enum_types_[i], proto.enum_type(i)); } for (int i = 0; i < message->field_count(); i++) { CrossLinkField(&message->fields_[i], proto.field(i)); } for (int i = 0; i < message->extension_count(); i++) { CrossLinkField(&message->extensions_[i], proto.extension(i)); } for (int i = 0; i < message->extension_range_count(); i++) { CrossLinkExtensionRange(&message->extension_ranges_[i], proto.extension_range(i)); } // Set up field array for each oneof. // First count the number of fields per oneof. for (int i = 0; i < message->field_count(); i++) { const OneofDescriptor* oneof_decl = message->field(i)->containing_oneof(); if (oneof_decl != NULL) { // Make sure fields belonging to the same oneof are defined consecutively. // This enables optimizations in codegens and reflection libraries to // skip fields in the oneof group, as only one of the field can be set. // Note that field_count() returns how many fields in this oneof we have // seen so far. field_count() > 0 guarantees that i > 0, so field(i-1) is // safe. if (oneof_decl->field_count() > 0 && message->field(i - 1)->containing_oneof() != oneof_decl) { AddError( message->full_name() + "." + message->field(i - 1)->name(), proto.field(i - 1), DescriptorPool::ErrorCollector::OTHER, strings::Substitute( "Fields in the same oneof must be defined consecutively. " "\"$0\" cannot be defined before the completion of the " "\"$1\" oneof definition.", message->field(i - 1)->name(), oneof_decl->name())); } // Must go through oneof_decls_ array to get a non-const version of the // OneofDescriptor. ++message->oneof_decls_[oneof_decl->index()].field_count_; } } // Then allocate the arrays. for (int i = 0; i < message->oneof_decl_count(); i++) { OneofDescriptor* oneof_decl = &message->oneof_decls_[i]; if (oneof_decl->field_count() == 0) { AddError(message->full_name() + "." + oneof_decl->name(), proto.oneof_decl(i), DescriptorPool::ErrorCollector::NAME, "Oneof must have at least one field."); } oneof_decl->fields_ = tables_->AllocateArray(oneof_decl->field_count_); oneof_decl->field_count_ = 0; if (oneof_decl->options_ == NULL) { oneof_decl->options_ = &OneofOptions::default_instance(); } } // Then fill them in. for (int i = 0; i < message->field_count(); i++) { const OneofDescriptor* oneof_decl = message->field(i)->containing_oneof(); if (oneof_decl != NULL) { OneofDescriptor* mutable_oneof_decl = &message->oneof_decls_[oneof_decl->index()]; message->fields_[i].index_in_oneof_ = mutable_oneof_decl->field_count_; mutable_oneof_decl->fields_[mutable_oneof_decl->field_count_++] = message->field(i); } } } void DescriptorBuilder::CrossLinkExtensionRange( Descriptor::ExtensionRange* range, const DescriptorProto::ExtensionRange& proto) { if (range->options_ == NULL) { range->options_ = &ExtensionRangeOptions::default_instance(); } } void DescriptorBuilder::CrossLinkField( FieldDescriptor* field, const FieldDescriptorProto& proto) { if (field->options_ == NULL) { field->options_ = &FieldOptions::default_instance(); } // Add the field to the lowercase-name and camelcase-name tables. file_tables_->AddFieldByStylizedNames(field); if (proto.has_extendee()) { Symbol extendee = LookupSymbol(proto.extendee(), field->full_name(), DescriptorPool::PLACEHOLDER_EXTENDABLE_MESSAGE); if (extendee.IsNull()) { AddNotDefinedError(field->full_name(), proto, DescriptorPool::ErrorCollector::EXTENDEE, proto.extendee()); return; } else if (extendee.type != Symbol::MESSAGE) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::EXTENDEE, "\"" + proto.extendee() + "\" is not a message type."); return; } field->containing_type_ = extendee.descriptor; const Descriptor::ExtensionRange* extension_range = field->containing_type() ->FindExtensionRangeContainingNumber(field->number()); if (extension_range == NULL) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, strings::Substitute("\"$0\" does not declare $1 as an " "extension number.", field->containing_type()->full_name(), field->number())); } } if (field->containing_oneof() != NULL) { if (field->label() != FieldDescriptor::LABEL_OPTIONAL) { // Note that this error will never happen when parsing .proto files. // It can only happen if you manually construct a FileDescriptorProto // that is incorrect. AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::NAME, "Fields of oneofs must themselves have label LABEL_OPTIONAL."); } } if (proto.has_type_name()) { // Assume we are expecting a message type unless the proto contains some // evidence that it expects an enum type. This only makes a difference if // we end up creating a placeholder. bool expecting_enum = (proto.type() == FieldDescriptorProto::TYPE_ENUM) || proto.has_default_value(); // In case of weak fields we force building the dependency. We need to know // if the type exist or not. If it doesnt exist we substitute Empty which // should only be done if the type can't be found in the generated pool. // TODO(gerbens) Ideally we should query the database directly to check // if weak fields exist or not so that we don't need to force building // weak dependencies. However the name lookup rules for symbols are // somewhat complicated, so I defer it too another CL. bool is_weak = !pool_->enforce_weak_ && proto.options().weak(); bool is_lazy = pool_->lazily_build_dependencies_ && !is_weak; Symbol type = LookupSymbol(proto.type_name(), field->full_name(), expecting_enum ? DescriptorPool::PLACEHOLDER_ENUM : DescriptorPool::PLACEHOLDER_MESSAGE, LOOKUP_TYPES, !is_lazy); if (type.IsNull()) { if (is_lazy) { // Save the symbol names for later for lookup, and allocate the once // object needed for the accessors. string name = proto.type_name(); field->type_once_ = tables_->AllocateOnceDynamic(); field->type_name_ = tables_->AllocateString(name); if (proto.has_default_value()) { field->default_value_enum_name_ = tables_->AllocateString(proto.default_value()); } // AddFieldByNumber and AddExtension are done later in this function, // and can/must be done if the field type was not found. The related // error checking is not necessary when in lazily_build_dependencies_ // mode, and can't be done without building the type's descriptor, // which we don't want to do. file_tables_->AddFieldByNumber(field); if (field->is_extension()) { tables_->AddExtension(field); } return; } else { // If the type is a weak type, we change the type to a google.protobuf.Empty // field. if (is_weak) { type = FindSymbol(kNonLinkedWeakMessageReplacementName); } if (type.IsNull()) { AddNotDefinedError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, proto.type_name()); return; } } } if (!proto.has_type()) { // Choose field type based on symbol. if (type.type == Symbol::MESSAGE) { field->type_ = FieldDescriptor::TYPE_MESSAGE; } else if (type.type == Symbol::ENUM) { field->type_ = FieldDescriptor::TYPE_ENUM; } else { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "\"" + proto.type_name() + "\" is not a type."); return; } } if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { if (type.type != Symbol::MESSAGE) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "\"" + proto.type_name() + "\" is not a message type."); return; } field->message_type_ = type.descriptor; if (field->has_default_value()) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::DEFAULT_VALUE, "Messages can't have default values."); } } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { if (type.type != Symbol::ENUM) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "\"" + proto.type_name() + "\" is not an enum type."); return; } field->enum_type_ = type.enum_descriptor; if (field->enum_type()->is_placeholder_) { // We can't look up default values for placeholder types. We'll have // to just drop them. field->has_default_value_ = false; } if (field->has_default_value()) { // Ensure that the default value is an identifier. Parser cannot always // verify this because it does not have complete type information. // N.B. that this check yields better error messages but is not // necessary for correctness (an enum symbol must be a valid identifier // anyway), only for better errors. if (!io::Tokenizer::IsIdentifier(proto.default_value())) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::DEFAULT_VALUE, "Default value for an enum field must be an identifier."); } else { // We can't just use field->enum_type()->FindValueByName() here // because that locks the pool's mutex, which we have already locked // at this point. Symbol default_value = LookupSymbolNoPlaceholder(proto.default_value(), field->enum_type()->full_name()); if (default_value.type == Symbol::ENUM_VALUE && default_value.enum_value_descriptor->type() == field->enum_type()) { field->default_value_enum_ = default_value.enum_value_descriptor; } else { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::DEFAULT_VALUE, "Enum type \"" + field->enum_type()->full_name() + "\" has no value named \"" + proto.default_value() + "\"."); } } } else if (field->enum_type()->value_count() > 0) { // All enums must have at least one value, or we would have reported // an error elsewhere. We use the first defined value as the default // if a default is not explicitly defined. field->default_value_enum_ = field->enum_type()->value(0); } } else { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "Field with primitive type has type_name."); } } else { if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE || field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "Field with message or enum type missing type_name."); } } // Add the field to the fields-by-number table. // Note: We have to do this *after* cross-linking because extensions do not // know their containing type until now. If we're in // lazily_build_dependencies_ mode, we're guaranteed there's no errors, so no // risk to calling containing_type() or other accessors that will build // dependencies. if (!file_tables_->AddFieldByNumber(field)) { const FieldDescriptor* conflicting_field = file_tables_->FindFieldByNumber(field->containing_type(), field->number()); string containing_type_name = field->containing_type() == NULL ? "unknown" : field->containing_type()->full_name(); if (field->is_extension()) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, strings::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 " "\"$1\" by field \"$2\".", field->number(), containing_type_name, conflicting_field->name())); } } else { if (field->is_extension()) { if (!tables_->AddExtension(field)) { const FieldDescriptor* conflicting_field = tables_->FindExtension(field->containing_type(), field->number()); string error_msg = strings::Substitute( "Extension number $0 has already been used in \"$1\" by extension " "\"$2\" defined in $3.", field->number(), field->containing_type()->full_name(), conflicting_field->full_name(), conflicting_field->file()->name()); // Conflicting extension numbers should be an error. However, before // turning this into an error we need to fix all existing broken // protos first. // TODO(xiaofeng): Change this to an error. AddWarning(field->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, error_msg); } } } } void DescriptorBuilder::CrossLinkEnum( EnumDescriptor* enum_type, const EnumDescriptorProto& proto) { if (enum_type->options_ == NULL) { enum_type->options_ = &EnumOptions::default_instance(); } for (int i = 0; i < enum_type->value_count(); i++) { CrossLinkEnumValue(&enum_type->values_[i], proto.value(i)); } } void DescriptorBuilder::CrossLinkEnumValue( EnumValueDescriptor* enum_value, const EnumValueDescriptorProto& /* proto */) { if (enum_value->options_ == NULL) { enum_value->options_ = &EnumValueOptions::default_instance(); } } void DescriptorBuilder::CrossLinkService( ServiceDescriptor* service, const ServiceDescriptorProto& proto) { if (service->options_ == NULL) { service->options_ = &ServiceOptions::default_instance(); } for (int i = 0; i < service->method_count(); i++) { CrossLinkMethod(&service->methods_[i], proto.method(i)); } } void DescriptorBuilder::CrossLinkMethod( MethodDescriptor* method, const MethodDescriptorProto& proto) { if (method->options_ == NULL) { method->options_ = &MethodOptions::default_instance(); } Symbol input_type = LookupSymbol(proto.input_type(), method->full_name(), DescriptorPool::PLACEHOLDER_MESSAGE, LOOKUP_ALL, !pool_->lazily_build_dependencies_); if (input_type.IsNull()) { if (!pool_->lazily_build_dependencies_) { AddNotDefinedError(method->full_name(), proto, DescriptorPool::ErrorCollector::INPUT_TYPE, proto.input_type()); } else { method->input_type_.SetLazy(proto.input_type(), file_); } } else if (input_type.type != Symbol::MESSAGE) { AddError(method->full_name(), proto, DescriptorPool::ErrorCollector::INPUT_TYPE, "\"" + proto.input_type() + "\" is not a message type."); } else { method->input_type_.Set(input_type.descriptor); } Symbol output_type = LookupSymbol(proto.output_type(), method->full_name(), DescriptorPool::PLACEHOLDER_MESSAGE, LOOKUP_ALL, !pool_->lazily_build_dependencies_); if (output_type.IsNull()) { if (!pool_->lazily_build_dependencies_) { AddNotDefinedError(method->full_name(), proto, DescriptorPool::ErrorCollector::OUTPUT_TYPE, proto.output_type()); } else { method->output_type_.SetLazy(proto.output_type(), file_); } } else if (output_type.type != Symbol::MESSAGE) { AddError(method->full_name(), proto, DescriptorPool::ErrorCollector::OUTPUT_TYPE, "\"" + proto.output_type() + "\" is not a message type."); } else { method->output_type_.Set(output_type.descriptor); } } // ------------------------------------------------------------------- #define VALIDATE_OPTIONS_FROM_ARRAY(descriptor, array_name, type) \ for (int i = 0; i < descriptor->array_name##_count(); ++i) { \ Validate##type##Options(descriptor->array_name##s_ + i, \ proto.array_name(i)); \ } // Determine if the file uses optimize_for = LITE_RUNTIME, being careful to // avoid problems that exist at init time. static bool IsLite(const FileDescriptor* file) { // TODO(kenton): I don't even remember how many of these conditions are // actually possible. I'm just being super-safe. return file != NULL && &file->options() != &FileOptions::default_instance() && file->options().optimize_for() == FileOptions::LITE_RUNTIME; } void DescriptorBuilder::ValidateFileOptions(FileDescriptor* file, const FileDescriptorProto& proto) { VALIDATE_OPTIONS_FROM_ARRAY(file, message_type, Message); VALIDATE_OPTIONS_FROM_ARRAY(file, enum_type, Enum); VALIDATE_OPTIONS_FROM_ARRAY(file, service, Service); VALIDATE_OPTIONS_FROM_ARRAY(file, extension, Field); // Lite files can only be imported by other Lite files. if (!IsLite(file)) { for (int i = 0; i < file->dependency_count(); i++) { if (IsLite(file->dependency(i))) { AddError( file->name(), proto, DescriptorPool::ErrorCollector::OTHER, "Files that do not use optimize_for = LITE_RUNTIME cannot import " "files which do use this option. This file is not lite, but it " "imports \"" + file->dependency(i)->name() + "\" which is."); break; } } } if (file->syntax() == FileDescriptor::SYNTAX_PROTO3) { ValidateProto3(file, proto); } } void DescriptorBuilder::ValidateProto3( FileDescriptor* file, const FileDescriptorProto& proto) { for (int i = 0; i < file->extension_count(); ++i) { ValidateProto3Field(file->extensions_ + i, proto.extension(i)); } for (int i = 0; i < file->message_type_count(); ++i) { ValidateProto3Message(file->message_types_ + i, proto.message_type(i)); } for (int i = 0; i < file->enum_type_count(); ++i) { ValidateProto3Enum(file->enum_types_ + i, proto.enum_type(i)); } } static string ToLowercaseWithoutUnderscores(const string& name) { string result; for (int i = 0; i < name.size(); ++i) { if (name[i] != '_') { if (name[i] >= 'A' && name[i] <= 'Z') { result.push_back(name[i] - 'A' + 'a'); } else { result.push_back(name[i]); } } } return result; } void DescriptorBuilder::ValidateProto3Message( Descriptor* message, const DescriptorProto& proto) { for (int i = 0; i < message->nested_type_count(); ++i) { ValidateProto3Message(message->nested_types_ + i, proto.nested_type(i)); } for (int i = 0; i < message->enum_type_count(); ++i) { ValidateProto3Enum(message->enum_types_ + i, proto.enum_type(i)); } for (int i = 0; i < message->field_count(); ++i) { ValidateProto3Field(message->fields_ + i, proto.field(i)); } for (int i = 0; i < message->extension_count(); ++i) { ValidateProto3Field(message->extensions_ +i, proto.extension(i)); } if (message->extension_range_count() > 0) { AddError(message->full_name(), proto, DescriptorPool::ErrorCollector::OTHER, "Extension ranges are not allowed in proto3."); } if (message->options().message_set_wire_format()) { // Using MessageSet doesn't make sense since we disallow extensions. AddError(message->full_name(), proto, DescriptorPool::ErrorCollector::OTHER, "MessageSet is not supported in proto3."); } // In proto3, we reject field names if they conflict in camelCase. // Note that we currently enforce a stricter rule: Field names must be // unique after being converted to lowercase with underscores removed. std::map name_to_field; for (int i = 0; i < message->field_count(); ++i) { string lowercase_name = ToLowercaseWithoutUnderscores( message->field(i)->name()); if (name_to_field.find(lowercase_name) != name_to_field.end()) { AddError(message->full_name(), proto, DescriptorPool::ErrorCollector::OTHER, "The JSON camel-case name of field \"" + message->field(i)->name() + "\" conflicts with field \"" + name_to_field[lowercase_name]->name() + "\". This is not " + "allowed in proto3."); } else { name_to_field[lowercase_name] = message->field(i); } } } void DescriptorBuilder::ValidateProto3Field( FieldDescriptor* field, const FieldDescriptorProto& proto) { if (field->is_extension() && !AllowedExtendeeInProto3(field->containing_type()->full_name())) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::OTHER, "Extensions in proto3 are only allowed for defining options."); } if (field->is_required()) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::OTHER, "Required fields are not allowed in proto3."); } if (field->has_default_value()) { AddError( field->full_name(), proto, DescriptorPool::ErrorCollector::OTHER, "Explicit default values are not allowed in proto3."); } if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM && field->enum_type() && field->enum_type()->file()->syntax() != FileDescriptor::SYNTAX_PROTO3) { // Proto3 messages can only use Proto3 enum types; otherwise we can't // guarantee that the default value is zero. AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "Enum type \"" + field->enum_type()->full_name() + "\" is not a proto3 enum, but is used in \"" + field->containing_type()->full_name() + "\" which is a proto3 message type."); } if (field->type() == FieldDescriptor::TYPE_GROUP) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "Groups are not supported in proto3 syntax."); } } void DescriptorBuilder::ValidateProto3Enum( EnumDescriptor* enm, const EnumDescriptorProto& proto) { if (enm->value_count() > 0 && enm->value(0)->number() != 0) { AddError( enm->full_name(), proto, DescriptorPool::ErrorCollector::OTHER, "The first enum value must be zero in proto3."); } } void DescriptorBuilder::ValidateMessageOptions(Descriptor* message, const DescriptorProto& proto) { VALIDATE_OPTIONS_FROM_ARRAY(message, field, Field); VALIDATE_OPTIONS_FROM_ARRAY(message, nested_type, Message); VALIDATE_OPTIONS_FROM_ARRAY(message, enum_type, Enum); VALIDATE_OPTIONS_FROM_ARRAY(message, extension, Field); const int64 max_extension_range = static_cast(message->options().message_set_wire_format() ? kint32max : FieldDescriptor::kMaxNumber); for (int i = 0; i < message->extension_range_count(); ++i) { 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.", max_extension_range)); } } } void DescriptorBuilder::ValidateFieldOptions(FieldDescriptor* field, const FieldDescriptorProto& proto) { if (pool_->lazily_build_dependencies_ && (!field || !field->message_type())) { return; } // Only message type fields may be lazy. if (field->options().lazy()) { if (field->type() != FieldDescriptor::TYPE_MESSAGE) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "[lazy = true] can only be specified for submessage fields."); } } // Only repeated primitive fields may be packed. if (field->options().packed() && !field->is_packable()) { AddError( field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "[packed = true] can only be specified for repeated primitive fields."); } // Note: Default instance may not yet be initialized here, so we have to // avoid reading from it. if (field->containing_type_ != NULL && &field->containing_type()->options() != &MessageOptions::default_instance() && field->containing_type()->options().message_set_wire_format()) { if (field->is_extension()) { if (!field->is_optional() || field->type() != FieldDescriptor::TYPE_MESSAGE) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "Extensions of MessageSets must be optional messages."); } } else { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::NAME, "MessageSets cannot have fields, only extensions."); } } // Lite extensions can only be of Lite types. if (IsLite(field->file()) && field->containing_type_ != NULL && !IsLite(field->containing_type()->file())) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::EXTENDEE, "Extensions to non-lite types can only be declared in non-lite " "files. Note that you cannot extend a non-lite type to contain " "a lite type, but the reverse is allowed."); } // Validate map types. if (field->is_map()) { if (!ValidateMapEntry(field, proto)) { AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::OTHER, "map_entry should not be set explicitly. Use map instead."); } } ValidateJSType(field, proto); } void DescriptorBuilder::ValidateEnumOptions(EnumDescriptor* enm, const EnumDescriptorProto& proto) { VALIDATE_OPTIONS_FROM_ARRAY(enm, value, EnumValue); if (!enm->options().has_allow_alias() || !enm->options().allow_alias()) { std::map used_values; for (int i = 0; i < enm->value_count(); ++i) { const EnumValueDescriptor* enum_value = enm->value(i); if (used_values.find(enum_value->number()) != used_values.end()) { string error = "\"" + enum_value->full_name() + "\" uses the same enum value as \"" + used_values[enum_value->number()] + "\". If this is intended, set " "'option allow_alias = true;' to the enum definition."; if (!enm->options().allow_alias()) { // Generate error if duplicated enum values are explicitly disallowed. AddError(enm->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, error); } else { // Generate warning if duplicated values are found but the option // isn't set. GOOGLE_LOG(ERROR) << error; } } else { used_values[enum_value->number()] = enum_value->full_name(); } } } } void DescriptorBuilder::ValidateEnumValueOptions( EnumValueDescriptor* /* enum_value */, const EnumValueDescriptorProto& /* proto */) { // Nothing to do so far. } void DescriptorBuilder::ValidateServiceOptions(ServiceDescriptor* service, const ServiceDescriptorProto& proto) { if (IsLite(service->file()) && (service->file()->options().cc_generic_services() || service->file()->options().java_generic_services())) { AddError(service->full_name(), proto, DescriptorPool::ErrorCollector::NAME, "Files with optimize_for = LITE_RUNTIME cannot define services " "unless you set both options cc_generic_services and " "java_generic_sevices to false."); } VALIDATE_OPTIONS_FROM_ARRAY(service, method, Method); } void DescriptorBuilder::ValidateMethodOptions(MethodDescriptor* /* method */, const MethodDescriptorProto& /* proto */) { // Nothing to do so far. } bool DescriptorBuilder::ValidateMapEntry(FieldDescriptor* field, const FieldDescriptorProto& proto) { const Descriptor* message = field->message_type(); if (// Must not contain extensions, extension range or nested message or // enums message->extension_count() != 0 || field->label() != FieldDescriptor::LABEL_REPEATED || message->extension_range_count() != 0 || message->nested_type_count() != 0 || message->enum_type_count() != 0 || // Must contain exactly two fields message->field_count() != 2 || // Field name and message name must match message->name() != ToCamelCase(field->name(), false) + "Entry" || // Entry message must be in the same containing type of the field. field->containing_type() != message->containing_type()) { return false; } const FieldDescriptor* key = message->field(0); const FieldDescriptor* value = message->field(1); if (key->label() != FieldDescriptor::LABEL_OPTIONAL || key->number() != 1 || key->name() != "key") { return false; } if (value->label() != FieldDescriptor::LABEL_OPTIONAL || value->number() != 2 || value->name() != "value") { return false; } // Check key types are legal. switch (key->type()) { case FieldDescriptor::TYPE_ENUM: AddError( field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "Key in map fields cannot be enum types."); break; case FieldDescriptor::TYPE_FLOAT: case FieldDescriptor::TYPE_DOUBLE: case FieldDescriptor::TYPE_MESSAGE: case FieldDescriptor::TYPE_GROUP: case FieldDescriptor::TYPE_BYTES: AddError( field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "Key in map fields cannot be float/double, bytes or message types."); break; case FieldDescriptor::TYPE_BOOL: case FieldDescriptor::TYPE_INT32: case FieldDescriptor::TYPE_INT64: case FieldDescriptor::TYPE_SINT32: case FieldDescriptor::TYPE_SINT64: case FieldDescriptor::TYPE_STRING: case FieldDescriptor::TYPE_UINT32: case FieldDescriptor::TYPE_UINT64: case FieldDescriptor::TYPE_FIXED32: case FieldDescriptor::TYPE_FIXED64: case FieldDescriptor::TYPE_SFIXED32: case FieldDescriptor::TYPE_SFIXED64: // Legal cases break; // Do not add a default, so that the compiler will complain when new types // are added. } if (value->type() == FieldDescriptor::TYPE_ENUM) { if (value->enum_type()->value(0)->number() != 0) { AddError( field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "Enum value in map must define 0 as the first value."); } } return true; } void DescriptorBuilder::DetectMapConflicts(const Descriptor* message, const DescriptorProto& proto) { std::map seen_types; for (int i = 0; i < message->nested_type_count(); ++i) { const Descriptor* nested = message->nested_type(i); std::pair::iterator, bool> result = seen_types.insert(std::make_pair(nested->name(), nested)); if (!result.second) { if (result.first->second->options().map_entry() || nested->options().map_entry()) { AddError(message->full_name(), proto, DescriptorPool::ErrorCollector::NAME, "Expanded map entry type " + nested->name() + " conflicts with an existing nested message type."); } } // Recursively test on the nested types. DetectMapConflicts(message->nested_type(i), proto.nested_type(i)); } // Check for conflicted field names. for (int i = 0; i < message->field_count(); ++i) { const FieldDescriptor* field = message->field(i); std::map::iterator iter = seen_types.find(field->name()); if (iter != seen_types.end() && iter->second->options().map_entry()) { AddError(message->full_name(), proto, DescriptorPool::ErrorCollector::NAME, "Expanded map entry type " + iter->second->name() + " conflicts with an existing field."); } } // Check for conflicted enum names. for (int i = 0; i < message->enum_type_count(); ++i) { const EnumDescriptor* enum_desc = message->enum_type(i); std::map::iterator iter = seen_types.find(enum_desc->name()); if (iter != seen_types.end() && iter->second->options().map_entry()) { AddError(message->full_name(), proto, DescriptorPool::ErrorCollector::NAME, "Expanded map entry type " + iter->second->name() + " conflicts with an existing enum type."); } } // Check for conflicted oneof names. for (int i = 0; i < message->oneof_decl_count(); ++i) { const OneofDescriptor* oneof_desc = message->oneof_decl(i); std::map::iterator iter = seen_types.find(oneof_desc->name()); if (iter != seen_types.end() && iter->second->options().map_entry()) { AddError(message->full_name(), proto, DescriptorPool::ErrorCollector::NAME, "Expanded map entry type " + iter->second->name() + " conflicts with an existing oneof type."); } } } void DescriptorBuilder::ValidateJSType(FieldDescriptor* field, const FieldDescriptorProto& proto) { FieldOptions::JSType jstype = field->options().jstype(); // The default is always acceptable. if (jstype == FieldOptions::JS_NORMAL) { return; } switch (field->type()) { // Integral 64-bit types may be represented as JavaScript numbers or // strings. case FieldDescriptor::TYPE_UINT64: case FieldDescriptor::TYPE_INT64: case FieldDescriptor::TYPE_SINT64: case FieldDescriptor::TYPE_FIXED64: case FieldDescriptor::TYPE_SFIXED64: if (jstype == FieldOptions::JS_STRING || jstype == FieldOptions::JS_NUMBER) { return; } AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "Illegal jstype for int64, uint64, sint64, fixed64 " "or sfixed64 field: " + FieldOptions_JSType_descriptor()->value(jstype)->name()); break; // No other types permit a jstype option. default: AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, "jstype is only allowed on int64, uint64, sint64, fixed64 " "or sfixed64 fields."); break; } } #undef VALIDATE_OPTIONS_FROM_ARRAY // ------------------------------------------------------------------- DescriptorBuilder::OptionInterpreter::OptionInterpreter( DescriptorBuilder* builder) : builder_(builder) { GOOGLE_CHECK(builder_); } DescriptorBuilder::OptionInterpreter::~OptionInterpreter() { } bool DescriptorBuilder::OptionInterpreter::InterpretOptions( OptionsToInterpret* options_to_interpret) { // Note that these may be in different pools, so we can't use the same // descriptor and reflection objects on both. Message* options = options_to_interpret->options; const Message* original_options = options_to_interpret->original_options; bool failed = false; options_to_interpret_ = options_to_interpret; // Find the uninterpreted_option field in the mutable copy of the options // and clear them, since we're about to interpret them. const FieldDescriptor* uninterpreted_options_field = options->GetDescriptor()->FindFieldByName("uninterpreted_option"); GOOGLE_CHECK(uninterpreted_options_field != NULL) << "No field named \"uninterpreted_option\" in the Options proto."; options->GetReflection()->ClearField(options, uninterpreted_options_field); // Find the uninterpreted_option field in the original options. const FieldDescriptor* original_uninterpreted_options_field = original_options->GetDescriptor()-> FindFieldByName("uninterpreted_option"); GOOGLE_CHECK(original_uninterpreted_options_field != NULL) << "No field named \"uninterpreted_option\" in the Options proto."; const int num_uninterpreted_options = original_options->GetReflection()-> FieldSize(*original_options, original_uninterpreted_options_field); for (int i = 0; i < num_uninterpreted_options; ++i) { uninterpreted_option_ = down_cast( &original_options->GetReflection()->GetRepeatedMessage( *original_options, original_uninterpreted_options_field, i)); if (!InterpretSingleOption(options)) { // Error already added by InterpretSingleOption(). failed = true; break; } } // Reset these, so we don't have any dangling pointers. uninterpreted_option_ = NULL; options_to_interpret_ = NULL; if (!failed) { // InterpretSingleOption() added the interpreted options in the // UnknownFieldSet, in case the option isn't yet known to us. Now we // serialize the options message and deserialize it back. That way, any // option fields that we do happen to know about will get moved from the // UnknownFieldSet into the real fields, and thus be available right away. // If they are not known, that's OK too. They will get reparsed into the // UnknownFieldSet and wait there until the message is parsed by something // that does know about the options. string buf; GOOGLE_CHECK(options->AppendPartialToString(&buf)) << "Protocol message could not be serialized."; GOOGLE_CHECK(options->ParsePartialFromString(buf)) << "Protocol message serialized itself in invalid fashion."; if (!options->IsInitialized()) { builder_->AddWarning( options_to_interpret->element_name, *original_options, DescriptorPool::ErrorCollector::OTHER, "Options could not be fully parsed using the proto descriptors " "compiled into this binary. Missing required fields: " + options->InitializationErrorString()); } } return !failed; } bool DescriptorBuilder::OptionInterpreter::InterpretSingleOption( Message* options) { // First do some basic validation. if (uninterpreted_option_->name_size() == 0) { // This should never happen unless the parser has gone seriously awry or // someone has manually created the uninterpreted option badly. return AddNameError("Option must have a name."); } if (uninterpreted_option_->name(0).name_part() == "uninterpreted_option") { return AddNameError("Option must not use reserved name " "\"uninterpreted_option\"."); } const Descriptor* options_descriptor = NULL; // Get the options message's descriptor from the builder's pool, so that we // get the version that knows about any extension options declared in the // file we're currently building. The descriptor should be there as long as // the file we're building imported "google/protobuf/descriptors.proto". // Note that we use DescriptorBuilder::FindSymbolNotEnforcingDeps(), not // DescriptorPool::FindMessageTypeByName() because we're already holding the // pool's mutex, and the latter method locks it again. We don't use // FindSymbol() because files that use custom options only need to depend on // the file that defines the option, not descriptor.proto itself. Symbol symbol = builder_->FindSymbolNotEnforcingDeps( options->GetDescriptor()->full_name()); if (!symbol.IsNull() && symbol.type == Symbol::MESSAGE) { options_descriptor = symbol.descriptor; } else { // The options message's descriptor was not in the builder's pool, so use // the standard version from the generated pool. We're not holding the // generated pool's mutex, so we can search it the straightforward way. options_descriptor = options->GetDescriptor(); } GOOGLE_CHECK(options_descriptor); // We iterate over the name parts to drill into the submessages until we find // the leaf field for the option. As we drill down we remember the current // submessage's descriptor in |descriptor| and the next field in that // submessage in |field|. We also track the fields we're drilling down // through in |intermediate_fields|. As we go, we reconstruct the full option // name in |debug_msg_name|, for use in error messages. const Descriptor* descriptor = options_descriptor; const FieldDescriptor* field = NULL; std::vector intermediate_fields; string debug_msg_name = ""; for (int i = 0; i < uninterpreted_option_->name_size(); ++i) { const string& name_part = uninterpreted_option_->name(i).name_part(); if (debug_msg_name.size() > 0) { debug_msg_name += "."; } if (uninterpreted_option_->name(i).is_extension()) { debug_msg_name += "(" + name_part + ")"; // Search for the extension's descriptor as an extension in the builder's // pool. Note that we use DescriptorBuilder::LookupSymbol(), not // DescriptorPool::FindExtensionByName(), for two reasons: 1) It allows // relative lookups, and 2) because we're already holding the pool's // mutex, and the latter method locks it again. symbol = builder_->LookupSymbol(name_part, options_to_interpret_->name_scope); if (!symbol.IsNull() && symbol.type == Symbol::FIELD) { field = symbol.field_descriptor; } // If we don't find the field then the field's descriptor was not in the // builder's pool, but there's no point in looking in the generated // pool. We require that you import the file that defines any extensions // you use, so they must be present in the builder's pool. } else { debug_msg_name += name_part; // Search for the field's descriptor as a regular field. field = descriptor->FindFieldByName(name_part); } if (field == NULL) { if (get_allow_unknown(builder_->pool_)) { // We can't find the option, but AllowUnknownDependencies() is enabled, // so we will just leave it as uninterpreted. AddWithoutInterpreting(*uninterpreted_option_, options); return true; } else if (!(builder_->undefine_resolved_name_).empty()) { // Option is resolved to a name which is not defined. return AddNameError( "Option \"" + debug_msg_name + "\" is resolved to \"(" + builder_->undefine_resolved_name_ + ")\", which is not defined. The innermost scope is searched first " "in name resolution. Consider using a leading '.'(i.e., \"(." + debug_msg_name.substr(1) + "\") to start from the outermost scope."); } else { return AddNameError("Option \"" + debug_msg_name + "\" unknown."); } } else if (field->containing_type() != descriptor) { if (get_is_placeholder(field->containing_type())) { // The field is an extension of a placeholder type, so we can't // reliably verify whether it is a valid extension to use here (e.g. // we don't know if it is an extension of the correct *Options message, // or if it has a valid field number, etc.). Just leave it as // uninterpreted instead. AddWithoutInterpreting(*uninterpreted_option_, options); return true; } else { // This can only happen if, due to some insane misconfiguration of the // pools, we find the options message in one pool but the field in // another. This would probably imply a hefty bug somewhere. return AddNameError("Option field \"" + debug_msg_name + "\" is not a field or extension of message \"" + descriptor->name() + "\"."); } } else if (i < uninterpreted_option_->name_size() - 1) { if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { return AddNameError("Option \"" + debug_msg_name + "\" is an atomic type, not a message."); } else if (field->is_repeated()) { return AddNameError("Option field \"" + debug_msg_name + "\" is a repeated message. Repeated message " "options must be initialized using an " "aggregate value."); } else { // Drill down into the submessage. intermediate_fields.push_back(field); descriptor = field->message_type(); } } } // We've found the leaf field. Now we use UnknownFieldSets to set its value // on the options message. We do so because the message may not yet know // about its extension fields, so we may not be able to set the fields // directly. But the UnknownFieldSets will serialize to the same wire-format // message, so reading that message back in once the extension fields are // known will populate them correctly. // First see if the option is already set. if (!field->is_repeated() && !ExamineIfOptionIsSet( intermediate_fields.begin(), intermediate_fields.end(), field, debug_msg_name, options->GetReflection()->GetUnknownFields(*options))) { return false; // ExamineIfOptionIsSet() already added the error. } // First set the value on the UnknownFieldSet corresponding to the // innermost message. google::protobuf::scoped_ptr unknown_fields(new UnknownFieldSet()); if (!SetOptionValue(field, unknown_fields.get())) { return false; // SetOptionValue() already added the error. } // Now wrap the UnknownFieldSet with UnknownFieldSets corresponding to all // the intermediate messages. for (std::vector::reverse_iterator iter = intermediate_fields.rbegin(); iter != intermediate_fields.rend(); ++iter) { google::protobuf::scoped_ptr parent_unknown_fields( new UnknownFieldSet()); switch ((*iter)->type()) { case FieldDescriptor::TYPE_MESSAGE: { io::StringOutputStream outstr( parent_unknown_fields->AddLengthDelimited((*iter)->number())); io::CodedOutputStream out(&outstr); internal::WireFormat::SerializeUnknownFields(*unknown_fields, &out); GOOGLE_CHECK(!out.HadError()) << "Unexpected failure while serializing option submessage " << debug_msg_name << "\"."; break; } case FieldDescriptor::TYPE_GROUP: { parent_unknown_fields->AddGroup((*iter)->number()) ->MergeFrom(*unknown_fields); break; } default: GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_MESSAGE: " << (*iter)->type(); return false; } unknown_fields.reset(parent_unknown_fields.release()); } // Now merge the UnknownFieldSet corresponding to the top-level message into // the options message. options->GetReflection()->MutableUnknownFields(options)->MergeFrom( *unknown_fields); return true; } void DescriptorBuilder::OptionInterpreter::AddWithoutInterpreting( const UninterpretedOption& uninterpreted_option, Message* options) { const FieldDescriptor* field = options->GetDescriptor()->FindFieldByName("uninterpreted_option"); GOOGLE_CHECK(field != NULL); options->GetReflection()->AddMessage(options, field) ->CopyFrom(uninterpreted_option); } bool DescriptorBuilder::OptionInterpreter::ExamineIfOptionIsSet( std::vector::const_iterator intermediate_fields_iter, std::vector::const_iterator intermediate_fields_end, const FieldDescriptor* innermost_field, const string& debug_msg_name, const UnknownFieldSet& unknown_fields) { // We do linear searches of the UnknownFieldSet and its sub-groups. This // should be fine since it's unlikely that any one options structure will // contain more than a handful of options. if (intermediate_fields_iter == intermediate_fields_end) { // We're at the innermost submessage. for (int i = 0; i < unknown_fields.field_count(); i++) { if (unknown_fields.field(i).number() == innermost_field->number()) { return AddNameError("Option \"" + debug_msg_name + "\" was already set."); } } return true; } for (int i = 0; i < unknown_fields.field_count(); i++) { if (unknown_fields.field(i).number() == (*intermediate_fields_iter)->number()) { const UnknownField* unknown_field = &unknown_fields.field(i); FieldDescriptor::Type type = (*intermediate_fields_iter)->type(); // Recurse into the next submessage. switch (type) { case FieldDescriptor::TYPE_MESSAGE: if (unknown_field->type() == UnknownField::TYPE_LENGTH_DELIMITED) { UnknownFieldSet intermediate_unknown_fields; if (intermediate_unknown_fields.ParseFromString( unknown_field->length_delimited()) && !ExamineIfOptionIsSet(intermediate_fields_iter + 1, intermediate_fields_end, innermost_field, debug_msg_name, intermediate_unknown_fields)) { return false; // Error already added. } } break; case FieldDescriptor::TYPE_GROUP: if (unknown_field->type() == UnknownField::TYPE_GROUP) { if (!ExamineIfOptionIsSet(intermediate_fields_iter + 1, intermediate_fields_end, innermost_field, debug_msg_name, unknown_field->group())) { return false; // Error already added. } } break; default: GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_MESSAGE: " << type; return false; } } } return true; } bool DescriptorBuilder::OptionInterpreter::SetOptionValue( const FieldDescriptor* option_field, UnknownFieldSet* unknown_fields) { // We switch on the CppType to validate. switch (option_field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: if (uninterpreted_option_->has_positive_int_value()) { if (uninterpreted_option_->positive_int_value() > static_cast(kint32max)) { return AddValueError("Value out of range for int32 option \"" + option_field->full_name() + "\"."); } else { SetInt32(option_field->number(), uninterpreted_option_->positive_int_value(), option_field->type(), unknown_fields); } } else if (uninterpreted_option_->has_negative_int_value()) { if (uninterpreted_option_->negative_int_value() < static_cast(kint32min)) { return AddValueError("Value out of range for int32 option \"" + 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() + "\"."); } break; case FieldDescriptor::CPPTYPE_INT64: if (uninterpreted_option_->has_positive_int_value()) { if (uninterpreted_option_->positive_int_value() > static_cast(kint64max)) { return AddValueError("Value out of range for int64 option \"" + option_field->full_name() + "\"."); } else { SetInt64(option_field->number(), uninterpreted_option_->positive_int_value(), option_field->type(), unknown_fields); } } else if (uninterpreted_option_->has_negative_int_value()) { SetInt64(option_field->number(), uninterpreted_option_->negative_int_value(), option_field->type(), unknown_fields); } else { return AddValueError("Value must be integer for int64 option \"" + option_field->full_name() + "\"."); } break; case FieldDescriptor::CPPTYPE_UINT32: if (uninterpreted_option_->has_positive_int_value()) { if (uninterpreted_option_->positive_int_value() > kuint32max) { return AddValueError("Value out of range for uint32 option \"" + option_field->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() + "\"."); } break; case FieldDescriptor::CPPTYPE_UINT64: if (uninterpreted_option_->has_positive_int_value()) { SetUInt64(option_field->number(), 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() + "\"."); } break; case FieldDescriptor::CPPTYPE_FLOAT: { float value; if (uninterpreted_option_->has_double_value()) { value = uninterpreted_option_->double_value(); } else if (uninterpreted_option_->has_positive_int_value()) { value = uninterpreted_option_->positive_int_value(); } else if (uninterpreted_option_->has_negative_int_value()) { value = uninterpreted_option_->negative_int_value(); } else { return AddValueError("Value must be number for float option \"" + option_field->full_name() + "\"."); } unknown_fields->AddFixed32(option_field->number(), google::protobuf::internal::WireFormatLite::EncodeFloat(value)); break; } case FieldDescriptor::CPPTYPE_DOUBLE: { double value; if (uninterpreted_option_->has_double_value()) { value = uninterpreted_option_->double_value(); } else if (uninterpreted_option_->has_positive_int_value()) { value = uninterpreted_option_->positive_int_value(); } else if (uninterpreted_option_->has_negative_int_value()) { value = uninterpreted_option_->negative_int_value(); } else { return AddValueError("Value must be number for double option \"" + option_field->full_name() + "\"."); } unknown_fields->AddFixed64(option_field->number(), google::protobuf::internal::WireFormatLite::EncodeDouble(value)); break; } case FieldDescriptor::CPPTYPE_BOOL: uint64 value; if (!uninterpreted_option_->has_identifier_value()) { return AddValueError("Value must be identifier for boolean option " "\"" + option_field->full_name() + "\"."); } if (uninterpreted_option_->identifier_value() == "true") { value = 1; } else if (uninterpreted_option_->identifier_value() == "false") { value = 0; } else { return AddValueError("Value must be \"true\" or \"false\" for boolean " "option \"" + option_field->full_name() + "\"."); } unknown_fields->AddVarint(option_field->number(), value); break; case FieldDescriptor::CPPTYPE_ENUM: { if (!uninterpreted_option_->has_identifier_value()) { return AddValueError("Value must be identifier for enum-valued option " "\"" + option_field->full_name() + "\"."); } const EnumDescriptor* enum_type = option_field->enum_type(); const string& value_name = uninterpreted_option_->identifier_value(); const EnumValueDescriptor* enum_value = NULL; if (enum_type->file()->pool() != DescriptorPool::generated_pool()) { // Note that the enum value's fully-qualified name is a sibling of the // enum's name, not a child of it. string fully_qualified_name = enum_type->full_name(); fully_qualified_name.resize(fully_qualified_name.size() - enum_type->name().size()); fully_qualified_name += value_name; // Search for the enum value's descriptor in the builder's pool. Note // that we use DescriptorBuilder::FindSymbolNotEnforcingDeps(), not // DescriptorPool::FindEnumValueByName() because we're already holding // the pool's mutex, and the latter method locks it again. Symbol symbol = builder_->FindSymbolNotEnforcingDeps(fully_qualified_name); if (!symbol.IsNull() && symbol.type == Symbol::ENUM_VALUE) { if (symbol.enum_value_descriptor->type() != enum_type) { return AddValueError("Enum type \"" + enum_type->full_name() + "\" has no value named \"" + value_name + "\" for option \"" + option_field->full_name() + "\". This appears to be a value from a sibling type."); } else { enum_value = symbol.enum_value_descriptor; } } } else { // The enum type is in the generated pool, so we can search for the // value there. enum_value = enum_type->FindValueByName(value_name); } if (enum_value == NULL) { return AddValueError("Enum type \"" + option_field->enum_type()->full_name() + "\" has no value named \"" + value_name + "\" for " "option \"" + option_field->full_name() + "\"."); } else { // Sign-extension is not a problem, since we cast directly from int32 to // uint64, without first going through uint32. unknown_fields->AddVarint(option_field->number(), static_cast(static_cast(enum_value->number()))); } break; } case FieldDescriptor::CPPTYPE_STRING: if (!uninterpreted_option_->has_string_value()) { return AddValueError("Value must be quoted string for string option " "\"" + option_field->full_name() + "\"."); } // The string has already been unquoted and unescaped by the parser. unknown_fields->AddLengthDelimited(option_field->number(), uninterpreted_option_->string_value()); break; case FieldDescriptor::CPPTYPE_MESSAGE: if (!SetAggregateOption(option_field, unknown_fields)) { return false; } break; } return true; } class DescriptorBuilder::OptionInterpreter::AggregateOptionFinder : public TextFormat::Finder { public: DescriptorBuilder* builder_; virtual const FieldDescriptor* FindExtension( Message* message, const string& name) const { assert_mutex_held(builder_->pool_); const Descriptor* descriptor = message->GetDescriptor(); Symbol result = builder_->LookupSymbolNoPlaceholder( name, descriptor->full_name()); if (result.type == Symbol::FIELD && result.field_descriptor->is_extension()) { return result.field_descriptor; } else if (result.type == Symbol::MESSAGE && descriptor->options().message_set_wire_format()) { const Descriptor* foreign_type = result.descriptor; // The text format allows MessageSet items to be specified using // the type name, rather than the extension identifier. If the symbol // lookup returned a Message, and the enclosing Message has // message_set_wire_format = true, then return the message set // extension, if one exists. for (int i = 0; i < foreign_type->extension_count(); i++) { const FieldDescriptor* extension = foreign_type->extension(i); if (extension->containing_type() == descriptor && extension->type() == FieldDescriptor::TYPE_MESSAGE && extension->is_optional() && extension->message_type() == foreign_type) { // Found it. return extension; } } } return NULL; } }; // A custom error collector to record any text-format parsing errors namespace { class AggregateErrorCollector : public io::ErrorCollector { public: string error_; virtual void AddError(int /* line */, int /* column */, const string& message) { if (!error_.empty()) { error_ += "; "; } error_ += message; } virtual void AddWarning(int /* line */, int /* column */, const string& /* message */) { // Ignore warnings } }; } // We construct a dynamic message of the type corresponding to // option_field, parse the supplied text-format string into this // message, and serialize the resulting message to produce the value. bool DescriptorBuilder::OptionInterpreter::SetAggregateOption( const FieldDescriptor* option_field, UnknownFieldSet* unknown_fields) { if (!uninterpreted_option_->has_aggregate_value()) { return AddValueError("Option \"" + option_field->full_name() + "\" is a message. To set the entire message, use " "syntax like \"" + option_field->name() + " = { }\". " "To set fields within it, use " "syntax like \"" + option_field->name() + ".foo = value\"."); } const Descriptor* type = option_field->message_type(); google::protobuf::scoped_ptr dynamic(dynamic_factory_.GetPrototype(type)->New()); GOOGLE_CHECK(dynamic.get() != NULL) << "Could not create an instance of " << option_field->DebugString(); AggregateErrorCollector collector; AggregateOptionFinder finder; finder.builder_ = builder_; TextFormat::Parser parser; parser.RecordErrorsTo(&collector); parser.SetFinder(&finder); if (!parser.ParseFromString(uninterpreted_option_->aggregate_value(), dynamic.get())) { AddValueError("Error while parsing option value for \"" + option_field->name() + "\": " + collector.error_); return false; } else { string serial; dynamic->SerializeToString(&serial); // Never fails if (option_field->type() == FieldDescriptor::TYPE_MESSAGE) { unknown_fields->AddLengthDelimited(option_field->number(), serial); } else { GOOGLE_CHECK_EQ(option_field->type(), FieldDescriptor::TYPE_GROUP); UnknownFieldSet* group = unknown_fields->AddGroup(option_field->number()); group->ParseFromString(serial); } return true; } } void DescriptorBuilder::OptionInterpreter::SetInt32(int number, int32 value, FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { switch (type) { case FieldDescriptor::TYPE_INT32: unknown_fields->AddVarint(number, static_cast(static_cast(value))); break; case FieldDescriptor::TYPE_SFIXED32: unknown_fields->AddFixed32(number, static_cast(value)); break; case FieldDescriptor::TYPE_SINT32: unknown_fields->AddVarint(number, google::protobuf::internal::WireFormatLite::ZigZagEncode32(value)); break; default: GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_INT32: " << type; break; } } void DescriptorBuilder::OptionInterpreter::SetInt64(int number, int64 value, FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { switch (type) { case FieldDescriptor::TYPE_INT64: unknown_fields->AddVarint(number, static_cast(value)); break; case FieldDescriptor::TYPE_SFIXED64: unknown_fields->AddFixed64(number, static_cast(value)); break; case FieldDescriptor::TYPE_SINT64: unknown_fields->AddVarint(number, google::protobuf::internal::WireFormatLite::ZigZagEncode64(value)); break; default: GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_INT64: " << type; break; } } void DescriptorBuilder::OptionInterpreter::SetUInt32(int number, uint32 value, FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { switch (type) { case FieldDescriptor::TYPE_UINT32: unknown_fields->AddVarint(number, static_cast(value)); break; case FieldDescriptor::TYPE_FIXED32: unknown_fields->AddFixed32(number, static_cast(value)); break; default: GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_UINT32: " << type; break; } } void DescriptorBuilder::OptionInterpreter::SetUInt64(int number, uint64 value, FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { switch (type) { case FieldDescriptor::TYPE_UINT64: unknown_fields->AddVarint(number, value); break; case FieldDescriptor::TYPE_FIXED64: unknown_fields->AddFixed64(number, value); break; default: GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_UINT64: " << type; break; } } void DescriptorBuilder::LogUnusedDependency(const FileDescriptorProto& proto, const FileDescriptor* result) { if (!unused_dependency_.empty()) { std::set annotation_extensions; annotation_extensions.insert("google.protobuf.MessageOptions"); annotation_extensions.insert("google.protobuf.FileOptions"); annotation_extensions.insert("google.protobuf.FieldOptions"); annotation_extensions.insert("google.protobuf.EnumOptions"); annotation_extensions.insert("google.protobuf.EnumValueOptions"); annotation_extensions.insert("google.protobuf.EnumValueOptions"); annotation_extensions.insert("google.protobuf.ServiceOptions"); annotation_extensions.insert("google.protobuf.MethodOptions"); annotation_extensions.insert("google.protobuf.StreamOptions"); for (std::set::const_iterator it = unused_dependency_.begin(); it != unused_dependency_.end(); ++it) { // Do not log warnings for proto files which extend annotations. int i; for (i = 0 ; i < (*it)->extension_count(); ++i) { if (annotation_extensions.find( (*it)->extension(i)->containing_type()->full_name()) != annotation_extensions.end()) { break; } } // Log warnings for unused imported files. if (i == (*it)->extension_count()) { string error_message = "Import " + (*it)->name() + " but not used."; AddWarning((*it)->name(), proto, DescriptorPool::ErrorCollector::OTHER, error_message); } } } } Symbol DescriptorPool::CrossLinkOnDemandHelper(const string& name, bool expecting_enum) const { string lookup_name = name; if (!lookup_name.empty() && lookup_name[0] == '.') { lookup_name = lookup_name.substr(1); } Symbol result = tables_->FindByNameHelper(this, lookup_name); return result; } // Handle the lazy import building for a message field whose type wasn't built // at cross link time. If that was the case, we saved the name of the type to // be looked up when the accessor for the type was called. Set type_, // enum_type_, message_type_, and default_value_enum_ appropriately. void FieldDescriptor::InternalTypeOnceInit() const { GOOGLE_CHECK(file()->finished_building_ == true); if (type_name_) { Symbol result = file()->pool()->CrossLinkOnDemandHelper( *type_name_, type_ == FieldDescriptor::TYPE_ENUM); if (result.type == Symbol::MESSAGE) { type_ = FieldDescriptor::TYPE_MESSAGE; message_type_ = result.descriptor; } else if (result.type == Symbol::ENUM) { type_ = FieldDescriptor::TYPE_ENUM; enum_type_ = result.enum_descriptor; } } if (enum_type_ && !default_value_enum_) { if (default_value_enum_name_) { // Have to build the full name now instead of at CrossLink time, // because enum_type_ may not be known at the time. string name = enum_type_->full_name(); // Enum values reside in the same scope as the enum type. string::size_type last_dot = name.find_last_of('.'); if (last_dot != string::npos) { name = name.substr(0, last_dot) + "." + *default_value_enum_name_; } else { name = *default_value_enum_name_; } Symbol result = file()->pool()->CrossLinkOnDemandHelper(name, true); if (result.type == Symbol::ENUM_VALUE) { default_value_enum_ = result.enum_value_descriptor; } } if (!default_value_enum_) { // We use the first defined value as the default // if a default is not explicitly defined. GOOGLE_CHECK(enum_type_->value_count()); default_value_enum_ = enum_type_->value(0); } } } void FieldDescriptor::TypeOnceInit(const FieldDescriptor* to_init) { to_init->InternalTypeOnceInit(); } // message_type(), enum_type(), default_value_enum(), and type() // all share the same GoogleOnceDynamic 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_) { type_once_->Init(&FieldDescriptor::TypeOnceInit, this); } return message_type_; } const EnumDescriptor* FieldDescriptor::enum_type() const { if (type_once_) { type_once_->Init(&FieldDescriptor::TypeOnceInit, this); } return enum_type_; } const EnumValueDescriptor* FieldDescriptor::default_value_enum() const { if (type_once_) { type_once_->Init(&FieldDescriptor::TypeOnceInit, this); } return default_value_enum_; } void FileDescriptor::InternalDependenciesOnceInit() const { GOOGLE_CHECK(finished_building_ == true); for (int i = 0; i < dependency_count(); i++) { if (dependencies_names_[i]) { dependencies_[i] = pool_->FindFileByName(*dependencies_names_[i]); } } } void FileDescriptor::DependenciesOnceInit(const FileDescriptor* to_init) { to_init->InternalDependenciesOnceInit(); } const FileDescriptor* FileDescriptor::dependency(int index) const { if (dependencies_once_) { // Do once init for all indicies, as it's unlikely only a single index would // be called, and saves on GoogleOnceDynamic allocations. dependencies_once_->Init(&FileDescriptor::DependenciesOnceInit, this); } return dependencies_[index]; } const Descriptor* MethodDescriptor::input_type() const { return input_type_.Get(); } const Descriptor* MethodDescriptor::output_type() const { return output_type_.Get(); } namespace internal { void LazyDescriptor::Set(const Descriptor* descriptor) { GOOGLE_CHECK(!name_); GOOGLE_CHECK(!once_); GOOGLE_CHECK(!file_); descriptor_ = descriptor; } void LazyDescriptor::SetLazy(const string& name, const FileDescriptor* file) { // verify Init() has been called and Set hasn't been called yet. GOOGLE_CHECK(!descriptor_); GOOGLE_CHECK(!file_); GOOGLE_CHECK(!name_); GOOGLE_CHECK(!once_); GOOGLE_CHECK(file && file->pool_); GOOGLE_CHECK(file->pool_->lazily_build_dependencies_); GOOGLE_CHECK(!file->finished_building_); file_ = file; name_ = file->pool_->tables_->AllocateString(name); once_ = file->pool_->tables_->AllocateOnceDynamic(); } void LazyDescriptor::Once() { if (once_) { once_->Init(&LazyDescriptor::OnceStatic, this); } } void LazyDescriptor::OnceStatic(LazyDescriptor* lazy) { lazy->OnceInternal(); } void LazyDescriptor::OnceInternal() { GOOGLE_CHECK(file_->finished_building_); if (!descriptor_ && name_) { Symbol result = file_->pool_->CrossLinkOnDemandHelper(*name_, false); if (!result.IsNull() && result.type == Symbol::MESSAGE) { descriptor_ = result.descriptor; } } } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/descriptor.h000066400000000000000000002562211334102242000276300ustar00rootroot00000000000000// 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. // // This file contains classes which describe a type of protocol message. // You can use a message's descriptor to learn at runtime what fields // it contains and what the types of those fields are. The Message // interface also allows you to dynamically access and modify individual // fields by passing the FieldDescriptor of the field you are interested // in. // // Most users will not care about descriptors, because they will write // code specific to certain protocol types and will simply use the classes // generated by the protocol compiler directly. Advanced users who want // to operate on arbitrary types (not known at compile time) may want to // read descriptors in order to learn about the contents of a message. // A very small number of users will want to construct their own // Descriptors, either because they are implementing Message manually or // because they are writing something like the protocol compiler. // // For an example of how you might use descriptors, see the code example // at the top of message.h. #ifndef GOOGLE_PROTOBUF_DESCRIPTOR_H__ #define GOOGLE_PROTOBUF_DESCRIPTOR_H__ #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include // TYPE_BOOL is defined in the MacOS's ConditionalMacros.h. #ifdef TYPE_BOOL #undef TYPE_BOOL #endif // TYPE_BOOL namespace google { namespace protobuf { // Defined in this file. class Descriptor; class FieldDescriptor; class OneofDescriptor; class EnumDescriptor; class EnumValueDescriptor; class ServiceDescriptor; class MethodDescriptor; class FileDescriptor; class DescriptorDatabase; class DescriptorPool; // Defined in descriptor.proto class DescriptorProto; class FieldDescriptorProto; class OneofDescriptorProto; class EnumDescriptorProto; class EnumValueDescriptorProto; class ServiceDescriptorProto; class MethodDescriptorProto; class FileDescriptorProto; class MessageOptions; class FieldOptions; class OneofOptions; class EnumOptions; class EnumValueOptions; class ExtensionRangeOptions; class ServiceOptions; class MethodOptions; class FileOptions; class UninterpretedOption; class SourceCodeInfo; // Defined in message.h class Message; // Defined in descriptor.cc class DescriptorBuilder; class FileDescriptorTables; struct Symbol; // Defined in unknown_field_set.h. class UnknownField; // Defined in generated_message_reflection.h. namespace internal { class GeneratedMessageReflection; } // namespace internal // Defined in command_line_interface.cc namespace compiler { class CommandLineInterface; } // namespace compiler namespace descriptor_unittest { class DescriptorTest; } // namespace descriptor_unittest // Defined in printer.h namespace io { class Printer; } // namespace io // NB, all indices are zero-based. struct SourceLocation { int start_line; int end_line; int start_column; int end_column; // Doc comments found at the source location. // See the comments in SourceCodeInfo.Location (descriptor.proto) for details. string leading_comments; string trailing_comments; std::vector leading_detached_comments; }; // Options when generating machine-parsable output from a descriptor with // DebugString(). struct DebugStringOptions { // include original user comments as recorded in SourceLocation entries. N.B. // that this must be |false| by default: several other pieces of code (for // example, the C++ code generation for fields in the proto compiler) rely on // DebugString() output being unobstructed by user comments. bool include_comments; // If true, elide the braced body in the debug string. bool elide_group_body; bool elide_oneof_body; DebugStringOptions() : include_comments(false), elide_group_body(false), elide_oneof_body(false) {} }; // A class to handle the simplest cases of a lazily linked descriptor // for a message type that isn't built at the time of cross linking, // which is needed when a pool has lazily_build_dependencies_ set. // Must be instantiated as mutable in a descriptor. namespace internal { class LIBPROTOBUF_EXPORT LazyDescriptor { public: // Init function to be called at init time of a descriptor containing // a LazyDescriptor. void Init() { descriptor_ = NULL; name_ = NULL; once_ = NULL; file_ = NULL; } // Sets the value of the descriptor if it is known during the descriptor // building process. Not thread safe, should only be called during the // descriptor build process. Should not be called after SetLazy has been // called. void Set(const Descriptor* descriptor); // Sets the information needed to lazily cross link the descriptor at a later // time, SetLazy is not thread safe, should be called only once at descriptor // 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(const string& 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, // building the descriptor file that contains the type if necessary. inline const Descriptor* Get() { Once(); return descriptor_; } private: static void OnceStatic(LazyDescriptor* lazy); void OnceInternal(); void Once(); const Descriptor* descriptor_; const string* name_; GoogleOnceDynamic* once_; const FileDescriptor* file_; }; } // namespace internal // Describes a type of protocol message, or a particular group within a // message. To obtain the Descriptor for a given message object, call // Message::GetDescriptor(). Generated message classes also have a // static method called descriptor() which returns the type's descriptor. // Use DescriptorPool to construct your own descriptors. class LIBPROTOBUF_EXPORT Descriptor { public: // The name of the message type, not including its scope. const string& name() const; // The fully-qualified name of the message type, scope delimited by // periods. For example, message type "Foo" which is declared in package // "bar" has full name "bar.Foo". If a type "Baz" is nested within // Foo, Baz's full_name is "bar.Foo.Baz". To get only the part that // comes after the last '.', use name(). const string& full_name() const; // Index of this descriptor within the file or containing type's message // type array. int index() const; // The .proto file in which this message type was defined. Never NULL. const FileDescriptor* file() const; // If this Descriptor describes a nested type, this returns the type // in which it is nested. Otherwise, returns NULL. const Descriptor* containing_type() const; // Get options for this message type. These are specified in the .proto file // by placing lines like "option foo = 1234;" in the message definition. // Allowed options are defined by MessageOptions in // google/protobuf/descriptor.proto, and any available extensions of that // message. const MessageOptions& options() const; // Write the contents of this Descriptor into the given DescriptorProto. // The target DescriptorProto must be clear before calling this; if it // isn't, the result may be garbage. void CopyTo(DescriptorProto* proto) const; // Write the contents of this decriptor in a human-readable form. Output // will be suitable for re-parsing. string DebugString() const; // Similar to DebugString(), but additionally takes options (e.g., // include original user comments in output). string DebugStringWithOptions(const DebugStringOptions& options) const; // Returns true if this is a placeholder for an unknown type. This will // only be the case if this descriptor comes from a DescriptorPool // with AllowUnknownDependencies() set. bool is_placeholder() const; // Field stuff ----------------------------------------------------- // The number of fields in this message type. int field_count() const; // Gets a field by index, where 0 <= index < field_count(). // These are returned in the order they were defined in the .proto file. const FieldDescriptor* field(int index) const; // Looks up a field by declared tag number. Returns NULL if no such field // exists. const FieldDescriptor* FindFieldByNumber(int number) const; // Looks up a field by name. Returns NULL if no such field exists. const FieldDescriptor* FindFieldByName(const string& 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( const string& 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( const string& camelcase_name) const; // The number of oneofs in this message type. int oneof_decl_count() const; // Get a oneof by index, where 0 <= index < oneof_decl_count(). // These are returned in the order they were defined in the .proto file. const OneofDescriptor* oneof_decl(int index) const; // Looks up a oneof by name. Returns NULL if no such oneof exists. const OneofDescriptor* FindOneofByName(const string& name) const; // Nested type stuff ----------------------------------------------- // The number of nested types in this message type. int nested_type_count() const; // Gets a nested type by index, where 0 <= index < nested_type_count(). // These are returned in the order they were defined in the .proto file. const Descriptor* nested_type(int index) const; // Looks up a nested type by name. Returns NULL if no such nested type // exists. const Descriptor* FindNestedTypeByName(const string& name) const; // Enum stuff ------------------------------------------------------ // The number of enum types in this message type. int enum_type_count() const; // Gets an enum type by index, where 0 <= index < enum_type_count(). // These are returned in the order they were defined in the .proto file. const EnumDescriptor* enum_type(int index) const; // Looks up an enum type by name. Returns NULL if no such enum type exists. const EnumDescriptor* FindEnumTypeByName(const string& name) const; // Looks up an enum value by name, among all enum types in this message. // Returns NULL if no such value exists. const EnumValueDescriptor* FindEnumValueByName(const string& name) const; // Extensions ------------------------------------------------------ // A range of field numbers which are designated for third-party // extensions. struct ExtensionRange { typedef ExtensionRangeOptions OptionsType; int start; // inclusive int end; // exclusive const ExtensionRangeOptions* options_; }; // The number of extension ranges in this message type. int extension_range_count() const; // Gets an extension range by index, where 0 <= index < // extension_range_count(). These are returned in the order they were defined // in the .proto file. const ExtensionRange* extension_range(int index) const; // Returns true if the number is in one of the extension ranges. bool IsExtensionNumber(int number) const; // Returns NULL if no extension range contains the given number. const ExtensionRange* FindExtensionRangeContainingNumber(int number) const; // The number of extensions -- extending *other* messages -- that were // defined nested within this message type's scope. int extension_count() const; // Get an extension by index, where 0 <= index < extension_count(). // These are returned in the order they were defined in the .proto file. const FieldDescriptor* extension(int index) const; // Looks up a named extension (which extends some *other* message type) // defined within this message type's scope. const FieldDescriptor* FindExtensionByName(const string& name) const; // Similar to FindFieldByLowercaseName(), but finds extensions defined within // this message type's scope. const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const; // Similar to FindFieldByCamelcaseName(), but finds extensions defined within // this message type's scope. const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const; // Reserved fields ------------------------------------------------- // A range of reserved field numbers. struct ReservedRange { int start; // inclusive int end; // exclusive }; // The number of reserved ranges in this message type. int reserved_range_count() const; // Gets an reserved range by index, where 0 <= index < // reserved_range_count(). These are returned in the order they were defined // in the .proto file. const ReservedRange* reserved_range(int index) const; // Returns true if the number is in one of the reserved ranges. bool IsReservedNumber(int number) const; // Returns NULL if no reserved range contains the given number. const ReservedRange* FindReservedRangeContainingNumber(int number) const; // The number of reserved field names in this message type. int reserved_name_count() const; // Gets a reserved name by index, where 0 <= index < reserved_name_count(). const string& reserved_name(int index) const; // Returns true if the field name is reserved. bool IsReservedName(const string& name) const; // Source Location --------------------------------------------------- // Updates |*out_location| to the source location of the complete // extent of this message declaration. Returns false and leaves // |*out_location| unchanged iff location information was not available. bool GetSourceLocation(SourceLocation* out_location) const; private: typedef MessageOptions OptionsType; // Allows tests to test CopyTo(proto, true). friend class ::google::protobuf::descriptor_unittest::DescriptorTest; // Allows access to GetLocationPath for annotations. friend class ::google::protobuf::io::Printer; // Fill the json_name field of FieldDescriptorProto. void CopyJsonNameTo(DescriptorProto* proto) const; // Internal version of DebugString; controls the level of indenting for // correct depth. Takes |options| to control debug-string options, and // |include_opening_clause| to indicate whether the "message ... " part of the // clause has already been generated (this varies depending on context). void DebugString(int depth, string *contents, const DebugStringOptions& options, bool include_opening_clause) const; // Walks up the descriptor tree to generate the source location path // to this descriptor from the file root. void GetLocationPath(std::vector* output) const; const string* name_; const string* full_name_; const FileDescriptor* file_; const Descriptor* containing_type_; const MessageOptions* options_; // These arrays are separated from their sizes to minimize padding on 64-bit. FieldDescriptor* fields_; OneofDescriptor* oneof_decls_; Descriptor* nested_types_; EnumDescriptor* enum_types_; ExtensionRange* extension_ranges_; FieldDescriptor* extensions_; ReservedRange* reserved_ranges_; const string** reserved_names_; int field_count_; int oneof_decl_count_; int nested_type_count_; int enum_type_count_; int extension_range_count_; int extension_count_; int reserved_range_count_; int reserved_name_count_; // True if this is a placeholder for an unknown type. bool is_placeholder_; // True if this is a placeholder and the type name wasn't fully-qualified. bool is_unqualified_placeholder_; // IMPORTANT: If you add a new field, make sure to search for all instances // of Allocate() and AllocateArray() in descriptor.cc // and update them to initialize the field. // Must be constructed using DescriptorPool. Descriptor() {} friend class DescriptorBuilder; friend class DescriptorPool; friend class EnumDescriptor; friend class FieldDescriptor; friend class OneofDescriptor; friend class MethodDescriptor; friend class FileDescriptor; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Descriptor); }; // Describes a single field of a message. To get the descriptor for a given // field, first get the Descriptor for the message in which it is defined, // then call Descriptor::FindFieldByName(). To get a FieldDescriptor for // an extension, do one of the following: // - Get the Descriptor or FileDescriptor for its containing scope, then // call Descriptor::FindExtensionByName() or // FileDescriptor::FindExtensionByName(). // - Given a DescriptorPool, call DescriptorPool::FindExtensionByNumber(). // - Given a Reflection for a message object, call // Reflection::FindKnownExtensionByName() or // Reflection::FindKnownExtensionByNumber(). // Use DescriptorPool to construct your own descriptors. class LIBPROTOBUF_EXPORT FieldDescriptor { public: // 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 { TYPE_DOUBLE = 1, // double, exactly eight bytes on the wire. TYPE_FLOAT = 2, // float, exactly four bytes on the wire. TYPE_INT64 = 3, // int64, varint on the wire. Negative numbers // take 10 bytes. Use TYPE_SINT64 if negative // values are likely. TYPE_UINT64 = 4, // uint64, varint on the wire. TYPE_INT32 = 5, // int32, varint on the wire. Negative numbers // take 10 bytes. Use TYPE_SINT32 if negative // values are likely. TYPE_FIXED64 = 6, // uint64, exactly eight bytes on the wire. TYPE_FIXED32 = 7, // uint32, exactly four bytes on the wire. TYPE_BOOL = 8, // bool, varint on the wire. TYPE_STRING = 9, // UTF-8 text. TYPE_GROUP = 10, // Tag-delimited message. Deprecated. TYPE_MESSAGE = 11, // Length-delimited message. TYPE_BYTES = 12, // Arbitrary byte array. TYPE_UINT32 = 13, // uint32, varint on the wire TYPE_ENUM = 14, // Enum, varint on the wire TYPE_SFIXED32 = 15, // int32, exactly four bytes on the wire TYPE_SFIXED64 = 16, // int64, exactly eight bytes on the wire TYPE_SINT32 = 17, // int32, ZigZag-encoded varint on the wire TYPE_SINT64 = 18, // int64, ZigZag-encoded varint on the wire MAX_TYPE = 18, // Constant useful for defining lookup tables // indexed by Type. }; // Specifies the C++ data type used to represent the field. There is a // fixed mapping from Type to CppType where each Type maps to exactly one // CppType. 0 is reserved for errors. enum CppType { CPPTYPE_INT32 = 1, // TYPE_INT32, TYPE_SINT32, TYPE_SFIXED32 CPPTYPE_INT64 = 2, // TYPE_INT64, TYPE_SINT64, TYPE_SFIXED64 CPPTYPE_UINT32 = 3, // TYPE_UINT32, TYPE_FIXED32 CPPTYPE_UINT64 = 4, // TYPE_UINT64, TYPE_FIXED64 CPPTYPE_DOUBLE = 5, // TYPE_DOUBLE CPPTYPE_FLOAT = 6, // TYPE_FLOAT CPPTYPE_BOOL = 7, // TYPE_BOOL CPPTYPE_ENUM = 8, // TYPE_ENUM CPPTYPE_STRING = 9, // TYPE_STRING, TYPE_BYTES CPPTYPE_MESSAGE = 10, // TYPE_MESSAGE, TYPE_GROUP MAX_CPPTYPE = 10, // Constant useful for defining lookup tables // indexed by CppType. }; // Identifies whether the field is optional, required, or repeated. 0 is // reserved for errors. enum Label { LABEL_OPTIONAL = 1, // optional LABEL_REQUIRED = 2, // required LABEL_REPEATED = 3, // repeated MAX_LABEL = 3, // Constant useful for defining lookup tables // indexed by Label. }; // Valid field numbers are positive integers up to kMaxNumber. static const int kMaxNumber = (1 << 29) - 1; // First field number reserved for the protocol buffer library implementation. // Users may not declare fields that use reserved numbers. static const int kFirstReservedNumber = 19000; // Last field number reserved for the protocol buffer library implementation. // Users may not declare fields that use reserved numbers. static const int kLastReservedNumber = 19999; const string& name() const; // Name of this field within the message. const string& full_name() const; // Fully-qualified name of the field. const string& json_name() const; // JSON name of this field. const FileDescriptor* file() const;// File in which this field was defined. bool is_extension() const; // Is this an extension field? int number() const; // Declared tag number. // Same as name() except converted to lower-case. This (and especially the // FindFieldByLowercaseName() method) can be useful when parsing formats // which prefer to use lowercase naming style. (Although, technically // field names should be lowercased anyway according to the protobuf style // guide, so this only makes a difference when dealing with old .proto files // which do not follow the guide.) const string& lowercase_name() const; // Same as name() except converted to camel-case. In this conversion, any // time an underscore appears in the name, it is removed and the next // letter is capitalized. Furthermore, the first letter of the name is // lower-cased. Examples: // FooBar -> fooBar // foo_bar -> fooBar // fooBar -> fooBar // This (and especially the FindFieldByCamelcaseName() method) can be useful // when parsing formats which prefer to use camel-case naming style. const string& camelcase_name() const; Type type() const; // Declared type of this field. const char* type_name() const; // Name of the declared type. CppType cpp_type() const; // C++ type of this field. const char* cpp_type_name() const; // Name of the C++ type. Label label() const; // optional/required/repeated bool is_required() const; // shorthand for label() == LABEL_REQUIRED bool is_optional() const; // shorthand for label() == LABEL_OPTIONAL bool is_repeated() const; // shorthand for label() == LABEL_REPEATED bool is_packable() const; // shorthand for is_repeated() && // IsTypePackable(type()) bool is_packed() const; // shorthand for is_packable() && // options().packed() bool is_map() const; // shorthand for type() == TYPE_MESSAGE && // message_type()->options().map_entry() // Index of this field within the message's field array, or the file or // extension scope's extensions array. int index() const; // Does this field have an explicitly-declared default value? bool has_default_value() const; // Whether the user has specified the json_name field option in the .proto // file. bool has_json_name() const; // Get the field default value if cpp_type() == CPPTYPE_INT32. If no // explicit default was defined, the default is 0. int32 default_value_int32() const; // Get the field default value if cpp_type() == CPPTYPE_INT64. If no // explicit default was defined, the default is 0. int64 default_value_int64() const; // Get the field default value if cpp_type() == CPPTYPE_UINT32. If no // explicit default was defined, the default is 0. uint32 default_value_uint32() const; // Get the field default value if cpp_type() == CPPTYPE_UINT64. If no // explicit default was defined, the default is 0. uint64 default_value_uint64() const; // Get the field default value if cpp_type() == CPPTYPE_FLOAT. If no // explicit default was defined, the default is 0.0. float default_value_float() const; // Get the field default value if cpp_type() == CPPTYPE_DOUBLE. If no // explicit default was defined, the default is 0.0. double default_value_double() const; // Get the field default value if cpp_type() == CPPTYPE_BOOL. If no // explicit default was defined, the default is false. bool default_value_bool() const; // Get the field default value if cpp_type() == CPPTYPE_ENUM. If no // explicit default was defined, the default is the first value defined // in the enum type (all enum types are required to have at least one value). // This never returns NULL. const EnumValueDescriptor* default_value_enum() const; // Get the field default value if cpp_type() == CPPTYPE_STRING. If no // explicit default was defined, the default is the empty string. const string& default_value_string() const; // The Descriptor for the message of which this is a field. For extensions, // this is the extended type. Never NULL. const Descriptor* containing_type() const; // If the field is a member of a oneof, this is the one, otherwise this is // NULL. const OneofDescriptor* containing_oneof() const; // If the field is a member of a oneof, returns the index in that oneof. int index_in_oneof() const; // An extension may be declared within the scope of another message. If this // field is an extension (is_extension() is true), then extension_scope() // returns that message, or NULL if the extension was declared at global // scope. If this is not an extension, extension_scope() is undefined (may // assert-fail). const Descriptor* extension_scope() const; // If type is TYPE_MESSAGE or TYPE_GROUP, returns a descriptor for the // message or the group type. Otherwise, returns null. const Descriptor* message_type() const; // If type is TYPE_ENUM, returns a descriptor for the enum. Otherwise, // returns null. const EnumDescriptor* enum_type() const; // Get the FieldOptions for this field. This includes things listed in // square brackets after the field definition. E.g., the field: // optional string text = 1 [ctype=CORD]; // has the "ctype" option set. Allowed options are defined by FieldOptions // in google/protobuf/descriptor.proto, and any available extensions of that // message. const FieldOptions& options() const; // See Descriptor::CopyTo(). void CopyTo(FieldDescriptorProto* proto) const; // See Descriptor::DebugString(). string DebugString() const; // See Descriptor::DebugStringWithOptions(). string DebugStringWithOptions(const DebugStringOptions& options) const; // Helper method to get the CppType for a particular Type. static CppType TypeToCppType(Type type); // Helper method to get the name of a Type. static const char* TypeName(Type type); // Helper method to get the name of a CppType. static const char* CppTypeName(CppType cpp_type); // Return true iff [packed = true] is valid for fields of this type. static inline bool IsTypePackable(Type field_type); // Source Location --------------------------------------------------- // Updates |*out_location| to the source location of the complete // extent of this field declaration. Returns false and leaves // |*out_location| unchanged iff location information was not available. bool GetSourceLocation(SourceLocation* out_location) const; private: typedef FieldOptions OptionsType; // Allows access to GetLocationPath for annotations. friend class ::google::protobuf::io::Printer; // Fill the json_name field of FieldDescriptorProto. void CopyJsonNameTo(FieldDescriptorProto* proto) const; // See Descriptor::DebugString(). enum PrintLabelFlag { PRINT_LABEL, OMIT_LABEL }; void DebugString(int depth, PrintLabelFlag print_label_flag, string* contents, const DebugStringOptions& options) const; // 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. string DefaultValueAsString(bool quote_string_type) const; // Helper function that returns the field type name for DebugString. string FieldTypeNameDebugString() const; // Walks up the descriptor tree to generate the source location path // to this descriptor from the file root. void GetLocationPath(std::vector* output) const; // Returns true if this is a map message type. bool is_map_message_type() const; const string* name_; const string* full_name_; const string* lowercase_name_; const string* camelcase_name_; // If has_json_name_ is true, it's the value specified by the user. // Otherwise, it has the same value as camelcase_name_. const string* json_name_; const FileDescriptor* file_; GoogleOnceDynamic* type_once_; static void TypeOnceInit(const FieldDescriptor* to_init); void InternalTypeOnceInit() const; mutable Type type_; Label label_; bool has_default_value_; // Whether the user has specified the json_name field option in the .proto // file. bool has_json_name_; bool is_extension_; int number_; int index_in_oneof_; const Descriptor* containing_type_; const OneofDescriptor* containing_oneof_; const Descriptor* extension_scope_; mutable const Descriptor* message_type_; mutable const EnumDescriptor* enum_type_; const FieldOptions* options_; const string* type_name_; const string* default_value_enum_name_; // IMPORTANT: If you add a new field, make sure to search for all instances // of Allocate() and AllocateArray() in // descriptor.cc and update them to initialize the field. union { int32 default_value_int32_; int64 default_value_int64_; uint32 default_value_uint32_; uint64 default_value_uint64_; float default_value_float_; double default_value_double_; bool default_value_bool_; mutable const EnumValueDescriptor* default_value_enum_; const string* default_value_string_; }; static const CppType kTypeToCppTypeMap[MAX_TYPE + 1]; static const char * const kTypeToName[MAX_TYPE + 1]; static const char * const kCppTypeToName[MAX_CPPTYPE + 1]; static const char * const kLabelToName[MAX_LABEL + 1]; // Must be constructed using DescriptorPool. FieldDescriptor() {} friend class DescriptorBuilder; friend class FileDescriptor; friend class Descriptor; friend class OneofDescriptor; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldDescriptor); }; // Describes a oneof defined in a message type. class LIBPROTOBUF_EXPORT OneofDescriptor { public: const string& name() const; // Name of this oneof. const string& full_name() const; // Fully-qualified name of the oneof. // Index of this oneof within the message's oneof array. int index() const; // The .proto file in which this oneof was defined. Never NULL. const FileDescriptor* file() const; // The Descriptor for the message containing this oneof. const Descriptor* containing_type() const; // The number of (non-extension) fields which are members of this oneof. int field_count() const; // Get a member of this oneof, in the order in which they were declared in the // .proto file. Does not include extensions. const FieldDescriptor* field(int index) const; const OneofOptions& options() const; // See Descriptor::CopyTo(). void CopyTo(OneofDescriptorProto* proto) const; // See Descriptor::DebugString(). string DebugString() const; // See Descriptor::DebugStringWithOptions(). string DebugStringWithOptions(const DebugStringOptions& options) const; // Source Location --------------------------------------------------- // Updates |*out_location| to the source location of the complete // extent of this oneof declaration. Returns false and leaves // |*out_location| unchanged iff location information was not available. bool GetSourceLocation(SourceLocation* out_location) const; private: typedef OneofOptions OptionsType; // Allows access to GetLocationPath for annotations. friend class ::google::protobuf::io::Printer; // See Descriptor::DebugString(). void DebugString(int depth, string* contents, const DebugStringOptions& options) const; // Walks up the descriptor tree to generate the source location path // to this descriptor from the file root. void GetLocationPath(std::vector* output) const; const string* name_; const string* full_name_; const Descriptor* containing_type_; bool is_extendable_; int field_count_; const FieldDescriptor** fields_; const OneofOptions* options_; // IMPORTANT: If you add a new field, make sure to search for all instances // of Allocate() and AllocateArray() // in descriptor.cc and update them to initialize the field. // Must be constructed using DescriptorPool. OneofDescriptor() {} friend class DescriptorBuilder; friend class Descriptor; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OneofDescriptor); }; // Describes an enum type defined in a .proto file. To get the EnumDescriptor // for a generated enum type, call TypeName_descriptor(). Use DescriptorPool // to construct your own descriptors. class LIBPROTOBUF_EXPORT EnumDescriptor { public: // The name of this enum type in the containing scope. const string& name() const; // The fully-qualified name of the enum type, scope delimited by periods. const string& full_name() const; // Index of this enum within the file or containing message's enum array. int index() const; // The .proto file in which this enum type was defined. Never NULL. const FileDescriptor* file() const; // The number of values for this EnumDescriptor. Guaranteed to be greater // than zero. int value_count() const; // Gets a value by index, where 0 <= index < value_count(). // These are returned in the order they were defined in the .proto file. const EnumValueDescriptor* value(int index) const; // Looks up a value by name. Returns NULL if no such value exists. const EnumValueDescriptor* FindValueByName(const string& name) const; // Looks up a value by number. Returns NULL if no such value exists. If // multiple values have this number, the first one defined is returned. const EnumValueDescriptor* FindValueByNumber(int number) const; // If this enum type is nested in a message type, this is that message type. // Otherwise, NULL. const Descriptor* containing_type() const; // Get options for this enum type. These are specified in the .proto file by // placing lines like "option foo = 1234;" in the enum definition. Allowed // options are defined by EnumOptions in google/protobuf/descriptor.proto, // and any available extensions of that message. const EnumOptions& options() const; // See Descriptor::CopyTo(). void CopyTo(EnumDescriptorProto* proto) const; // See Descriptor::DebugString(). string DebugString() const; // See Descriptor::DebugStringWithOptions(). string DebugStringWithOptions(const DebugStringOptions& options) const; // Returns true if this is a placeholder for an unknown enum. This will // only be the case if this descriptor comes from a DescriptorPool // with AllowUnknownDependencies() set. bool is_placeholder() const; // Reserved fields ------------------------------------------------- // A range of reserved field numbers. struct ReservedRange { int start; // inclusive int end; // inclusive }; // The number of reserved ranges in this message type. int reserved_range_count() const; // Gets an reserved range by index, where 0 <= index < // reserved_range_count(). These are returned in the order they were defined // in the .proto file. const EnumDescriptor::ReservedRange* reserved_range(int index) const; // Returns true if the number is in one of the reserved ranges. bool IsReservedNumber(int number) const; // Returns NULL if no reserved range contains the given number. const EnumDescriptor::ReservedRange* FindReservedRangeContainingNumber(int number) const; // The number of reserved field names in this message type. int reserved_name_count() const; // Gets a reserved name by index, where 0 <= index < reserved_name_count(). const string& reserved_name(int index) const; // Returns true if the field name is reserved. bool IsReservedName(const string& name) const; // Source Location --------------------------------------------------- // Updates |*out_location| to the source location of the complete // extent of this enum declaration. Returns false and leaves // |*out_location| unchanged iff location information was not available. bool GetSourceLocation(SourceLocation* out_location) const; private: typedef EnumOptions OptionsType; // Allows access to GetLocationPath for annotations. friend class ::google::protobuf::io::Printer; // Looks up a value by number. If the value does not exist, dynamically // creates a new EnumValueDescriptor for that value, assuming that it was // unknown. If a new descriptor is created, this is done in a thread-safe way, // and future calls will return the same value descriptor pointer. // // This is private but is used by GeneratedMessageReflection (which is // friended below) to return a valid EnumValueDescriptor from GetEnum() when // this feature is enabled. const EnumValueDescriptor* FindValueByNumberCreatingIfUnknown(int number) const; // See Descriptor::DebugString(). void DebugString(int depth, string *contents, const DebugStringOptions& options) const; // Walks up the descriptor tree to generate the source location path // to this descriptor from the file root. void GetLocationPath(std::vector* output) const; const string* name_; const string* full_name_; const FileDescriptor* file_; const Descriptor* containing_type_; const EnumOptions* options_; // True if this is a placeholder for an unknown type. bool is_placeholder_; // True if this is a placeholder and the type name wasn't fully-qualified. bool is_unqualified_placeholder_; int value_count_; EnumValueDescriptor* values_; int reserved_range_count_; int reserved_name_count_; EnumDescriptor::ReservedRange* reserved_ranges_; const string** reserved_names_; // IMPORTANT: If you add a new field, make sure to search for all instances // of Allocate() and AllocateArray() in // descriptor.cc and update them to initialize the field. // Must be constructed using DescriptorPool. EnumDescriptor() {} friend class DescriptorBuilder; friend class Descriptor; friend class FieldDescriptor; friend class EnumValueDescriptor; friend class FileDescriptor; friend class DescriptorPool; friend class internal::GeneratedMessageReflection; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumDescriptor); }; // Describes an individual enum constant of a particular type. To get the // EnumValueDescriptor for a given enum value, first get the EnumDescriptor // for its type, then use EnumDescriptor::FindValueByName() or // EnumDescriptor::FindValueByNumber(). Use DescriptorPool to construct // your own descriptors. class LIBPROTOBUF_EXPORT EnumValueDescriptor { public: const 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. // The full_name of an enum value is a sibling symbol of the enum type. // e.g. the full name of FieldDescriptorProto::TYPE_INT32 is actually // "google.protobuf.FieldDescriptorProto.TYPE_INT32", NOT // "google.protobuf.FieldDescriptorProto.Type.TYPE_INT32". This is to conform // with C++ scoping rules for enums. const string& full_name() const; // The .proto file in which this value was defined. Never NULL. const FileDescriptor* file() const; // The type of this value. Never NULL. const EnumDescriptor* type() const; // Get options for this enum value. These are specified in the .proto file // by adding text like "[foo = 1234]" after an enum value definition. // Allowed options are defined by EnumValueOptions in // google/protobuf/descriptor.proto, and any available extensions of that // message. const EnumValueOptions& options() const; // See Descriptor::CopyTo(). void CopyTo(EnumValueDescriptorProto* proto) const; // See Descriptor::DebugString(). string DebugString() const; // See Descriptor::DebugStringWithOptions(). string DebugStringWithOptions(const DebugStringOptions& options) const; // Source Location --------------------------------------------------- // Updates |*out_location| to the source location of the complete // extent of this enum value declaration. Returns false and leaves // |*out_location| unchanged iff location information was not available. bool GetSourceLocation(SourceLocation* out_location) const; private: typedef EnumValueOptions OptionsType; // Allows access to GetLocationPath for annotations. friend class ::google::protobuf::io::Printer; // See Descriptor::DebugString(). void DebugString(int depth, string *contents, const DebugStringOptions& options) const; // Walks up the descriptor tree to generate the source location path // to this descriptor from the file root. void GetLocationPath(std::vector* output) const; const string* name_; const string* full_name_; int number_; const EnumDescriptor* type_; const EnumValueOptions* options_; // IMPORTANT: If you add a new field, make sure to search for all instances // of Allocate() and AllocateArray() // in descriptor.cc and update them to initialize the field. // Must be constructed using DescriptorPool. EnumValueDescriptor() {} friend class DescriptorBuilder; friend class EnumDescriptor; friend class DescriptorPool; friend class FileDescriptorTables; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumValueDescriptor); }; // Describes an RPC service. To get the ServiceDescriptor for a service, // call Service::GetDescriptor(). Generated service classes also have a // static method called descriptor() which returns the type's // ServiceDescriptor. Use DescriptorPool to construct your own descriptors. class LIBPROTOBUF_EXPORT ServiceDescriptor { public: // The name of the service, not including its containing scope. const string& name() const; // The fully-qualified name of the service, scope delimited by periods. const string& full_name() const; // Index of this service within the file's services array. int index() const; // The .proto file in which this service was defined. Never NULL. const FileDescriptor* file() const; // Get options for this service type. These are specified in the .proto file // by placing lines like "option foo = 1234;" in the service definition. // Allowed options are defined by ServiceOptions in // google/protobuf/descriptor.proto, and any available extensions of that // message. const ServiceOptions& options() const; // The number of methods this service defines. int method_count() const; // Gets a MethodDescriptor by index, where 0 <= index < method_count(). // These are returned in the order they were defined in the .proto file. const MethodDescriptor* method(int index) const; // Look up a MethodDescriptor by name. const MethodDescriptor* FindMethodByName(const string& name) const; // See Descriptor::CopyTo(). void CopyTo(ServiceDescriptorProto* proto) const; // See Descriptor::DebugString(). string DebugString() const; // See Descriptor::DebugStringWithOptions(). string DebugStringWithOptions(const DebugStringOptions& options) const; // Source Location --------------------------------------------------- // Updates |*out_location| to the source location of the complete // extent of this service declaration. Returns false and leaves // |*out_location| unchanged iff location information was not available. bool GetSourceLocation(SourceLocation* out_location) const; private: typedef ServiceOptions OptionsType; // Allows access to GetLocationPath for annotations. friend class ::google::protobuf::io::Printer; // See Descriptor::DebugString(). void DebugString(string *contents, const DebugStringOptions& options) const; // Walks up the descriptor tree to generate the source location path // to this descriptor from the file root. void GetLocationPath(std::vector* output) const; const string* name_; const string* full_name_; const FileDescriptor* file_; const ServiceOptions* options_; MethodDescriptor* methods_; int method_count_; // IMPORTANT: If you add a new field, make sure to search for all instances // of Allocate() and AllocateArray() in // descriptor.cc and update them to initialize the field. // Must be constructed using DescriptorPool. ServiceDescriptor() {} friend class DescriptorBuilder; friend class FileDescriptor; friend class MethodDescriptor; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceDescriptor); }; // Describes an individual service method. To obtain a MethodDescriptor given // a service, first get its ServiceDescriptor, then call // ServiceDescriptor::FindMethodByName(). Use DescriptorPool to construct your // own descriptors. class LIBPROTOBUF_EXPORT MethodDescriptor { public: // Name of this method, not including containing scope. const string& name() const; // The fully-qualified name of the method, scope delimited by periods. const string& full_name() const; // Index within the service's Descriptor. int index() const; // The .proto file in which this method was defined. Never NULL. const FileDescriptor* file() const; // Gets the service to which this method belongs. Never NULL. const ServiceDescriptor* service() const; // Gets the type of protocol message which this method accepts as input. const Descriptor* input_type() const; // Gets the type of protocol message which this message produces as output. const Descriptor* output_type() const; // Gets whether the client streams multiple requests. bool client_streaming() const; // Gets whether the server streams multiple responses. bool server_streaming() const; // Get options for this method. These are specified in the .proto file by // placing lines like "option foo = 1234;" in curly-braces after a method // declaration. Allowed options are defined by MethodOptions in // google/protobuf/descriptor.proto, and any available extensions of that // message. const MethodOptions& options() const; // See Descriptor::CopyTo(). void CopyTo(MethodDescriptorProto* proto) const; // See Descriptor::DebugString(). string DebugString() const; // See Descriptor::DebugStringWithOptions(). string DebugStringWithOptions(const DebugStringOptions& options) const; // Source Location --------------------------------------------------- // Updates |*out_location| to the source location of the complete // extent of this method declaration. Returns false and leaves // |*out_location| unchanged iff location information was not available. bool GetSourceLocation(SourceLocation* out_location) const; private: typedef MethodOptions OptionsType; // Allows access to GetLocationPath for annotations. friend class ::google::protobuf::io::Printer; // See Descriptor::DebugString(). void DebugString(int depth, string *contents, const DebugStringOptions& options) const; // Walks up the descriptor tree to generate the source location path // to this descriptor from the file root. void GetLocationPath(std::vector* output) const; const string* name_; const string* full_name_; const ServiceDescriptor* service_; mutable internal::LazyDescriptor input_type_; mutable internal::LazyDescriptor output_type_; const MethodOptions* options_; bool client_streaming_; bool server_streaming_; // IMPORTANT: If you add a new field, make sure to search for all instances // of Allocate() and AllocateArray() in // descriptor.cc and update them to initialize the field. // Must be constructed using DescriptorPool. MethodDescriptor() {} friend class DescriptorBuilder; friend class ServiceDescriptor; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MethodDescriptor); }; // Describes a whole .proto file. To get the FileDescriptor for a compiled-in // file, get the descriptor for something defined in that file and call // descriptor->file(). Use DescriptorPool to construct your own descriptors. class LIBPROTOBUF_EXPORT FileDescriptor { public: // The filename, relative to the source tree. // e.g. "google/protobuf/descriptor.proto" const string& name() const; // The package, e.g. "google.protobuf.compiler". const string& package() const; // The DescriptorPool in which this FileDescriptor and all its contents were // allocated. Never NULL. const DescriptorPool* pool() const; // The number of files imported by this one. int dependency_count() const; // Gets an imported file by index, where 0 <= index < dependency_count(). // These are returned in the order they were defined in the .proto file. const FileDescriptor* dependency(int index) const; // The number of files public imported by this one. // The public dependency list is a subset of the dependency list. int public_dependency_count() const; // Gets a public imported file by index, where 0 <= index < // public_dependency_count(). // These are returned in the order they were defined in the .proto file. const FileDescriptor* public_dependency(int index) const; // The number of files that are imported for weak fields. // The weak dependency list is a subset of the dependency list. int weak_dependency_count() const; // Gets a weak imported file by index, where 0 <= index < // weak_dependency_count(). // These are returned in the order they were defined in the .proto file. const FileDescriptor* weak_dependency(int index) const; // Number of top-level message types defined in this file. (This does not // include nested types.) int message_type_count() const; // Gets a top-level message type, where 0 <= index < message_type_count(). // These are returned in the order they were defined in the .proto file. const Descriptor* message_type(int index) const; // Number of top-level enum types defined in this file. (This does not // include nested types.) int enum_type_count() const; // Gets a top-level enum type, where 0 <= index < enum_type_count(). // These are returned in the order they were defined in the .proto file. const EnumDescriptor* enum_type(int index) const; // Number of services defined in this file. int service_count() const; // Gets a service, where 0 <= index < service_count(). // These are returned in the order they were defined in the .proto file. const ServiceDescriptor* service(int index) const; // Number of extensions defined at file scope. (This does not include // extensions nested within message types.) int extension_count() const; // Gets an extension's descriptor, where 0 <= index < extension_count(). // These are returned in the order they were defined in the .proto file. const FieldDescriptor* extension(int index) const; // Get options for this file. These are specified in the .proto file by // placing lines like "option foo = 1234;" at the top level, outside of any // other definitions. Allowed options are defined by FileOptions in // google/protobuf/descriptor.proto, and any available extensions of that // message. const FileOptions& options() const; // Syntax of this file. enum Syntax { SYNTAX_UNKNOWN = 0, SYNTAX_PROTO2 = 2, SYNTAX_PROTO3 = 3, }; Syntax syntax() const; static const char* SyntaxName(Syntax syntax); // Find a top-level message type by name. Returns NULL if not found. const Descriptor* FindMessageTypeByName(const string& name) const; // Find a top-level enum type by name. Returns NULL if not found. const EnumDescriptor* FindEnumTypeByName(const string& name) const; // Find an enum value defined in any top-level enum by name. Returns NULL if // not found. const EnumValueDescriptor* FindEnumValueByName(const string& name) const; // Find a service definition by name. Returns NULL if not found. const ServiceDescriptor* FindServiceByName(const string& name) const; // Find a top-level extension definition by name. Returns NULL if not found. const FieldDescriptor* FindExtensionByName(const string& name) const; // Similar to FindExtensionByName(), but searches by lowercased-name. See // Descriptor::FindFieldByLowercaseName(). const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const; // Similar to FindExtensionByName(), but searches by camelcased-name. See // Descriptor::FindFieldByCamelcaseName(). const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const; // See Descriptor::CopyTo(). // Notes: // - This method does NOT copy source code information since it is relatively // large and rarely needed. See CopySourceCodeInfoTo() below. void CopyTo(FileDescriptorProto* proto) const; // Write the source code information of this FileDescriptor into the given // FileDescriptorProto. See CopyTo() above. void CopySourceCodeInfoTo(FileDescriptorProto* proto) const; // Fill the json_name field of FieldDescriptorProto for all fields. Can only // be called after CopyTo(). void CopyJsonNameTo(FileDescriptorProto* proto) const; // See Descriptor::DebugString(). string DebugString() const; // See Descriptor::DebugStringWithOptions(). string DebugStringWithOptions(const DebugStringOptions& options) const; // Returns true if this is a placeholder for an unknown file. This will // only be the case if this descriptor comes from a DescriptorPool // with AllowUnknownDependencies() set. bool is_placeholder() const; // Updates |*out_location| to the source location of the complete extent of // this file declaration (namely, the empty path). bool GetSourceLocation(SourceLocation* out_location) const; // Updates |*out_location| to the source location of the complete // extent of the declaration or declaration-part denoted by |path|. // Returns false and leaves |*out_location| unchanged iff location // information was not available. (See SourceCodeInfo for // description of path encoding.) bool GetSourceLocation(const std::vector& path, SourceLocation* out_location) const; private: typedef FileOptions OptionsType; const string* name_; const string* package_; const DescriptorPool* pool_; GoogleOnceDynamic* dependencies_once_; static void DependenciesOnceInit(const FileDescriptor* to_init); void InternalDependenciesOnceInit() const; // These are arranged to minimze padding on 64-bit. int dependency_count_; int public_dependency_count_; int weak_dependency_count_; int message_type_count_; int enum_type_count_; int service_count_; int extension_count_; Syntax syntax_; bool is_placeholder_; // Indicates the FileDescriptor is completed building. Used to verify // that type accessor functions that can possibly build a dependent file // aren't called during the process of building the file. bool finished_building_; mutable const FileDescriptor** dependencies_; const string** dependencies_names_; int* public_dependencies_; int* weak_dependencies_; Descriptor* message_types_; EnumDescriptor* enum_types_; ServiceDescriptor* services_; FieldDescriptor* extensions_; const FileOptions* options_; const FileDescriptorTables* tables_; const SourceCodeInfo* source_code_info_; // IMPORTANT: If you add a new field, make sure to search for all instances // of Allocate() and AllocateArray() in // descriptor.cc and update them to initialize the field. FileDescriptor() {} friend class DescriptorBuilder; friend class DescriptorPool; friend class Descriptor; friend class FieldDescriptor; friend class internal::LazyDescriptor; friend class OneofDescriptor; friend class EnumDescriptor; friend class EnumValueDescriptor; friend class MethodDescriptor; friend class ServiceDescriptor; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileDescriptor); }; // =================================================================== // Used to construct descriptors. // // Normally you won't want to build your own descriptors. Message classes // constructed by the protocol compiler will provide them for you. However, // if you are implementing Message on your own, or if you are writing a // program which can operate on totally arbitrary types and needs to load // them from some sort of database, you might need to. // // Since Descriptors are composed of a whole lot of cross-linked bits of // data that would be a pain to put together manually, the // DescriptorPool class is provided to make the process easier. It can // take a FileDescriptorProto (defined in descriptor.proto), validate it, // and convert it to a set of nicely cross-linked Descriptors. // // DescriptorPool also helps with memory management. Descriptors are // composed of many objects containing static data and pointers to each // other. In all likelihood, when it comes time to delete this data, // you'll want to delete it all at once. In fact, it is not uncommon to // have a whole pool of descriptors all cross-linked with each other which // you wish to delete all at once. This class represents such a pool, and // handles the memory management for you. // // You can also search for descriptors within a DescriptorPool by name, and // extensions by number. class LIBPROTOBUF_EXPORT DescriptorPool { public: // Create a normal, empty DescriptorPool. DescriptorPool(); // Constructs a DescriptorPool that, when it can't find something among the // descriptors already in the pool, looks for it in the given // DescriptorDatabase. // Notes: // - If a DescriptorPool is constructed this way, its BuildFile*() methods // must not be called (they will assert-fail). The only way to populate // the pool with descriptors is to call the Find*By*() methods. // - The Find*By*() methods may block the calling thread if the // DescriptorDatabase blocks. This in turn means that parsing messages // may block if they need to look up extensions. // - The Find*By*() methods will use mutexes for thread-safety, thus making // them slower even when they don't have to fall back to the database. // In fact, even the Find*By*() methods of descriptor objects owned by // this pool will be slower, since they will have to obtain locks too. // - An ErrorCollector may optionally be given to collect validation errors // in files loaded from the database. If not given, errors will be printed // to GOOGLE_LOG(ERROR). Remember that files are built on-demand, so this // ErrorCollector may be called from any thread that calls one of the // Find*By*() methods. // - The DescriptorDatabase must not be mutated during the lifetime of // the DescriptorPool. Even if the client takes care to avoid data races, // changes to the content of the DescriptorDatabase may not be reflected // in subsequent lookups in the DescriptorPool. class ErrorCollector; explicit DescriptorPool(DescriptorDatabase* fallback_database, ErrorCollector* error_collector = NULL); ~DescriptorPool(); // Get a pointer to the generated pool. Generated protocol message classes // which are compiled into the binary will allocate their descriptors in // this pool. Do not add your own descriptors to this pool. static const DescriptorPool* generated_pool(); // Find a FileDescriptor in the pool by file name. Returns NULL if not // found. const FileDescriptor* FindFileByName(const string& 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 NULL. const FileDescriptor* FindFileContainingSymbol( const string& 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 NULL if not // found. const Descriptor* FindMessageTypeByName(const string& name) const; const FieldDescriptor* FindFieldByName(const string& name) const; const FieldDescriptor* FindExtensionByName(const string& name) const; const OneofDescriptor* FindOneofByName(const string& name) const; const EnumDescriptor* FindEnumTypeByName(const string& name) const; const EnumValueDescriptor* FindEnumValueByName(const string& name) const; const ServiceDescriptor* FindServiceByName(const string& name) const; const MethodDescriptor* FindMethodByName(const string& 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. const FieldDescriptor* FindExtensionByNumber(const Descriptor* extendee, int number) const; // Finds extensions of extendee. The extensions will be appended to // out in an undefined order. Only extensions defined directly in // this DescriptorPool or one of its underlays are guaranteed to be // found: extensions defined in the fallback database might not be found // depending on the database implementation. void FindAllExtensions(const Descriptor* extendee, std::vector* out) const; // Building descriptors -------------------------------------------- // When converting a FileDescriptorProto to a FileDescriptor, various // errors might be detected in the input. The caller may handle these // programmatically by implementing an ErrorCollector. class LIBPROTOBUF_EXPORT ErrorCollector { public: inline ErrorCollector() {} virtual ~ErrorCollector(); // These constants specify what exact part of the construct is broken. // This is useful e.g. for mapping the error back to an exact location // in a .proto file. enum ErrorLocation { NAME, // the symbol name, or the package name for files NUMBER, // field or extension range number TYPE, // field type EXTENDEE, // field extendee DEFAULT_VALUE, // field default value INPUT_TYPE, // method input type OUTPUT_TYPE, // method output type OPTION_NAME, // name in assignment OPTION_VALUE, // value in option assignment OTHER // some other problem }; // Reports an error in the FileDescriptorProto. Use this function if the // problem occurred should interrupt building the FileDescriptorProto. virtual void AddError( const string& filename, // File name in which the error occurred. const string& element_name, // Full name of the erroneous element. const Message* descriptor, // Descriptor of the erroneous element. ErrorLocation location, // One of the location constants, above. const string& message // Human-readable error message. ) = 0; // Reports a warning in the FileDescriptorProto. Use this function if the // problem occurred should NOT interrupt building the FileDescriptorProto. virtual void AddWarning( const string& /*filename*/, // File name in which the error occurred. const string& /*element_name*/, // Full name of the erroneous element. const Message* /*descriptor*/, // Descriptor of the erroneous element. ErrorLocation /*location*/, // One of the location constants, above. const string& /*message*/ // Human-readable error message. ) {} private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector); }; // Convert the FileDescriptorProto to real descriptors and place them in // this DescriptorPool. All dependencies of the file must already be in // the pool. Returns the resulting FileDescriptor, or NULL if there were // problems with the input (e.g. the message was invalid, or dependencies // were missing). Details about the errors are written to GOOGLE_LOG(ERROR). const FileDescriptor* BuildFile(const FileDescriptorProto& proto); // Same as BuildFile() except errors are sent to the given ErrorCollector. const FileDescriptor* BuildFileCollectingErrors( const FileDescriptorProto& proto, ErrorCollector* error_collector); // By default, it is an error if a FileDescriptorProto contains references // to types or other files that are not found in the DescriptorPool (or its // backing DescriptorDatabase, if any). If you call // AllowUnknownDependencies(), however, then unknown types and files // will be replaced by placeholder descriptors (which can be identified by // the is_placeholder() method). This can allow you to // perform some useful operations with a .proto file even if you do not // have access to other .proto files on which it depends. However, some // heuristics must be used to fill in the gaps in information, and these // can lead to descriptors which are inaccurate. For example, the // DescriptorPool may be forced to guess whether an unknown type is a message // or an enum, as well as what package it resides in. Furthermore, // placeholder types will not be discoverable via FindMessageTypeByName() // and similar methods, which could confuse some descriptor-based algorithms. // Generally, the results of this option should be handled with extreme care. void AllowUnknownDependencies() { allow_unknown_ = true; } // By default, weak imports are allowed to be missing, in which case we will // use a placeholder for the dependency and convert the field to be an Empty // message field. If you call EnforceWeakDependencies(true), however, the // DescriptorPool will report a import not found error. void EnforceWeakDependencies(bool enforce) { enforce_weak_ = enforce; } // Internal stuff -------------------------------------------------- // These methods MUST NOT be called from outside the proto2 library. // These methods may contain hidden pitfalls and may be removed in a // future library version. // Create a DescriptorPool which is overlaid on top of some other pool. // If you search for a descriptor in the overlay and it is not found, the // underlay will be searched as a backup. If the underlay has its own // underlay, that will be searched next, and so on. This also means that // files built in the overlay will be cross-linked with the underlay's // descriptors if necessary. The underlay remains property of the caller; // it must remain valid for the lifetime of the newly-constructed pool. // // Example: Say you want to parse a .proto file at runtime in order to use // its type with a DynamicMessage. Say this .proto file has dependencies, // but you know that all the dependencies will be things that are already // compiled into the binary. For ease of use, you'd like to load the types // right out of generated_pool() rather than have to parse redundant copies // of all these .protos and runtime. But, you don't want to add the parsed // types directly into generated_pool(): this is not allowed, and would be // bad design anyway. So, instead, you could use generated_pool() as an // underlay for a new DescriptorPool in which you add only the new file. // // WARNING: Use of underlays can lead to many subtle gotchas. Instead, // try to formulate what you want to do in terms of DescriptorDatabases. explicit DescriptorPool(const DescriptorPool* underlay); // Called by generated classes at init time to add their descriptors to // generated_pool. Do NOT call this in your own code! filename must be a // permanent string (e.g. a string literal). static void InternalAddGeneratedFile( const void* encoded_file_descriptor, int size); // Disallow [enforce_utf8 = false] in .proto files. void DisallowEnforceUtf8() { disallow_enforce_utf8_ = true; } // For internal use only: Gets a non-const pointer to the generated pool. // This is called at static-initialization time only, so thread-safety is // not a concern. If both an underlay and a fallback database are present, // the underlay takes precedence. static DescriptorPool* internal_generated_pool(); // For internal use only: Changes the behavior of BuildFile() such that it // allows the file to make reference to message types declared in other files // which it did not officially declare as dependencies. void InternalDontEnforceDependencies(); // For internal use only: Enables lazy building of dependencies of a file. // Delay the building of dependencies of a file descriptor until absolutely // necessary, like when message_type() is called on a field that is defined // in that dependency's file. This will cause functional issues if a proto // or one of it's dependencies has errors. Should only be enabled for the // generated_pool_ (because no descriptor build errors are guaranteed by // the compilation generation process), testing, or if a lack of descriptor // build errors can be guaranteed for a pool. void InternalSetLazilyBuildDependencies() { lazily_build_dependencies_ = true; // This needs to be set when lazily building dependencies, as it breaks // dependency checking. InternalDontEnforceDependencies(); } // For internal use only. void internal_set_underlay(const DescriptorPool* underlay) { underlay_ = underlay; } // 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(const string& filename) const; // Add a file to unused_import_track_files_. DescriptorBuilder will log // warnings for those files if there is any unused import. void AddUnusedImportTrackFile(const string& file_name); void ClearUnusedImportTrackFiles(); private: friend class Descriptor; friend class internal::LazyDescriptor; friend class FieldDescriptor; friend class EnumDescriptor; friend class ServiceDescriptor; friend class MethodDescriptor; friend class FileDescriptor; friend class StreamDescriptor; friend class DescriptorBuilder; friend class FileDescriptorTables; // 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(const string& 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(const string& name) const; bool TryFindSymbolInFallbackDatabase(const string& name) const; bool TryFindExtensionInFallbackDatabase(const Descriptor* containing_type, int field_number) const; // Like BuildFile() but called internally when the file has been loaded from // fallback_database_. Declared const because it is called by (semantically) // const methods. const FileDescriptor* BuildFileFromDatabase( const FileDescriptorProto& proto) const; // Helper for when lazily_build_dependencies_ is set, can look up a symbol // after the file's descriptor is built, and can build the file where that // 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(const string& name, bool expecting_enum) const; // Create a placeholder FileDescriptor of the specified name FileDescriptor* NewPlaceholderFile(const string& name) const; FileDescriptor* NewPlaceholderFileWithMutexHeld(const string& name) const; enum PlaceholderType { PLACEHOLDER_MESSAGE, PLACEHOLDER_ENUM, PLACEHOLDER_EXTENDABLE_MESSAGE }; // Create a placeholder Descriptor of the specified name Symbol NewPlaceholder(const string& name, PlaceholderType placeholder_type) const; Symbol NewPlaceholderWithMutexHeld(const string& name, PlaceholderType placeholder_type) const; // If fallback_database_ is NULL, this is NULL. Otherwise, this is a mutex // which must be locked while accessing tables_. Mutex* mutex_; // See constructor. DescriptorDatabase* fallback_database_; ErrorCollector* default_error_collector_; const DescriptorPool* underlay_; // This class contains a lot of hash maps with complicated types that // we'd like to keep out of the header. class Tables; google::protobuf::scoped_ptr tables_; bool enforce_dependencies_; bool lazily_build_dependencies_; bool allow_unknown_; bool enforce_weak_; bool disallow_enforce_utf8_; std::set unused_import_track_files_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPool); }; // inline methods ==================================================== // These macros makes this repetitive code more readable. #define PROTOBUF_DEFINE_ACCESSOR(CLASS, FIELD, TYPE) \ inline TYPE CLASS::FIELD() const { return FIELD##_; } // Strings fields are stored as pointers but returned as const references. #define PROTOBUF_DEFINE_STRING_ACCESSOR(CLASS, FIELD) \ inline const string& CLASS::FIELD() const { return *FIELD##_; } // Arrays take an index parameter, obviously. #define PROTOBUF_DEFINE_ARRAY_ACCESSOR(CLASS, FIELD, TYPE) \ inline TYPE CLASS::FIELD(int index) const { return FIELD##s_ + index; } #define PROTOBUF_DEFINE_OPTIONS_ACCESSOR(CLASS, TYPE) \ inline const TYPE& CLASS::options() const { return *options_; } PROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, name) PROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, full_name) PROTOBUF_DEFINE_ACCESSOR(Descriptor, file, const FileDescriptor*) PROTOBUF_DEFINE_ACCESSOR(Descriptor, containing_type, const Descriptor*) PROTOBUF_DEFINE_ACCESSOR(Descriptor, field_count, int) PROTOBUF_DEFINE_ACCESSOR(Descriptor, oneof_decl_count, int) PROTOBUF_DEFINE_ACCESSOR(Descriptor, nested_type_count, int) PROTOBUF_DEFINE_ACCESSOR(Descriptor, enum_type_count, int) PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, field, const FieldDescriptor*) PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, oneof_decl, const OneofDescriptor*) PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, nested_type, const Descriptor*) PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, enum_type, const EnumDescriptor*) PROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_range_count, int) PROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_count, int) PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension_range, const Descriptor::ExtensionRange*) PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension, const FieldDescriptor*) PROTOBUF_DEFINE_ACCESSOR(Descriptor, reserved_range_count, int) PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, reserved_range, const Descriptor::ReservedRange*) PROTOBUF_DEFINE_ACCESSOR(Descriptor, reserved_name_count, int) PROTOBUF_DEFINE_OPTIONS_ACCESSOR(Descriptor, MessageOptions) PROTOBUF_DEFINE_ACCESSOR(Descriptor, is_placeholder, bool) PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, name) PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, full_name) PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, json_name) PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, lowercase_name) PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, camelcase_name) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, file, const FileDescriptor*) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, number, int) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, is_extension, bool) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, label, FieldDescriptor::Label) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_type, const Descriptor*) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_oneof, const OneofDescriptor*) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, index_in_oneof, int) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, extension_scope, const Descriptor*) PROTOBUF_DEFINE_OPTIONS_ACCESSOR(FieldDescriptor, FieldOptions) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_default_value, bool) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_json_name, bool) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int32 , int32 ) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int64 , int64 ) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint32, uint32) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint64, uint64) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_float , float ) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_double, double) PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_bool , bool ) PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, default_value_string) PROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, name) PROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, full_name) PROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, containing_type, const Descriptor*) PROTOBUF_DEFINE_ACCESSOR(OneofDescriptor, field_count, int) PROTOBUF_DEFINE_OPTIONS_ACCESSOR(OneofDescriptor, OneofOptions) PROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, name) PROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, full_name) PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, file, const FileDescriptor*) PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, containing_type, const Descriptor*) PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, value_count, int) PROTOBUF_DEFINE_ARRAY_ACCESSOR(EnumDescriptor, value, const EnumValueDescriptor*) PROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumDescriptor, EnumOptions) PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, is_placeholder, bool) PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, reserved_range_count, int) PROTOBUF_DEFINE_ARRAY_ACCESSOR(EnumDescriptor, reserved_range, const EnumDescriptor::ReservedRange*) PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, reserved_name_count, int) PROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, name) PROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, full_name) PROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, number, int) PROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, type, const EnumDescriptor*) PROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumValueDescriptor, EnumValueOptions) PROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, name) PROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, full_name) PROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, file, const FileDescriptor*) PROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, method_count, int) PROTOBUF_DEFINE_ARRAY_ACCESSOR(ServiceDescriptor, method, const MethodDescriptor*) PROTOBUF_DEFINE_OPTIONS_ACCESSOR(ServiceDescriptor, ServiceOptions) PROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, name) PROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, full_name) PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, service, const ServiceDescriptor*) PROTOBUF_DEFINE_OPTIONS_ACCESSOR(MethodDescriptor, MethodOptions) PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, client_streaming, bool) PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, server_streaming, bool) PROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, name) PROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, package) PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, pool, const DescriptorPool*) PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, dependency_count, int) PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, public_dependency_count, int) PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, weak_dependency_count, int) PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, message_type_count, int) PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, enum_type_count, int) PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, service_count, int) PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, extension_count, int) PROTOBUF_DEFINE_OPTIONS_ACCESSOR(FileDescriptor, FileOptions) PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, is_placeholder, bool) PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, message_type, const Descriptor*) PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, enum_type, const EnumDescriptor*) PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, service, const ServiceDescriptor*) PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, extension, const FieldDescriptor*) #undef PROTOBUF_DEFINE_ACCESSOR #undef PROTOBUF_DEFINE_STRING_ACCESSOR #undef PROTOBUF_DEFINE_ARRAY_ACCESSOR // A few accessors differ from the macros... inline bool Descriptor::IsExtensionNumber(int number) const { return FindExtensionRangeContainingNumber(number) != NULL; } inline bool Descriptor::IsReservedNumber(int number) const { return FindReservedRangeContainingNumber(number) != NULL; } inline bool Descriptor::IsReservedName(const string& name) const { for (int i = 0; i < reserved_name_count(); i++) { if (name == reserved_name(i)) { return true; } } return false; } // Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because reserved_names_ is actually // an array of pointers rather than the usual array of objects. inline const string& Descriptor::reserved_name(int index) const { return *reserved_names_[index]; } inline bool EnumDescriptor::IsReservedNumber(int number) const { return FindReservedRangeContainingNumber(number) != NULL; } inline bool EnumDescriptor::IsReservedName(const string& name) const { for (int i = 0; i < reserved_name_count(); i++) { if (name == reserved_name(i)) { return true; } } return false; } // Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because reserved_names_ is actually // an array of pointers rather than the usual array of objects. inline const string& EnumDescriptor::reserved_name(int index) const { return *reserved_names_[index]; } inline FieldDescriptor::Type FieldDescriptor::type() const { if (type_once_) { type_once_->Init(&FieldDescriptor::TypeOnceInit, this); } return type_; } inline bool FieldDescriptor::is_required() const { return label() == LABEL_REQUIRED; } inline bool FieldDescriptor::is_optional() const { return label() == LABEL_OPTIONAL; } inline bool FieldDescriptor::is_repeated() const { return label() == LABEL_REPEATED; } inline bool FieldDescriptor::is_packable() const { return is_repeated() && IsTypePackable(type()); } inline bool FieldDescriptor::is_map() const { return type() == TYPE_MESSAGE && is_map_message_type(); } // 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 { if (!is_extension_) { return static_cast(this - containing_type()->fields_); } else if (extension_scope_ != NULL) { return static_cast(this - extension_scope_->extensions_); } else { return static_cast(this - file_->extensions_); } } inline int Descriptor::index() const { if (containing_type_ == NULL) { return static_cast(this - file_->message_types_); } else { return static_cast(this - containing_type_->nested_types_); } } inline const FileDescriptor* OneofDescriptor::file() const { return containing_type()->file(); } inline int OneofDescriptor::index() const { return static_cast(this - containing_type_->oneof_decls_); } inline int EnumDescriptor::index() const { if (containing_type_ == NULL) { return static_cast(this - file_->enum_types_); } else { return static_cast(this - containing_type_->enum_types_); } } inline const FileDescriptor* EnumValueDescriptor::file() const { return type()->file(); } inline int EnumValueDescriptor::index() const { return static_cast(this - type_->values_); } inline int ServiceDescriptor::index() const { return static_cast(this - file_->services_); } inline const FileDescriptor* MethodDescriptor::file() const { return service()->file(); } inline int MethodDescriptor::index() const { return static_cast(this - service_->methods_); } inline const char* FieldDescriptor::type_name() const { return kTypeToName[type()]; } inline FieldDescriptor::CppType FieldDescriptor::cpp_type() const { return kTypeToCppTypeMap[type()]; } inline const char* FieldDescriptor::cpp_type_name() const { return kCppTypeToName[kTypeToCppTypeMap[type()]]; } inline FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) { return kTypeToCppTypeMap[type]; } inline const char* FieldDescriptor::TypeName(Type type) { return kTypeToName[type]; } inline const char* FieldDescriptor::CppTypeName(CppType cpp_type) { return kCppTypeToName[cpp_type]; } inline bool FieldDescriptor::IsTypePackable(Type field_type) { return (field_type != FieldDescriptor::TYPE_STRING && field_type != FieldDescriptor::TYPE_GROUP && field_type != FieldDescriptor::TYPE_MESSAGE && field_type != FieldDescriptor::TYPE_BYTES); } inline const FileDescriptor* FileDescriptor::public_dependency( int index) const { return dependency(public_dependencies_[index]); } inline const FileDescriptor* FileDescriptor::weak_dependency( int index) const { return dependency(weak_dependencies_[index]); } inline FileDescriptor::Syntax FileDescriptor::syntax() const { return syntax_; } // Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because fields_ is actually an array // of pointers rather than the usual array of objects. inline const FieldDescriptor* OneofDescriptor::field(int index) const { return fields_[index]; } } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_DESCRIPTOR_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/descriptor.pb.cc000066400000000000000000021125131334102242000303630ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/descriptor.proto #include #include #include #include #include #include #include #include #include #include #include // This is a temporary google only hack #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS #include "third_party/protobuf/version.h" #endif // @@protoc_insertion_point(includes) namespace google { namespace protobuf { class FileDescriptorSetDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _FileDescriptorSet_default_instance_; class FileDescriptorProtoDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _FileDescriptorProto_default_instance_; class DescriptorProto_ExtensionRangeDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _DescriptorProto_ExtensionRange_default_instance_; class DescriptorProto_ReservedRangeDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _DescriptorProto_ReservedRange_default_instance_; class DescriptorProtoDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _DescriptorProto_default_instance_; class ExtensionRangeOptionsDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _ExtensionRangeOptions_default_instance_; class FieldDescriptorProtoDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _FieldDescriptorProto_default_instance_; class OneofDescriptorProtoDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _OneofDescriptorProto_default_instance_; class EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _EnumDescriptorProto_EnumReservedRange_default_instance_; class EnumDescriptorProtoDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _EnumDescriptorProto_default_instance_; class EnumValueDescriptorProtoDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _EnumValueDescriptorProto_default_instance_; class ServiceDescriptorProtoDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _ServiceDescriptorProto_default_instance_; class MethodDescriptorProtoDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _MethodDescriptorProto_default_instance_; class FileOptionsDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _FileOptions_default_instance_; class MessageOptionsDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _MessageOptions_default_instance_; class FieldOptionsDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _FieldOptions_default_instance_; class OneofOptionsDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _OneofOptions_default_instance_; class EnumOptionsDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _EnumOptions_default_instance_; class EnumValueOptionsDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _EnumValueOptions_default_instance_; class ServiceOptionsDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _ServiceOptions_default_instance_; class MethodOptionsDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _MethodOptions_default_instance_; class UninterpretedOption_NamePartDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _UninterpretedOption_NamePart_default_instance_; class UninterpretedOptionDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _UninterpretedOption_default_instance_; class SourceCodeInfo_LocationDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _SourceCodeInfo_Location_default_instance_; class SourceCodeInfoDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _SourceCodeInfo_default_instance_; class GeneratedCodeInfo_AnnotationDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _GeneratedCodeInfo_Annotation_default_instance_; class GeneratedCodeInfoDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _GeneratedCodeInfo_default_instance_; } // namespace protobuf } // namespace google namespace protobuf_google_2fprotobuf_2fdescriptor_2eproto { void InitDefaultsFileDescriptorSetImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProto(); { void* ptr = &::google::protobuf::_FileDescriptorSet_default_instance_; new (ptr) ::google::protobuf::FileDescriptorSet(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::FileDescriptorSet::InitAsDefaultInstance(); } void InitDefaultsFileDescriptorSet() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFileDescriptorSetImpl); } void InitDefaultsFileDescriptorProtoImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceDescriptorProto(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProto(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileOptions(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo(); { void* ptr = &::google::protobuf::_FileDescriptorProto_default_instance_; new (ptr) ::google::protobuf::FileDescriptorProto(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::FileDescriptorProto::InitAsDefaultInstance(); } void InitDefaultsFileDescriptorProto() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFileDescriptorProtoImpl); } void InitDefaultsDescriptorProto_ExtensionRangeImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsExtensionRangeOptions(); { void* ptr = &::google::protobuf::_DescriptorProto_ExtensionRange_default_instance_; new (ptr) ::google::protobuf::DescriptorProto_ExtensionRange(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::DescriptorProto_ExtensionRange::InitAsDefaultInstance(); } void InitDefaultsDescriptorProto_ExtensionRange() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsDescriptorProto_ExtensionRangeImpl); } void InitDefaultsDescriptorProto_ReservedRangeImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_DescriptorProto_ReservedRange_default_instance_; new (ptr) ::google::protobuf::DescriptorProto_ReservedRange(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::DescriptorProto_ReservedRange::InitAsDefaultInstance(); } void InitDefaultsDescriptorProto_ReservedRange() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsDescriptorProto_ReservedRangeImpl); } void InitDefaultsDescriptorProtoImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProto(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ExtensionRange(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofDescriptorProto(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMessageOptions(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ReservedRange(); { void* ptr = &::google::protobuf::_DescriptorProto_default_instance_; new (ptr) ::google::protobuf::DescriptorProto(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::DescriptorProto::InitAsDefaultInstance(); } void InitDefaultsDescriptorProto() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsDescriptorProtoImpl); } void InitDefaultsExtensionRangeOptionsImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); { void* ptr = &::google::protobuf::_ExtensionRangeOptions_default_instance_; new (ptr) ::google::protobuf::ExtensionRangeOptions(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::ExtensionRangeOptions::InitAsDefaultInstance(); } void InitDefaultsExtensionRangeOptions() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsExtensionRangeOptionsImpl); } void InitDefaultsFieldDescriptorProtoImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldOptions(); { void* ptr = &::google::protobuf::_FieldDescriptorProto_default_instance_; new (ptr) ::google::protobuf::FieldDescriptorProto(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::FieldDescriptorProto::InitAsDefaultInstance(); } void InitDefaultsFieldDescriptorProto() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFieldDescriptorProtoImpl); } void InitDefaultsOneofDescriptorProtoImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofOptions(); { void* ptr = &::google::protobuf::_OneofDescriptorProto_default_instance_; new (ptr) ::google::protobuf::OneofDescriptorProto(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::OneofDescriptorProto::InitAsDefaultInstance(); } void InitDefaultsOneofDescriptorProto() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsOneofDescriptorProtoImpl); } void InitDefaultsEnumDescriptorProto_EnumReservedRangeImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_EnumDescriptorProto_EnumReservedRange_default_instance_; new (ptr) ::google::protobuf::EnumDescriptorProto_EnumReservedRange(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::EnumDescriptorProto_EnumReservedRange::InitAsDefaultInstance(); } void InitDefaultsEnumDescriptorProto_EnumReservedRange() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumDescriptorProto_EnumReservedRangeImpl); } void InitDefaultsEnumDescriptorProtoImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueDescriptorProto(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumOptions(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto_EnumReservedRange(); { void* ptr = &::google::protobuf::_EnumDescriptorProto_default_instance_; new (ptr) ::google::protobuf::EnumDescriptorProto(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::EnumDescriptorProto::InitAsDefaultInstance(); } void InitDefaultsEnumDescriptorProto() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumDescriptorProtoImpl); } void InitDefaultsEnumValueDescriptorProtoImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueOptions(); { void* ptr = &::google::protobuf::_EnumValueDescriptorProto_default_instance_; new (ptr) ::google::protobuf::EnumValueDescriptorProto(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::EnumValueDescriptorProto::InitAsDefaultInstance(); } void InitDefaultsEnumValueDescriptorProto() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumValueDescriptorProtoImpl); } void InitDefaultsServiceDescriptorProtoImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodDescriptorProto(); protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceOptions(); { void* ptr = &::google::protobuf::_ServiceDescriptorProto_default_instance_; new (ptr) ::google::protobuf::ServiceDescriptorProto(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::ServiceDescriptorProto::InitAsDefaultInstance(); } void InitDefaultsServiceDescriptorProto() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsServiceDescriptorProtoImpl); } void InitDefaultsMethodDescriptorProtoImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodOptions(); { void* ptr = &::google::protobuf::_MethodDescriptorProto_default_instance_; new (ptr) ::google::protobuf::MethodDescriptorProto(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::MethodDescriptorProto::InitAsDefaultInstance(); } void InitDefaultsMethodDescriptorProto() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsMethodDescriptorProtoImpl); } void InitDefaultsFileOptionsImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); { void* ptr = &::google::protobuf::_FileOptions_default_instance_; new (ptr) ::google::protobuf::FileOptions(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::FileOptions::InitAsDefaultInstance(); } void InitDefaultsFileOptions() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFileOptionsImpl); } void InitDefaultsMessageOptionsImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); { void* ptr = &::google::protobuf::_MessageOptions_default_instance_; new (ptr) ::google::protobuf::MessageOptions(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::MessageOptions::InitAsDefaultInstance(); } void InitDefaultsMessageOptions() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsMessageOptionsImpl); } void InitDefaultsFieldOptionsImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); { void* ptr = &::google::protobuf::_FieldOptions_default_instance_; new (ptr) ::google::protobuf::FieldOptions(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::FieldOptions::InitAsDefaultInstance(); } void InitDefaultsFieldOptions() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFieldOptionsImpl); } void InitDefaultsOneofOptionsImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); { void* ptr = &::google::protobuf::_OneofOptions_default_instance_; new (ptr) ::google::protobuf::OneofOptions(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::OneofOptions::InitAsDefaultInstance(); } void InitDefaultsOneofOptions() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsOneofOptionsImpl); } void InitDefaultsEnumOptionsImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); { void* ptr = &::google::protobuf::_EnumOptions_default_instance_; new (ptr) ::google::protobuf::EnumOptions(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::EnumOptions::InitAsDefaultInstance(); } void InitDefaultsEnumOptions() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumOptionsImpl); } void InitDefaultsEnumValueOptionsImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); { void* ptr = &::google::protobuf::_EnumValueOptions_default_instance_; new (ptr) ::google::protobuf::EnumValueOptions(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::EnumValueOptions::InitAsDefaultInstance(); } void InitDefaultsEnumValueOptions() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEnumValueOptionsImpl); } void InitDefaultsServiceOptionsImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); { void* ptr = &::google::protobuf::_ServiceOptions_default_instance_; new (ptr) ::google::protobuf::ServiceOptions(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::ServiceOptions::InitAsDefaultInstance(); } void InitDefaultsServiceOptions() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsServiceOptionsImpl); } void InitDefaultsMethodOptionsImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); { void* ptr = &::google::protobuf::_MethodOptions_default_instance_; new (ptr) ::google::protobuf::MethodOptions(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::MethodOptions::InitAsDefaultInstance(); } void InitDefaultsMethodOptions() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsMethodOptionsImpl); } void InitDefaultsUninterpretedOption_NamePartImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_UninterpretedOption_NamePart_default_instance_; new (ptr) ::google::protobuf::UninterpretedOption_NamePart(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::UninterpretedOption_NamePart::InitAsDefaultInstance(); } void InitDefaultsUninterpretedOption_NamePart() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsUninterpretedOption_NamePartImpl); } void InitDefaultsUninterpretedOptionImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption_NamePart(); { void* ptr = &::google::protobuf::_UninterpretedOption_default_instance_; new (ptr) ::google::protobuf::UninterpretedOption(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::UninterpretedOption::InitAsDefaultInstance(); } void InitDefaultsUninterpretedOption() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsUninterpretedOptionImpl); } void InitDefaultsSourceCodeInfo_LocationImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_SourceCodeInfo_Location_default_instance_; new (ptr) ::google::protobuf::SourceCodeInfo_Location(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::SourceCodeInfo_Location::InitAsDefaultInstance(); } void InitDefaultsSourceCodeInfo_Location() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsSourceCodeInfo_LocationImpl); } void InitDefaultsSourceCodeInfoImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo_Location(); { void* ptr = &::google::protobuf::_SourceCodeInfo_default_instance_; new (ptr) ::google::protobuf::SourceCodeInfo(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::SourceCodeInfo::InitAsDefaultInstance(); } void InitDefaultsSourceCodeInfo() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsSourceCodeInfoImpl); } void InitDefaultsGeneratedCodeInfo_AnnotationImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_GeneratedCodeInfo_Annotation_default_instance_; new (ptr) ::google::protobuf::GeneratedCodeInfo_Annotation(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::GeneratedCodeInfo_Annotation::InitAsDefaultInstance(); } void InitDefaultsGeneratedCodeInfo_Annotation() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsGeneratedCodeInfo_AnnotationImpl); } void InitDefaultsGeneratedCodeInfoImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo_Annotation(); { void* ptr = &::google::protobuf::_GeneratedCodeInfo_default_instance_; new (ptr) ::google::protobuf::GeneratedCodeInfo(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::GeneratedCodeInfo::InitAsDefaultInstance(); } void InitDefaultsGeneratedCodeInfo() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsGeneratedCodeInfoImpl); } ::google::protobuf::Metadata file_level_metadata[27]; const ::google::protobuf::EnumDescriptor* file_level_enum_descriptors[6]; const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorSet, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorSet, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorSet, file_), ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, package_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, dependency_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, public_dependency_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, weak_dependency_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, message_type_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, enum_type_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, service_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, extension_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, options_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, source_code_info_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileDescriptorProto, syntax_), 0, 1, ~0u, ~0u, ~0u, ~0u, ~0u, ~0u, ~0u, 3, 4, 2, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, start_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, end_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ExtensionRange, options_), 1, 2, 0, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ReservedRange, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ReservedRange, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ReservedRange, start_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto_ReservedRange, end_), 0, 1, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, field_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, extension_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, nested_type_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, enum_type_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, extension_range_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, oneof_decl_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, options_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, reserved_range_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::DescriptorProto, reserved_name_), 0, ~0u, ~0u, ~0u, ~0u, ~0u, ~0u, 1, ~0u, ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _internal_metadata_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, _extensions_), ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ExtensionRangeOptions, uninterpreted_option_), ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, number_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, label_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, type_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, type_name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, extendee_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, default_value_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, oneof_index_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, json_name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldDescriptorProto, options_), 0, 6, 8, 9, 2, 1, 3, 7, 4, 5, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofDescriptorProto, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofDescriptorProto, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofDescriptorProto, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofDescriptorProto, options_), 0, 1, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto_EnumReservedRange, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto_EnumReservedRange, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto_EnumReservedRange, start_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto_EnumReservedRange, end_), 0, 1, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, value_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, options_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, reserved_range_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumDescriptorProto, reserved_name_), 0, ~0u, 1, ~0u, ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, number_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueDescriptorProto, options_), 0, 2, 1, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, method_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceDescriptorProto, options_), 0, ~0u, 1, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, input_type_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, output_type_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, options_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, client_streaming_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodDescriptorProto, server_streaming_), 0, 1, 2, 3, 4, 5, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, _internal_metadata_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, _extensions_), ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_package_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_outer_classname_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_multiple_files_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_generate_equals_and_hash_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_string_check_utf8_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, optimize_for_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, go_package_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, cc_generic_services_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, java_generic_services_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, py_generic_services_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, php_generic_services_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, deprecated_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, cc_enable_arenas_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, objc_class_prefix_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, csharp_namespace_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, swift_prefix_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, php_class_prefix_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, php_namespace_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FileOptions, uninterpreted_option_), 0, 1, 9, 10, 11, 17, 2, 12, 13, 14, 15, 16, 8, 3, 4, 5, 6, 7, ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, _internal_metadata_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, _extensions_), ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, message_set_wire_format_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, no_standard_descriptor_accessor_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, deprecated_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, map_entry_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MessageOptions, uninterpreted_option_), 0, 1, 2, 3, ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, _internal_metadata_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, _extensions_), ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, ctype_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, packed_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, jstype_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, lazy_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, deprecated_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, weak_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldOptions, uninterpreted_option_), 0, 1, 5, 2, 3, 4, ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofOptions, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofOptions, _internal_metadata_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofOptions, _extensions_), ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::OneofOptions, uninterpreted_option_), ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, _internal_metadata_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, _extensions_), ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, allow_alias_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, deprecated_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumOptions, uninterpreted_option_), 0, 1, ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _internal_metadata_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueOptions, _extensions_), ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueOptions, deprecated_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::EnumValueOptions, uninterpreted_option_), 0, ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceOptions, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceOptions, _internal_metadata_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceOptions, _extensions_), ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceOptions, deprecated_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ServiceOptions, uninterpreted_option_), 0, ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, _internal_metadata_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, _extensions_), ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, deprecated_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, idempotency_level_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::MethodOptions, uninterpreted_option_), 0, 1, ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption_NamePart, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption_NamePart, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption_NamePart, name_part_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption_NamePart, is_extension_), 0, 1, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, name_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, identifier_value_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, positive_int_value_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, negative_int_value_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, double_value_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, string_value_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::UninterpretedOption, aggregate_value_), ~0u, 0, 3, 4, 5, 1, 2, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, path_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, span_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, leading_comments_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, trailing_comments_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo_Location, leading_detached_comments_), ~0u, ~0u, 0, 1, ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceCodeInfo, location_), ~0u, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, path_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, source_file_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, begin_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo_Annotation, end_), ~0u, 0, 1, 2, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::GeneratedCodeInfo, annotation_), ~0u, }; static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { { 0, 6, sizeof(::google::protobuf::FileDescriptorSet)}, { 7, 24, sizeof(::google::protobuf::FileDescriptorProto)}, { 36, 44, sizeof(::google::protobuf::DescriptorProto_ExtensionRange)}, { 47, 54, sizeof(::google::protobuf::DescriptorProto_ReservedRange)}, { 56, 71, sizeof(::google::protobuf::DescriptorProto)}, { 81, 87, sizeof(::google::protobuf::ExtensionRangeOptions)}, { 88, 103, sizeof(::google::protobuf::FieldDescriptorProto)}, { 113, 120, sizeof(::google::protobuf::OneofDescriptorProto)}, { 122, 129, sizeof(::google::protobuf::EnumDescriptorProto_EnumReservedRange)}, { 131, 141, sizeof(::google::protobuf::EnumDescriptorProto)}, { 146, 154, sizeof(::google::protobuf::EnumValueDescriptorProto)}, { 157, 165, sizeof(::google::protobuf::ServiceDescriptorProto)}, { 168, 179, sizeof(::google::protobuf::MethodDescriptorProto)}, { 185, 209, sizeof(::google::protobuf::FileOptions)}, { 228, 238, sizeof(::google::protobuf::MessageOptions)}, { 243, 255, sizeof(::google::protobuf::FieldOptions)}, { 262, 268, sizeof(::google::protobuf::OneofOptions)}, { 269, 277, sizeof(::google::protobuf::EnumOptions)}, { 280, 287, sizeof(::google::protobuf::EnumValueOptions)}, { 289, 296, sizeof(::google::protobuf::ServiceOptions)}, { 298, 306, sizeof(::google::protobuf::MethodOptions)}, { 309, 316, sizeof(::google::protobuf::UninterpretedOption_NamePart)}, { 318, 330, sizeof(::google::protobuf::UninterpretedOption)}, { 337, 347, sizeof(::google::protobuf::SourceCodeInfo_Location)}, { 352, 358, sizeof(::google::protobuf::SourceCodeInfo)}, { 359, 368, sizeof(::google::protobuf::GeneratedCodeInfo_Annotation)}, { 372, 378, sizeof(::google::protobuf::GeneratedCodeInfo)}, }; static ::google::protobuf::Message const * const file_default_instances[] = { reinterpret_cast(&::google::protobuf::_FileDescriptorSet_default_instance_), reinterpret_cast(&::google::protobuf::_FileDescriptorProto_default_instance_), reinterpret_cast(&::google::protobuf::_DescriptorProto_ExtensionRange_default_instance_), reinterpret_cast(&::google::protobuf::_DescriptorProto_ReservedRange_default_instance_), reinterpret_cast(&::google::protobuf::_DescriptorProto_default_instance_), reinterpret_cast(&::google::protobuf::_ExtensionRangeOptions_default_instance_), reinterpret_cast(&::google::protobuf::_FieldDescriptorProto_default_instance_), reinterpret_cast(&::google::protobuf::_OneofDescriptorProto_default_instance_), reinterpret_cast(&::google::protobuf::_EnumDescriptorProto_EnumReservedRange_default_instance_), reinterpret_cast(&::google::protobuf::_EnumDescriptorProto_default_instance_), reinterpret_cast(&::google::protobuf::_EnumValueDescriptorProto_default_instance_), reinterpret_cast(&::google::protobuf::_ServiceDescriptorProto_default_instance_), reinterpret_cast(&::google::protobuf::_MethodDescriptorProto_default_instance_), reinterpret_cast(&::google::protobuf::_FileOptions_default_instance_), reinterpret_cast(&::google::protobuf::_MessageOptions_default_instance_), reinterpret_cast(&::google::protobuf::_FieldOptions_default_instance_), reinterpret_cast(&::google::protobuf::_OneofOptions_default_instance_), reinterpret_cast(&::google::protobuf::_EnumOptions_default_instance_), reinterpret_cast(&::google::protobuf::_EnumValueOptions_default_instance_), reinterpret_cast(&::google::protobuf::_ServiceOptions_default_instance_), reinterpret_cast(&::google::protobuf::_MethodOptions_default_instance_), reinterpret_cast(&::google::protobuf::_UninterpretedOption_NamePart_default_instance_), reinterpret_cast(&::google::protobuf::_UninterpretedOption_default_instance_), reinterpret_cast(&::google::protobuf::_SourceCodeInfo_Location_default_instance_), reinterpret_cast(&::google::protobuf::_SourceCodeInfo_default_instance_), reinterpret_cast(&::google::protobuf::_GeneratedCodeInfo_Annotation_default_instance_), reinterpret_cast(&::google::protobuf::_GeneratedCodeInfo_default_instance_), }; void protobuf_AssignDescriptors() { AddDescriptors(); ::google::protobuf::MessageFactory* factory = NULL; AssignDescriptors( "google/protobuf/descriptor.proto", schemas, file_default_instances, TableStruct::offsets, factory, file_level_metadata, file_level_enum_descriptors, NULL); } void protobuf_AssignDescriptorsOnce() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors); } void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD; void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 27); } void AddDescriptorsImpl() { InitDefaults(); static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_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\"\274\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\"\266\002\n\004Typ" "e\022\017\n\013TYPE_DOUBLE\020\001\022\016\n\nTYPE_FLOAT\020\002\022\016\n\nTY" "PE_INT64\020\003\022\017\n\013TYPE_UINT64\020\004\022\016\n\nTYPE_INT3" "2\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\nTYPE_" "GROUP\020\n\022\020\n\014TYPE_MESSAGE\020\013\022\016\n\nTYPE_BYTES\020" "\014\022\017\n\013TYPE_UINT32\020\r\022\r\n\tTYPE_ENUM\020\016\022\021\n\rTYP" "E_SFIXED32\020\017\022\021\n\rTYPE_SFIXED64\020\020\022\017\n\013TYPE_" "SINT32\020\021\022\017\n\013TYPE_SINT64\020\022\"C\n\005Label\022\022\n\016LA" "BEL_OPTIONAL\020\001\022\022\n\016LABEL_REQUIRED\020\002\022\022\n\016LA" "BEL_REPEATED\020\003\"T\n\024OneofDescriptorProto\022\014" "\n\004name\030\001 \001(\t\022.\n\007options\030\002 \001(\0132\035.google.p" "rotobuf.OneofOptions\"\244\002\n\023EnumDescriptorP" "roto\022\014\n\004name\030\001 \001(\t\0228\n\005value\030\002 \003(\0132).goog" "le.protobuf.EnumValueDescriptorProto\022-\n\007" "options\030\003 \001(\0132\034.google.protobuf.EnumOpti" "ons\022N\n\016reserved_range\030\004 \003(\01326.google.pro" "tobuf.EnumDescriptorProto.EnumReservedRa" "nge\022\025\n\rreserved_name\030\005 \003(\t\032/\n\021EnumReserv" "edRange\022\r\n\005start\030\001 \001(\005\022\013\n\003end\030\002 \001(\005\"l\n\030E" "numValueDescriptorProto\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.EnumValueOptions\"\220\001\n\026ServiceDes" "criptorProto\022\014\n\004name\030\001 \001(\t\0226\n\006method\030\002 \003" "(\0132&.google.protobuf.MethodDescriptorPro" "to\0220\n\007options\030\003 \001(\0132\037.google.protobuf.Se" "rviceOptions\"\301\001\n\025MethodDescriptorProto\022\014" "\n\004name\030\001 \001(\t\022\022\n\ninput_type\030\002 \001(\t\022\023\n\013outp" "ut_type\030\003 \001(\t\022/\n\007options\030\004 \001(\0132\036.google." "protobuf.MethodOptions\022\037\n\020client_streami" "ng\030\005 \001(\010:\005false\022\037\n\020server_streaming\030\006 \001(" "\010:\005false\"\360\005\n\013FileOptions\022\024\n\014java_package" "\030\001 \001(\t\022\034\n\024java_outer_classname\030\010 \001(\t\022\"\n\023" "java_multiple_files\030\n \001(\010:\005false\022)\n\035java" "_generate_equals_and_hash\030\024 \001(\010B\002\030\001\022%\n\026j" "ava_string_check_utf8\030\033 \001(\010:\005false\022F\n\014op" "timize_for\030\t \001(\0162).google.protobuf.FileO" "ptions.OptimizeMode:\005SPEED\022\022\n\ngo_package" "\030\013 \001(\t\022\"\n\023cc_generic_services\030\020 \001(\010:\005fal" "se\022$\n\025java_generic_services\030\021 \001(\010:\005false" "\022\"\n\023py_generic_services\030\022 \001(\010:\005false\022#\n\024" "php_generic_services\030* \001(\010:\005false\022\031\n\ndep" "recated\030\027 \001(\010:\005false\022\037\n\020cc_enable_arenas" "\030\037 \001(\010:\005false\022\031\n\021objc_class_prefix\030$ \001(\t" "\022\030\n\020csharp_namespace\030% \001(\t\022\024\n\014swift_pref" "ix\030\' \001(\t\022\030\n\020php_class_prefix\030( \001(\t\022\025\n\rph" "p_namespace\030) \001(\t\022C\n\024uninterpreted_optio" "n\030\347\007 \003(\0132$.google.protobuf.Uninterpreted" "Option\":\n\014OptimizeMode\022\t\n\005SPEED\020\001\022\r\n\tCOD" "E_SIZE\020\002\022\020\n\014LITE_RUNTIME\020\003*\t\010\350\007\020\200\200\200\200\002J\004\010" "&\020\'\"\362\001\n\016MessageOptions\022&\n\027message_set_wi" "re_format\030\001 \001(\010:\005false\022.\n\037no_standard_de" "scriptor_accessor\030\002 \001(\010:\005false\022\031\n\ndeprec" "ated\030\003 \001(\010:\005false\022\021\n\tmap_entry\030\007 \001(\010\022C\n\024" "uninterpreted_option\030\347\007 \003(\0132$.google.pro" "tobuf.UninterpretedOption*\t\010\350\007\020\200\200\200\200\002J\004\010\010" "\020\tJ\004\010\t\020\n\"\236\003\n\014FieldOptions\022:\n\005ctype\030\001 \001(\016" "2#.google.protobuf.FieldOptions.CType:\006S" "TRING\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\031\n\ndeprecate" "d\030\003 \001(\010:\005false\022\023\n\004weak\030\n \001(\010:\005false\022C\n\024u" "ninterpreted_option\030\347\007 \003(\0132$.google.prot" "obuf.UninterpretedOption\"/\n\005CType\022\n\n\006STR" "ING\020\000\022\010\n\004CORD\020\001\022\020\n\014STRING_PIECE\020\002\"5\n\006JST" "ype\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\014OneofOption" "s\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.googl" "e.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\024uninterpret" "ed_option\030\347\007 \003(\0132$.google.protobuf.Unint" "erpretedOption*\t\010\350\007\020\200\200\200\200\002J\004\010\005\020\006\"}\n\020EnumV" "alueOptions\022\031\n\ndeprecated\030\001 \001(\010:\005false\022C" "\n\024uninterpreted_option\030\347\007 \003(\0132$.google.p" "rotobuf.UninterpretedOption*\t\010\350\007\020\200\200\200\200\002\"{" "\n\016ServiceOptions\022\031\n\ndeprecated\030! \001(\010:\005fa" "lse\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.goo" "gle.protobuf.UninterpretedOption*\t\010\350\007\020\200\200" "\200\200\002\"\255\002\n\rMethodOptions\022\031\n\ndeprecated\030! \001(" "\010:\005false\022_\n\021idempotency_level\030\" \001(\0162/.go" "ogle.protobuf.MethodOptions.IdempotencyL" "evel:\023IDEMPOTENCY_UNKNOWN\022C\n\024uninterpret" "ed_option\030\347\007 \003(\0132$.google.protobuf.Unint" "erpretedOption\"P\n\020IdempotencyLevel\022\027\n\023ID" "EMPOTENCY_UNKNOWN\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\023Uninterp" "retedOption\022;\n\004name\030\002 \003(\0132-.google.proto" "buf.UninterpretedOption.NamePart\022\030\n\020iden" "tifier_value\030\003 \001(\t\022\032\n\022positive_int_value" "\030\004 \001(\004\022\032\n\022negative_int_value\030\005 \001(\003\022\024\n\014do" "uble_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\010NamePart\022\021\n\tn" "ame_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(.goog" "le.protobuf.SourceCodeInfo.Location\032\206\001\n\010" "Location\022\020\n\004path\030\001 \003(\005B\002\020\001\022\020\n\004span\030\002 \003(\005" "B\002\020\001\022\030\n\020leading_comments\030\003 \001(\t\022\031\n\021traili" "ng_comments\030\004 \001(\t\022!\n\031leading_detached_co" "mments\030\006 \003(\t\"\247\001\n\021GeneratedCodeInfo\022A\n\nan" "notation\030\001 \003(\0132-.google.protobuf.Generat" "edCodeInfo.Annotation\032O\n\nAnnotation\022\020\n\004p" "ath\030\001 \003(\005B\002\020\001\022\023\n\013source_file\030\002 \001(\t\022\r\n\005be" "gin\030\003 \001(\005\022\013\n\003end\030\004 \001(\005B\217\001\n\023com.google.pr" "otobufB\020DescriptorProtosH\001Z>github.com/g" "olang/protobuf/protoc-gen-go/descriptor;" "descriptor\370\001\001\242\002\003GPB\252\002\032Google.Protobuf.Re" "flection" }; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( descriptor, 5968); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "google/protobuf/descriptor.proto", &protobuf_RegisterTypes); } void AddDescriptors() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl); } // Force AddDescriptors() to be called at dynamic initialization time. struct StaticDescriptorInitializer { StaticDescriptorInitializer() { AddDescriptors(); } } static_descriptor_initializer; } // namespace protobuf_google_2fprotobuf_2fdescriptor_2eproto namespace google { namespace protobuf { const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor() { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[0]; } bool FieldDescriptorProto_Type_IsValid(int value) { switch (value) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: return true; default: return false; } } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_DOUBLE; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FLOAT; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_INT64; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_UINT64; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_INT32; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FIXED64; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FIXED32; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_BOOL; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_STRING; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_GROUP; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_MESSAGE; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_BYTES; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_UINT32; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_ENUM; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SFIXED32; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SFIXED64; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SINT32; const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SINT64; const FieldDescriptorProto_Type FieldDescriptorProto::Type_MIN; const FieldDescriptorProto_Type FieldDescriptorProto::Type_MAX; const int FieldDescriptorProto::Type_ARRAYSIZE; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor() { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[1]; } bool FieldDescriptorProto_Label_IsValid(int value) { switch (value) { case 1: case 2: case 3: return true; default: return false; } } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const FieldDescriptorProto_Label FieldDescriptorProto::LABEL_OPTIONAL; const FieldDescriptorProto_Label FieldDescriptorProto::LABEL_REQUIRED; const FieldDescriptorProto_Label FieldDescriptorProto::LABEL_REPEATED; const FieldDescriptorProto_Label FieldDescriptorProto::Label_MIN; const FieldDescriptorProto_Label FieldDescriptorProto::Label_MAX; const int FieldDescriptorProto::Label_ARRAYSIZE; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor() { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[2]; } bool FileOptions_OptimizeMode_IsValid(int value) { switch (value) { case 1: case 2: case 3: return true; default: return false; } } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const FileOptions_OptimizeMode FileOptions::SPEED; const FileOptions_OptimizeMode FileOptions::CODE_SIZE; const FileOptions_OptimizeMode FileOptions::LITE_RUNTIME; const FileOptions_OptimizeMode FileOptions::OptimizeMode_MIN; const FileOptions_OptimizeMode FileOptions::OptimizeMode_MAX; const int FileOptions::OptimizeMode_ARRAYSIZE; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor() { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[3]; } bool FieldOptions_CType_IsValid(int value) { switch (value) { case 0: case 1: case 2: return true; default: return false; } } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const FieldOptions_CType FieldOptions::STRING; const FieldOptions_CType FieldOptions::CORD; const FieldOptions_CType FieldOptions::STRING_PIECE; const FieldOptions_CType FieldOptions::CType_MIN; const FieldOptions_CType FieldOptions::CType_MAX; const int FieldOptions::CType_ARRAYSIZE; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 const ::google::protobuf::EnumDescriptor* FieldOptions_JSType_descriptor() { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[4]; } bool FieldOptions_JSType_IsValid(int value) { switch (value) { case 0: case 1: case 2: return true; default: return false; } } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const FieldOptions_JSType FieldOptions::JS_NORMAL; const FieldOptions_JSType FieldOptions::JS_STRING; const FieldOptions_JSType FieldOptions::JS_NUMBER; const FieldOptions_JSType FieldOptions::JSType_MIN; const FieldOptions_JSType FieldOptions::JSType_MAX; const int FieldOptions::JSType_ARRAYSIZE; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 const ::google::protobuf::EnumDescriptor* MethodOptions_IdempotencyLevel_descriptor() { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_enum_descriptors[5]; } bool MethodOptions_IdempotencyLevel_IsValid(int value) { switch (value) { case 0: case 1: case 2: return true; default: return false; } } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const MethodOptions_IdempotencyLevel MethodOptions::IDEMPOTENCY_UNKNOWN; const MethodOptions_IdempotencyLevel MethodOptions::NO_SIDE_EFFECTS; const MethodOptions_IdempotencyLevel MethodOptions::IDEMPOTENT; const MethodOptions_IdempotencyLevel MethodOptions::IdempotencyLevel_MIN; const MethodOptions_IdempotencyLevel MethodOptions::IdempotencyLevel_MAX; const int MethodOptions::IdempotencyLevel_ARRAYSIZE; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 // =================================================================== void FileDescriptorSet::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int FileDescriptorSet::kFileFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 FileDescriptorSet::FileDescriptorSet() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorSet(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.FileDescriptorSet) } FileDescriptorSet::FileDescriptorSet(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), file_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorSet(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.FileDescriptorSet) } FileDescriptorSet::FileDescriptorSet(const FileDescriptorSet& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), file_(from.file_) { _internal_metadata_.MergeFrom(from._internal_metadata_); // @@protoc_insertion_point(copy_constructor:google.protobuf.FileDescriptorSet) } void FileDescriptorSet::SharedCtor() { _cached_size_ = 0; } FileDescriptorSet::~FileDescriptorSet() { // @@protoc_insertion_point(destructor:google.protobuf.FileDescriptorSet) SharedDtor(); } void FileDescriptorSet::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void FileDescriptorSet::ArenaDtor(void* object) { FileDescriptorSet* _this = reinterpret_cast< FileDescriptorSet* >(object); (void)_this; } void FileDescriptorSet::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void FileDescriptorSet::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* FileDescriptorSet::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const FileDescriptorSet& FileDescriptorSet::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorSet(); return *internal_default_instance(); } FileDescriptorSet* FileDescriptorSet::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void FileDescriptorSet::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.FileDescriptorSet) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; file_.Clear(); _has_bits_.Clear(); _internal_metadata_.Clear(); } bool FileDescriptorSet::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.FileDescriptorSet) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated .google.protobuf.FileDescriptorProto file = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_file())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.FileDescriptorSet) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.FileDescriptorSet) return false; #undef DO_ } void FileDescriptorSet::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.FileDescriptorSet) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.FileDescriptorProto file = 1; for (unsigned int i = 0, n = static_cast(this->file_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 1, this->file(static_cast(i)), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.FileDescriptorSet) } ::google::protobuf::uint8* FileDescriptorSet::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorSet) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.FileDescriptorProto file = 1; for (unsigned int i = 0, n = static_cast(this->file_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 1, this->file(static_cast(i)), deterministic, target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileDescriptorSet) return target; } size_t FileDescriptorSet::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FileDescriptorSet) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.FileDescriptorProto file = 1; { unsigned int count = static_cast(this->file_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->file(static_cast(i))); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void FileDescriptorSet::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FileDescriptorSet) GOOGLE_DCHECK_NE(&from, this); const FileDescriptorSet* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.FileDescriptorSet) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.FileDescriptorSet) MergeFrom(*source); } } void FileDescriptorSet::MergeFrom(const FileDescriptorSet& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FileDescriptorSet) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; file_.MergeFrom(from.file_); } void FileDescriptorSet::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.FileDescriptorSet) if (&from == this) return; Clear(); MergeFrom(from); } void FileDescriptorSet::CopyFrom(const FileDescriptorSet& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FileDescriptorSet) if (&from == this) return; Clear(); MergeFrom(from); } bool FileDescriptorSet::IsInitialized() const { if (!::google::protobuf::internal::AllAreInitialized(this->file())) return false; return true; } void FileDescriptorSet::Swap(FileDescriptorSet* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { FileDescriptorSet* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void FileDescriptorSet::UnsafeArenaSwap(FileDescriptorSet* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void FileDescriptorSet::InternalSwap(FileDescriptorSet* other) { using std::swap; file_.InternalSwap(&other->file_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata FileDescriptorSet::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void FileDescriptorProto::InitAsDefaultInstance() { ::google::protobuf::_FileDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::FileOptions*>( ::google::protobuf::FileOptions::internal_default_instance()); ::google::protobuf::_FileDescriptorProto_default_instance_._instance.get_mutable()->source_code_info_ = const_cast< ::google::protobuf::SourceCodeInfo*>( ::google::protobuf::SourceCodeInfo::internal_default_instance()); } void FileDescriptorProto::_slow_mutable_options() { options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::FileOptions >( GetArenaNoVirtual()); } void FileDescriptorProto::unsafe_arena_set_allocated_options( ::google::protobuf::FileOptions* options) { if (GetArenaNoVirtual() == NULL) { delete options_; } options_ = options; if (options) { set_has_options(); } else { clear_has_options(); } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.options) } void FileDescriptorProto::_slow_mutable_source_code_info() { source_code_info_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::SourceCodeInfo >( GetArenaNoVirtual()); } void FileDescriptorProto::unsafe_arena_set_allocated_source_code_info( ::google::protobuf::SourceCodeInfo* source_code_info) { if (GetArenaNoVirtual() == NULL) { delete source_code_info_; } source_code_info_ = source_code_info; if (source_code_info) { set_has_source_code_info(); } else { clear_has_source_code_info(); } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.source_code_info) } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int FileDescriptorProto::kNameFieldNumber; const int FileDescriptorProto::kPackageFieldNumber; const int FileDescriptorProto::kDependencyFieldNumber; const int FileDescriptorProto::kPublicDependencyFieldNumber; const int FileDescriptorProto::kWeakDependencyFieldNumber; const int FileDescriptorProto::kMessageTypeFieldNumber; const int FileDescriptorProto::kEnumTypeFieldNumber; const int FileDescriptorProto::kServiceFieldNumber; const int FileDescriptorProto::kExtensionFieldNumber; const int FileDescriptorProto::kOptionsFieldNumber; const int FileDescriptorProto::kSourceCodeInfoFieldNumber; const int FileDescriptorProto::kSyntaxFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 FileDescriptorProto::FileDescriptorProto() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProto(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.FileDescriptorProto) } FileDescriptorProto::FileDescriptorProto(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), dependency_(arena), message_type_(arena), enum_type_(arena), service_(arena), extension_(arena), public_dependency_(arena), weak_dependency_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProto(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.FileDescriptorProto) } FileDescriptorProto::FileDescriptorProto(const FileDescriptorProto& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), dependency_(from.dependency_), message_type_(from.message_type_), enum_type_(from.enum_type_), service_(from.service_), extension_(from.extension_), public_dependency_(from.public_dependency_), weak_dependency_(from.weak_dependency_) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_name()) { name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(), GetArenaNoVirtual()); } package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_package()) { package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.package(), GetArenaNoVirtual()); } syntax_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_syntax()) { syntax_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.syntax(), GetArenaNoVirtual()); } if (from.has_options()) { options_ = new ::google::protobuf::FileOptions(*from.options_); } else { options_ = NULL; } if (from.has_source_code_info()) { source_code_info_ = new ::google::protobuf::SourceCodeInfo(*from.source_code_info_); } else { source_code_info_ = NULL; } // @@protoc_insertion_point(copy_constructor:google.protobuf.FileDescriptorProto) } void FileDescriptorProto::SharedCtor() { _cached_size_ = 0; name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); syntax_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(&options_, 0, static_cast( reinterpret_cast(&source_code_info_) - reinterpret_cast(&options_)) + sizeof(source_code_info_)); } FileDescriptorProto::~FileDescriptorProto() { // @@protoc_insertion_point(destructor:google.protobuf.FileDescriptorProto) SharedDtor(); } void FileDescriptorProto::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); package_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); syntax_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (this != internal_default_instance()) delete options_; if (this != internal_default_instance()) delete source_code_info_; } void FileDescriptorProto::ArenaDtor(void* object) { FileDescriptorProto* _this = reinterpret_cast< FileDescriptorProto* >(object); (void)_this; } void FileDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void FileDescriptorProto::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* FileDescriptorProto::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const FileDescriptorProto& FileDescriptorProto::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProto(); return *internal_default_instance(); } FileDescriptorProto* FileDescriptorProto::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void FileDescriptorProto::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.FileDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; dependency_.Clear(); message_type_.Clear(); enum_type_.Clear(); service_.Clear(); extension_.Clear(); public_dependency_.Clear(); weak_dependency_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 31u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(!package_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000004u) { GOOGLE_DCHECK(!syntax_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); syntax_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000008u) { GOOGLE_DCHECK(options_ != NULL); options_->Clear(); } if (cached_has_bits & 0x00000010u) { GOOGLE_DCHECK(source_code_info_ != NULL); source_code_info_->Clear(); } } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool FileDescriptorProto::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.FileDescriptorProto) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileDescriptorProto.name"); } else { goto handle_unusual; } break; } // optional string package = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_package())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->package().data(), static_cast(this->package().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileDescriptorProto.package"); } else { goto handle_unusual; } break; } // repeated string dependency = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->add_dependency())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->dependency(this->dependency_size() - 1).data(), static_cast(this->dependency(this->dependency_size() - 1).length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileDescriptorProto.dependency"); } else { goto handle_unusual; } break; } // repeated .google.protobuf.DescriptorProto message_type = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_message_type())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; case 5: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_enum_type())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.ServiceDescriptorProto service = 6; case 6: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_service())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.FieldDescriptorProto extension = 7; case 7: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 58 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_extension())); } else { goto handle_unusual; } break; } // optional .google.protobuf.FileOptions options = 8; case 8: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(66u /* 66 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_options())); } else { goto handle_unusual; } break; } // optional .google.protobuf.SourceCodeInfo source_code_info = 9; case 9: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(74u /* 74 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_source_code_info())); } else { goto handle_unusual; } break; } // repeated int32 public_dependency = 10; case 10: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(80u /* 80 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( 1, 80u, input, this->mutable_public_dependency()))); } else if ( static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(82u /* 82 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitiveNoInline< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, this->mutable_public_dependency()))); } else { goto handle_unusual; } break; } // repeated int32 weak_dependency = 11; case 11: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(88u /* 88 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( 1, 88u, input, this->mutable_weak_dependency()))); } else if ( static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(90u /* 90 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitiveNoInline< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, this->mutable_weak_dependency()))); } else { goto handle_unusual; } break; } // optional string syntax = 12; case 12: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(98u /* 98 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_syntax())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->syntax().data(), static_cast(this->syntax().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileDescriptorProto.syntax"); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.FileDescriptorProto) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.FileDescriptorProto) return false; #undef DO_ } void FileDescriptorProto::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.FileDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileDescriptorProto.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // optional string package = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->package().data(), static_cast(this->package().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileDescriptorProto.package"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 2, this->package(), output); } // repeated string dependency = 3; for (int i = 0, n = this->dependency_size(); i < n; i++) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->dependency(i).data(), static_cast(this->dependency(i).length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileDescriptorProto.dependency"); ::google::protobuf::internal::WireFormatLite::WriteString( 3, this->dependency(i), output); } // repeated .google.protobuf.DescriptorProto message_type = 4; for (unsigned int i = 0, n = static_cast(this->message_type_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 4, this->message_type(static_cast(i)), output); } // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; for (unsigned int i = 0, n = static_cast(this->enum_type_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 5, this->enum_type(static_cast(i)), output); } // repeated .google.protobuf.ServiceDescriptorProto service = 6; for (unsigned int i = 0, n = static_cast(this->service_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 6, this->service(static_cast(i)), output); } // repeated .google.protobuf.FieldDescriptorProto extension = 7; for (unsigned int i = 0, n = static_cast(this->extension_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 7, this->extension(static_cast(i)), output); } // optional .google.protobuf.FileOptions options = 8; if (cached_has_bits & 0x00000008u) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 8, *this->options_, output); } // optional .google.protobuf.SourceCodeInfo source_code_info = 9; if (cached_has_bits & 0x00000010u) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 9, *this->source_code_info_, output); } // repeated int32 public_dependency = 10; for (int i = 0, n = this->public_dependency_size(); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteInt32( 10, this->public_dependency(i), output); } // repeated int32 weak_dependency = 11; for (int i = 0, n = this->weak_dependency_size(); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteInt32( 11, this->weak_dependency(i), output); } // optional string syntax = 12; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->syntax().data(), static_cast(this->syntax().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileDescriptorProto.syntax"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 12, this->syntax(), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.FileDescriptorProto) } ::google::protobuf::uint8* FileDescriptorProto::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileDescriptorProto.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // optional string package = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->package().data(), static_cast(this->package().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileDescriptorProto.package"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 2, this->package(), target); } // repeated string dependency = 3; for (int i = 0, n = this->dependency_size(); i < n; i++) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->dependency(i).data(), static_cast(this->dependency(i).length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileDescriptorProto.dependency"); target = ::google::protobuf::internal::WireFormatLite:: WriteStringToArray(3, this->dependency(i), target); } // repeated .google.protobuf.DescriptorProto message_type = 4; for (unsigned int i = 0, n = static_cast(this->message_type_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 4, this->message_type(static_cast(i)), deterministic, target); } // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; for (unsigned int i = 0, n = static_cast(this->enum_type_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 5, this->enum_type(static_cast(i)), deterministic, target); } // repeated .google.protobuf.ServiceDescriptorProto service = 6; for (unsigned int i = 0, n = static_cast(this->service_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 6, this->service(static_cast(i)), deterministic, target); } // repeated .google.protobuf.FieldDescriptorProto extension = 7; for (unsigned int i = 0, n = static_cast(this->extension_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 7, this->extension(static_cast(i)), deterministic, target); } // optional .google.protobuf.FileOptions options = 8; if (cached_has_bits & 0x00000008u) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 8, *this->options_, deterministic, target); } // optional .google.protobuf.SourceCodeInfo source_code_info = 9; if (cached_has_bits & 0x00000010u) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 9, *this->source_code_info_, deterministic, target); } // repeated int32 public_dependency = 10; target = ::google::protobuf::internal::WireFormatLite:: WriteInt32ToArray(10, this->public_dependency_, target); // repeated int32 weak_dependency = 11; target = ::google::protobuf::internal::WireFormatLite:: WriteInt32ToArray(11, this->weak_dependency_, target); // optional string syntax = 12; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->syntax().data(), static_cast(this->syntax().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileDescriptorProto.syntax"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 12, this->syntax(), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileDescriptorProto) return target; } size_t FileDescriptorProto::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FileDescriptorProto) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated string dependency = 3; total_size += 1 * ::google::protobuf::internal::FromIntSize(this->dependency_size()); for (int i = 0, n = this->dependency_size(); i < n; i++) { total_size += ::google::protobuf::internal::WireFormatLite::StringSize( this->dependency(i)); } // repeated .google.protobuf.DescriptorProto message_type = 4; { unsigned int count = static_cast(this->message_type_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->message_type(static_cast(i))); } } // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; { unsigned int count = static_cast(this->enum_type_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->enum_type(static_cast(i))); } } // repeated .google.protobuf.ServiceDescriptorProto service = 6; { unsigned int count = static_cast(this->service_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->service(static_cast(i))); } } // repeated .google.protobuf.FieldDescriptorProto extension = 7; { unsigned int count = static_cast(this->extension_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->extension(static_cast(i))); } } // repeated int32 public_dependency = 10; { size_t data_size = ::google::protobuf::internal::WireFormatLite:: Int32Size(this->public_dependency_); total_size += 1 * ::google::protobuf::internal::FromIntSize(this->public_dependency_size()); total_size += data_size; } // repeated int32 weak_dependency = 11; { size_t data_size = ::google::protobuf::internal::WireFormatLite:: Int32Size(this->weak_dependency_); total_size += 1 * ::google::protobuf::internal::FromIntSize(this->weak_dependency_size()); total_size += data_size; } if (_has_bits_[0 / 32] & 31u) { // optional string name = 1; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // optional string package = 2; if (has_package()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->package()); } // optional string syntax = 12; if (has_syntax()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->syntax()); } // optional .google.protobuf.FileOptions options = 8; if (has_options()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->options_); } // optional .google.protobuf.SourceCodeInfo source_code_info = 9; if (has_source_code_info()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->source_code_info_); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void FileDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FileDescriptorProto) GOOGLE_DCHECK_NE(&from, this); const FileDescriptorProto* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.FileDescriptorProto) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.FileDescriptorProto) MergeFrom(*source); } } void FileDescriptorProto::MergeFrom(const FileDescriptorProto& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FileDescriptorProto) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; dependency_.MergeFrom(from.dependency_); message_type_.MergeFrom(from.message_type_); enum_type_.MergeFrom(from.enum_type_); service_.MergeFrom(from.service_); extension_.MergeFrom(from.extension_); public_dependency_.MergeFrom(from.public_dependency_); weak_dependency_.MergeFrom(from.weak_dependency_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 31u) { if (cached_has_bits & 0x00000001u) { set_name(from.name()); } if (cached_has_bits & 0x00000002u) { set_package(from.package()); } if (cached_has_bits & 0x00000004u) { set_syntax(from.syntax()); } if (cached_has_bits & 0x00000008u) { mutable_options()->::google::protobuf::FileOptions::MergeFrom(from.options()); } if (cached_has_bits & 0x00000010u) { mutable_source_code_info()->::google::protobuf::SourceCodeInfo::MergeFrom(from.source_code_info()); } } } void FileDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.FileDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } void FileDescriptorProto::CopyFrom(const FileDescriptorProto& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FileDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } bool FileDescriptorProto::IsInitialized() const { if (!::google::protobuf::internal::AllAreInitialized(this->message_type())) return false; if (!::google::protobuf::internal::AllAreInitialized(this->enum_type())) return false; if (!::google::protobuf::internal::AllAreInitialized(this->service())) return false; if (!::google::protobuf::internal::AllAreInitialized(this->extension())) return false; if (has_options()) { if (!this->options_->IsInitialized()) return false; } return true; } void FileDescriptorProto::Swap(FileDescriptorProto* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { FileDescriptorProto* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void FileDescriptorProto::UnsafeArenaSwap(FileDescriptorProto* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void FileDescriptorProto::InternalSwap(FileDescriptorProto* other) { using std::swap; dependency_.InternalSwap(&other->dependency_); message_type_.InternalSwap(&other->message_type_); enum_type_.InternalSwap(&other->enum_type_); service_.InternalSwap(&other->service_); extension_.InternalSwap(&other->extension_); public_dependency_.InternalSwap(&other->public_dependency_); weak_dependency_.InternalSwap(&other->weak_dependency_); name_.Swap(&other->name_); package_.Swap(&other->package_); syntax_.Swap(&other->syntax_); swap(options_, other->options_); swap(source_code_info_, other->source_code_info_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata FileDescriptorProto::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void DescriptorProto_ExtensionRange::InitAsDefaultInstance() { ::google::protobuf::_DescriptorProto_ExtensionRange_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::ExtensionRangeOptions*>( ::google::protobuf::ExtensionRangeOptions::internal_default_instance()); } void DescriptorProto_ExtensionRange::_slow_mutable_options() { options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::ExtensionRangeOptions >( GetArenaNoVirtual()); } void DescriptorProto_ExtensionRange::unsafe_arena_set_allocated_options( ::google::protobuf::ExtensionRangeOptions* options) { if (GetArenaNoVirtual() == NULL) { delete options_; } options_ = options; if (options) { set_has_options(); } else { clear_has_options(); } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.DescriptorProto.ExtensionRange.options) } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int DescriptorProto_ExtensionRange::kStartFieldNumber; const int DescriptorProto_ExtensionRange::kEndFieldNumber; const int DescriptorProto_ExtensionRange::kOptionsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ExtensionRange(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.DescriptorProto.ExtensionRange) } DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ExtensionRange(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.DescriptorProto.ExtensionRange) } DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(const DescriptorProto_ExtensionRange& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); if (from.has_options()) { options_ = new ::google::protobuf::ExtensionRangeOptions(*from.options_); } else { options_ = NULL; } ::memcpy(&start_, &from.start_, static_cast(reinterpret_cast(&end_) - reinterpret_cast(&start_)) + sizeof(end_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto.ExtensionRange) } void DescriptorProto_ExtensionRange::SharedCtor() { _cached_size_ = 0; ::memset(&options_, 0, static_cast( reinterpret_cast(&end_) - reinterpret_cast(&options_)) + sizeof(end_)); } DescriptorProto_ExtensionRange::~DescriptorProto_ExtensionRange() { // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto.ExtensionRange) SharedDtor(); } void DescriptorProto_ExtensionRange::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); if (this != internal_default_instance()) delete options_; } void DescriptorProto_ExtensionRange::ArenaDtor(void* object) { DescriptorProto_ExtensionRange* _this = reinterpret_cast< DescriptorProto_ExtensionRange* >(object); (void)_this; } void DescriptorProto_ExtensionRange::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void DescriptorProto_ExtensionRange::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* DescriptorProto_ExtensionRange::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const DescriptorProto_ExtensionRange& DescriptorProto_ExtensionRange::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ExtensionRange(); return *internal_default_instance(); } DescriptorProto_ExtensionRange* DescriptorProto_ExtensionRange::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void DescriptorProto_ExtensionRange::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto.ExtensionRange) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; cached_has_bits = _has_bits_[0]; if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(options_ != NULL); options_->Clear(); } if (cached_has_bits & 6u) { ::memset(&start_, 0, static_cast( reinterpret_cast(&end_) - reinterpret_cast(&start_)) + sizeof(end_)); } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool DescriptorProto_ExtensionRange::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.DescriptorProto.ExtensionRange) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional int32 start = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { set_has_start(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &start_))); } else { goto handle_unusual; } break; } // optional int32 end = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { set_has_end(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &end_))); } else { goto handle_unusual; } break; } // optional .google.protobuf.ExtensionRangeOptions options = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_options())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.DescriptorProto.ExtensionRange) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.DescriptorProto.ExtensionRange) return false; #undef DO_ } void DescriptorProto_ExtensionRange::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.DescriptorProto.ExtensionRange) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional int32 start = 1; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output); } // optional int32 end = 2; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output); } // optional .google.protobuf.ExtensionRangeOptions options = 3; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 3, *this->options_, output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.DescriptorProto.ExtensionRange) } ::google::protobuf::uint8* DescriptorProto_ExtensionRange::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto.ExtensionRange) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional int32 start = 1; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->start(), target); } // optional int32 end = 2; if (cached_has_bits & 0x00000004u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->end(), target); } // optional .google.protobuf.ExtensionRangeOptions options = 3; if (cached_has_bits & 0x00000001u) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 3, *this->options_, deterministic, target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto.ExtensionRange) return target; } size_t DescriptorProto_ExtensionRange::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto.ExtensionRange) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } if (_has_bits_[0 / 32] & 7u) { // optional .google.protobuf.ExtensionRangeOptions options = 3; if (has_options()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->options_); } // optional int32 start = 1; if (has_start()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->start()); } // optional int32 end = 2; if (has_end()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->end()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void DescriptorProto_ExtensionRange::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.DescriptorProto.ExtensionRange) GOOGLE_DCHECK_NE(&from, this); const DescriptorProto_ExtensionRange* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.DescriptorProto.ExtensionRange) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.DescriptorProto.ExtensionRange) MergeFrom(*source); } } void DescriptorProto_ExtensionRange::MergeFrom(const DescriptorProto_ExtensionRange& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto.ExtensionRange) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 7u) { if (cached_has_bits & 0x00000001u) { mutable_options()->::google::protobuf::ExtensionRangeOptions::MergeFrom(from.options()); } if (cached_has_bits & 0x00000002u) { start_ = from.start_; } if (cached_has_bits & 0x00000004u) { end_ = from.end_; } _has_bits_[0] |= cached_has_bits; } } void DescriptorProto_ExtensionRange::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.DescriptorProto.ExtensionRange) if (&from == this) return; Clear(); MergeFrom(from); } void DescriptorProto_ExtensionRange::CopyFrom(const DescriptorProto_ExtensionRange& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto.ExtensionRange) if (&from == this) return; Clear(); MergeFrom(from); } bool DescriptorProto_ExtensionRange::IsInitialized() const { if (has_options()) { if (!this->options_->IsInitialized()) return false; } return true; } void DescriptorProto_ExtensionRange::Swap(DescriptorProto_ExtensionRange* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { DescriptorProto_ExtensionRange* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void DescriptorProto_ExtensionRange::UnsafeArenaSwap(DescriptorProto_ExtensionRange* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void DescriptorProto_ExtensionRange::InternalSwap(DescriptorProto_ExtensionRange* other) { using std::swap; swap(options_, other->options_); swap(start_, other->start_); swap(end_, other->end_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata DescriptorProto_ExtensionRange::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void DescriptorProto_ReservedRange::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int DescriptorProto_ReservedRange::kStartFieldNumber; const int DescriptorProto_ReservedRange::kEndFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 DescriptorProto_ReservedRange::DescriptorProto_ReservedRange() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ReservedRange(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.DescriptorProto.ReservedRange) } DescriptorProto_ReservedRange::DescriptorProto_ReservedRange(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ReservedRange(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.DescriptorProto.ReservedRange) } DescriptorProto_ReservedRange::DescriptorProto_ReservedRange(const DescriptorProto_ReservedRange& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); ::memcpy(&start_, &from.start_, static_cast(reinterpret_cast(&end_) - reinterpret_cast(&start_)) + sizeof(end_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto.ReservedRange) } void DescriptorProto_ReservedRange::SharedCtor() { _cached_size_ = 0; ::memset(&start_, 0, static_cast( reinterpret_cast(&end_) - reinterpret_cast(&start_)) + sizeof(end_)); } DescriptorProto_ReservedRange::~DescriptorProto_ReservedRange() { // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto.ReservedRange) SharedDtor(); } void DescriptorProto_ReservedRange::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void DescriptorProto_ReservedRange::ArenaDtor(void* object) { DescriptorProto_ReservedRange* _this = reinterpret_cast< DescriptorProto_ReservedRange* >(object); (void)_this; } void DescriptorProto_ReservedRange::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void DescriptorProto_ReservedRange::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* DescriptorProto_ReservedRange::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const DescriptorProto_ReservedRange& DescriptorProto_ReservedRange::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ReservedRange(); return *internal_default_instance(); } DescriptorProto_ReservedRange* DescriptorProto_ReservedRange::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void DescriptorProto_ReservedRange::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto.ReservedRange) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; cached_has_bits = _has_bits_[0]; if (cached_has_bits & 3u) { ::memset(&start_, 0, static_cast( reinterpret_cast(&end_) - reinterpret_cast(&start_)) + sizeof(end_)); } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool DescriptorProto_ReservedRange::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.DescriptorProto.ReservedRange) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional int32 start = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { set_has_start(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &start_))); } else { goto handle_unusual; } break; } // optional int32 end = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { set_has_end(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &end_))); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.DescriptorProto.ReservedRange) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.DescriptorProto.ReservedRange) return false; #undef DO_ } void DescriptorProto_ReservedRange::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.DescriptorProto.ReservedRange) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional int32 start = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output); } // optional int32 end = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.DescriptorProto.ReservedRange) } ::google::protobuf::uint8* DescriptorProto_ReservedRange::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto.ReservedRange) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional int32 start = 1; if (cached_has_bits & 0x00000001u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->start(), target); } // optional int32 end = 2; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->end(), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto.ReservedRange) return target; } size_t DescriptorProto_ReservedRange::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto.ReservedRange) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } if (_has_bits_[0 / 32] & 3u) { // optional int32 start = 1; if (has_start()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->start()); } // optional int32 end = 2; if (has_end()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->end()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void DescriptorProto_ReservedRange::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.DescriptorProto.ReservedRange) GOOGLE_DCHECK_NE(&from, this); const DescriptorProto_ReservedRange* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.DescriptorProto.ReservedRange) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.DescriptorProto.ReservedRange) MergeFrom(*source); } } void DescriptorProto_ReservedRange::MergeFrom(const DescriptorProto_ReservedRange& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto.ReservedRange) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { start_ = from.start_; } if (cached_has_bits & 0x00000002u) { end_ = from.end_; } _has_bits_[0] |= cached_has_bits; } } void DescriptorProto_ReservedRange::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.DescriptorProto.ReservedRange) if (&from == this) return; Clear(); MergeFrom(from); } void DescriptorProto_ReservedRange::CopyFrom(const DescriptorProto_ReservedRange& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto.ReservedRange) if (&from == this) return; Clear(); MergeFrom(from); } bool DescriptorProto_ReservedRange::IsInitialized() const { return true; } void DescriptorProto_ReservedRange::Swap(DescriptorProto_ReservedRange* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { DescriptorProto_ReservedRange* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void DescriptorProto_ReservedRange::UnsafeArenaSwap(DescriptorProto_ReservedRange* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void DescriptorProto_ReservedRange::InternalSwap(DescriptorProto_ReservedRange* other) { using std::swap; swap(start_, other->start_); swap(end_, other->end_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata DescriptorProto_ReservedRange::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void DescriptorProto::InitAsDefaultInstance() { ::google::protobuf::_DescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::MessageOptions*>( ::google::protobuf::MessageOptions::internal_default_instance()); } void DescriptorProto::_slow_mutable_options() { options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::MessageOptions >( GetArenaNoVirtual()); } void DescriptorProto::unsafe_arena_set_allocated_options( ::google::protobuf::MessageOptions* options) { if (GetArenaNoVirtual() == NULL) { delete options_; } options_ = options; if (options) { set_has_options(); } else { clear_has_options(); } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.DescriptorProto.options) } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int DescriptorProto::kNameFieldNumber; const int DescriptorProto::kFieldFieldNumber; const int DescriptorProto::kExtensionFieldNumber; const int DescriptorProto::kNestedTypeFieldNumber; const int DescriptorProto::kEnumTypeFieldNumber; const int DescriptorProto::kExtensionRangeFieldNumber; const int DescriptorProto::kOneofDeclFieldNumber; const int DescriptorProto::kOptionsFieldNumber; const int DescriptorProto::kReservedRangeFieldNumber; const int DescriptorProto::kReservedNameFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 DescriptorProto::DescriptorProto() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.DescriptorProto) } DescriptorProto::DescriptorProto(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), field_(arena), nested_type_(arena), enum_type_(arena), extension_range_(arena), extension_(arena), oneof_decl_(arena), reserved_range_(arena), reserved_name_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.DescriptorProto) } DescriptorProto::DescriptorProto(const DescriptorProto& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), field_(from.field_), nested_type_(from.nested_type_), enum_type_(from.enum_type_), extension_range_(from.extension_range_), extension_(from.extension_), oneof_decl_(from.oneof_decl_), reserved_range_(from.reserved_range_), reserved_name_(from.reserved_name_) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_name()) { name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(), GetArenaNoVirtual()); } if (from.has_options()) { options_ = new ::google::protobuf::MessageOptions(*from.options_); } else { options_ = NULL; } // @@protoc_insertion_point(copy_constructor:google.protobuf.DescriptorProto) } void DescriptorProto::SharedCtor() { _cached_size_ = 0; name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); options_ = NULL; } DescriptorProto::~DescriptorProto() { // @@protoc_insertion_point(destructor:google.protobuf.DescriptorProto) SharedDtor(); } void DescriptorProto::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (this != internal_default_instance()) delete options_; } void DescriptorProto::ArenaDtor(void* object) { DescriptorProto* _this = reinterpret_cast< DescriptorProto* >(object); (void)_this; } void DescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void DescriptorProto::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* DescriptorProto::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const DescriptorProto& DescriptorProto::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto(); return *internal_default_instance(); } DescriptorProto* DescriptorProto::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void DescriptorProto::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.DescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; field_.Clear(); nested_type_.Clear(); enum_type_.Clear(); extension_range_.Clear(); extension_.Clear(); oneof_decl_.Clear(); reserved_range_.Clear(); reserved_name_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(options_ != NULL); options_->Clear(); } } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool DescriptorProto::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.DescriptorProto) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.DescriptorProto.name"); } else { goto handle_unusual; } break; } // repeated .google.protobuf.FieldDescriptorProto field = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_field())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.DescriptorProto nested_type = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_nested_type())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_enum_type())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; case 5: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_extension_range())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.FieldDescriptorProto extension = 6; case 6: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_extension())); } else { goto handle_unusual; } break; } // optional .google.protobuf.MessageOptions options = 7; case 7: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 58 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_options())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; case 8: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(66u /* 66 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_oneof_decl())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9; case 9: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(74u /* 74 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_reserved_range())); } else { goto handle_unusual; } break; } // repeated string reserved_name = 10; case 10: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(82u /* 82 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->add_reserved_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->reserved_name(this->reserved_name_size() - 1).data(), static_cast(this->reserved_name(this->reserved_name_size() - 1).length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.DescriptorProto.reserved_name"); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.DescriptorProto) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.DescriptorProto) return false; #undef DO_ } void DescriptorProto::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.DescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.DescriptorProto.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // repeated .google.protobuf.FieldDescriptorProto field = 2; for (unsigned int i = 0, n = static_cast(this->field_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 2, this->field(static_cast(i)), output); } // repeated .google.protobuf.DescriptorProto nested_type = 3; for (unsigned int i = 0, n = static_cast(this->nested_type_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 3, this->nested_type(static_cast(i)), output); } // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; for (unsigned int i = 0, n = static_cast(this->enum_type_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 4, this->enum_type(static_cast(i)), output); } // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; for (unsigned int i = 0, n = static_cast(this->extension_range_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 5, this->extension_range(static_cast(i)), output); } // repeated .google.protobuf.FieldDescriptorProto extension = 6; for (unsigned int i = 0, n = static_cast(this->extension_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 6, this->extension(static_cast(i)), output); } // optional .google.protobuf.MessageOptions options = 7; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 7, *this->options_, output); } // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; for (unsigned int i = 0, n = static_cast(this->oneof_decl_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 8, this->oneof_decl(static_cast(i)), output); } // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9; for (unsigned int i = 0, n = static_cast(this->reserved_range_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 9, this->reserved_range(static_cast(i)), output); } // repeated string reserved_name = 10; for (int i = 0, n = this->reserved_name_size(); i < n; i++) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->reserved_name(i).data(), static_cast(this->reserved_name(i).length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.DescriptorProto.reserved_name"); ::google::protobuf::internal::WireFormatLite::WriteString( 10, this->reserved_name(i), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.DescriptorProto) } ::google::protobuf::uint8* DescriptorProto::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.DescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.DescriptorProto.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // repeated .google.protobuf.FieldDescriptorProto field = 2; for (unsigned int i = 0, n = static_cast(this->field_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 2, this->field(static_cast(i)), deterministic, target); } // repeated .google.protobuf.DescriptorProto nested_type = 3; for (unsigned int i = 0, n = static_cast(this->nested_type_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 3, this->nested_type(static_cast(i)), deterministic, target); } // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; for (unsigned int i = 0, n = static_cast(this->enum_type_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 4, this->enum_type(static_cast(i)), deterministic, target); } // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; for (unsigned int i = 0, n = static_cast(this->extension_range_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 5, this->extension_range(static_cast(i)), deterministic, target); } // repeated .google.protobuf.FieldDescriptorProto extension = 6; for (unsigned int i = 0, n = static_cast(this->extension_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 6, this->extension(static_cast(i)), deterministic, target); } // optional .google.protobuf.MessageOptions options = 7; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 7, *this->options_, deterministic, target); } // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; for (unsigned int i = 0, n = static_cast(this->oneof_decl_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 8, this->oneof_decl(static_cast(i)), deterministic, target); } // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9; for (unsigned int i = 0, n = static_cast(this->reserved_range_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 9, this->reserved_range(static_cast(i)), deterministic, target); } // repeated string reserved_name = 10; for (int i = 0, n = this->reserved_name_size(); i < n; i++) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->reserved_name(i).data(), static_cast(this->reserved_name(i).length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.DescriptorProto.reserved_name"); target = ::google::protobuf::internal::WireFormatLite:: WriteStringToArray(10, this->reserved_name(i), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.DescriptorProto) return target; } size_t DescriptorProto::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.DescriptorProto) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.FieldDescriptorProto field = 2; { unsigned int count = static_cast(this->field_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->field(static_cast(i))); } } // repeated .google.protobuf.DescriptorProto nested_type = 3; { unsigned int count = static_cast(this->nested_type_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->nested_type(static_cast(i))); } } // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; { unsigned int count = static_cast(this->enum_type_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->enum_type(static_cast(i))); } } // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; { unsigned int count = static_cast(this->extension_range_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->extension_range(static_cast(i))); } } // repeated .google.protobuf.FieldDescriptorProto extension = 6; { unsigned int count = static_cast(this->extension_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->extension(static_cast(i))); } } // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; { unsigned int count = static_cast(this->oneof_decl_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->oneof_decl(static_cast(i))); } } // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9; { unsigned int count = static_cast(this->reserved_range_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->reserved_range(static_cast(i))); } } // repeated string reserved_name = 10; total_size += 1 * ::google::protobuf::internal::FromIntSize(this->reserved_name_size()); for (int i = 0, n = this->reserved_name_size(); i < n; i++) { total_size += ::google::protobuf::internal::WireFormatLite::StringSize( this->reserved_name(i)); } if (_has_bits_[0 / 32] & 3u) { // optional string name = 1; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // optional .google.protobuf.MessageOptions options = 7; if (has_options()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->options_); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void DescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.DescriptorProto) GOOGLE_DCHECK_NE(&from, this); const DescriptorProto* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.DescriptorProto) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.DescriptorProto) MergeFrom(*source); } } void DescriptorProto::MergeFrom(const DescriptorProto& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.DescriptorProto) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; field_.MergeFrom(from.field_); nested_type_.MergeFrom(from.nested_type_); enum_type_.MergeFrom(from.enum_type_); extension_range_.MergeFrom(from.extension_range_); extension_.MergeFrom(from.extension_); oneof_decl_.MergeFrom(from.oneof_decl_); reserved_range_.MergeFrom(from.reserved_range_); reserved_name_.MergeFrom(from.reserved_name_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { set_name(from.name()); } if (cached_has_bits & 0x00000002u) { mutable_options()->::google::protobuf::MessageOptions::MergeFrom(from.options()); } } } void DescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.DescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } void DescriptorProto::CopyFrom(const DescriptorProto& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.DescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } bool DescriptorProto::IsInitialized() const { if (!::google::protobuf::internal::AllAreInitialized(this->field())) return false; if (!::google::protobuf::internal::AllAreInitialized(this->nested_type())) return false; if (!::google::protobuf::internal::AllAreInitialized(this->enum_type())) return false; if (!::google::protobuf::internal::AllAreInitialized(this->extension_range())) return false; if (!::google::protobuf::internal::AllAreInitialized(this->extension())) return false; if (!::google::protobuf::internal::AllAreInitialized(this->oneof_decl())) return false; if (has_options()) { if (!this->options_->IsInitialized()) return false; } return true; } void DescriptorProto::Swap(DescriptorProto* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { DescriptorProto* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void DescriptorProto::UnsafeArenaSwap(DescriptorProto* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void DescriptorProto::InternalSwap(DescriptorProto* other) { using std::swap; field_.InternalSwap(&other->field_); nested_type_.InternalSwap(&other->nested_type_); enum_type_.InternalSwap(&other->enum_type_); extension_range_.InternalSwap(&other->extension_range_); extension_.InternalSwap(&other->extension_); oneof_decl_.InternalSwap(&other->oneof_decl_); reserved_range_.InternalSwap(&other->reserved_range_); reserved_name_.InternalSwap(&other->reserved_name_); name_.Swap(&other->name_); swap(options_, other->options_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata DescriptorProto::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void ExtensionRangeOptions::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int ExtensionRangeOptions::kUninterpretedOptionFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 ExtensionRangeOptions::ExtensionRangeOptions() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsExtensionRangeOptions(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.ExtensionRangeOptions) } ExtensionRangeOptions::ExtensionRangeOptions(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _extensions_(arena), _internal_metadata_(arena), uninterpreted_option_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsExtensionRangeOptions(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.ExtensionRangeOptions) } ExtensionRangeOptions::ExtensionRangeOptions(const ExtensionRangeOptions& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), uninterpreted_option_(from.uninterpreted_option_) { _internal_metadata_.MergeFrom(from._internal_metadata_); _extensions_.MergeFrom(from._extensions_); // @@protoc_insertion_point(copy_constructor:google.protobuf.ExtensionRangeOptions) } void ExtensionRangeOptions::SharedCtor() { _cached_size_ = 0; } ExtensionRangeOptions::~ExtensionRangeOptions() { // @@protoc_insertion_point(destructor:google.protobuf.ExtensionRangeOptions) SharedDtor(); } void ExtensionRangeOptions::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void ExtensionRangeOptions::ArenaDtor(void* object) { ExtensionRangeOptions* _this = reinterpret_cast< ExtensionRangeOptions* >(object); (void)_this; } void ExtensionRangeOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void ExtensionRangeOptions::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* ExtensionRangeOptions::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const ExtensionRangeOptions& ExtensionRangeOptions::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsExtensionRangeOptions(); return *internal_default_instance(); } ExtensionRangeOptions* ExtensionRangeOptions::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void ExtensionRangeOptions::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.ExtensionRangeOptions) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; _extensions_.Clear(); uninterpreted_option_.Clear(); _has_bits_.Clear(); _internal_metadata_.Clear(); } bool ExtensionRangeOptions::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.ExtensionRangeOptions) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; case 999: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } if ((8000u <= tag)) { DO_(_extensions_.ParseField(tag, input, internal_default_instance(), _internal_metadata_.mutable_unknown_fields())); continue; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.ExtensionRangeOptions) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.ExtensionRangeOptions) return false; #undef DO_ } void ExtensionRangeOptions::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.ExtensionRangeOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 999, this->uninterpreted_option(static_cast(i)), output); } // Extension range [1000, 536870912) _extensions_.SerializeWithCachedSizes( 1000, 536870912, output); if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.ExtensionRangeOptions) } ::google::protobuf::uint8* ExtensionRangeOptions::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ExtensionRangeOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 999, this->uninterpreted_option(static_cast(i)), deterministic, target); } // Extension range [1000, 536870912) target = _extensions_.InternalSerializeWithCachedSizesToArray( 1000, 536870912, deterministic, target); if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ExtensionRangeOptions) return target; } size_t ExtensionRangeOptions::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.ExtensionRangeOptions) size_t total_size = 0; total_size += _extensions_.ByteSize(); if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; { unsigned int count = static_cast(this->uninterpreted_option_size()); total_size += 2UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->uninterpreted_option(static_cast(i))); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void ExtensionRangeOptions::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.ExtensionRangeOptions) GOOGLE_DCHECK_NE(&from, this); const ExtensionRangeOptions* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.ExtensionRangeOptions) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.ExtensionRangeOptions) MergeFrom(*source); } } void ExtensionRangeOptions::MergeFrom(const ExtensionRangeOptions& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ExtensionRangeOptions) GOOGLE_DCHECK_NE(&from, this); _extensions_.MergeFrom(from._extensions_); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; uninterpreted_option_.MergeFrom(from.uninterpreted_option_); } void ExtensionRangeOptions::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.ExtensionRangeOptions) if (&from == this) return; Clear(); MergeFrom(from); } void ExtensionRangeOptions::CopyFrom(const ExtensionRangeOptions& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.ExtensionRangeOptions) if (&from == this) return; Clear(); MergeFrom(from); } bool ExtensionRangeOptions::IsInitialized() const { if (!_extensions_.IsInitialized()) { return false; } if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; return true; } void ExtensionRangeOptions::Swap(ExtensionRangeOptions* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { ExtensionRangeOptions* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void ExtensionRangeOptions::UnsafeArenaSwap(ExtensionRangeOptions* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void ExtensionRangeOptions::InternalSwap(ExtensionRangeOptions* other) { using std::swap; uninterpreted_option_.InternalSwap(&other->uninterpreted_option_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); _extensions_.Swap(&other->_extensions_); } ::google::protobuf::Metadata ExtensionRangeOptions::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void FieldDescriptorProto::InitAsDefaultInstance() { ::google::protobuf::_FieldDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::FieldOptions*>( ::google::protobuf::FieldOptions::internal_default_instance()); } void FieldDescriptorProto::_slow_mutable_options() { options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::FieldOptions >( GetArenaNoVirtual()); } void FieldDescriptorProto::unsafe_arena_set_allocated_options( ::google::protobuf::FieldOptions* options) { if (GetArenaNoVirtual() == NULL) { delete options_; } options_ = options; if (options) { set_has_options(); } else { clear_has_options(); } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.options) } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int FieldDescriptorProto::kNameFieldNumber; const int FieldDescriptorProto::kNumberFieldNumber; const int FieldDescriptorProto::kLabelFieldNumber; const int FieldDescriptorProto::kTypeFieldNumber; const int FieldDescriptorProto::kTypeNameFieldNumber; const int FieldDescriptorProto::kExtendeeFieldNumber; const int FieldDescriptorProto::kDefaultValueFieldNumber; const int FieldDescriptorProto::kOneofIndexFieldNumber; const int FieldDescriptorProto::kJsonNameFieldNumber; const int FieldDescriptorProto::kOptionsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 FieldDescriptorProto::FieldDescriptorProto() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProto(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.FieldDescriptorProto) } FieldDescriptorProto::FieldDescriptorProto(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProto(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.FieldDescriptorProto) } FieldDescriptorProto::FieldDescriptorProto(const FieldDescriptorProto& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_name()) { name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(), GetArenaNoVirtual()); } extendee_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_extendee()) { extendee_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.extendee(), GetArenaNoVirtual()); } type_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_type_name()) { type_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.type_name(), GetArenaNoVirtual()); } default_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_default_value()) { default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.default_value(), GetArenaNoVirtual()); } json_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_json_name()) { json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.json_name(), GetArenaNoVirtual()); } if (from.has_options()) { options_ = new ::google::protobuf::FieldOptions(*from.options_); } else { options_ = NULL; } ::memcpy(&number_, &from.number_, static_cast(reinterpret_cast(&type_) - reinterpret_cast(&number_)) + sizeof(type_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldDescriptorProto) } void FieldDescriptorProto::SharedCtor() { _cached_size_ = 0; name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); extendee_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); type_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); default_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); json_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(&options_, 0, static_cast( reinterpret_cast(&oneof_index_) - reinterpret_cast(&options_)) + sizeof(oneof_index_)); label_ = 1; type_ = 1; } FieldDescriptorProto::~FieldDescriptorProto() { // @@protoc_insertion_point(destructor:google.protobuf.FieldDescriptorProto) SharedDtor(); } void FieldDescriptorProto::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); extendee_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); type_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); default_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); json_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (this != internal_default_instance()) delete options_; } void FieldDescriptorProto::ArenaDtor(void* object) { FieldDescriptorProto* _this = reinterpret_cast< FieldDescriptorProto* >(object); (void)_this; } void FieldDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void FieldDescriptorProto::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* FieldDescriptorProto::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const FieldDescriptorProto& FieldDescriptorProto::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProto(); return *internal_default_instance(); } FieldDescriptorProto* FieldDescriptorProto::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void FieldDescriptorProto::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.FieldDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; cached_has_bits = _has_bits_[0]; if (cached_has_bits & 63u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(!extendee_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); extendee_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000004u) { GOOGLE_DCHECK(!type_name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); type_name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000008u) { GOOGLE_DCHECK(!default_value_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); default_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000010u) { GOOGLE_DCHECK(!json_name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); json_name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000020u) { GOOGLE_DCHECK(options_ != NULL); options_->Clear(); } } if (cached_has_bits & 192u) { ::memset(&number_, 0, static_cast( reinterpret_cast(&oneof_index_) - reinterpret_cast(&number_)) + sizeof(oneof_index_)); } if (cached_has_bits & 768u) { label_ = 1; type_ = 1; } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool FieldDescriptorProto::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.FieldDescriptorProto) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FieldDescriptorProto.name"); } else { goto handle_unusual; } break; } // optional string extendee = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_extendee())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->extendee().data(), static_cast(this->extendee().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FieldDescriptorProto.extendee"); } else { goto handle_unusual; } break; } // optional int32 number = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) { set_has_number(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &number_))); } else { goto handle_unusual; } break; } // optional .google.protobuf.FieldDescriptorProto.Label label = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(32u /* 32 & 0xFF */)) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); if (::google::protobuf::FieldDescriptorProto_Label_IsValid(value)) { set_label(static_cast< ::google::protobuf::FieldDescriptorProto_Label >(value)); } else { mutable_unknown_fields()->AddVarint( 4, static_cast< ::google::protobuf::uint64>(value)); } } else { goto handle_unusual; } break; } // optional .google.protobuf.FieldDescriptorProto.Type type = 5; case 5: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(40u /* 40 & 0xFF */)) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); if (::google::protobuf::FieldDescriptorProto_Type_IsValid(value)) { set_type(static_cast< ::google::protobuf::FieldDescriptorProto_Type >(value)); } else { mutable_unknown_fields()->AddVarint( 5, static_cast< ::google::protobuf::uint64>(value)); } } else { goto handle_unusual; } break; } // optional string type_name = 6; case 6: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_type_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->type_name().data(), static_cast(this->type_name().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FieldDescriptorProto.type_name"); } else { goto handle_unusual; } break; } // optional string default_value = 7; case 7: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 58 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_default_value())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->default_value().data(), static_cast(this->default_value().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FieldDescriptorProto.default_value"); } else { goto handle_unusual; } break; } // optional .google.protobuf.FieldOptions options = 8; case 8: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(66u /* 66 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_options())); } else { goto handle_unusual; } break; } // optional int32 oneof_index = 9; case 9: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(72u /* 72 & 0xFF */)) { set_has_oneof_index(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &oneof_index_))); } else { goto handle_unusual; } break; } // optional string json_name = 10; case 10: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(82u /* 82 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_json_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->json_name().data(), static_cast(this->json_name().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FieldDescriptorProto.json_name"); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.FieldDescriptorProto) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.FieldDescriptorProto) return false; #undef DO_ } void FieldDescriptorProto::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.FieldDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FieldDescriptorProto.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // optional string extendee = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->extendee().data(), static_cast(this->extendee().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FieldDescriptorProto.extendee"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 2, this->extendee(), output); } // optional int32 number = 3; if (cached_has_bits & 0x00000040u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->number(), output); } // optional .google.protobuf.FieldDescriptorProto.Label label = 4; if (cached_has_bits & 0x00000100u) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 4, this->label(), output); } // optional .google.protobuf.FieldDescriptorProto.Type type = 5; if (cached_has_bits & 0x00000200u) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 5, this->type(), output); } // optional string type_name = 6; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->type_name().data(), static_cast(this->type_name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FieldDescriptorProto.type_name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 6, this->type_name(), output); } // optional string default_value = 7; if (cached_has_bits & 0x00000008u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->default_value().data(), static_cast(this->default_value().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FieldDescriptorProto.default_value"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 7, this->default_value(), output); } // optional .google.protobuf.FieldOptions options = 8; if (cached_has_bits & 0x00000020u) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 8, *this->options_, output); } // optional int32 oneof_index = 9; if (cached_has_bits & 0x00000080u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(9, this->oneof_index(), output); } // optional string json_name = 10; if (cached_has_bits & 0x00000010u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->json_name().data(), static_cast(this->json_name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FieldDescriptorProto.json_name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 10, this->json_name(), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.FieldDescriptorProto) } ::google::protobuf::uint8* FieldDescriptorProto::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FieldDescriptorProto.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // optional string extendee = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->extendee().data(), static_cast(this->extendee().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FieldDescriptorProto.extendee"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 2, this->extendee(), target); } // optional int32 number = 3; if (cached_has_bits & 0x00000040u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(3, this->number(), target); } // optional .google.protobuf.FieldDescriptorProto.Label label = 4; if (cached_has_bits & 0x00000100u) { target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( 4, this->label(), target); } // optional .google.protobuf.FieldDescriptorProto.Type type = 5; if (cached_has_bits & 0x00000200u) { target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( 5, this->type(), target); } // optional string type_name = 6; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->type_name().data(), static_cast(this->type_name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FieldDescriptorProto.type_name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 6, this->type_name(), target); } // optional string default_value = 7; if (cached_has_bits & 0x00000008u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->default_value().data(), static_cast(this->default_value().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FieldDescriptorProto.default_value"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 7, this->default_value(), target); } // optional .google.protobuf.FieldOptions options = 8; if (cached_has_bits & 0x00000020u) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 8, *this->options_, deterministic, target); } // optional int32 oneof_index = 9; if (cached_has_bits & 0x00000080u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(9, this->oneof_index(), target); } // optional string json_name = 10; if (cached_has_bits & 0x00000010u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->json_name().data(), static_cast(this->json_name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FieldDescriptorProto.json_name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 10, this->json_name(), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldDescriptorProto) return target; } size_t FieldDescriptorProto::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FieldDescriptorProto) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } if (_has_bits_[0 / 32] & 255u) { // optional string name = 1; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // optional string extendee = 2; if (has_extendee()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->extendee()); } // optional string type_name = 6; if (has_type_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->type_name()); } // optional string default_value = 7; if (has_default_value()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->default_value()); } // optional string json_name = 10; if (has_json_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->json_name()); } // optional .google.protobuf.FieldOptions options = 8; if (has_options()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->options_); } // optional int32 number = 3; if (has_number()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->number()); } // optional int32 oneof_index = 9; if (has_oneof_index()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->oneof_index()); } } if (_has_bits_[8 / 32] & 768u) { // optional .google.protobuf.FieldDescriptorProto.Label label = 4; if (has_label()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->label()); } // optional .google.protobuf.FieldDescriptorProto.Type type = 5; if (has_type()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->type()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void FieldDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FieldDescriptorProto) GOOGLE_DCHECK_NE(&from, this); const FieldDescriptorProto* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.FieldDescriptorProto) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.FieldDescriptorProto) MergeFrom(*source); } } void FieldDescriptorProto::MergeFrom(const FieldDescriptorProto& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FieldDescriptorProto) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 255u) { if (cached_has_bits & 0x00000001u) { set_name(from.name()); } if (cached_has_bits & 0x00000002u) { set_extendee(from.extendee()); } if (cached_has_bits & 0x00000004u) { set_type_name(from.type_name()); } if (cached_has_bits & 0x00000008u) { set_default_value(from.default_value()); } if (cached_has_bits & 0x00000010u) { set_json_name(from.json_name()); } if (cached_has_bits & 0x00000020u) { mutable_options()->::google::protobuf::FieldOptions::MergeFrom(from.options()); } if (cached_has_bits & 0x00000040u) { number_ = from.number_; } if (cached_has_bits & 0x00000080u) { oneof_index_ = from.oneof_index_; } _has_bits_[0] |= cached_has_bits; } if (cached_has_bits & 768u) { if (cached_has_bits & 0x00000100u) { label_ = from.label_; } if (cached_has_bits & 0x00000200u) { type_ = from.type_; } _has_bits_[0] |= cached_has_bits; } } void FieldDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.FieldDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } void FieldDescriptorProto::CopyFrom(const FieldDescriptorProto& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FieldDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } bool FieldDescriptorProto::IsInitialized() const { if (has_options()) { if (!this->options_->IsInitialized()) return false; } return true; } void FieldDescriptorProto::Swap(FieldDescriptorProto* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { FieldDescriptorProto* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void FieldDescriptorProto::UnsafeArenaSwap(FieldDescriptorProto* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void FieldDescriptorProto::InternalSwap(FieldDescriptorProto* other) { using std::swap; name_.Swap(&other->name_); extendee_.Swap(&other->extendee_); type_name_.Swap(&other->type_name_); default_value_.Swap(&other->default_value_); json_name_.Swap(&other->json_name_); swap(options_, other->options_); swap(number_, other->number_); swap(oneof_index_, other->oneof_index_); swap(label_, other->label_); swap(type_, other->type_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata FieldDescriptorProto::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void OneofDescriptorProto::InitAsDefaultInstance() { ::google::protobuf::_OneofDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::OneofOptions*>( ::google::protobuf::OneofOptions::internal_default_instance()); } void OneofDescriptorProto::_slow_mutable_options() { options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::OneofOptions >( GetArenaNoVirtual()); } void OneofDescriptorProto::unsafe_arena_set_allocated_options( ::google::protobuf::OneofOptions* options) { if (GetArenaNoVirtual() == NULL) { delete options_; } options_ = options; if (options) { set_has_options(); } else { clear_has_options(); } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.OneofDescriptorProto.options) } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int OneofDescriptorProto::kNameFieldNumber; const int OneofDescriptorProto::kOptionsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 OneofDescriptorProto::OneofDescriptorProto() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofDescriptorProto(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.OneofDescriptorProto) } OneofDescriptorProto::OneofDescriptorProto(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofDescriptorProto(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.OneofDescriptorProto) } OneofDescriptorProto::OneofDescriptorProto(const OneofDescriptorProto& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_name()) { name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(), GetArenaNoVirtual()); } if (from.has_options()) { options_ = new ::google::protobuf::OneofOptions(*from.options_); } else { options_ = NULL; } // @@protoc_insertion_point(copy_constructor:google.protobuf.OneofDescriptorProto) } void OneofDescriptorProto::SharedCtor() { _cached_size_ = 0; name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); options_ = NULL; } OneofDescriptorProto::~OneofDescriptorProto() { // @@protoc_insertion_point(destructor:google.protobuf.OneofDescriptorProto) SharedDtor(); } void OneofDescriptorProto::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (this != internal_default_instance()) delete options_; } void OneofDescriptorProto::ArenaDtor(void* object) { OneofDescriptorProto* _this = reinterpret_cast< OneofDescriptorProto* >(object); (void)_this; } void OneofDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void OneofDescriptorProto::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* OneofDescriptorProto::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const OneofDescriptorProto& OneofDescriptorProto::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofDescriptorProto(); return *internal_default_instance(); } OneofDescriptorProto* OneofDescriptorProto::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void OneofDescriptorProto::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.OneofDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; cached_has_bits = _has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(options_ != NULL); options_->Clear(); } } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool OneofDescriptorProto::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.OneofDescriptorProto) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.OneofDescriptorProto.name"); } else { goto handle_unusual; } break; } // optional .google.protobuf.OneofOptions options = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_options())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.OneofDescriptorProto) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.OneofDescriptorProto) return false; #undef DO_ } void OneofDescriptorProto::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.OneofDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.OneofDescriptorProto.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // optional .google.protobuf.OneofOptions options = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 2, *this->options_, output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.OneofDescriptorProto) } ::google::protobuf::uint8* OneofDescriptorProto::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.OneofDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.OneofDescriptorProto.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // optional .google.protobuf.OneofOptions options = 2; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 2, *this->options_, deterministic, target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.OneofDescriptorProto) return target; } size_t OneofDescriptorProto::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.OneofDescriptorProto) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } if (_has_bits_[0 / 32] & 3u) { // optional string name = 1; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // optional .google.protobuf.OneofOptions options = 2; if (has_options()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->options_); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void OneofDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.OneofDescriptorProto) GOOGLE_DCHECK_NE(&from, this); const OneofDescriptorProto* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.OneofDescriptorProto) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.OneofDescriptorProto) MergeFrom(*source); } } void OneofDescriptorProto::MergeFrom(const OneofDescriptorProto& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.OneofDescriptorProto) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { set_name(from.name()); } if (cached_has_bits & 0x00000002u) { mutable_options()->::google::protobuf::OneofOptions::MergeFrom(from.options()); } } } void OneofDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.OneofDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } void OneofDescriptorProto::CopyFrom(const OneofDescriptorProto& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.OneofDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } bool OneofDescriptorProto::IsInitialized() const { if (has_options()) { if (!this->options_->IsInitialized()) return false; } return true; } void OneofDescriptorProto::Swap(OneofDescriptorProto* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { OneofDescriptorProto* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void OneofDescriptorProto::UnsafeArenaSwap(OneofDescriptorProto* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void OneofDescriptorProto::InternalSwap(OneofDescriptorProto* other) { using std::swap; name_.Swap(&other->name_); swap(options_, other->options_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata OneofDescriptorProto::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void EnumDescriptorProto_EnumReservedRange::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int EnumDescriptorProto_EnumReservedRange::kStartFieldNumber; const int EnumDescriptorProto_EnumReservedRange::kEndFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 EnumDescriptorProto_EnumReservedRange::EnumDescriptorProto_EnumReservedRange() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto_EnumReservedRange(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.EnumDescriptorProto.EnumReservedRange) } EnumDescriptorProto_EnumReservedRange::EnumDescriptorProto_EnumReservedRange(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto_EnumReservedRange(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumDescriptorProto.EnumReservedRange) } EnumDescriptorProto_EnumReservedRange::EnumDescriptorProto_EnumReservedRange(const EnumDescriptorProto_EnumReservedRange& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); ::memcpy(&start_, &from.start_, static_cast(reinterpret_cast(&end_) - reinterpret_cast(&start_)) + sizeof(end_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumDescriptorProto.EnumReservedRange) } void EnumDescriptorProto_EnumReservedRange::SharedCtor() { _cached_size_ = 0; ::memset(&start_, 0, static_cast( reinterpret_cast(&end_) - reinterpret_cast(&start_)) + sizeof(end_)); } EnumDescriptorProto_EnumReservedRange::~EnumDescriptorProto_EnumReservedRange() { // @@protoc_insertion_point(destructor:google.protobuf.EnumDescriptorProto.EnumReservedRange) SharedDtor(); } void EnumDescriptorProto_EnumReservedRange::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void EnumDescriptorProto_EnumReservedRange::ArenaDtor(void* object) { EnumDescriptorProto_EnumReservedRange* _this = reinterpret_cast< EnumDescriptorProto_EnumReservedRange* >(object); (void)_this; } void EnumDescriptorProto_EnumReservedRange::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void EnumDescriptorProto_EnumReservedRange::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* EnumDescriptorProto_EnumReservedRange::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const EnumDescriptorProto_EnumReservedRange& EnumDescriptorProto_EnumReservedRange::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto_EnumReservedRange(); return *internal_default_instance(); } EnumDescriptorProto_EnumReservedRange* EnumDescriptorProto_EnumReservedRange::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void EnumDescriptorProto_EnumReservedRange::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.EnumDescriptorProto.EnumReservedRange) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; cached_has_bits = _has_bits_[0]; if (cached_has_bits & 3u) { ::memset(&start_, 0, static_cast( reinterpret_cast(&end_) - reinterpret_cast(&start_)) + sizeof(end_)); } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool EnumDescriptorProto_EnumReservedRange::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.EnumDescriptorProto.EnumReservedRange) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional int32 start = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { set_has_start(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &start_))); } else { goto handle_unusual; } break; } // optional int32 end = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { set_has_end(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &end_))); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.EnumDescriptorProto.EnumReservedRange) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.EnumDescriptorProto.EnumReservedRange) return false; #undef DO_ } void EnumDescriptorProto_EnumReservedRange::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.EnumDescriptorProto.EnumReservedRange) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional int32 start = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output); } // optional int32 end = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.EnumDescriptorProto.EnumReservedRange) } ::google::protobuf::uint8* EnumDescriptorProto_EnumReservedRange::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumDescriptorProto.EnumReservedRange) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional int32 start = 1; if (cached_has_bits & 0x00000001u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->start(), target); } // optional int32 end = 2; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->end(), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumDescriptorProto.EnumReservedRange) return target; } size_t EnumDescriptorProto_EnumReservedRange::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumDescriptorProto.EnumReservedRange) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } if (_has_bits_[0 / 32] & 3u) { // optional int32 start = 1; if (has_start()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->start()); } // optional int32 end = 2; if (has_end()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->end()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void EnumDescriptorProto_EnumReservedRange::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.EnumDescriptorProto.EnumReservedRange) GOOGLE_DCHECK_NE(&from, this); const EnumDescriptorProto_EnumReservedRange* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.EnumDescriptorProto.EnumReservedRange) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.EnumDescriptorProto.EnumReservedRange) MergeFrom(*source); } } void EnumDescriptorProto_EnumReservedRange::MergeFrom(const EnumDescriptorProto_EnumReservedRange& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumDescriptorProto.EnumReservedRange) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { start_ = from.start_; } if (cached_has_bits & 0x00000002u) { end_ = from.end_; } _has_bits_[0] |= cached_has_bits; } } void EnumDescriptorProto_EnumReservedRange::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.EnumDescriptorProto.EnumReservedRange) if (&from == this) return; Clear(); MergeFrom(from); } void EnumDescriptorProto_EnumReservedRange::CopyFrom(const EnumDescriptorProto_EnumReservedRange& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumDescriptorProto.EnumReservedRange) if (&from == this) return; Clear(); MergeFrom(from); } bool EnumDescriptorProto_EnumReservedRange::IsInitialized() const { return true; } void EnumDescriptorProto_EnumReservedRange::Swap(EnumDescriptorProto_EnumReservedRange* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { EnumDescriptorProto_EnumReservedRange* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void EnumDescriptorProto_EnumReservedRange::UnsafeArenaSwap(EnumDescriptorProto_EnumReservedRange* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void EnumDescriptorProto_EnumReservedRange::InternalSwap(EnumDescriptorProto_EnumReservedRange* other) { using std::swap; swap(start_, other->start_); swap(end_, other->end_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata EnumDescriptorProto_EnumReservedRange::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void EnumDescriptorProto::InitAsDefaultInstance() { ::google::protobuf::_EnumDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::EnumOptions*>( ::google::protobuf::EnumOptions::internal_default_instance()); } void EnumDescriptorProto::_slow_mutable_options() { options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::EnumOptions >( GetArenaNoVirtual()); } void EnumDescriptorProto::unsafe_arena_set_allocated_options( ::google::protobuf::EnumOptions* options) { if (GetArenaNoVirtual() == NULL) { delete options_; } options_ = options; if (options) { set_has_options(); } else { clear_has_options(); } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.EnumDescriptorProto.options) } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int EnumDescriptorProto::kNameFieldNumber; const int EnumDescriptorProto::kValueFieldNumber; const int EnumDescriptorProto::kOptionsFieldNumber; const int EnumDescriptorProto::kReservedRangeFieldNumber; const int EnumDescriptorProto::kReservedNameFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 EnumDescriptorProto::EnumDescriptorProto() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.EnumDescriptorProto) } EnumDescriptorProto::EnumDescriptorProto(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), value_(arena), reserved_range_(arena), reserved_name_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumDescriptorProto) } EnumDescriptorProto::EnumDescriptorProto(const EnumDescriptorProto& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), value_(from.value_), reserved_range_(from.reserved_range_), reserved_name_(from.reserved_name_) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_name()) { name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(), GetArenaNoVirtual()); } if (from.has_options()) { options_ = new ::google::protobuf::EnumOptions(*from.options_); } else { options_ = NULL; } // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumDescriptorProto) } void EnumDescriptorProto::SharedCtor() { _cached_size_ = 0; name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); options_ = NULL; } EnumDescriptorProto::~EnumDescriptorProto() { // @@protoc_insertion_point(destructor:google.protobuf.EnumDescriptorProto) SharedDtor(); } void EnumDescriptorProto::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (this != internal_default_instance()) delete options_; } void EnumDescriptorProto::ArenaDtor(void* object) { EnumDescriptorProto* _this = reinterpret_cast< EnumDescriptorProto* >(object); (void)_this; } void EnumDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void EnumDescriptorProto::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* EnumDescriptorProto::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const EnumDescriptorProto& EnumDescriptorProto::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto(); return *internal_default_instance(); } EnumDescriptorProto* EnumDescriptorProto::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void EnumDescriptorProto::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.EnumDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; value_.Clear(); reserved_range_.Clear(); reserved_name_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(options_ != NULL); options_->Clear(); } } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool EnumDescriptorProto::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.EnumDescriptorProto) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.EnumDescriptorProto.name"); } else { goto handle_unusual; } break; } // repeated .google.protobuf.EnumValueDescriptorProto value = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_value())); } else { goto handle_unusual; } break; } // optional .google.protobuf.EnumOptions options = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_options())); } else { goto handle_unusual; } break; } // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_reserved_range())); } else { goto handle_unusual; } break; } // repeated string reserved_name = 5; case 5: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->add_reserved_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->reserved_name(this->reserved_name_size() - 1).data(), static_cast(this->reserved_name(this->reserved_name_size() - 1).length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.EnumDescriptorProto.reserved_name"); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.EnumDescriptorProto) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.EnumDescriptorProto) return false; #undef DO_ } void EnumDescriptorProto::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.EnumDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.EnumDescriptorProto.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // repeated .google.protobuf.EnumValueDescriptorProto value = 2; for (unsigned int i = 0, n = static_cast(this->value_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 2, this->value(static_cast(i)), output); } // optional .google.protobuf.EnumOptions options = 3; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 3, *this->options_, output); } // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4; for (unsigned int i = 0, n = static_cast(this->reserved_range_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 4, this->reserved_range(static_cast(i)), output); } // repeated string reserved_name = 5; for (int i = 0, n = this->reserved_name_size(); i < n; i++) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->reserved_name(i).data(), static_cast(this->reserved_name(i).length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.EnumDescriptorProto.reserved_name"); ::google::protobuf::internal::WireFormatLite::WriteString( 5, this->reserved_name(i), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.EnumDescriptorProto) } ::google::protobuf::uint8* EnumDescriptorProto::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.EnumDescriptorProto.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // repeated .google.protobuf.EnumValueDescriptorProto value = 2; for (unsigned int i = 0, n = static_cast(this->value_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 2, this->value(static_cast(i)), deterministic, target); } // optional .google.protobuf.EnumOptions options = 3; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 3, *this->options_, deterministic, target); } // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4; for (unsigned int i = 0, n = static_cast(this->reserved_range_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 4, this->reserved_range(static_cast(i)), deterministic, target); } // repeated string reserved_name = 5; for (int i = 0, n = this->reserved_name_size(); i < n; i++) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->reserved_name(i).data(), static_cast(this->reserved_name(i).length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.EnumDescriptorProto.reserved_name"); target = ::google::protobuf::internal::WireFormatLite:: WriteStringToArray(5, this->reserved_name(i), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumDescriptorProto) return target; } size_t EnumDescriptorProto::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumDescriptorProto) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.EnumValueDescriptorProto value = 2; { unsigned int count = static_cast(this->value_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->value(static_cast(i))); } } // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4; { unsigned int count = static_cast(this->reserved_range_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->reserved_range(static_cast(i))); } } // repeated string reserved_name = 5; total_size += 1 * ::google::protobuf::internal::FromIntSize(this->reserved_name_size()); for (int i = 0, n = this->reserved_name_size(); i < n; i++) { total_size += ::google::protobuf::internal::WireFormatLite::StringSize( this->reserved_name(i)); } if (_has_bits_[0 / 32] & 3u) { // optional string name = 1; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // optional .google.protobuf.EnumOptions options = 3; if (has_options()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->options_); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void EnumDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.EnumDescriptorProto) GOOGLE_DCHECK_NE(&from, this); const EnumDescriptorProto* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.EnumDescriptorProto) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.EnumDescriptorProto) MergeFrom(*source); } } void EnumDescriptorProto::MergeFrom(const EnumDescriptorProto& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumDescriptorProto) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; value_.MergeFrom(from.value_); reserved_range_.MergeFrom(from.reserved_range_); reserved_name_.MergeFrom(from.reserved_name_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { set_name(from.name()); } if (cached_has_bits & 0x00000002u) { mutable_options()->::google::protobuf::EnumOptions::MergeFrom(from.options()); } } } void EnumDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.EnumDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } void EnumDescriptorProto::CopyFrom(const EnumDescriptorProto& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } bool EnumDescriptorProto::IsInitialized() const { if (!::google::protobuf::internal::AllAreInitialized(this->value())) return false; if (has_options()) { if (!this->options_->IsInitialized()) return false; } return true; } void EnumDescriptorProto::Swap(EnumDescriptorProto* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { EnumDescriptorProto* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void EnumDescriptorProto::UnsafeArenaSwap(EnumDescriptorProto* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void EnumDescriptorProto::InternalSwap(EnumDescriptorProto* other) { using std::swap; value_.InternalSwap(&other->value_); reserved_range_.InternalSwap(&other->reserved_range_); reserved_name_.InternalSwap(&other->reserved_name_); name_.Swap(&other->name_); swap(options_, other->options_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata EnumDescriptorProto::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void EnumValueDescriptorProto::InitAsDefaultInstance() { ::google::protobuf::_EnumValueDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::EnumValueOptions*>( ::google::protobuf::EnumValueOptions::internal_default_instance()); } void EnumValueDescriptorProto::_slow_mutable_options() { options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::EnumValueOptions >( GetArenaNoVirtual()); } void EnumValueDescriptorProto::unsafe_arena_set_allocated_options( ::google::protobuf::EnumValueOptions* options) { if (GetArenaNoVirtual() == NULL) { delete options_; } options_ = options; if (options) { set_has_options(); } else { clear_has_options(); } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.EnumValueDescriptorProto.options) } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int EnumValueDescriptorProto::kNameFieldNumber; const int EnumValueDescriptorProto::kNumberFieldNumber; const int EnumValueDescriptorProto::kOptionsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 EnumValueDescriptorProto::EnumValueDescriptorProto() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueDescriptorProto(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.EnumValueDescriptorProto) } EnumValueDescriptorProto::EnumValueDescriptorProto(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueDescriptorProto(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumValueDescriptorProto) } EnumValueDescriptorProto::EnumValueDescriptorProto(const EnumValueDescriptorProto& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_name()) { name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(), GetArenaNoVirtual()); } if (from.has_options()) { options_ = new ::google::protobuf::EnumValueOptions(*from.options_); } else { options_ = NULL; } number_ = from.number_; // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumValueDescriptorProto) } void EnumValueDescriptorProto::SharedCtor() { _cached_size_ = 0; name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(&options_, 0, static_cast( reinterpret_cast(&number_) - reinterpret_cast(&options_)) + sizeof(number_)); } EnumValueDescriptorProto::~EnumValueDescriptorProto() { // @@protoc_insertion_point(destructor:google.protobuf.EnumValueDescriptorProto) SharedDtor(); } void EnumValueDescriptorProto::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (this != internal_default_instance()) delete options_; } void EnumValueDescriptorProto::ArenaDtor(void* object) { EnumValueDescriptorProto* _this = reinterpret_cast< EnumValueDescriptorProto* >(object); (void)_this; } void EnumValueDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void EnumValueDescriptorProto::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* EnumValueDescriptorProto::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const EnumValueDescriptorProto& EnumValueDescriptorProto::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueDescriptorProto(); return *internal_default_instance(); } EnumValueDescriptorProto* EnumValueDescriptorProto::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void EnumValueDescriptorProto::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.EnumValueDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; cached_has_bits = _has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(options_ != NULL); options_->Clear(); } } number_ = 0; _has_bits_.Clear(); _internal_metadata_.Clear(); } bool EnumValueDescriptorProto::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.EnumValueDescriptorProto) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.EnumValueDescriptorProto.name"); } else { goto handle_unusual; } break; } // optional int32 number = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { set_has_number(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &number_))); } else { goto handle_unusual; } break; } // optional .google.protobuf.EnumValueOptions options = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_options())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.EnumValueDescriptorProto) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.EnumValueDescriptorProto) return false; #undef DO_ } void EnumValueDescriptorProto::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.EnumValueDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.EnumValueDescriptorProto.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // optional int32 number = 2; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->number(), output); } // optional .google.protobuf.EnumValueOptions options = 3; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 3, *this->options_, output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.EnumValueDescriptorProto) } ::google::protobuf::uint8* EnumValueDescriptorProto::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValueDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.EnumValueDescriptorProto.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // optional int32 number = 2; if (cached_has_bits & 0x00000004u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->number(), target); } // optional .google.protobuf.EnumValueOptions options = 3; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 3, *this->options_, deterministic, target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumValueDescriptorProto) return target; } size_t EnumValueDescriptorProto::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumValueDescriptorProto) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } if (_has_bits_[0 / 32] & 7u) { // optional string name = 1; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // optional .google.protobuf.EnumValueOptions options = 3; if (has_options()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->options_); } // optional int32 number = 2; if (has_number()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->number()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void EnumValueDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.EnumValueDescriptorProto) GOOGLE_DCHECK_NE(&from, this); const EnumValueDescriptorProto* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.EnumValueDescriptorProto) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.EnumValueDescriptorProto) MergeFrom(*source); } } void EnumValueDescriptorProto::MergeFrom(const EnumValueDescriptorProto& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumValueDescriptorProto) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 7u) { if (cached_has_bits & 0x00000001u) { set_name(from.name()); } if (cached_has_bits & 0x00000002u) { mutable_options()->::google::protobuf::EnumValueOptions::MergeFrom(from.options()); } if (cached_has_bits & 0x00000004u) { number_ = from.number_; } _has_bits_[0] |= cached_has_bits; } } void EnumValueDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.EnumValueDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } void EnumValueDescriptorProto::CopyFrom(const EnumValueDescriptorProto& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumValueDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } bool EnumValueDescriptorProto::IsInitialized() const { if (has_options()) { if (!this->options_->IsInitialized()) return false; } return true; } void EnumValueDescriptorProto::Swap(EnumValueDescriptorProto* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { EnumValueDescriptorProto* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void EnumValueDescriptorProto::UnsafeArenaSwap(EnumValueDescriptorProto* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void EnumValueDescriptorProto::InternalSwap(EnumValueDescriptorProto* other) { using std::swap; name_.Swap(&other->name_); swap(options_, other->options_); swap(number_, other->number_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata EnumValueDescriptorProto::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void ServiceDescriptorProto::InitAsDefaultInstance() { ::google::protobuf::_ServiceDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::ServiceOptions*>( ::google::protobuf::ServiceOptions::internal_default_instance()); } void ServiceDescriptorProto::_slow_mutable_options() { options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::ServiceOptions >( GetArenaNoVirtual()); } void ServiceDescriptorProto::unsafe_arena_set_allocated_options( ::google::protobuf::ServiceOptions* options) { if (GetArenaNoVirtual() == NULL) { delete options_; } options_ = options; if (options) { set_has_options(); } else { clear_has_options(); } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.ServiceDescriptorProto.options) } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int ServiceDescriptorProto::kNameFieldNumber; const int ServiceDescriptorProto::kMethodFieldNumber; const int ServiceDescriptorProto::kOptionsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 ServiceDescriptorProto::ServiceDescriptorProto() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceDescriptorProto(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.ServiceDescriptorProto) } ServiceDescriptorProto::ServiceDescriptorProto(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), method_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceDescriptorProto(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.ServiceDescriptorProto) } ServiceDescriptorProto::ServiceDescriptorProto(const ServiceDescriptorProto& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), method_(from.method_) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_name()) { name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(), GetArenaNoVirtual()); } if (from.has_options()) { options_ = new ::google::protobuf::ServiceOptions(*from.options_); } else { options_ = NULL; } // @@protoc_insertion_point(copy_constructor:google.protobuf.ServiceDescriptorProto) } void ServiceDescriptorProto::SharedCtor() { _cached_size_ = 0; name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); options_ = NULL; } ServiceDescriptorProto::~ServiceDescriptorProto() { // @@protoc_insertion_point(destructor:google.protobuf.ServiceDescriptorProto) SharedDtor(); } void ServiceDescriptorProto::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (this != internal_default_instance()) delete options_; } void ServiceDescriptorProto::ArenaDtor(void* object) { ServiceDescriptorProto* _this = reinterpret_cast< ServiceDescriptorProto* >(object); (void)_this; } void ServiceDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void ServiceDescriptorProto::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* ServiceDescriptorProto::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const ServiceDescriptorProto& ServiceDescriptorProto::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceDescriptorProto(); return *internal_default_instance(); } ServiceDescriptorProto* ServiceDescriptorProto::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void ServiceDescriptorProto::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.ServiceDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; method_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(options_ != NULL); options_->Clear(); } } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool ServiceDescriptorProto::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.ServiceDescriptorProto) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.ServiceDescriptorProto.name"); } else { goto handle_unusual; } break; } // repeated .google.protobuf.MethodDescriptorProto method = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_method())); } else { goto handle_unusual; } break; } // optional .google.protobuf.ServiceOptions options = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_options())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.ServiceDescriptorProto) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.ServiceDescriptorProto) return false; #undef DO_ } void ServiceDescriptorProto::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.ServiceDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.ServiceDescriptorProto.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // repeated .google.protobuf.MethodDescriptorProto method = 2; for (unsigned int i = 0, n = static_cast(this->method_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 2, this->method(static_cast(i)), output); } // optional .google.protobuf.ServiceOptions options = 3; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 3, *this->options_, output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.ServiceDescriptorProto) } ::google::protobuf::uint8* ServiceDescriptorProto::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ServiceDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.ServiceDescriptorProto.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // repeated .google.protobuf.MethodDescriptorProto method = 2; for (unsigned int i = 0, n = static_cast(this->method_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 2, this->method(static_cast(i)), deterministic, target); } // optional .google.protobuf.ServiceOptions options = 3; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 3, *this->options_, deterministic, target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ServiceDescriptorProto) return target; } size_t ServiceDescriptorProto::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.ServiceDescriptorProto) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.MethodDescriptorProto method = 2; { unsigned int count = static_cast(this->method_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->method(static_cast(i))); } } if (_has_bits_[0 / 32] & 3u) { // optional string name = 1; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // optional .google.protobuf.ServiceOptions options = 3; if (has_options()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->options_); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void ServiceDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.ServiceDescriptorProto) GOOGLE_DCHECK_NE(&from, this); const ServiceDescriptorProto* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.ServiceDescriptorProto) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.ServiceDescriptorProto) MergeFrom(*source); } } void ServiceDescriptorProto::MergeFrom(const ServiceDescriptorProto& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ServiceDescriptorProto) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; method_.MergeFrom(from.method_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { set_name(from.name()); } if (cached_has_bits & 0x00000002u) { mutable_options()->::google::protobuf::ServiceOptions::MergeFrom(from.options()); } } } void ServiceDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.ServiceDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } void ServiceDescriptorProto::CopyFrom(const ServiceDescriptorProto& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.ServiceDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } bool ServiceDescriptorProto::IsInitialized() const { if (!::google::protobuf::internal::AllAreInitialized(this->method())) return false; if (has_options()) { if (!this->options_->IsInitialized()) return false; } return true; } void ServiceDescriptorProto::Swap(ServiceDescriptorProto* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { ServiceDescriptorProto* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void ServiceDescriptorProto::UnsafeArenaSwap(ServiceDescriptorProto* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void ServiceDescriptorProto::InternalSwap(ServiceDescriptorProto* other) { using std::swap; method_.InternalSwap(&other->method_); name_.Swap(&other->name_); swap(options_, other->options_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata ServiceDescriptorProto::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void MethodDescriptorProto::InitAsDefaultInstance() { ::google::protobuf::_MethodDescriptorProto_default_instance_._instance.get_mutable()->options_ = const_cast< ::google::protobuf::MethodOptions*>( ::google::protobuf::MethodOptions::internal_default_instance()); } void MethodDescriptorProto::_slow_mutable_options() { options_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::MethodOptions >( GetArenaNoVirtual()); } void MethodDescriptorProto::unsafe_arena_set_allocated_options( ::google::protobuf::MethodOptions* options) { if (GetArenaNoVirtual() == NULL) { delete options_; } options_ = options; if (options) { set_has_options(); } else { clear_has_options(); } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.MethodDescriptorProto.options) } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int MethodDescriptorProto::kNameFieldNumber; const int MethodDescriptorProto::kInputTypeFieldNumber; const int MethodDescriptorProto::kOutputTypeFieldNumber; const int MethodDescriptorProto::kOptionsFieldNumber; const int MethodDescriptorProto::kClientStreamingFieldNumber; const int MethodDescriptorProto::kServerStreamingFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 MethodDescriptorProto::MethodDescriptorProto() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodDescriptorProto(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.MethodDescriptorProto) } MethodDescriptorProto::MethodDescriptorProto(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodDescriptorProto(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.MethodDescriptorProto) } MethodDescriptorProto::MethodDescriptorProto(const MethodDescriptorProto& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_name()) { name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name(), GetArenaNoVirtual()); } input_type_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_input_type()) { input_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.input_type(), GetArenaNoVirtual()); } output_type_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_output_type()) { output_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.output_type(), GetArenaNoVirtual()); } if (from.has_options()) { options_ = new ::google::protobuf::MethodOptions(*from.options_); } else { options_ = NULL; } ::memcpy(&client_streaming_, &from.client_streaming_, static_cast(reinterpret_cast(&server_streaming_) - reinterpret_cast(&client_streaming_)) + sizeof(server_streaming_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.MethodDescriptorProto) } void MethodDescriptorProto::SharedCtor() { _cached_size_ = 0; name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); input_type_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); output_type_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(&options_, 0, static_cast( reinterpret_cast(&server_streaming_) - reinterpret_cast(&options_)) + sizeof(server_streaming_)); } MethodDescriptorProto::~MethodDescriptorProto() { // @@protoc_insertion_point(destructor:google.protobuf.MethodDescriptorProto) SharedDtor(); } void MethodDescriptorProto::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); input_type_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); output_type_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (this != internal_default_instance()) delete options_; } void MethodDescriptorProto::ArenaDtor(void* object) { MethodDescriptorProto* _this = reinterpret_cast< MethodDescriptorProto* >(object); (void)_this; } void MethodDescriptorProto::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void MethodDescriptorProto::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* MethodDescriptorProto::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const MethodDescriptorProto& MethodDescriptorProto::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodDescriptorProto(); return *internal_default_instance(); } MethodDescriptorProto* MethodDescriptorProto::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void MethodDescriptorProto::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.MethodDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; cached_has_bits = _has_bits_[0]; if (cached_has_bits & 15u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!name_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(!input_type_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); input_type_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000004u) { GOOGLE_DCHECK(!output_type_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); output_type_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000008u) { GOOGLE_DCHECK(options_ != NULL); options_->Clear(); } } ::memset(&client_streaming_, 0, static_cast( reinterpret_cast(&server_streaming_) - reinterpret_cast(&client_streaming_)) + sizeof(server_streaming_)); _has_bits_.Clear(); _internal_metadata_.Clear(); } bool MethodDescriptorProto::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.MethodDescriptorProto) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional string name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.MethodDescriptorProto.name"); } else { goto handle_unusual; } break; } // optional string input_type = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_input_type())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->input_type().data(), static_cast(this->input_type().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.MethodDescriptorProto.input_type"); } else { goto handle_unusual; } break; } // optional string output_type = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_output_type())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->output_type().data(), static_cast(this->output_type().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.MethodDescriptorProto.output_type"); } else { goto handle_unusual; } break; } // optional .google.protobuf.MethodOptions options = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_options())); } else { goto handle_unusual; } break; } // optional bool client_streaming = 5 [default = false]; case 5: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(40u /* 40 & 0xFF */)) { set_has_client_streaming(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &client_streaming_))); } else { goto handle_unusual; } break; } // optional bool server_streaming = 6 [default = false]; case 6: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(48u /* 48 & 0xFF */)) { set_has_server_streaming(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &server_streaming_))); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.MethodDescriptorProto) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.MethodDescriptorProto) return false; #undef DO_ } void MethodDescriptorProto::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.MethodDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.MethodDescriptorProto.name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name(), output); } // optional string input_type = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->input_type().data(), static_cast(this->input_type().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.MethodDescriptorProto.input_type"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 2, this->input_type(), output); } // optional string output_type = 3; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->output_type().data(), static_cast(this->output_type().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.MethodDescriptorProto.output_type"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 3, this->output_type(), output); } // optional .google.protobuf.MethodOptions options = 4; if (cached_has_bits & 0x00000008u) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 4, *this->options_, output); } // optional bool client_streaming = 5 [default = false]; if (cached_has_bits & 0x00000010u) { ::google::protobuf::internal::WireFormatLite::WriteBool(5, this->client_streaming(), output); } // optional bool server_streaming = 6 [default = false]; if (cached_has_bits & 0x00000020u) { ::google::protobuf::internal::WireFormatLite::WriteBool(6, this->server_streaming(), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.MethodDescriptorProto) } ::google::protobuf::uint8* MethodDescriptorProto::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MethodDescriptorProto) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string name = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name().data(), static_cast(this->name().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.MethodDescriptorProto.name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } // optional string input_type = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->input_type().data(), static_cast(this->input_type().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.MethodDescriptorProto.input_type"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 2, this->input_type(), target); } // optional string output_type = 3; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->output_type().data(), static_cast(this->output_type().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.MethodDescriptorProto.output_type"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 3, this->output_type(), target); } // optional .google.protobuf.MethodOptions options = 4; if (cached_has_bits & 0x00000008u) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 4, *this->options_, deterministic, target); } // optional bool client_streaming = 5 [default = false]; if (cached_has_bits & 0x00000010u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(5, this->client_streaming(), target); } // optional bool server_streaming = 6 [default = false]; if (cached_has_bits & 0x00000020u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(6, this->server_streaming(), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MethodDescriptorProto) return target; } size_t MethodDescriptorProto::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.MethodDescriptorProto) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } if (_has_bits_[0 / 32] & 63u) { // optional string name = 1; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } // optional string input_type = 2; if (has_input_type()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->input_type()); } // optional string output_type = 3; if (has_output_type()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->output_type()); } // optional .google.protobuf.MethodOptions options = 4; if (has_options()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *this->options_); } // optional bool client_streaming = 5 [default = false]; if (has_client_streaming()) { total_size += 1 + 1; } // optional bool server_streaming = 6 [default = false]; if (has_server_streaming()) { total_size += 1 + 1; } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void MethodDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.MethodDescriptorProto) GOOGLE_DCHECK_NE(&from, this); const MethodDescriptorProto* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.MethodDescriptorProto) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.MethodDescriptorProto) MergeFrom(*source); } } void MethodDescriptorProto::MergeFrom(const MethodDescriptorProto& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.MethodDescriptorProto) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 63u) { if (cached_has_bits & 0x00000001u) { set_name(from.name()); } if (cached_has_bits & 0x00000002u) { set_input_type(from.input_type()); } if (cached_has_bits & 0x00000004u) { set_output_type(from.output_type()); } if (cached_has_bits & 0x00000008u) { mutable_options()->::google::protobuf::MethodOptions::MergeFrom(from.options()); } if (cached_has_bits & 0x00000010u) { client_streaming_ = from.client_streaming_; } if (cached_has_bits & 0x00000020u) { server_streaming_ = from.server_streaming_; } _has_bits_[0] |= cached_has_bits; } } void MethodDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.MethodDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } void MethodDescriptorProto::CopyFrom(const MethodDescriptorProto& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.MethodDescriptorProto) if (&from == this) return; Clear(); MergeFrom(from); } bool MethodDescriptorProto::IsInitialized() const { if (has_options()) { if (!this->options_->IsInitialized()) return false; } return true; } void MethodDescriptorProto::Swap(MethodDescriptorProto* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { MethodDescriptorProto* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void MethodDescriptorProto::UnsafeArenaSwap(MethodDescriptorProto* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void MethodDescriptorProto::InternalSwap(MethodDescriptorProto* other) { using std::swap; name_.Swap(&other->name_); input_type_.Swap(&other->input_type_); output_type_.Swap(&other->output_type_); swap(options_, other->options_); swap(client_streaming_, other->client_streaming_); swap(server_streaming_, other->server_streaming_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata MethodDescriptorProto::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void FileOptions::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int FileOptions::kJavaPackageFieldNumber; const int FileOptions::kJavaOuterClassnameFieldNumber; const int FileOptions::kJavaMultipleFilesFieldNumber; const int FileOptions::kJavaGenerateEqualsAndHashFieldNumber; const int FileOptions::kJavaStringCheckUtf8FieldNumber; const int FileOptions::kOptimizeForFieldNumber; const int FileOptions::kGoPackageFieldNumber; const int FileOptions::kCcGenericServicesFieldNumber; const int FileOptions::kJavaGenericServicesFieldNumber; const int FileOptions::kPyGenericServicesFieldNumber; const int FileOptions::kPhpGenericServicesFieldNumber; const int FileOptions::kDeprecatedFieldNumber; const int FileOptions::kCcEnableArenasFieldNumber; const int FileOptions::kObjcClassPrefixFieldNumber; const int FileOptions::kCsharpNamespaceFieldNumber; const int FileOptions::kSwiftPrefixFieldNumber; const int FileOptions::kPhpClassPrefixFieldNumber; const int FileOptions::kPhpNamespaceFieldNumber; const int FileOptions::kUninterpretedOptionFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 FileOptions::FileOptions() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileOptions(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.FileOptions) } FileOptions::FileOptions(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _extensions_(arena), _internal_metadata_(arena), uninterpreted_option_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileOptions(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.FileOptions) } FileOptions::FileOptions(const FileOptions& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), uninterpreted_option_(from.uninterpreted_option_) { _internal_metadata_.MergeFrom(from._internal_metadata_); _extensions_.MergeFrom(from._extensions_); java_package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_java_package()) { java_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.java_package(), GetArenaNoVirtual()); } java_outer_classname_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_java_outer_classname()) { java_outer_classname_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.java_outer_classname(), GetArenaNoVirtual()); } go_package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_go_package()) { go_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.go_package(), GetArenaNoVirtual()); } objc_class_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_objc_class_prefix()) { objc_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.objc_class_prefix(), GetArenaNoVirtual()); } csharp_namespace_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_csharp_namespace()) { csharp_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.csharp_namespace(), GetArenaNoVirtual()); } swift_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_swift_prefix()) { swift_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.swift_prefix(), GetArenaNoVirtual()); } php_class_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_php_class_prefix()) { php_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.php_class_prefix(), GetArenaNoVirtual()); } php_namespace_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_php_namespace()) { php_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.php_namespace(), GetArenaNoVirtual()); } ::memcpy(&cc_enable_arenas_, &from.cc_enable_arenas_, static_cast(reinterpret_cast(&optimize_for_) - reinterpret_cast(&cc_enable_arenas_)) + sizeof(optimize_for_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.FileOptions) } void FileOptions::SharedCtor() { _cached_size_ = 0; java_package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); java_outer_classname_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); go_package_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); objc_class_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); csharp_namespace_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); swift_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); php_class_prefix_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); php_namespace_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(&cc_enable_arenas_, 0, static_cast( reinterpret_cast(&deprecated_) - reinterpret_cast(&cc_enable_arenas_)) + sizeof(deprecated_)); optimize_for_ = 1; } FileOptions::~FileOptions() { // @@protoc_insertion_point(destructor:google.protobuf.FileOptions) SharedDtor(); } void FileOptions::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); java_package_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); java_outer_classname_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); go_package_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); objc_class_prefix_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); csharp_namespace_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); swift_prefix_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); php_class_prefix_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); php_namespace_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void FileOptions::ArenaDtor(void* object) { FileOptions* _this = reinterpret_cast< FileOptions* >(object); (void)_this; } void FileOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void FileOptions::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* FileOptions::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const FileOptions& FileOptions::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileOptions(); return *internal_default_instance(); } FileOptions* FileOptions::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void FileOptions::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.FileOptions) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; _extensions_.Clear(); uninterpreted_option_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 255u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!java_package_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); java_package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(!java_outer_classname_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); java_outer_classname_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000004u) { GOOGLE_DCHECK(!go_package_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); go_package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000008u) { GOOGLE_DCHECK(!objc_class_prefix_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); objc_class_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000010u) { GOOGLE_DCHECK(!csharp_namespace_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); csharp_namespace_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000020u) { GOOGLE_DCHECK(!swift_prefix_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); swift_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000040u) { GOOGLE_DCHECK(!php_class_prefix_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); php_class_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000080u) { GOOGLE_DCHECK(!php_namespace_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); php_namespace_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } } if (cached_has_bits & 65280u) { ::memset(&cc_enable_arenas_, 0, static_cast( reinterpret_cast(&php_generic_services_) - reinterpret_cast(&cc_enable_arenas_)) + sizeof(php_generic_services_)); } if (cached_has_bits & 196608u) { deprecated_ = false; optimize_for_ = 1; } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool FileOptions::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.FileOptions) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional string java_package = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_java_package())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->java_package().data(), static_cast(this->java_package().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileOptions.java_package"); } else { goto handle_unusual; } break; } // optional string java_outer_classname = 8; case 8: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(66u /* 66 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_java_outer_classname())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->java_outer_classname().data(), static_cast(this->java_outer_classname().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileOptions.java_outer_classname"); } else { goto handle_unusual; } break; } // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; case 9: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(72u /* 72 & 0xFF */)) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); if (::google::protobuf::FileOptions_OptimizeMode_IsValid(value)) { set_optimize_for(static_cast< ::google::protobuf::FileOptions_OptimizeMode >(value)); } else { mutable_unknown_fields()->AddVarint( 9, static_cast< ::google::protobuf::uint64>(value)); } } else { goto handle_unusual; } break; } // optional bool java_multiple_files = 10 [default = false]; case 10: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(80u /* 80 & 0xFF */)) { set_has_java_multiple_files(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &java_multiple_files_))); } else { goto handle_unusual; } break; } // optional string go_package = 11; case 11: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(90u /* 90 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_go_package())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->go_package().data(), static_cast(this->go_package().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileOptions.go_package"); } else { goto handle_unusual; } break; } // optional bool cc_generic_services = 16 [default = false]; case 16: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(128u /* 128 & 0xFF */)) { set_has_cc_generic_services(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &cc_generic_services_))); } else { goto handle_unusual; } break; } // optional bool java_generic_services = 17 [default = false]; case 17: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(136u /* 136 & 0xFF */)) { set_has_java_generic_services(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &java_generic_services_))); } else { goto handle_unusual; } break; } // optional bool py_generic_services = 18 [default = false]; case 18: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(144u /* 144 & 0xFF */)) { set_has_py_generic_services(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &py_generic_services_))); } else { goto handle_unusual; } break; } // optional bool java_generate_equals_and_hash = 20 [deprecated = true]; case 20: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(160u /* 160 & 0xFF */)) { set_has_java_generate_equals_and_hash(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &java_generate_equals_and_hash_))); } else { goto handle_unusual; } break; } // optional bool deprecated = 23 [default = false]; case 23: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(184u /* 184 & 0xFF */)) { set_has_deprecated(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &deprecated_))); } else { goto handle_unusual; } break; } // optional bool java_string_check_utf8 = 27 [default = false]; case 27: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(216u /* 216 & 0xFF */)) { set_has_java_string_check_utf8(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &java_string_check_utf8_))); } else { goto handle_unusual; } break; } // optional bool cc_enable_arenas = 31 [default = false]; case 31: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(248u /* 248 & 0xFF */)) { set_has_cc_enable_arenas(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &cc_enable_arenas_))); } else { goto handle_unusual; } break; } // optional string objc_class_prefix = 36; case 36: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(34u /* 290 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_objc_class_prefix())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->objc_class_prefix().data(), static_cast(this->objc_class_prefix().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileOptions.objc_class_prefix"); } else { goto handle_unusual; } break; } // optional string csharp_namespace = 37; case 37: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(42u /* 298 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_csharp_namespace())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->csharp_namespace().data(), static_cast(this->csharp_namespace().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileOptions.csharp_namespace"); } else { goto handle_unusual; } break; } // optional string swift_prefix = 39; case 39: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 314 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_swift_prefix())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->swift_prefix().data(), static_cast(this->swift_prefix().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileOptions.swift_prefix"); } else { goto handle_unusual; } break; } // optional string php_class_prefix = 40; case 40: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(66u /* 322 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_php_class_prefix())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->php_class_prefix().data(), static_cast(this->php_class_prefix().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileOptions.php_class_prefix"); } else { goto handle_unusual; } break; } // optional string php_namespace = 41; case 41: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(74u /* 330 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_php_namespace())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->php_namespace().data(), static_cast(this->php_namespace().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.FileOptions.php_namespace"); } else { goto handle_unusual; } break; } // optional bool php_generic_services = 42 [default = false]; case 42: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(80u /* 336 & 0xFF */)) { set_has_php_generic_services(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &php_generic_services_))); } else { goto handle_unusual; } break; } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; case 999: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } if ((8000u <= tag)) { DO_(_extensions_.ParseField(tag, input, internal_default_instance(), _internal_metadata_.mutable_unknown_fields())); continue; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.FileOptions) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.FileOptions) return false; #undef DO_ } void FileOptions::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.FileOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string java_package = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->java_package().data(), static_cast(this->java_package().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.java_package"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->java_package(), output); } // optional string java_outer_classname = 8; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->java_outer_classname().data(), static_cast(this->java_outer_classname().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.java_outer_classname"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 8, this->java_outer_classname(), output); } // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; if (cached_has_bits & 0x00020000u) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 9, this->optimize_for(), output); } // optional bool java_multiple_files = 10 [default = false]; if (cached_has_bits & 0x00000200u) { ::google::protobuf::internal::WireFormatLite::WriteBool(10, this->java_multiple_files(), output); } // optional string go_package = 11; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->go_package().data(), static_cast(this->go_package().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.go_package"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 11, this->go_package(), output); } // optional bool cc_generic_services = 16 [default = false]; if (cached_has_bits & 0x00001000u) { ::google::protobuf::internal::WireFormatLite::WriteBool(16, this->cc_generic_services(), output); } // optional bool java_generic_services = 17 [default = false]; if (cached_has_bits & 0x00002000u) { ::google::protobuf::internal::WireFormatLite::WriteBool(17, this->java_generic_services(), output); } // optional bool py_generic_services = 18 [default = false]; if (cached_has_bits & 0x00004000u) { ::google::protobuf::internal::WireFormatLite::WriteBool(18, this->py_generic_services(), output); } // optional bool java_generate_equals_and_hash = 20 [deprecated = true]; if (cached_has_bits & 0x00000400u) { ::google::protobuf::internal::WireFormatLite::WriteBool(20, this->java_generate_equals_and_hash(), output); } // optional bool deprecated = 23 [default = false]; if (cached_has_bits & 0x00010000u) { ::google::protobuf::internal::WireFormatLite::WriteBool(23, this->deprecated(), output); } // optional bool java_string_check_utf8 = 27 [default = false]; if (cached_has_bits & 0x00000800u) { ::google::protobuf::internal::WireFormatLite::WriteBool(27, this->java_string_check_utf8(), output); } // optional bool cc_enable_arenas = 31 [default = false]; if (cached_has_bits & 0x00000100u) { ::google::protobuf::internal::WireFormatLite::WriteBool(31, this->cc_enable_arenas(), output); } // optional string objc_class_prefix = 36; if (cached_has_bits & 0x00000008u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->objc_class_prefix().data(), static_cast(this->objc_class_prefix().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.objc_class_prefix"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 36, this->objc_class_prefix(), output); } // optional string csharp_namespace = 37; if (cached_has_bits & 0x00000010u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->csharp_namespace().data(), static_cast(this->csharp_namespace().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.csharp_namespace"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 37, this->csharp_namespace(), output); } // optional string swift_prefix = 39; if (cached_has_bits & 0x00000020u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->swift_prefix().data(), static_cast(this->swift_prefix().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.swift_prefix"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 39, this->swift_prefix(), output); } // optional string php_class_prefix = 40; if (cached_has_bits & 0x00000040u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->php_class_prefix().data(), static_cast(this->php_class_prefix().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.php_class_prefix"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 40, this->php_class_prefix(), output); } // optional string php_namespace = 41; if (cached_has_bits & 0x00000080u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->php_namespace().data(), static_cast(this->php_namespace().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.php_namespace"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 41, this->php_namespace(), output); } // optional bool php_generic_services = 42 [default = false]; if (cached_has_bits & 0x00008000u) { ::google::protobuf::internal::WireFormatLite::WriteBool(42, this->php_generic_services(), output); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 999, this->uninterpreted_option(static_cast(i)), output); } // Extension range [1000, 536870912) _extensions_.SerializeWithCachedSizes( 1000, 536870912, output); if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.FileOptions) } ::google::protobuf::uint8* FileOptions::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FileOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional string java_package = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->java_package().data(), static_cast(this->java_package().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.java_package"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->java_package(), target); } // optional string java_outer_classname = 8; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->java_outer_classname().data(), static_cast(this->java_outer_classname().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.java_outer_classname"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 8, this->java_outer_classname(), target); } // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; if (cached_has_bits & 0x00020000u) { target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( 9, this->optimize_for(), target); } // optional bool java_multiple_files = 10 [default = false]; if (cached_has_bits & 0x00000200u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(10, this->java_multiple_files(), target); } // optional string go_package = 11; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->go_package().data(), static_cast(this->go_package().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.go_package"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 11, this->go_package(), target); } // optional bool cc_generic_services = 16 [default = false]; if (cached_has_bits & 0x00001000u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(16, this->cc_generic_services(), target); } // optional bool java_generic_services = 17 [default = false]; if (cached_has_bits & 0x00002000u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(17, this->java_generic_services(), target); } // optional bool py_generic_services = 18 [default = false]; if (cached_has_bits & 0x00004000u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(18, this->py_generic_services(), target); } // optional bool java_generate_equals_and_hash = 20 [deprecated = true]; if (cached_has_bits & 0x00000400u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(20, this->java_generate_equals_and_hash(), target); } // optional bool deprecated = 23 [default = false]; if (cached_has_bits & 0x00010000u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(23, this->deprecated(), target); } // optional bool java_string_check_utf8 = 27 [default = false]; if (cached_has_bits & 0x00000800u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(27, this->java_string_check_utf8(), target); } // optional bool cc_enable_arenas = 31 [default = false]; if (cached_has_bits & 0x00000100u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(31, this->cc_enable_arenas(), target); } // optional string objc_class_prefix = 36; if (cached_has_bits & 0x00000008u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->objc_class_prefix().data(), static_cast(this->objc_class_prefix().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.objc_class_prefix"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 36, this->objc_class_prefix(), target); } // optional string csharp_namespace = 37; if (cached_has_bits & 0x00000010u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->csharp_namespace().data(), static_cast(this->csharp_namespace().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.csharp_namespace"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 37, this->csharp_namespace(), target); } // optional string swift_prefix = 39; if (cached_has_bits & 0x00000020u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->swift_prefix().data(), static_cast(this->swift_prefix().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.swift_prefix"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 39, this->swift_prefix(), target); } // optional string php_class_prefix = 40; if (cached_has_bits & 0x00000040u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->php_class_prefix().data(), static_cast(this->php_class_prefix().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.php_class_prefix"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 40, this->php_class_prefix(), target); } // optional string php_namespace = 41; if (cached_has_bits & 0x00000080u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->php_namespace().data(), static_cast(this->php_namespace().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.FileOptions.php_namespace"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 41, this->php_namespace(), target); } // optional bool php_generic_services = 42 [default = false]; if (cached_has_bits & 0x00008000u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(42, this->php_generic_services(), target); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 999, this->uninterpreted_option(static_cast(i)), deterministic, target); } // Extension range [1000, 536870912) target = _extensions_.InternalSerializeWithCachedSizesToArray( 1000, 536870912, deterministic, target); if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FileOptions) return target; } size_t FileOptions::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FileOptions) size_t total_size = 0; total_size += _extensions_.ByteSize(); if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; { unsigned int count = static_cast(this->uninterpreted_option_size()); total_size += 2UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->uninterpreted_option(static_cast(i))); } } if (_has_bits_[0 / 32] & 255u) { // optional string java_package = 1; if (has_java_package()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->java_package()); } // optional string java_outer_classname = 8; if (has_java_outer_classname()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->java_outer_classname()); } // optional string go_package = 11; if (has_go_package()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->go_package()); } // optional string objc_class_prefix = 36; if (has_objc_class_prefix()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize( this->objc_class_prefix()); } // optional string csharp_namespace = 37; if (has_csharp_namespace()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize( this->csharp_namespace()); } // optional string swift_prefix = 39; if (has_swift_prefix()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize( this->swift_prefix()); } // optional string php_class_prefix = 40; if (has_php_class_prefix()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize( this->php_class_prefix()); } // optional string php_namespace = 41; if (has_php_namespace()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::StringSize( this->php_namespace()); } } if (_has_bits_[8 / 32] & 65280u) { // optional bool cc_enable_arenas = 31 [default = false]; if (has_cc_enable_arenas()) { total_size += 2 + 1; } // optional bool java_multiple_files = 10 [default = false]; if (has_java_multiple_files()) { total_size += 1 + 1; } // optional bool java_generate_equals_and_hash = 20 [deprecated = true]; if (has_java_generate_equals_and_hash()) { total_size += 2 + 1; } // optional bool java_string_check_utf8 = 27 [default = false]; if (has_java_string_check_utf8()) { total_size += 2 + 1; } // optional bool cc_generic_services = 16 [default = false]; if (has_cc_generic_services()) { total_size += 2 + 1; } // optional bool java_generic_services = 17 [default = false]; if (has_java_generic_services()) { total_size += 2 + 1; } // optional bool py_generic_services = 18 [default = false]; if (has_py_generic_services()) { total_size += 2 + 1; } // optional bool php_generic_services = 42 [default = false]; if (has_php_generic_services()) { total_size += 2 + 1; } } if (_has_bits_[16 / 32] & 196608u) { // optional bool deprecated = 23 [default = false]; if (has_deprecated()) { total_size += 2 + 1; } // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; if (has_optimize_for()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->optimize_for()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void FileOptions::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FileOptions) GOOGLE_DCHECK_NE(&from, this); const FileOptions* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.FileOptions) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.FileOptions) MergeFrom(*source); } } void FileOptions::MergeFrom(const FileOptions& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FileOptions) GOOGLE_DCHECK_NE(&from, this); _extensions_.MergeFrom(from._extensions_); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; uninterpreted_option_.MergeFrom(from.uninterpreted_option_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 255u) { if (cached_has_bits & 0x00000001u) { set_java_package(from.java_package()); } if (cached_has_bits & 0x00000002u) { set_java_outer_classname(from.java_outer_classname()); } if (cached_has_bits & 0x00000004u) { set_go_package(from.go_package()); } if (cached_has_bits & 0x00000008u) { set_objc_class_prefix(from.objc_class_prefix()); } if (cached_has_bits & 0x00000010u) { set_csharp_namespace(from.csharp_namespace()); } if (cached_has_bits & 0x00000020u) { set_swift_prefix(from.swift_prefix()); } if (cached_has_bits & 0x00000040u) { set_php_class_prefix(from.php_class_prefix()); } if (cached_has_bits & 0x00000080u) { set_php_namespace(from.php_namespace()); } } if (cached_has_bits & 65280u) { if (cached_has_bits & 0x00000100u) { cc_enable_arenas_ = from.cc_enable_arenas_; } if (cached_has_bits & 0x00000200u) { java_multiple_files_ = from.java_multiple_files_; } if (cached_has_bits & 0x00000400u) { java_generate_equals_and_hash_ = from.java_generate_equals_and_hash_; } if (cached_has_bits & 0x00000800u) { java_string_check_utf8_ = from.java_string_check_utf8_; } if (cached_has_bits & 0x00001000u) { cc_generic_services_ = from.cc_generic_services_; } if (cached_has_bits & 0x00002000u) { java_generic_services_ = from.java_generic_services_; } if (cached_has_bits & 0x00004000u) { py_generic_services_ = from.py_generic_services_; } if (cached_has_bits & 0x00008000u) { php_generic_services_ = from.php_generic_services_; } _has_bits_[0] |= cached_has_bits; } if (cached_has_bits & 196608u) { if (cached_has_bits & 0x00010000u) { deprecated_ = from.deprecated_; } if (cached_has_bits & 0x00020000u) { optimize_for_ = from.optimize_for_; } _has_bits_[0] |= cached_has_bits; } } void FileOptions::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.FileOptions) if (&from == this) return; Clear(); MergeFrom(from); } void FileOptions::CopyFrom(const FileOptions& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FileOptions) if (&from == this) return; Clear(); MergeFrom(from); } bool FileOptions::IsInitialized() const { if (!_extensions_.IsInitialized()) { return false; } if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; return true; } void FileOptions::Swap(FileOptions* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { FileOptions* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void FileOptions::UnsafeArenaSwap(FileOptions* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void FileOptions::InternalSwap(FileOptions* other) { using std::swap; uninterpreted_option_.InternalSwap(&other->uninterpreted_option_); java_package_.Swap(&other->java_package_); java_outer_classname_.Swap(&other->java_outer_classname_); go_package_.Swap(&other->go_package_); objc_class_prefix_.Swap(&other->objc_class_prefix_); csharp_namespace_.Swap(&other->csharp_namespace_); swift_prefix_.Swap(&other->swift_prefix_); php_class_prefix_.Swap(&other->php_class_prefix_); php_namespace_.Swap(&other->php_namespace_); swap(cc_enable_arenas_, other->cc_enable_arenas_); swap(java_multiple_files_, other->java_multiple_files_); swap(java_generate_equals_and_hash_, other->java_generate_equals_and_hash_); swap(java_string_check_utf8_, other->java_string_check_utf8_); swap(cc_generic_services_, other->cc_generic_services_); swap(java_generic_services_, other->java_generic_services_); swap(py_generic_services_, other->py_generic_services_); swap(php_generic_services_, other->php_generic_services_); swap(deprecated_, other->deprecated_); swap(optimize_for_, other->optimize_for_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); _extensions_.Swap(&other->_extensions_); } ::google::protobuf::Metadata FileOptions::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void MessageOptions::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int MessageOptions::kMessageSetWireFormatFieldNumber; const int MessageOptions::kNoStandardDescriptorAccessorFieldNumber; const int MessageOptions::kDeprecatedFieldNumber; const int MessageOptions::kMapEntryFieldNumber; const int MessageOptions::kUninterpretedOptionFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 MessageOptions::MessageOptions() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMessageOptions(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.MessageOptions) } MessageOptions::MessageOptions(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _extensions_(arena), _internal_metadata_(arena), uninterpreted_option_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMessageOptions(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.MessageOptions) } MessageOptions::MessageOptions(const MessageOptions& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), uninterpreted_option_(from.uninterpreted_option_) { _internal_metadata_.MergeFrom(from._internal_metadata_); _extensions_.MergeFrom(from._extensions_); ::memcpy(&message_set_wire_format_, &from.message_set_wire_format_, static_cast(reinterpret_cast(&map_entry_) - reinterpret_cast(&message_set_wire_format_)) + sizeof(map_entry_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.MessageOptions) } void MessageOptions::SharedCtor() { _cached_size_ = 0; ::memset(&message_set_wire_format_, 0, static_cast( reinterpret_cast(&map_entry_) - reinterpret_cast(&message_set_wire_format_)) + sizeof(map_entry_)); } MessageOptions::~MessageOptions() { // @@protoc_insertion_point(destructor:google.protobuf.MessageOptions) SharedDtor(); } void MessageOptions::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void MessageOptions::ArenaDtor(void* object) { MessageOptions* _this = reinterpret_cast< MessageOptions* >(object); (void)_this; } void MessageOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void MessageOptions::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* MessageOptions::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const MessageOptions& MessageOptions::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMessageOptions(); return *internal_default_instance(); } MessageOptions* MessageOptions::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void MessageOptions::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.MessageOptions) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; _extensions_.Clear(); uninterpreted_option_.Clear(); ::memset(&message_set_wire_format_, 0, static_cast( reinterpret_cast(&map_entry_) - reinterpret_cast(&message_set_wire_format_)) + sizeof(map_entry_)); _has_bits_.Clear(); _internal_metadata_.Clear(); } bool MessageOptions::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.MessageOptions) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional bool message_set_wire_format = 1 [default = false]; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { set_has_message_set_wire_format(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &message_set_wire_format_))); } else { goto handle_unusual; } break; } // optional bool no_standard_descriptor_accessor = 2 [default = false]; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { set_has_no_standard_descriptor_accessor(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &no_standard_descriptor_accessor_))); } else { goto handle_unusual; } break; } // optional bool deprecated = 3 [default = false]; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) { set_has_deprecated(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &deprecated_))); } else { goto handle_unusual; } break; } // optional bool map_entry = 7; case 7: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(56u /* 56 & 0xFF */)) { set_has_map_entry(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &map_entry_))); } else { goto handle_unusual; } break; } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; case 999: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } if ((8000u <= tag)) { DO_(_extensions_.ParseField(tag, input, internal_default_instance(), _internal_metadata_.mutable_unknown_fields())); continue; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.MessageOptions) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.MessageOptions) return false; #undef DO_ } void MessageOptions::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.MessageOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional bool message_set_wire_format = 1 [default = false]; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->message_set_wire_format(), output); } // optional bool no_standard_descriptor_accessor = 2 [default = false]; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->no_standard_descriptor_accessor(), output); } // optional bool deprecated = 3 [default = false]; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->deprecated(), output); } // optional bool map_entry = 7; if (cached_has_bits & 0x00000008u) { ::google::protobuf::internal::WireFormatLite::WriteBool(7, this->map_entry(), output); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 999, this->uninterpreted_option(static_cast(i)), output); } // Extension range [1000, 536870912) _extensions_.SerializeWithCachedSizes( 1000, 536870912, output); if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.MessageOptions) } ::google::protobuf::uint8* MessageOptions::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MessageOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional bool message_set_wire_format = 1 [default = false]; if (cached_has_bits & 0x00000001u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(1, this->message_set_wire_format(), target); } // optional bool no_standard_descriptor_accessor = 2 [default = false]; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->no_standard_descriptor_accessor(), target); } // optional bool deprecated = 3 [default = false]; if (cached_has_bits & 0x00000004u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->deprecated(), target); } // optional bool map_entry = 7; if (cached_has_bits & 0x00000008u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(7, this->map_entry(), target); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 999, this->uninterpreted_option(static_cast(i)), deterministic, target); } // Extension range [1000, 536870912) target = _extensions_.InternalSerializeWithCachedSizesToArray( 1000, 536870912, deterministic, target); if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MessageOptions) return target; } size_t MessageOptions::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.MessageOptions) size_t total_size = 0; total_size += _extensions_.ByteSize(); if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; { unsigned int count = static_cast(this->uninterpreted_option_size()); total_size += 2UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->uninterpreted_option(static_cast(i))); } } if (_has_bits_[0 / 32] & 15u) { // optional bool message_set_wire_format = 1 [default = false]; if (has_message_set_wire_format()) { total_size += 1 + 1; } // optional bool no_standard_descriptor_accessor = 2 [default = false]; if (has_no_standard_descriptor_accessor()) { total_size += 1 + 1; } // optional bool deprecated = 3 [default = false]; if (has_deprecated()) { total_size += 1 + 1; } // optional bool map_entry = 7; if (has_map_entry()) { total_size += 1 + 1; } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void MessageOptions::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.MessageOptions) GOOGLE_DCHECK_NE(&from, this); const MessageOptions* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.MessageOptions) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.MessageOptions) MergeFrom(*source); } } void MessageOptions::MergeFrom(const MessageOptions& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.MessageOptions) GOOGLE_DCHECK_NE(&from, this); _extensions_.MergeFrom(from._extensions_); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; uninterpreted_option_.MergeFrom(from.uninterpreted_option_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 15u) { if (cached_has_bits & 0x00000001u) { message_set_wire_format_ = from.message_set_wire_format_; } if (cached_has_bits & 0x00000002u) { no_standard_descriptor_accessor_ = from.no_standard_descriptor_accessor_; } if (cached_has_bits & 0x00000004u) { deprecated_ = from.deprecated_; } if (cached_has_bits & 0x00000008u) { map_entry_ = from.map_entry_; } _has_bits_[0] |= cached_has_bits; } } void MessageOptions::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.MessageOptions) if (&from == this) return; Clear(); MergeFrom(from); } void MessageOptions::CopyFrom(const MessageOptions& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.MessageOptions) if (&from == this) return; Clear(); MergeFrom(from); } bool MessageOptions::IsInitialized() const { if (!_extensions_.IsInitialized()) { return false; } if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; return true; } void MessageOptions::Swap(MessageOptions* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { MessageOptions* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void MessageOptions::UnsafeArenaSwap(MessageOptions* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void MessageOptions::InternalSwap(MessageOptions* other) { using std::swap; uninterpreted_option_.InternalSwap(&other->uninterpreted_option_); swap(message_set_wire_format_, other->message_set_wire_format_); swap(no_standard_descriptor_accessor_, other->no_standard_descriptor_accessor_); swap(deprecated_, other->deprecated_); swap(map_entry_, other->map_entry_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); _extensions_.Swap(&other->_extensions_); } ::google::protobuf::Metadata MessageOptions::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void FieldOptions::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int FieldOptions::kCtypeFieldNumber; const int FieldOptions::kPackedFieldNumber; const int FieldOptions::kJstypeFieldNumber; const int FieldOptions::kLazyFieldNumber; const int FieldOptions::kDeprecatedFieldNumber; const int FieldOptions::kWeakFieldNumber; const int FieldOptions::kUninterpretedOptionFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 FieldOptions::FieldOptions() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldOptions(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.FieldOptions) } FieldOptions::FieldOptions(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _extensions_(arena), _internal_metadata_(arena), uninterpreted_option_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldOptions(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.FieldOptions) } FieldOptions::FieldOptions(const FieldOptions& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), uninterpreted_option_(from.uninterpreted_option_) { _internal_metadata_.MergeFrom(from._internal_metadata_); _extensions_.MergeFrom(from._extensions_); ::memcpy(&ctype_, &from.ctype_, static_cast(reinterpret_cast(&jstype_) - reinterpret_cast(&ctype_)) + sizeof(jstype_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldOptions) } void FieldOptions::SharedCtor() { _cached_size_ = 0; ::memset(&ctype_, 0, static_cast( reinterpret_cast(&jstype_) - reinterpret_cast(&ctype_)) + sizeof(jstype_)); } FieldOptions::~FieldOptions() { // @@protoc_insertion_point(destructor:google.protobuf.FieldOptions) SharedDtor(); } void FieldOptions::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void FieldOptions::ArenaDtor(void* object) { FieldOptions* _this = reinterpret_cast< FieldOptions* >(object); (void)_this; } void FieldOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void FieldOptions::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* FieldOptions::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const FieldOptions& FieldOptions::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldOptions(); return *internal_default_instance(); } FieldOptions* FieldOptions::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void FieldOptions::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.FieldOptions) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; _extensions_.Clear(); uninterpreted_option_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 63u) { ::memset(&ctype_, 0, static_cast( reinterpret_cast(&jstype_) - reinterpret_cast(&ctype_)) + sizeof(jstype_)); } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool FieldOptions::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.FieldOptions) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); if (::google::protobuf::FieldOptions_CType_IsValid(value)) { set_ctype(static_cast< ::google::protobuf::FieldOptions_CType >(value)); } else { mutable_unknown_fields()->AddVarint( 1, static_cast< ::google::protobuf::uint64>(value)); } } else { goto handle_unusual; } break; } // optional bool packed = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { set_has_packed(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &packed_))); } else { goto handle_unusual; } break; } // optional bool deprecated = 3 [default = false]; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) { set_has_deprecated(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &deprecated_))); } else { goto handle_unusual; } break; } // optional bool lazy = 5 [default = false]; case 5: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(40u /* 40 & 0xFF */)) { set_has_lazy(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &lazy_))); } else { goto handle_unusual; } break; } // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL]; case 6: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(48u /* 48 & 0xFF */)) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); if (::google::protobuf::FieldOptions_JSType_IsValid(value)) { set_jstype(static_cast< ::google::protobuf::FieldOptions_JSType >(value)); } else { mutable_unknown_fields()->AddVarint( 6, static_cast< ::google::protobuf::uint64>(value)); } } else { goto handle_unusual; } break; } // optional bool weak = 10 [default = false]; case 10: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(80u /* 80 & 0xFF */)) { set_has_weak(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &weak_))); } else { goto handle_unusual; } break; } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; case 999: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } if ((8000u <= tag)) { DO_(_extensions_.ParseField(tag, input, internal_default_instance(), _internal_metadata_.mutable_unknown_fields())); continue; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.FieldOptions) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.FieldOptions) return false; #undef DO_ } void FieldOptions::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.FieldOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 1, this->ctype(), output); } // optional bool packed = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->packed(), output); } // optional bool deprecated = 3 [default = false]; if (cached_has_bits & 0x00000008u) { ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->deprecated(), output); } // optional bool lazy = 5 [default = false]; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormatLite::WriteBool(5, this->lazy(), output); } // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL]; if (cached_has_bits & 0x00000020u) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 6, this->jstype(), output); } // optional bool weak = 10 [default = false]; if (cached_has_bits & 0x00000010u) { ::google::protobuf::internal::WireFormatLite::WriteBool(10, this->weak(), output); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 999, this->uninterpreted_option(static_cast(i)), output); } // Extension range [1000, 536870912) _extensions_.SerializeWithCachedSizes( 1000, 536870912, output); if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.FieldOptions) } ::google::protobuf::uint8* FieldOptions::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; if (cached_has_bits & 0x00000001u) { target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( 1, this->ctype(), target); } // optional bool packed = 2; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->packed(), target); } // optional bool deprecated = 3 [default = false]; if (cached_has_bits & 0x00000008u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->deprecated(), target); } // optional bool lazy = 5 [default = false]; if (cached_has_bits & 0x00000004u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(5, this->lazy(), target); } // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL]; if (cached_has_bits & 0x00000020u) { target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( 6, this->jstype(), target); } // optional bool weak = 10 [default = false]; if (cached_has_bits & 0x00000010u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(10, this->weak(), target); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 999, this->uninterpreted_option(static_cast(i)), deterministic, target); } // Extension range [1000, 536870912) target = _extensions_.InternalSerializeWithCachedSizesToArray( 1000, 536870912, deterministic, target); if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldOptions) return target; } size_t FieldOptions::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FieldOptions) size_t total_size = 0; total_size += _extensions_.ByteSize(); if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; { unsigned int count = static_cast(this->uninterpreted_option_size()); total_size += 2UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->uninterpreted_option(static_cast(i))); } } if (_has_bits_[0 / 32] & 63u) { // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; if (has_ctype()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->ctype()); } // optional bool packed = 2; if (has_packed()) { total_size += 1 + 1; } // optional bool lazy = 5 [default = false]; if (has_lazy()) { total_size += 1 + 1; } // optional bool deprecated = 3 [default = false]; if (has_deprecated()) { total_size += 1 + 1; } // optional bool weak = 10 [default = false]; if (has_weak()) { total_size += 1 + 1; } // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL]; if (has_jstype()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->jstype()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void FieldOptions::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FieldOptions) GOOGLE_DCHECK_NE(&from, this); const FieldOptions* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.FieldOptions) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.FieldOptions) MergeFrom(*source); } } void FieldOptions::MergeFrom(const FieldOptions& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FieldOptions) GOOGLE_DCHECK_NE(&from, this); _extensions_.MergeFrom(from._extensions_); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; uninterpreted_option_.MergeFrom(from.uninterpreted_option_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 63u) { if (cached_has_bits & 0x00000001u) { ctype_ = from.ctype_; } if (cached_has_bits & 0x00000002u) { packed_ = from.packed_; } if (cached_has_bits & 0x00000004u) { lazy_ = from.lazy_; } if (cached_has_bits & 0x00000008u) { deprecated_ = from.deprecated_; } if (cached_has_bits & 0x00000010u) { weak_ = from.weak_; } if (cached_has_bits & 0x00000020u) { jstype_ = from.jstype_; } _has_bits_[0] |= cached_has_bits; } } void FieldOptions::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.FieldOptions) if (&from == this) return; Clear(); MergeFrom(from); } void FieldOptions::CopyFrom(const FieldOptions& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FieldOptions) if (&from == this) return; Clear(); MergeFrom(from); } bool FieldOptions::IsInitialized() const { if (!_extensions_.IsInitialized()) { return false; } if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; return true; } void FieldOptions::Swap(FieldOptions* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { FieldOptions* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void FieldOptions::UnsafeArenaSwap(FieldOptions* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void FieldOptions::InternalSwap(FieldOptions* other) { using std::swap; uninterpreted_option_.InternalSwap(&other->uninterpreted_option_); swap(ctype_, other->ctype_); swap(packed_, other->packed_); swap(lazy_, other->lazy_); swap(deprecated_, other->deprecated_); swap(weak_, other->weak_); swap(jstype_, other->jstype_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); _extensions_.Swap(&other->_extensions_); } ::google::protobuf::Metadata FieldOptions::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void OneofOptions::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int OneofOptions::kUninterpretedOptionFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 OneofOptions::OneofOptions() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofOptions(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.OneofOptions) } OneofOptions::OneofOptions(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _extensions_(arena), _internal_metadata_(arena), uninterpreted_option_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofOptions(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.OneofOptions) } OneofOptions::OneofOptions(const OneofOptions& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), uninterpreted_option_(from.uninterpreted_option_) { _internal_metadata_.MergeFrom(from._internal_metadata_); _extensions_.MergeFrom(from._extensions_); // @@protoc_insertion_point(copy_constructor:google.protobuf.OneofOptions) } void OneofOptions::SharedCtor() { _cached_size_ = 0; } OneofOptions::~OneofOptions() { // @@protoc_insertion_point(destructor:google.protobuf.OneofOptions) SharedDtor(); } void OneofOptions::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void OneofOptions::ArenaDtor(void* object) { OneofOptions* _this = reinterpret_cast< OneofOptions* >(object); (void)_this; } void OneofOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void OneofOptions::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* OneofOptions::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const OneofOptions& OneofOptions::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofOptions(); return *internal_default_instance(); } OneofOptions* OneofOptions::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void OneofOptions::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.OneofOptions) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; _extensions_.Clear(); uninterpreted_option_.Clear(); _has_bits_.Clear(); _internal_metadata_.Clear(); } bool OneofOptions::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.OneofOptions) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; case 999: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } if ((8000u <= tag)) { DO_(_extensions_.ParseField(tag, input, internal_default_instance(), _internal_metadata_.mutable_unknown_fields())); continue; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.OneofOptions) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.OneofOptions) return false; #undef DO_ } void OneofOptions::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.OneofOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 999, this->uninterpreted_option(static_cast(i)), output); } // Extension range [1000, 536870912) _extensions_.SerializeWithCachedSizes( 1000, 536870912, output); if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.OneofOptions) } ::google::protobuf::uint8* OneofOptions::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.OneofOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 999, this->uninterpreted_option(static_cast(i)), deterministic, target); } // Extension range [1000, 536870912) target = _extensions_.InternalSerializeWithCachedSizesToArray( 1000, 536870912, deterministic, target); if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.OneofOptions) return target; } size_t OneofOptions::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.OneofOptions) size_t total_size = 0; total_size += _extensions_.ByteSize(); if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; { unsigned int count = static_cast(this->uninterpreted_option_size()); total_size += 2UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->uninterpreted_option(static_cast(i))); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void OneofOptions::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.OneofOptions) GOOGLE_DCHECK_NE(&from, this); const OneofOptions* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.OneofOptions) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.OneofOptions) MergeFrom(*source); } } void OneofOptions::MergeFrom(const OneofOptions& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.OneofOptions) GOOGLE_DCHECK_NE(&from, this); _extensions_.MergeFrom(from._extensions_); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; uninterpreted_option_.MergeFrom(from.uninterpreted_option_); } void OneofOptions::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.OneofOptions) if (&from == this) return; Clear(); MergeFrom(from); } void OneofOptions::CopyFrom(const OneofOptions& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.OneofOptions) if (&from == this) return; Clear(); MergeFrom(from); } bool OneofOptions::IsInitialized() const { if (!_extensions_.IsInitialized()) { return false; } if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; return true; } void OneofOptions::Swap(OneofOptions* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { OneofOptions* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void OneofOptions::UnsafeArenaSwap(OneofOptions* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void OneofOptions::InternalSwap(OneofOptions* other) { using std::swap; uninterpreted_option_.InternalSwap(&other->uninterpreted_option_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); _extensions_.Swap(&other->_extensions_); } ::google::protobuf::Metadata OneofOptions::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void EnumOptions::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int EnumOptions::kAllowAliasFieldNumber; const int EnumOptions::kDeprecatedFieldNumber; const int EnumOptions::kUninterpretedOptionFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 EnumOptions::EnumOptions() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumOptions(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.EnumOptions) } EnumOptions::EnumOptions(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _extensions_(arena), _internal_metadata_(arena), uninterpreted_option_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumOptions(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumOptions) } EnumOptions::EnumOptions(const EnumOptions& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), uninterpreted_option_(from.uninterpreted_option_) { _internal_metadata_.MergeFrom(from._internal_metadata_); _extensions_.MergeFrom(from._extensions_); ::memcpy(&allow_alias_, &from.allow_alias_, static_cast(reinterpret_cast(&deprecated_) - reinterpret_cast(&allow_alias_)) + sizeof(deprecated_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumOptions) } void EnumOptions::SharedCtor() { _cached_size_ = 0; ::memset(&allow_alias_, 0, static_cast( reinterpret_cast(&deprecated_) - reinterpret_cast(&allow_alias_)) + sizeof(deprecated_)); } EnumOptions::~EnumOptions() { // @@protoc_insertion_point(destructor:google.protobuf.EnumOptions) SharedDtor(); } void EnumOptions::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void EnumOptions::ArenaDtor(void* object) { EnumOptions* _this = reinterpret_cast< EnumOptions* >(object); (void)_this; } void EnumOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void EnumOptions::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* EnumOptions::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const EnumOptions& EnumOptions::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumOptions(); return *internal_default_instance(); } EnumOptions* EnumOptions::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void EnumOptions::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.EnumOptions) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; _extensions_.Clear(); uninterpreted_option_.Clear(); ::memset(&allow_alias_, 0, static_cast( reinterpret_cast(&deprecated_) - reinterpret_cast(&allow_alias_)) + sizeof(deprecated_)); _has_bits_.Clear(); _internal_metadata_.Clear(); } bool EnumOptions::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.EnumOptions) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional bool allow_alias = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { set_has_allow_alias(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &allow_alias_))); } else { goto handle_unusual; } break; } // optional bool deprecated = 3 [default = false]; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) { set_has_deprecated(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &deprecated_))); } else { goto handle_unusual; } break; } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; case 999: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } if ((8000u <= tag)) { DO_(_extensions_.ParseField(tag, input, internal_default_instance(), _internal_metadata_.mutable_unknown_fields())); continue; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.EnumOptions) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.EnumOptions) return false; #undef DO_ } void EnumOptions::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.EnumOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional bool allow_alias = 2; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->allow_alias(), output); } // optional bool deprecated = 3 [default = false]; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->deprecated(), output); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 999, this->uninterpreted_option(static_cast(i)), output); } // Extension range [1000, 536870912) _extensions_.SerializeWithCachedSizes( 1000, 536870912, output); if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.EnumOptions) } ::google::protobuf::uint8* EnumOptions::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional bool allow_alias = 2; if (cached_has_bits & 0x00000001u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->allow_alias(), target); } // optional bool deprecated = 3 [default = false]; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->deprecated(), target); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 999, this->uninterpreted_option(static_cast(i)), deterministic, target); } // Extension range [1000, 536870912) target = _extensions_.InternalSerializeWithCachedSizesToArray( 1000, 536870912, deterministic, target); if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumOptions) return target; } size_t EnumOptions::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumOptions) size_t total_size = 0; total_size += _extensions_.ByteSize(); if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; { unsigned int count = static_cast(this->uninterpreted_option_size()); total_size += 2UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->uninterpreted_option(static_cast(i))); } } if (_has_bits_[0 / 32] & 3u) { // optional bool allow_alias = 2; if (has_allow_alias()) { total_size += 1 + 1; } // optional bool deprecated = 3 [default = false]; if (has_deprecated()) { total_size += 1 + 1; } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void EnumOptions::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.EnumOptions) GOOGLE_DCHECK_NE(&from, this); const EnumOptions* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.EnumOptions) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.EnumOptions) MergeFrom(*source); } } void EnumOptions::MergeFrom(const EnumOptions& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumOptions) GOOGLE_DCHECK_NE(&from, this); _extensions_.MergeFrom(from._extensions_); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; uninterpreted_option_.MergeFrom(from.uninterpreted_option_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { allow_alias_ = from.allow_alias_; } if (cached_has_bits & 0x00000002u) { deprecated_ = from.deprecated_; } _has_bits_[0] |= cached_has_bits; } } void EnumOptions::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.EnumOptions) if (&from == this) return; Clear(); MergeFrom(from); } void EnumOptions::CopyFrom(const EnumOptions& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumOptions) if (&from == this) return; Clear(); MergeFrom(from); } bool EnumOptions::IsInitialized() const { if (!_extensions_.IsInitialized()) { return false; } if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; return true; } void EnumOptions::Swap(EnumOptions* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { EnumOptions* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void EnumOptions::UnsafeArenaSwap(EnumOptions* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void EnumOptions::InternalSwap(EnumOptions* other) { using std::swap; uninterpreted_option_.InternalSwap(&other->uninterpreted_option_); swap(allow_alias_, other->allow_alias_); swap(deprecated_, other->deprecated_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); _extensions_.Swap(&other->_extensions_); } ::google::protobuf::Metadata EnumOptions::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void EnumValueOptions::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int EnumValueOptions::kDeprecatedFieldNumber; const int EnumValueOptions::kUninterpretedOptionFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 EnumValueOptions::EnumValueOptions() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueOptions(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.EnumValueOptions) } EnumValueOptions::EnumValueOptions(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _extensions_(arena), _internal_metadata_(arena), uninterpreted_option_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueOptions(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.EnumValueOptions) } EnumValueOptions::EnumValueOptions(const EnumValueOptions& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), uninterpreted_option_(from.uninterpreted_option_) { _internal_metadata_.MergeFrom(from._internal_metadata_); _extensions_.MergeFrom(from._extensions_); deprecated_ = from.deprecated_; // @@protoc_insertion_point(copy_constructor:google.protobuf.EnumValueOptions) } void EnumValueOptions::SharedCtor() { _cached_size_ = 0; deprecated_ = false; } EnumValueOptions::~EnumValueOptions() { // @@protoc_insertion_point(destructor:google.protobuf.EnumValueOptions) SharedDtor(); } void EnumValueOptions::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void EnumValueOptions::ArenaDtor(void* object) { EnumValueOptions* _this = reinterpret_cast< EnumValueOptions* >(object); (void)_this; } void EnumValueOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void EnumValueOptions::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* EnumValueOptions::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const EnumValueOptions& EnumValueOptions::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueOptions(); return *internal_default_instance(); } EnumValueOptions* EnumValueOptions::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void EnumValueOptions::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.EnumValueOptions) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; _extensions_.Clear(); uninterpreted_option_.Clear(); deprecated_ = false; _has_bits_.Clear(); _internal_metadata_.Clear(); } bool EnumValueOptions::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.EnumValueOptions) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional bool deprecated = 1 [default = false]; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { set_has_deprecated(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &deprecated_))); } else { goto handle_unusual; } break; } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; case 999: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } if ((8000u <= tag)) { DO_(_extensions_.ParseField(tag, input, internal_default_instance(), _internal_metadata_.mutable_unknown_fields())); continue; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.EnumValueOptions) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.EnumValueOptions) return false; #undef DO_ } void EnumValueOptions::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.EnumValueOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional bool deprecated = 1 [default = false]; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->deprecated(), output); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 999, this->uninterpreted_option(static_cast(i)), output); } // Extension range [1000, 536870912) _extensions_.SerializeWithCachedSizes( 1000, 536870912, output); if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.EnumValueOptions) } ::google::protobuf::uint8* EnumValueOptions::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.EnumValueOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional bool deprecated = 1 [default = false]; if (cached_has_bits & 0x00000001u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(1, this->deprecated(), target); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 999, this->uninterpreted_option(static_cast(i)), deterministic, target); } // Extension range [1000, 536870912) target = _extensions_.InternalSerializeWithCachedSizesToArray( 1000, 536870912, deterministic, target); if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.EnumValueOptions) return target; } size_t EnumValueOptions::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.EnumValueOptions) size_t total_size = 0; total_size += _extensions_.ByteSize(); if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; { unsigned int count = static_cast(this->uninterpreted_option_size()); total_size += 2UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->uninterpreted_option(static_cast(i))); } } // optional bool deprecated = 1 [default = false]; if (has_deprecated()) { total_size += 1 + 1; } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void EnumValueOptions::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.EnumValueOptions) GOOGLE_DCHECK_NE(&from, this); const EnumValueOptions* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.EnumValueOptions) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.EnumValueOptions) MergeFrom(*source); } } void EnumValueOptions::MergeFrom(const EnumValueOptions& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.EnumValueOptions) GOOGLE_DCHECK_NE(&from, this); _extensions_.MergeFrom(from._extensions_); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; uninterpreted_option_.MergeFrom(from.uninterpreted_option_); if (from.has_deprecated()) { set_deprecated(from.deprecated()); } } void EnumValueOptions::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.EnumValueOptions) if (&from == this) return; Clear(); MergeFrom(from); } void EnumValueOptions::CopyFrom(const EnumValueOptions& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.EnumValueOptions) if (&from == this) return; Clear(); MergeFrom(from); } bool EnumValueOptions::IsInitialized() const { if (!_extensions_.IsInitialized()) { return false; } if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; return true; } void EnumValueOptions::Swap(EnumValueOptions* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { EnumValueOptions* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void EnumValueOptions::UnsafeArenaSwap(EnumValueOptions* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void EnumValueOptions::InternalSwap(EnumValueOptions* other) { using std::swap; uninterpreted_option_.InternalSwap(&other->uninterpreted_option_); swap(deprecated_, other->deprecated_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); _extensions_.Swap(&other->_extensions_); } ::google::protobuf::Metadata EnumValueOptions::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void ServiceOptions::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int ServiceOptions::kDeprecatedFieldNumber; const int ServiceOptions::kUninterpretedOptionFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 ServiceOptions::ServiceOptions() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceOptions(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.ServiceOptions) } ServiceOptions::ServiceOptions(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _extensions_(arena), _internal_metadata_(arena), uninterpreted_option_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceOptions(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.ServiceOptions) } ServiceOptions::ServiceOptions(const ServiceOptions& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), uninterpreted_option_(from.uninterpreted_option_) { _internal_metadata_.MergeFrom(from._internal_metadata_); _extensions_.MergeFrom(from._extensions_); deprecated_ = from.deprecated_; // @@protoc_insertion_point(copy_constructor:google.protobuf.ServiceOptions) } void ServiceOptions::SharedCtor() { _cached_size_ = 0; deprecated_ = false; } ServiceOptions::~ServiceOptions() { // @@protoc_insertion_point(destructor:google.protobuf.ServiceOptions) SharedDtor(); } void ServiceOptions::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void ServiceOptions::ArenaDtor(void* object) { ServiceOptions* _this = reinterpret_cast< ServiceOptions* >(object); (void)_this; } void ServiceOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void ServiceOptions::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* ServiceOptions::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const ServiceOptions& ServiceOptions::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceOptions(); return *internal_default_instance(); } ServiceOptions* ServiceOptions::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void ServiceOptions::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.ServiceOptions) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; _extensions_.Clear(); uninterpreted_option_.Clear(); deprecated_ = false; _has_bits_.Clear(); _internal_metadata_.Clear(); } bool ServiceOptions::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.ServiceOptions) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional bool deprecated = 33 [default = false]; case 33: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 264 & 0xFF */)) { set_has_deprecated(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &deprecated_))); } else { goto handle_unusual; } break; } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; case 999: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } if ((8000u <= tag)) { DO_(_extensions_.ParseField(tag, input, internal_default_instance(), _internal_metadata_.mutable_unknown_fields())); continue; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.ServiceOptions) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.ServiceOptions) return false; #undef DO_ } void ServiceOptions::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.ServiceOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional bool deprecated = 33 [default = false]; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormatLite::WriteBool(33, this->deprecated(), output); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 999, this->uninterpreted_option(static_cast(i)), output); } // Extension range [1000, 536870912) _extensions_.SerializeWithCachedSizes( 1000, 536870912, output); if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.ServiceOptions) } ::google::protobuf::uint8* ServiceOptions::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ServiceOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional bool deprecated = 33 [default = false]; if (cached_has_bits & 0x00000001u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(33, this->deprecated(), target); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 999, this->uninterpreted_option(static_cast(i)), deterministic, target); } // Extension range [1000, 536870912) target = _extensions_.InternalSerializeWithCachedSizesToArray( 1000, 536870912, deterministic, target); if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ServiceOptions) return target; } size_t ServiceOptions::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.ServiceOptions) size_t total_size = 0; total_size += _extensions_.ByteSize(); if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; { unsigned int count = static_cast(this->uninterpreted_option_size()); total_size += 2UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->uninterpreted_option(static_cast(i))); } } // optional bool deprecated = 33 [default = false]; if (has_deprecated()) { total_size += 2 + 1; } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void ServiceOptions::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.ServiceOptions) GOOGLE_DCHECK_NE(&from, this); const ServiceOptions* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.ServiceOptions) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.ServiceOptions) MergeFrom(*source); } } void ServiceOptions::MergeFrom(const ServiceOptions& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ServiceOptions) GOOGLE_DCHECK_NE(&from, this); _extensions_.MergeFrom(from._extensions_); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; uninterpreted_option_.MergeFrom(from.uninterpreted_option_); if (from.has_deprecated()) { set_deprecated(from.deprecated()); } } void ServiceOptions::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.ServiceOptions) if (&from == this) return; Clear(); MergeFrom(from); } void ServiceOptions::CopyFrom(const ServiceOptions& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.ServiceOptions) if (&from == this) return; Clear(); MergeFrom(from); } bool ServiceOptions::IsInitialized() const { if (!_extensions_.IsInitialized()) { return false; } if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; return true; } void ServiceOptions::Swap(ServiceOptions* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { ServiceOptions* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void ServiceOptions::UnsafeArenaSwap(ServiceOptions* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void ServiceOptions::InternalSwap(ServiceOptions* other) { using std::swap; uninterpreted_option_.InternalSwap(&other->uninterpreted_option_); swap(deprecated_, other->deprecated_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); _extensions_.Swap(&other->_extensions_); } ::google::protobuf::Metadata ServiceOptions::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void MethodOptions::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int MethodOptions::kDeprecatedFieldNumber; const int MethodOptions::kIdempotencyLevelFieldNumber; const int MethodOptions::kUninterpretedOptionFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 MethodOptions::MethodOptions() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodOptions(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.MethodOptions) } MethodOptions::MethodOptions(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _extensions_(arena), _internal_metadata_(arena), uninterpreted_option_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodOptions(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.MethodOptions) } MethodOptions::MethodOptions(const MethodOptions& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), uninterpreted_option_(from.uninterpreted_option_) { _internal_metadata_.MergeFrom(from._internal_metadata_); _extensions_.MergeFrom(from._extensions_); ::memcpy(&deprecated_, &from.deprecated_, static_cast(reinterpret_cast(&idempotency_level_) - reinterpret_cast(&deprecated_)) + sizeof(idempotency_level_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.MethodOptions) } void MethodOptions::SharedCtor() { _cached_size_ = 0; ::memset(&deprecated_, 0, static_cast( reinterpret_cast(&idempotency_level_) - reinterpret_cast(&deprecated_)) + sizeof(idempotency_level_)); } MethodOptions::~MethodOptions() { // @@protoc_insertion_point(destructor:google.protobuf.MethodOptions) SharedDtor(); } void MethodOptions::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void MethodOptions::ArenaDtor(void* object) { MethodOptions* _this = reinterpret_cast< MethodOptions* >(object); (void)_this; } void MethodOptions::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void MethodOptions::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* MethodOptions::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const MethodOptions& MethodOptions::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodOptions(); return *internal_default_instance(); } MethodOptions* MethodOptions::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void MethodOptions::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.MethodOptions) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; _extensions_.Clear(); uninterpreted_option_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 3u) { ::memset(&deprecated_, 0, static_cast( reinterpret_cast(&idempotency_level_) - reinterpret_cast(&deprecated_)) + sizeof(idempotency_level_)); } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool MethodOptions::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.MethodOptions) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(16383u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // optional bool deprecated = 33 [default = false]; case 33: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 264 & 0xFF */)) { set_has_deprecated(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &deprecated_))); } else { goto handle_unusual; } break; } // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN]; case 34: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 272 & 0xFF */)) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); if (::google::protobuf::MethodOptions_IdempotencyLevel_IsValid(value)) { set_idempotency_level(static_cast< ::google::protobuf::MethodOptions_IdempotencyLevel >(value)); } else { mutable_unknown_fields()->AddVarint( 34, static_cast< ::google::protobuf::uint64>(value)); } } else { goto handle_unusual; } break; } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; case 999: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 7994 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_uninterpreted_option())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } if ((8000u <= tag)) { DO_(_extensions_.ParseField(tag, input, internal_default_instance(), _internal_metadata_.mutable_unknown_fields())); continue; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.MethodOptions) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.MethodOptions) return false; #undef DO_ } void MethodOptions::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.MethodOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional bool deprecated = 33 [default = false]; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormatLite::WriteBool(33, this->deprecated(), output); } // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN]; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 34, this->idempotency_level(), output); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 999, this->uninterpreted_option(static_cast(i)), output); } // Extension range [1000, 536870912) _extensions_.SerializeWithCachedSizes( 1000, 536870912, output); if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.MethodOptions) } ::google::protobuf::uint8* MethodOptions::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.MethodOptions) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // optional bool deprecated = 33 [default = false]; if (cached_has_bits & 0x00000001u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(33, this->deprecated(), target); } // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN]; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( 34, this->idempotency_level(), target); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; for (unsigned int i = 0, n = static_cast(this->uninterpreted_option_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 999, this->uninterpreted_option(static_cast(i)), deterministic, target); } // Extension range [1000, 536870912) target = _extensions_.InternalSerializeWithCachedSizesToArray( 1000, 536870912, deterministic, target); if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.MethodOptions) return target; } size_t MethodOptions::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.MethodOptions) size_t total_size = 0; total_size += _extensions_.ByteSize(); if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; { unsigned int count = static_cast(this->uninterpreted_option_size()); total_size += 2UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->uninterpreted_option(static_cast(i))); } } if (_has_bits_[0 / 32] & 3u) { // optional bool deprecated = 33 [default = false]; if (has_deprecated()) { total_size += 2 + 1; } // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN]; if (has_idempotency_level()) { total_size += 2 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->idempotency_level()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void MethodOptions::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.MethodOptions) GOOGLE_DCHECK_NE(&from, this); const MethodOptions* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.MethodOptions) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.MethodOptions) MergeFrom(*source); } } void MethodOptions::MergeFrom(const MethodOptions& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.MethodOptions) GOOGLE_DCHECK_NE(&from, this); _extensions_.MergeFrom(from._extensions_); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; uninterpreted_option_.MergeFrom(from.uninterpreted_option_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { deprecated_ = from.deprecated_; } if (cached_has_bits & 0x00000002u) { idempotency_level_ = from.idempotency_level_; } _has_bits_[0] |= cached_has_bits; } } void MethodOptions::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.MethodOptions) if (&from == this) return; Clear(); MergeFrom(from); } void MethodOptions::CopyFrom(const MethodOptions& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.MethodOptions) if (&from == this) return; Clear(); MergeFrom(from); } bool MethodOptions::IsInitialized() const { if (!_extensions_.IsInitialized()) { return false; } if (!::google::protobuf::internal::AllAreInitialized(this->uninterpreted_option())) return false; return true; } void MethodOptions::Swap(MethodOptions* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { MethodOptions* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void MethodOptions::UnsafeArenaSwap(MethodOptions* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void MethodOptions::InternalSwap(MethodOptions* other) { using std::swap; uninterpreted_option_.InternalSwap(&other->uninterpreted_option_); swap(deprecated_, other->deprecated_); swap(idempotency_level_, other->idempotency_level_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); _extensions_.Swap(&other->_extensions_); } ::google::protobuf::Metadata MethodOptions::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void UninterpretedOption_NamePart::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int UninterpretedOption_NamePart::kNamePartFieldNumber; const int UninterpretedOption_NamePart::kIsExtensionFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 UninterpretedOption_NamePart::UninterpretedOption_NamePart() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption_NamePart(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.UninterpretedOption.NamePart) } UninterpretedOption_NamePart::UninterpretedOption_NamePart(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption_NamePart(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.UninterpretedOption.NamePart) } UninterpretedOption_NamePart::UninterpretedOption_NamePart(const UninterpretedOption_NamePart& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); name_part_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_name_part()) { name_part_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.name_part(), GetArenaNoVirtual()); } is_extension_ = from.is_extension_; // @@protoc_insertion_point(copy_constructor:google.protobuf.UninterpretedOption.NamePart) } void UninterpretedOption_NamePart::SharedCtor() { _cached_size_ = 0; name_part_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); is_extension_ = false; } UninterpretedOption_NamePart::~UninterpretedOption_NamePart() { // @@protoc_insertion_point(destructor:google.protobuf.UninterpretedOption.NamePart) SharedDtor(); } void UninterpretedOption_NamePart::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); name_part_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void UninterpretedOption_NamePart::ArenaDtor(void* object) { UninterpretedOption_NamePart* _this = reinterpret_cast< UninterpretedOption_NamePart* >(object); (void)_this; } void UninterpretedOption_NamePart::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void UninterpretedOption_NamePart::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* UninterpretedOption_NamePart::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const UninterpretedOption_NamePart& UninterpretedOption_NamePart::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption_NamePart(); return *internal_default_instance(); } UninterpretedOption_NamePart* UninterpretedOption_NamePart::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void UninterpretedOption_NamePart::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.UninterpretedOption.NamePart) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; cached_has_bits = _has_bits_[0]; if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!name_part_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); name_part_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } is_extension_ = false; _has_bits_.Clear(); _internal_metadata_.Clear(); } bool UninterpretedOption_NamePart::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.UninterpretedOption.NamePart) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // required string name_part = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name_part())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name_part().data(), static_cast(this->name_part().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.UninterpretedOption.NamePart.name_part"); } else { goto handle_unusual; } break; } // required bool is_extension = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { set_has_is_extension(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &is_extension_))); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.UninterpretedOption.NamePart) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.UninterpretedOption.NamePart) return false; #undef DO_ } void UninterpretedOption_NamePart::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.UninterpretedOption.NamePart) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // required string name_part = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name_part().data(), static_cast(this->name_part().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.UninterpretedOption.NamePart.name_part"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->name_part(), output); } // required bool is_extension = 2; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->is_extension(), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.UninterpretedOption.NamePart) } ::google::protobuf::uint8* UninterpretedOption_NamePart::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UninterpretedOption.NamePart) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = _has_bits_[0]; // required string name_part = 1; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->name_part().data(), static_cast(this->name_part().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.UninterpretedOption.NamePart.name_part"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name_part(), target); } // required bool is_extension = 2; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->is_extension(), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.UninterpretedOption.NamePart) return target; } size_t UninterpretedOption_NamePart::RequiredFieldsByteSizeFallback() const { // @@protoc_insertion_point(required_fields_byte_size_fallback_start:google.protobuf.UninterpretedOption.NamePart) size_t total_size = 0; if (has_name_part()) { // required string name_part = 1; total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name_part()); } if (has_is_extension()) { // required bool is_extension = 2; total_size += 1 + 1; } return total_size; } size_t UninterpretedOption_NamePart::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.UninterpretedOption.NamePart) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } if (((_has_bits_[0] & 0x00000003) ^ 0x00000003) == 0) { // All required fields are present. // required string name_part = 1; total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name_part()); // required bool is_extension = 2; total_size += 1 + 1; } else { total_size += RequiredFieldsByteSizeFallback(); } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void UninterpretedOption_NamePart::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.UninterpretedOption.NamePart) GOOGLE_DCHECK_NE(&from, this); const UninterpretedOption_NamePart* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.UninterpretedOption.NamePart) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.UninterpretedOption.NamePart) MergeFrom(*source); } } void UninterpretedOption_NamePart::MergeFrom(const UninterpretedOption_NamePart& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.UninterpretedOption.NamePart) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { set_name_part(from.name_part()); } if (cached_has_bits & 0x00000002u) { is_extension_ = from.is_extension_; } _has_bits_[0] |= cached_has_bits; } } void UninterpretedOption_NamePart::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.UninterpretedOption.NamePart) if (&from == this) return; Clear(); MergeFrom(from); } void UninterpretedOption_NamePart::CopyFrom(const UninterpretedOption_NamePart& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.UninterpretedOption.NamePart) if (&from == this) return; Clear(); MergeFrom(from); } bool UninterpretedOption_NamePart::IsInitialized() const { if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false; return true; } void UninterpretedOption_NamePart::Swap(UninterpretedOption_NamePart* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { UninterpretedOption_NamePart* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void UninterpretedOption_NamePart::UnsafeArenaSwap(UninterpretedOption_NamePart* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void UninterpretedOption_NamePart::InternalSwap(UninterpretedOption_NamePart* other) { using std::swap; name_part_.Swap(&other->name_part_); swap(is_extension_, other->is_extension_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata UninterpretedOption_NamePart::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void UninterpretedOption::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int UninterpretedOption::kNameFieldNumber; const int UninterpretedOption::kIdentifierValueFieldNumber; const int UninterpretedOption::kPositiveIntValueFieldNumber; const int UninterpretedOption::kNegativeIntValueFieldNumber; const int UninterpretedOption::kDoubleValueFieldNumber; const int UninterpretedOption::kStringValueFieldNumber; const int UninterpretedOption::kAggregateValueFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 UninterpretedOption::UninterpretedOption() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.UninterpretedOption) } UninterpretedOption::UninterpretedOption(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), name_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.UninterpretedOption) } UninterpretedOption::UninterpretedOption(const UninterpretedOption& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), name_(from.name_) { _internal_metadata_.MergeFrom(from._internal_metadata_); identifier_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_identifier_value()) { identifier_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.identifier_value(), GetArenaNoVirtual()); } string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_string_value()) { string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.string_value(), GetArenaNoVirtual()); } aggregate_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_aggregate_value()) { aggregate_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.aggregate_value(), GetArenaNoVirtual()); } ::memcpy(&positive_int_value_, &from.positive_int_value_, static_cast(reinterpret_cast(&double_value_) - reinterpret_cast(&positive_int_value_)) + sizeof(double_value_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.UninterpretedOption) } void UninterpretedOption::SharedCtor() { _cached_size_ = 0; identifier_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); aggregate_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(&positive_int_value_, 0, static_cast( reinterpret_cast(&double_value_) - reinterpret_cast(&positive_int_value_)) + sizeof(double_value_)); } UninterpretedOption::~UninterpretedOption() { // @@protoc_insertion_point(destructor:google.protobuf.UninterpretedOption) SharedDtor(); } void UninterpretedOption::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); identifier_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); string_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); aggregate_value_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void UninterpretedOption::ArenaDtor(void* object) { UninterpretedOption* _this = reinterpret_cast< UninterpretedOption* >(object); (void)_this; } void UninterpretedOption::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void UninterpretedOption::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* UninterpretedOption::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const UninterpretedOption& UninterpretedOption::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption(); return *internal_default_instance(); } UninterpretedOption* UninterpretedOption::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void UninterpretedOption::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.UninterpretedOption) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; name_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 7u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!identifier_value_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); identifier_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(!string_value_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); string_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000004u) { GOOGLE_DCHECK(!aggregate_value_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); aggregate_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } } if (cached_has_bits & 56u) { ::memset(&positive_int_value_, 0, static_cast( reinterpret_cast(&double_value_) - reinterpret_cast(&positive_int_value_)) + sizeof(double_value_)); } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool UninterpretedOption::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.UninterpretedOption) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_name())); } else { goto handle_unusual; } break; } // optional string identifier_value = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_identifier_value())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->identifier_value().data(), static_cast(this->identifier_value().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.UninterpretedOption.identifier_value"); } else { goto handle_unusual; } break; } // optional uint64 positive_int_value = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(32u /* 32 & 0xFF */)) { set_has_positive_int_value(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( input, &positive_int_value_))); } else { goto handle_unusual; } break; } // optional int64 negative_int_value = 5; case 5: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(40u /* 40 & 0xFF */)) { set_has_negative_int_value(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( input, &negative_int_value_))); } else { goto handle_unusual; } break; } // optional double double_value = 6; case 6: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(49u /* 49 & 0xFF */)) { set_has_double_value(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( input, &double_value_))); } else { goto handle_unusual; } break; } // optional bytes string_value = 7; case 7: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(58u /* 58 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( input, this->mutable_string_value())); } else { goto handle_unusual; } break; } // optional string aggregate_value = 8; case 8: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(66u /* 66 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_aggregate_value())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->aggregate_value().data(), static_cast(this->aggregate_value().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.UninterpretedOption.aggregate_value"); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.UninterpretedOption) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.UninterpretedOption) return false; #undef DO_ } void UninterpretedOption::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.UninterpretedOption) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; for (unsigned int i = 0, n = static_cast(this->name_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 2, this->name(static_cast(i)), output); } cached_has_bits = _has_bits_[0]; // optional string identifier_value = 3; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->identifier_value().data(), static_cast(this->identifier_value().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.UninterpretedOption.identifier_value"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 3, this->identifier_value(), output); } // optional uint64 positive_int_value = 4; if (cached_has_bits & 0x00000008u) { ::google::protobuf::internal::WireFormatLite::WriteUInt64(4, this->positive_int_value(), output); } // optional int64 negative_int_value = 5; if (cached_has_bits & 0x00000010u) { ::google::protobuf::internal::WireFormatLite::WriteInt64(5, this->negative_int_value(), output); } // optional double double_value = 6; if (cached_has_bits & 0x00000020u) { ::google::protobuf::internal::WireFormatLite::WriteDouble(6, this->double_value(), output); } // optional bytes string_value = 7; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( 7, this->string_value(), output); } // optional string aggregate_value = 8; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->aggregate_value().data(), static_cast(this->aggregate_value().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.UninterpretedOption.aggregate_value"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 8, this->aggregate_value(), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.UninterpretedOption) } ::google::protobuf::uint8* UninterpretedOption::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.UninterpretedOption) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; for (unsigned int i = 0, n = static_cast(this->name_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 2, this->name(static_cast(i)), deterministic, target); } cached_has_bits = _has_bits_[0]; // optional string identifier_value = 3; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->identifier_value().data(), static_cast(this->identifier_value().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.UninterpretedOption.identifier_value"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 3, this->identifier_value(), target); } // optional uint64 positive_int_value = 4; if (cached_has_bits & 0x00000008u) { target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(4, this->positive_int_value(), target); } // optional int64 negative_int_value = 5; if (cached_has_bits & 0x00000010u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(5, this->negative_int_value(), target); } // optional double double_value = 6; if (cached_has_bits & 0x00000020u) { target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(6, this->double_value(), target); } // optional bytes string_value = 7; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite::WriteBytesToArray( 7, this->string_value(), target); } // optional string aggregate_value = 8; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->aggregate_value().data(), static_cast(this->aggregate_value().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.UninterpretedOption.aggregate_value"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 8, this->aggregate_value(), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.UninterpretedOption) return target; } size_t UninterpretedOption::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.UninterpretedOption) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; { unsigned int count = static_cast(this->name_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->name(static_cast(i))); } } if (_has_bits_[0 / 32] & 63u) { // optional string identifier_value = 3; if (has_identifier_value()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->identifier_value()); } // optional bytes string_value = 7; if (has_string_value()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::BytesSize( this->string_value()); } // optional string aggregate_value = 8; if (has_aggregate_value()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->aggregate_value()); } // optional uint64 positive_int_value = 4; if (has_positive_int_value()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::UInt64Size( this->positive_int_value()); } // optional int64 negative_int_value = 5; if (has_negative_int_value()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int64Size( this->negative_int_value()); } // optional double double_value = 6; if (has_double_value()) { total_size += 1 + 8; } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void UninterpretedOption::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.UninterpretedOption) GOOGLE_DCHECK_NE(&from, this); const UninterpretedOption* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.UninterpretedOption) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.UninterpretedOption) MergeFrom(*source); } } void UninterpretedOption::MergeFrom(const UninterpretedOption& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.UninterpretedOption) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; name_.MergeFrom(from.name_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 63u) { if (cached_has_bits & 0x00000001u) { set_identifier_value(from.identifier_value()); } if (cached_has_bits & 0x00000002u) { set_string_value(from.string_value()); } if (cached_has_bits & 0x00000004u) { set_aggregate_value(from.aggregate_value()); } if (cached_has_bits & 0x00000008u) { positive_int_value_ = from.positive_int_value_; } if (cached_has_bits & 0x00000010u) { negative_int_value_ = from.negative_int_value_; } if (cached_has_bits & 0x00000020u) { double_value_ = from.double_value_; } _has_bits_[0] |= cached_has_bits; } } void UninterpretedOption::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.UninterpretedOption) if (&from == this) return; Clear(); MergeFrom(from); } void UninterpretedOption::CopyFrom(const UninterpretedOption& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.UninterpretedOption) if (&from == this) return; Clear(); MergeFrom(from); } bool UninterpretedOption::IsInitialized() const { if (!::google::protobuf::internal::AllAreInitialized(this->name())) return false; return true; } void UninterpretedOption::Swap(UninterpretedOption* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { UninterpretedOption* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void UninterpretedOption::UnsafeArenaSwap(UninterpretedOption* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void UninterpretedOption::InternalSwap(UninterpretedOption* other) { using std::swap; name_.InternalSwap(&other->name_); identifier_value_.Swap(&other->identifier_value_); string_value_.Swap(&other->string_value_); aggregate_value_.Swap(&other->aggregate_value_); swap(positive_int_value_, other->positive_int_value_); swap(negative_int_value_, other->negative_int_value_); swap(double_value_, other->double_value_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata UninterpretedOption::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void SourceCodeInfo_Location::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int SourceCodeInfo_Location::kPathFieldNumber; const int SourceCodeInfo_Location::kSpanFieldNumber; const int SourceCodeInfo_Location::kLeadingCommentsFieldNumber; const int SourceCodeInfo_Location::kTrailingCommentsFieldNumber; const int SourceCodeInfo_Location::kLeadingDetachedCommentsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 SourceCodeInfo_Location::SourceCodeInfo_Location() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo_Location(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.SourceCodeInfo.Location) } SourceCodeInfo_Location::SourceCodeInfo_Location(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), path_(arena), span_(arena), leading_detached_comments_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo_Location(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.SourceCodeInfo.Location) } SourceCodeInfo_Location::SourceCodeInfo_Location(const SourceCodeInfo_Location& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), path_(from.path_), span_(from.span_), leading_detached_comments_(from.leading_detached_comments_) { _internal_metadata_.MergeFrom(from._internal_metadata_); leading_comments_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_leading_comments()) { leading_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.leading_comments(), GetArenaNoVirtual()); } trailing_comments_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_trailing_comments()) { trailing_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.trailing_comments(), GetArenaNoVirtual()); } // @@protoc_insertion_point(copy_constructor:google.protobuf.SourceCodeInfo.Location) } void SourceCodeInfo_Location::SharedCtor() { _cached_size_ = 0; leading_comments_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); trailing_comments_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } SourceCodeInfo_Location::~SourceCodeInfo_Location() { // @@protoc_insertion_point(destructor:google.protobuf.SourceCodeInfo.Location) SharedDtor(); } void SourceCodeInfo_Location::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); leading_comments_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); trailing_comments_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void SourceCodeInfo_Location::ArenaDtor(void* object) { SourceCodeInfo_Location* _this = reinterpret_cast< SourceCodeInfo_Location* >(object); (void)_this; } void SourceCodeInfo_Location::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void SourceCodeInfo_Location::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* SourceCodeInfo_Location::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const SourceCodeInfo_Location& SourceCodeInfo_Location::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo_Location(); return *internal_default_instance(); } SourceCodeInfo_Location* SourceCodeInfo_Location::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void SourceCodeInfo_Location::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.SourceCodeInfo.Location) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; path_.Clear(); span_.Clear(); leading_detached_comments_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!leading_comments_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); leading_comments_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 0x00000002u) { GOOGLE_DCHECK(!trailing_comments_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); trailing_comments_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool SourceCodeInfo_Location::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.SourceCodeInfo.Location) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated int32 path = 1 [packed = true]; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, this->mutable_path()))); } else if ( static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( 1, 10u, input, this->mutable_path()))); } else { goto handle_unusual; } break; } // repeated int32 span = 2 [packed = true]; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, this->mutable_span()))); } else if ( static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( 1, 18u, input, this->mutable_span()))); } else { goto handle_unusual; } break; } // optional string leading_comments = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_leading_comments())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->leading_comments().data(), static_cast(this->leading_comments().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.SourceCodeInfo.Location.leading_comments"); } else { goto handle_unusual; } break; } // optional string trailing_comments = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_trailing_comments())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->trailing_comments().data(), static_cast(this->trailing_comments().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.SourceCodeInfo.Location.trailing_comments"); } else { goto handle_unusual; } break; } // repeated string leading_detached_comments = 6; case 6: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->add_leading_detached_comments())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->leading_detached_comments(this->leading_detached_comments_size() - 1).data(), static_cast(this->leading_detached_comments(this->leading_detached_comments_size() - 1).length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.SourceCodeInfo.Location.leading_detached_comments"); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.SourceCodeInfo.Location) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.SourceCodeInfo.Location) return false; #undef DO_ } void SourceCodeInfo_Location::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.SourceCodeInfo.Location) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated int32 path = 1 [packed = true]; if (this->path_size() > 0) { ::google::protobuf::internal::WireFormatLite::WriteTag(1, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); output->WriteVarint32(static_cast< ::google::protobuf::uint32>( _path_cached_byte_size_)); } for (int i = 0, n = this->path_size(); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag( this->path(i), output); } // repeated int32 span = 2 [packed = true]; if (this->span_size() > 0) { ::google::protobuf::internal::WireFormatLite::WriteTag(2, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); output->WriteVarint32(static_cast< ::google::protobuf::uint32>( _span_cached_byte_size_)); } for (int i = 0, n = this->span_size(); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag( this->span(i), output); } cached_has_bits = _has_bits_[0]; // optional string leading_comments = 3; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->leading_comments().data(), static_cast(this->leading_comments().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.SourceCodeInfo.Location.leading_comments"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 3, this->leading_comments(), output); } // optional string trailing_comments = 4; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->trailing_comments().data(), static_cast(this->trailing_comments().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.SourceCodeInfo.Location.trailing_comments"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 4, this->trailing_comments(), output); } // repeated string leading_detached_comments = 6; for (int i = 0, n = this->leading_detached_comments_size(); i < n; i++) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->leading_detached_comments(i).data(), static_cast(this->leading_detached_comments(i).length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.SourceCodeInfo.Location.leading_detached_comments"); ::google::protobuf::internal::WireFormatLite::WriteString( 6, this->leading_detached_comments(i), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.SourceCodeInfo.Location) } ::google::protobuf::uint8* SourceCodeInfo_Location::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceCodeInfo.Location) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated int32 path = 1 [packed = true]; if (this->path_size() > 0) { target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray( 1, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target); target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray( static_cast< ::google::protobuf::int32>( _path_cached_byte_size_), target); target = ::google::protobuf::internal::WireFormatLite:: WriteInt32NoTagToArray(this->path_, target); } // repeated int32 span = 2 [packed = true]; if (this->span_size() > 0) { target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray( 2, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target); target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray( static_cast< ::google::protobuf::int32>( _span_cached_byte_size_), target); target = ::google::protobuf::internal::WireFormatLite:: WriteInt32NoTagToArray(this->span_, target); } cached_has_bits = _has_bits_[0]; // optional string leading_comments = 3; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->leading_comments().data(), static_cast(this->leading_comments().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.SourceCodeInfo.Location.leading_comments"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 3, this->leading_comments(), target); } // optional string trailing_comments = 4; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->trailing_comments().data(), static_cast(this->trailing_comments().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.SourceCodeInfo.Location.trailing_comments"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 4, this->trailing_comments(), target); } // repeated string leading_detached_comments = 6; for (int i = 0, n = this->leading_detached_comments_size(); i < n; i++) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->leading_detached_comments(i).data(), static_cast(this->leading_detached_comments(i).length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.SourceCodeInfo.Location.leading_detached_comments"); target = ::google::protobuf::internal::WireFormatLite:: WriteStringToArray(6, this->leading_detached_comments(i), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.SourceCodeInfo.Location) return target; } size_t SourceCodeInfo_Location::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.SourceCodeInfo.Location) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated int32 path = 1 [packed = true]; { size_t data_size = ::google::protobuf::internal::WireFormatLite:: Int32Size(this->path_); if (data_size > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( static_cast< ::google::protobuf::int32>(data_size)); } int cached_size = ::google::protobuf::internal::ToCachedSize(data_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _path_cached_byte_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); total_size += data_size; } // repeated int32 span = 2 [packed = true]; { size_t data_size = ::google::protobuf::internal::WireFormatLite:: Int32Size(this->span_); if (data_size > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( static_cast< ::google::protobuf::int32>(data_size)); } int cached_size = ::google::protobuf::internal::ToCachedSize(data_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _span_cached_byte_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); total_size += data_size; } // repeated string leading_detached_comments = 6; total_size += 1 * ::google::protobuf::internal::FromIntSize(this->leading_detached_comments_size()); for (int i = 0, n = this->leading_detached_comments_size(); i < n; i++) { total_size += ::google::protobuf::internal::WireFormatLite::StringSize( this->leading_detached_comments(i)); } if (_has_bits_[0 / 32] & 3u) { // optional string leading_comments = 3; if (has_leading_comments()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->leading_comments()); } // optional string trailing_comments = 4; if (has_trailing_comments()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->trailing_comments()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void SourceCodeInfo_Location::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.SourceCodeInfo.Location) GOOGLE_DCHECK_NE(&from, this); const SourceCodeInfo_Location* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.SourceCodeInfo.Location) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.SourceCodeInfo.Location) MergeFrom(*source); } } void SourceCodeInfo_Location::MergeFrom(const SourceCodeInfo_Location& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.SourceCodeInfo.Location) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; path_.MergeFrom(from.path_); span_.MergeFrom(from.span_); leading_detached_comments_.MergeFrom(from.leading_detached_comments_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 3u) { if (cached_has_bits & 0x00000001u) { set_leading_comments(from.leading_comments()); } if (cached_has_bits & 0x00000002u) { set_trailing_comments(from.trailing_comments()); } } } void SourceCodeInfo_Location::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.SourceCodeInfo.Location) if (&from == this) return; Clear(); MergeFrom(from); } void SourceCodeInfo_Location::CopyFrom(const SourceCodeInfo_Location& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.SourceCodeInfo.Location) if (&from == this) return; Clear(); MergeFrom(from); } bool SourceCodeInfo_Location::IsInitialized() const { return true; } void SourceCodeInfo_Location::Swap(SourceCodeInfo_Location* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { SourceCodeInfo_Location* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void SourceCodeInfo_Location::UnsafeArenaSwap(SourceCodeInfo_Location* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void SourceCodeInfo_Location::InternalSwap(SourceCodeInfo_Location* other) { using std::swap; path_.InternalSwap(&other->path_); span_.InternalSwap(&other->span_); leading_detached_comments_.InternalSwap(&other->leading_detached_comments_); leading_comments_.Swap(&other->leading_comments_); trailing_comments_.Swap(&other->trailing_comments_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata SourceCodeInfo_Location::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void SourceCodeInfo::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int SourceCodeInfo::kLocationFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 SourceCodeInfo::SourceCodeInfo() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.SourceCodeInfo) } SourceCodeInfo::SourceCodeInfo(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), location_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.SourceCodeInfo) } SourceCodeInfo::SourceCodeInfo(const SourceCodeInfo& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), location_(from.location_) { _internal_metadata_.MergeFrom(from._internal_metadata_); // @@protoc_insertion_point(copy_constructor:google.protobuf.SourceCodeInfo) } void SourceCodeInfo::SharedCtor() { _cached_size_ = 0; } SourceCodeInfo::~SourceCodeInfo() { // @@protoc_insertion_point(destructor:google.protobuf.SourceCodeInfo) SharedDtor(); } void SourceCodeInfo::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void SourceCodeInfo::ArenaDtor(void* object) { SourceCodeInfo* _this = reinterpret_cast< SourceCodeInfo* >(object); (void)_this; } void SourceCodeInfo::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void SourceCodeInfo::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* SourceCodeInfo::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const SourceCodeInfo& SourceCodeInfo::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo(); return *internal_default_instance(); } SourceCodeInfo* SourceCodeInfo::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void SourceCodeInfo::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.SourceCodeInfo) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; location_.Clear(); _has_bits_.Clear(); _internal_metadata_.Clear(); } bool SourceCodeInfo::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.SourceCodeInfo) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated .google.protobuf.SourceCodeInfo.Location location = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_location())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.SourceCodeInfo) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.SourceCodeInfo) return false; #undef DO_ } void SourceCodeInfo::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.SourceCodeInfo) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.SourceCodeInfo.Location location = 1; for (unsigned int i = 0, n = static_cast(this->location_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 1, this->location(static_cast(i)), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.SourceCodeInfo) } ::google::protobuf::uint8* SourceCodeInfo::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceCodeInfo) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.SourceCodeInfo.Location location = 1; for (unsigned int i = 0, n = static_cast(this->location_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 1, this->location(static_cast(i)), deterministic, target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.SourceCodeInfo) return target; } size_t SourceCodeInfo::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.SourceCodeInfo) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.SourceCodeInfo.Location location = 1; { unsigned int count = static_cast(this->location_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->location(static_cast(i))); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void SourceCodeInfo::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.SourceCodeInfo) GOOGLE_DCHECK_NE(&from, this); const SourceCodeInfo* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.SourceCodeInfo) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.SourceCodeInfo) MergeFrom(*source); } } void SourceCodeInfo::MergeFrom(const SourceCodeInfo& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.SourceCodeInfo) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; location_.MergeFrom(from.location_); } void SourceCodeInfo::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.SourceCodeInfo) if (&from == this) return; Clear(); MergeFrom(from); } void SourceCodeInfo::CopyFrom(const SourceCodeInfo& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.SourceCodeInfo) if (&from == this) return; Clear(); MergeFrom(from); } bool SourceCodeInfo::IsInitialized() const { return true; } void SourceCodeInfo::Swap(SourceCodeInfo* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { SourceCodeInfo* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void SourceCodeInfo::UnsafeArenaSwap(SourceCodeInfo* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void SourceCodeInfo::InternalSwap(SourceCodeInfo* other) { using std::swap; location_.InternalSwap(&other->location_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata SourceCodeInfo::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void GeneratedCodeInfo_Annotation::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int GeneratedCodeInfo_Annotation::kPathFieldNumber; const int GeneratedCodeInfo_Annotation::kSourceFileFieldNumber; const int GeneratedCodeInfo_Annotation::kBeginFieldNumber; const int GeneratedCodeInfo_Annotation::kEndFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 GeneratedCodeInfo_Annotation::GeneratedCodeInfo_Annotation() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo_Annotation(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.GeneratedCodeInfo.Annotation) } GeneratedCodeInfo_Annotation::GeneratedCodeInfo_Annotation(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), path_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo_Annotation(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.GeneratedCodeInfo.Annotation) } GeneratedCodeInfo_Annotation::GeneratedCodeInfo_Annotation(const GeneratedCodeInfo_Annotation& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), path_(from.path_) { _internal_metadata_.MergeFrom(from._internal_metadata_); source_file_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.has_source_file()) { source_file_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.source_file(), GetArenaNoVirtual()); } ::memcpy(&begin_, &from.begin_, static_cast(reinterpret_cast(&end_) - reinterpret_cast(&begin_)) + sizeof(end_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.GeneratedCodeInfo.Annotation) } void GeneratedCodeInfo_Annotation::SharedCtor() { _cached_size_ = 0; source_file_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::memset(&begin_, 0, static_cast( reinterpret_cast(&end_) - reinterpret_cast(&begin_)) + sizeof(end_)); } GeneratedCodeInfo_Annotation::~GeneratedCodeInfo_Annotation() { // @@protoc_insertion_point(destructor:google.protobuf.GeneratedCodeInfo.Annotation) SharedDtor(); } void GeneratedCodeInfo_Annotation::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); source_file_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void GeneratedCodeInfo_Annotation::ArenaDtor(void* object) { GeneratedCodeInfo_Annotation* _this = reinterpret_cast< GeneratedCodeInfo_Annotation* >(object); (void)_this; } void GeneratedCodeInfo_Annotation::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void GeneratedCodeInfo_Annotation::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* GeneratedCodeInfo_Annotation::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const GeneratedCodeInfo_Annotation& GeneratedCodeInfo_Annotation::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo_Annotation(); return *internal_default_instance(); } GeneratedCodeInfo_Annotation* GeneratedCodeInfo_Annotation::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void GeneratedCodeInfo_Annotation::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.GeneratedCodeInfo.Annotation) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; path_.Clear(); cached_has_bits = _has_bits_[0]; if (cached_has_bits & 0x00000001u) { GOOGLE_DCHECK(!source_file_.IsDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited())); source_file_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } if (cached_has_bits & 6u) { ::memset(&begin_, 0, static_cast( reinterpret_cast(&end_) - reinterpret_cast(&begin_)) + sizeof(end_)); } _has_bits_.Clear(); _internal_metadata_.Clear(); } bool GeneratedCodeInfo_Annotation::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.GeneratedCodeInfo.Annotation) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated int32 path = 1 [packed = true]; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, this->mutable_path()))); } else if ( static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( 1, 10u, input, this->mutable_path()))); } else { goto handle_unusual; } break; } // optional string source_file = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_source_file())); ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->source_file().data(), static_cast(this->source_file().length()), ::google::protobuf::internal::WireFormat::PARSE, "google.protobuf.GeneratedCodeInfo.Annotation.source_file"); } else { goto handle_unusual; } break; } // optional int32 begin = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) { set_has_begin(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &begin_))); } else { goto handle_unusual; } break; } // optional int32 end = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(32u /* 32 & 0xFF */)) { set_has_end(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &end_))); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.GeneratedCodeInfo.Annotation) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.GeneratedCodeInfo.Annotation) return false; #undef DO_ } void GeneratedCodeInfo_Annotation::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.GeneratedCodeInfo.Annotation) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated int32 path = 1 [packed = true]; if (this->path_size() > 0) { ::google::protobuf::internal::WireFormatLite::WriteTag(1, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); output->WriteVarint32(static_cast< ::google::protobuf::uint32>( _path_cached_byte_size_)); } for (int i = 0, n = this->path_size(); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag( this->path(i), output); } cached_has_bits = _has_bits_[0]; // optional string source_file = 2; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->source_file().data(), static_cast(this->source_file().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.GeneratedCodeInfo.Annotation.source_file"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 2, this->source_file(), output); } // optional int32 begin = 3; if (cached_has_bits & 0x00000002u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->begin(), output); } // optional int32 end = 4; if (cached_has_bits & 0x00000004u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(4, this->end(), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.GeneratedCodeInfo.Annotation) } ::google::protobuf::uint8* GeneratedCodeInfo_Annotation::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.GeneratedCodeInfo.Annotation) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated int32 path = 1 [packed = true]; if (this->path_size() > 0) { target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray( 1, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target); target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray( static_cast< ::google::protobuf::int32>( _path_cached_byte_size_), target); target = ::google::protobuf::internal::WireFormatLite:: WriteInt32NoTagToArray(this->path_, target); } cached_has_bits = _has_bits_[0]; // optional string source_file = 2; if (cached_has_bits & 0x00000001u) { ::google::protobuf::internal::WireFormat::VerifyUTF8StringNamedField( this->source_file().data(), static_cast(this->source_file().length()), ::google::protobuf::internal::WireFormat::SERIALIZE, "google.protobuf.GeneratedCodeInfo.Annotation.source_file"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 2, this->source_file(), target); } // optional int32 begin = 3; if (cached_has_bits & 0x00000002u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(3, this->begin(), target); } // optional int32 end = 4; if (cached_has_bits & 0x00000004u) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(4, this->end(), target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.GeneratedCodeInfo.Annotation) return target; } size_t GeneratedCodeInfo_Annotation::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.GeneratedCodeInfo.Annotation) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated int32 path = 1 [packed = true]; { size_t data_size = ::google::protobuf::internal::WireFormatLite:: Int32Size(this->path_); if (data_size > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( static_cast< ::google::protobuf::int32>(data_size)); } int cached_size = ::google::protobuf::internal::ToCachedSize(data_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _path_cached_byte_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); total_size += data_size; } if (_has_bits_[0 / 32] & 7u) { // optional string source_file = 2; if (has_source_file()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->source_file()); } // optional int32 begin = 3; if (has_begin()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->begin()); } // optional int32 end = 4; if (has_end()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->end()); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void GeneratedCodeInfo_Annotation::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.GeneratedCodeInfo.Annotation) GOOGLE_DCHECK_NE(&from, this); const GeneratedCodeInfo_Annotation* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.GeneratedCodeInfo.Annotation) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.GeneratedCodeInfo.Annotation) MergeFrom(*source); } } void GeneratedCodeInfo_Annotation::MergeFrom(const GeneratedCodeInfo_Annotation& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.GeneratedCodeInfo.Annotation) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; path_.MergeFrom(from.path_); cached_has_bits = from._has_bits_[0]; if (cached_has_bits & 7u) { if (cached_has_bits & 0x00000001u) { set_source_file(from.source_file()); } if (cached_has_bits & 0x00000002u) { begin_ = from.begin_; } if (cached_has_bits & 0x00000004u) { end_ = from.end_; } _has_bits_[0] |= cached_has_bits; } } void GeneratedCodeInfo_Annotation::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.GeneratedCodeInfo.Annotation) if (&from == this) return; Clear(); MergeFrom(from); } void GeneratedCodeInfo_Annotation::CopyFrom(const GeneratedCodeInfo_Annotation& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.GeneratedCodeInfo.Annotation) if (&from == this) return; Clear(); MergeFrom(from); } bool GeneratedCodeInfo_Annotation::IsInitialized() const { return true; } void GeneratedCodeInfo_Annotation::Swap(GeneratedCodeInfo_Annotation* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { GeneratedCodeInfo_Annotation* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void GeneratedCodeInfo_Annotation::UnsafeArenaSwap(GeneratedCodeInfo_Annotation* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void GeneratedCodeInfo_Annotation::InternalSwap(GeneratedCodeInfo_Annotation* other) { using std::swap; path_.InternalSwap(&other->path_); source_file_.Swap(&other->source_file_); swap(begin_, other->begin_); swap(end_, other->end_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata GeneratedCodeInfo_Annotation::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void GeneratedCodeInfo::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int GeneratedCodeInfo::kAnnotationFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 GeneratedCodeInfo::GeneratedCodeInfo() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.GeneratedCodeInfo) } GeneratedCodeInfo::GeneratedCodeInfo(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), annotation_(arena) { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.GeneratedCodeInfo) } GeneratedCodeInfo::GeneratedCodeInfo(const GeneratedCodeInfo& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _has_bits_(from._has_bits_), _cached_size_(0), annotation_(from.annotation_) { _internal_metadata_.MergeFrom(from._internal_metadata_); // @@protoc_insertion_point(copy_constructor:google.protobuf.GeneratedCodeInfo) } void GeneratedCodeInfo::SharedCtor() { _cached_size_ = 0; } GeneratedCodeInfo::~GeneratedCodeInfo() { // @@protoc_insertion_point(destructor:google.protobuf.GeneratedCodeInfo) SharedDtor(); } void GeneratedCodeInfo::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void GeneratedCodeInfo::ArenaDtor(void* object) { GeneratedCodeInfo* _this = reinterpret_cast< GeneratedCodeInfo* >(object); (void)_this; } void GeneratedCodeInfo::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void GeneratedCodeInfo::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* GeneratedCodeInfo::descriptor() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const GeneratedCodeInfo& GeneratedCodeInfo::default_instance() { ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo(); return *internal_default_instance(); } GeneratedCodeInfo* GeneratedCodeInfo::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void GeneratedCodeInfo::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.GeneratedCodeInfo) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; annotation_.Clear(); _has_bits_.Clear(); _internal_metadata_.Clear(); } bool GeneratedCodeInfo::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.GeneratedCodeInfo) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_annotation())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.GeneratedCodeInfo) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.GeneratedCodeInfo) return false; #undef DO_ } void GeneratedCodeInfo::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.GeneratedCodeInfo) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1; for (unsigned int i = 0, n = static_cast(this->annotation_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 1, this->annotation(static_cast(i)), output); } if (_internal_metadata_.have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.GeneratedCodeInfo) } ::google::protobuf::uint8* GeneratedCodeInfo::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.GeneratedCodeInfo) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1; for (unsigned int i = 0, n = static_cast(this->annotation_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 1, this->annotation(static_cast(i)), deterministic, target); } if (_internal_metadata_.have_unknown_fields()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.GeneratedCodeInfo) return target; } size_t GeneratedCodeInfo::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.GeneratedCodeInfo) size_t total_size = 0; if (_internal_metadata_.have_unknown_fields()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( _internal_metadata_.unknown_fields()); } // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1; { unsigned int count = static_cast(this->annotation_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->annotation(static_cast(i))); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void GeneratedCodeInfo::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.GeneratedCodeInfo) GOOGLE_DCHECK_NE(&from, this); const GeneratedCodeInfo* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.GeneratedCodeInfo) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.GeneratedCodeInfo) MergeFrom(*source); } } void GeneratedCodeInfo::MergeFrom(const GeneratedCodeInfo& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.GeneratedCodeInfo) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; annotation_.MergeFrom(from.annotation_); } void GeneratedCodeInfo::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.GeneratedCodeInfo) if (&from == this) return; Clear(); MergeFrom(from); } void GeneratedCodeInfo::CopyFrom(const GeneratedCodeInfo& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.GeneratedCodeInfo) if (&from == this) return; Clear(); MergeFrom(from); } bool GeneratedCodeInfo::IsInitialized() const { return true; } void GeneratedCodeInfo::Swap(GeneratedCodeInfo* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { GeneratedCodeInfo* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void GeneratedCodeInfo::UnsafeArenaSwap(GeneratedCodeInfo* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void GeneratedCodeInfo::InternalSwap(GeneratedCodeInfo* other) { using std::swap; annotation_.InternalSwap(&other->annotation_); swap(_has_bits_[0], other->_has_bits_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata GeneratedCodeInfo::GetMetadata() const { protobuf_google_2fprotobuf_2fdescriptor_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::file_level_metadata[kIndexInFileMessages]; } // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/descriptor.pb.h000066400000000000000000016633061334102242000302370ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/descriptor.proto #ifndef PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED #define PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED #include #include #if GOOGLE_PROTOBUF_VERSION < 3005000 #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 3005001 < GOOGLE_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 #include #include #include #include #include #include #include #include // IWYU pragma: export #include // IWYU pragma: export #include #include // @@protoc_insertion_point(includes) namespace protobuf_google_2fprotobuf_2fdescriptor_2eproto { // Internal implementation detail -- do not use these members. struct LIBPROTOBUF_EXPORT TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; static const ::google::protobuf::internal::ParseTable schema[27]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; }; void LIBPROTOBUF_EXPORT AddDescriptors(); void LIBPROTOBUF_EXPORT InitDefaultsFileDescriptorSetImpl(); void LIBPROTOBUF_EXPORT InitDefaultsFileDescriptorSet(); void LIBPROTOBUF_EXPORT InitDefaultsFileDescriptorProtoImpl(); void LIBPROTOBUF_EXPORT InitDefaultsFileDescriptorProto(); void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProto_ExtensionRangeImpl(); void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProto_ExtensionRange(); void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProto_ReservedRangeImpl(); void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProto_ReservedRange(); void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProtoImpl(); void LIBPROTOBUF_EXPORT InitDefaultsDescriptorProto(); void LIBPROTOBUF_EXPORT InitDefaultsExtensionRangeOptionsImpl(); void LIBPROTOBUF_EXPORT InitDefaultsExtensionRangeOptions(); void LIBPROTOBUF_EXPORT InitDefaultsFieldDescriptorProtoImpl(); void LIBPROTOBUF_EXPORT InitDefaultsFieldDescriptorProto(); void LIBPROTOBUF_EXPORT InitDefaultsOneofDescriptorProtoImpl(); void LIBPROTOBUF_EXPORT InitDefaultsOneofDescriptorProto(); void LIBPROTOBUF_EXPORT InitDefaultsEnumDescriptorProto_EnumReservedRangeImpl(); void LIBPROTOBUF_EXPORT InitDefaultsEnumDescriptorProto_EnumReservedRange(); void LIBPROTOBUF_EXPORT InitDefaultsEnumDescriptorProtoImpl(); void LIBPROTOBUF_EXPORT InitDefaultsEnumDescriptorProto(); void LIBPROTOBUF_EXPORT InitDefaultsEnumValueDescriptorProtoImpl(); void LIBPROTOBUF_EXPORT InitDefaultsEnumValueDescriptorProto(); void LIBPROTOBUF_EXPORT InitDefaultsServiceDescriptorProtoImpl(); void LIBPROTOBUF_EXPORT InitDefaultsServiceDescriptorProto(); void LIBPROTOBUF_EXPORT InitDefaultsMethodDescriptorProtoImpl(); void LIBPROTOBUF_EXPORT InitDefaultsMethodDescriptorProto(); void LIBPROTOBUF_EXPORT InitDefaultsFileOptionsImpl(); void LIBPROTOBUF_EXPORT InitDefaultsFileOptions(); void LIBPROTOBUF_EXPORT InitDefaultsMessageOptionsImpl(); void LIBPROTOBUF_EXPORT InitDefaultsMessageOptions(); void LIBPROTOBUF_EXPORT InitDefaultsFieldOptionsImpl(); void LIBPROTOBUF_EXPORT InitDefaultsFieldOptions(); void LIBPROTOBUF_EXPORT InitDefaultsOneofOptionsImpl(); void LIBPROTOBUF_EXPORT InitDefaultsOneofOptions(); void LIBPROTOBUF_EXPORT InitDefaultsEnumOptionsImpl(); void LIBPROTOBUF_EXPORT InitDefaultsEnumOptions(); void LIBPROTOBUF_EXPORT InitDefaultsEnumValueOptionsImpl(); void LIBPROTOBUF_EXPORT InitDefaultsEnumValueOptions(); void LIBPROTOBUF_EXPORT InitDefaultsServiceOptionsImpl(); void LIBPROTOBUF_EXPORT InitDefaultsServiceOptions(); void LIBPROTOBUF_EXPORT InitDefaultsMethodOptionsImpl(); void LIBPROTOBUF_EXPORT InitDefaultsMethodOptions(); void LIBPROTOBUF_EXPORT InitDefaultsUninterpretedOption_NamePartImpl(); void LIBPROTOBUF_EXPORT InitDefaultsUninterpretedOption_NamePart(); void LIBPROTOBUF_EXPORT InitDefaultsUninterpretedOptionImpl(); void LIBPROTOBUF_EXPORT InitDefaultsUninterpretedOption(); void LIBPROTOBUF_EXPORT InitDefaultsSourceCodeInfo_LocationImpl(); void LIBPROTOBUF_EXPORT InitDefaultsSourceCodeInfo_Location(); void LIBPROTOBUF_EXPORT InitDefaultsSourceCodeInfoImpl(); void LIBPROTOBUF_EXPORT InitDefaultsSourceCodeInfo(); void LIBPROTOBUF_EXPORT InitDefaultsGeneratedCodeInfo_AnnotationImpl(); void LIBPROTOBUF_EXPORT InitDefaultsGeneratedCodeInfo_Annotation(); void LIBPROTOBUF_EXPORT InitDefaultsGeneratedCodeInfoImpl(); void LIBPROTOBUF_EXPORT InitDefaultsGeneratedCodeInfo(); inline void LIBPROTOBUF_EXPORT InitDefaults() { InitDefaultsFileDescriptorSet(); InitDefaultsFileDescriptorProto(); InitDefaultsDescriptorProto_ExtensionRange(); InitDefaultsDescriptorProto_ReservedRange(); InitDefaultsDescriptorProto(); InitDefaultsExtensionRangeOptions(); InitDefaultsFieldDescriptorProto(); InitDefaultsOneofDescriptorProto(); InitDefaultsEnumDescriptorProto_EnumReservedRange(); InitDefaultsEnumDescriptorProto(); InitDefaultsEnumValueDescriptorProto(); InitDefaultsServiceDescriptorProto(); InitDefaultsMethodDescriptorProto(); InitDefaultsFileOptions(); InitDefaultsMessageOptions(); InitDefaultsFieldOptions(); InitDefaultsOneofOptions(); InitDefaultsEnumOptions(); InitDefaultsEnumValueOptions(); InitDefaultsServiceOptions(); InitDefaultsMethodOptions(); InitDefaultsUninterpretedOption_NamePart(); InitDefaultsUninterpretedOption(); InitDefaultsSourceCodeInfo_Location(); InitDefaultsSourceCodeInfo(); InitDefaultsGeneratedCodeInfo_Annotation(); InitDefaultsGeneratedCodeInfo(); } } // namespace protobuf_google_2fprotobuf_2fdescriptor_2eproto namespace google { namespace protobuf { class DescriptorProto; class DescriptorProtoDefaultTypeInternal; LIBPROTOBUF_EXPORT extern DescriptorProtoDefaultTypeInternal _DescriptorProto_default_instance_; class DescriptorProto_ExtensionRange; class DescriptorProto_ExtensionRangeDefaultTypeInternal; LIBPROTOBUF_EXPORT extern DescriptorProto_ExtensionRangeDefaultTypeInternal _DescriptorProto_ExtensionRange_default_instance_; class DescriptorProto_ReservedRange; class DescriptorProto_ReservedRangeDefaultTypeInternal; LIBPROTOBUF_EXPORT extern DescriptorProto_ReservedRangeDefaultTypeInternal _DescriptorProto_ReservedRange_default_instance_; class EnumDescriptorProto; class EnumDescriptorProtoDefaultTypeInternal; LIBPROTOBUF_EXPORT extern EnumDescriptorProtoDefaultTypeInternal _EnumDescriptorProto_default_instance_; class EnumDescriptorProto_EnumReservedRange; class EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal; LIBPROTOBUF_EXPORT extern EnumDescriptorProto_EnumReservedRangeDefaultTypeInternal _EnumDescriptorProto_EnumReservedRange_default_instance_; class EnumOptions; class EnumOptionsDefaultTypeInternal; LIBPROTOBUF_EXPORT extern EnumOptionsDefaultTypeInternal _EnumOptions_default_instance_; class EnumValueDescriptorProto; class EnumValueDescriptorProtoDefaultTypeInternal; LIBPROTOBUF_EXPORT extern EnumValueDescriptorProtoDefaultTypeInternal _EnumValueDescriptorProto_default_instance_; class EnumValueOptions; class EnumValueOptionsDefaultTypeInternal; LIBPROTOBUF_EXPORT extern EnumValueOptionsDefaultTypeInternal _EnumValueOptions_default_instance_; class ExtensionRangeOptions; class ExtensionRangeOptionsDefaultTypeInternal; LIBPROTOBUF_EXPORT extern ExtensionRangeOptionsDefaultTypeInternal _ExtensionRangeOptions_default_instance_; class FieldDescriptorProto; class FieldDescriptorProtoDefaultTypeInternal; LIBPROTOBUF_EXPORT extern FieldDescriptorProtoDefaultTypeInternal _FieldDescriptorProto_default_instance_; class FieldOptions; class FieldOptionsDefaultTypeInternal; LIBPROTOBUF_EXPORT extern FieldOptionsDefaultTypeInternal _FieldOptions_default_instance_; class FileDescriptorProto; class FileDescriptorProtoDefaultTypeInternal; LIBPROTOBUF_EXPORT extern FileDescriptorProtoDefaultTypeInternal _FileDescriptorProto_default_instance_; class FileDescriptorSet; class FileDescriptorSetDefaultTypeInternal; LIBPROTOBUF_EXPORT extern FileDescriptorSetDefaultTypeInternal _FileDescriptorSet_default_instance_; class FileOptions; class FileOptionsDefaultTypeInternal; LIBPROTOBUF_EXPORT extern FileOptionsDefaultTypeInternal _FileOptions_default_instance_; class GeneratedCodeInfo; class GeneratedCodeInfoDefaultTypeInternal; LIBPROTOBUF_EXPORT extern GeneratedCodeInfoDefaultTypeInternal _GeneratedCodeInfo_default_instance_; class GeneratedCodeInfo_Annotation; class GeneratedCodeInfo_AnnotationDefaultTypeInternal; LIBPROTOBUF_EXPORT extern GeneratedCodeInfo_AnnotationDefaultTypeInternal _GeneratedCodeInfo_Annotation_default_instance_; class MessageOptions; class MessageOptionsDefaultTypeInternal; LIBPROTOBUF_EXPORT extern MessageOptionsDefaultTypeInternal _MessageOptions_default_instance_; class MethodDescriptorProto; class MethodDescriptorProtoDefaultTypeInternal; LIBPROTOBUF_EXPORT extern MethodDescriptorProtoDefaultTypeInternal _MethodDescriptorProto_default_instance_; class MethodOptions; class MethodOptionsDefaultTypeInternal; LIBPROTOBUF_EXPORT extern MethodOptionsDefaultTypeInternal _MethodOptions_default_instance_; class OneofDescriptorProto; class OneofDescriptorProtoDefaultTypeInternal; LIBPROTOBUF_EXPORT extern OneofDescriptorProtoDefaultTypeInternal _OneofDescriptorProto_default_instance_; class OneofOptions; class OneofOptionsDefaultTypeInternal; LIBPROTOBUF_EXPORT extern OneofOptionsDefaultTypeInternal _OneofOptions_default_instance_; class ServiceDescriptorProto; class ServiceDescriptorProtoDefaultTypeInternal; LIBPROTOBUF_EXPORT extern ServiceDescriptorProtoDefaultTypeInternal _ServiceDescriptorProto_default_instance_; class ServiceOptions; class ServiceOptionsDefaultTypeInternal; LIBPROTOBUF_EXPORT extern ServiceOptionsDefaultTypeInternal _ServiceOptions_default_instance_; class SourceCodeInfo; class SourceCodeInfoDefaultTypeInternal; LIBPROTOBUF_EXPORT extern SourceCodeInfoDefaultTypeInternal _SourceCodeInfo_default_instance_; class SourceCodeInfo_Location; class SourceCodeInfo_LocationDefaultTypeInternal; LIBPROTOBUF_EXPORT extern SourceCodeInfo_LocationDefaultTypeInternal _SourceCodeInfo_Location_default_instance_; class UninterpretedOption; class UninterpretedOptionDefaultTypeInternal; LIBPROTOBUF_EXPORT extern UninterpretedOptionDefaultTypeInternal _UninterpretedOption_default_instance_; class UninterpretedOption_NamePart; class UninterpretedOption_NamePartDefaultTypeInternal; LIBPROTOBUF_EXPORT extern UninterpretedOption_NamePartDefaultTypeInternal _UninterpretedOption_NamePart_default_instance_; } // namespace protobuf } // namespace google namespace google { namespace protobuf { enum FieldDescriptorProto_Type { FieldDescriptorProto_Type_TYPE_DOUBLE = 1, FieldDescriptorProto_Type_TYPE_FLOAT = 2, FieldDescriptorProto_Type_TYPE_INT64 = 3, FieldDescriptorProto_Type_TYPE_UINT64 = 4, FieldDescriptorProto_Type_TYPE_INT32 = 5, FieldDescriptorProto_Type_TYPE_FIXED64 = 6, FieldDescriptorProto_Type_TYPE_FIXED32 = 7, FieldDescriptorProto_Type_TYPE_BOOL = 8, FieldDescriptorProto_Type_TYPE_STRING = 9, FieldDescriptorProto_Type_TYPE_GROUP = 10, FieldDescriptorProto_Type_TYPE_MESSAGE = 11, FieldDescriptorProto_Type_TYPE_BYTES = 12, FieldDescriptorProto_Type_TYPE_UINT32 = 13, FieldDescriptorProto_Type_TYPE_ENUM = 14, FieldDescriptorProto_Type_TYPE_SFIXED32 = 15, FieldDescriptorProto_Type_TYPE_SFIXED64 = 16, FieldDescriptorProto_Type_TYPE_SINT32 = 17, FieldDescriptorProto_Type_TYPE_SINT64 = 18 }; LIBPROTOBUF_EXPORT bool FieldDescriptorProto_Type_IsValid(int value); const FieldDescriptorProto_Type FieldDescriptorProto_Type_Type_MIN = FieldDescriptorProto_Type_TYPE_DOUBLE; const FieldDescriptorProto_Type FieldDescriptorProto_Type_Type_MAX = FieldDescriptorProto_Type_TYPE_SINT64; const int FieldDescriptorProto_Type_Type_ARRAYSIZE = FieldDescriptorProto_Type_Type_MAX + 1; LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor(); inline const ::std::string& FieldDescriptorProto_Type_Name(FieldDescriptorProto_Type value) { return ::google::protobuf::internal::NameOfEnum( FieldDescriptorProto_Type_descriptor(), value); } inline bool FieldDescriptorProto_Type_Parse( const ::std::string& name, FieldDescriptorProto_Type* value) { return ::google::protobuf::internal::ParseNamedEnum( FieldDescriptorProto_Type_descriptor(), name, value); } enum FieldDescriptorProto_Label { FieldDescriptorProto_Label_LABEL_OPTIONAL = 1, FieldDescriptorProto_Label_LABEL_REQUIRED = 2, FieldDescriptorProto_Label_LABEL_REPEATED = 3 }; LIBPROTOBUF_EXPORT bool FieldDescriptorProto_Label_IsValid(int value); const FieldDescriptorProto_Label FieldDescriptorProto_Label_Label_MIN = FieldDescriptorProto_Label_LABEL_OPTIONAL; const FieldDescriptorProto_Label FieldDescriptorProto_Label_Label_MAX = FieldDescriptorProto_Label_LABEL_REPEATED; const int FieldDescriptorProto_Label_Label_ARRAYSIZE = FieldDescriptorProto_Label_Label_MAX + 1; LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor(); inline const ::std::string& FieldDescriptorProto_Label_Name(FieldDescriptorProto_Label value) { return ::google::protobuf::internal::NameOfEnum( FieldDescriptorProto_Label_descriptor(), value); } inline bool FieldDescriptorProto_Label_Parse( const ::std::string& name, FieldDescriptorProto_Label* value) { return ::google::protobuf::internal::ParseNamedEnum( FieldDescriptorProto_Label_descriptor(), name, value); } enum FileOptions_OptimizeMode { FileOptions_OptimizeMode_SPEED = 1, FileOptions_OptimizeMode_CODE_SIZE = 2, FileOptions_OptimizeMode_LITE_RUNTIME = 3 }; LIBPROTOBUF_EXPORT bool FileOptions_OptimizeMode_IsValid(int value); const FileOptions_OptimizeMode FileOptions_OptimizeMode_OptimizeMode_MIN = FileOptions_OptimizeMode_SPEED; const FileOptions_OptimizeMode FileOptions_OptimizeMode_OptimizeMode_MAX = FileOptions_OptimizeMode_LITE_RUNTIME; const int FileOptions_OptimizeMode_OptimizeMode_ARRAYSIZE = FileOptions_OptimizeMode_OptimizeMode_MAX + 1; LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor(); inline const ::std::string& FileOptions_OptimizeMode_Name(FileOptions_OptimizeMode value) { return ::google::protobuf::internal::NameOfEnum( FileOptions_OptimizeMode_descriptor(), value); } inline bool FileOptions_OptimizeMode_Parse( const ::std::string& name, FileOptions_OptimizeMode* value) { return ::google::protobuf::internal::ParseNamedEnum( FileOptions_OptimizeMode_descriptor(), name, value); } enum FieldOptions_CType { FieldOptions_CType_STRING = 0, FieldOptions_CType_CORD = 1, FieldOptions_CType_STRING_PIECE = 2 }; LIBPROTOBUF_EXPORT bool FieldOptions_CType_IsValid(int value); const FieldOptions_CType FieldOptions_CType_CType_MIN = FieldOptions_CType_STRING; const FieldOptions_CType FieldOptions_CType_CType_MAX = FieldOptions_CType_STRING_PIECE; const int FieldOptions_CType_CType_ARRAYSIZE = FieldOptions_CType_CType_MAX + 1; LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor(); inline const ::std::string& FieldOptions_CType_Name(FieldOptions_CType value) { return ::google::protobuf::internal::NameOfEnum( FieldOptions_CType_descriptor(), value); } inline bool FieldOptions_CType_Parse( const ::std::string& name, FieldOptions_CType* value) { return ::google::protobuf::internal::ParseNamedEnum( FieldOptions_CType_descriptor(), name, value); } enum FieldOptions_JSType { FieldOptions_JSType_JS_NORMAL = 0, FieldOptions_JSType_JS_STRING = 1, FieldOptions_JSType_JS_NUMBER = 2 }; LIBPROTOBUF_EXPORT bool FieldOptions_JSType_IsValid(int value); const FieldOptions_JSType FieldOptions_JSType_JSType_MIN = FieldOptions_JSType_JS_NORMAL; const FieldOptions_JSType FieldOptions_JSType_JSType_MAX = FieldOptions_JSType_JS_NUMBER; const int FieldOptions_JSType_JSType_ARRAYSIZE = FieldOptions_JSType_JSType_MAX + 1; LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldOptions_JSType_descriptor(); inline const ::std::string& FieldOptions_JSType_Name(FieldOptions_JSType value) { return ::google::protobuf::internal::NameOfEnum( FieldOptions_JSType_descriptor(), value); } inline bool FieldOptions_JSType_Parse( const ::std::string& name, FieldOptions_JSType* value) { return ::google::protobuf::internal::ParseNamedEnum( FieldOptions_JSType_descriptor(), name, value); } enum MethodOptions_IdempotencyLevel { MethodOptions_IdempotencyLevel_IDEMPOTENCY_UNKNOWN = 0, MethodOptions_IdempotencyLevel_NO_SIDE_EFFECTS = 1, MethodOptions_IdempotencyLevel_IDEMPOTENT = 2 }; LIBPROTOBUF_EXPORT bool MethodOptions_IdempotencyLevel_IsValid(int value); const MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel_IdempotencyLevel_MIN = MethodOptions_IdempotencyLevel_IDEMPOTENCY_UNKNOWN; const MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel_IdempotencyLevel_MAX = MethodOptions_IdempotencyLevel_IDEMPOTENT; const int MethodOptions_IdempotencyLevel_IdempotencyLevel_ARRAYSIZE = MethodOptions_IdempotencyLevel_IdempotencyLevel_MAX + 1; LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* MethodOptions_IdempotencyLevel_descriptor(); inline const ::std::string& MethodOptions_IdempotencyLevel_Name(MethodOptions_IdempotencyLevel value) { return ::google::protobuf::internal::NameOfEnum( MethodOptions_IdempotencyLevel_descriptor(), value); } inline bool MethodOptions_IdempotencyLevel_Parse( const ::std::string& name, MethodOptions_IdempotencyLevel* value) { return ::google::protobuf::internal::ParseNamedEnum( MethodOptions_IdempotencyLevel_descriptor(), name, value); } // =================================================================== class LIBPROTOBUF_EXPORT FileDescriptorSet : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FileDescriptorSet) */ { public: FileDescriptorSet(); virtual ~FileDescriptorSet(); FileDescriptorSet(const FileDescriptorSet& from); inline FileDescriptorSet& operator=(const FileDescriptorSet& from) { CopyFrom(from); return *this; } #if LANG_CXX11 FileDescriptorSet(FileDescriptorSet&& from) noexcept : FileDescriptorSet() { *this = ::std::move(from); } inline FileDescriptorSet& operator=(FileDescriptorSet&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const FileDescriptorSet& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const FileDescriptorSet* internal_default_instance() { return reinterpret_cast( &_FileDescriptorSet_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 0; void UnsafeArenaSwap(FileDescriptorSet* other); void Swap(FileDescriptorSet* other); friend void swap(FileDescriptorSet& a, FileDescriptorSet& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline FileDescriptorSet* New() const PROTOBUF_FINAL { return New(NULL); } FileDescriptorSet* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const FileDescriptorSet& from); void MergeFrom(const FileDescriptorSet& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(FileDescriptorSet* other); protected: explicit FileDescriptorSet(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated .google.protobuf.FileDescriptorProto file = 1; int file_size() const; void clear_file(); static const int kFileFieldNumber = 1; const ::google::protobuf::FileDescriptorProto& file(int index) const; ::google::protobuf::FileDescriptorProto* mutable_file(int index); ::google::protobuf::FileDescriptorProto* add_file(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >* mutable_file(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >& file() const; // @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorSet) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto > file_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorSetImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT FileDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FileDescriptorProto) */ { public: FileDescriptorProto(); virtual ~FileDescriptorProto(); FileDescriptorProto(const FileDescriptorProto& from); inline FileDescriptorProto& operator=(const FileDescriptorProto& from) { CopyFrom(from); return *this; } #if LANG_CXX11 FileDescriptorProto(FileDescriptorProto&& from) noexcept : FileDescriptorProto() { *this = ::std::move(from); } inline FileDescriptorProto& operator=(FileDescriptorProto&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const FileDescriptorProto& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const FileDescriptorProto* internal_default_instance() { return reinterpret_cast( &_FileDescriptorProto_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 1; void UnsafeArenaSwap(FileDescriptorProto* other); void Swap(FileDescriptorProto* other); friend void swap(FileDescriptorProto& a, FileDescriptorProto& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline FileDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); } FileDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const FileDescriptorProto& from); void MergeFrom(const FileDescriptorProto& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(FileDescriptorProto* other); protected: explicit FileDescriptorProto(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated string dependency = 3; int dependency_size() const; void clear_dependency(); static const int kDependencyFieldNumber = 3; const ::std::string& dependency(int index) const; ::std::string* mutable_dependency(int index); void set_dependency(int index, const ::std::string& value); #if LANG_CXX11 void set_dependency(int index, ::std::string&& value); #endif void set_dependency(int index, const char* value); void set_dependency(int index, const char* value, size_t size); ::std::string* add_dependency(); void add_dependency(const ::std::string& value); #if LANG_CXX11 void add_dependency(::std::string&& value); #endif void add_dependency(const char* value); void add_dependency(const char* value, size_t size); const ::google::protobuf::RepeatedPtrField< ::std::string>& dependency() const; ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_dependency(); // repeated .google.protobuf.DescriptorProto message_type = 4; int message_type_size() const; void clear_message_type(); static const int kMessageTypeFieldNumber = 4; const ::google::protobuf::DescriptorProto& message_type(int index) const; ::google::protobuf::DescriptorProto* mutable_message_type(int index); ::google::protobuf::DescriptorProto* add_message_type(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* mutable_message_type(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& message_type() const; // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; int enum_type_size() const; void clear_enum_type(); static const int kEnumTypeFieldNumber = 5; const ::google::protobuf::EnumDescriptorProto& enum_type(int index) const; ::google::protobuf::EnumDescriptorProto* mutable_enum_type(int index); ::google::protobuf::EnumDescriptorProto* add_enum_type(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* mutable_enum_type(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& enum_type() const; // repeated .google.protobuf.ServiceDescriptorProto service = 6; int service_size() const; void clear_service(); static const int kServiceFieldNumber = 6; const ::google::protobuf::ServiceDescriptorProto& service(int index) const; ::google::protobuf::ServiceDescriptorProto* mutable_service(int index); ::google::protobuf::ServiceDescriptorProto* add_service(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >* mutable_service(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >& service() const; // repeated .google.protobuf.FieldDescriptorProto extension = 7; int extension_size() const; void clear_extension(); static const int kExtensionFieldNumber = 7; const ::google::protobuf::FieldDescriptorProto& extension(int index) const; ::google::protobuf::FieldDescriptorProto* mutable_extension(int index); ::google::protobuf::FieldDescriptorProto* add_extension(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* mutable_extension(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& extension() const; // repeated int32 public_dependency = 10; int public_dependency_size() const; void clear_public_dependency(); static const int kPublicDependencyFieldNumber = 10; ::google::protobuf::int32 public_dependency(int index) const; void set_public_dependency(int index, ::google::protobuf::int32 value); void add_public_dependency(::google::protobuf::int32 value); const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& public_dependency() const; ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* mutable_public_dependency(); // repeated int32 weak_dependency = 11; int weak_dependency_size() const; void clear_weak_dependency(); static const int kWeakDependencyFieldNumber = 11; ::google::protobuf::int32 weak_dependency(int index) const; void set_weak_dependency(int index, ::google::protobuf::int32 value); void add_weak_dependency(::google::protobuf::int32 value); const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& weak_dependency() const; ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* mutable_weak_dependency(); // optional string name = 1; bool has_name() const; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_name(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_name( ::std::string* name); // optional string package = 2; bool has_package() const; void clear_package(); static const int kPackageFieldNumber = 2; const ::std::string& package() const; void set_package(const ::std::string& value); #if LANG_CXX11 void set_package(::std::string&& value); #endif void set_package(const char* value); void set_package(const char* value, size_t size); ::std::string* mutable_package(); ::std::string* release_package(); void set_allocated_package(::std::string* package); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_package(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_package( ::std::string* package); // optional string syntax = 12; bool has_syntax() const; void clear_syntax(); static const int kSyntaxFieldNumber = 12; const ::std::string& syntax() const; void set_syntax(const ::std::string& value); #if LANG_CXX11 void set_syntax(::std::string&& value); #endif void set_syntax(const char* value); void set_syntax(const char* value, size_t size); ::std::string* mutable_syntax(); ::std::string* release_syntax(); void set_allocated_syntax(::std::string* syntax); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_syntax(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_syntax( ::std::string* syntax); // optional .google.protobuf.FileOptions options = 8; bool has_options() const; void clear_options(); static const int kOptionsFieldNumber = 8; private: void _slow_mutable_options(); public: const ::google::protobuf::FileOptions& options() const; ::google::protobuf::FileOptions* release_options(); ::google::protobuf::FileOptions* mutable_options(); void set_allocated_options(::google::protobuf::FileOptions* options); void unsafe_arena_set_allocated_options( ::google::protobuf::FileOptions* options); ::google::protobuf::FileOptions* unsafe_arena_release_options(); // optional .google.protobuf.SourceCodeInfo source_code_info = 9; bool has_source_code_info() const; void clear_source_code_info(); static const int kSourceCodeInfoFieldNumber = 9; private: void _slow_mutable_source_code_info(); public: const ::google::protobuf::SourceCodeInfo& source_code_info() const; ::google::protobuf::SourceCodeInfo* release_source_code_info(); ::google::protobuf::SourceCodeInfo* mutable_source_code_info(); void set_allocated_source_code_info(::google::protobuf::SourceCodeInfo* source_code_info); void unsafe_arena_set_allocated_source_code_info( ::google::protobuf::SourceCodeInfo* source_code_info); ::google::protobuf::SourceCodeInfo* unsafe_arena_release_source_code_info(); // @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorProto) private: void set_has_name(); void clear_has_name(); void set_has_package(); void clear_has_package(); void set_has_options(); void clear_has_options(); void set_has_source_code_info(); void clear_has_source_code_info(); void set_has_syntax(); void clear_has_syntax(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::std::string> dependency_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto > message_type_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto > enum_type_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto > service_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > extension_; ::google::protobuf::RepeatedField< ::google::protobuf::int32 > public_dependency_; ::google::protobuf::RepeatedField< ::google::protobuf::int32 > weak_dependency_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::internal::ArenaStringPtr package_; ::google::protobuf::internal::ArenaStringPtr syntax_; ::google::protobuf::FileOptions* options_; ::google::protobuf::SourceCodeInfo* source_code_info_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileDescriptorProtoImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT DescriptorProto_ExtensionRange : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.DescriptorProto.ExtensionRange) */ { public: DescriptorProto_ExtensionRange(); virtual ~DescriptorProto_ExtensionRange(); DescriptorProto_ExtensionRange(const DescriptorProto_ExtensionRange& from); inline DescriptorProto_ExtensionRange& operator=(const DescriptorProto_ExtensionRange& from) { CopyFrom(from); return *this; } #if LANG_CXX11 DescriptorProto_ExtensionRange(DescriptorProto_ExtensionRange&& from) noexcept : DescriptorProto_ExtensionRange() { *this = ::std::move(from); } inline DescriptorProto_ExtensionRange& operator=(DescriptorProto_ExtensionRange&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const DescriptorProto_ExtensionRange& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const DescriptorProto_ExtensionRange* internal_default_instance() { return reinterpret_cast( &_DescriptorProto_ExtensionRange_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 2; void UnsafeArenaSwap(DescriptorProto_ExtensionRange* other); void Swap(DescriptorProto_ExtensionRange* other); friend void swap(DescriptorProto_ExtensionRange& a, DescriptorProto_ExtensionRange& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline DescriptorProto_ExtensionRange* New() const PROTOBUF_FINAL { return New(NULL); } DescriptorProto_ExtensionRange* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const DescriptorProto_ExtensionRange& from); void MergeFrom(const DescriptorProto_ExtensionRange& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(DescriptorProto_ExtensionRange* other); protected: explicit DescriptorProto_ExtensionRange(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // optional .google.protobuf.ExtensionRangeOptions options = 3; bool has_options() const; void clear_options(); static const int kOptionsFieldNumber = 3; private: void _slow_mutable_options(); public: const ::google::protobuf::ExtensionRangeOptions& options() const; ::google::protobuf::ExtensionRangeOptions* release_options(); ::google::protobuf::ExtensionRangeOptions* mutable_options(); void set_allocated_options(::google::protobuf::ExtensionRangeOptions* options); void unsafe_arena_set_allocated_options( ::google::protobuf::ExtensionRangeOptions* options); ::google::protobuf::ExtensionRangeOptions* unsafe_arena_release_options(); // optional int32 start = 1; bool has_start() const; void clear_start(); static const int kStartFieldNumber = 1; ::google::protobuf::int32 start() const; void set_start(::google::protobuf::int32 value); // optional int32 end = 2; bool has_end() const; void clear_end(); static const int kEndFieldNumber = 2; ::google::protobuf::int32 end() const; void set_end(::google::protobuf::int32 value); // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto.ExtensionRange) private: void set_has_start(); void clear_has_start(); void set_has_end(); void clear_has_end(); void set_has_options(); void clear_has_options(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::ExtensionRangeOptions* options_; ::google::protobuf::int32 start_; ::google::protobuf::int32 end_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ExtensionRangeImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT DescriptorProto_ReservedRange : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.DescriptorProto.ReservedRange) */ { public: DescriptorProto_ReservedRange(); virtual ~DescriptorProto_ReservedRange(); DescriptorProto_ReservedRange(const DescriptorProto_ReservedRange& from); inline DescriptorProto_ReservedRange& operator=(const DescriptorProto_ReservedRange& from) { CopyFrom(from); return *this; } #if LANG_CXX11 DescriptorProto_ReservedRange(DescriptorProto_ReservedRange&& from) noexcept : DescriptorProto_ReservedRange() { *this = ::std::move(from); } inline DescriptorProto_ReservedRange& operator=(DescriptorProto_ReservedRange&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const DescriptorProto_ReservedRange& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const DescriptorProto_ReservedRange* internal_default_instance() { return reinterpret_cast( &_DescriptorProto_ReservedRange_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 3; void UnsafeArenaSwap(DescriptorProto_ReservedRange* other); void Swap(DescriptorProto_ReservedRange* other); friend void swap(DescriptorProto_ReservedRange& a, DescriptorProto_ReservedRange& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline DescriptorProto_ReservedRange* New() const PROTOBUF_FINAL { return New(NULL); } DescriptorProto_ReservedRange* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const DescriptorProto_ReservedRange& from); void MergeFrom(const DescriptorProto_ReservedRange& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(DescriptorProto_ReservedRange* other); protected: explicit DescriptorProto_ReservedRange(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // optional int32 start = 1; bool has_start() const; void clear_start(); static const int kStartFieldNumber = 1; ::google::protobuf::int32 start() const; void set_start(::google::protobuf::int32 value); // optional int32 end = 2; bool has_end() const; void clear_end(); static const int kEndFieldNumber = 2; ::google::protobuf::int32 end() const; void set_end(::google::protobuf::int32 value); // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto.ReservedRange) private: void set_has_start(); void clear_has_start(); void set_has_end(); void clear_has_end(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::int32 start_; ::google::protobuf::int32 end_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProto_ReservedRangeImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT DescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.DescriptorProto) */ { public: DescriptorProto(); virtual ~DescriptorProto(); DescriptorProto(const DescriptorProto& from); inline DescriptorProto& operator=(const DescriptorProto& from) { CopyFrom(from); return *this; } #if LANG_CXX11 DescriptorProto(DescriptorProto&& from) noexcept : DescriptorProto() { *this = ::std::move(from); } inline DescriptorProto& operator=(DescriptorProto&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const DescriptorProto& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const DescriptorProto* internal_default_instance() { return reinterpret_cast( &_DescriptorProto_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 4; void UnsafeArenaSwap(DescriptorProto* other); void Swap(DescriptorProto* other); friend void swap(DescriptorProto& a, DescriptorProto& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline DescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); } DescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const DescriptorProto& from); void MergeFrom(const DescriptorProto& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(DescriptorProto* other); protected: explicit DescriptorProto(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- typedef DescriptorProto_ExtensionRange ExtensionRange; typedef DescriptorProto_ReservedRange ReservedRange; // accessors ------------------------------------------------------- // repeated .google.protobuf.FieldDescriptorProto field = 2; int field_size() const; void clear_field(); static const int kFieldFieldNumber = 2; const ::google::protobuf::FieldDescriptorProto& field(int index) const; ::google::protobuf::FieldDescriptorProto* mutable_field(int index); ::google::protobuf::FieldDescriptorProto* add_field(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* mutable_field(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& field() const; // repeated .google.protobuf.DescriptorProto nested_type = 3; int nested_type_size() const; void clear_nested_type(); static const int kNestedTypeFieldNumber = 3; const ::google::protobuf::DescriptorProto& nested_type(int index) const; ::google::protobuf::DescriptorProto* mutable_nested_type(int index); ::google::protobuf::DescriptorProto* add_nested_type(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* mutable_nested_type(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& nested_type() const; // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; int enum_type_size() const; void clear_enum_type(); static const int kEnumTypeFieldNumber = 4; const ::google::protobuf::EnumDescriptorProto& enum_type(int index) const; ::google::protobuf::EnumDescriptorProto* mutable_enum_type(int index); ::google::protobuf::EnumDescriptorProto* add_enum_type(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* mutable_enum_type(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& enum_type() const; // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; int extension_range_size() const; void clear_extension_range(); static const int kExtensionRangeFieldNumber = 5; const ::google::protobuf::DescriptorProto_ExtensionRange& extension_range(int index) const; ::google::protobuf::DescriptorProto_ExtensionRange* mutable_extension_range(int index); ::google::protobuf::DescriptorProto_ExtensionRange* add_extension_range(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >* mutable_extension_range(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >& extension_range() const; // repeated .google.protobuf.FieldDescriptorProto extension = 6; int extension_size() const; void clear_extension(); static const int kExtensionFieldNumber = 6; const ::google::protobuf::FieldDescriptorProto& extension(int index) const; ::google::protobuf::FieldDescriptorProto* mutable_extension(int index); ::google::protobuf::FieldDescriptorProto* add_extension(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* mutable_extension(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& extension() const; // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; int oneof_decl_size() const; void clear_oneof_decl(); static const int kOneofDeclFieldNumber = 8; const ::google::protobuf::OneofDescriptorProto& oneof_decl(int index) const; ::google::protobuf::OneofDescriptorProto* mutable_oneof_decl(int index); ::google::protobuf::OneofDescriptorProto* add_oneof_decl(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto >* mutable_oneof_decl(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto >& oneof_decl() const; // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9; int reserved_range_size() const; void clear_reserved_range(); static const int kReservedRangeFieldNumber = 9; const ::google::protobuf::DescriptorProto_ReservedRange& reserved_range(int index) const; ::google::protobuf::DescriptorProto_ReservedRange* mutable_reserved_range(int index); ::google::protobuf::DescriptorProto_ReservedRange* add_reserved_range(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ReservedRange >* mutable_reserved_range(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ReservedRange >& reserved_range() const; // repeated string reserved_name = 10; int reserved_name_size() const; void clear_reserved_name(); static const int kReservedNameFieldNumber = 10; const ::std::string& reserved_name(int index) const; ::std::string* mutable_reserved_name(int index); void set_reserved_name(int index, const ::std::string& value); #if LANG_CXX11 void set_reserved_name(int index, ::std::string&& value); #endif void set_reserved_name(int index, const char* value); void set_reserved_name(int index, const char* value, size_t size); ::std::string* add_reserved_name(); void add_reserved_name(const ::std::string& value); #if LANG_CXX11 void add_reserved_name(::std::string&& value); #endif void add_reserved_name(const char* value); void add_reserved_name(const char* value, size_t size); const ::google::protobuf::RepeatedPtrField< ::std::string>& reserved_name() const; ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_reserved_name(); // optional string name = 1; bool has_name() const; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_name(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_name( ::std::string* name); // optional .google.protobuf.MessageOptions options = 7; bool has_options() const; void clear_options(); static const int kOptionsFieldNumber = 7; private: void _slow_mutable_options(); public: const ::google::protobuf::MessageOptions& options() const; ::google::protobuf::MessageOptions* release_options(); ::google::protobuf::MessageOptions* mutable_options(); void set_allocated_options(::google::protobuf::MessageOptions* options); void unsafe_arena_set_allocated_options( ::google::protobuf::MessageOptions* options); ::google::protobuf::MessageOptions* unsafe_arena_release_options(); // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto) private: void set_has_name(); void clear_has_name(); void set_has_options(); void clear_has_options(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > field_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto > nested_type_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto > enum_type_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange > extension_range_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > extension_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto > oneof_decl_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ReservedRange > reserved_range_; ::google::protobuf::RepeatedPtrField< ::std::string> reserved_name_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::MessageOptions* options_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsDescriptorProtoImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT ExtensionRangeOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ExtensionRangeOptions) */ { public: ExtensionRangeOptions(); virtual ~ExtensionRangeOptions(); ExtensionRangeOptions(const ExtensionRangeOptions& from); inline ExtensionRangeOptions& operator=(const ExtensionRangeOptions& from) { CopyFrom(from); return *this; } #if LANG_CXX11 ExtensionRangeOptions(ExtensionRangeOptions&& from) noexcept : ExtensionRangeOptions() { *this = ::std::move(from); } inline ExtensionRangeOptions& operator=(ExtensionRangeOptions&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const ExtensionRangeOptions& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const ExtensionRangeOptions* internal_default_instance() { return reinterpret_cast( &_ExtensionRangeOptions_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 5; void UnsafeArenaSwap(ExtensionRangeOptions* other); void Swap(ExtensionRangeOptions* other); friend void swap(ExtensionRangeOptions& a, ExtensionRangeOptions& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline ExtensionRangeOptions* New() const PROTOBUF_FINAL { return New(NULL); } ExtensionRangeOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const ExtensionRangeOptions& from); void MergeFrom(const ExtensionRangeOptions& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(ExtensionRangeOptions* other); protected: explicit ExtensionRangeOptions(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; int uninterpreted_option_size() const; void clear_uninterpreted_option(); static const int kUninterpretedOptionFieldNumber = 999; const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* mutable_uninterpreted_option(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& uninterpreted_option() const; GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(ExtensionRangeOptions) // @@protoc_insertion_point(class_scope:google.protobuf.ExtensionRangeOptions) private: ::google::protobuf::internal::ExtensionSet _extensions_; ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsExtensionRangeOptionsImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT FieldDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FieldDescriptorProto) */ { public: FieldDescriptorProto(); virtual ~FieldDescriptorProto(); FieldDescriptorProto(const FieldDescriptorProto& from); inline FieldDescriptorProto& operator=(const FieldDescriptorProto& from) { CopyFrom(from); return *this; } #if LANG_CXX11 FieldDescriptorProto(FieldDescriptorProto&& from) noexcept : FieldDescriptorProto() { *this = ::std::move(from); } inline FieldDescriptorProto& operator=(FieldDescriptorProto&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const FieldDescriptorProto& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const FieldDescriptorProto* internal_default_instance() { return reinterpret_cast( &_FieldDescriptorProto_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 6; void UnsafeArenaSwap(FieldDescriptorProto* other); void Swap(FieldDescriptorProto* other); friend void swap(FieldDescriptorProto& a, FieldDescriptorProto& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline FieldDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); } FieldDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const FieldDescriptorProto& from); void MergeFrom(const FieldDescriptorProto& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(FieldDescriptorProto* other); protected: explicit FieldDescriptorProto(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- typedef FieldDescriptorProto_Type Type; static const Type TYPE_DOUBLE = FieldDescriptorProto_Type_TYPE_DOUBLE; static const Type TYPE_FLOAT = FieldDescriptorProto_Type_TYPE_FLOAT; static const Type TYPE_INT64 = FieldDescriptorProto_Type_TYPE_INT64; static const Type TYPE_UINT64 = FieldDescriptorProto_Type_TYPE_UINT64; static const Type TYPE_INT32 = FieldDescriptorProto_Type_TYPE_INT32; static const Type TYPE_FIXED64 = FieldDescriptorProto_Type_TYPE_FIXED64; static const Type TYPE_FIXED32 = FieldDescriptorProto_Type_TYPE_FIXED32; static const Type TYPE_BOOL = FieldDescriptorProto_Type_TYPE_BOOL; static const Type TYPE_STRING = FieldDescriptorProto_Type_TYPE_STRING; static const Type TYPE_GROUP = FieldDescriptorProto_Type_TYPE_GROUP; static const Type TYPE_MESSAGE = FieldDescriptorProto_Type_TYPE_MESSAGE; static const Type TYPE_BYTES = FieldDescriptorProto_Type_TYPE_BYTES; static const Type TYPE_UINT32 = FieldDescriptorProto_Type_TYPE_UINT32; static const Type TYPE_ENUM = FieldDescriptorProto_Type_TYPE_ENUM; static const Type TYPE_SFIXED32 = FieldDescriptorProto_Type_TYPE_SFIXED32; static const Type TYPE_SFIXED64 = FieldDescriptorProto_Type_TYPE_SFIXED64; static const Type TYPE_SINT32 = FieldDescriptorProto_Type_TYPE_SINT32; static const Type TYPE_SINT64 = FieldDescriptorProto_Type_TYPE_SINT64; static inline bool Type_IsValid(int value) { return FieldDescriptorProto_Type_IsValid(value); } static const Type Type_MIN = FieldDescriptorProto_Type_Type_MIN; static const Type Type_MAX = FieldDescriptorProto_Type_Type_MAX; static const int Type_ARRAYSIZE = FieldDescriptorProto_Type_Type_ARRAYSIZE; static inline const ::google::protobuf::EnumDescriptor* Type_descriptor() { return FieldDescriptorProto_Type_descriptor(); } static inline const ::std::string& Type_Name(Type value) { return FieldDescriptorProto_Type_Name(value); } static inline bool Type_Parse(const ::std::string& name, Type* value) { return FieldDescriptorProto_Type_Parse(name, value); } typedef FieldDescriptorProto_Label Label; static const Label LABEL_OPTIONAL = FieldDescriptorProto_Label_LABEL_OPTIONAL; static const Label LABEL_REQUIRED = FieldDescriptorProto_Label_LABEL_REQUIRED; static const Label LABEL_REPEATED = FieldDescriptorProto_Label_LABEL_REPEATED; static inline bool Label_IsValid(int value) { return FieldDescriptorProto_Label_IsValid(value); } static const Label Label_MIN = FieldDescriptorProto_Label_Label_MIN; static const Label Label_MAX = FieldDescriptorProto_Label_Label_MAX; static const int Label_ARRAYSIZE = FieldDescriptorProto_Label_Label_ARRAYSIZE; static inline const ::google::protobuf::EnumDescriptor* Label_descriptor() { return FieldDescriptorProto_Label_descriptor(); } static inline const ::std::string& Label_Name(Label value) { return FieldDescriptorProto_Label_Name(value); } static inline bool Label_Parse(const ::std::string& name, Label* value) { return FieldDescriptorProto_Label_Parse(name, value); } // accessors ------------------------------------------------------- // optional string name = 1; bool has_name() const; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_name(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_name( ::std::string* name); // optional string extendee = 2; bool has_extendee() const; void clear_extendee(); static const int kExtendeeFieldNumber = 2; const ::std::string& extendee() const; void set_extendee(const ::std::string& value); #if LANG_CXX11 void set_extendee(::std::string&& value); #endif void set_extendee(const char* value); void set_extendee(const char* value, size_t size); ::std::string* mutable_extendee(); ::std::string* release_extendee(); void set_allocated_extendee(::std::string* extendee); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_extendee(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_extendee( ::std::string* extendee); // optional string type_name = 6; bool has_type_name() const; void clear_type_name(); static const int kTypeNameFieldNumber = 6; const ::std::string& type_name() const; void set_type_name(const ::std::string& value); #if LANG_CXX11 void set_type_name(::std::string&& value); #endif void set_type_name(const char* value); void set_type_name(const char* value, size_t size); ::std::string* mutable_type_name(); ::std::string* release_type_name(); void set_allocated_type_name(::std::string* type_name); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_type_name(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_type_name( ::std::string* type_name); // optional string default_value = 7; bool has_default_value() const; void clear_default_value(); static const int kDefaultValueFieldNumber = 7; const ::std::string& default_value() const; void set_default_value(const ::std::string& value); #if LANG_CXX11 void set_default_value(::std::string&& value); #endif void set_default_value(const char* value); void set_default_value(const char* value, size_t size); ::std::string* mutable_default_value(); ::std::string* release_default_value(); void set_allocated_default_value(::std::string* default_value); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_default_value(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_default_value( ::std::string* default_value); // optional string json_name = 10; bool has_json_name() const; void clear_json_name(); static const int kJsonNameFieldNumber = 10; const ::std::string& json_name() const; void set_json_name(const ::std::string& value); #if LANG_CXX11 void set_json_name(::std::string&& value); #endif void set_json_name(const char* value); void set_json_name(const char* value, size_t size); ::std::string* mutable_json_name(); ::std::string* release_json_name(); void set_allocated_json_name(::std::string* json_name); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_json_name(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_json_name( ::std::string* json_name); // optional .google.protobuf.FieldOptions options = 8; bool has_options() const; void clear_options(); static const int kOptionsFieldNumber = 8; private: void _slow_mutable_options(); public: const ::google::protobuf::FieldOptions& options() const; ::google::protobuf::FieldOptions* release_options(); ::google::protobuf::FieldOptions* mutable_options(); void set_allocated_options(::google::protobuf::FieldOptions* options); void unsafe_arena_set_allocated_options( ::google::protobuf::FieldOptions* options); ::google::protobuf::FieldOptions* unsafe_arena_release_options(); // optional int32 number = 3; bool has_number() const; void clear_number(); static const int kNumberFieldNumber = 3; ::google::protobuf::int32 number() const; void set_number(::google::protobuf::int32 value); // optional int32 oneof_index = 9; bool has_oneof_index() const; void clear_oneof_index(); static const int kOneofIndexFieldNumber = 9; ::google::protobuf::int32 oneof_index() const; void set_oneof_index(::google::protobuf::int32 value); // optional .google.protobuf.FieldDescriptorProto.Label label = 4; bool has_label() const; void clear_label(); static const int kLabelFieldNumber = 4; ::google::protobuf::FieldDescriptorProto_Label label() const; void set_label(::google::protobuf::FieldDescriptorProto_Label value); // optional .google.protobuf.FieldDescriptorProto.Type type = 5; bool has_type() const; void clear_type(); static const int kTypeFieldNumber = 5; ::google::protobuf::FieldDescriptorProto_Type type() const; void set_type(::google::protobuf::FieldDescriptorProto_Type value); // @@protoc_insertion_point(class_scope:google.protobuf.FieldDescriptorProto) private: void set_has_name(); void clear_has_name(); void set_has_number(); void clear_has_number(); void set_has_label(); void clear_has_label(); void set_has_type(); void clear_has_type(); void set_has_type_name(); void clear_has_type_name(); void set_has_extendee(); void clear_has_extendee(); void set_has_default_value(); void clear_has_default_value(); void set_has_oneof_index(); void clear_has_oneof_index(); void set_has_json_name(); void clear_has_json_name(); void set_has_options(); void clear_has_options(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::internal::ArenaStringPtr extendee_; ::google::protobuf::internal::ArenaStringPtr type_name_; ::google::protobuf::internal::ArenaStringPtr default_value_; ::google::protobuf::internal::ArenaStringPtr json_name_; ::google::protobuf::FieldOptions* options_; ::google::protobuf::int32 number_; ::google::protobuf::int32 oneof_index_; int label_; int type_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldDescriptorProtoImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT OneofDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.OneofDescriptorProto) */ { public: OneofDescriptorProto(); virtual ~OneofDescriptorProto(); OneofDescriptorProto(const OneofDescriptorProto& from); inline OneofDescriptorProto& operator=(const OneofDescriptorProto& from) { CopyFrom(from); return *this; } #if LANG_CXX11 OneofDescriptorProto(OneofDescriptorProto&& from) noexcept : OneofDescriptorProto() { *this = ::std::move(from); } inline OneofDescriptorProto& operator=(OneofDescriptorProto&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const OneofDescriptorProto& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const OneofDescriptorProto* internal_default_instance() { return reinterpret_cast( &_OneofDescriptorProto_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 7; void UnsafeArenaSwap(OneofDescriptorProto* other); void Swap(OneofDescriptorProto* other); friend void swap(OneofDescriptorProto& a, OneofDescriptorProto& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline OneofDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); } OneofDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const OneofDescriptorProto& from); void MergeFrom(const OneofDescriptorProto& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(OneofDescriptorProto* other); protected: explicit OneofDescriptorProto(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // optional string name = 1; bool has_name() const; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_name(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_name( ::std::string* name); // optional .google.protobuf.OneofOptions options = 2; bool has_options() const; void clear_options(); static const int kOptionsFieldNumber = 2; private: void _slow_mutable_options(); public: const ::google::protobuf::OneofOptions& options() const; ::google::protobuf::OneofOptions* release_options(); ::google::protobuf::OneofOptions* mutable_options(); void set_allocated_options(::google::protobuf::OneofOptions* options); void unsafe_arena_set_allocated_options( ::google::protobuf::OneofOptions* options); ::google::protobuf::OneofOptions* unsafe_arena_release_options(); // @@protoc_insertion_point(class_scope:google.protobuf.OneofDescriptorProto) private: void set_has_name(); void clear_has_name(); void set_has_options(); void clear_has_options(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::OneofOptions* options_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofDescriptorProtoImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT EnumDescriptorProto_EnumReservedRange : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumDescriptorProto.EnumReservedRange) */ { public: EnumDescriptorProto_EnumReservedRange(); virtual ~EnumDescriptorProto_EnumReservedRange(); EnumDescriptorProto_EnumReservedRange(const EnumDescriptorProto_EnumReservedRange& from); inline EnumDescriptorProto_EnumReservedRange& operator=(const EnumDescriptorProto_EnumReservedRange& from) { CopyFrom(from); return *this; } #if LANG_CXX11 EnumDescriptorProto_EnumReservedRange(EnumDescriptorProto_EnumReservedRange&& from) noexcept : EnumDescriptorProto_EnumReservedRange() { *this = ::std::move(from); } inline EnumDescriptorProto_EnumReservedRange& operator=(EnumDescriptorProto_EnumReservedRange&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const EnumDescriptorProto_EnumReservedRange& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const EnumDescriptorProto_EnumReservedRange* internal_default_instance() { return reinterpret_cast( &_EnumDescriptorProto_EnumReservedRange_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 8; void UnsafeArenaSwap(EnumDescriptorProto_EnumReservedRange* other); void Swap(EnumDescriptorProto_EnumReservedRange* other); friend void swap(EnumDescriptorProto_EnumReservedRange& a, EnumDescriptorProto_EnumReservedRange& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline EnumDescriptorProto_EnumReservedRange* New() const PROTOBUF_FINAL { return New(NULL); } EnumDescriptorProto_EnumReservedRange* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const EnumDescriptorProto_EnumReservedRange& from); void MergeFrom(const EnumDescriptorProto_EnumReservedRange& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(EnumDescriptorProto_EnumReservedRange* other); protected: explicit EnumDescriptorProto_EnumReservedRange(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // optional int32 start = 1; bool has_start() const; void clear_start(); static const int kStartFieldNumber = 1; ::google::protobuf::int32 start() const; void set_start(::google::protobuf::int32 value); // optional int32 end = 2; bool has_end() const; void clear_end(); static const int kEndFieldNumber = 2; ::google::protobuf::int32 end() const; void set_end(::google::protobuf::int32 value); // @@protoc_insertion_point(class_scope:google.protobuf.EnumDescriptorProto.EnumReservedRange) private: void set_has_start(); void clear_has_start(); void set_has_end(); void clear_has_end(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::int32 start_; ::google::protobuf::int32 end_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProto_EnumReservedRangeImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT EnumDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumDescriptorProto) */ { public: EnumDescriptorProto(); virtual ~EnumDescriptorProto(); EnumDescriptorProto(const EnumDescriptorProto& from); inline EnumDescriptorProto& operator=(const EnumDescriptorProto& from) { CopyFrom(from); return *this; } #if LANG_CXX11 EnumDescriptorProto(EnumDescriptorProto&& from) noexcept : EnumDescriptorProto() { *this = ::std::move(from); } inline EnumDescriptorProto& operator=(EnumDescriptorProto&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const EnumDescriptorProto& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const EnumDescriptorProto* internal_default_instance() { return reinterpret_cast( &_EnumDescriptorProto_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 9; void UnsafeArenaSwap(EnumDescriptorProto* other); void Swap(EnumDescriptorProto* other); friend void swap(EnumDescriptorProto& a, EnumDescriptorProto& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline EnumDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); } EnumDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const EnumDescriptorProto& from); void MergeFrom(const EnumDescriptorProto& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(EnumDescriptorProto* other); protected: explicit EnumDescriptorProto(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- typedef EnumDescriptorProto_EnumReservedRange EnumReservedRange; // accessors ------------------------------------------------------- // repeated .google.protobuf.EnumValueDescriptorProto value = 2; int value_size() const; void clear_value(); static const int kValueFieldNumber = 2; const ::google::protobuf::EnumValueDescriptorProto& value(int index) const; ::google::protobuf::EnumValueDescriptorProto* mutable_value(int index); ::google::protobuf::EnumValueDescriptorProto* add_value(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >* mutable_value(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >& value() const; // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4; int reserved_range_size() const; void clear_reserved_range(); static const int kReservedRangeFieldNumber = 4; const ::google::protobuf::EnumDescriptorProto_EnumReservedRange& reserved_range(int index) const; ::google::protobuf::EnumDescriptorProto_EnumReservedRange* mutable_reserved_range(int index); ::google::protobuf::EnumDescriptorProto_EnumReservedRange* add_reserved_range(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto_EnumReservedRange >* mutable_reserved_range(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto_EnumReservedRange >& reserved_range() const; // repeated string reserved_name = 5; int reserved_name_size() const; void clear_reserved_name(); static const int kReservedNameFieldNumber = 5; const ::std::string& reserved_name(int index) const; ::std::string* mutable_reserved_name(int index); void set_reserved_name(int index, const ::std::string& value); #if LANG_CXX11 void set_reserved_name(int index, ::std::string&& value); #endif void set_reserved_name(int index, const char* value); void set_reserved_name(int index, const char* value, size_t size); ::std::string* add_reserved_name(); void add_reserved_name(const ::std::string& value); #if LANG_CXX11 void add_reserved_name(::std::string&& value); #endif void add_reserved_name(const char* value); void add_reserved_name(const char* value, size_t size); const ::google::protobuf::RepeatedPtrField< ::std::string>& reserved_name() const; ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_reserved_name(); // optional string name = 1; bool has_name() const; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_name(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_name( ::std::string* name); // optional .google.protobuf.EnumOptions options = 3; bool has_options() const; void clear_options(); static const int kOptionsFieldNumber = 3; private: void _slow_mutable_options(); public: const ::google::protobuf::EnumOptions& options() const; ::google::protobuf::EnumOptions* release_options(); ::google::protobuf::EnumOptions* mutable_options(); void set_allocated_options(::google::protobuf::EnumOptions* options); void unsafe_arena_set_allocated_options( ::google::protobuf::EnumOptions* options); ::google::protobuf::EnumOptions* unsafe_arena_release_options(); // @@protoc_insertion_point(class_scope:google.protobuf.EnumDescriptorProto) private: void set_has_name(); void clear_has_name(); void set_has_options(); void clear_has_options(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto > value_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto_EnumReservedRange > reserved_range_; ::google::protobuf::RepeatedPtrField< ::std::string> reserved_name_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::EnumOptions* options_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumDescriptorProtoImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT EnumValueDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumValueDescriptorProto) */ { public: EnumValueDescriptorProto(); virtual ~EnumValueDescriptorProto(); EnumValueDescriptorProto(const EnumValueDescriptorProto& from); inline EnumValueDescriptorProto& operator=(const EnumValueDescriptorProto& from) { CopyFrom(from); return *this; } #if LANG_CXX11 EnumValueDescriptorProto(EnumValueDescriptorProto&& from) noexcept : EnumValueDescriptorProto() { *this = ::std::move(from); } inline EnumValueDescriptorProto& operator=(EnumValueDescriptorProto&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const EnumValueDescriptorProto& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const EnumValueDescriptorProto* internal_default_instance() { return reinterpret_cast( &_EnumValueDescriptorProto_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 10; void UnsafeArenaSwap(EnumValueDescriptorProto* other); void Swap(EnumValueDescriptorProto* other); friend void swap(EnumValueDescriptorProto& a, EnumValueDescriptorProto& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline EnumValueDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); } EnumValueDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const EnumValueDescriptorProto& from); void MergeFrom(const EnumValueDescriptorProto& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(EnumValueDescriptorProto* other); protected: explicit EnumValueDescriptorProto(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // optional string name = 1; bool has_name() const; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_name(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_name( ::std::string* name); // optional .google.protobuf.EnumValueOptions options = 3; bool has_options() const; void clear_options(); static const int kOptionsFieldNumber = 3; private: void _slow_mutable_options(); public: const ::google::protobuf::EnumValueOptions& options() const; ::google::protobuf::EnumValueOptions* release_options(); ::google::protobuf::EnumValueOptions* mutable_options(); void set_allocated_options(::google::protobuf::EnumValueOptions* options); void unsafe_arena_set_allocated_options( ::google::protobuf::EnumValueOptions* options); ::google::protobuf::EnumValueOptions* unsafe_arena_release_options(); // optional int32 number = 2; bool has_number() const; void clear_number(); static const int kNumberFieldNumber = 2; ::google::protobuf::int32 number() const; void set_number(::google::protobuf::int32 value); // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueDescriptorProto) private: void set_has_name(); void clear_has_name(); void set_has_number(); void clear_has_number(); void set_has_options(); void clear_has_options(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::EnumValueOptions* options_; ::google::protobuf::int32 number_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueDescriptorProtoImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT ServiceDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ServiceDescriptorProto) */ { public: ServiceDescriptorProto(); virtual ~ServiceDescriptorProto(); ServiceDescriptorProto(const ServiceDescriptorProto& from); inline ServiceDescriptorProto& operator=(const ServiceDescriptorProto& from) { CopyFrom(from); return *this; } #if LANG_CXX11 ServiceDescriptorProto(ServiceDescriptorProto&& from) noexcept : ServiceDescriptorProto() { *this = ::std::move(from); } inline ServiceDescriptorProto& operator=(ServiceDescriptorProto&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const ServiceDescriptorProto& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const ServiceDescriptorProto* internal_default_instance() { return reinterpret_cast( &_ServiceDescriptorProto_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 11; void UnsafeArenaSwap(ServiceDescriptorProto* other); void Swap(ServiceDescriptorProto* other); friend void swap(ServiceDescriptorProto& a, ServiceDescriptorProto& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline ServiceDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); } ServiceDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const ServiceDescriptorProto& from); void MergeFrom(const ServiceDescriptorProto& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(ServiceDescriptorProto* other); protected: explicit ServiceDescriptorProto(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated .google.protobuf.MethodDescriptorProto method = 2; int method_size() const; void clear_method(); static const int kMethodFieldNumber = 2; const ::google::protobuf::MethodDescriptorProto& method(int index) const; ::google::protobuf::MethodDescriptorProto* mutable_method(int index); ::google::protobuf::MethodDescriptorProto* add_method(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >* mutable_method(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >& method() const; // optional string name = 1; bool has_name() const; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_name(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_name( ::std::string* name); // optional .google.protobuf.ServiceOptions options = 3; bool has_options() const; void clear_options(); static const int kOptionsFieldNumber = 3; private: void _slow_mutable_options(); public: const ::google::protobuf::ServiceOptions& options() const; ::google::protobuf::ServiceOptions* release_options(); ::google::protobuf::ServiceOptions* mutable_options(); void set_allocated_options(::google::protobuf::ServiceOptions* options); void unsafe_arena_set_allocated_options( ::google::protobuf::ServiceOptions* options); ::google::protobuf::ServiceOptions* unsafe_arena_release_options(); // @@protoc_insertion_point(class_scope:google.protobuf.ServiceDescriptorProto) private: void set_has_name(); void clear_has_name(); void set_has_options(); void clear_has_options(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto > method_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::ServiceOptions* options_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceDescriptorProtoImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT MethodDescriptorProto : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.MethodDescriptorProto) */ { public: MethodDescriptorProto(); virtual ~MethodDescriptorProto(); MethodDescriptorProto(const MethodDescriptorProto& from); inline MethodDescriptorProto& operator=(const MethodDescriptorProto& from) { CopyFrom(from); return *this; } #if LANG_CXX11 MethodDescriptorProto(MethodDescriptorProto&& from) noexcept : MethodDescriptorProto() { *this = ::std::move(from); } inline MethodDescriptorProto& operator=(MethodDescriptorProto&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const MethodDescriptorProto& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const MethodDescriptorProto* internal_default_instance() { return reinterpret_cast( &_MethodDescriptorProto_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 12; void UnsafeArenaSwap(MethodDescriptorProto* other); void Swap(MethodDescriptorProto* other); friend void swap(MethodDescriptorProto& a, MethodDescriptorProto& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline MethodDescriptorProto* New() const PROTOBUF_FINAL { return New(NULL); } MethodDescriptorProto* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const MethodDescriptorProto& from); void MergeFrom(const MethodDescriptorProto& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(MethodDescriptorProto* other); protected: explicit MethodDescriptorProto(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // optional string name = 1; bool has_name() const; void clear_name(); static const int kNameFieldNumber = 1; const ::std::string& name() const; void set_name(const ::std::string& value); #if LANG_CXX11 void set_name(::std::string&& value); #endif void set_name(const char* value); void set_name(const char* value, size_t size); ::std::string* mutable_name(); ::std::string* release_name(); void set_allocated_name(::std::string* name); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_name(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_name( ::std::string* name); // optional string input_type = 2; bool has_input_type() const; void clear_input_type(); static const int kInputTypeFieldNumber = 2; const ::std::string& input_type() const; void set_input_type(const ::std::string& value); #if LANG_CXX11 void set_input_type(::std::string&& value); #endif void set_input_type(const char* value); void set_input_type(const char* value, size_t size); ::std::string* mutable_input_type(); ::std::string* release_input_type(); void set_allocated_input_type(::std::string* input_type); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_input_type(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_input_type( ::std::string* input_type); // optional string output_type = 3; bool has_output_type() const; void clear_output_type(); static const int kOutputTypeFieldNumber = 3; const ::std::string& output_type() const; void set_output_type(const ::std::string& value); #if LANG_CXX11 void set_output_type(::std::string&& value); #endif void set_output_type(const char* value); void set_output_type(const char* value, size_t size); ::std::string* mutable_output_type(); ::std::string* release_output_type(); void set_allocated_output_type(::std::string* output_type); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_output_type(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_output_type( ::std::string* output_type); // optional .google.protobuf.MethodOptions options = 4; bool has_options() const; void clear_options(); static const int kOptionsFieldNumber = 4; private: void _slow_mutable_options(); public: const ::google::protobuf::MethodOptions& options() const; ::google::protobuf::MethodOptions* release_options(); ::google::protobuf::MethodOptions* mutable_options(); void set_allocated_options(::google::protobuf::MethodOptions* options); void unsafe_arena_set_allocated_options( ::google::protobuf::MethodOptions* options); ::google::protobuf::MethodOptions* unsafe_arena_release_options(); // optional bool client_streaming = 5 [default = false]; bool has_client_streaming() const; void clear_client_streaming(); static const int kClientStreamingFieldNumber = 5; bool client_streaming() const; void set_client_streaming(bool value); // optional bool server_streaming = 6 [default = false]; bool has_server_streaming() const; void clear_server_streaming(); static const int kServerStreamingFieldNumber = 6; bool server_streaming() const; void set_server_streaming(bool value); // @@protoc_insertion_point(class_scope:google.protobuf.MethodDescriptorProto) private: void set_has_name(); void clear_has_name(); void set_has_input_type(); void clear_has_input_type(); void set_has_output_type(); void clear_has_output_type(); void set_has_options(); void clear_has_options(); void set_has_client_streaming(); void clear_has_client_streaming(); void set_has_server_streaming(); void clear_has_server_streaming(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::internal::ArenaStringPtr name_; ::google::protobuf::internal::ArenaStringPtr input_type_; ::google::protobuf::internal::ArenaStringPtr output_type_; ::google::protobuf::MethodOptions* options_; bool client_streaming_; bool server_streaming_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodDescriptorProtoImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT FileOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FileOptions) */ { public: FileOptions(); virtual ~FileOptions(); FileOptions(const FileOptions& from); inline FileOptions& operator=(const FileOptions& from) { CopyFrom(from); return *this; } #if LANG_CXX11 FileOptions(FileOptions&& from) noexcept : FileOptions() { *this = ::std::move(from); } inline FileOptions& operator=(FileOptions&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const FileOptions& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const FileOptions* internal_default_instance() { return reinterpret_cast( &_FileOptions_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 13; void UnsafeArenaSwap(FileOptions* other); void Swap(FileOptions* other); friend void swap(FileOptions& a, FileOptions& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline FileOptions* New() const PROTOBUF_FINAL { return New(NULL); } FileOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const FileOptions& from); void MergeFrom(const FileOptions& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(FileOptions* other); protected: explicit FileOptions(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- typedef FileOptions_OptimizeMode OptimizeMode; static const OptimizeMode SPEED = FileOptions_OptimizeMode_SPEED; static const OptimizeMode CODE_SIZE = FileOptions_OptimizeMode_CODE_SIZE; static const OptimizeMode LITE_RUNTIME = FileOptions_OptimizeMode_LITE_RUNTIME; static inline bool OptimizeMode_IsValid(int value) { return FileOptions_OptimizeMode_IsValid(value); } static const OptimizeMode OptimizeMode_MIN = FileOptions_OptimizeMode_OptimizeMode_MIN; static const OptimizeMode OptimizeMode_MAX = FileOptions_OptimizeMode_OptimizeMode_MAX; static const int OptimizeMode_ARRAYSIZE = FileOptions_OptimizeMode_OptimizeMode_ARRAYSIZE; static inline const ::google::protobuf::EnumDescriptor* OptimizeMode_descriptor() { return FileOptions_OptimizeMode_descriptor(); } static inline const ::std::string& OptimizeMode_Name(OptimizeMode value) { return FileOptions_OptimizeMode_Name(value); } static inline bool OptimizeMode_Parse(const ::std::string& name, OptimizeMode* value) { return FileOptions_OptimizeMode_Parse(name, value); } // accessors ------------------------------------------------------- // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; int uninterpreted_option_size() const; void clear_uninterpreted_option(); static const int kUninterpretedOptionFieldNumber = 999; const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* mutable_uninterpreted_option(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& uninterpreted_option() const; // optional string java_package = 1; bool has_java_package() const; void clear_java_package(); static const int kJavaPackageFieldNumber = 1; const ::std::string& java_package() const; void set_java_package(const ::std::string& value); #if LANG_CXX11 void set_java_package(::std::string&& value); #endif void set_java_package(const char* value); void set_java_package(const char* value, size_t size); ::std::string* mutable_java_package(); ::std::string* release_java_package(); void set_allocated_java_package(::std::string* java_package); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_java_package(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_java_package( ::std::string* java_package); // optional string java_outer_classname = 8; bool has_java_outer_classname() const; void clear_java_outer_classname(); static const int kJavaOuterClassnameFieldNumber = 8; const ::std::string& java_outer_classname() const; void set_java_outer_classname(const ::std::string& value); #if LANG_CXX11 void set_java_outer_classname(::std::string&& value); #endif void set_java_outer_classname(const char* value); void set_java_outer_classname(const char* value, size_t size); ::std::string* mutable_java_outer_classname(); ::std::string* release_java_outer_classname(); void set_allocated_java_outer_classname(::std::string* java_outer_classname); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_java_outer_classname(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_java_outer_classname( ::std::string* java_outer_classname); // optional string go_package = 11; bool has_go_package() const; void clear_go_package(); static const int kGoPackageFieldNumber = 11; const ::std::string& go_package() const; void set_go_package(const ::std::string& value); #if LANG_CXX11 void set_go_package(::std::string&& value); #endif void set_go_package(const char* value); void set_go_package(const char* value, size_t size); ::std::string* mutable_go_package(); ::std::string* release_go_package(); void set_allocated_go_package(::std::string* go_package); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_go_package(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_go_package( ::std::string* go_package); // optional string objc_class_prefix = 36; bool has_objc_class_prefix() const; void clear_objc_class_prefix(); static const int kObjcClassPrefixFieldNumber = 36; const ::std::string& objc_class_prefix() const; void set_objc_class_prefix(const ::std::string& value); #if LANG_CXX11 void set_objc_class_prefix(::std::string&& value); #endif void set_objc_class_prefix(const char* value); void set_objc_class_prefix(const char* value, size_t size); ::std::string* mutable_objc_class_prefix(); ::std::string* release_objc_class_prefix(); void set_allocated_objc_class_prefix(::std::string* objc_class_prefix); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_objc_class_prefix(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_objc_class_prefix( ::std::string* objc_class_prefix); // optional string csharp_namespace = 37; bool has_csharp_namespace() const; void clear_csharp_namespace(); static const int kCsharpNamespaceFieldNumber = 37; const ::std::string& csharp_namespace() const; void set_csharp_namespace(const ::std::string& value); #if LANG_CXX11 void set_csharp_namespace(::std::string&& value); #endif void set_csharp_namespace(const char* value); void set_csharp_namespace(const char* value, size_t size); ::std::string* mutable_csharp_namespace(); ::std::string* release_csharp_namespace(); void set_allocated_csharp_namespace(::std::string* csharp_namespace); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_csharp_namespace(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_csharp_namespace( ::std::string* csharp_namespace); // optional string swift_prefix = 39; bool has_swift_prefix() const; void clear_swift_prefix(); static const int kSwiftPrefixFieldNumber = 39; const ::std::string& swift_prefix() const; void set_swift_prefix(const ::std::string& value); #if LANG_CXX11 void set_swift_prefix(::std::string&& value); #endif void set_swift_prefix(const char* value); void set_swift_prefix(const char* value, size_t size); ::std::string* mutable_swift_prefix(); ::std::string* release_swift_prefix(); void set_allocated_swift_prefix(::std::string* swift_prefix); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_swift_prefix(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_swift_prefix( ::std::string* swift_prefix); // optional string php_class_prefix = 40; bool has_php_class_prefix() const; void clear_php_class_prefix(); static const int kPhpClassPrefixFieldNumber = 40; const ::std::string& php_class_prefix() const; void set_php_class_prefix(const ::std::string& value); #if LANG_CXX11 void set_php_class_prefix(::std::string&& value); #endif void set_php_class_prefix(const char* value); void set_php_class_prefix(const char* value, size_t size); ::std::string* mutable_php_class_prefix(); ::std::string* release_php_class_prefix(); void set_allocated_php_class_prefix(::std::string* php_class_prefix); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_php_class_prefix(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_php_class_prefix( ::std::string* php_class_prefix); // optional string php_namespace = 41; bool has_php_namespace() const; void clear_php_namespace(); static const int kPhpNamespaceFieldNumber = 41; const ::std::string& php_namespace() const; void set_php_namespace(const ::std::string& value); #if LANG_CXX11 void set_php_namespace(::std::string&& value); #endif void set_php_namespace(const char* value); void set_php_namespace(const char* value, size_t size); ::std::string* mutable_php_namespace(); ::std::string* release_php_namespace(); void set_allocated_php_namespace(::std::string* php_namespace); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_php_namespace(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_php_namespace( ::std::string* php_namespace); // optional bool cc_enable_arenas = 31 [default = false]; bool has_cc_enable_arenas() const; void clear_cc_enable_arenas(); static const int kCcEnableArenasFieldNumber = 31; bool cc_enable_arenas() const; void set_cc_enable_arenas(bool value); // optional bool java_multiple_files = 10 [default = false]; bool has_java_multiple_files() const; void clear_java_multiple_files(); static const int kJavaMultipleFilesFieldNumber = 10; bool java_multiple_files() const; void set_java_multiple_files(bool value); // optional bool java_generate_equals_and_hash = 20 [deprecated = true]; GOOGLE_PROTOBUF_DEPRECATED_ATTR bool has_java_generate_equals_and_hash() const; GOOGLE_PROTOBUF_DEPRECATED_ATTR void clear_java_generate_equals_and_hash(); GOOGLE_PROTOBUF_DEPRECATED_ATTR static const int kJavaGenerateEqualsAndHashFieldNumber = 20; GOOGLE_PROTOBUF_DEPRECATED_ATTR bool java_generate_equals_and_hash() const; GOOGLE_PROTOBUF_DEPRECATED_ATTR void set_java_generate_equals_and_hash(bool value); // optional bool java_string_check_utf8 = 27 [default = false]; bool has_java_string_check_utf8() const; void clear_java_string_check_utf8(); static const int kJavaStringCheckUtf8FieldNumber = 27; bool java_string_check_utf8() const; void set_java_string_check_utf8(bool value); // optional bool cc_generic_services = 16 [default = false]; bool has_cc_generic_services() const; void clear_cc_generic_services(); static const int kCcGenericServicesFieldNumber = 16; bool cc_generic_services() const; void set_cc_generic_services(bool value); // optional bool java_generic_services = 17 [default = false]; bool has_java_generic_services() const; void clear_java_generic_services(); static const int kJavaGenericServicesFieldNumber = 17; bool java_generic_services() const; void set_java_generic_services(bool value); // optional bool py_generic_services = 18 [default = false]; bool has_py_generic_services() const; void clear_py_generic_services(); static const int kPyGenericServicesFieldNumber = 18; bool py_generic_services() const; void set_py_generic_services(bool value); // optional bool php_generic_services = 42 [default = false]; bool has_php_generic_services() const; void clear_php_generic_services(); static const int kPhpGenericServicesFieldNumber = 42; bool php_generic_services() const; void set_php_generic_services(bool value); // optional bool deprecated = 23 [default = false]; bool has_deprecated() const; void clear_deprecated(); static const int kDeprecatedFieldNumber = 23; bool deprecated() const; void set_deprecated(bool value); // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; bool has_optimize_for() const; void clear_optimize_for(); static const int kOptimizeForFieldNumber = 9; ::google::protobuf::FileOptions_OptimizeMode optimize_for() const; void set_optimize_for(::google::protobuf::FileOptions_OptimizeMode value); GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FileOptions) // @@protoc_insertion_point(class_scope:google.protobuf.FileOptions) private: void set_has_java_package(); void clear_has_java_package(); void set_has_java_outer_classname(); void clear_has_java_outer_classname(); void set_has_java_multiple_files(); void clear_has_java_multiple_files(); void set_has_java_generate_equals_and_hash(); void clear_has_java_generate_equals_and_hash(); void set_has_java_string_check_utf8(); void clear_has_java_string_check_utf8(); void set_has_optimize_for(); void clear_has_optimize_for(); void set_has_go_package(); void clear_has_go_package(); void set_has_cc_generic_services(); void clear_has_cc_generic_services(); void set_has_java_generic_services(); void clear_has_java_generic_services(); void set_has_py_generic_services(); void clear_has_py_generic_services(); void set_has_php_generic_services(); void clear_has_php_generic_services(); void set_has_deprecated(); void clear_has_deprecated(); void set_has_cc_enable_arenas(); void clear_has_cc_enable_arenas(); void set_has_objc_class_prefix(); void clear_has_objc_class_prefix(); void set_has_csharp_namespace(); void clear_has_csharp_namespace(); void set_has_swift_prefix(); void clear_has_swift_prefix(); void set_has_php_class_prefix(); void clear_has_php_class_prefix(); void set_has_php_namespace(); void clear_has_php_namespace(); ::google::protobuf::internal::ExtensionSet _extensions_; ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; ::google::protobuf::internal::ArenaStringPtr java_package_; ::google::protobuf::internal::ArenaStringPtr java_outer_classname_; ::google::protobuf::internal::ArenaStringPtr go_package_; ::google::protobuf::internal::ArenaStringPtr objc_class_prefix_; ::google::protobuf::internal::ArenaStringPtr csharp_namespace_; ::google::protobuf::internal::ArenaStringPtr swift_prefix_; ::google::protobuf::internal::ArenaStringPtr php_class_prefix_; ::google::protobuf::internal::ArenaStringPtr php_namespace_; bool cc_enable_arenas_; bool java_multiple_files_; bool java_generate_equals_and_hash_; bool java_string_check_utf8_; bool cc_generic_services_; bool java_generic_services_; bool py_generic_services_; bool php_generic_services_; bool deprecated_; int optimize_for_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFileOptionsImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT MessageOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.MessageOptions) */ { public: MessageOptions(); virtual ~MessageOptions(); MessageOptions(const MessageOptions& from); inline MessageOptions& operator=(const MessageOptions& from) { CopyFrom(from); return *this; } #if LANG_CXX11 MessageOptions(MessageOptions&& from) noexcept : MessageOptions() { *this = ::std::move(from); } inline MessageOptions& operator=(MessageOptions&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const MessageOptions& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const MessageOptions* internal_default_instance() { return reinterpret_cast( &_MessageOptions_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 14; void UnsafeArenaSwap(MessageOptions* other); void Swap(MessageOptions* other); friend void swap(MessageOptions& a, MessageOptions& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline MessageOptions* New() const PROTOBUF_FINAL { return New(NULL); } MessageOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const MessageOptions& from); void MergeFrom(const MessageOptions& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(MessageOptions* other); protected: explicit MessageOptions(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; int uninterpreted_option_size() const; void clear_uninterpreted_option(); static const int kUninterpretedOptionFieldNumber = 999; const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* mutable_uninterpreted_option(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& uninterpreted_option() const; // optional bool message_set_wire_format = 1 [default = false]; bool has_message_set_wire_format() const; void clear_message_set_wire_format(); static const int kMessageSetWireFormatFieldNumber = 1; bool message_set_wire_format() const; void set_message_set_wire_format(bool value); // optional bool no_standard_descriptor_accessor = 2 [default = false]; bool has_no_standard_descriptor_accessor() const; void clear_no_standard_descriptor_accessor(); static const int kNoStandardDescriptorAccessorFieldNumber = 2; bool no_standard_descriptor_accessor() const; void set_no_standard_descriptor_accessor(bool value); // optional bool deprecated = 3 [default = false]; bool has_deprecated() const; void clear_deprecated(); static const int kDeprecatedFieldNumber = 3; bool deprecated() const; void set_deprecated(bool value); // optional bool map_entry = 7; bool has_map_entry() const; void clear_map_entry(); static const int kMapEntryFieldNumber = 7; bool map_entry() const; void set_map_entry(bool value); GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(MessageOptions) // @@protoc_insertion_point(class_scope:google.protobuf.MessageOptions) private: void set_has_message_set_wire_format(); void clear_has_message_set_wire_format(); void set_has_no_standard_descriptor_accessor(); void clear_has_no_standard_descriptor_accessor(); void set_has_deprecated(); void clear_has_deprecated(); void set_has_map_entry(); void clear_has_map_entry(); ::google::protobuf::internal::ExtensionSet _extensions_; ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; bool message_set_wire_format_; bool no_standard_descriptor_accessor_; bool deprecated_; bool map_entry_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMessageOptionsImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT FieldOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FieldOptions) */ { public: FieldOptions(); virtual ~FieldOptions(); FieldOptions(const FieldOptions& from); inline FieldOptions& operator=(const FieldOptions& from) { CopyFrom(from); return *this; } #if LANG_CXX11 FieldOptions(FieldOptions&& from) noexcept : FieldOptions() { *this = ::std::move(from); } inline FieldOptions& operator=(FieldOptions&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const FieldOptions& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const FieldOptions* internal_default_instance() { return reinterpret_cast( &_FieldOptions_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 15; void UnsafeArenaSwap(FieldOptions* other); void Swap(FieldOptions* other); friend void swap(FieldOptions& a, FieldOptions& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline FieldOptions* New() const PROTOBUF_FINAL { return New(NULL); } FieldOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const FieldOptions& from); void MergeFrom(const FieldOptions& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(FieldOptions* other); protected: explicit FieldOptions(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- typedef FieldOptions_CType CType; static const CType STRING = FieldOptions_CType_STRING; static const CType CORD = FieldOptions_CType_CORD; static const CType STRING_PIECE = FieldOptions_CType_STRING_PIECE; static inline bool CType_IsValid(int value) { return FieldOptions_CType_IsValid(value); } static const CType CType_MIN = FieldOptions_CType_CType_MIN; static const CType CType_MAX = FieldOptions_CType_CType_MAX; static const int CType_ARRAYSIZE = FieldOptions_CType_CType_ARRAYSIZE; static inline const ::google::protobuf::EnumDescriptor* CType_descriptor() { return FieldOptions_CType_descriptor(); } static inline const ::std::string& CType_Name(CType value) { return FieldOptions_CType_Name(value); } static inline bool CType_Parse(const ::std::string& name, CType* value) { return FieldOptions_CType_Parse(name, value); } typedef FieldOptions_JSType JSType; static const JSType JS_NORMAL = FieldOptions_JSType_JS_NORMAL; static const JSType JS_STRING = FieldOptions_JSType_JS_STRING; static const JSType JS_NUMBER = FieldOptions_JSType_JS_NUMBER; static inline bool JSType_IsValid(int value) { return FieldOptions_JSType_IsValid(value); } static const JSType JSType_MIN = FieldOptions_JSType_JSType_MIN; static const JSType JSType_MAX = FieldOptions_JSType_JSType_MAX; static const int JSType_ARRAYSIZE = FieldOptions_JSType_JSType_ARRAYSIZE; static inline const ::google::protobuf::EnumDescriptor* JSType_descriptor() { return FieldOptions_JSType_descriptor(); } static inline const ::std::string& JSType_Name(JSType value) { return FieldOptions_JSType_Name(value); } static inline bool JSType_Parse(const ::std::string& name, JSType* value) { return FieldOptions_JSType_Parse(name, value); } // accessors ------------------------------------------------------- // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; int uninterpreted_option_size() const; void clear_uninterpreted_option(); static const int kUninterpretedOptionFieldNumber = 999; const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* mutable_uninterpreted_option(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& uninterpreted_option() const; // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; bool has_ctype() const; void clear_ctype(); static const int kCtypeFieldNumber = 1; ::google::protobuf::FieldOptions_CType ctype() const; void set_ctype(::google::protobuf::FieldOptions_CType value); // optional bool packed = 2; bool has_packed() const; void clear_packed(); static const int kPackedFieldNumber = 2; bool packed() const; void set_packed(bool value); // optional bool lazy = 5 [default = false]; bool has_lazy() const; void clear_lazy(); static const int kLazyFieldNumber = 5; bool lazy() const; void set_lazy(bool value); // optional bool deprecated = 3 [default = false]; bool has_deprecated() const; void clear_deprecated(); static const int kDeprecatedFieldNumber = 3; bool deprecated() const; void set_deprecated(bool value); // optional bool weak = 10 [default = false]; bool has_weak() const; void clear_weak(); static const int kWeakFieldNumber = 10; bool weak() const; void set_weak(bool value); // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL]; bool has_jstype() const; void clear_jstype(); static const int kJstypeFieldNumber = 6; ::google::protobuf::FieldOptions_JSType jstype() const; void set_jstype(::google::protobuf::FieldOptions_JSType value); GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FieldOptions) // @@protoc_insertion_point(class_scope:google.protobuf.FieldOptions) private: void set_has_ctype(); void clear_has_ctype(); void set_has_packed(); void clear_has_packed(); void set_has_jstype(); void clear_has_jstype(); void set_has_lazy(); void clear_has_lazy(); void set_has_deprecated(); void clear_has_deprecated(); void set_has_weak(); void clear_has_weak(); ::google::protobuf::internal::ExtensionSet _extensions_; ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; int ctype_; bool packed_; bool lazy_; bool deprecated_; bool weak_; int jstype_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsFieldOptionsImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT OneofOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.OneofOptions) */ { public: OneofOptions(); virtual ~OneofOptions(); OneofOptions(const OneofOptions& from); inline OneofOptions& operator=(const OneofOptions& from) { CopyFrom(from); return *this; } #if LANG_CXX11 OneofOptions(OneofOptions&& from) noexcept : OneofOptions() { *this = ::std::move(from); } inline OneofOptions& operator=(OneofOptions&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const OneofOptions& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const OneofOptions* internal_default_instance() { return reinterpret_cast( &_OneofOptions_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 16; void UnsafeArenaSwap(OneofOptions* other); void Swap(OneofOptions* other); friend void swap(OneofOptions& a, OneofOptions& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline OneofOptions* New() const PROTOBUF_FINAL { return New(NULL); } OneofOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const OneofOptions& from); void MergeFrom(const OneofOptions& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(OneofOptions* other); protected: explicit OneofOptions(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; int uninterpreted_option_size() const; void clear_uninterpreted_option(); static const int kUninterpretedOptionFieldNumber = 999; const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* mutable_uninterpreted_option(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& uninterpreted_option() const; GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(OneofOptions) // @@protoc_insertion_point(class_scope:google.protobuf.OneofOptions) private: ::google::protobuf::internal::ExtensionSet _extensions_; ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsOneofOptionsImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT EnumOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumOptions) */ { public: EnumOptions(); virtual ~EnumOptions(); EnumOptions(const EnumOptions& from); inline EnumOptions& operator=(const EnumOptions& from) { CopyFrom(from); return *this; } #if LANG_CXX11 EnumOptions(EnumOptions&& from) noexcept : EnumOptions() { *this = ::std::move(from); } inline EnumOptions& operator=(EnumOptions&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const EnumOptions& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const EnumOptions* internal_default_instance() { return reinterpret_cast( &_EnumOptions_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 17; void UnsafeArenaSwap(EnumOptions* other); void Swap(EnumOptions* other); friend void swap(EnumOptions& a, EnumOptions& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline EnumOptions* New() const PROTOBUF_FINAL { return New(NULL); } EnumOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const EnumOptions& from); void MergeFrom(const EnumOptions& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(EnumOptions* other); protected: explicit EnumOptions(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; int uninterpreted_option_size() const; void clear_uninterpreted_option(); static const int kUninterpretedOptionFieldNumber = 999; const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* mutable_uninterpreted_option(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& uninterpreted_option() const; // optional bool allow_alias = 2; bool has_allow_alias() const; void clear_allow_alias(); static const int kAllowAliasFieldNumber = 2; bool allow_alias() const; void set_allow_alias(bool value); // optional bool deprecated = 3 [default = false]; bool has_deprecated() const; void clear_deprecated(); static const int kDeprecatedFieldNumber = 3; bool deprecated() const; void set_deprecated(bool value); GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(EnumOptions) // @@protoc_insertion_point(class_scope:google.protobuf.EnumOptions) private: void set_has_allow_alias(); void clear_has_allow_alias(); void set_has_deprecated(); void clear_has_deprecated(); ::google::protobuf::internal::ExtensionSet _extensions_; ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; bool allow_alias_; bool deprecated_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumOptionsImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT EnumValueOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.EnumValueOptions) */ { public: EnumValueOptions(); virtual ~EnumValueOptions(); EnumValueOptions(const EnumValueOptions& from); inline EnumValueOptions& operator=(const EnumValueOptions& from) { CopyFrom(from); return *this; } #if LANG_CXX11 EnumValueOptions(EnumValueOptions&& from) noexcept : EnumValueOptions() { *this = ::std::move(from); } inline EnumValueOptions& operator=(EnumValueOptions&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const EnumValueOptions& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const EnumValueOptions* internal_default_instance() { return reinterpret_cast( &_EnumValueOptions_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 18; void UnsafeArenaSwap(EnumValueOptions* other); void Swap(EnumValueOptions* other); friend void swap(EnumValueOptions& a, EnumValueOptions& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline EnumValueOptions* New() const PROTOBUF_FINAL { return New(NULL); } EnumValueOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const EnumValueOptions& from); void MergeFrom(const EnumValueOptions& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(EnumValueOptions* other); protected: explicit EnumValueOptions(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; int uninterpreted_option_size() const; void clear_uninterpreted_option(); static const int kUninterpretedOptionFieldNumber = 999; const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* mutable_uninterpreted_option(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& uninterpreted_option() const; // optional bool deprecated = 1 [default = false]; bool has_deprecated() const; void clear_deprecated(); static const int kDeprecatedFieldNumber = 1; bool deprecated() const; void set_deprecated(bool value); GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(EnumValueOptions) // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueOptions) private: void set_has_deprecated(); void clear_has_deprecated(); ::google::protobuf::internal::ExtensionSet _extensions_; ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; bool deprecated_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsEnumValueOptionsImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT ServiceOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ServiceOptions) */ { public: ServiceOptions(); virtual ~ServiceOptions(); ServiceOptions(const ServiceOptions& from); inline ServiceOptions& operator=(const ServiceOptions& from) { CopyFrom(from); return *this; } #if LANG_CXX11 ServiceOptions(ServiceOptions&& from) noexcept : ServiceOptions() { *this = ::std::move(from); } inline ServiceOptions& operator=(ServiceOptions&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const ServiceOptions& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const ServiceOptions* internal_default_instance() { return reinterpret_cast( &_ServiceOptions_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 19; void UnsafeArenaSwap(ServiceOptions* other); void Swap(ServiceOptions* other); friend void swap(ServiceOptions& a, ServiceOptions& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline ServiceOptions* New() const PROTOBUF_FINAL { return New(NULL); } ServiceOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const ServiceOptions& from); void MergeFrom(const ServiceOptions& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(ServiceOptions* other); protected: explicit ServiceOptions(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; int uninterpreted_option_size() const; void clear_uninterpreted_option(); static const int kUninterpretedOptionFieldNumber = 999; const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* mutable_uninterpreted_option(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& uninterpreted_option() const; // optional bool deprecated = 33 [default = false]; bool has_deprecated() const; void clear_deprecated(); static const int kDeprecatedFieldNumber = 33; bool deprecated() const; void set_deprecated(bool value); GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(ServiceOptions) // @@protoc_insertion_point(class_scope:google.protobuf.ServiceOptions) private: void set_has_deprecated(); void clear_has_deprecated(); ::google::protobuf::internal::ExtensionSet _extensions_; ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; bool deprecated_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsServiceOptionsImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT MethodOptions : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.MethodOptions) */ { public: MethodOptions(); virtual ~MethodOptions(); MethodOptions(const MethodOptions& from); inline MethodOptions& operator=(const MethodOptions& from) { CopyFrom(from); return *this; } #if LANG_CXX11 MethodOptions(MethodOptions&& from) noexcept : MethodOptions() { *this = ::std::move(from); } inline MethodOptions& operator=(MethodOptions&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const MethodOptions& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const MethodOptions* internal_default_instance() { return reinterpret_cast( &_MethodOptions_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 20; void UnsafeArenaSwap(MethodOptions* other); void Swap(MethodOptions* other); friend void swap(MethodOptions& a, MethodOptions& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline MethodOptions* New() const PROTOBUF_FINAL { return New(NULL); } MethodOptions* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const MethodOptions& from); void MergeFrom(const MethodOptions& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(MethodOptions* other); protected: explicit MethodOptions(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- typedef MethodOptions_IdempotencyLevel IdempotencyLevel; static const IdempotencyLevel IDEMPOTENCY_UNKNOWN = MethodOptions_IdempotencyLevel_IDEMPOTENCY_UNKNOWN; static const IdempotencyLevel NO_SIDE_EFFECTS = MethodOptions_IdempotencyLevel_NO_SIDE_EFFECTS; static const IdempotencyLevel IDEMPOTENT = MethodOptions_IdempotencyLevel_IDEMPOTENT; static inline bool IdempotencyLevel_IsValid(int value) { return MethodOptions_IdempotencyLevel_IsValid(value); } static const IdempotencyLevel IdempotencyLevel_MIN = MethodOptions_IdempotencyLevel_IdempotencyLevel_MIN; static const IdempotencyLevel IdempotencyLevel_MAX = MethodOptions_IdempotencyLevel_IdempotencyLevel_MAX; static const int IdempotencyLevel_ARRAYSIZE = MethodOptions_IdempotencyLevel_IdempotencyLevel_ARRAYSIZE; static inline const ::google::protobuf::EnumDescriptor* IdempotencyLevel_descriptor() { return MethodOptions_IdempotencyLevel_descriptor(); } static inline const ::std::string& IdempotencyLevel_Name(IdempotencyLevel value) { return MethodOptions_IdempotencyLevel_Name(value); } static inline bool IdempotencyLevel_Parse(const ::std::string& name, IdempotencyLevel* value) { return MethodOptions_IdempotencyLevel_Parse(name, value); } // accessors ------------------------------------------------------- // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; int uninterpreted_option_size() const; void clear_uninterpreted_option(); static const int kUninterpretedOptionFieldNumber = 999; const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* mutable_uninterpreted_option(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& uninterpreted_option() const; // optional bool deprecated = 33 [default = false]; bool has_deprecated() const; void clear_deprecated(); static const int kDeprecatedFieldNumber = 33; bool deprecated() const; void set_deprecated(bool value); // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN]; bool has_idempotency_level() const; void clear_idempotency_level(); static const int kIdempotencyLevelFieldNumber = 34; ::google::protobuf::MethodOptions_IdempotencyLevel idempotency_level() const; void set_idempotency_level(::google::protobuf::MethodOptions_IdempotencyLevel value); GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(MethodOptions) // @@protoc_insertion_point(class_scope:google.protobuf.MethodOptions) private: void set_has_deprecated(); void clear_has_deprecated(); void set_has_idempotency_level(); void clear_has_idempotency_level(); ::google::protobuf::internal::ExtensionSet _extensions_; ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; bool deprecated_; int idempotency_level_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsMethodOptionsImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT UninterpretedOption_NamePart : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.UninterpretedOption.NamePart) */ { public: UninterpretedOption_NamePart(); virtual ~UninterpretedOption_NamePart(); UninterpretedOption_NamePart(const UninterpretedOption_NamePart& from); inline UninterpretedOption_NamePart& operator=(const UninterpretedOption_NamePart& from) { CopyFrom(from); return *this; } #if LANG_CXX11 UninterpretedOption_NamePart(UninterpretedOption_NamePart&& from) noexcept : UninterpretedOption_NamePart() { *this = ::std::move(from); } inline UninterpretedOption_NamePart& operator=(UninterpretedOption_NamePart&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const UninterpretedOption_NamePart& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const UninterpretedOption_NamePart* internal_default_instance() { return reinterpret_cast( &_UninterpretedOption_NamePart_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 21; void UnsafeArenaSwap(UninterpretedOption_NamePart* other); void Swap(UninterpretedOption_NamePart* other); friend void swap(UninterpretedOption_NamePart& a, UninterpretedOption_NamePart& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline UninterpretedOption_NamePart* New() const PROTOBUF_FINAL { return New(NULL); } UninterpretedOption_NamePart* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const UninterpretedOption_NamePart& from); void MergeFrom(const UninterpretedOption_NamePart& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(UninterpretedOption_NamePart* other); protected: explicit UninterpretedOption_NamePart(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // required string name_part = 1; bool has_name_part() const; void clear_name_part(); static const int kNamePartFieldNumber = 1; const ::std::string& name_part() const; void set_name_part(const ::std::string& value); #if LANG_CXX11 void set_name_part(::std::string&& value); #endif void set_name_part(const char* value); void set_name_part(const char* value, size_t size); ::std::string* mutable_name_part(); ::std::string* release_name_part(); void set_allocated_name_part(::std::string* name_part); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_name_part(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_name_part( ::std::string* name_part); // required bool is_extension = 2; bool has_is_extension() const; void clear_is_extension(); static const int kIsExtensionFieldNumber = 2; bool is_extension() const; void set_is_extension(bool value); // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption.NamePart) private: void set_has_name_part(); void clear_has_name_part(); void set_has_is_extension(); void clear_has_is_extension(); // helper for ByteSizeLong() size_t RequiredFieldsByteSizeFallback() const; ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::internal::ArenaStringPtr name_part_; bool is_extension_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOption_NamePartImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT UninterpretedOption : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.UninterpretedOption) */ { public: UninterpretedOption(); virtual ~UninterpretedOption(); UninterpretedOption(const UninterpretedOption& from); inline UninterpretedOption& operator=(const UninterpretedOption& from) { CopyFrom(from); return *this; } #if LANG_CXX11 UninterpretedOption(UninterpretedOption&& from) noexcept : UninterpretedOption() { *this = ::std::move(from); } inline UninterpretedOption& operator=(UninterpretedOption&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const UninterpretedOption& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const UninterpretedOption* internal_default_instance() { return reinterpret_cast( &_UninterpretedOption_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 22; void UnsafeArenaSwap(UninterpretedOption* other); void Swap(UninterpretedOption* other); friend void swap(UninterpretedOption& a, UninterpretedOption& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline UninterpretedOption* New() const PROTOBUF_FINAL { return New(NULL); } UninterpretedOption* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const UninterpretedOption& from); void MergeFrom(const UninterpretedOption& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(UninterpretedOption* other); protected: explicit UninterpretedOption(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- typedef UninterpretedOption_NamePart NamePart; // accessors ------------------------------------------------------- // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; int name_size() const; void clear_name(); static const int kNameFieldNumber = 2; const ::google::protobuf::UninterpretedOption_NamePart& name(int index) const; ::google::protobuf::UninterpretedOption_NamePart* mutable_name(int index); ::google::protobuf::UninterpretedOption_NamePart* add_name(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >* mutable_name(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >& name() const; // optional string identifier_value = 3; bool has_identifier_value() const; void clear_identifier_value(); static const int kIdentifierValueFieldNumber = 3; const ::std::string& identifier_value() const; void set_identifier_value(const ::std::string& value); #if LANG_CXX11 void set_identifier_value(::std::string&& value); #endif void set_identifier_value(const char* value); void set_identifier_value(const char* value, size_t size); ::std::string* mutable_identifier_value(); ::std::string* release_identifier_value(); void set_allocated_identifier_value(::std::string* identifier_value); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_identifier_value(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_identifier_value( ::std::string* identifier_value); // optional bytes string_value = 7; bool has_string_value() const; void clear_string_value(); static const int kStringValueFieldNumber = 7; const ::std::string& string_value() const; void set_string_value(const ::std::string& value); #if LANG_CXX11 void set_string_value(::std::string&& value); #endif void set_string_value(const char* value); void set_string_value(const void* value, size_t size); ::std::string* mutable_string_value(); ::std::string* release_string_value(); void set_allocated_string_value(::std::string* string_value); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_string_value(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_string_value( ::std::string* string_value); // optional string aggregate_value = 8; bool has_aggregate_value() const; void clear_aggregate_value(); static const int kAggregateValueFieldNumber = 8; const ::std::string& aggregate_value() const; void set_aggregate_value(const ::std::string& value); #if LANG_CXX11 void set_aggregate_value(::std::string&& value); #endif void set_aggregate_value(const char* value); void set_aggregate_value(const char* value, size_t size); ::std::string* mutable_aggregate_value(); ::std::string* release_aggregate_value(); void set_allocated_aggregate_value(::std::string* aggregate_value); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_aggregate_value(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_aggregate_value( ::std::string* aggregate_value); // optional uint64 positive_int_value = 4; bool has_positive_int_value() const; void clear_positive_int_value(); static const int kPositiveIntValueFieldNumber = 4; ::google::protobuf::uint64 positive_int_value() const; void set_positive_int_value(::google::protobuf::uint64 value); // optional int64 negative_int_value = 5; bool has_negative_int_value() const; void clear_negative_int_value(); static const int kNegativeIntValueFieldNumber = 5; ::google::protobuf::int64 negative_int_value() const; void set_negative_int_value(::google::protobuf::int64 value); // optional double double_value = 6; bool has_double_value() const; void clear_double_value(); static const int kDoubleValueFieldNumber = 6; double double_value() const; void set_double_value(double value); // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption) private: void set_has_identifier_value(); void clear_has_identifier_value(); void set_has_positive_int_value(); void clear_has_positive_int_value(); void set_has_negative_int_value(); void clear_has_negative_int_value(); void set_has_double_value(); void clear_has_double_value(); void set_has_string_value(); void clear_has_string_value(); void set_has_aggregate_value(); void clear_has_aggregate_value(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart > name_; ::google::protobuf::internal::ArenaStringPtr identifier_value_; ::google::protobuf::internal::ArenaStringPtr string_value_; ::google::protobuf::internal::ArenaStringPtr aggregate_value_; ::google::protobuf::uint64 positive_int_value_; ::google::protobuf::int64 negative_int_value_; double double_value_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsUninterpretedOptionImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT SourceCodeInfo_Location : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.SourceCodeInfo.Location) */ { public: SourceCodeInfo_Location(); virtual ~SourceCodeInfo_Location(); SourceCodeInfo_Location(const SourceCodeInfo_Location& from); inline SourceCodeInfo_Location& operator=(const SourceCodeInfo_Location& from) { CopyFrom(from); return *this; } #if LANG_CXX11 SourceCodeInfo_Location(SourceCodeInfo_Location&& from) noexcept : SourceCodeInfo_Location() { *this = ::std::move(from); } inline SourceCodeInfo_Location& operator=(SourceCodeInfo_Location&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const SourceCodeInfo_Location& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const SourceCodeInfo_Location* internal_default_instance() { return reinterpret_cast( &_SourceCodeInfo_Location_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 23; void UnsafeArenaSwap(SourceCodeInfo_Location* other); void Swap(SourceCodeInfo_Location* other); friend void swap(SourceCodeInfo_Location& a, SourceCodeInfo_Location& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline SourceCodeInfo_Location* New() const PROTOBUF_FINAL { return New(NULL); } SourceCodeInfo_Location* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const SourceCodeInfo_Location& from); void MergeFrom(const SourceCodeInfo_Location& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(SourceCodeInfo_Location* other); protected: explicit SourceCodeInfo_Location(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated int32 path = 1 [packed = true]; int path_size() const; void clear_path(); static const int kPathFieldNumber = 1; ::google::protobuf::int32 path(int index) const; void set_path(int index, ::google::protobuf::int32 value); void add_path(::google::protobuf::int32 value); const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& path() const; ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* mutable_path(); // repeated int32 span = 2 [packed = true]; int span_size() const; void clear_span(); static const int kSpanFieldNumber = 2; ::google::protobuf::int32 span(int index) const; void set_span(int index, ::google::protobuf::int32 value); void add_span(::google::protobuf::int32 value); const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& span() const; ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* mutable_span(); // repeated string leading_detached_comments = 6; int leading_detached_comments_size() const; void clear_leading_detached_comments(); static const int kLeadingDetachedCommentsFieldNumber = 6; const ::std::string& leading_detached_comments(int index) const; ::std::string* mutable_leading_detached_comments(int index); void set_leading_detached_comments(int index, const ::std::string& value); #if LANG_CXX11 void set_leading_detached_comments(int index, ::std::string&& value); #endif void set_leading_detached_comments(int index, const char* value); void set_leading_detached_comments(int index, const char* value, size_t size); ::std::string* add_leading_detached_comments(); void add_leading_detached_comments(const ::std::string& value); #if LANG_CXX11 void add_leading_detached_comments(::std::string&& value); #endif void add_leading_detached_comments(const char* value); void add_leading_detached_comments(const char* value, size_t size); const ::google::protobuf::RepeatedPtrField< ::std::string>& leading_detached_comments() const; ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_leading_detached_comments(); // optional string leading_comments = 3; bool has_leading_comments() const; void clear_leading_comments(); static const int kLeadingCommentsFieldNumber = 3; const ::std::string& leading_comments() const; void set_leading_comments(const ::std::string& value); #if LANG_CXX11 void set_leading_comments(::std::string&& value); #endif void set_leading_comments(const char* value); void set_leading_comments(const char* value, size_t size); ::std::string* mutable_leading_comments(); ::std::string* release_leading_comments(); void set_allocated_leading_comments(::std::string* leading_comments); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_leading_comments(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_leading_comments( ::std::string* leading_comments); // optional string trailing_comments = 4; bool has_trailing_comments() const; void clear_trailing_comments(); static const int kTrailingCommentsFieldNumber = 4; const ::std::string& trailing_comments() const; void set_trailing_comments(const ::std::string& value); #if LANG_CXX11 void set_trailing_comments(::std::string&& value); #endif void set_trailing_comments(const char* value); void set_trailing_comments(const char* value, size_t size); ::std::string* mutable_trailing_comments(); ::std::string* release_trailing_comments(); void set_allocated_trailing_comments(::std::string* trailing_comments); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_trailing_comments(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_trailing_comments( ::std::string* trailing_comments); // @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo.Location) private: void set_has_leading_comments(); void clear_has_leading_comments(); void set_has_trailing_comments(); void clear_has_trailing_comments(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedField< ::google::protobuf::int32 > path_; mutable int _path_cached_byte_size_; ::google::protobuf::RepeatedField< ::google::protobuf::int32 > span_; mutable int _span_cached_byte_size_; ::google::protobuf::RepeatedPtrField< ::std::string> leading_detached_comments_; ::google::protobuf::internal::ArenaStringPtr leading_comments_; ::google::protobuf::internal::ArenaStringPtr trailing_comments_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfo_LocationImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT SourceCodeInfo : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.SourceCodeInfo) */ { public: SourceCodeInfo(); virtual ~SourceCodeInfo(); SourceCodeInfo(const SourceCodeInfo& from); inline SourceCodeInfo& operator=(const SourceCodeInfo& from) { CopyFrom(from); return *this; } #if LANG_CXX11 SourceCodeInfo(SourceCodeInfo&& from) noexcept : SourceCodeInfo() { *this = ::std::move(from); } inline SourceCodeInfo& operator=(SourceCodeInfo&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const SourceCodeInfo& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const SourceCodeInfo* internal_default_instance() { return reinterpret_cast( &_SourceCodeInfo_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 24; void UnsafeArenaSwap(SourceCodeInfo* other); void Swap(SourceCodeInfo* other); friend void swap(SourceCodeInfo& a, SourceCodeInfo& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline SourceCodeInfo* New() const PROTOBUF_FINAL { return New(NULL); } SourceCodeInfo* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const SourceCodeInfo& from); void MergeFrom(const SourceCodeInfo& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(SourceCodeInfo* other); protected: explicit SourceCodeInfo(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- typedef SourceCodeInfo_Location Location; // accessors ------------------------------------------------------- // repeated .google.protobuf.SourceCodeInfo.Location location = 1; int location_size() const; void clear_location(); static const int kLocationFieldNumber = 1; const ::google::protobuf::SourceCodeInfo_Location& location(int index) const; ::google::protobuf::SourceCodeInfo_Location* mutable_location(int index); ::google::protobuf::SourceCodeInfo_Location* add_location(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >* mutable_location(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >& location() const; // @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location > location_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsSourceCodeInfoImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT GeneratedCodeInfo_Annotation : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.GeneratedCodeInfo.Annotation) */ { public: GeneratedCodeInfo_Annotation(); virtual ~GeneratedCodeInfo_Annotation(); GeneratedCodeInfo_Annotation(const GeneratedCodeInfo_Annotation& from); inline GeneratedCodeInfo_Annotation& operator=(const GeneratedCodeInfo_Annotation& from) { CopyFrom(from); return *this; } #if LANG_CXX11 GeneratedCodeInfo_Annotation(GeneratedCodeInfo_Annotation&& from) noexcept : GeneratedCodeInfo_Annotation() { *this = ::std::move(from); } inline GeneratedCodeInfo_Annotation& operator=(GeneratedCodeInfo_Annotation&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const GeneratedCodeInfo_Annotation& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const GeneratedCodeInfo_Annotation* internal_default_instance() { return reinterpret_cast( &_GeneratedCodeInfo_Annotation_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 25; void UnsafeArenaSwap(GeneratedCodeInfo_Annotation* other); void Swap(GeneratedCodeInfo_Annotation* other); friend void swap(GeneratedCodeInfo_Annotation& a, GeneratedCodeInfo_Annotation& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline GeneratedCodeInfo_Annotation* New() const PROTOBUF_FINAL { return New(NULL); } GeneratedCodeInfo_Annotation* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const GeneratedCodeInfo_Annotation& from); void MergeFrom(const GeneratedCodeInfo_Annotation& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(GeneratedCodeInfo_Annotation* other); protected: explicit GeneratedCodeInfo_Annotation(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated int32 path = 1 [packed = true]; int path_size() const; void clear_path(); static const int kPathFieldNumber = 1; ::google::protobuf::int32 path(int index) const; void set_path(int index, ::google::protobuf::int32 value); void add_path(::google::protobuf::int32 value); const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& path() const; ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* mutable_path(); // optional string source_file = 2; bool has_source_file() const; void clear_source_file(); static const int kSourceFileFieldNumber = 2; const ::std::string& source_file() const; void set_source_file(const ::std::string& value); #if LANG_CXX11 void set_source_file(::std::string&& value); #endif void set_source_file(const char* value); void set_source_file(const char* value, size_t size); ::std::string* mutable_source_file(); ::std::string* release_source_file(); void set_allocated_source_file(::std::string* source_file); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_source_file(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_source_file( ::std::string* source_file); // optional int32 begin = 3; bool has_begin() const; void clear_begin(); static const int kBeginFieldNumber = 3; ::google::protobuf::int32 begin() const; void set_begin(::google::protobuf::int32 value); // optional int32 end = 4; bool has_end() const; void clear_end(); static const int kEndFieldNumber = 4; ::google::protobuf::int32 end() const; void set_end(::google::protobuf::int32 value); // @@protoc_insertion_point(class_scope:google.protobuf.GeneratedCodeInfo.Annotation) private: void set_has_source_file(); void clear_has_source_file(); void set_has_begin(); void clear_has_begin(); void set_has_end(); void clear_has_end(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedField< ::google::protobuf::int32 > path_; mutable int _path_cached_byte_size_; ::google::protobuf::internal::ArenaStringPtr source_file_; ::google::protobuf::int32 begin_; ::google::protobuf::int32 end_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfo_AnnotationImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT GeneratedCodeInfo : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.GeneratedCodeInfo) */ { public: GeneratedCodeInfo(); virtual ~GeneratedCodeInfo(); GeneratedCodeInfo(const GeneratedCodeInfo& from); inline GeneratedCodeInfo& operator=(const GeneratedCodeInfo& from) { CopyFrom(from); return *this; } #if LANG_CXX11 GeneratedCodeInfo(GeneratedCodeInfo&& from) noexcept : GeneratedCodeInfo() { *this = ::std::move(from); } inline GeneratedCodeInfo& operator=(GeneratedCodeInfo&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _internal_metadata_.unknown_fields(); } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return _internal_metadata_.mutable_unknown_fields(); } inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const GeneratedCodeInfo& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const GeneratedCodeInfo* internal_default_instance() { return reinterpret_cast( &_GeneratedCodeInfo_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 26; void UnsafeArenaSwap(GeneratedCodeInfo* other); void Swap(GeneratedCodeInfo* other); friend void swap(GeneratedCodeInfo& a, GeneratedCodeInfo& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline GeneratedCodeInfo* New() const PROTOBUF_FINAL { return New(NULL); } GeneratedCodeInfo* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const GeneratedCodeInfo& from); void MergeFrom(const GeneratedCodeInfo& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(GeneratedCodeInfo* other); protected: explicit GeneratedCodeInfo(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- typedef GeneratedCodeInfo_Annotation Annotation; // accessors ------------------------------------------------------- // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1; int annotation_size() const; void clear_annotation(); static const int kAnnotationFieldNumber = 1; const ::google::protobuf::GeneratedCodeInfo_Annotation& annotation(int index) const; ::google::protobuf::GeneratedCodeInfo_Annotation* mutable_annotation(int index); ::google::protobuf::GeneratedCodeInfo_Annotation* add_annotation(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::GeneratedCodeInfo_Annotation >* mutable_annotation(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::GeneratedCodeInfo_Annotation >& annotation() const; // @@protoc_insertion_point(class_scope:google.protobuf.GeneratedCodeInfo) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::HasBits<1> _has_bits_; mutable int _cached_size_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::GeneratedCodeInfo_Annotation > annotation_; friend struct ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fdescriptor_2eproto::InitDefaultsGeneratedCodeInfoImpl(); }; // =================================================================== // =================================================================== #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif // __GNUC__ // FileDescriptorSet // repeated .google.protobuf.FileDescriptorProto file = 1; inline int FileDescriptorSet::file_size() const { return file_.size(); } inline void FileDescriptorSet::clear_file() { file_.Clear(); } inline const ::google::protobuf::FileDescriptorProto& FileDescriptorSet::file(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorSet.file) return file_.Get(index); } inline ::google::protobuf::FileDescriptorProto* FileDescriptorSet::mutable_file(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorSet.file) return file_.Mutable(index); } inline ::google::protobuf::FileDescriptorProto* FileDescriptorSet::add_file() { // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorSet.file) return file_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >* FileDescriptorSet::mutable_file() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorSet.file) return &file_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >& FileDescriptorSet::file() const { // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorSet.file) return file_; } // ------------------------------------------------------------------- // FileDescriptorProto // optional string name = 1; inline bool FileDescriptorProto::has_name() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void FileDescriptorProto::set_has_name() { _has_bits_[0] |= 0x00000001u; } inline void FileDescriptorProto::clear_has_name() { _has_bits_[0] &= ~0x00000001u; } inline void FileDescriptorProto::clear_name() { name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_name(); } inline const ::std::string& FileDescriptorProto::name() const { // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.name) return name_.Get(); } inline void FileDescriptorProto::set_name(const ::std::string& value) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.name) } #if LANG_CXX11 inline void FileDescriptorProto::set_name(::std::string&& value) { set_has_name(); name_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileDescriptorProto.name) } #endif inline void FileDescriptorProto::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.name) } inline void FileDescriptorProto::set_name(const char* value, size_t size) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.name) } inline ::std::string* FileDescriptorProto::mutable_name() { set_has_name(); // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.name) return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FileDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.name) clear_has_name(); return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileDescriptorProto::set_allocated_name(::std::string* name) { if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.name) } inline ::std::string* FileDescriptorProto::unsafe_arena_release_name() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileDescriptorProto.name) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_name(); return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileDescriptorProto::unsafe_arena_set_allocated_name( ::std::string* name) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.name) } // optional string package = 2; inline bool FileDescriptorProto::has_package() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void FileDescriptorProto::set_has_package() { _has_bits_[0] |= 0x00000002u; } inline void FileDescriptorProto::clear_has_package() { _has_bits_[0] &= ~0x00000002u; } inline void FileDescriptorProto::clear_package() { package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_package(); } inline const ::std::string& FileDescriptorProto::package() const { // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.package) return package_.Get(); } inline void FileDescriptorProto::set_package(const ::std::string& value) { set_has_package(); package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.package) } #if LANG_CXX11 inline void FileDescriptorProto::set_package(::std::string&& value) { set_has_package(); package_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileDescriptorProto.package) } #endif inline void FileDescriptorProto::set_package(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_package(); package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.package) } inline void FileDescriptorProto::set_package(const char* value, size_t size) { set_has_package(); package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.package) } inline ::std::string* FileDescriptorProto::mutable_package() { set_has_package(); // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.package) return package_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FileDescriptorProto::release_package() { // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.package) clear_has_package(); return package_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileDescriptorProto::set_allocated_package(::std::string* package) { if (package != NULL) { set_has_package(); } else { clear_has_package(); } package_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), package, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.package) } inline ::std::string* FileDescriptorProto::unsafe_arena_release_package() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileDescriptorProto.package) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_package(); return package_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileDescriptorProto::unsafe_arena_set_allocated_package( ::std::string* package) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (package != NULL) { set_has_package(); } else { clear_has_package(); } package_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), package, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.package) } // repeated string dependency = 3; inline int FileDescriptorProto::dependency_size() const { return dependency_.size(); } inline void FileDescriptorProto::clear_dependency() { dependency_.Clear(); } inline const ::std::string& FileDescriptorProto::dependency(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.dependency) return dependency_.Get(index); } inline ::std::string* FileDescriptorProto::mutable_dependency(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.dependency) return dependency_.Mutable(index); } inline void FileDescriptorProto::set_dependency(int index, const ::std::string& value) { // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.dependency) dependency_.Mutable(index)->assign(value); } #if LANG_CXX11 inline void FileDescriptorProto::set_dependency(int index, ::std::string&& value) { // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.dependency) dependency_.Mutable(index)->assign(std::move(value)); } #endif inline void FileDescriptorProto::set_dependency(int index, const char* value) { GOOGLE_DCHECK(value != NULL); 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) { dependency_.Mutable(index)->assign( reinterpret_cast(value), size); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.dependency) } inline ::std::string* FileDescriptorProto::add_dependency() { // @@protoc_insertion_point(field_add_mutable:google.protobuf.FileDescriptorProto.dependency) return dependency_.Add(); } inline void FileDescriptorProto::add_dependency(const ::std::string& value) { dependency_.Add()->assign(value); // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.dependency) } #if LANG_CXX11 inline void FileDescriptorProto::add_dependency(::std::string&& value) { dependency_.Add(std::move(value)); // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.dependency) } #endif inline void FileDescriptorProto::add_dependency(const char* value) { GOOGLE_DCHECK(value != NULL); 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) { dependency_.Add()->assign(reinterpret_cast(value), size); // @@protoc_insertion_point(field_add_pointer:google.protobuf.FileDescriptorProto.dependency) } inline const ::google::protobuf::RepeatedPtrField< ::std::string>& FileDescriptorProto::dependency() const { // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.dependency) return dependency_; } inline ::google::protobuf::RepeatedPtrField< ::std::string>* FileDescriptorProto::mutable_dependency() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.dependency) return &dependency_; } // repeated int32 public_dependency = 10; inline int FileDescriptorProto::public_dependency_size() const { return public_dependency_.size(); } inline void FileDescriptorProto::clear_public_dependency() { public_dependency_.Clear(); } inline ::google::protobuf::int32 FileDescriptorProto::public_dependency(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.public_dependency) return public_dependency_.Get(index); } inline void FileDescriptorProto::set_public_dependency(int index, ::google::protobuf::int32 value) { public_dependency_.Set(index, value); // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.public_dependency) } inline void FileDescriptorProto::add_public_dependency(::google::protobuf::int32 value) { public_dependency_.Add(value); // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.public_dependency) } inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& FileDescriptorProto::public_dependency() const { // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.public_dependency) return public_dependency_; } inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* FileDescriptorProto::mutable_public_dependency() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.public_dependency) return &public_dependency_; } // repeated int32 weak_dependency = 11; inline int FileDescriptorProto::weak_dependency_size() const { return weak_dependency_.size(); } inline void FileDescriptorProto::clear_weak_dependency() { weak_dependency_.Clear(); } inline ::google::protobuf::int32 FileDescriptorProto::weak_dependency(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.weak_dependency) return weak_dependency_.Get(index); } inline void FileDescriptorProto::set_weak_dependency(int index, ::google::protobuf::int32 value) { weak_dependency_.Set(index, value); // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.weak_dependency) } inline void FileDescriptorProto::add_weak_dependency(::google::protobuf::int32 value) { weak_dependency_.Add(value); // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.weak_dependency) } inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& FileDescriptorProto::weak_dependency() const { // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.weak_dependency) return weak_dependency_; } inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* FileDescriptorProto::mutable_weak_dependency() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.weak_dependency) return &weak_dependency_; } // repeated .google.protobuf.DescriptorProto message_type = 4; inline int FileDescriptorProto::message_type_size() const { return message_type_.size(); } inline void FileDescriptorProto::clear_message_type() { message_type_.Clear(); } inline const ::google::protobuf::DescriptorProto& FileDescriptorProto::message_type(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.message_type) return message_type_.Get(index); } inline ::google::protobuf::DescriptorProto* FileDescriptorProto::mutable_message_type(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.message_type) return message_type_.Mutable(index); } inline ::google::protobuf::DescriptorProto* FileDescriptorProto::add_message_type() { // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.message_type) return message_type_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* FileDescriptorProto::mutable_message_type() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.message_type) return &message_type_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& FileDescriptorProto::message_type() const { // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.message_type) return message_type_; } // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; inline int FileDescriptorProto::enum_type_size() const { return enum_type_.size(); } inline void FileDescriptorProto::clear_enum_type() { enum_type_.Clear(); } inline const ::google::protobuf::EnumDescriptorProto& FileDescriptorProto::enum_type(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.enum_type) return enum_type_.Get(index); } inline ::google::protobuf::EnumDescriptorProto* FileDescriptorProto::mutable_enum_type(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.enum_type) return enum_type_.Mutable(index); } inline ::google::protobuf::EnumDescriptorProto* FileDescriptorProto::add_enum_type() { // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.enum_type) return enum_type_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* FileDescriptorProto::mutable_enum_type() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.enum_type) return &enum_type_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& FileDescriptorProto::enum_type() const { // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.enum_type) return enum_type_; } // repeated .google.protobuf.ServiceDescriptorProto service = 6; inline int FileDescriptorProto::service_size() const { return service_.size(); } inline void FileDescriptorProto::clear_service() { service_.Clear(); } inline const ::google::protobuf::ServiceDescriptorProto& FileDescriptorProto::service(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.service) return service_.Get(index); } inline ::google::protobuf::ServiceDescriptorProto* FileDescriptorProto::mutable_service(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.service) return service_.Mutable(index); } inline ::google::protobuf::ServiceDescriptorProto* FileDescriptorProto::add_service() { // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.service) return service_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >* FileDescriptorProto::mutable_service() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.service) return &service_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >& FileDescriptorProto::service() const { // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.service) return service_; } // repeated .google.protobuf.FieldDescriptorProto extension = 7; inline int FileDescriptorProto::extension_size() const { return extension_.size(); } inline void FileDescriptorProto::clear_extension() { extension_.Clear(); } inline const ::google::protobuf::FieldDescriptorProto& FileDescriptorProto::extension(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.extension) return extension_.Get(index); } inline ::google::protobuf::FieldDescriptorProto* FileDescriptorProto::mutable_extension(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.extension) return extension_.Mutable(index); } inline ::google::protobuf::FieldDescriptorProto* FileDescriptorProto::add_extension() { // @@protoc_insertion_point(field_add:google.protobuf.FileDescriptorProto.extension) return extension_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* FileDescriptorProto::mutable_extension() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileDescriptorProto.extension) return &extension_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& FileDescriptorProto::extension() const { // @@protoc_insertion_point(field_list:google.protobuf.FileDescriptorProto.extension) return extension_; } // optional .google.protobuf.FileOptions options = 8; inline bool FileDescriptorProto::has_options() const { return (_has_bits_[0] & 0x00000008u) != 0; } inline void FileDescriptorProto::set_has_options() { _has_bits_[0] |= 0x00000008u; } inline void FileDescriptorProto::clear_has_options() { _has_bits_[0] &= ~0x00000008u; } inline void FileDescriptorProto::clear_options() { if (options_ != NULL) options_->Clear(); clear_has_options(); } inline const ::google::protobuf::FileOptions& FileDescriptorProto::options() const { const ::google::protobuf::FileOptions* p = options_; // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.options) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::_FileOptions_default_instance_); } inline ::google::protobuf::FileOptions* FileDescriptorProto::release_options() { // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.options) clear_has_options(); ::google::protobuf::FileOptions* temp = options_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } options_ = NULL; return temp; } inline ::google::protobuf::FileOptions* FileDescriptorProto::unsafe_arena_release_options() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileDescriptorProto.options) clear_has_options(); ::google::protobuf::FileOptions* temp = options_; options_ = NULL; return temp; } inline ::google::protobuf::FileOptions* FileDescriptorProto::mutable_options() { set_has_options(); if (options_ == NULL) { _slow_mutable_options(); } // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.options) return options_; } inline void FileDescriptorProto::set_allocated_options(::google::protobuf::FileOptions* options) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete options_; } if (options) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(options); if (message_arena != submessage_arena) { options = ::google::protobuf::internal::GetOwnedMessage( message_arena, options, submessage_arena); } set_has_options(); } else { clear_has_options(); } options_ = options; // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.options) } // optional .google.protobuf.SourceCodeInfo source_code_info = 9; inline bool FileDescriptorProto::has_source_code_info() const { return (_has_bits_[0] & 0x00000010u) != 0; } inline void FileDescriptorProto::set_has_source_code_info() { _has_bits_[0] |= 0x00000010u; } inline void FileDescriptorProto::clear_has_source_code_info() { _has_bits_[0] &= ~0x00000010u; } inline void FileDescriptorProto::clear_source_code_info() { if (source_code_info_ != NULL) source_code_info_->Clear(); clear_has_source_code_info(); } inline const ::google::protobuf::SourceCodeInfo& FileDescriptorProto::source_code_info() const { const ::google::protobuf::SourceCodeInfo* p = source_code_info_; // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.source_code_info) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::_SourceCodeInfo_default_instance_); } inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::release_source_code_info() { // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.source_code_info) clear_has_source_code_info(); ::google::protobuf::SourceCodeInfo* temp = source_code_info_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } source_code_info_ = NULL; return temp; } inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::unsafe_arena_release_source_code_info() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileDescriptorProto.source_code_info) clear_has_source_code_info(); ::google::protobuf::SourceCodeInfo* temp = source_code_info_; source_code_info_ = NULL; return temp; } inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::mutable_source_code_info() { set_has_source_code_info(); if (source_code_info_ == NULL) { _slow_mutable_source_code_info(); } // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.source_code_info) return source_code_info_; } inline void FileDescriptorProto::set_allocated_source_code_info(::google::protobuf::SourceCodeInfo* source_code_info) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete source_code_info_; } if (source_code_info) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(source_code_info); if (message_arena != submessage_arena) { source_code_info = ::google::protobuf::internal::GetOwnedMessage( message_arena, source_code_info, submessage_arena); } set_has_source_code_info(); } else { clear_has_source_code_info(); } source_code_info_ = source_code_info; // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.source_code_info) } // optional string syntax = 12; inline bool FileDescriptorProto::has_syntax() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void FileDescriptorProto::set_has_syntax() { _has_bits_[0] |= 0x00000004u; } inline void FileDescriptorProto::clear_has_syntax() { _has_bits_[0] &= ~0x00000004u; } inline void FileDescriptorProto::clear_syntax() { syntax_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_syntax(); } inline const ::std::string& FileDescriptorProto::syntax() const { // @@protoc_insertion_point(field_get:google.protobuf.FileDescriptorProto.syntax) return syntax_.Get(); } inline void FileDescriptorProto::set_syntax(const ::std::string& value) { set_has_syntax(); syntax_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FileDescriptorProto.syntax) } #if LANG_CXX11 inline void FileDescriptorProto::set_syntax(::std::string&& value) { set_has_syntax(); syntax_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileDescriptorProto.syntax) } #endif inline void FileDescriptorProto::set_syntax(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_syntax(); syntax_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FileDescriptorProto.syntax) } inline void FileDescriptorProto::set_syntax(const char* value, size_t size) { set_has_syntax(); syntax_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileDescriptorProto.syntax) } inline ::std::string* FileDescriptorProto::mutable_syntax() { set_has_syntax(); // @@protoc_insertion_point(field_mutable:google.protobuf.FileDescriptorProto.syntax) return syntax_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FileDescriptorProto::release_syntax() { // @@protoc_insertion_point(field_release:google.protobuf.FileDescriptorProto.syntax) clear_has_syntax(); return syntax_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileDescriptorProto::set_allocated_syntax(::std::string* syntax) { if (syntax != NULL) { set_has_syntax(); } else { clear_has_syntax(); } syntax_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), syntax, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileDescriptorProto.syntax) } inline ::std::string* FileDescriptorProto::unsafe_arena_release_syntax() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileDescriptorProto.syntax) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_syntax(); return syntax_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileDescriptorProto::unsafe_arena_set_allocated_syntax( ::std::string* syntax) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (syntax != NULL) { set_has_syntax(); } else { clear_has_syntax(); } syntax_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), syntax, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileDescriptorProto.syntax) } // ------------------------------------------------------------------- // DescriptorProto_ExtensionRange // optional int32 start = 1; inline bool DescriptorProto_ExtensionRange::has_start() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void DescriptorProto_ExtensionRange::set_has_start() { _has_bits_[0] |= 0x00000002u; } inline void DescriptorProto_ExtensionRange::clear_has_start() { _has_bits_[0] &= ~0x00000002u; } inline void DescriptorProto_ExtensionRange::clear_start() { start_ = 0; clear_has_start(); } inline ::google::protobuf::int32 DescriptorProto_ExtensionRange::start() const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ExtensionRange.start) return start_; } inline void DescriptorProto_ExtensionRange::set_start(::google::protobuf::int32 value) { set_has_start(); start_ = value; // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.ExtensionRange.start) } // optional int32 end = 2; inline bool DescriptorProto_ExtensionRange::has_end() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void DescriptorProto_ExtensionRange::set_has_end() { _has_bits_[0] |= 0x00000004u; } inline void DescriptorProto_ExtensionRange::clear_has_end() { _has_bits_[0] &= ~0x00000004u; } inline void DescriptorProto_ExtensionRange::clear_end() { end_ = 0; clear_has_end(); } inline ::google::protobuf::int32 DescriptorProto_ExtensionRange::end() const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ExtensionRange.end) return end_; } inline void DescriptorProto_ExtensionRange::set_end(::google::protobuf::int32 value) { set_has_end(); end_ = value; // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.ExtensionRange.end) } // optional .google.protobuf.ExtensionRangeOptions options = 3; inline bool DescriptorProto_ExtensionRange::has_options() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void DescriptorProto_ExtensionRange::set_has_options() { _has_bits_[0] |= 0x00000001u; } inline void DescriptorProto_ExtensionRange::clear_has_options() { _has_bits_[0] &= ~0x00000001u; } inline void DescriptorProto_ExtensionRange::clear_options() { if (options_ != NULL) options_->Clear(); clear_has_options(); } inline const ::google::protobuf::ExtensionRangeOptions& DescriptorProto_ExtensionRange::options() const { const ::google::protobuf::ExtensionRangeOptions* p = options_; // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ExtensionRange.options) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::_ExtensionRangeOptions_default_instance_); } inline ::google::protobuf::ExtensionRangeOptions* DescriptorProto_ExtensionRange::release_options() { // @@protoc_insertion_point(field_release:google.protobuf.DescriptorProto.ExtensionRange.options) clear_has_options(); ::google::protobuf::ExtensionRangeOptions* temp = options_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } options_ = NULL; return temp; } inline ::google::protobuf::ExtensionRangeOptions* DescriptorProto_ExtensionRange::unsafe_arena_release_options() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.DescriptorProto.ExtensionRange.options) clear_has_options(); ::google::protobuf::ExtensionRangeOptions* temp = options_; options_ = NULL; return temp; } inline ::google::protobuf::ExtensionRangeOptions* DescriptorProto_ExtensionRange::mutable_options() { set_has_options(); if (options_ == NULL) { _slow_mutable_options(); } // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.ExtensionRange.options) return options_; } inline void DescriptorProto_ExtensionRange::set_allocated_options(::google::protobuf::ExtensionRangeOptions* options) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete options_; } if (options) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(options); if (message_arena != submessage_arena) { options = ::google::protobuf::internal::GetOwnedMessage( message_arena, options, submessage_arena); } set_has_options(); } else { clear_has_options(); } options_ = options; // @@protoc_insertion_point(field_set_allocated:google.protobuf.DescriptorProto.ExtensionRange.options) } // ------------------------------------------------------------------- // DescriptorProto_ReservedRange // optional int32 start = 1; inline bool DescriptorProto_ReservedRange::has_start() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void DescriptorProto_ReservedRange::set_has_start() { _has_bits_[0] |= 0x00000001u; } inline void DescriptorProto_ReservedRange::clear_has_start() { _has_bits_[0] &= ~0x00000001u; } inline void DescriptorProto_ReservedRange::clear_start() { start_ = 0; clear_has_start(); } inline ::google::protobuf::int32 DescriptorProto_ReservedRange::start() const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ReservedRange.start) return start_; } inline void DescriptorProto_ReservedRange::set_start(::google::protobuf::int32 value) { set_has_start(); start_ = value; // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.ReservedRange.start) } // optional int32 end = 2; inline bool DescriptorProto_ReservedRange::has_end() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void DescriptorProto_ReservedRange::set_has_end() { _has_bits_[0] |= 0x00000002u; } inline void DescriptorProto_ReservedRange::clear_has_end() { _has_bits_[0] &= ~0x00000002u; } inline void DescriptorProto_ReservedRange::clear_end() { end_ = 0; clear_has_end(); } inline ::google::protobuf::int32 DescriptorProto_ReservedRange::end() const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.ReservedRange.end) return end_; } inline void DescriptorProto_ReservedRange::set_end(::google::protobuf::int32 value) { set_has_end(); end_ = value; // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.ReservedRange.end) } // ------------------------------------------------------------------- // DescriptorProto // optional string name = 1; inline bool DescriptorProto::has_name() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void DescriptorProto::set_has_name() { _has_bits_[0] |= 0x00000001u; } inline void DescriptorProto::clear_has_name() { _has_bits_[0] &= ~0x00000001u; } inline void DescriptorProto::clear_name() { name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_name(); } inline const ::std::string& DescriptorProto::name() const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.name) return name_.Get(); } inline void DescriptorProto::set_name(const ::std::string& value) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.name) } #if LANG_CXX11 inline void DescriptorProto::set_name(::std::string&& value) { set_has_name(); name_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.DescriptorProto.name) } #endif inline void DescriptorProto::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.DescriptorProto.name) } inline void DescriptorProto::set_name(const char* value, size_t size) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.DescriptorProto.name) } inline ::std::string* DescriptorProto::mutable_name() { set_has_name(); // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.name) return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* DescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.DescriptorProto.name) clear_has_name(); return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void DescriptorProto::set_allocated_name(::std::string* name) { if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.DescriptorProto.name) } inline ::std::string* DescriptorProto::unsafe_arena_release_name() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.DescriptorProto.name) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_name(); return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void DescriptorProto::unsafe_arena_set_allocated_name( ::std::string* name) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.DescriptorProto.name) } // repeated .google.protobuf.FieldDescriptorProto field = 2; inline int DescriptorProto::field_size() const { return field_.size(); } inline void DescriptorProto::clear_field() { field_.Clear(); } inline const ::google::protobuf::FieldDescriptorProto& DescriptorProto::field(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.field) return field_.Get(index); } inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::mutable_field(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.field) return field_.Mutable(index); } inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::add_field() { // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.field) return field_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* DescriptorProto::mutable_field() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.field) return &field_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& DescriptorProto::field() const { // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.field) return field_; } // repeated .google.protobuf.FieldDescriptorProto extension = 6; inline int DescriptorProto::extension_size() const { return extension_.size(); } inline void DescriptorProto::clear_extension() { extension_.Clear(); } inline const ::google::protobuf::FieldDescriptorProto& DescriptorProto::extension(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.extension) return extension_.Get(index); } inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::mutable_extension(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.extension) return extension_.Mutable(index); } inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::add_extension() { // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.extension) return extension_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* DescriptorProto::mutable_extension() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.extension) return &extension_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& DescriptorProto::extension() const { // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.extension) return extension_; } // repeated .google.protobuf.DescriptorProto nested_type = 3; inline int DescriptorProto::nested_type_size() const { return nested_type_.size(); } inline void DescriptorProto::clear_nested_type() { nested_type_.Clear(); } inline const ::google::protobuf::DescriptorProto& DescriptorProto::nested_type(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.nested_type) return nested_type_.Get(index); } inline ::google::protobuf::DescriptorProto* DescriptorProto::mutable_nested_type(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.nested_type) return nested_type_.Mutable(index); } inline ::google::protobuf::DescriptorProto* DescriptorProto::add_nested_type() { // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.nested_type) return nested_type_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* DescriptorProto::mutable_nested_type() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.nested_type) return &nested_type_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& DescriptorProto::nested_type() const { // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.nested_type) return nested_type_; } // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; inline int DescriptorProto::enum_type_size() const { return enum_type_.size(); } inline void DescriptorProto::clear_enum_type() { enum_type_.Clear(); } inline const ::google::protobuf::EnumDescriptorProto& DescriptorProto::enum_type(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.enum_type) return enum_type_.Get(index); } inline ::google::protobuf::EnumDescriptorProto* DescriptorProto::mutable_enum_type(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.enum_type) return enum_type_.Mutable(index); } inline ::google::protobuf::EnumDescriptorProto* DescriptorProto::add_enum_type() { // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.enum_type) return enum_type_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* DescriptorProto::mutable_enum_type() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.enum_type) return &enum_type_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& DescriptorProto::enum_type() const { // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.enum_type) return enum_type_; } // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; inline int DescriptorProto::extension_range_size() const { return extension_range_.size(); } inline void DescriptorProto::clear_extension_range() { extension_range_.Clear(); } inline const ::google::protobuf::DescriptorProto_ExtensionRange& DescriptorProto::extension_range(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.extension_range) return extension_range_.Get(index); } inline ::google::protobuf::DescriptorProto_ExtensionRange* DescriptorProto::mutable_extension_range(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.extension_range) return extension_range_.Mutable(index); } inline ::google::protobuf::DescriptorProto_ExtensionRange* DescriptorProto::add_extension_range() { // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.extension_range) return extension_range_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >* DescriptorProto::mutable_extension_range() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.extension_range) return &extension_range_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >& DescriptorProto::extension_range() const { // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.extension_range) return extension_range_; } // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8; inline int DescriptorProto::oneof_decl_size() const { return oneof_decl_.size(); } inline void DescriptorProto::clear_oneof_decl() { oneof_decl_.Clear(); } inline const ::google::protobuf::OneofDescriptorProto& DescriptorProto::oneof_decl(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.oneof_decl) return oneof_decl_.Get(index); } inline ::google::protobuf::OneofDescriptorProto* DescriptorProto::mutable_oneof_decl(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.oneof_decl) return oneof_decl_.Mutable(index); } inline ::google::protobuf::OneofDescriptorProto* DescriptorProto::add_oneof_decl() { // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.oneof_decl) return oneof_decl_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto >* DescriptorProto::mutable_oneof_decl() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.oneof_decl) return &oneof_decl_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::OneofDescriptorProto >& DescriptorProto::oneof_decl() const { // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.oneof_decl) return oneof_decl_; } // optional .google.protobuf.MessageOptions options = 7; inline bool DescriptorProto::has_options() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void DescriptorProto::set_has_options() { _has_bits_[0] |= 0x00000002u; } inline void DescriptorProto::clear_has_options() { _has_bits_[0] &= ~0x00000002u; } inline void DescriptorProto::clear_options() { if (options_ != NULL) options_->Clear(); clear_has_options(); } inline const ::google::protobuf::MessageOptions& DescriptorProto::options() const { const ::google::protobuf::MessageOptions* p = options_; // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.options) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::_MessageOptions_default_instance_); } inline ::google::protobuf::MessageOptions* DescriptorProto::release_options() { // @@protoc_insertion_point(field_release:google.protobuf.DescriptorProto.options) clear_has_options(); ::google::protobuf::MessageOptions* temp = options_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } options_ = NULL; return temp; } inline ::google::protobuf::MessageOptions* DescriptorProto::unsafe_arena_release_options() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.DescriptorProto.options) clear_has_options(); ::google::protobuf::MessageOptions* temp = options_; options_ = NULL; return temp; } inline ::google::protobuf::MessageOptions* DescriptorProto::mutable_options() { set_has_options(); if (options_ == NULL) { _slow_mutable_options(); } // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.options) return options_; } inline void DescriptorProto::set_allocated_options(::google::protobuf::MessageOptions* options) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete options_; } if (options) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(options); if (message_arena != submessage_arena) { options = ::google::protobuf::internal::GetOwnedMessage( message_arena, options, submessage_arena); } set_has_options(); } else { clear_has_options(); } options_ = options; // @@protoc_insertion_point(field_set_allocated:google.protobuf.DescriptorProto.options) } // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9; inline int DescriptorProto::reserved_range_size() const { return reserved_range_.size(); } inline void DescriptorProto::clear_reserved_range() { reserved_range_.Clear(); } inline const ::google::protobuf::DescriptorProto_ReservedRange& DescriptorProto::reserved_range(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.reserved_range) return reserved_range_.Get(index); } inline ::google::protobuf::DescriptorProto_ReservedRange* DescriptorProto::mutable_reserved_range(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.reserved_range) return reserved_range_.Mutable(index); } inline ::google::protobuf::DescriptorProto_ReservedRange* DescriptorProto::add_reserved_range() { // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.reserved_range) return reserved_range_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ReservedRange >* DescriptorProto::mutable_reserved_range() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.reserved_range) return &reserved_range_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ReservedRange >& DescriptorProto::reserved_range() const { // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.reserved_range) return reserved_range_; } // repeated string reserved_name = 10; inline int DescriptorProto::reserved_name_size() const { return reserved_name_.size(); } inline void DescriptorProto::clear_reserved_name() { reserved_name_.Clear(); } inline const ::std::string& DescriptorProto::reserved_name(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.DescriptorProto.reserved_name) return reserved_name_.Get(index); } inline ::std::string* DescriptorProto::mutable_reserved_name(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.DescriptorProto.reserved_name) return reserved_name_.Mutable(index); } inline void DescriptorProto::set_reserved_name(int index, const ::std::string& value) { // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.reserved_name) reserved_name_.Mutable(index)->assign(value); } #if LANG_CXX11 inline void DescriptorProto::set_reserved_name(int index, ::std::string&& value) { // @@protoc_insertion_point(field_set:google.protobuf.DescriptorProto.reserved_name) reserved_name_.Mutable(index)->assign(std::move(value)); } #endif inline void DescriptorProto::set_reserved_name(int index, const char* value) { GOOGLE_DCHECK(value != NULL); 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) { reserved_name_.Mutable(index)->assign( reinterpret_cast(value), size); // @@protoc_insertion_point(field_set_pointer:google.protobuf.DescriptorProto.reserved_name) } inline ::std::string* DescriptorProto::add_reserved_name() { // @@protoc_insertion_point(field_add_mutable:google.protobuf.DescriptorProto.reserved_name) return reserved_name_.Add(); } inline void DescriptorProto::add_reserved_name(const ::std::string& value) { reserved_name_.Add()->assign(value); // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.reserved_name) } #if LANG_CXX11 inline void DescriptorProto::add_reserved_name(::std::string&& value) { reserved_name_.Add(std::move(value)); // @@protoc_insertion_point(field_add:google.protobuf.DescriptorProto.reserved_name) } #endif inline void DescriptorProto::add_reserved_name(const char* value) { GOOGLE_DCHECK(value != NULL); 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) { reserved_name_.Add()->assign(reinterpret_cast(value), size); // @@protoc_insertion_point(field_add_pointer:google.protobuf.DescriptorProto.reserved_name) } inline const ::google::protobuf::RepeatedPtrField< ::std::string>& DescriptorProto::reserved_name() const { // @@protoc_insertion_point(field_list:google.protobuf.DescriptorProto.reserved_name) return reserved_name_; } inline ::google::protobuf::RepeatedPtrField< ::std::string>* DescriptorProto::mutable_reserved_name() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.DescriptorProto.reserved_name) return &reserved_name_; } // ------------------------------------------------------------------- // ExtensionRangeOptions // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; inline int ExtensionRangeOptions::uninterpreted_option_size() const { return uninterpreted_option_.size(); } inline void ExtensionRangeOptions::clear_uninterpreted_option() { uninterpreted_option_.Clear(); } inline const ::google::protobuf::UninterpretedOption& ExtensionRangeOptions::uninterpreted_option(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.ExtensionRangeOptions.uninterpreted_option) return uninterpreted_option_.Get(index); } inline ::google::protobuf::UninterpretedOption* ExtensionRangeOptions::mutable_uninterpreted_option(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.ExtensionRangeOptions.uninterpreted_option) return uninterpreted_option_.Mutable(index); } inline ::google::protobuf::UninterpretedOption* ExtensionRangeOptions::add_uninterpreted_option() { // @@protoc_insertion_point(field_add:google.protobuf.ExtensionRangeOptions.uninterpreted_option) return uninterpreted_option_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* ExtensionRangeOptions::mutable_uninterpreted_option() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.ExtensionRangeOptions.uninterpreted_option) return &uninterpreted_option_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& ExtensionRangeOptions::uninterpreted_option() const { // @@protoc_insertion_point(field_list:google.protobuf.ExtensionRangeOptions.uninterpreted_option) return uninterpreted_option_; } // ------------------------------------------------------------------- // FieldDescriptorProto // optional string name = 1; inline bool FieldDescriptorProto::has_name() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void FieldDescriptorProto::set_has_name() { _has_bits_[0] |= 0x00000001u; } inline void FieldDescriptorProto::clear_has_name() { _has_bits_[0] &= ~0x00000001u; } inline void FieldDescriptorProto::clear_name() { name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_name(); } inline const ::std::string& FieldDescriptorProto::name() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.name) return name_.Get(); } inline void FieldDescriptorProto::set_name(const ::std::string& value) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.name) } #if LANG_CXX11 inline void FieldDescriptorProto::set_name(::std::string&& value) { set_has_name(); name_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FieldDescriptorProto.name) } #endif inline void FieldDescriptorProto::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.name) } inline void FieldDescriptorProto::set_name(const char* value, size_t size) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.name) } inline ::std::string* FieldDescriptorProto::mutable_name() { set_has_name(); // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.name) return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FieldDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.name) clear_has_name(); return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FieldDescriptorProto::set_allocated_name(::std::string* name) { if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.name) } inline ::std::string* FieldDescriptorProto::unsafe_arena_release_name() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.name) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_name(); return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FieldDescriptorProto::unsafe_arena_set_allocated_name( ::std::string* name) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.name) } // optional int32 number = 3; inline bool FieldDescriptorProto::has_number() const { return (_has_bits_[0] & 0x00000040u) != 0; } inline void FieldDescriptorProto::set_has_number() { _has_bits_[0] |= 0x00000040u; } inline void FieldDescriptorProto::clear_has_number() { _has_bits_[0] &= ~0x00000040u; } inline void FieldDescriptorProto::clear_number() { number_ = 0; clear_has_number(); } inline ::google::protobuf::int32 FieldDescriptorProto::number() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.number) return number_; } inline void FieldDescriptorProto::set_number(::google::protobuf::int32 value) { set_has_number(); number_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.number) } // optional .google.protobuf.FieldDescriptorProto.Label label = 4; inline bool FieldDescriptorProto::has_label() const { return (_has_bits_[0] & 0x00000100u) != 0; } inline void FieldDescriptorProto::set_has_label() { _has_bits_[0] |= 0x00000100u; } inline void FieldDescriptorProto::clear_has_label() { _has_bits_[0] &= ~0x00000100u; } inline void FieldDescriptorProto::clear_label() { label_ = 1; clear_has_label(); } inline ::google::protobuf::FieldDescriptorProto_Label FieldDescriptorProto::label() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.label) return static_cast< ::google::protobuf::FieldDescriptorProto_Label >(label_); } inline void FieldDescriptorProto::set_label(::google::protobuf::FieldDescriptorProto_Label value) { assert(::google::protobuf::FieldDescriptorProto_Label_IsValid(value)); set_has_label(); label_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.label) } // optional .google.protobuf.FieldDescriptorProto.Type type = 5; inline bool FieldDescriptorProto::has_type() const { return (_has_bits_[0] & 0x00000200u) != 0; } inline void FieldDescriptorProto::set_has_type() { _has_bits_[0] |= 0x00000200u; } inline void FieldDescriptorProto::clear_has_type() { _has_bits_[0] &= ~0x00000200u; } inline void FieldDescriptorProto::clear_type() { type_ = 1; clear_has_type(); } inline ::google::protobuf::FieldDescriptorProto_Type FieldDescriptorProto::type() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.type) return static_cast< ::google::protobuf::FieldDescriptorProto_Type >(type_); } inline void FieldDescriptorProto::set_type(::google::protobuf::FieldDescriptorProto_Type value) { assert(::google::protobuf::FieldDescriptorProto_Type_IsValid(value)); set_has_type(); type_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.type) } // optional string type_name = 6; inline bool FieldDescriptorProto::has_type_name() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void FieldDescriptorProto::set_has_type_name() { _has_bits_[0] |= 0x00000004u; } inline void FieldDescriptorProto::clear_has_type_name() { _has_bits_[0] &= ~0x00000004u; } inline void FieldDescriptorProto::clear_type_name() { type_name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_type_name(); } inline const ::std::string& FieldDescriptorProto::type_name() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.type_name) return type_name_.Get(); } inline void FieldDescriptorProto::set_type_name(const ::std::string& value) { set_has_type_name(); type_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.type_name) } #if LANG_CXX11 inline void FieldDescriptorProto::set_type_name(::std::string&& value) { set_has_type_name(); type_name_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FieldDescriptorProto.type_name) } #endif inline void FieldDescriptorProto::set_type_name(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_type_name(); type_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.type_name) } inline void FieldDescriptorProto::set_type_name(const char* value, size_t size) { set_has_type_name(); type_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.type_name) } inline ::std::string* FieldDescriptorProto::mutable_type_name() { set_has_type_name(); // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.type_name) return type_name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FieldDescriptorProto::release_type_name() { // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.type_name) clear_has_type_name(); return type_name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FieldDescriptorProto::set_allocated_type_name(::std::string* type_name) { if (type_name != NULL) { set_has_type_name(); } else { clear_has_type_name(); } type_name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), type_name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.type_name) } inline ::std::string* FieldDescriptorProto::unsafe_arena_release_type_name() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.type_name) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_type_name(); return type_name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FieldDescriptorProto::unsafe_arena_set_allocated_type_name( ::std::string* type_name) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (type_name != NULL) { set_has_type_name(); } else { clear_has_type_name(); } type_name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), type_name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.type_name) } // optional string extendee = 2; inline bool FieldDescriptorProto::has_extendee() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void FieldDescriptorProto::set_has_extendee() { _has_bits_[0] |= 0x00000002u; } inline void FieldDescriptorProto::clear_has_extendee() { _has_bits_[0] &= ~0x00000002u; } inline void FieldDescriptorProto::clear_extendee() { extendee_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_extendee(); } inline const ::std::string& FieldDescriptorProto::extendee() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.extendee) return extendee_.Get(); } inline void FieldDescriptorProto::set_extendee(const ::std::string& value) { set_has_extendee(); extendee_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.extendee) } #if LANG_CXX11 inline void FieldDescriptorProto::set_extendee(::std::string&& value) { set_has_extendee(); extendee_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FieldDescriptorProto.extendee) } #endif inline void FieldDescriptorProto::set_extendee(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_extendee(); extendee_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.extendee) } inline void FieldDescriptorProto::set_extendee(const char* value, size_t size) { set_has_extendee(); extendee_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.extendee) } inline ::std::string* FieldDescriptorProto::mutable_extendee() { set_has_extendee(); // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.extendee) return extendee_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FieldDescriptorProto::release_extendee() { // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.extendee) clear_has_extendee(); return extendee_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FieldDescriptorProto::set_allocated_extendee(::std::string* extendee) { if (extendee != NULL) { set_has_extendee(); } else { clear_has_extendee(); } extendee_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), extendee, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.extendee) } inline ::std::string* FieldDescriptorProto::unsafe_arena_release_extendee() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.extendee) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_extendee(); return extendee_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FieldDescriptorProto::unsafe_arena_set_allocated_extendee( ::std::string* extendee) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (extendee != NULL) { set_has_extendee(); } else { clear_has_extendee(); } extendee_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), extendee, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.extendee) } // optional string default_value = 7; inline bool FieldDescriptorProto::has_default_value() const { return (_has_bits_[0] & 0x00000008u) != 0; } inline void FieldDescriptorProto::set_has_default_value() { _has_bits_[0] |= 0x00000008u; } inline void FieldDescriptorProto::clear_has_default_value() { _has_bits_[0] &= ~0x00000008u; } inline void FieldDescriptorProto::clear_default_value() { default_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_default_value(); } inline const ::std::string& FieldDescriptorProto::default_value() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.default_value) return default_value_.Get(); } inline void FieldDescriptorProto::set_default_value(const ::std::string& value) { set_has_default_value(); default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.default_value) } #if LANG_CXX11 inline void FieldDescriptorProto::set_default_value(::std::string&& value) { set_has_default_value(); default_value_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FieldDescriptorProto.default_value) } #endif inline void FieldDescriptorProto::set_default_value(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_default_value(); default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.default_value) } inline void FieldDescriptorProto::set_default_value(const char* value, size_t size) { set_has_default_value(); default_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.default_value) } inline ::std::string* FieldDescriptorProto::mutable_default_value() { set_has_default_value(); // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.default_value) return default_value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FieldDescriptorProto::release_default_value() { // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.default_value) clear_has_default_value(); return default_value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FieldDescriptorProto::set_allocated_default_value(::std::string* default_value) { if (default_value != NULL) { set_has_default_value(); } else { clear_has_default_value(); } default_value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), default_value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.default_value) } inline ::std::string* FieldDescriptorProto::unsafe_arena_release_default_value() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.default_value) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_default_value(); return default_value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FieldDescriptorProto::unsafe_arena_set_allocated_default_value( ::std::string* default_value) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (default_value != NULL) { set_has_default_value(); } else { clear_has_default_value(); } default_value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), default_value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.default_value) } // optional int32 oneof_index = 9; inline bool FieldDescriptorProto::has_oneof_index() const { return (_has_bits_[0] & 0x00000080u) != 0; } inline void FieldDescriptorProto::set_has_oneof_index() { _has_bits_[0] |= 0x00000080u; } inline void FieldDescriptorProto::clear_has_oneof_index() { _has_bits_[0] &= ~0x00000080u; } inline void FieldDescriptorProto::clear_oneof_index() { oneof_index_ = 0; clear_has_oneof_index(); } inline ::google::protobuf::int32 FieldDescriptorProto::oneof_index() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.oneof_index) return oneof_index_; } inline void FieldDescriptorProto::set_oneof_index(::google::protobuf::int32 value) { set_has_oneof_index(); oneof_index_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.oneof_index) } // optional string json_name = 10; inline bool FieldDescriptorProto::has_json_name() const { return (_has_bits_[0] & 0x00000010u) != 0; } inline void FieldDescriptorProto::set_has_json_name() { _has_bits_[0] |= 0x00000010u; } inline void FieldDescriptorProto::clear_has_json_name() { _has_bits_[0] &= ~0x00000010u; } inline void FieldDescriptorProto::clear_json_name() { json_name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_json_name(); } inline const ::std::string& FieldDescriptorProto::json_name() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.json_name) return json_name_.Get(); } inline void FieldDescriptorProto::set_json_name(const ::std::string& value) { set_has_json_name(); json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FieldDescriptorProto.json_name) } #if LANG_CXX11 inline void FieldDescriptorProto::set_json_name(::std::string&& value) { set_has_json_name(); json_name_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FieldDescriptorProto.json_name) } #endif inline void FieldDescriptorProto::set_json_name(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_json_name(); json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FieldDescriptorProto.json_name) } inline void FieldDescriptorProto::set_json_name(const char* value, size_t size) { set_has_json_name(); json_name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldDescriptorProto.json_name) } inline ::std::string* FieldDescriptorProto::mutable_json_name() { set_has_json_name(); // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.json_name) return json_name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FieldDescriptorProto::release_json_name() { // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.json_name) clear_has_json_name(); return json_name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FieldDescriptorProto::set_allocated_json_name(::std::string* json_name) { if (json_name != NULL) { set_has_json_name(); } else { clear_has_json_name(); } json_name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), json_name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.json_name) } inline ::std::string* FieldDescriptorProto::unsafe_arena_release_json_name() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.json_name) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_json_name(); return json_name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FieldDescriptorProto::unsafe_arena_set_allocated_json_name( ::std::string* json_name) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (json_name != NULL) { set_has_json_name(); } else { clear_has_json_name(); } json_name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), json_name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FieldDescriptorProto.json_name) } // optional .google.protobuf.FieldOptions options = 8; inline bool FieldDescriptorProto::has_options() const { return (_has_bits_[0] & 0x00000020u) != 0; } inline void FieldDescriptorProto::set_has_options() { _has_bits_[0] |= 0x00000020u; } inline void FieldDescriptorProto::clear_has_options() { _has_bits_[0] &= ~0x00000020u; } inline void FieldDescriptorProto::clear_options() { if (options_ != NULL) options_->Clear(); clear_has_options(); } inline const ::google::protobuf::FieldOptions& FieldDescriptorProto::options() const { const ::google::protobuf::FieldOptions* p = options_; // @@protoc_insertion_point(field_get:google.protobuf.FieldDescriptorProto.options) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::_FieldOptions_default_instance_); } inline ::google::protobuf::FieldOptions* FieldDescriptorProto::release_options() { // @@protoc_insertion_point(field_release:google.protobuf.FieldDescriptorProto.options) clear_has_options(); ::google::protobuf::FieldOptions* temp = options_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } options_ = NULL; return temp; } inline ::google::protobuf::FieldOptions* FieldDescriptorProto::unsafe_arena_release_options() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FieldDescriptorProto.options) clear_has_options(); ::google::protobuf::FieldOptions* temp = options_; options_ = NULL; return temp; } inline ::google::protobuf::FieldOptions* FieldDescriptorProto::mutable_options() { set_has_options(); if (options_ == NULL) { _slow_mutable_options(); } // @@protoc_insertion_point(field_mutable:google.protobuf.FieldDescriptorProto.options) return options_; } inline void FieldDescriptorProto::set_allocated_options(::google::protobuf::FieldOptions* options) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete options_; } if (options) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(options); if (message_arena != submessage_arena) { options = ::google::protobuf::internal::GetOwnedMessage( message_arena, options, submessage_arena); } set_has_options(); } else { clear_has_options(); } options_ = options; // @@protoc_insertion_point(field_set_allocated:google.protobuf.FieldDescriptorProto.options) } // ------------------------------------------------------------------- // OneofDescriptorProto // optional string name = 1; inline bool OneofDescriptorProto::has_name() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void OneofDescriptorProto::set_has_name() { _has_bits_[0] |= 0x00000001u; } inline void OneofDescriptorProto::clear_has_name() { _has_bits_[0] &= ~0x00000001u; } inline void OneofDescriptorProto::clear_name() { name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_name(); } inline const ::std::string& OneofDescriptorProto::name() const { // @@protoc_insertion_point(field_get:google.protobuf.OneofDescriptorProto.name) return name_.Get(); } inline void OneofDescriptorProto::set_name(const ::std::string& value) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.OneofDescriptorProto.name) } #if LANG_CXX11 inline void OneofDescriptorProto::set_name(::std::string&& value) { set_has_name(); name_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.OneofDescriptorProto.name) } #endif inline void OneofDescriptorProto::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.OneofDescriptorProto.name) } inline void OneofDescriptorProto::set_name(const char* value, size_t size) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.OneofDescriptorProto.name) } inline ::std::string* OneofDescriptorProto::mutable_name() { set_has_name(); // @@protoc_insertion_point(field_mutable:google.protobuf.OneofDescriptorProto.name) return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* OneofDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.OneofDescriptorProto.name) clear_has_name(); return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void OneofDescriptorProto::set_allocated_name(::std::string* name) { if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.OneofDescriptorProto.name) } inline ::std::string* OneofDescriptorProto::unsafe_arena_release_name() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.OneofDescriptorProto.name) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_name(); return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void OneofDescriptorProto::unsafe_arena_set_allocated_name( ::std::string* name) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.OneofDescriptorProto.name) } // optional .google.protobuf.OneofOptions options = 2; inline bool OneofDescriptorProto::has_options() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void OneofDescriptorProto::set_has_options() { _has_bits_[0] |= 0x00000002u; } inline void OneofDescriptorProto::clear_has_options() { _has_bits_[0] &= ~0x00000002u; } inline void OneofDescriptorProto::clear_options() { if (options_ != NULL) options_->Clear(); clear_has_options(); } inline const ::google::protobuf::OneofOptions& OneofDescriptorProto::options() const { const ::google::protobuf::OneofOptions* p = options_; // @@protoc_insertion_point(field_get:google.protobuf.OneofDescriptorProto.options) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::_OneofOptions_default_instance_); } inline ::google::protobuf::OneofOptions* OneofDescriptorProto::release_options() { // @@protoc_insertion_point(field_release:google.protobuf.OneofDescriptorProto.options) clear_has_options(); ::google::protobuf::OneofOptions* temp = options_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } options_ = NULL; return temp; } inline ::google::protobuf::OneofOptions* OneofDescriptorProto::unsafe_arena_release_options() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.OneofDescriptorProto.options) clear_has_options(); ::google::protobuf::OneofOptions* temp = options_; options_ = NULL; return temp; } inline ::google::protobuf::OneofOptions* OneofDescriptorProto::mutable_options() { set_has_options(); if (options_ == NULL) { _slow_mutable_options(); } // @@protoc_insertion_point(field_mutable:google.protobuf.OneofDescriptorProto.options) return options_; } inline void OneofDescriptorProto::set_allocated_options(::google::protobuf::OneofOptions* options) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete options_; } if (options) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(options); if (message_arena != submessage_arena) { options = ::google::protobuf::internal::GetOwnedMessage( message_arena, options, submessage_arena); } set_has_options(); } else { clear_has_options(); } options_ = options; // @@protoc_insertion_point(field_set_allocated:google.protobuf.OneofDescriptorProto.options) } // ------------------------------------------------------------------- // EnumDescriptorProto_EnumReservedRange // optional int32 start = 1; inline bool EnumDescriptorProto_EnumReservedRange::has_start() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void EnumDescriptorProto_EnumReservedRange::set_has_start() { _has_bits_[0] |= 0x00000001u; } inline void EnumDescriptorProto_EnumReservedRange::clear_has_start() { _has_bits_[0] &= ~0x00000001u; } inline void EnumDescriptorProto_EnumReservedRange::clear_start() { start_ = 0; clear_has_start(); } inline ::google::protobuf::int32 EnumDescriptorProto_EnumReservedRange::start() const { // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.EnumReservedRange.start) return start_; } inline void EnumDescriptorProto_EnumReservedRange::set_start(::google::protobuf::int32 value) { set_has_start(); start_ = value; // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.EnumReservedRange.start) } // optional int32 end = 2; inline bool EnumDescriptorProto_EnumReservedRange::has_end() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void EnumDescriptorProto_EnumReservedRange::set_has_end() { _has_bits_[0] |= 0x00000002u; } inline void EnumDescriptorProto_EnumReservedRange::clear_has_end() { _has_bits_[0] &= ~0x00000002u; } inline void EnumDescriptorProto_EnumReservedRange::clear_end() { end_ = 0; clear_has_end(); } inline ::google::protobuf::int32 EnumDescriptorProto_EnumReservedRange::end() const { // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.EnumReservedRange.end) return end_; } inline void EnumDescriptorProto_EnumReservedRange::set_end(::google::protobuf::int32 value) { set_has_end(); end_ = value; // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.EnumReservedRange.end) } // ------------------------------------------------------------------- // EnumDescriptorProto // optional string name = 1; inline bool EnumDescriptorProto::has_name() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void EnumDescriptorProto::set_has_name() { _has_bits_[0] |= 0x00000001u; } inline void EnumDescriptorProto::clear_has_name() { _has_bits_[0] &= ~0x00000001u; } inline void EnumDescriptorProto::clear_name() { name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_name(); } inline const ::std::string& EnumDescriptorProto::name() const { // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.name) return name_.Get(); } inline void EnumDescriptorProto::set_name(const ::std::string& value) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.name) } #if LANG_CXX11 inline void EnumDescriptorProto::set_name(::std::string&& value) { set_has_name(); name_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.EnumDescriptorProto.name) } #endif inline void EnumDescriptorProto::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.EnumDescriptorProto.name) } inline void EnumDescriptorProto::set_name(const char* value, size_t size) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumDescriptorProto.name) } inline ::std::string* EnumDescriptorProto::mutable_name() { set_has_name(); // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.name) return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* EnumDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.EnumDescriptorProto.name) clear_has_name(); return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void EnumDescriptorProto::set_allocated_name(::std::string* name) { if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumDescriptorProto.name) } inline ::std::string* EnumDescriptorProto::unsafe_arena_release_name() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.EnumDescriptorProto.name) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_name(); return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void EnumDescriptorProto::unsafe_arena_set_allocated_name( ::std::string* name) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.EnumDescriptorProto.name) } // repeated .google.protobuf.EnumValueDescriptorProto value = 2; inline int EnumDescriptorProto::value_size() const { return value_.size(); } inline void EnumDescriptorProto::clear_value() { value_.Clear(); } inline const ::google::protobuf::EnumValueDescriptorProto& EnumDescriptorProto::value(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.value) return value_.Get(index); } inline ::google::protobuf::EnumValueDescriptorProto* EnumDescriptorProto::mutable_value(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.value) return value_.Mutable(index); } inline ::google::protobuf::EnumValueDescriptorProto* EnumDescriptorProto::add_value() { // @@protoc_insertion_point(field_add:google.protobuf.EnumDescriptorProto.value) return value_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >* EnumDescriptorProto::mutable_value() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumDescriptorProto.value) return &value_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >& EnumDescriptorProto::value() const { // @@protoc_insertion_point(field_list:google.protobuf.EnumDescriptorProto.value) return value_; } // optional .google.protobuf.EnumOptions options = 3; inline bool EnumDescriptorProto::has_options() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void EnumDescriptorProto::set_has_options() { _has_bits_[0] |= 0x00000002u; } inline void EnumDescriptorProto::clear_has_options() { _has_bits_[0] &= ~0x00000002u; } inline void EnumDescriptorProto::clear_options() { if (options_ != NULL) options_->Clear(); clear_has_options(); } inline const ::google::protobuf::EnumOptions& EnumDescriptorProto::options() const { const ::google::protobuf::EnumOptions* p = options_; // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.options) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::_EnumOptions_default_instance_); } inline ::google::protobuf::EnumOptions* EnumDescriptorProto::release_options() { // @@protoc_insertion_point(field_release:google.protobuf.EnumDescriptorProto.options) clear_has_options(); ::google::protobuf::EnumOptions* temp = options_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } options_ = NULL; return temp; } inline ::google::protobuf::EnumOptions* EnumDescriptorProto::unsafe_arena_release_options() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.EnumDescriptorProto.options) clear_has_options(); ::google::protobuf::EnumOptions* temp = options_; options_ = NULL; return temp; } inline ::google::protobuf::EnumOptions* EnumDescriptorProto::mutable_options() { set_has_options(); if (options_ == NULL) { _slow_mutable_options(); } // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.options) return options_; } inline void EnumDescriptorProto::set_allocated_options(::google::protobuf::EnumOptions* options) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete options_; } if (options) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(options); if (message_arena != submessage_arena) { options = ::google::protobuf::internal::GetOwnedMessage( message_arena, options, submessage_arena); } set_has_options(); } else { clear_has_options(); } options_ = options; // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumDescriptorProto.options) } // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4; inline int EnumDescriptorProto::reserved_range_size() const { return reserved_range_.size(); } inline void EnumDescriptorProto::clear_reserved_range() { reserved_range_.Clear(); } inline const ::google::protobuf::EnumDescriptorProto_EnumReservedRange& EnumDescriptorProto::reserved_range(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.reserved_range) return reserved_range_.Get(index); } inline ::google::protobuf::EnumDescriptorProto_EnumReservedRange* EnumDescriptorProto::mutable_reserved_range(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.reserved_range) return reserved_range_.Mutable(index); } inline ::google::protobuf::EnumDescriptorProto_EnumReservedRange* EnumDescriptorProto::add_reserved_range() { // @@protoc_insertion_point(field_add:google.protobuf.EnumDescriptorProto.reserved_range) return reserved_range_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto_EnumReservedRange >* EnumDescriptorProto::mutable_reserved_range() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumDescriptorProto.reserved_range) return &reserved_range_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto_EnumReservedRange >& EnumDescriptorProto::reserved_range() const { // @@protoc_insertion_point(field_list:google.protobuf.EnumDescriptorProto.reserved_range) return reserved_range_; } // repeated string reserved_name = 5; inline int EnumDescriptorProto::reserved_name_size() const { return reserved_name_.size(); } inline void EnumDescriptorProto::clear_reserved_name() { reserved_name_.Clear(); } inline const ::std::string& EnumDescriptorProto::reserved_name(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.EnumDescriptorProto.reserved_name) return reserved_name_.Get(index); } inline ::std::string* EnumDescriptorProto::mutable_reserved_name(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.EnumDescriptorProto.reserved_name) return reserved_name_.Mutable(index); } inline void EnumDescriptorProto::set_reserved_name(int index, const ::std::string& value) { // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.reserved_name) reserved_name_.Mutable(index)->assign(value); } #if LANG_CXX11 inline void EnumDescriptorProto::set_reserved_name(int index, ::std::string&& value) { // @@protoc_insertion_point(field_set:google.protobuf.EnumDescriptorProto.reserved_name) reserved_name_.Mutable(index)->assign(std::move(value)); } #endif inline void EnumDescriptorProto::set_reserved_name(int index, const char* value) { GOOGLE_DCHECK(value != NULL); 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) { reserved_name_.Mutable(index)->assign( reinterpret_cast(value), size); // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumDescriptorProto.reserved_name) } inline ::std::string* EnumDescriptorProto::add_reserved_name() { // @@protoc_insertion_point(field_add_mutable:google.protobuf.EnumDescriptorProto.reserved_name) return reserved_name_.Add(); } inline void EnumDescriptorProto::add_reserved_name(const ::std::string& value) { reserved_name_.Add()->assign(value); // @@protoc_insertion_point(field_add:google.protobuf.EnumDescriptorProto.reserved_name) } #if LANG_CXX11 inline void EnumDescriptorProto::add_reserved_name(::std::string&& value) { reserved_name_.Add(std::move(value)); // @@protoc_insertion_point(field_add:google.protobuf.EnumDescriptorProto.reserved_name) } #endif inline void EnumDescriptorProto::add_reserved_name(const char* value) { GOOGLE_DCHECK(value != NULL); 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) { reserved_name_.Add()->assign(reinterpret_cast(value), size); // @@protoc_insertion_point(field_add_pointer:google.protobuf.EnumDescriptorProto.reserved_name) } inline const ::google::protobuf::RepeatedPtrField< ::std::string>& EnumDescriptorProto::reserved_name() const { // @@protoc_insertion_point(field_list:google.protobuf.EnumDescriptorProto.reserved_name) return reserved_name_; } inline ::google::protobuf::RepeatedPtrField< ::std::string>* EnumDescriptorProto::mutable_reserved_name() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumDescriptorProto.reserved_name) return &reserved_name_; } // ------------------------------------------------------------------- // EnumValueDescriptorProto // optional string name = 1; inline bool EnumValueDescriptorProto::has_name() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void EnumValueDescriptorProto::set_has_name() { _has_bits_[0] |= 0x00000001u; } inline void EnumValueDescriptorProto::clear_has_name() { _has_bits_[0] &= ~0x00000001u; } inline void EnumValueDescriptorProto::clear_name() { name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_name(); } inline const ::std::string& EnumValueDescriptorProto::name() const { // @@protoc_insertion_point(field_get:google.protobuf.EnumValueDescriptorProto.name) return name_.Get(); } inline void EnumValueDescriptorProto::set_name(const ::std::string& value) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.EnumValueDescriptorProto.name) } #if LANG_CXX11 inline void EnumValueDescriptorProto::set_name(::std::string&& value) { set_has_name(); name_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.EnumValueDescriptorProto.name) } #endif inline void EnumValueDescriptorProto::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.EnumValueDescriptorProto.name) } inline void EnumValueDescriptorProto::set_name(const char* value, size_t size) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.EnumValueDescriptorProto.name) } inline ::std::string* EnumValueDescriptorProto::mutable_name() { set_has_name(); // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueDescriptorProto.name) return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* EnumValueDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.EnumValueDescriptorProto.name) clear_has_name(); return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void EnumValueDescriptorProto::set_allocated_name(::std::string* name) { if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumValueDescriptorProto.name) } inline ::std::string* EnumValueDescriptorProto::unsafe_arena_release_name() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.EnumValueDescriptorProto.name) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_name(); return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void EnumValueDescriptorProto::unsafe_arena_set_allocated_name( ::std::string* name) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.EnumValueDescriptorProto.name) } // optional int32 number = 2; inline bool EnumValueDescriptorProto::has_number() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void EnumValueDescriptorProto::set_has_number() { _has_bits_[0] |= 0x00000004u; } inline void EnumValueDescriptorProto::clear_has_number() { _has_bits_[0] &= ~0x00000004u; } inline void EnumValueDescriptorProto::clear_number() { number_ = 0; clear_has_number(); } inline ::google::protobuf::int32 EnumValueDescriptorProto::number() const { // @@protoc_insertion_point(field_get:google.protobuf.EnumValueDescriptorProto.number) return number_; } inline void EnumValueDescriptorProto::set_number(::google::protobuf::int32 value) { set_has_number(); number_ = value; // @@protoc_insertion_point(field_set:google.protobuf.EnumValueDescriptorProto.number) } // optional .google.protobuf.EnumValueOptions options = 3; inline bool EnumValueDescriptorProto::has_options() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void EnumValueDescriptorProto::set_has_options() { _has_bits_[0] |= 0x00000002u; } inline void EnumValueDescriptorProto::clear_has_options() { _has_bits_[0] &= ~0x00000002u; } inline void EnumValueDescriptorProto::clear_options() { if (options_ != NULL) options_->Clear(); clear_has_options(); } inline const ::google::protobuf::EnumValueOptions& EnumValueDescriptorProto::options() const { const ::google::protobuf::EnumValueOptions* p = options_; // @@protoc_insertion_point(field_get:google.protobuf.EnumValueDescriptorProto.options) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::_EnumValueOptions_default_instance_); } inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::release_options() { // @@protoc_insertion_point(field_release:google.protobuf.EnumValueDescriptorProto.options) clear_has_options(); ::google::protobuf::EnumValueOptions* temp = options_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } options_ = NULL; return temp; } inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::unsafe_arena_release_options() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.EnumValueDescriptorProto.options) clear_has_options(); ::google::protobuf::EnumValueOptions* temp = options_; options_ = NULL; return temp; } inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::mutable_options() { set_has_options(); if (options_ == NULL) { _slow_mutable_options(); } // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueDescriptorProto.options) return options_; } inline void EnumValueDescriptorProto::set_allocated_options(::google::protobuf::EnumValueOptions* options) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete options_; } if (options) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(options); if (message_arena != submessage_arena) { options = ::google::protobuf::internal::GetOwnedMessage( message_arena, options, submessage_arena); } set_has_options(); } else { clear_has_options(); } options_ = options; // @@protoc_insertion_point(field_set_allocated:google.protobuf.EnumValueDescriptorProto.options) } // ------------------------------------------------------------------- // ServiceDescriptorProto // optional string name = 1; inline bool ServiceDescriptorProto::has_name() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void ServiceDescriptorProto::set_has_name() { _has_bits_[0] |= 0x00000001u; } inline void ServiceDescriptorProto::clear_has_name() { _has_bits_[0] &= ~0x00000001u; } inline void ServiceDescriptorProto::clear_name() { name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_name(); } inline const ::std::string& ServiceDescriptorProto::name() const { // @@protoc_insertion_point(field_get:google.protobuf.ServiceDescriptorProto.name) return name_.Get(); } inline void ServiceDescriptorProto::set_name(const ::std::string& value) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.ServiceDescriptorProto.name) } #if LANG_CXX11 inline void ServiceDescriptorProto::set_name(::std::string&& value) { set_has_name(); name_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.ServiceDescriptorProto.name) } #endif inline void ServiceDescriptorProto::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.ServiceDescriptorProto.name) } inline void ServiceDescriptorProto::set_name(const char* value, size_t size) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.ServiceDescriptorProto.name) } inline ::std::string* ServiceDescriptorProto::mutable_name() { set_has_name(); // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.name) return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* ServiceDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.ServiceDescriptorProto.name) clear_has_name(); return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void ServiceDescriptorProto::set_allocated_name(::std::string* name) { if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.ServiceDescriptorProto.name) } inline ::std::string* ServiceDescriptorProto::unsafe_arena_release_name() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.ServiceDescriptorProto.name) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_name(); return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void ServiceDescriptorProto::unsafe_arena_set_allocated_name( ::std::string* name) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.ServiceDescriptorProto.name) } // repeated .google.protobuf.MethodDescriptorProto method = 2; inline int ServiceDescriptorProto::method_size() const { return method_.size(); } inline void ServiceDescriptorProto::clear_method() { method_.Clear(); } inline const ::google::protobuf::MethodDescriptorProto& ServiceDescriptorProto::method(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.ServiceDescriptorProto.method) return method_.Get(index); } inline ::google::protobuf::MethodDescriptorProto* ServiceDescriptorProto::mutable_method(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.method) return method_.Mutable(index); } inline ::google::protobuf::MethodDescriptorProto* ServiceDescriptorProto::add_method() { // @@protoc_insertion_point(field_add:google.protobuf.ServiceDescriptorProto.method) return method_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >* ServiceDescriptorProto::mutable_method() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.ServiceDescriptorProto.method) return &method_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >& ServiceDescriptorProto::method() const { // @@protoc_insertion_point(field_list:google.protobuf.ServiceDescriptorProto.method) return method_; } // optional .google.protobuf.ServiceOptions options = 3; inline bool ServiceDescriptorProto::has_options() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void ServiceDescriptorProto::set_has_options() { _has_bits_[0] |= 0x00000002u; } inline void ServiceDescriptorProto::clear_has_options() { _has_bits_[0] &= ~0x00000002u; } inline void ServiceDescriptorProto::clear_options() { if (options_ != NULL) options_->Clear(); clear_has_options(); } inline const ::google::protobuf::ServiceOptions& ServiceDescriptorProto::options() const { const ::google::protobuf::ServiceOptions* p = options_; // @@protoc_insertion_point(field_get:google.protobuf.ServiceDescriptorProto.options) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::_ServiceOptions_default_instance_); } inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::release_options() { // @@protoc_insertion_point(field_release:google.protobuf.ServiceDescriptorProto.options) clear_has_options(); ::google::protobuf::ServiceOptions* temp = options_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } options_ = NULL; return temp; } inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::unsafe_arena_release_options() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.ServiceDescriptorProto.options) clear_has_options(); ::google::protobuf::ServiceOptions* temp = options_; options_ = NULL; return temp; } inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::mutable_options() { set_has_options(); if (options_ == NULL) { _slow_mutable_options(); } // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceDescriptorProto.options) return options_; } inline void ServiceDescriptorProto::set_allocated_options(::google::protobuf::ServiceOptions* options) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete options_; } if (options) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(options); if (message_arena != submessage_arena) { options = ::google::protobuf::internal::GetOwnedMessage( message_arena, options, submessage_arena); } set_has_options(); } else { clear_has_options(); } options_ = options; // @@protoc_insertion_point(field_set_allocated:google.protobuf.ServiceDescriptorProto.options) } // ------------------------------------------------------------------- // MethodDescriptorProto // optional string name = 1; inline bool MethodDescriptorProto::has_name() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void MethodDescriptorProto::set_has_name() { _has_bits_[0] |= 0x00000001u; } inline void MethodDescriptorProto::clear_has_name() { _has_bits_[0] &= ~0x00000001u; } inline void MethodDescriptorProto::clear_name() { name_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_name(); } inline const ::std::string& MethodDescriptorProto::name() const { // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.name) return name_.Get(); } inline void MethodDescriptorProto::set_name(const ::std::string& value) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.name) } #if LANG_CXX11 inline void MethodDescriptorProto::set_name(::std::string&& value) { set_has_name(); name_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.MethodDescriptorProto.name) } #endif inline void MethodDescriptorProto::set_name(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.name) } inline void MethodDescriptorProto::set_name(const char* value, size_t size) { set_has_name(); name_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.name) } inline ::std::string* MethodDescriptorProto::mutable_name() { set_has_name(); // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.name) return name_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* MethodDescriptorProto::release_name() { // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.name) clear_has_name(); return name_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void MethodDescriptorProto::set_allocated_name(::std::string* name) { if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.name) } inline ::std::string* MethodDescriptorProto::unsafe_arena_release_name() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.MethodDescriptorProto.name) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_name(); return name_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void MethodDescriptorProto::unsafe_arena_set_allocated_name( ::std::string* name) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (name != NULL) { set_has_name(); } else { clear_has_name(); } name_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.MethodDescriptorProto.name) } // optional string input_type = 2; inline bool MethodDescriptorProto::has_input_type() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void MethodDescriptorProto::set_has_input_type() { _has_bits_[0] |= 0x00000002u; } inline void MethodDescriptorProto::clear_has_input_type() { _has_bits_[0] &= ~0x00000002u; } inline void MethodDescriptorProto::clear_input_type() { input_type_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_input_type(); } inline const ::std::string& MethodDescriptorProto::input_type() const { // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.input_type) return input_type_.Get(); } inline void MethodDescriptorProto::set_input_type(const ::std::string& value) { set_has_input_type(); input_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.input_type) } #if LANG_CXX11 inline void MethodDescriptorProto::set_input_type(::std::string&& value) { set_has_input_type(); input_type_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.MethodDescriptorProto.input_type) } #endif inline void MethodDescriptorProto::set_input_type(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_input_type(); input_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.input_type) } inline void MethodDescriptorProto::set_input_type(const char* value, size_t size) { set_has_input_type(); input_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.input_type) } inline ::std::string* MethodDescriptorProto::mutable_input_type() { set_has_input_type(); // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.input_type) return input_type_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* MethodDescriptorProto::release_input_type() { // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.input_type) clear_has_input_type(); return input_type_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void MethodDescriptorProto::set_allocated_input_type(::std::string* input_type) { if (input_type != NULL) { set_has_input_type(); } else { clear_has_input_type(); } input_type_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), input_type, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.input_type) } inline ::std::string* MethodDescriptorProto::unsafe_arena_release_input_type() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.MethodDescriptorProto.input_type) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_input_type(); return input_type_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void MethodDescriptorProto::unsafe_arena_set_allocated_input_type( ::std::string* input_type) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (input_type != NULL) { set_has_input_type(); } else { clear_has_input_type(); } input_type_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), input_type, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.MethodDescriptorProto.input_type) } // optional string output_type = 3; inline bool MethodDescriptorProto::has_output_type() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void MethodDescriptorProto::set_has_output_type() { _has_bits_[0] |= 0x00000004u; } inline void MethodDescriptorProto::clear_has_output_type() { _has_bits_[0] &= ~0x00000004u; } inline void MethodDescriptorProto::clear_output_type() { output_type_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_output_type(); } inline const ::std::string& MethodDescriptorProto::output_type() const { // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.output_type) return output_type_.Get(); } inline void MethodDescriptorProto::set_output_type(const ::std::string& value) { set_has_output_type(); output_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.output_type) } #if LANG_CXX11 inline void MethodDescriptorProto::set_output_type(::std::string&& value) { set_has_output_type(); output_type_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.MethodDescriptorProto.output_type) } #endif inline void MethodDescriptorProto::set_output_type(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_output_type(); output_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.MethodDescriptorProto.output_type) } inline void MethodDescriptorProto::set_output_type(const char* value, size_t size) { set_has_output_type(); output_type_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.MethodDescriptorProto.output_type) } inline ::std::string* MethodDescriptorProto::mutable_output_type() { set_has_output_type(); // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.output_type) return output_type_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* MethodDescriptorProto::release_output_type() { // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.output_type) clear_has_output_type(); return output_type_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void MethodDescriptorProto::set_allocated_output_type(::std::string* output_type) { if (output_type != NULL) { set_has_output_type(); } else { clear_has_output_type(); } output_type_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), output_type, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.output_type) } inline ::std::string* MethodDescriptorProto::unsafe_arena_release_output_type() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.MethodDescriptorProto.output_type) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_output_type(); return output_type_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void MethodDescriptorProto::unsafe_arena_set_allocated_output_type( ::std::string* output_type) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (output_type != NULL) { set_has_output_type(); } else { clear_has_output_type(); } output_type_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), output_type, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.MethodDescriptorProto.output_type) } // optional .google.protobuf.MethodOptions options = 4; inline bool MethodDescriptorProto::has_options() const { return (_has_bits_[0] & 0x00000008u) != 0; } inline void MethodDescriptorProto::set_has_options() { _has_bits_[0] |= 0x00000008u; } inline void MethodDescriptorProto::clear_has_options() { _has_bits_[0] &= ~0x00000008u; } inline void MethodDescriptorProto::clear_options() { if (options_ != NULL) options_->Clear(); clear_has_options(); } inline const ::google::protobuf::MethodOptions& MethodDescriptorProto::options() const { const ::google::protobuf::MethodOptions* p = options_; // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.options) return p != NULL ? *p : *reinterpret_cast( &::google::protobuf::_MethodOptions_default_instance_); } inline ::google::protobuf::MethodOptions* MethodDescriptorProto::release_options() { // @@protoc_insertion_point(field_release:google.protobuf.MethodDescriptorProto.options) clear_has_options(); ::google::protobuf::MethodOptions* temp = options_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } options_ = NULL; return temp; } inline ::google::protobuf::MethodOptions* MethodDescriptorProto::unsafe_arena_release_options() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.MethodDescriptorProto.options) clear_has_options(); ::google::protobuf::MethodOptions* temp = options_; options_ = NULL; return temp; } inline ::google::protobuf::MethodOptions* MethodDescriptorProto::mutable_options() { set_has_options(); if (options_ == NULL) { _slow_mutable_options(); } // @@protoc_insertion_point(field_mutable:google.protobuf.MethodDescriptorProto.options) return options_; } inline void MethodDescriptorProto::set_allocated_options(::google::protobuf::MethodOptions* options) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); if (message_arena == NULL) { delete options_; } if (options) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(options); if (message_arena != submessage_arena) { options = ::google::protobuf::internal::GetOwnedMessage( message_arena, options, submessage_arena); } set_has_options(); } else { clear_has_options(); } options_ = options; // @@protoc_insertion_point(field_set_allocated:google.protobuf.MethodDescriptorProto.options) } // optional bool client_streaming = 5 [default = false]; inline bool MethodDescriptorProto::has_client_streaming() const { return (_has_bits_[0] & 0x00000010u) != 0; } inline void MethodDescriptorProto::set_has_client_streaming() { _has_bits_[0] |= 0x00000010u; } inline void MethodDescriptorProto::clear_has_client_streaming() { _has_bits_[0] &= ~0x00000010u; } inline void MethodDescriptorProto::clear_client_streaming() { client_streaming_ = false; clear_has_client_streaming(); } inline bool MethodDescriptorProto::client_streaming() const { // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.client_streaming) return client_streaming_; } inline void MethodDescriptorProto::set_client_streaming(bool value) { set_has_client_streaming(); client_streaming_ = value; // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.client_streaming) } // optional bool server_streaming = 6 [default = false]; inline bool MethodDescriptorProto::has_server_streaming() const { return (_has_bits_[0] & 0x00000020u) != 0; } inline void MethodDescriptorProto::set_has_server_streaming() { _has_bits_[0] |= 0x00000020u; } inline void MethodDescriptorProto::clear_has_server_streaming() { _has_bits_[0] &= ~0x00000020u; } inline void MethodDescriptorProto::clear_server_streaming() { server_streaming_ = false; clear_has_server_streaming(); } inline bool MethodDescriptorProto::server_streaming() const { // @@protoc_insertion_point(field_get:google.protobuf.MethodDescriptorProto.server_streaming) return server_streaming_; } inline void MethodDescriptorProto::set_server_streaming(bool value) { set_has_server_streaming(); server_streaming_ = value; // @@protoc_insertion_point(field_set:google.protobuf.MethodDescriptorProto.server_streaming) } // ------------------------------------------------------------------- // FileOptions // optional string java_package = 1; inline bool FileOptions::has_java_package() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void FileOptions::set_has_java_package() { _has_bits_[0] |= 0x00000001u; } inline void FileOptions::clear_has_java_package() { _has_bits_[0] &= ~0x00000001u; } inline void FileOptions::clear_java_package() { java_package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_java_package(); } inline const ::std::string& FileOptions::java_package() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_package) return java_package_.Get(); } inline void FileOptions::set_java_package(const ::std::string& value) { set_has_java_package(); java_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_package) } #if LANG_CXX11 inline void FileOptions::set_java_package(::std::string&& value) { set_has_java_package(); java_package_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.java_package) } #endif inline void FileOptions::set_java_package(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_java_package(); java_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.java_package) } inline void FileOptions::set_java_package(const char* value, size_t size) { set_has_java_package(); java_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.java_package) } inline ::std::string* FileOptions::mutable_java_package() { set_has_java_package(); // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.java_package) return java_package_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FileOptions::release_java_package() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.java_package) clear_has_java_package(); return java_package_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::set_allocated_java_package(::std::string* java_package) { if (java_package != NULL) { set_has_java_package(); } else { clear_has_java_package(); } java_package_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), java_package, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.java_package) } inline ::std::string* FileOptions::unsafe_arena_release_java_package() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.java_package) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_java_package(); return java_package_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::unsafe_arena_set_allocated_java_package( ::std::string* java_package) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (java_package != NULL) { set_has_java_package(); } else { clear_has_java_package(); } java_package_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), java_package, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.java_package) } // optional string java_outer_classname = 8; inline bool FileOptions::has_java_outer_classname() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void FileOptions::set_has_java_outer_classname() { _has_bits_[0] |= 0x00000002u; } inline void FileOptions::clear_has_java_outer_classname() { _has_bits_[0] &= ~0x00000002u; } inline void FileOptions::clear_java_outer_classname() { java_outer_classname_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_java_outer_classname(); } inline const ::std::string& FileOptions::java_outer_classname() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_outer_classname) return java_outer_classname_.Get(); } inline void FileOptions::set_java_outer_classname(const ::std::string& value) { set_has_java_outer_classname(); java_outer_classname_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_outer_classname) } #if LANG_CXX11 inline void FileOptions::set_java_outer_classname(::std::string&& value) { set_has_java_outer_classname(); java_outer_classname_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.java_outer_classname) } #endif inline void FileOptions::set_java_outer_classname(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_java_outer_classname(); java_outer_classname_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.java_outer_classname) } inline void FileOptions::set_java_outer_classname(const char* value, size_t size) { set_has_java_outer_classname(); java_outer_classname_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.java_outer_classname) } inline ::std::string* FileOptions::mutable_java_outer_classname() { set_has_java_outer_classname(); // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.java_outer_classname) return java_outer_classname_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FileOptions::release_java_outer_classname() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.java_outer_classname) clear_has_java_outer_classname(); return java_outer_classname_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::set_allocated_java_outer_classname(::std::string* java_outer_classname) { if (java_outer_classname != NULL) { set_has_java_outer_classname(); } else { clear_has_java_outer_classname(); } java_outer_classname_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), java_outer_classname, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.java_outer_classname) } inline ::std::string* FileOptions::unsafe_arena_release_java_outer_classname() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.java_outer_classname) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_java_outer_classname(); return java_outer_classname_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::unsafe_arena_set_allocated_java_outer_classname( ::std::string* java_outer_classname) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (java_outer_classname != NULL) { set_has_java_outer_classname(); } else { clear_has_java_outer_classname(); } java_outer_classname_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), java_outer_classname, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.java_outer_classname) } // optional bool java_multiple_files = 10 [default = false]; inline bool FileOptions::has_java_multiple_files() const { return (_has_bits_[0] & 0x00000200u) != 0; } inline void FileOptions::set_has_java_multiple_files() { _has_bits_[0] |= 0x00000200u; } inline void FileOptions::clear_has_java_multiple_files() { _has_bits_[0] &= ~0x00000200u; } inline void FileOptions::clear_java_multiple_files() { java_multiple_files_ = false; clear_has_java_multiple_files(); } inline bool FileOptions::java_multiple_files() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_multiple_files) return java_multiple_files_; } inline void FileOptions::set_java_multiple_files(bool value) { set_has_java_multiple_files(); java_multiple_files_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_multiple_files) } // optional bool java_generate_equals_and_hash = 20 [deprecated = true]; inline bool FileOptions::has_java_generate_equals_and_hash() const { return (_has_bits_[0] & 0x00000400u) != 0; } inline void FileOptions::set_has_java_generate_equals_and_hash() { _has_bits_[0] |= 0x00000400u; } inline void FileOptions::clear_has_java_generate_equals_and_hash() { _has_bits_[0] &= ~0x00000400u; } inline void FileOptions::clear_java_generate_equals_and_hash() { java_generate_equals_and_hash_ = false; clear_has_java_generate_equals_and_hash(); } inline bool FileOptions::java_generate_equals_and_hash() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_generate_equals_and_hash) return java_generate_equals_and_hash_; } inline void FileOptions::set_java_generate_equals_and_hash(bool value) { set_has_java_generate_equals_and_hash(); java_generate_equals_and_hash_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_generate_equals_and_hash) } // optional bool java_string_check_utf8 = 27 [default = false]; inline bool FileOptions::has_java_string_check_utf8() const { return (_has_bits_[0] & 0x00000800u) != 0; } inline void FileOptions::set_has_java_string_check_utf8() { _has_bits_[0] |= 0x00000800u; } inline void FileOptions::clear_has_java_string_check_utf8() { _has_bits_[0] &= ~0x00000800u; } inline void FileOptions::clear_java_string_check_utf8() { java_string_check_utf8_ = false; clear_has_java_string_check_utf8(); } inline bool FileOptions::java_string_check_utf8() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_string_check_utf8) return java_string_check_utf8_; } inline void FileOptions::set_java_string_check_utf8(bool value) { set_has_java_string_check_utf8(); java_string_check_utf8_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_string_check_utf8) } // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; inline bool FileOptions::has_optimize_for() const { return (_has_bits_[0] & 0x00020000u) != 0; } inline void FileOptions::set_has_optimize_for() { _has_bits_[0] |= 0x00020000u; } inline void FileOptions::clear_has_optimize_for() { _has_bits_[0] &= ~0x00020000u; } inline void FileOptions::clear_optimize_for() { optimize_for_ = 1; clear_has_optimize_for(); } inline ::google::protobuf::FileOptions_OptimizeMode FileOptions::optimize_for() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.optimize_for) return static_cast< ::google::protobuf::FileOptions_OptimizeMode >(optimize_for_); } inline void FileOptions::set_optimize_for(::google::protobuf::FileOptions_OptimizeMode value) { assert(::google::protobuf::FileOptions_OptimizeMode_IsValid(value)); set_has_optimize_for(); optimize_for_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.optimize_for) } // optional string go_package = 11; inline bool FileOptions::has_go_package() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void FileOptions::set_has_go_package() { _has_bits_[0] |= 0x00000004u; } inline void FileOptions::clear_has_go_package() { _has_bits_[0] &= ~0x00000004u; } inline void FileOptions::clear_go_package() { go_package_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_go_package(); } inline const ::std::string& FileOptions::go_package() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.go_package) return go_package_.Get(); } inline void FileOptions::set_go_package(const ::std::string& value) { set_has_go_package(); go_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.go_package) } #if LANG_CXX11 inline void FileOptions::set_go_package(::std::string&& value) { set_has_go_package(); go_package_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.go_package) } #endif inline void FileOptions::set_go_package(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_go_package(); go_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.go_package) } inline void FileOptions::set_go_package(const char* value, size_t size) { set_has_go_package(); go_package_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.go_package) } inline ::std::string* FileOptions::mutable_go_package() { set_has_go_package(); // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.go_package) return go_package_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FileOptions::release_go_package() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.go_package) clear_has_go_package(); return go_package_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::set_allocated_go_package(::std::string* go_package) { if (go_package != NULL) { set_has_go_package(); } else { clear_has_go_package(); } go_package_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), go_package, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.go_package) } inline ::std::string* FileOptions::unsafe_arena_release_go_package() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.go_package) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_go_package(); return go_package_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::unsafe_arena_set_allocated_go_package( ::std::string* go_package) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (go_package != NULL) { set_has_go_package(); } else { clear_has_go_package(); } go_package_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), go_package, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.go_package) } // optional bool cc_generic_services = 16 [default = false]; inline bool FileOptions::has_cc_generic_services() const { return (_has_bits_[0] & 0x00001000u) != 0; } inline void FileOptions::set_has_cc_generic_services() { _has_bits_[0] |= 0x00001000u; } inline void FileOptions::clear_has_cc_generic_services() { _has_bits_[0] &= ~0x00001000u; } inline void FileOptions::clear_cc_generic_services() { cc_generic_services_ = false; clear_has_cc_generic_services(); } inline bool FileOptions::cc_generic_services() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.cc_generic_services) return cc_generic_services_; } inline void FileOptions::set_cc_generic_services(bool value) { set_has_cc_generic_services(); cc_generic_services_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.cc_generic_services) } // optional bool java_generic_services = 17 [default = false]; inline bool FileOptions::has_java_generic_services() const { return (_has_bits_[0] & 0x00002000u) != 0; } inline void FileOptions::set_has_java_generic_services() { _has_bits_[0] |= 0x00002000u; } inline void FileOptions::clear_has_java_generic_services() { _has_bits_[0] &= ~0x00002000u; } inline void FileOptions::clear_java_generic_services() { java_generic_services_ = false; clear_has_java_generic_services(); } inline bool FileOptions::java_generic_services() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.java_generic_services) return java_generic_services_; } inline void FileOptions::set_java_generic_services(bool value) { set_has_java_generic_services(); java_generic_services_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.java_generic_services) } // optional bool py_generic_services = 18 [default = false]; inline bool FileOptions::has_py_generic_services() const { return (_has_bits_[0] & 0x00004000u) != 0; } inline void FileOptions::set_has_py_generic_services() { _has_bits_[0] |= 0x00004000u; } inline void FileOptions::clear_has_py_generic_services() { _has_bits_[0] &= ~0x00004000u; } inline void FileOptions::clear_py_generic_services() { py_generic_services_ = false; clear_has_py_generic_services(); } inline bool FileOptions::py_generic_services() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.py_generic_services) return py_generic_services_; } inline void FileOptions::set_py_generic_services(bool value) { set_has_py_generic_services(); py_generic_services_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.py_generic_services) } // optional bool php_generic_services = 42 [default = false]; inline bool FileOptions::has_php_generic_services() const { return (_has_bits_[0] & 0x00008000u) != 0; } inline void FileOptions::set_has_php_generic_services() { _has_bits_[0] |= 0x00008000u; } inline void FileOptions::clear_has_php_generic_services() { _has_bits_[0] &= ~0x00008000u; } inline void FileOptions::clear_php_generic_services() { php_generic_services_ = false; clear_has_php_generic_services(); } inline bool FileOptions::php_generic_services() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.php_generic_services) return php_generic_services_; } inline void FileOptions::set_php_generic_services(bool value) { set_has_php_generic_services(); php_generic_services_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.php_generic_services) } // optional bool deprecated = 23 [default = false]; inline bool FileOptions::has_deprecated() const { return (_has_bits_[0] & 0x00010000u) != 0; } inline void FileOptions::set_has_deprecated() { _has_bits_[0] |= 0x00010000u; } inline void FileOptions::clear_has_deprecated() { _has_bits_[0] &= ~0x00010000u; } inline void FileOptions::clear_deprecated() { deprecated_ = false; clear_has_deprecated(); } inline bool FileOptions::deprecated() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.deprecated) return deprecated_; } inline void FileOptions::set_deprecated(bool value) { set_has_deprecated(); deprecated_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.deprecated) } // optional bool cc_enable_arenas = 31 [default = false]; inline bool FileOptions::has_cc_enable_arenas() const { return (_has_bits_[0] & 0x00000100u) != 0; } inline void FileOptions::set_has_cc_enable_arenas() { _has_bits_[0] |= 0x00000100u; } inline void FileOptions::clear_has_cc_enable_arenas() { _has_bits_[0] &= ~0x00000100u; } inline void FileOptions::clear_cc_enable_arenas() { cc_enable_arenas_ = false; clear_has_cc_enable_arenas(); } inline bool FileOptions::cc_enable_arenas() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.cc_enable_arenas) return cc_enable_arenas_; } inline void FileOptions::set_cc_enable_arenas(bool value) { set_has_cc_enable_arenas(); cc_enable_arenas_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.cc_enable_arenas) } // optional string objc_class_prefix = 36; inline bool FileOptions::has_objc_class_prefix() const { return (_has_bits_[0] & 0x00000008u) != 0; } inline void FileOptions::set_has_objc_class_prefix() { _has_bits_[0] |= 0x00000008u; } inline void FileOptions::clear_has_objc_class_prefix() { _has_bits_[0] &= ~0x00000008u; } inline void FileOptions::clear_objc_class_prefix() { objc_class_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_objc_class_prefix(); } inline const ::std::string& FileOptions::objc_class_prefix() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.objc_class_prefix) return objc_class_prefix_.Get(); } inline void FileOptions::set_objc_class_prefix(const ::std::string& value) { set_has_objc_class_prefix(); objc_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.objc_class_prefix) } #if LANG_CXX11 inline void FileOptions::set_objc_class_prefix(::std::string&& value) { set_has_objc_class_prefix(); objc_class_prefix_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.objc_class_prefix) } #endif inline void FileOptions::set_objc_class_prefix(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_objc_class_prefix(); objc_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.objc_class_prefix) } inline void FileOptions::set_objc_class_prefix(const char* value, size_t size) { set_has_objc_class_prefix(); objc_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.objc_class_prefix) } inline ::std::string* FileOptions::mutable_objc_class_prefix() { set_has_objc_class_prefix(); // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.objc_class_prefix) return objc_class_prefix_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FileOptions::release_objc_class_prefix() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.objc_class_prefix) clear_has_objc_class_prefix(); return objc_class_prefix_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::set_allocated_objc_class_prefix(::std::string* objc_class_prefix) { if (objc_class_prefix != NULL) { set_has_objc_class_prefix(); } else { clear_has_objc_class_prefix(); } objc_class_prefix_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), objc_class_prefix, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.objc_class_prefix) } inline ::std::string* FileOptions::unsafe_arena_release_objc_class_prefix() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.objc_class_prefix) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_objc_class_prefix(); return objc_class_prefix_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::unsafe_arena_set_allocated_objc_class_prefix( ::std::string* objc_class_prefix) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (objc_class_prefix != NULL) { set_has_objc_class_prefix(); } else { clear_has_objc_class_prefix(); } objc_class_prefix_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), objc_class_prefix, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.objc_class_prefix) } // optional string csharp_namespace = 37; inline bool FileOptions::has_csharp_namespace() const { return (_has_bits_[0] & 0x00000010u) != 0; } inline void FileOptions::set_has_csharp_namespace() { _has_bits_[0] |= 0x00000010u; } inline void FileOptions::clear_has_csharp_namespace() { _has_bits_[0] &= ~0x00000010u; } inline void FileOptions::clear_csharp_namespace() { csharp_namespace_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_csharp_namespace(); } inline const ::std::string& FileOptions::csharp_namespace() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.csharp_namespace) return csharp_namespace_.Get(); } inline void FileOptions::set_csharp_namespace(const ::std::string& value) { set_has_csharp_namespace(); csharp_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.csharp_namespace) } #if LANG_CXX11 inline void FileOptions::set_csharp_namespace(::std::string&& value) { set_has_csharp_namespace(); csharp_namespace_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.csharp_namespace) } #endif inline void FileOptions::set_csharp_namespace(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_csharp_namespace(); csharp_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.csharp_namespace) } inline void FileOptions::set_csharp_namespace(const char* value, size_t size) { set_has_csharp_namespace(); csharp_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.csharp_namespace) } inline ::std::string* FileOptions::mutable_csharp_namespace() { set_has_csharp_namespace(); // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.csharp_namespace) return csharp_namespace_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FileOptions::release_csharp_namespace() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.csharp_namespace) clear_has_csharp_namespace(); return csharp_namespace_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::set_allocated_csharp_namespace(::std::string* csharp_namespace) { if (csharp_namespace != NULL) { set_has_csharp_namespace(); } else { clear_has_csharp_namespace(); } csharp_namespace_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), csharp_namespace, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.csharp_namespace) } inline ::std::string* FileOptions::unsafe_arena_release_csharp_namespace() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.csharp_namespace) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_csharp_namespace(); return csharp_namespace_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::unsafe_arena_set_allocated_csharp_namespace( ::std::string* csharp_namespace) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (csharp_namespace != NULL) { set_has_csharp_namespace(); } else { clear_has_csharp_namespace(); } csharp_namespace_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), csharp_namespace, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.csharp_namespace) } // optional string swift_prefix = 39; inline bool FileOptions::has_swift_prefix() const { return (_has_bits_[0] & 0x00000020u) != 0; } inline void FileOptions::set_has_swift_prefix() { _has_bits_[0] |= 0x00000020u; } inline void FileOptions::clear_has_swift_prefix() { _has_bits_[0] &= ~0x00000020u; } inline void FileOptions::clear_swift_prefix() { swift_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_swift_prefix(); } inline const ::std::string& FileOptions::swift_prefix() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.swift_prefix) return swift_prefix_.Get(); } inline void FileOptions::set_swift_prefix(const ::std::string& value) { set_has_swift_prefix(); swift_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.swift_prefix) } #if LANG_CXX11 inline void FileOptions::set_swift_prefix(::std::string&& value) { set_has_swift_prefix(); swift_prefix_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.swift_prefix) } #endif inline void FileOptions::set_swift_prefix(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_swift_prefix(); swift_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.swift_prefix) } inline void FileOptions::set_swift_prefix(const char* value, size_t size) { set_has_swift_prefix(); swift_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.swift_prefix) } inline ::std::string* FileOptions::mutable_swift_prefix() { set_has_swift_prefix(); // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.swift_prefix) return swift_prefix_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FileOptions::release_swift_prefix() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.swift_prefix) clear_has_swift_prefix(); return swift_prefix_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::set_allocated_swift_prefix(::std::string* swift_prefix) { if (swift_prefix != NULL) { set_has_swift_prefix(); } else { clear_has_swift_prefix(); } swift_prefix_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), swift_prefix, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.swift_prefix) } inline ::std::string* FileOptions::unsafe_arena_release_swift_prefix() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.swift_prefix) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_swift_prefix(); return swift_prefix_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::unsafe_arena_set_allocated_swift_prefix( ::std::string* swift_prefix) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (swift_prefix != NULL) { set_has_swift_prefix(); } else { clear_has_swift_prefix(); } swift_prefix_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), swift_prefix, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.swift_prefix) } // optional string php_class_prefix = 40; inline bool FileOptions::has_php_class_prefix() const { return (_has_bits_[0] & 0x00000040u) != 0; } inline void FileOptions::set_has_php_class_prefix() { _has_bits_[0] |= 0x00000040u; } inline void FileOptions::clear_has_php_class_prefix() { _has_bits_[0] &= ~0x00000040u; } inline void FileOptions::clear_php_class_prefix() { php_class_prefix_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_php_class_prefix(); } inline const ::std::string& FileOptions::php_class_prefix() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.php_class_prefix) return php_class_prefix_.Get(); } inline void FileOptions::set_php_class_prefix(const ::std::string& value) { set_has_php_class_prefix(); php_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.php_class_prefix) } #if LANG_CXX11 inline void FileOptions::set_php_class_prefix(::std::string&& value) { set_has_php_class_prefix(); php_class_prefix_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.php_class_prefix) } #endif inline void FileOptions::set_php_class_prefix(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_php_class_prefix(); php_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.php_class_prefix) } inline void FileOptions::set_php_class_prefix(const char* value, size_t size) { set_has_php_class_prefix(); php_class_prefix_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.php_class_prefix) } inline ::std::string* FileOptions::mutable_php_class_prefix() { set_has_php_class_prefix(); // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.php_class_prefix) return php_class_prefix_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FileOptions::release_php_class_prefix() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.php_class_prefix) clear_has_php_class_prefix(); return php_class_prefix_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::set_allocated_php_class_prefix(::std::string* php_class_prefix) { if (php_class_prefix != NULL) { set_has_php_class_prefix(); } else { clear_has_php_class_prefix(); } php_class_prefix_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), php_class_prefix, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.php_class_prefix) } inline ::std::string* FileOptions::unsafe_arena_release_php_class_prefix() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.php_class_prefix) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_php_class_prefix(); return php_class_prefix_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::unsafe_arena_set_allocated_php_class_prefix( ::std::string* php_class_prefix) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (php_class_prefix != NULL) { set_has_php_class_prefix(); } else { clear_has_php_class_prefix(); } php_class_prefix_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), php_class_prefix, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.php_class_prefix) } // optional string php_namespace = 41; inline bool FileOptions::has_php_namespace() const { return (_has_bits_[0] & 0x00000080u) != 0; } inline void FileOptions::set_has_php_namespace() { _has_bits_[0] |= 0x00000080u; } inline void FileOptions::clear_has_php_namespace() { _has_bits_[0] &= ~0x00000080u; } inline void FileOptions::clear_php_namespace() { php_namespace_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_php_namespace(); } inline const ::std::string& FileOptions::php_namespace() const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.php_namespace) return php_namespace_.Get(); } inline void FileOptions::set_php_namespace(const ::std::string& value) { set_has_php_namespace(); php_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.FileOptions.php_namespace) } #if LANG_CXX11 inline void FileOptions::set_php_namespace(::std::string&& value) { set_has_php_namespace(); php_namespace_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.FileOptions.php_namespace) } #endif inline void FileOptions::set_php_namespace(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_php_namespace(); php_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.FileOptions.php_namespace) } inline void FileOptions::set_php_namespace(const char* value, size_t size) { set_has_php_namespace(); php_namespace_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FileOptions.php_namespace) } inline ::std::string* FileOptions::mutable_php_namespace() { set_has_php_namespace(); // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.php_namespace) return php_namespace_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* FileOptions::release_php_namespace() { // @@protoc_insertion_point(field_release:google.protobuf.FileOptions.php_namespace) clear_has_php_namespace(); return php_namespace_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::set_allocated_php_namespace(::std::string* php_namespace) { if (php_namespace != NULL) { set_has_php_namespace(); } else { clear_has_php_namespace(); } php_namespace_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), php_namespace, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.FileOptions.php_namespace) } inline ::std::string* FileOptions::unsafe_arena_release_php_namespace() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.FileOptions.php_namespace) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_php_namespace(); return php_namespace_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void FileOptions::unsafe_arena_set_allocated_php_namespace( ::std::string* php_namespace) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (php_namespace != NULL) { set_has_php_namespace(); } else { clear_has_php_namespace(); } php_namespace_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), php_namespace, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.FileOptions.php_namespace) } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; inline int FileOptions::uninterpreted_option_size() const { return uninterpreted_option_.size(); } inline void FileOptions::clear_uninterpreted_option() { uninterpreted_option_.Clear(); } inline const ::google::protobuf::UninterpretedOption& FileOptions::uninterpreted_option(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.FileOptions.uninterpreted_option) return uninterpreted_option_.Get(index); } inline ::google::protobuf::UninterpretedOption* FileOptions::mutable_uninterpreted_option(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.FileOptions.uninterpreted_option) return uninterpreted_option_.Mutable(index); } inline ::google::protobuf::UninterpretedOption* FileOptions::add_uninterpreted_option() { // @@protoc_insertion_point(field_add:google.protobuf.FileOptions.uninterpreted_option) return uninterpreted_option_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* FileOptions::mutable_uninterpreted_option() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.FileOptions.uninterpreted_option) return &uninterpreted_option_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& FileOptions::uninterpreted_option() const { // @@protoc_insertion_point(field_list:google.protobuf.FileOptions.uninterpreted_option) return uninterpreted_option_; } // ------------------------------------------------------------------- // MessageOptions // optional bool message_set_wire_format = 1 [default = false]; inline bool MessageOptions::has_message_set_wire_format() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void MessageOptions::set_has_message_set_wire_format() { _has_bits_[0] |= 0x00000001u; } inline void MessageOptions::clear_has_message_set_wire_format() { _has_bits_[0] &= ~0x00000001u; } inline void MessageOptions::clear_message_set_wire_format() { message_set_wire_format_ = false; clear_has_message_set_wire_format(); } inline bool MessageOptions::message_set_wire_format() const { // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.message_set_wire_format) return message_set_wire_format_; } inline void MessageOptions::set_message_set_wire_format(bool value) { set_has_message_set_wire_format(); message_set_wire_format_ = value; // @@protoc_insertion_point(field_set:google.protobuf.MessageOptions.message_set_wire_format) } // optional bool no_standard_descriptor_accessor = 2 [default = false]; inline bool MessageOptions::has_no_standard_descriptor_accessor() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void MessageOptions::set_has_no_standard_descriptor_accessor() { _has_bits_[0] |= 0x00000002u; } inline void MessageOptions::clear_has_no_standard_descriptor_accessor() { _has_bits_[0] &= ~0x00000002u; } inline void MessageOptions::clear_no_standard_descriptor_accessor() { no_standard_descriptor_accessor_ = false; clear_has_no_standard_descriptor_accessor(); } inline bool MessageOptions::no_standard_descriptor_accessor() const { // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.no_standard_descriptor_accessor) return no_standard_descriptor_accessor_; } inline void MessageOptions::set_no_standard_descriptor_accessor(bool value) { set_has_no_standard_descriptor_accessor(); no_standard_descriptor_accessor_ = value; // @@protoc_insertion_point(field_set:google.protobuf.MessageOptions.no_standard_descriptor_accessor) } // optional bool deprecated = 3 [default = false]; inline bool MessageOptions::has_deprecated() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void MessageOptions::set_has_deprecated() { _has_bits_[0] |= 0x00000004u; } inline void MessageOptions::clear_has_deprecated() { _has_bits_[0] &= ~0x00000004u; } inline void MessageOptions::clear_deprecated() { deprecated_ = false; clear_has_deprecated(); } inline bool MessageOptions::deprecated() const { // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.deprecated) return deprecated_; } inline void MessageOptions::set_deprecated(bool value) { set_has_deprecated(); deprecated_ = value; // @@protoc_insertion_point(field_set:google.protobuf.MessageOptions.deprecated) } // optional bool map_entry = 7; inline bool MessageOptions::has_map_entry() const { return (_has_bits_[0] & 0x00000008u) != 0; } inline void MessageOptions::set_has_map_entry() { _has_bits_[0] |= 0x00000008u; } inline void MessageOptions::clear_has_map_entry() { _has_bits_[0] &= ~0x00000008u; } inline void MessageOptions::clear_map_entry() { map_entry_ = false; clear_has_map_entry(); } inline bool MessageOptions::map_entry() const { // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.map_entry) return map_entry_; } inline void MessageOptions::set_map_entry(bool value) { set_has_map_entry(); map_entry_ = value; // @@protoc_insertion_point(field_set:google.protobuf.MessageOptions.map_entry) } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; inline int MessageOptions::uninterpreted_option_size() const { return uninterpreted_option_.size(); } inline void MessageOptions::clear_uninterpreted_option() { uninterpreted_option_.Clear(); } inline const ::google::protobuf::UninterpretedOption& MessageOptions::uninterpreted_option(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.MessageOptions.uninterpreted_option) return uninterpreted_option_.Get(index); } inline ::google::protobuf::UninterpretedOption* MessageOptions::mutable_uninterpreted_option(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.MessageOptions.uninterpreted_option) return uninterpreted_option_.Mutable(index); } inline ::google::protobuf::UninterpretedOption* MessageOptions::add_uninterpreted_option() { // @@protoc_insertion_point(field_add:google.protobuf.MessageOptions.uninterpreted_option) return uninterpreted_option_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* MessageOptions::mutable_uninterpreted_option() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.MessageOptions.uninterpreted_option) return &uninterpreted_option_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& MessageOptions::uninterpreted_option() const { // @@protoc_insertion_point(field_list:google.protobuf.MessageOptions.uninterpreted_option) return uninterpreted_option_; } // ------------------------------------------------------------------- // FieldOptions // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; inline bool FieldOptions::has_ctype() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void FieldOptions::set_has_ctype() { _has_bits_[0] |= 0x00000001u; } inline void FieldOptions::clear_has_ctype() { _has_bits_[0] &= ~0x00000001u; } inline void FieldOptions::clear_ctype() { ctype_ = 0; clear_has_ctype(); } inline ::google::protobuf::FieldOptions_CType FieldOptions::ctype() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.ctype) return static_cast< ::google::protobuf::FieldOptions_CType >(ctype_); } inline void FieldOptions::set_ctype(::google::protobuf::FieldOptions_CType value) { assert(::google::protobuf::FieldOptions_CType_IsValid(value)); set_has_ctype(); ctype_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.ctype) } // optional bool packed = 2; inline bool FieldOptions::has_packed() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void FieldOptions::set_has_packed() { _has_bits_[0] |= 0x00000002u; } inline void FieldOptions::clear_has_packed() { _has_bits_[0] &= ~0x00000002u; } inline void FieldOptions::clear_packed() { packed_ = false; clear_has_packed(); } inline bool FieldOptions::packed() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.packed) return packed_; } inline void FieldOptions::set_packed(bool value) { set_has_packed(); packed_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.packed) } // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL]; inline bool FieldOptions::has_jstype() const { return (_has_bits_[0] & 0x00000020u) != 0; } inline void FieldOptions::set_has_jstype() { _has_bits_[0] |= 0x00000020u; } inline void FieldOptions::clear_has_jstype() { _has_bits_[0] &= ~0x00000020u; } inline void FieldOptions::clear_jstype() { jstype_ = 0; clear_has_jstype(); } inline ::google::protobuf::FieldOptions_JSType FieldOptions::jstype() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.jstype) return static_cast< ::google::protobuf::FieldOptions_JSType >(jstype_); } inline void FieldOptions::set_jstype(::google::protobuf::FieldOptions_JSType value) { assert(::google::protobuf::FieldOptions_JSType_IsValid(value)); set_has_jstype(); jstype_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.jstype) } // optional bool lazy = 5 [default = false]; inline bool FieldOptions::has_lazy() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void FieldOptions::set_has_lazy() { _has_bits_[0] |= 0x00000004u; } inline void FieldOptions::clear_has_lazy() { _has_bits_[0] &= ~0x00000004u; } inline void FieldOptions::clear_lazy() { lazy_ = false; clear_has_lazy(); } inline bool FieldOptions::lazy() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.lazy) return lazy_; } inline void FieldOptions::set_lazy(bool value) { set_has_lazy(); lazy_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.lazy) } // optional bool deprecated = 3 [default = false]; inline bool FieldOptions::has_deprecated() const { return (_has_bits_[0] & 0x00000008u) != 0; } inline void FieldOptions::set_has_deprecated() { _has_bits_[0] |= 0x00000008u; } inline void FieldOptions::clear_has_deprecated() { _has_bits_[0] &= ~0x00000008u; } inline void FieldOptions::clear_deprecated() { deprecated_ = false; clear_has_deprecated(); } inline bool FieldOptions::deprecated() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.deprecated) return deprecated_; } inline void FieldOptions::set_deprecated(bool value) { set_has_deprecated(); deprecated_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.deprecated) } // optional bool weak = 10 [default = false]; inline bool FieldOptions::has_weak() const { return (_has_bits_[0] & 0x00000010u) != 0; } inline void FieldOptions::set_has_weak() { _has_bits_[0] |= 0x00000010u; } inline void FieldOptions::clear_has_weak() { _has_bits_[0] &= ~0x00000010u; } inline void FieldOptions::clear_weak() { weak_ = false; clear_has_weak(); } inline bool FieldOptions::weak() const { // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.weak) return weak_; } inline void FieldOptions::set_weak(bool value) { set_has_weak(); weak_ = value; // @@protoc_insertion_point(field_set:google.protobuf.FieldOptions.weak) } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; inline int FieldOptions::uninterpreted_option_size() const { return uninterpreted_option_.size(); } inline void FieldOptions::clear_uninterpreted_option() { uninterpreted_option_.Clear(); } inline const ::google::protobuf::UninterpretedOption& FieldOptions::uninterpreted_option(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.FieldOptions.uninterpreted_option) return uninterpreted_option_.Get(index); } inline ::google::protobuf::UninterpretedOption* FieldOptions::mutable_uninterpreted_option(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.FieldOptions.uninterpreted_option) return uninterpreted_option_.Mutable(index); } inline ::google::protobuf::UninterpretedOption* FieldOptions::add_uninterpreted_option() { // @@protoc_insertion_point(field_add:google.protobuf.FieldOptions.uninterpreted_option) return uninterpreted_option_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* FieldOptions::mutable_uninterpreted_option() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.FieldOptions.uninterpreted_option) return &uninterpreted_option_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& FieldOptions::uninterpreted_option() const { // @@protoc_insertion_point(field_list:google.protobuf.FieldOptions.uninterpreted_option) return uninterpreted_option_; } // ------------------------------------------------------------------- // OneofOptions // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; inline int OneofOptions::uninterpreted_option_size() const { return uninterpreted_option_.size(); } inline void OneofOptions::clear_uninterpreted_option() { uninterpreted_option_.Clear(); } inline const ::google::protobuf::UninterpretedOption& OneofOptions::uninterpreted_option(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.OneofOptions.uninterpreted_option) return uninterpreted_option_.Get(index); } inline ::google::protobuf::UninterpretedOption* OneofOptions::mutable_uninterpreted_option(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.OneofOptions.uninterpreted_option) return uninterpreted_option_.Mutable(index); } inline ::google::protobuf::UninterpretedOption* OneofOptions::add_uninterpreted_option() { // @@protoc_insertion_point(field_add:google.protobuf.OneofOptions.uninterpreted_option) return uninterpreted_option_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* OneofOptions::mutable_uninterpreted_option() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.OneofOptions.uninterpreted_option) return &uninterpreted_option_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& OneofOptions::uninterpreted_option() const { // @@protoc_insertion_point(field_list:google.protobuf.OneofOptions.uninterpreted_option) return uninterpreted_option_; } // ------------------------------------------------------------------- // EnumOptions // optional bool allow_alias = 2; inline bool EnumOptions::has_allow_alias() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void EnumOptions::set_has_allow_alias() { _has_bits_[0] |= 0x00000001u; } inline void EnumOptions::clear_has_allow_alias() { _has_bits_[0] &= ~0x00000001u; } inline void EnumOptions::clear_allow_alias() { allow_alias_ = false; clear_has_allow_alias(); } inline bool EnumOptions::allow_alias() const { // @@protoc_insertion_point(field_get:google.protobuf.EnumOptions.allow_alias) return allow_alias_; } inline void EnumOptions::set_allow_alias(bool value) { set_has_allow_alias(); allow_alias_ = value; // @@protoc_insertion_point(field_set:google.protobuf.EnumOptions.allow_alias) } // optional bool deprecated = 3 [default = false]; inline bool EnumOptions::has_deprecated() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void EnumOptions::set_has_deprecated() { _has_bits_[0] |= 0x00000002u; } inline void EnumOptions::clear_has_deprecated() { _has_bits_[0] &= ~0x00000002u; } inline void EnumOptions::clear_deprecated() { deprecated_ = false; clear_has_deprecated(); } inline bool EnumOptions::deprecated() const { // @@protoc_insertion_point(field_get:google.protobuf.EnumOptions.deprecated) return deprecated_; } inline void EnumOptions::set_deprecated(bool value) { set_has_deprecated(); deprecated_ = value; // @@protoc_insertion_point(field_set:google.protobuf.EnumOptions.deprecated) } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; inline int EnumOptions::uninterpreted_option_size() const { return uninterpreted_option_.size(); } inline void EnumOptions::clear_uninterpreted_option() { uninterpreted_option_.Clear(); } inline const ::google::protobuf::UninterpretedOption& EnumOptions::uninterpreted_option(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.EnumOptions.uninterpreted_option) return uninterpreted_option_.Get(index); } inline ::google::protobuf::UninterpretedOption* EnumOptions::mutable_uninterpreted_option(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.EnumOptions.uninterpreted_option) return uninterpreted_option_.Mutable(index); } inline ::google::protobuf::UninterpretedOption* EnumOptions::add_uninterpreted_option() { // @@protoc_insertion_point(field_add:google.protobuf.EnumOptions.uninterpreted_option) return uninterpreted_option_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* EnumOptions::mutable_uninterpreted_option() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumOptions.uninterpreted_option) return &uninterpreted_option_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& EnumOptions::uninterpreted_option() const { // @@protoc_insertion_point(field_list:google.protobuf.EnumOptions.uninterpreted_option) return uninterpreted_option_; } // ------------------------------------------------------------------- // EnumValueOptions // optional bool deprecated = 1 [default = false]; inline bool EnumValueOptions::has_deprecated() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void EnumValueOptions::set_has_deprecated() { _has_bits_[0] |= 0x00000001u; } inline void EnumValueOptions::clear_has_deprecated() { _has_bits_[0] &= ~0x00000001u; } inline void EnumValueOptions::clear_deprecated() { deprecated_ = false; clear_has_deprecated(); } inline bool EnumValueOptions::deprecated() const { // @@protoc_insertion_point(field_get:google.protobuf.EnumValueOptions.deprecated) return deprecated_; } inline void EnumValueOptions::set_deprecated(bool value) { set_has_deprecated(); deprecated_ = value; // @@protoc_insertion_point(field_set:google.protobuf.EnumValueOptions.deprecated) } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; inline int EnumValueOptions::uninterpreted_option_size() const { return uninterpreted_option_.size(); } inline void EnumValueOptions::clear_uninterpreted_option() { uninterpreted_option_.Clear(); } inline const ::google::protobuf::UninterpretedOption& EnumValueOptions::uninterpreted_option(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.EnumValueOptions.uninterpreted_option) return uninterpreted_option_.Get(index); } inline ::google::protobuf::UninterpretedOption* EnumValueOptions::mutable_uninterpreted_option(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.EnumValueOptions.uninterpreted_option) return uninterpreted_option_.Mutable(index); } inline ::google::protobuf::UninterpretedOption* EnumValueOptions::add_uninterpreted_option() { // @@protoc_insertion_point(field_add:google.protobuf.EnumValueOptions.uninterpreted_option) return uninterpreted_option_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* EnumValueOptions::mutable_uninterpreted_option() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.EnumValueOptions.uninterpreted_option) return &uninterpreted_option_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& EnumValueOptions::uninterpreted_option() const { // @@protoc_insertion_point(field_list:google.protobuf.EnumValueOptions.uninterpreted_option) return uninterpreted_option_; } // ------------------------------------------------------------------- // ServiceOptions // optional bool deprecated = 33 [default = false]; inline bool ServiceOptions::has_deprecated() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void ServiceOptions::set_has_deprecated() { _has_bits_[0] |= 0x00000001u; } inline void ServiceOptions::clear_has_deprecated() { _has_bits_[0] &= ~0x00000001u; } inline void ServiceOptions::clear_deprecated() { deprecated_ = false; clear_has_deprecated(); } inline bool ServiceOptions::deprecated() const { // @@protoc_insertion_point(field_get:google.protobuf.ServiceOptions.deprecated) return deprecated_; } inline void ServiceOptions::set_deprecated(bool value) { set_has_deprecated(); deprecated_ = value; // @@protoc_insertion_point(field_set:google.protobuf.ServiceOptions.deprecated) } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; inline int ServiceOptions::uninterpreted_option_size() const { return uninterpreted_option_.size(); } inline void ServiceOptions::clear_uninterpreted_option() { uninterpreted_option_.Clear(); } inline const ::google::protobuf::UninterpretedOption& ServiceOptions::uninterpreted_option(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.ServiceOptions.uninterpreted_option) return uninterpreted_option_.Get(index); } inline ::google::protobuf::UninterpretedOption* ServiceOptions::mutable_uninterpreted_option(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.ServiceOptions.uninterpreted_option) return uninterpreted_option_.Mutable(index); } inline ::google::protobuf::UninterpretedOption* ServiceOptions::add_uninterpreted_option() { // @@protoc_insertion_point(field_add:google.protobuf.ServiceOptions.uninterpreted_option) return uninterpreted_option_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* ServiceOptions::mutable_uninterpreted_option() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.ServiceOptions.uninterpreted_option) return &uninterpreted_option_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& ServiceOptions::uninterpreted_option() const { // @@protoc_insertion_point(field_list:google.protobuf.ServiceOptions.uninterpreted_option) return uninterpreted_option_; } // ------------------------------------------------------------------- // MethodOptions // optional bool deprecated = 33 [default = false]; inline bool MethodOptions::has_deprecated() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void MethodOptions::set_has_deprecated() { _has_bits_[0] |= 0x00000001u; } inline void MethodOptions::clear_has_deprecated() { _has_bits_[0] &= ~0x00000001u; } inline void MethodOptions::clear_deprecated() { deprecated_ = false; clear_has_deprecated(); } inline bool MethodOptions::deprecated() const { // @@protoc_insertion_point(field_get:google.protobuf.MethodOptions.deprecated) return deprecated_; } inline void MethodOptions::set_deprecated(bool value) { set_has_deprecated(); deprecated_ = value; // @@protoc_insertion_point(field_set:google.protobuf.MethodOptions.deprecated) } // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN]; inline bool MethodOptions::has_idempotency_level() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void MethodOptions::set_has_idempotency_level() { _has_bits_[0] |= 0x00000002u; } inline void MethodOptions::clear_has_idempotency_level() { _has_bits_[0] &= ~0x00000002u; } inline void MethodOptions::clear_idempotency_level() { idempotency_level_ = 0; clear_has_idempotency_level(); } inline ::google::protobuf::MethodOptions_IdempotencyLevel MethodOptions::idempotency_level() const { // @@protoc_insertion_point(field_get:google.protobuf.MethodOptions.idempotency_level) return static_cast< ::google::protobuf::MethodOptions_IdempotencyLevel >(idempotency_level_); } inline void MethodOptions::set_idempotency_level(::google::protobuf::MethodOptions_IdempotencyLevel value) { assert(::google::protobuf::MethodOptions_IdempotencyLevel_IsValid(value)); set_has_idempotency_level(); idempotency_level_ = value; // @@protoc_insertion_point(field_set:google.protobuf.MethodOptions.idempotency_level) } // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; inline int MethodOptions::uninterpreted_option_size() const { return uninterpreted_option_.size(); } inline void MethodOptions::clear_uninterpreted_option() { uninterpreted_option_.Clear(); } inline const ::google::protobuf::UninterpretedOption& MethodOptions::uninterpreted_option(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.MethodOptions.uninterpreted_option) return uninterpreted_option_.Get(index); } inline ::google::protobuf::UninterpretedOption* MethodOptions::mutable_uninterpreted_option(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.MethodOptions.uninterpreted_option) return uninterpreted_option_.Mutable(index); } inline ::google::protobuf::UninterpretedOption* MethodOptions::add_uninterpreted_option() { // @@protoc_insertion_point(field_add:google.protobuf.MethodOptions.uninterpreted_option) return uninterpreted_option_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* MethodOptions::mutable_uninterpreted_option() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.MethodOptions.uninterpreted_option) return &uninterpreted_option_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& MethodOptions::uninterpreted_option() const { // @@protoc_insertion_point(field_list:google.protobuf.MethodOptions.uninterpreted_option) return uninterpreted_option_; } // ------------------------------------------------------------------- // UninterpretedOption_NamePart // required string name_part = 1; inline bool UninterpretedOption_NamePart::has_name_part() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void UninterpretedOption_NamePart::set_has_name_part() { _has_bits_[0] |= 0x00000001u; } inline void UninterpretedOption_NamePart::clear_has_name_part() { _has_bits_[0] &= ~0x00000001u; } inline void UninterpretedOption_NamePart::clear_name_part() { name_part_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_name_part(); } inline const ::std::string& UninterpretedOption_NamePart::name_part() const { // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.NamePart.name_part) return name_part_.Get(); } inline void UninterpretedOption_NamePart::set_name_part(const ::std::string& value) { set_has_name_part(); name_part_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.NamePart.name_part) } #if LANG_CXX11 inline void UninterpretedOption_NamePart::set_name_part(::std::string&& value) { set_has_name_part(); name_part_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.UninterpretedOption.NamePart.name_part) } #endif inline void UninterpretedOption_NamePart::set_name_part(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_name_part(); name_part_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.NamePart.name_part) } inline void UninterpretedOption_NamePart::set_name_part(const char* value, size_t size) { set_has_name_part(); name_part_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.NamePart.name_part) } inline ::std::string* UninterpretedOption_NamePart::mutable_name_part() { set_has_name_part(); // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.NamePart.name_part) return name_part_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* UninterpretedOption_NamePart::release_name_part() { // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.NamePart.name_part) clear_has_name_part(); return name_part_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void UninterpretedOption_NamePart::set_allocated_name_part(::std::string* name_part) { if (name_part != NULL) { set_has_name_part(); } else { clear_has_name_part(); } name_part_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name_part, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.NamePart.name_part) } inline ::std::string* UninterpretedOption_NamePart::unsafe_arena_release_name_part() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.UninterpretedOption.NamePart.name_part) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_name_part(); return name_part_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void UninterpretedOption_NamePart::unsafe_arena_set_allocated_name_part( ::std::string* name_part) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (name_part != NULL) { set_has_name_part(); } else { clear_has_name_part(); } name_part_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), name_part, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.UninterpretedOption.NamePart.name_part) } // required bool is_extension = 2; inline bool UninterpretedOption_NamePart::has_is_extension() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void UninterpretedOption_NamePart::set_has_is_extension() { _has_bits_[0] |= 0x00000002u; } inline void UninterpretedOption_NamePart::clear_has_is_extension() { _has_bits_[0] &= ~0x00000002u; } inline void UninterpretedOption_NamePart::clear_is_extension() { is_extension_ = false; clear_has_is_extension(); } inline bool UninterpretedOption_NamePart::is_extension() const { // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.NamePart.is_extension) return is_extension_; } inline void UninterpretedOption_NamePart::set_is_extension(bool value) { set_has_is_extension(); is_extension_ = value; // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.NamePart.is_extension) } // ------------------------------------------------------------------- // UninterpretedOption // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; inline int UninterpretedOption::name_size() const { return name_.size(); } inline void UninterpretedOption::clear_name() { name_.Clear(); } inline const ::google::protobuf::UninterpretedOption_NamePart& UninterpretedOption::name(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.name) return name_.Get(index); } inline ::google::protobuf::UninterpretedOption_NamePart* UninterpretedOption::mutable_name(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.name) return name_.Mutable(index); } inline ::google::protobuf::UninterpretedOption_NamePart* UninterpretedOption::add_name() { // @@protoc_insertion_point(field_add:google.protobuf.UninterpretedOption.name) return name_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >* UninterpretedOption::mutable_name() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.UninterpretedOption.name) return &name_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >& UninterpretedOption::name() const { // @@protoc_insertion_point(field_list:google.protobuf.UninterpretedOption.name) return name_; } // optional string identifier_value = 3; inline bool UninterpretedOption::has_identifier_value() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void UninterpretedOption::set_has_identifier_value() { _has_bits_[0] |= 0x00000001u; } inline void UninterpretedOption::clear_has_identifier_value() { _has_bits_[0] &= ~0x00000001u; } inline void UninterpretedOption::clear_identifier_value() { identifier_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_identifier_value(); } inline const ::std::string& UninterpretedOption::identifier_value() const { // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.identifier_value) return identifier_value_.Get(); } inline void UninterpretedOption::set_identifier_value(const ::std::string& value) { set_has_identifier_value(); identifier_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.identifier_value) } #if LANG_CXX11 inline void UninterpretedOption::set_identifier_value(::std::string&& value) { set_has_identifier_value(); identifier_value_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.UninterpretedOption.identifier_value) } #endif inline void UninterpretedOption::set_identifier_value(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_identifier_value(); identifier_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.identifier_value) } inline void UninterpretedOption::set_identifier_value(const char* value, size_t size) { set_has_identifier_value(); identifier_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.identifier_value) } inline ::std::string* UninterpretedOption::mutable_identifier_value() { set_has_identifier_value(); // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.identifier_value) return identifier_value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* UninterpretedOption::release_identifier_value() { // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.identifier_value) clear_has_identifier_value(); return identifier_value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void UninterpretedOption::set_allocated_identifier_value(::std::string* identifier_value) { if (identifier_value != NULL) { set_has_identifier_value(); } else { clear_has_identifier_value(); } identifier_value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), identifier_value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.identifier_value) } inline ::std::string* UninterpretedOption::unsafe_arena_release_identifier_value() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.UninterpretedOption.identifier_value) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_identifier_value(); return identifier_value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void UninterpretedOption::unsafe_arena_set_allocated_identifier_value( ::std::string* identifier_value) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (identifier_value != NULL) { set_has_identifier_value(); } else { clear_has_identifier_value(); } identifier_value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), identifier_value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.UninterpretedOption.identifier_value) } // optional uint64 positive_int_value = 4; inline bool UninterpretedOption::has_positive_int_value() const { return (_has_bits_[0] & 0x00000008u) != 0; } inline void UninterpretedOption::set_has_positive_int_value() { _has_bits_[0] |= 0x00000008u; } inline void UninterpretedOption::clear_has_positive_int_value() { _has_bits_[0] &= ~0x00000008u; } inline void UninterpretedOption::clear_positive_int_value() { positive_int_value_ = GOOGLE_ULONGLONG(0); clear_has_positive_int_value(); } inline ::google::protobuf::uint64 UninterpretedOption::positive_int_value() const { // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.positive_int_value) return positive_int_value_; } inline void UninterpretedOption::set_positive_int_value(::google::protobuf::uint64 value) { set_has_positive_int_value(); positive_int_value_ = value; // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.positive_int_value) } // optional int64 negative_int_value = 5; inline bool UninterpretedOption::has_negative_int_value() const { return (_has_bits_[0] & 0x00000010u) != 0; } inline void UninterpretedOption::set_has_negative_int_value() { _has_bits_[0] |= 0x00000010u; } inline void UninterpretedOption::clear_has_negative_int_value() { _has_bits_[0] &= ~0x00000010u; } inline void UninterpretedOption::clear_negative_int_value() { negative_int_value_ = GOOGLE_LONGLONG(0); clear_has_negative_int_value(); } inline ::google::protobuf::int64 UninterpretedOption::negative_int_value() const { // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.negative_int_value) return negative_int_value_; } inline void UninterpretedOption::set_negative_int_value(::google::protobuf::int64 value) { set_has_negative_int_value(); negative_int_value_ = value; // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.negative_int_value) } // optional double double_value = 6; inline bool UninterpretedOption::has_double_value() const { return (_has_bits_[0] & 0x00000020u) != 0; } inline void UninterpretedOption::set_has_double_value() { _has_bits_[0] |= 0x00000020u; } inline void UninterpretedOption::clear_has_double_value() { _has_bits_[0] &= ~0x00000020u; } inline void UninterpretedOption::clear_double_value() { double_value_ = 0; clear_has_double_value(); } inline double UninterpretedOption::double_value() const { // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.double_value) return double_value_; } inline void UninterpretedOption::set_double_value(double value) { set_has_double_value(); double_value_ = value; // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.double_value) } // optional bytes string_value = 7; inline bool UninterpretedOption::has_string_value() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void UninterpretedOption::set_has_string_value() { _has_bits_[0] |= 0x00000002u; } inline void UninterpretedOption::clear_has_string_value() { _has_bits_[0] &= ~0x00000002u; } inline void UninterpretedOption::clear_string_value() { string_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_string_value(); } inline const ::std::string& UninterpretedOption::string_value() const { // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.string_value) return string_value_.Get(); } inline void UninterpretedOption::set_string_value(const ::std::string& value) { set_has_string_value(); string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.string_value) } #if LANG_CXX11 inline void UninterpretedOption::set_string_value(::std::string&& value) { set_has_string_value(); string_value_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.UninterpretedOption.string_value) } #endif inline void UninterpretedOption::set_string_value(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_string_value(); string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.string_value) } inline void UninterpretedOption::set_string_value(const void* value, size_t size) { set_has_string_value(); string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.string_value) } inline ::std::string* UninterpretedOption::mutable_string_value() { set_has_string_value(); // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.string_value) return string_value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* UninterpretedOption::release_string_value() { // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.string_value) clear_has_string_value(); return string_value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void UninterpretedOption::set_allocated_string_value(::std::string* string_value) { if (string_value != NULL) { set_has_string_value(); } else { clear_has_string_value(); } string_value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), string_value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.string_value) } inline ::std::string* UninterpretedOption::unsafe_arena_release_string_value() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.UninterpretedOption.string_value) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_string_value(); return string_value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void UninterpretedOption::unsafe_arena_set_allocated_string_value( ::std::string* string_value) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (string_value != NULL) { set_has_string_value(); } else { clear_has_string_value(); } string_value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), string_value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.UninterpretedOption.string_value) } // optional string aggregate_value = 8; inline bool UninterpretedOption::has_aggregate_value() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void UninterpretedOption::set_has_aggregate_value() { _has_bits_[0] |= 0x00000004u; } inline void UninterpretedOption::clear_has_aggregate_value() { _has_bits_[0] &= ~0x00000004u; } inline void UninterpretedOption::clear_aggregate_value() { aggregate_value_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_aggregate_value(); } inline const ::std::string& UninterpretedOption::aggregate_value() const { // @@protoc_insertion_point(field_get:google.protobuf.UninterpretedOption.aggregate_value) return aggregate_value_.Get(); } inline void UninterpretedOption::set_aggregate_value(const ::std::string& value) { set_has_aggregate_value(); aggregate_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.UninterpretedOption.aggregate_value) } #if LANG_CXX11 inline void UninterpretedOption::set_aggregate_value(::std::string&& value) { set_has_aggregate_value(); aggregate_value_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.UninterpretedOption.aggregate_value) } #endif inline void UninterpretedOption::set_aggregate_value(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_aggregate_value(); aggregate_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.UninterpretedOption.aggregate_value) } inline void UninterpretedOption::set_aggregate_value(const char* value, size_t size) { set_has_aggregate_value(); aggregate_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.UninterpretedOption.aggregate_value) } inline ::std::string* UninterpretedOption::mutable_aggregate_value() { set_has_aggregate_value(); // @@protoc_insertion_point(field_mutable:google.protobuf.UninterpretedOption.aggregate_value) return aggregate_value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* UninterpretedOption::release_aggregate_value() { // @@protoc_insertion_point(field_release:google.protobuf.UninterpretedOption.aggregate_value) clear_has_aggregate_value(); return aggregate_value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void UninterpretedOption::set_allocated_aggregate_value(::std::string* aggregate_value) { if (aggregate_value != NULL) { set_has_aggregate_value(); } else { clear_has_aggregate_value(); } aggregate_value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), aggregate_value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.UninterpretedOption.aggregate_value) } inline ::std::string* UninterpretedOption::unsafe_arena_release_aggregate_value() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.UninterpretedOption.aggregate_value) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_aggregate_value(); return aggregate_value_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void UninterpretedOption::unsafe_arena_set_allocated_aggregate_value( ::std::string* aggregate_value) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (aggregate_value != NULL) { set_has_aggregate_value(); } else { clear_has_aggregate_value(); } aggregate_value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), aggregate_value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.UninterpretedOption.aggregate_value) } // ------------------------------------------------------------------- // SourceCodeInfo_Location // repeated int32 path = 1 [packed = true]; inline int SourceCodeInfo_Location::path_size() const { return path_.size(); } inline void SourceCodeInfo_Location::clear_path() { path_.Clear(); } inline ::google::protobuf::int32 SourceCodeInfo_Location::path(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.path) return path_.Get(index); } inline void SourceCodeInfo_Location::set_path(int index, ::google::protobuf::int32 value) { path_.Set(index, value); // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.path) } inline void SourceCodeInfo_Location::add_path(::google::protobuf::int32 value) { path_.Add(value); // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.path) } inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& SourceCodeInfo_Location::path() const { // @@protoc_insertion_point(field_list:google.protobuf.SourceCodeInfo.Location.path) return path_; } inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* SourceCodeInfo_Location::mutable_path() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.SourceCodeInfo.Location.path) return &path_; } // repeated int32 span = 2 [packed = true]; inline int SourceCodeInfo_Location::span_size() const { return span_.size(); } inline void SourceCodeInfo_Location::clear_span() { span_.Clear(); } inline ::google::protobuf::int32 SourceCodeInfo_Location::span(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.span) return span_.Get(index); } inline void SourceCodeInfo_Location::set_span(int index, ::google::protobuf::int32 value) { span_.Set(index, value); // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.span) } inline void SourceCodeInfo_Location::add_span(::google::protobuf::int32 value) { span_.Add(value); // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.span) } inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& SourceCodeInfo_Location::span() const { // @@protoc_insertion_point(field_list:google.protobuf.SourceCodeInfo.Location.span) return span_; } inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* SourceCodeInfo_Location::mutable_span() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.SourceCodeInfo.Location.span) return &span_; } // optional string leading_comments = 3; inline bool SourceCodeInfo_Location::has_leading_comments() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void SourceCodeInfo_Location::set_has_leading_comments() { _has_bits_[0] |= 0x00000001u; } inline void SourceCodeInfo_Location::clear_has_leading_comments() { _has_bits_[0] &= ~0x00000001u; } inline void SourceCodeInfo_Location::clear_leading_comments() { leading_comments_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_leading_comments(); } inline const ::std::string& SourceCodeInfo_Location::leading_comments() const { // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.leading_comments) return leading_comments_.Get(); } inline void SourceCodeInfo_Location::set_leading_comments(const ::std::string& value) { set_has_leading_comments(); leading_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.leading_comments) } #if LANG_CXX11 inline void SourceCodeInfo_Location::set_leading_comments(::std::string&& value) { set_has_leading_comments(); leading_comments_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.SourceCodeInfo.Location.leading_comments) } #endif inline void SourceCodeInfo_Location::set_leading_comments(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_leading_comments(); leading_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.SourceCodeInfo.Location.leading_comments) } inline void SourceCodeInfo_Location::set_leading_comments(const char* value, size_t size) { set_has_leading_comments(); leading_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceCodeInfo.Location.leading_comments) } inline ::std::string* SourceCodeInfo_Location::mutable_leading_comments() { set_has_leading_comments(); // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.Location.leading_comments) return leading_comments_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* SourceCodeInfo_Location::release_leading_comments() { // @@protoc_insertion_point(field_release:google.protobuf.SourceCodeInfo.Location.leading_comments) clear_has_leading_comments(); return leading_comments_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void SourceCodeInfo_Location::set_allocated_leading_comments(::std::string* leading_comments) { if (leading_comments != NULL) { set_has_leading_comments(); } else { clear_has_leading_comments(); } leading_comments_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), leading_comments, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.SourceCodeInfo.Location.leading_comments) } inline ::std::string* SourceCodeInfo_Location::unsafe_arena_release_leading_comments() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.SourceCodeInfo.Location.leading_comments) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_leading_comments(); return leading_comments_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void SourceCodeInfo_Location::unsafe_arena_set_allocated_leading_comments( ::std::string* leading_comments) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (leading_comments != NULL) { set_has_leading_comments(); } else { clear_has_leading_comments(); } leading_comments_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), leading_comments, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.SourceCodeInfo.Location.leading_comments) } // optional string trailing_comments = 4; inline bool SourceCodeInfo_Location::has_trailing_comments() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void SourceCodeInfo_Location::set_has_trailing_comments() { _has_bits_[0] |= 0x00000002u; } inline void SourceCodeInfo_Location::clear_has_trailing_comments() { _has_bits_[0] &= ~0x00000002u; } inline void SourceCodeInfo_Location::clear_trailing_comments() { trailing_comments_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_trailing_comments(); } inline const ::std::string& SourceCodeInfo_Location::trailing_comments() const { // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.trailing_comments) return trailing_comments_.Get(); } inline void SourceCodeInfo_Location::set_trailing_comments(const ::std::string& value) { set_has_trailing_comments(); trailing_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.trailing_comments) } #if LANG_CXX11 inline void SourceCodeInfo_Location::set_trailing_comments(::std::string&& value) { set_has_trailing_comments(); trailing_comments_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.SourceCodeInfo.Location.trailing_comments) } #endif inline void SourceCodeInfo_Location::set_trailing_comments(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_trailing_comments(); trailing_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.SourceCodeInfo.Location.trailing_comments) } inline void SourceCodeInfo_Location::set_trailing_comments(const char* value, size_t size) { set_has_trailing_comments(); trailing_comments_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceCodeInfo.Location.trailing_comments) } inline ::std::string* SourceCodeInfo_Location::mutable_trailing_comments() { set_has_trailing_comments(); // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.Location.trailing_comments) return trailing_comments_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* SourceCodeInfo_Location::release_trailing_comments() { // @@protoc_insertion_point(field_release:google.protobuf.SourceCodeInfo.Location.trailing_comments) clear_has_trailing_comments(); return trailing_comments_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void SourceCodeInfo_Location::set_allocated_trailing_comments(::std::string* trailing_comments) { if (trailing_comments != NULL) { set_has_trailing_comments(); } else { clear_has_trailing_comments(); } trailing_comments_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), trailing_comments, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.SourceCodeInfo.Location.trailing_comments) } inline ::std::string* SourceCodeInfo_Location::unsafe_arena_release_trailing_comments() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.SourceCodeInfo.Location.trailing_comments) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_trailing_comments(); return trailing_comments_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void SourceCodeInfo_Location::unsafe_arena_set_allocated_trailing_comments( ::std::string* trailing_comments) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (trailing_comments != NULL) { set_has_trailing_comments(); } else { clear_has_trailing_comments(); } trailing_comments_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), trailing_comments, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.SourceCodeInfo.Location.trailing_comments) } // repeated string leading_detached_comments = 6; inline int SourceCodeInfo_Location::leading_detached_comments_size() const { return leading_detached_comments_.size(); } inline void SourceCodeInfo_Location::clear_leading_detached_comments() { leading_detached_comments_.Clear(); } inline const ::std::string& SourceCodeInfo_Location::leading_detached_comments(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.Location.leading_detached_comments) return leading_detached_comments_.Get(index); } inline ::std::string* SourceCodeInfo_Location::mutable_leading_detached_comments(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.Location.leading_detached_comments) return leading_detached_comments_.Mutable(index); } inline void SourceCodeInfo_Location::set_leading_detached_comments(int index, const ::std::string& value) { // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.leading_detached_comments) leading_detached_comments_.Mutable(index)->assign(value); } #if LANG_CXX11 inline void SourceCodeInfo_Location::set_leading_detached_comments(int index, ::std::string&& value) { // @@protoc_insertion_point(field_set:google.protobuf.SourceCodeInfo.Location.leading_detached_comments) leading_detached_comments_.Mutable(index)->assign(std::move(value)); } #endif inline void SourceCodeInfo_Location::set_leading_detached_comments(int index, const char* value) { GOOGLE_DCHECK(value != NULL); 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) { leading_detached_comments_.Mutable(index)->assign( reinterpret_cast(value), size); // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceCodeInfo.Location.leading_detached_comments) } inline ::std::string* SourceCodeInfo_Location::add_leading_detached_comments() { // @@protoc_insertion_point(field_add_mutable:google.protobuf.SourceCodeInfo.Location.leading_detached_comments) return leading_detached_comments_.Add(); } inline void SourceCodeInfo_Location::add_leading_detached_comments(const ::std::string& value) { leading_detached_comments_.Add()->assign(value); // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.leading_detached_comments) } #if LANG_CXX11 inline void SourceCodeInfo_Location::add_leading_detached_comments(::std::string&& value) { leading_detached_comments_.Add(std::move(value)); // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.Location.leading_detached_comments) } #endif inline void SourceCodeInfo_Location::add_leading_detached_comments(const char* value) { GOOGLE_DCHECK(value != NULL); 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) { leading_detached_comments_.Add()->assign(reinterpret_cast(value), size); // @@protoc_insertion_point(field_add_pointer:google.protobuf.SourceCodeInfo.Location.leading_detached_comments) } inline const ::google::protobuf::RepeatedPtrField< ::std::string>& SourceCodeInfo_Location::leading_detached_comments() const { // @@protoc_insertion_point(field_list:google.protobuf.SourceCodeInfo.Location.leading_detached_comments) return leading_detached_comments_; } inline ::google::protobuf::RepeatedPtrField< ::std::string>* SourceCodeInfo_Location::mutable_leading_detached_comments() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.SourceCodeInfo.Location.leading_detached_comments) return &leading_detached_comments_; } // ------------------------------------------------------------------- // SourceCodeInfo // repeated .google.protobuf.SourceCodeInfo.Location location = 1; inline int SourceCodeInfo::location_size() const { return location_.size(); } inline void SourceCodeInfo::clear_location() { location_.Clear(); } inline const ::google::protobuf::SourceCodeInfo_Location& SourceCodeInfo::location(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.SourceCodeInfo.location) return location_.Get(index); } inline ::google::protobuf::SourceCodeInfo_Location* SourceCodeInfo::mutable_location(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.SourceCodeInfo.location) return location_.Mutable(index); } inline ::google::protobuf::SourceCodeInfo_Location* SourceCodeInfo::add_location() { // @@protoc_insertion_point(field_add:google.protobuf.SourceCodeInfo.location) return location_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >* SourceCodeInfo::mutable_location() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.SourceCodeInfo.location) return &location_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >& SourceCodeInfo::location() const { // @@protoc_insertion_point(field_list:google.protobuf.SourceCodeInfo.location) return location_; } // ------------------------------------------------------------------- // GeneratedCodeInfo_Annotation // repeated int32 path = 1 [packed = true]; inline int GeneratedCodeInfo_Annotation::path_size() const { return path_.size(); } inline void GeneratedCodeInfo_Annotation::clear_path() { path_.Clear(); } inline ::google::protobuf::int32 GeneratedCodeInfo_Annotation::path(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.Annotation.path) return path_.Get(index); } inline void GeneratedCodeInfo_Annotation::set_path(int index, ::google::protobuf::int32 value) { path_.Set(index, value); // @@protoc_insertion_point(field_set:google.protobuf.GeneratedCodeInfo.Annotation.path) } inline void GeneratedCodeInfo_Annotation::add_path(::google::protobuf::int32 value) { path_.Add(value); // @@protoc_insertion_point(field_add:google.protobuf.GeneratedCodeInfo.Annotation.path) } inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& GeneratedCodeInfo_Annotation::path() const { // @@protoc_insertion_point(field_list:google.protobuf.GeneratedCodeInfo.Annotation.path) return path_; } inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* GeneratedCodeInfo_Annotation::mutable_path() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.GeneratedCodeInfo.Annotation.path) return &path_; } // optional string source_file = 2; inline bool GeneratedCodeInfo_Annotation::has_source_file() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void GeneratedCodeInfo_Annotation::set_has_source_file() { _has_bits_[0] |= 0x00000001u; } inline void GeneratedCodeInfo_Annotation::clear_has_source_file() { _has_bits_[0] &= ~0x00000001u; } inline void GeneratedCodeInfo_Annotation::clear_source_file() { source_file_.ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_source_file(); } inline const ::std::string& GeneratedCodeInfo_Annotation::source_file() const { // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.Annotation.source_file) return source_file_.Get(); } inline void GeneratedCodeInfo_Annotation::set_source_file(const ::std::string& value) { set_has_source_file(); source_file_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.GeneratedCodeInfo.Annotation.source_file) } #if LANG_CXX11 inline void GeneratedCodeInfo_Annotation::set_source_file(::std::string&& value) { set_has_source_file(); source_file_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.GeneratedCodeInfo.Annotation.source_file) } #endif inline void GeneratedCodeInfo_Annotation::set_source_file(const char* value) { GOOGLE_DCHECK(value != NULL); set_has_source_file(); source_file_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.GeneratedCodeInfo.Annotation.source_file) } inline void GeneratedCodeInfo_Annotation::set_source_file(const char* value, size_t size) { set_has_source_file(); source_file_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.GeneratedCodeInfo.Annotation.source_file) } inline ::std::string* GeneratedCodeInfo_Annotation::mutable_source_file() { set_has_source_file(); // @@protoc_insertion_point(field_mutable:google.protobuf.GeneratedCodeInfo.Annotation.source_file) return source_file_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline ::std::string* GeneratedCodeInfo_Annotation::release_source_file() { // @@protoc_insertion_point(field_release:google.protobuf.GeneratedCodeInfo.Annotation.source_file) clear_has_source_file(); return source_file_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void GeneratedCodeInfo_Annotation::set_allocated_source_file(::std::string* source_file) { if (source_file != NULL) { set_has_source_file(); } else { clear_has_source_file(); } source_file_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), source_file, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_allocated:google.protobuf.GeneratedCodeInfo.Annotation.source_file) } inline ::std::string* GeneratedCodeInfo_Annotation::unsafe_arena_release_source_file() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.GeneratedCodeInfo.Annotation.source_file) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); clear_has_source_file(); return source_file_.UnsafeArenaRelease(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } inline void GeneratedCodeInfo_Annotation::unsafe_arena_set_allocated_source_file( ::std::string* source_file) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (source_file != NULL) { set_has_source_file(); } else { clear_has_source_file(); } source_file_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), source_file, GetArenaNoVirtual()); // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.GeneratedCodeInfo.Annotation.source_file) } // optional int32 begin = 3; inline bool GeneratedCodeInfo_Annotation::has_begin() const { return (_has_bits_[0] & 0x00000002u) != 0; } inline void GeneratedCodeInfo_Annotation::set_has_begin() { _has_bits_[0] |= 0x00000002u; } inline void GeneratedCodeInfo_Annotation::clear_has_begin() { _has_bits_[0] &= ~0x00000002u; } inline void GeneratedCodeInfo_Annotation::clear_begin() { begin_ = 0; clear_has_begin(); } inline ::google::protobuf::int32 GeneratedCodeInfo_Annotation::begin() const { // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.Annotation.begin) return begin_; } inline void GeneratedCodeInfo_Annotation::set_begin(::google::protobuf::int32 value) { set_has_begin(); begin_ = value; // @@protoc_insertion_point(field_set:google.protobuf.GeneratedCodeInfo.Annotation.begin) } // optional int32 end = 4; inline bool GeneratedCodeInfo_Annotation::has_end() const { return (_has_bits_[0] & 0x00000004u) != 0; } inline void GeneratedCodeInfo_Annotation::set_has_end() { _has_bits_[0] |= 0x00000004u; } inline void GeneratedCodeInfo_Annotation::clear_has_end() { _has_bits_[0] &= ~0x00000004u; } inline void GeneratedCodeInfo_Annotation::clear_end() { end_ = 0; clear_has_end(); } inline ::google::protobuf::int32 GeneratedCodeInfo_Annotation::end() const { // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.Annotation.end) return end_; } inline void GeneratedCodeInfo_Annotation::set_end(::google::protobuf::int32 value) { set_has_end(); end_ = value; // @@protoc_insertion_point(field_set:google.protobuf.GeneratedCodeInfo.Annotation.end) } // ------------------------------------------------------------------- // GeneratedCodeInfo // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1; inline int GeneratedCodeInfo::annotation_size() const { return annotation_.size(); } inline void GeneratedCodeInfo::clear_annotation() { annotation_.Clear(); } inline const ::google::protobuf::GeneratedCodeInfo_Annotation& GeneratedCodeInfo::annotation(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.GeneratedCodeInfo.annotation) return annotation_.Get(index); } inline ::google::protobuf::GeneratedCodeInfo_Annotation* GeneratedCodeInfo::mutable_annotation(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.GeneratedCodeInfo.annotation) return annotation_.Mutable(index); } inline ::google::protobuf::GeneratedCodeInfo_Annotation* GeneratedCodeInfo::add_annotation() { // @@protoc_insertion_point(field_add:google.protobuf.GeneratedCodeInfo.annotation) return annotation_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::GeneratedCodeInfo_Annotation >* GeneratedCodeInfo::mutable_annotation() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.GeneratedCodeInfo.annotation) return &annotation_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::GeneratedCodeInfo_Annotation >& GeneratedCodeInfo::annotation() const { // @@protoc_insertion_point(field_list:google.protobuf.GeneratedCodeInfo.annotation) return annotation_; } #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google namespace google { namespace protobuf { template <> struct is_proto_enum< ::google::protobuf::FieldDescriptorProto_Type> : ::google::protobuf::internal::true_type {}; template <> inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldDescriptorProto_Type>() { return ::google::protobuf::FieldDescriptorProto_Type_descriptor(); } template <> struct is_proto_enum< ::google::protobuf::FieldDescriptorProto_Label> : ::google::protobuf::internal::true_type {}; template <> inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldDescriptorProto_Label>() { return ::google::protobuf::FieldDescriptorProto_Label_descriptor(); } template <> struct is_proto_enum< ::google::protobuf::FileOptions_OptimizeMode> : ::google::protobuf::internal::true_type {}; template <> inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FileOptions_OptimizeMode>() { return ::google::protobuf::FileOptions_OptimizeMode_descriptor(); } template <> struct is_proto_enum< ::google::protobuf::FieldOptions_CType> : ::google::protobuf::internal::true_type {}; template <> inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldOptions_CType>() { return ::google::protobuf::FieldOptions_CType_descriptor(); } template <> struct is_proto_enum< ::google::protobuf::FieldOptions_JSType> : ::google::protobuf::internal::true_type {}; template <> inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldOptions_JSType>() { return ::google::protobuf::FieldOptions_JSType_descriptor(); } template <> struct is_proto_enum< ::google::protobuf::MethodOptions_IdempotencyLevel> : ::google::protobuf::internal::true_type {}; template <> inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::MethodOptions_IdempotencyLevel>() { return ::google::protobuf::MethodOptions_IdempotencyLevel_descriptor(); } } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) #endif // PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/descriptor.proto000066400000000000000000001066651334102242000305520ustar00rootroot00000000000000// 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. // // The messages in this file describe the definitions found in .proto files. // A valid .proto file can be translated directly to a FileDescriptorProto // without any other information (e.g. without reading its imports). syntax = "proto2"; package google.protobuf; option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; option java_package = "com.google.protobuf"; option java_outer_classname = "DescriptorProtos"; option csharp_namespace = "Google.Protobuf.Reflection"; option objc_class_prefix = "GPB"; option cc_enable_arenas = true; // descriptor.proto must be optimized for speed because reflection-based // algorithms don't work during bootstrapping. option optimize_for = SPEED; // The protocol compiler can output a FileDescriptorSet containing the .proto // files it parses. message FileDescriptorSet { repeated FileDescriptorProto file = 1; } // Describes a complete .proto file. message FileDescriptorProto { optional string name = 1; // file name, relative to root of source tree optional string package = 2; // e.g. "foo", "foo.bar", etc. // Names of files imported by this file. repeated string dependency = 3; // Indexes of the public imported files in the dependency list above. repeated int32 public_dependency = 10; // Indexes of the weak imported files in the dependency list. // For Google-internal migration only. Do not use. repeated int32 weak_dependency = 11; // All top-level definitions in this file. repeated DescriptorProto message_type = 4; repeated EnumDescriptorProto enum_type = 5; repeated ServiceDescriptorProto service = 6; repeated FieldDescriptorProto extension = 7; optional FileOptions options = 8; // This field contains optional information about the original source code. // You may safely remove this entire field without harming runtime // functionality of the descriptors -- the information is needed only by // development tools. optional SourceCodeInfo source_code_info = 9; // The syntax of the proto file. // The supported values are "proto2" and "proto3". optional string syntax = 12; } // Describes a message type. message DescriptorProto { optional string name = 1; repeated FieldDescriptorProto field = 2; repeated FieldDescriptorProto extension = 6; repeated DescriptorProto nested_type = 3; repeated EnumDescriptorProto enum_type = 4; message ExtensionRange { optional int32 start = 1; optional int32 end = 2; optional ExtensionRangeOptions options = 3; } repeated ExtensionRange extension_range = 5; repeated OneofDescriptorProto oneof_decl = 8; optional MessageOptions options = 7; // Range of reserved tag numbers. Reserved tag numbers may not be used by // fields or extension ranges in the same message. Reserved ranges may // not overlap. message ReservedRange { optional int32 start = 1; // Inclusive. optional int32 end = 2; // Exclusive. } repeated ReservedRange reserved_range = 9; // Reserved field names, which may not be used by fields in the same message. // A given name may only be reserved once. repeated string reserved_name = 10; } message ExtensionRangeOptions { // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } // Describes a field within a message. message FieldDescriptorProto { enum Type { // 0 is reserved for errors. // Order is weird for historical reasons. TYPE_DOUBLE = 1; TYPE_FLOAT = 2; // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if // negative values are likely. TYPE_INT64 = 3; TYPE_UINT64 = 4; // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if // negative values are likely. TYPE_INT32 = 5; TYPE_FIXED64 = 6; TYPE_FIXED32 = 7; TYPE_BOOL = 8; TYPE_STRING = 9; // Tag-delimited aggregate. // Group type is deprecated and not supported in proto3. However, Proto3 // implementations should still be able to parse the group wire format and // treat group fields as unknown fields. TYPE_GROUP = 10; TYPE_MESSAGE = 11; // Length-delimited aggregate. // New in version 2. TYPE_BYTES = 12; TYPE_UINT32 = 13; TYPE_ENUM = 14; TYPE_SFIXED32 = 15; TYPE_SFIXED64 = 16; TYPE_SINT32 = 17; // Uses ZigZag encoding. TYPE_SINT64 = 18; // Uses ZigZag encoding. }; enum Label { // 0 is reserved for errors LABEL_OPTIONAL = 1; LABEL_REQUIRED = 2; LABEL_REPEATED = 3; }; optional string name = 1; optional int32 number = 3; optional Label label = 4; // If type_name is set, this need not be set. If both this and type_name // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. optional Type type = 5; // For message and enum types, this is the name of the type. If the name // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping // rules are used to find the type (i.e. first the nested types within this // message are searched, then within the parent, on up to the root // namespace). optional string type_name = 6; // For extensions, this is the name of the type being extended. It is // resolved in the same manner as type_name. optional string extendee = 2; // For numeric types, contains the original text representation of the value. // For booleans, "true" or "false". // For strings, contains the default text contents (not escaped in any way). // For bytes, contains the C escaped value. All bytes >= 128 are escaped. // TODO(kenton): Base-64 encode? optional string default_value = 7; // If set, gives the index of a oneof in the containing type's oneof_decl // list. This field is a member of that oneof. optional int32 oneof_index = 9; // JSON name of this field. The value is set by protocol compiler. If the // user has set a "json_name" option on this field, that option's value // will be used. Otherwise, it's deduced from the field's name by converting // it to camelCase. optional string json_name = 10; optional FieldOptions options = 8; } // Describes a oneof. message OneofDescriptorProto { optional string name = 1; optional OneofOptions options = 2; } // Describes an enum type. message EnumDescriptorProto { optional string name = 1; repeated EnumValueDescriptorProto value = 2; optional EnumOptions options = 3; // Range of reserved numeric values. Reserved values may not be used by // entries in the same enum. Reserved ranges may not overlap. // // Note that this is distinct from DescriptorProto.ReservedRange in that it // is inclusive such that it can appropriately represent the entire int32 // domain. message EnumReservedRange { optional int32 start = 1; // Inclusive. optional int32 end = 2; // Inclusive. } // Range of reserved numeric values. Reserved numeric values may not be used // by enum values in the same enum declaration. Reserved ranges may not // overlap. repeated EnumReservedRange reserved_range = 4; // Reserved enum value names, which may not be reused. A given name may only // be reserved once. repeated string reserved_name = 5; } // Describes a value within an enum. message EnumValueDescriptorProto { optional string name = 1; optional int32 number = 2; optional EnumValueOptions options = 3; } // Describes a service. message ServiceDescriptorProto { optional string name = 1; repeated MethodDescriptorProto method = 2; optional ServiceOptions options = 3; } // Describes a method of a service. message MethodDescriptorProto { optional string name = 1; // Input and output type names. These are resolved in the same way as // FieldDescriptorProto.type_name, but must refer to a message type. optional string input_type = 2; optional string output_type = 3; optional MethodOptions options = 4; // Identifies if client streams multiple client messages optional bool client_streaming = 5 [default=false]; // Identifies if server streams multiple server messages optional bool server_streaming = 6 [default=false]; } // =================================================================== // Options // Each of the definitions above may have "options" attached. These are // just annotations which may cause code to be generated slightly differently // or may contain hints for code that manipulates protocol messages. // // Clients may define custom options as extensions of the *Options messages. // These extensions may not yet be known at parsing time, so the parser cannot // store the values in them. Instead it stores them in a field in the *Options // message called uninterpreted_option. This field must have the same name // across all *Options messages. We then use this field to populate the // extensions when we build a descriptor, at which point all protos have been // parsed and so all extensions are known. // // Extension numbers for custom options may be chosen as follows: // * For options which will only be used within a single application or // organization, or for experimental options, use field numbers 50000 // through 99999. It is up to you to ensure that you do not use the // same number for multiple options. // * For options which will be published and used publicly by multiple // independent entities, e-mail protobuf-global-extension-registry@google.com // to reserve extension numbers. Simply provide your project name (e.g. // Objective-C plugin) and your project website (if available) -- there's no // need to explain how you intend to use them. Usually you only need one // extension number. You can declare multiple options with only one extension // number by putting them in a sub-message. See the Custom Options section of // the docs for examples: // https://developers.google.com/protocol-buffers/docs/proto#options // If this turns out to be popular, a web service will be set up // to automatically assign option numbers. message FileOptions { // Sets the Java package where classes generated from this .proto will be // placed. By default, the proto package is used, but this is often // inappropriate because proto packages do not normally start with backwards // domain names. optional string java_package = 1; // If set, all the classes from the .proto file are wrapped in a single // outer class with the given name. This applies to both Proto1 // (equivalent to the old "--one_java_file" option) and Proto2 (where // a .proto always translates to a single class, but you may want to // explicitly choose the class name). optional string java_outer_classname = 8; // If set true, then the Java code generator will generate a separate .java // file for each top-level message, enum, and service defined in the .proto // file. Thus, these types will *not* be nested inside the outer class // named by java_outer_classname. However, the outer class will still be // generated to contain the file's getDescriptor() method as well as any // top-level extensions defined in the file. optional bool java_multiple_files = 10 [default=false]; // This option does nothing. optional bool java_generate_equals_and_hash = 20 [deprecated=true]; // If set true, then the Java2 code generator will generate code that // throws an exception whenever an attempt is made to assign a non-UTF-8 // byte sequence to a string field. // Message reflection will do the same. // However, an extension field still accepts non-UTF-8 byte sequences. // This option has no effect on when used with the lite runtime. optional bool java_string_check_utf8 = 27 [default=false]; // Generated classes can be optimized for speed or code size. enum OptimizeMode { SPEED = 1; // Generate complete code for parsing, serialization, // etc. CODE_SIZE = 2; // Use ReflectionOps to implement these methods. LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. } optional OptimizeMode optimize_for = 9 [default=SPEED]; // Sets the Go package where structs generated from this .proto will be // placed. If omitted, the Go package will be derived from the following: // - The basename of the package import path, if provided. // - Otherwise, the package statement in the .proto file, if present. // - Otherwise, the basename of the .proto file, without extension. optional string go_package = 11; // Should generic services be generated in each language? "Generic" services // are not specific to any particular RPC system. They are generated by the // main code generators in each language (without additional plugins). // Generic services were the only kind of service generation supported by // early versions of google.protobuf. // // Generic services are now considered deprecated in favor of using plugins // that generate code specific to your particular RPC system. Therefore, // these default to false. Old code which depends on generic services should // explicitly set them to true. optional bool cc_generic_services = 16 [default=false]; optional bool java_generic_services = 17 [default=false]; optional bool py_generic_services = 18 [default=false]; optional bool php_generic_services = 42 [default=false]; // Is this file deprecated? // Depending on the target platform, this can emit Deprecated annotations // for everything in the file, or it will be completely ignored; in the very // least, this is a formalization for deprecating files. optional bool deprecated = 23 [default=false]; // Enables the use of arenas for the proto messages in this file. This applies // only to generated classes for C++. optional bool cc_enable_arenas = 31 [default=false]; // Sets the objective c class prefix which is prepended to all objective c // generated classes from this .proto. There is no default. optional string objc_class_prefix = 36; // Namespace for generated classes; defaults to the package. optional string csharp_namespace = 37; // By default Swift generators will take the proto package and CamelCase it // replacing '.' with underscore and use that to prefix the types/symbols // defined. When this options is provided, they will use this value instead // to prefix the types/symbols defined. optional string swift_prefix = 39; // Sets the php class prefix which is prepended to all php generated classes // from this .proto. Default is empty. optional string php_class_prefix = 40; // Use this option to change the namespace of php generated classes. Default // is empty. When this option is empty, the package name will be used for // determining the namespace. optional string php_namespace = 41; // The parser stores options it doesn't recognize here. // See the documentation for the "Options" section above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. // See the documentation for the "Options" section above. extensions 1000 to max; reserved 38; } message MessageOptions { // Set true to use the old proto1 MessageSet wire format for extensions. // This is provided for backwards-compatibility with the MessageSet wire // format. You should not use this for any other reason: It's less // efficient, has fewer features, and is more complicated. // // The message must be defined exactly as follows: // message Foo { // option message_set_wire_format = true; // extensions 4 to max; // } // Note that the message cannot have any defined fields; MessageSets only // have extensions. // // All extensions of your type must be singular messages; e.g. they cannot // be int32s, enums, or repeated messages. // // Because this is an option, the above two restrictions are not enforced by // the protocol compiler. optional bool message_set_wire_format = 1 [default=false]; // Disables the generation of the standard "descriptor()" accessor, which can // conflict with a field of the same name. This is meant to make migration // from proto1 easier; new code should avoid fields named "descriptor". optional bool no_standard_descriptor_accessor = 2 [default=false]; // Is this message deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the message, or it will be completely ignored; in the very least, // this is a formalization for deprecating messages. optional bool deprecated = 3 [default=false]; // Whether the message is an automatically generated map entry type for the // maps field. // // For maps fields: // map map_field = 1; // The parsed descriptor looks like: // message MapFieldEntry { // option map_entry = true; // optional KeyType key = 1; // optional ValueType value = 2; // } // repeated MapFieldEntry map_field = 1; // // Implementations may choose not to generate the map_entry=true message, but // use a native map in the target language to hold the keys and values. // The reflection APIs in such implementions 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 reserved 9; // javanano_as_lite // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } message FieldOptions { // The ctype option instructs the C++ code generator to use a different // representation of the field than it normally would. See the specific // options below. This option is not yet implemented in the open source // release -- sorry, we'll try to include it in a future version! optional CType ctype = 1 [default = STRING]; enum CType { // Default mode. STRING = 0; CORD = 1; STRING_PIECE = 2; } // The packed option can be enabled for repeated primitive fields to enable // a more efficient representation on the wire. Rather than repeatedly // writing the tag and type for each element, the entire array is encoded as // a single length-delimited blob. In proto3, only explicit setting it to // false will avoid using packed encoding. optional bool packed = 2; // The jstype option determines the JavaScript type used for values of the // field. The option is permitted only for 64 bit integral and fixed types // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING // is represented as JavaScript string, which avoids loss of precision that // can happen when a large value is converted to a floating point JavaScript. // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to // use the JavaScript "number" type. The behavior of the default option // JS_NORMAL is implementation dependent. // // This option is an enum to permit additional types to be added, e.g. // goog.math.Integer. optional JSType jstype = 6 [default = JS_NORMAL]; enum JSType { // Use the default type. JS_NORMAL = 0; // Use JavaScript strings. JS_STRING = 1; // Use JavaScript numbers. JS_NUMBER = 2; } // Should this field be parsed lazily? Lazy applies only to message-type // fields. It means that when the outer message is initially parsed, the // inner message's contents will not be parsed but instead stored in encoded // form. The inner message will actually be parsed when it is first accessed. // // This is only a hint. Implementations are free to choose whether to use // eager or lazy parsing regardless of the value of this option. However, // setting this option true suggests that the protocol author believes that // using lazy parsing on this field is worth the additional bookkeeping // overhead typically needed to implement it. // // This option does not affect the public interface of any generated code; // all method signatures remain the same. Furthermore, thread-safety of the // interface is not affected by this option; const methods remain safe to // call from multiple threads concurrently, while non-const methods continue // to require exclusive access. // // // Note that implementations may choose not to check required fields within // a lazy sub-message. That is, calling IsInitialized() on the outer message // may return true even if the inner message has missing required fields. // This is necessary because otherwise the inner message would have to be // parsed in order to perform the check, defeating the purpose of lazy // parsing. An implementation which chooses not to check required fields // must be consistent about it. That is, for any particular sub-message, the // implementation must either *always* check its required fields, or *never* // check its required fields, regardless of whether or not the message has // been parsed. optional bool lazy = 5 [default=false]; // Is this field deprecated? // Depending on the target platform, this can emit Deprecated annotations // for accessors, or it will be completely ignored; in the very least, this // is a formalization for deprecating fields. optional bool deprecated = 3 [default=false]; // For Google-internal migration only. Do not use. optional bool weak = 10 [default=false]; // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; reserved 4; // removed jtype } message OneofOptions { // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } message EnumOptions { // Set this option to true to allow mapping different tag names to the same // value. optional bool allow_alias = 2; // Is this enum deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the enum, or it will be completely ignored; in the very least, this // is a formalization for deprecating enums. optional bool deprecated = 3 [default=false]; reserved 5; // javanano_as_lite // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } message EnumValueOptions { // Is this enum value deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the enum value, or it will be completely ignored; in the very least, // this is a formalization for deprecating enum values. optional bool deprecated = 1 [default=false]; // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } message ServiceOptions { // Note: Field numbers 1 through 32 are reserved for Google's internal RPC // framework. We apologize for hoarding these numbers to ourselves, but // we were already using them long before we decided to release Protocol // Buffers. // Is this service deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the service, or it will be completely ignored; in the very least, // this is a formalization for deprecating services. optional bool deprecated = 33 [default=false]; // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } message MethodOptions { // Note: Field numbers 1 through 32 are reserved for Google's internal RPC // framework. We apologize for hoarding these numbers to ourselves, but // we were already using them long before we decided to release Protocol // Buffers. // Is this method deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the method, or it will be completely ignored; in the very least, // this is a formalization for deprecating methods. optional bool deprecated = 33 [default=false]; // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, // or neither? HTTP based RPC implementation may choose GET verb for safe // methods, and PUT verb for idempotent methods instead of the default POST. enum IdempotencyLevel { IDEMPOTENCY_UNKNOWN = 0; NO_SIDE_EFFECTS = 1; // implies idempotent IDEMPOTENT = 2; // idempotent, but may have side effects } optional IdempotencyLevel idempotency_level = 34 [default=IDEMPOTENCY_UNKNOWN]; // The parser stores options it doesn't recognize here. See above. repeated UninterpretedOption uninterpreted_option = 999; // Clients can define custom options in extensions of this message. See above. extensions 1000 to max; } // A message representing a option the parser does not recognize. This only // appears in options protos created by the compiler::Parser class. // DescriptorPool resolves these when building Descriptor objects. Therefore, // options protos in descriptor objects (e.g. returned by Descriptor::options(), // or produced by Descriptor::CopyTo()) will never have UninterpretedOptions // in them. message UninterpretedOption { // The name of the uninterpreted option. Each string represents a segment in // a dot-separated name. is_extension is true iff a segment represents an // extension (denoted with parentheses in options specs in .proto files). // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents // "foo.(bar.baz).qux". message NamePart { required string name_part = 1; required bool is_extension = 2; } repeated NamePart name = 2; // The value of the uninterpreted option, in whatever type the tokenizer // identified it as during parsing. Exactly one of these should be set. optional string identifier_value = 3; optional uint64 positive_int_value = 4; optional int64 negative_int_value = 5; optional double double_value = 6; optional bytes string_value = 7; optional string aggregate_value = 8; } // =================================================================== // Optional source code info // Encapsulates information about the original source file from which a // FileDescriptorProto was generated. message SourceCodeInfo { // A Location identifies a piece of source code in a .proto file which // corresponds to a particular definition. This information is intended // to be useful to IDEs, code indexers, documentation generators, and similar // tools. // // For example, say we have a file like: // message Foo { // optional string foo = 1; // } // Let's look at just the field definition: // optional string foo = 1; // ^ ^^ ^^ ^ ^^^ // a bc de f ghi // We have the following locations: // span path represents // [a,i) [ 4, 0, 2, 0 ] The whole field definition. // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). // // Notes: // - A location may refer to a repeated field itself (i.e. not to any // particular index within it). This is used whenever a set of elements are // logically enclosed in a single code segment. For example, an entire // extend block (possibly containing multiple extension definitions) will // have an outer location whose path refers to the "extensions" repeated // field without an index. // - Multiple locations may have the same path. This happens when a single // logical declaration is spread out across multiple places. The most // obvious example is the "extend" block again -- there may be multiple // extend blocks in the same scope, each of which will have the same path. // - A location's span is not always a subset of its parent's span. For // example, the "extendee" of an extension declaration appears at the // beginning of the "extend" block and is shared by all extensions within // the block. // - Just because a location's span is a subset of some other location's span // does not mean that it is a descendent. For example, a "group" defines // both a type and a field in a single declaration. Thus, the locations // corresponding to the type and field and their components will overlap. // - Code which tries to interpret locations should probably be designed to // ignore those that it doesn't understand, as more types of locations could // be recorded in the future. repeated Location location = 1; message Location { // Identifies which part of the FileDescriptorProto was defined at this // location. // // Each element is a field number or an index. They form a path from // the root FileDescriptorProto to the place where the definition. For // example, this path: // [ 4, 3, 2, 7, 1 ] // refers to: // file.message_type(3) // 4, 3 // .field(7) // 2, 7 // .name() // 1 // This is because FileDescriptorProto.message_type has field number 4: // repeated DescriptorProto message_type = 4; // and DescriptorProto.field has field number 2: // repeated FieldDescriptorProto field = 2; // and FieldDescriptorProto.name has field number 1: // optional string name = 1; // // Thus, the above path gives the location of a field name. If we removed // the last element: // [ 4, 3, 2, 7 ] // this path refers to the whole field declaration (from the beginning // of the label to the terminating semicolon). repeated int32 path = 1 [packed=true]; // Always has exactly three or four elements: start line, start column, // end line (optional, otherwise assumed same as start line), end column. // These are packed into a single field for efficiency. Note that line // and column numbers are zero-based -- typically you will want to add // 1 to each before displaying to a user. repeated int32 span = 2 [packed=true]; // If this SourceCodeInfo represents a complete declaration, these are any // comments appearing before and after the declaration which appear to be // attached to the declaration. // // A series of line comments appearing on consecutive lines, with no other // tokens appearing on those lines, will be treated as a single comment. // // leading_detached_comments will keep paragraphs of comments that appear // before (but not connected to) the current element. Each paragraph, // separated by empty lines, will be one comment element in the repeated // field. // // Only the comment content is provided; comment markers (e.g. //) are // stripped out. For block comments, leading whitespace and an asterisk // will be stripped from the beginning of each line other than the first. // Newlines are included in the output. // // Examples: // // optional int32 foo = 1; // Comment attached to foo. // // Comment attached to bar. // optional int32 bar = 2; // // optional string baz = 3; // // Comment attached to baz. // // Another line attached to baz. // // // Comment attached to qux. // // // // Another line attached to qux. // optional double qux = 4; // // // Detached comment for corge. This is not leading or trailing comments // // to qux or corge because there are blank lines separating it from // // both. // // // Detached comment for corge paragraph 2. // // optional string corge = 5; // /* Block comment attached // * to corge. Leading asterisks // * will be removed. */ // /* Block comment attached to // * grault. */ // optional int32 grault = 6; // // // ignored detached comments. optional string leading_comments = 3; optional string trailing_comments = 4; repeated string leading_detached_comments = 6; } } // Describes the relationship between generated code and its original source // file. A GeneratedCodeInfo message is associated with only one generated // source file, but may contain references to different source .proto files. message GeneratedCodeInfo { // An Annotation connects some span of text in generated code to an element // of its generating .proto file. repeated Annotation annotation = 1; message Annotation { // Identifies the element in the original source .proto file. This field // is formatted the same as SourceCodeInfo.Location.path. repeated int32 path = 1 [packed=true]; // Identifies the filesystem path to the original source .proto. optional string source_file = 2; // Identifies the starting offset in bytes in the generated code // that relates to the identified object. 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 // the last relevant byte (so the length of the text = end - begin). optional int32 end = 4; } } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/descriptor_database.cc000066400000000000000000000446241334102242000316140ustar00rootroot00000000000000// 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 #include #include #include #include #include #include namespace google { namespace protobuf { DescriptorDatabase::~DescriptorDatabase() {} // =================================================================== template bool SimpleDescriptorDatabase::DescriptorIndex::AddFile( const FileDescriptorProto& file, Value value) { if (!InsertIfNotPresent(&by_name_, file.name(), value)) { GOOGLE_LOG(ERROR) << "File already exists in database: " << file.name(); return false; } // We must be careful here -- calling file.package() if file.has_package() is // false could access an uninitialized static-storage variable if we are being // run at startup time. string path = file.has_package() ? file.package() : string(); if (!path.empty()) path += '.'; for (int i = 0; i < file.message_type_size(); i++) { if (!AddSymbol(path + file.message_type(i).name(), value)) return false; if (!AddNestedExtensions(file.message_type(i), value)) return false; } for (int i = 0; i < file.enum_type_size(); i++) { if (!AddSymbol(path + file.enum_type(i).name(), value)) return false; } for (int i = 0; i < file.extension_size(); i++) { if (!AddSymbol(path + file.extension(i).name(), value)) return false; if (!AddExtension(file.extension(i), value)) return false; } for (int i = 0; i < file.service_size(); i++) { if (!AddSymbol(path + file.service(i).name(), value)) return false; } return true; } template bool SimpleDescriptorDatabase::DescriptorIndex::AddSymbol( const string& name, Value value) { // We need to make sure not to violate our map invariant. // If the symbol name is invalid it could break our lookup algorithm (which // relies on the fact that '.' sorts before all other characters that are // valid in symbol names). if (!ValidateSymbolName(name)) { GOOGLE_LOG(ERROR) << "Invalid symbol name: " << name; return false; } // Try to look up the symbol to make sure a super-symbol doesn't already // exist. typename std::map::iterator iter = FindLastLessOrEqual(name); if (iter == by_symbol_.end()) { // Apparently the map is currently empty. Just insert and be done with it. by_symbol_.insert( typename std::map::value_type(name, value)); return true; } if (IsSubSymbol(iter->first, name)) { GOOGLE_LOG(ERROR) << "Symbol name \"" << name << "\" conflicts with the existing " "symbol \"" << iter->first << "\"."; return false; } // OK, that worked. Now we have to make sure that no symbol in the map is // a sub-symbol of the one we are inserting. The only symbol which could // be so is the first symbol that is greater than the new symbol. Since // |iter| points at the last symbol that is less than or equal, we just have // to increment it. ++iter; if (iter != by_symbol_.end() && IsSubSymbol(name, iter->first)) { GOOGLE_LOG(ERROR) << "Symbol name \"" << name << "\" conflicts with the existing " "symbol \"" << iter->first << "\"."; return false; } // OK, no conflicts. // Insert the new symbol using the iterator as a hint, the new entry will // appear immediately before the one the iterator is pointing at. by_symbol_.insert(iter, typename std::map::value_type(name, value)); return true; } template bool SimpleDescriptorDatabase::DescriptorIndex::AddNestedExtensions( const DescriptorProto& message_type, Value value) { for (int i = 0; i < message_type.nested_type_size(); i++) { if (!AddNestedExtensions(message_type.nested_type(i), value)) return false; } for (int i = 0; i < message_type.extension_size(); i++) { if (!AddExtension(message_type.extension(i), value)) return false; } return true; } template bool SimpleDescriptorDatabase::DescriptorIndex::AddExtension( const FieldDescriptorProto& field, Value value) { 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)) { GOOGLE_LOG(ERROR) << "Extension conflicts with extension already in database: " "extend " << field.extendee() << " { " << field.name() << " = " << field.number() << " }"; return false; } } else { // Not fully-qualified. We can't really do anything here, unfortunately. // We don't consider this an error, though, because the descriptor is // valid. } return true; } template Value SimpleDescriptorDatabase::DescriptorIndex::FindFile( const string& filename) { return FindWithDefault(by_name_, filename, Value()); } template Value SimpleDescriptorDatabase::DescriptorIndex::FindSymbol( const string& name) { typename std::map::iterator iter = FindLastLessOrEqual(name); return (iter != by_symbol_.end() && IsSubSymbol(iter->first, name)) ? iter->second : Value(); } template Value SimpleDescriptorDatabase::DescriptorIndex::FindExtension( const string& containing_type, int field_number) { return FindWithDefault( by_extension_, std::make_pair(containing_type, field_number), Value()); } template bool SimpleDescriptorDatabase::DescriptorIndex::FindAllExtensionNumbers( const string& containing_type, std::vector* output) { typename std::map, Value>::const_iterator it = by_extension_.lower_bound(std::make_pair(containing_type, 0)); bool success = false; for (; it != by_extension_.end() && it->first.first == containing_type; ++it) { output->push_back(it->first.second); success = true; } return success; } template typename std::map::iterator SimpleDescriptorDatabase::DescriptorIndex::FindLastLessOrEqual( const string& name) { // Find the last key in the map which sorts less than or equal to the // symbol name. Since upper_bound() returns the *first* key that sorts // *greater* than the input, we want the element immediately before that. typename std::map::iterator iter = by_symbol_.upper_bound(name); if (iter != by_symbol_.begin()) --iter; return iter; } template bool SimpleDescriptorDatabase::DescriptorIndex::IsSubSymbol( const string& sub_symbol, const string& super_symbol) { return sub_symbol == super_symbol || (HasPrefixString(super_symbol, sub_symbol) && super_symbol[sub_symbol.size()] == '.'); } template bool SimpleDescriptorDatabase::DescriptorIndex::ValidateSymbolName( const string& name) { for (int i = 0; i < name.size(); i++) { // I don't trust ctype.h due to locales. :( if (name[i] != '.' && name[i] != '_' && (name[i] < '0' || name[i] > '9') && (name[i] < 'A' || name[i] > 'Z') && (name[i] < 'a' || name[i] > 'z')) { return false; } } return true; } // ------------------------------------------------------------------- SimpleDescriptorDatabase::SimpleDescriptorDatabase() {} SimpleDescriptorDatabase::~SimpleDescriptorDatabase() { STLDeleteElements(&files_to_delete_); } bool SimpleDescriptorDatabase::Add(const FileDescriptorProto& file) { FileDescriptorProto* new_file = new FileDescriptorProto; new_file->CopyFrom(file); return AddAndOwn(new_file); } bool SimpleDescriptorDatabase::AddAndOwn(const FileDescriptorProto* file) { files_to_delete_.push_back(file); return index_.AddFile(*file, file); } bool SimpleDescriptorDatabase::FindFileByName( const string& filename, FileDescriptorProto* output) { return MaybeCopy(index_.FindFile(filename), output); } bool SimpleDescriptorDatabase::FindFileContainingSymbol( const string& symbol_name, FileDescriptorProto* output) { return MaybeCopy(index_.FindSymbol(symbol_name), output); } bool SimpleDescriptorDatabase::FindFileContainingExtension( const string& containing_type, int field_number, FileDescriptorProto* output) { return MaybeCopy(index_.FindExtension(containing_type, field_number), output); } bool SimpleDescriptorDatabase::FindAllExtensionNumbers( const string& extendee_type, std::vector* output) { return index_.FindAllExtensionNumbers(extendee_type, output); } bool SimpleDescriptorDatabase::MaybeCopy(const FileDescriptorProto* file, FileDescriptorProto* output) { if (file == NULL) return false; output->CopyFrom(*file); return true; } // ------------------------------------------------------------------- EncodedDescriptorDatabase::EncodedDescriptorDatabase() {} EncodedDescriptorDatabase::~EncodedDescriptorDatabase() { for (int i = 0; i < files_to_delete_.size(); i++) { operator delete(files_to_delete_[i]); } } bool EncodedDescriptorDatabase::Add( const void* encoded_file_descriptor, int size) { FileDescriptorProto file; if (file.ParseFromArray(encoded_file_descriptor, size)) { return index_.AddFile(file, std::make_pair(encoded_file_descriptor, size)); } else { GOOGLE_LOG(ERROR) << "Invalid file descriptor data passed to " "EncodedDescriptorDatabase::Add()."; return false; } } bool EncodedDescriptorDatabase::AddCopy( const void* encoded_file_descriptor, int size) { void* copy = operator new(size); memcpy(copy, encoded_file_descriptor, size); files_to_delete_.push_back(copy); return Add(copy, size); } bool EncodedDescriptorDatabase::FindFileByName( const string& filename, FileDescriptorProto* output) { return MaybeParse(index_.FindFile(filename), output); } bool EncodedDescriptorDatabase::FindFileContainingSymbol( const string& symbol_name, FileDescriptorProto* output) { return MaybeParse(index_.FindSymbol(symbol_name), output); } bool EncodedDescriptorDatabase::FindNameOfFileContainingSymbol( const string& symbol_name, string* output) { std::pair encoded_file = index_.FindSymbol(symbol_name); if (encoded_file.first == NULL) return false; // Optimization: The name should be the first field in the encoded message. // Try to just read it directly. io::CodedInputStream input(reinterpret_cast(encoded_file.first), encoded_file.second); const uint32 kNameTag = internal::WireFormatLite::MakeTag( FileDescriptorProto::kNameFieldNumber, internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED); if (input.ReadTagNoLastTag() == kNameTag) { // Success! return internal::WireFormatLite::ReadString(&input, output); } else { // Slow path. Parse whole message. FileDescriptorProto file_proto; if (!file_proto.ParseFromArray(encoded_file.first, encoded_file.second)) { return false; } *output = file_proto.name(); return true; } } bool EncodedDescriptorDatabase::FindFileContainingExtension( const string& containing_type, int field_number, FileDescriptorProto* output) { return MaybeParse(index_.FindExtension(containing_type, field_number), output); } bool EncodedDescriptorDatabase::FindAllExtensionNumbers( const string& extendee_type, std::vector* output) { return index_.FindAllExtensionNumbers(extendee_type, output); } bool EncodedDescriptorDatabase::MaybeParse( std::pair encoded_file, FileDescriptorProto* output) { if (encoded_file.first == NULL) return false; return output->ParseFromArray(encoded_file.first, encoded_file.second); } // =================================================================== DescriptorPoolDatabase::DescriptorPoolDatabase(const DescriptorPool& pool) : pool_(pool) {} DescriptorPoolDatabase::~DescriptorPoolDatabase() {} bool DescriptorPoolDatabase::FindFileByName( const string& filename, FileDescriptorProto* output) { const FileDescriptor* file = pool_.FindFileByName(filename); if (file == NULL) return false; output->Clear(); file->CopyTo(output); return true; } bool DescriptorPoolDatabase::FindFileContainingSymbol( const string& symbol_name, FileDescriptorProto* output) { const FileDescriptor* file = pool_.FindFileContainingSymbol(symbol_name); if (file == NULL) return false; output->Clear(); file->CopyTo(output); return true; } bool DescriptorPoolDatabase::FindFileContainingExtension( const string& containing_type, int field_number, FileDescriptorProto* output) { const Descriptor* extendee = pool_.FindMessageTypeByName(containing_type); if (extendee == NULL) return false; const FieldDescriptor* extension = pool_.FindExtensionByNumber(extendee, field_number); if (extension == NULL) return false; output->Clear(); extension->file()->CopyTo(output); return true; } bool DescriptorPoolDatabase::FindAllExtensionNumbers( const string& extendee_type, std::vector* output) { const Descriptor* extendee = pool_.FindMessageTypeByName(extendee_type); if (extendee == NULL) return false; std::vector extensions; pool_.FindAllExtensions(extendee, &extensions); for (int i = 0; i < extensions.size(); ++i) { output->push_back(extensions[i]->number()); } return true; } // =================================================================== MergedDescriptorDatabase::MergedDescriptorDatabase( DescriptorDatabase* source1, DescriptorDatabase* source2) { sources_.push_back(source1); sources_.push_back(source2); } MergedDescriptorDatabase::MergedDescriptorDatabase( const std::vector& sources) : sources_(sources) {} MergedDescriptorDatabase::~MergedDescriptorDatabase() {} bool MergedDescriptorDatabase::FindFileByName( const string& filename, FileDescriptorProto* output) { for (int i = 0; i < sources_.size(); i++) { if (sources_[i]->FindFileByName(filename, output)) { return true; } } return false; } bool MergedDescriptorDatabase::FindFileContainingSymbol( const string& symbol_name, FileDescriptorProto* output) { for (int i = 0; i < sources_.size(); i++) { if (sources_[i]->FindFileContainingSymbol(symbol_name, output)) { // The symbol was found in source i. However, if one of the previous // sources defines a file with the same name (which presumably doesn't // contain the symbol, since it wasn't found in that source), then we // must hide it from the caller. FileDescriptorProto temp; for (int j = 0; j < i; j++) { if (sources_[j]->FindFileByName(output->name(), &temp)) { // Found conflicting file in a previous source. return false; } } return true; } } return false; } bool MergedDescriptorDatabase::FindFileContainingExtension( const string& containing_type, int field_number, FileDescriptorProto* output) { for (int i = 0; i < sources_.size(); i++) { if (sources_[i]->FindFileContainingExtension( containing_type, field_number, output)) { // The symbol was found in source i. However, if one of the previous // sources defines a file with the same name (which presumably doesn't // contain the symbol, since it wasn't found in that source), then we // must hide it from the caller. FileDescriptorProto temp; for (int j = 0; j < i; j++) { if (sources_[j]->FindFileByName(output->name(), &temp)) { // Found conflicting file in a previous source. return false; } } return true; } } return false; } bool MergedDescriptorDatabase::FindAllExtensionNumbers( const string& extendee_type, std::vector* output) { std::set merged_results; std::vector results; bool success = false; for (int i = 0; i < sources_.size(); i++) { if (sources_[i]->FindAllExtensionNumbers(extendee_type, &results)) { std::copy(results.begin(), results.end(), std::insert_iterator >(merged_results, merged_results.begin())); success = true; } results.clear(); } std::copy(merged_results.begin(), merged_results.end(), std::insert_iterator >(*output, output->end())); return success; } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/descriptor_database.h000066400000000000000000000427251334102242000314560ustar00rootroot00000000000000// 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. // // Interface for manipulating databases of descriptors. #ifndef GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__ #define GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__ #include #include #include #include #include #include namespace google { namespace protobuf { // Defined in this file. class DescriptorDatabase; class SimpleDescriptorDatabase; class EncodedDescriptorDatabase; class DescriptorPoolDatabase; class MergedDescriptorDatabase; // Abstract interface for a database of descriptors. // // This is useful if you want to create a DescriptorPool which loads // descriptors on-demand from some sort of large database. If the database // is large, it may be inefficient to enumerate every .proto file inside it // calling DescriptorPool::BuildFile() for each one. Instead, a DescriptorPool // can be created which wraps a DescriptorDatabase and only builds particular // descriptors when they are needed. class LIBPROTOBUF_EXPORT DescriptorDatabase { public: inline DescriptorDatabase() {} virtual ~DescriptorDatabase(); // Find a file by file name. Fills in in *output and returns true if found. // Otherwise, returns false, leaving the contents of *output undefined. virtual bool FindFileByName(const string& filename, FileDescriptorProto* output) = 0; // Find the file that declares the given fully-qualified symbol name. // If found, fills in *output and returns true, otherwise returns false // and leaves *output undefined. virtual bool FindFileContainingSymbol(const string& symbol_name, FileDescriptorProto* output) = 0; // Find the file which defines an extension extending the given message type // with the given field number. If found, fills in *output and returns true, // otherwise returns false and leaves *output undefined. containing_type // must be a fully-qualified type name. virtual bool FindFileContainingExtension(const string& containing_type, int field_number, FileDescriptorProto* output) = 0; // Finds the tag numbers used by all known extensions of // extendee_type, and appends them to output in an undefined // order. This method is best-effort: it's not guaranteed that the // database will find all extensions, and it's not guaranteed that // FindFileContainingExtension will return true on all of the found // numbers. Returns true if the search was successful, otherwise // returns false and leaves output unchanged. // // This method has a default implementation that always returns // false. virtual bool FindAllExtensionNumbers(const string& /* extendee_type */, std::vector* /* output */) { return false; } // Finds the file names and appends them to the output in an // undefined order. This method is best-effort: it's not guaranteed that the // database will find all files. Returns true if the database supports // searching all file names, otherwise returns false and leaves output // unchanged. // // This method has a default implementation that always returns // false. virtual bool FindAllFileNames(std::vector* output) { return false; } private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorDatabase); }; // A DescriptorDatabase into which you can insert files manually. // // FindFileContainingSymbol() is fully-implemented. When you add a file, its // symbols will be indexed for this purpose. Note that the implementation // may return false positives, but only if it isn't possible for the symbol // to be defined in any other file. In particular, if a file defines a symbol // "Foo", then searching for "Foo.[anything]" will match that file. This way, // the database does not need to aggressively index all children of a symbol. // // FindFileContainingExtension() is mostly-implemented. It works if and only // if the original FieldDescriptorProto defining the extension has a // fully-qualified type name in its "extendee" field (i.e. starts with a '.'). // If the extendee is a relative name, SimpleDescriptorDatabase will not // attempt to resolve the type, so it will not know what type the extension is // extending. Therefore, calling FindFileContainingExtension() with the // extension's containing type will never actually find that extension. Note // that this is an unlikely problem, as all FileDescriptorProtos created by the // protocol compiler (as well as ones created by calling // FileDescriptor::CopyTo()) will always use fully-qualified names for all // types. You only need to worry if you are constructing FileDescriptorProtos // yourself, or are calling compiler::Parser directly. class LIBPROTOBUF_EXPORT SimpleDescriptorDatabase : public DescriptorDatabase { public: SimpleDescriptorDatabase(); ~SimpleDescriptorDatabase(); // Adds the FileDescriptorProto to the database, making a copy. The object // can be deleted after Add() returns. Returns false if the file conflicted // with a file already in the database, in which case an error will have // been written to GOOGLE_LOG(ERROR). bool Add(const FileDescriptorProto& file); // Adds the FileDescriptorProto to the database and takes ownership of it. bool AddAndOwn(const FileDescriptorProto* file); // implements DescriptorDatabase ----------------------------------- bool FindFileByName(const string& filename, FileDescriptorProto* output); bool FindFileContainingSymbol(const string& symbol_name, FileDescriptorProto* output); bool FindFileContainingExtension(const string& containing_type, int field_number, FileDescriptorProto* output); bool FindAllExtensionNumbers(const string& extendee_type, std::vector* output); private: // So that it can use DescriptorIndex. friend class EncodedDescriptorDatabase; // An index mapping file names, symbol names, and extension numbers to // some sort of values. template class DescriptorIndex { public: // Helpers to recursively add particular descriptors and all their contents // to the index. bool AddFile(const FileDescriptorProto& file, Value value); bool AddSymbol(const string& name, Value value); bool AddNestedExtensions(const DescriptorProto& message_type, Value value); bool AddExtension(const FieldDescriptorProto& field, Value value); Value FindFile(const string& filename); Value FindSymbol(const string& name); Value FindExtension(const string& containing_type, int field_number); bool FindAllExtensionNumbers(const string& containing_type, std::vector* output); private: std::map by_name_; std::map by_symbol_; std::map, Value> by_extension_; // Invariant: The by_symbol_ map does not contain any symbols which are // prefixes of other symbols in the map. For example, "foo.bar" is a // prefix of "foo.bar.baz" (but is not a prefix of "foo.barbaz"). // // This invariant is important because it means that given a symbol name, // we can find a key in the map which is a prefix of the symbol in O(lg n) // time, and we know that there is at most one such key. // // The prefix lookup algorithm works like so: // 1) Find the last key in the map which is less than or equal to the // search key. // 2) If the found key is a prefix of the search key, then return it. // Otherwise, there is no match. // // I am sure this algorithm has been described elsewhere, but since I // wasn't able to find it quickly I will instead prove that it works // myself. The key to the algorithm is that if a match exists, step (1) // will find it. Proof: // 1) Define the "search key" to be the key we are looking for, the "found // key" to be the key found in step (1), and the "match key" to be the // key which actually matches the serach key (i.e. the key we're trying // to find). // 2) The found key must be less than or equal to the search key by // definition. // 3) The match key must also be less than or equal to the search key // (because it is a prefix). // 4) The match key cannot be greater than the found key, because if it // were, then step (1) of the algorithm would have returned the match // key instead (since it finds the *greatest* key which is less than or // equal to the search key). // 5) Therefore, the found key must be between the match key and the search // key, inclusive. // 6) Since the search key must be a sub-symbol of the match key, if it is // not equal to the match key, then search_key[match_key.size()] must // be '.'. // 7) Since '.' sorts before any other character that is valid in a symbol // name, then if the found key is not equal to the match key, then // found_key[match_key.size()] must also be '.', because any other value // would make it sort after the search key. // 8) Therefore, if the found key is not equal to the match key, then the // found key must be a sub-symbol of the match key. However, this would // contradict our map invariant which says that no symbol in the map is // a sub-symbol of any other. // 9) Therefore, the found key must match the match key. // // The above proof assumes the match key exists. In the case that the // match key does not exist, then step (1) will return some other symbol. // That symbol cannot be a super-symbol of the search key since if it were, // then it would be a match, and we're assuming the match key doesn't exist. // Therefore, step 2 will correctly return no match. // Find the last entry in the by_symbol_ map whose key is less than or // equal to the given name. typename std::map::iterator FindLastLessOrEqual( const string& name); // 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(const string& sub_symbol, const string& super_symbol); // Returns true if and only if all characters in the name are alphanumerics, // underscores, or periods. bool ValidateSymbolName(const string& name); }; DescriptorIndex index_; std::vector files_to_delete_; // If file is non-NULL, 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 // as raw bytes and generally tries to use as little memory as possible. // // The same caveats regarding FindFileContainingExtension() apply as with // SimpleDescriptorDatabase. class LIBPROTOBUF_EXPORT EncodedDescriptorDatabase : public DescriptorDatabase { public: EncodedDescriptorDatabase(); ~EncodedDescriptorDatabase(); // Adds the FileDescriptorProto to the database. The descriptor is provided // in encoded form. The database does not make a copy of the bytes, nor // does it take ownership; it's up to the caller to make sure the bytes // remain valid for the life of the database. Returns false and logs an error // if the bytes are not a valid FileDescriptorProto or if the file conflicted // with a file already in the database. bool Add(const void* encoded_file_descriptor, int size); // Like Add(), but makes a copy of the data, so that the caller does not // need to keep it around. bool AddCopy(const void* encoded_file_descriptor, int size); // Like FindFileContainingSymbol but returns only the name of the file. bool FindNameOfFileContainingSymbol(const string& symbol_name, string* output); // implements DescriptorDatabase ----------------------------------- bool FindFileByName(const string& filename, FileDescriptorProto* output); bool FindFileContainingSymbol(const string& symbol_name, FileDescriptorProto* output); bool FindFileContainingExtension(const string& containing_type, int field_number, FileDescriptorProto* output); bool FindAllExtensionNumbers(const string& extendee_type, std::vector* output); private: SimpleDescriptorDatabase::DescriptorIndex > index_; std::vector files_to_delete_; // If encoded_file.first is non-NULL, parse the data into *output and return // true, otherwise return false. bool MaybeParse(std::pair encoded_file, FileDescriptorProto* output); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EncodedDescriptorDatabase); }; // A DescriptorDatabase that fetches files from a given pool. class LIBPROTOBUF_EXPORT DescriptorPoolDatabase : public DescriptorDatabase { public: explicit DescriptorPoolDatabase(const DescriptorPool& pool); ~DescriptorPoolDatabase(); // implements DescriptorDatabase ----------------------------------- bool FindFileByName(const string& filename, FileDescriptorProto* output); bool FindFileContainingSymbol(const string& symbol_name, FileDescriptorProto* output); bool FindFileContainingExtension(const string& containing_type, int field_number, FileDescriptorProto* output); bool FindAllExtensionNumbers(const string& extendee_type, std::vector* output); private: const DescriptorPool& pool_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPoolDatabase); }; // A DescriptorDatabase that wraps two or more others. It first searches the // first database and, if that fails, tries the second, and so on. class LIBPROTOBUF_EXPORT MergedDescriptorDatabase : public DescriptorDatabase { public: // Merge just two databases. The sources remain property of the caller. MergedDescriptorDatabase(DescriptorDatabase* source1, DescriptorDatabase* source2); // Merge more than two databases. The sources remain property of the caller. // The vector may be deleted after the constructor returns but the // DescriptorDatabases need to stick around. explicit MergedDescriptorDatabase( const std::vector& sources); ~MergedDescriptorDatabase(); // implements DescriptorDatabase ----------------------------------- bool FindFileByName(const string& filename, FileDescriptorProto* output); bool FindFileContainingSymbol(const string& symbol_name, FileDescriptorProto* output); bool FindFileContainingExtension(const string& containing_type, int field_number, FileDescriptorProto* output); // Merges the results of calling all databases. Returns true iff any // of the databases returned true. bool FindAllExtensionNumbers(const string& extendee_type, std::vector* output); private: std::vector sources_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MergedDescriptorDatabase); }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/descriptor_database_unittest.cc000066400000000000000000000565271334102242000335600ustar00rootroot00000000000000// 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. // // This file makes extensive use of RFC 3092. :) #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace { static void AddToDatabase(SimpleDescriptorDatabase* database, const char* file_text) { FileDescriptorProto file_proto; EXPECT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); database->Add(file_proto); } static void ExpectContainsType(const FileDescriptorProto& proto, const string& type_name) { for (int i = 0; i < proto.message_type_size(); i++) { if (proto.message_type(i).name() == type_name) return; } ADD_FAILURE() << "\"" << proto.name() << "\" did not contain expected type \"" << type_name << "\"."; } // =================================================================== #if GTEST_HAS_PARAM_TEST // SimpleDescriptorDatabase, EncodedDescriptorDatabase, and // DescriptorPoolDatabase call for very similar tests. Instead of writing // three nearly-identical sets of tests, we use parameterized tests to apply // the same code to all three. // The parameterized test runs against a DescriptarDatabaseTestCase. We have // implementations for each of the three classes we want to test. class DescriptorDatabaseTestCase { public: virtual ~DescriptorDatabaseTestCase() {} virtual DescriptorDatabase* GetDatabase() = 0; virtual bool AddToDatabase(const FileDescriptorProto& file) = 0; }; // Factory function type. typedef DescriptorDatabaseTestCase* DescriptorDatabaseTestCaseFactory(); // Specialization for SimpleDescriptorDatabase. class SimpleDescriptorDatabaseTestCase : public DescriptorDatabaseTestCase { public: static DescriptorDatabaseTestCase* New() { return new SimpleDescriptorDatabaseTestCase; } virtual ~SimpleDescriptorDatabaseTestCase() {} virtual DescriptorDatabase* GetDatabase() { return &database_; } virtual bool AddToDatabase(const FileDescriptorProto& file) { return database_.Add(file); } private: SimpleDescriptorDatabase database_; }; // Specialization for EncodedDescriptorDatabase. class EncodedDescriptorDatabaseTestCase : public DescriptorDatabaseTestCase { public: static DescriptorDatabaseTestCase* New() { return new EncodedDescriptorDatabaseTestCase; } virtual ~EncodedDescriptorDatabaseTestCase() {} virtual DescriptorDatabase* GetDatabase() { return &database_; } virtual bool AddToDatabase(const FileDescriptorProto& file) { string data; file.SerializeToString(&data); return database_.AddCopy(data.data(), data.size()); } private: EncodedDescriptorDatabase database_; }; // Specialization for DescriptorPoolDatabase. class DescriptorPoolDatabaseTestCase : public DescriptorDatabaseTestCase { public: static DescriptorDatabaseTestCase* New() { return new EncodedDescriptorDatabaseTestCase; } DescriptorPoolDatabaseTestCase() : database_(pool_) {} virtual ~DescriptorPoolDatabaseTestCase() {} virtual DescriptorDatabase* GetDatabase() { return &database_; } virtual bool AddToDatabase(const FileDescriptorProto& file) { return pool_.BuildFile(file); } private: DescriptorPool pool_; DescriptorPoolDatabase database_; }; // ------------------------------------------------------------------- class DescriptorDatabaseTest : public testing::TestWithParam { protected: virtual void SetUp() { test_case_.reset(GetParam()()); database_ = test_case_->GetDatabase(); } void AddToDatabase(const char* file_descriptor_text) { FileDescriptorProto file_proto; EXPECT_TRUE(TextFormat::ParseFromString(file_descriptor_text, &file_proto)); EXPECT_TRUE(test_case_->AddToDatabase(file_proto)); } void AddToDatabaseWithError(const char* file_descriptor_text) { FileDescriptorProto file_proto; EXPECT_TRUE(TextFormat::ParseFromString(file_descriptor_text, &file_proto)); EXPECT_FALSE(test_case_->AddToDatabase(file_proto)); } google::protobuf::scoped_ptr test_case_; DescriptorDatabase* database_; }; TEST_P(DescriptorDatabaseTest, FindFileByName) { AddToDatabase( "name: \"foo.proto\" " "message_type { name:\"Foo\" }"); AddToDatabase( "name: \"bar.proto\" " "message_type { name:\"Bar\" }"); { FileDescriptorProto file; EXPECT_TRUE(database_->FindFileByName("foo.proto", &file)); EXPECT_EQ("foo.proto", file.name()); ExpectContainsType(file, "Foo"); } { FileDescriptorProto file; EXPECT_TRUE(database_->FindFileByName("bar.proto", &file)); EXPECT_EQ("bar.proto", file.name()); ExpectContainsType(file, "Bar"); } { // Fails to find undefined files. FileDescriptorProto file; EXPECT_FALSE(database_->FindFileByName("baz.proto", &file)); } } TEST_P(DescriptorDatabaseTest, FindFileContainingSymbol) { AddToDatabase( "name: \"foo.proto\" " "message_type { " " name: \"Foo\" " " field { name:\"qux\" }" " nested_type { name: \"Grault\" } " " enum_type { name: \"Garply\" } " "} " "enum_type { " " name: \"Waldo\" " " value { name:\"FRED\" } " "} " "extension { name: \"plugh\" } " "service { " " name: \"Xyzzy\" " " method { name: \"Thud\" } " "}" ); AddToDatabase( "name: \"bar.proto\" " "package: \"corge\" " "message_type { name: \"Bar\" }"); { FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingSymbol("Foo", &file)); EXPECT_EQ("foo.proto", file.name()); } { // Can find fields. FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.qux", &file)); EXPECT_EQ("foo.proto", file.name()); // Non-existent field under a valid top level symbol can also be // found. EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.none_field.none", &file)); } { // Can find nested types. FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.Grault", &file)); EXPECT_EQ("foo.proto", file.name()); } { // Can find nested enums. FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.Garply", &file)); EXPECT_EQ("foo.proto", file.name()); } { // Can find enum types. FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingSymbol("Waldo", &file)); EXPECT_EQ("foo.proto", file.name()); } { // Can find enum values. FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingSymbol("Waldo.FRED", &file)); EXPECT_EQ("foo.proto", file.name()); } { // Can find extensions. FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingSymbol("plugh", &file)); EXPECT_EQ("foo.proto", file.name()); } { // Can find services. FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingSymbol("Xyzzy", &file)); EXPECT_EQ("foo.proto", file.name()); } { // Can find methods. FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingSymbol("Xyzzy.Thud", &file)); EXPECT_EQ("foo.proto", file.name()); } { // Can find things in packages. FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingSymbol("corge.Bar", &file)); EXPECT_EQ("bar.proto", file.name()); } { // Fails to find undefined symbols. FileDescriptorProto file; EXPECT_FALSE(database_->FindFileContainingSymbol("Baz", &file)); } { // Names must be fully-qualified. FileDescriptorProto file; EXPECT_FALSE(database_->FindFileContainingSymbol("Bar", &file)); } } TEST_P(DescriptorDatabaseTest, FindFileContainingExtension) { AddToDatabase( "name: \"foo.proto\" " "message_type { " " name: \"Foo\" " " extension_range { start: 1 end: 1000 } " " extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 " " extendee: \".Foo\" }" "}"); AddToDatabase( "name: \"bar.proto\" " "package: \"corge\" " "dependency: \"foo.proto\" " "message_type { " " name: \"Bar\" " " extension_range { start: 1 end: 1000 } " "} " "extension { name:\"grault\" extendee: \".Foo\" number:32 } " "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } " "extension { name:\"waldo\" extendee: \"Bar\" number:56 } "); { FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingExtension("Foo", 5, &file)); EXPECT_EQ("foo.proto", file.name()); } { FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingExtension("Foo", 32, &file)); EXPECT_EQ("bar.proto", file.name()); } { // Can find extensions for qualified type names. FileDescriptorProto file; EXPECT_TRUE(database_->FindFileContainingExtension("corge.Bar", 70, &file)); EXPECT_EQ("bar.proto", file.name()); } { // Can't find extensions whose extendee was not fully-qualified in the // FileDescriptorProto. FileDescriptorProto file; EXPECT_FALSE(database_->FindFileContainingExtension("Bar", 56, &file)); EXPECT_FALSE( database_->FindFileContainingExtension("corge.Bar", 56, &file)); } { // Can't find non-existent extension numbers. FileDescriptorProto file; EXPECT_FALSE(database_->FindFileContainingExtension("Foo", 12, &file)); } { // Can't find extensions for non-existent types. FileDescriptorProto file; EXPECT_FALSE( database_->FindFileContainingExtension("NoSuchType", 5, &file)); } { // Can't find extensions for unqualified type names. FileDescriptorProto file; EXPECT_FALSE(database_->FindFileContainingExtension("Bar", 70, &file)); } } TEST_P(DescriptorDatabaseTest, FindAllExtensionNumbers) { AddToDatabase( "name: \"foo.proto\" " "message_type { " " name: \"Foo\" " " extension_range { start: 1 end: 1000 } " " extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 " " extendee: \".Foo\" }" "}"); AddToDatabase( "name: \"bar.proto\" " "package: \"corge\" " "dependency: \"foo.proto\" " "message_type { " " name: \"Bar\" " " extension_range { start: 1 end: 1000 } " "} " "extension { name:\"grault\" extendee: \".Foo\" number:32 } " "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } " "extension { name:\"waldo\" extendee: \"Bar\" number:56 } "); { std::vector numbers; EXPECT_TRUE(database_->FindAllExtensionNumbers("Foo", &numbers)); ASSERT_EQ(2, numbers.size()); std::sort(numbers.begin(), numbers.end()); EXPECT_EQ(5, numbers[0]); EXPECT_EQ(32, numbers[1]); } { std::vector numbers; EXPECT_TRUE(database_->FindAllExtensionNumbers("corge.Bar", &numbers)); // Note: won't find extension 56 due to the name not being fully qualified. ASSERT_EQ(1, numbers.size()); EXPECT_EQ(70, numbers[0]); } { // Can't find extensions for non-existent types. std::vector numbers; EXPECT_FALSE(database_->FindAllExtensionNumbers("NoSuchType", &numbers)); } { // Can't find extensions for unqualified types. std::vector numbers; EXPECT_FALSE(database_->FindAllExtensionNumbers("Bar", &numbers)); } } TEST_P(DescriptorDatabaseTest, ConflictingFileError) { AddToDatabase( "name: \"foo.proto\" " "message_type { " " name: \"Foo\" " "}"); AddToDatabaseWithError( "name: \"foo.proto\" " "message_type { " " name: \"Bar\" " "}"); } TEST_P(DescriptorDatabaseTest, ConflictingTypeError) { AddToDatabase( "name: \"foo.proto\" " "message_type { " " name: \"Foo\" " "}"); AddToDatabaseWithError( "name: \"bar.proto\" " "message_type { " " name: \"Foo\" " "}"); } TEST_P(DescriptorDatabaseTest, ConflictingExtensionError) { AddToDatabase( "name: \"foo.proto\" " "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 " " extendee: \".Foo\" }"); AddToDatabaseWithError( "name: \"bar.proto\" " "extension { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 " " extendee: \".Foo\" }"); } INSTANTIATE_TEST_CASE_P(Simple, DescriptorDatabaseTest, testing::Values(&SimpleDescriptorDatabaseTestCase::New)); INSTANTIATE_TEST_CASE_P(MemoryConserving, DescriptorDatabaseTest, testing::Values(&EncodedDescriptorDatabaseTestCase::New)); INSTANTIATE_TEST_CASE_P(Pool, DescriptorDatabaseTest, testing::Values(&DescriptorPoolDatabaseTestCase::New)); #endif // GTEST_HAS_PARAM_TEST TEST(EncodedDescriptorDatabaseExtraTest, FindNameOfFileContainingSymbol) { // Create two files, one of which is in two parts. FileDescriptorProto file1, file2a, file2b; file1.set_name("foo.proto"); file1.set_package("foo"); file1.add_message_type()->set_name("Foo"); file2a.set_name("bar.proto"); file2b.set_package("bar"); file2b.add_message_type()->set_name("Bar"); // Normal serialization allows our optimization to kick in. string data1 = file1.SerializeAsString(); // Force out-of-order serialization to test slow path. string data2 = file2b.SerializeAsString() + file2a.SerializeAsString(); // Create EncodedDescriptorDatabase containing both files. EncodedDescriptorDatabase db; db.Add(data1.data(), data1.size()); db.Add(data2.data(), data2.size()); // Test! string filename; EXPECT_TRUE(db.FindNameOfFileContainingSymbol("foo.Foo", &filename)); EXPECT_EQ("foo.proto", filename); EXPECT_TRUE(db.FindNameOfFileContainingSymbol("foo.Foo.Blah", &filename)); EXPECT_EQ("foo.proto", filename); EXPECT_TRUE(db.FindNameOfFileContainingSymbol("bar.Bar", &filename)); EXPECT_EQ("bar.proto", filename); EXPECT_FALSE(db.FindNameOfFileContainingSymbol("foo", &filename)); EXPECT_FALSE(db.FindNameOfFileContainingSymbol("bar", &filename)); EXPECT_FALSE(db.FindNameOfFileContainingSymbol("baz.Baz", &filename)); } // =================================================================== class MergedDescriptorDatabaseTest : public testing::Test { protected: MergedDescriptorDatabaseTest() : forward_merged_(&database1_, &database2_), reverse_merged_(&database2_, &database1_) {} virtual void SetUp() { AddToDatabase(&database1_, "name: \"foo.proto\" " "message_type { name:\"Foo\" extension_range { start: 1 end: 100 } } " "extension { name:\"foo_ext\" extendee: \".Foo\" number:3 " " label:LABEL_OPTIONAL type:TYPE_INT32 } "); AddToDatabase(&database2_, "name: \"bar.proto\" " "message_type { name:\"Bar\" extension_range { start: 1 end: 100 } } " "extension { name:\"bar_ext\" extendee: \".Bar\" number:5 " " label:LABEL_OPTIONAL type:TYPE_INT32 } "); // baz.proto exists in both pools, with different definitions. AddToDatabase(&database1_, "name: \"baz.proto\" " "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } " "message_type { name:\"FromPool1\" } " "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 " " label:LABEL_OPTIONAL type:TYPE_INT32 } " "extension { name:\"database1_only_ext\" extendee: \".Baz\" number:13 " " label:LABEL_OPTIONAL type:TYPE_INT32 } "); AddToDatabase(&database2_, "name: \"baz.proto\" " "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } " "message_type { name:\"FromPool2\" } " "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 " " label:LABEL_OPTIONAL type:TYPE_INT32 } "); } SimpleDescriptorDatabase database1_; SimpleDescriptorDatabase database2_; MergedDescriptorDatabase forward_merged_; MergedDescriptorDatabase reverse_merged_; }; TEST_F(MergedDescriptorDatabaseTest, FindFileByName) { { // Can find file that is only in database1_. FileDescriptorProto file; EXPECT_TRUE(forward_merged_.FindFileByName("foo.proto", &file)); EXPECT_EQ("foo.proto", file.name()); ExpectContainsType(file, "Foo"); } { // Can find file that is only in database2_. FileDescriptorProto file; EXPECT_TRUE(forward_merged_.FindFileByName("bar.proto", &file)); EXPECT_EQ("bar.proto", file.name()); ExpectContainsType(file, "Bar"); } { // In forward_merged_, database1_'s baz.proto takes precedence. FileDescriptorProto file; EXPECT_TRUE(forward_merged_.FindFileByName("baz.proto", &file)); EXPECT_EQ("baz.proto", file.name()); ExpectContainsType(file, "FromPool1"); } { // In reverse_merged_, database2_'s baz.proto takes precedence. FileDescriptorProto file; EXPECT_TRUE(reverse_merged_.FindFileByName("baz.proto", &file)); EXPECT_EQ("baz.proto", file.name()); ExpectContainsType(file, "FromPool2"); } { // Can't find non-existent file. FileDescriptorProto file; EXPECT_FALSE(forward_merged_.FindFileByName("no_such.proto", &file)); } } TEST_F(MergedDescriptorDatabaseTest, FindFileContainingSymbol) { { // Can find file that is only in database1_. FileDescriptorProto file; EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("Foo", &file)); EXPECT_EQ("foo.proto", file.name()); ExpectContainsType(file, "Foo"); } { // Can find file that is only in database2_. FileDescriptorProto file; EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("Bar", &file)); EXPECT_EQ("bar.proto", file.name()); ExpectContainsType(file, "Bar"); } { // In forward_merged_, database1_'s baz.proto takes precedence. FileDescriptorProto file; EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("Baz", &file)); EXPECT_EQ("baz.proto", file.name()); ExpectContainsType(file, "FromPool1"); } { // In reverse_merged_, database2_'s baz.proto takes precedence. FileDescriptorProto file; EXPECT_TRUE(reverse_merged_.FindFileContainingSymbol("Baz", &file)); EXPECT_EQ("baz.proto", file.name()); ExpectContainsType(file, "FromPool2"); } { // FromPool1 only shows up in forward_merged_ because it is masked by // database2_'s baz.proto in reverse_merged_. FileDescriptorProto file; EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("FromPool1", &file)); EXPECT_FALSE(reverse_merged_.FindFileContainingSymbol("FromPool1", &file)); } { // Can't find non-existent symbol. FileDescriptorProto file; EXPECT_FALSE( forward_merged_.FindFileContainingSymbol("NoSuchType", &file)); } } TEST_F(MergedDescriptorDatabaseTest, FindFileContainingExtension) { { // Can find file that is only in database1_. FileDescriptorProto file; EXPECT_TRUE( forward_merged_.FindFileContainingExtension("Foo", 3, &file)); EXPECT_EQ("foo.proto", file.name()); ExpectContainsType(file, "Foo"); } { // Can find file that is only in database2_. FileDescriptorProto file; EXPECT_TRUE( forward_merged_.FindFileContainingExtension("Bar", 5, &file)); EXPECT_EQ("bar.proto", file.name()); ExpectContainsType(file, "Bar"); } { // In forward_merged_, database1_'s baz.proto takes precedence. FileDescriptorProto file; EXPECT_TRUE( forward_merged_.FindFileContainingExtension("Baz", 12, &file)); EXPECT_EQ("baz.proto", file.name()); ExpectContainsType(file, "FromPool1"); } { // In reverse_merged_, database2_'s baz.proto takes precedence. FileDescriptorProto file; EXPECT_TRUE( reverse_merged_.FindFileContainingExtension("Baz", 12, &file)); EXPECT_EQ("baz.proto", file.name()); ExpectContainsType(file, "FromPool2"); } { // Baz's extension 13 only shows up in forward_merged_ because it is // masked by database2_'s baz.proto in reverse_merged_. FileDescriptorProto file; EXPECT_TRUE(forward_merged_.FindFileContainingExtension("Baz", 13, &file)); EXPECT_FALSE(reverse_merged_.FindFileContainingExtension("Baz", 13, &file)); } { // Can't find non-existent extension. FileDescriptorProto file; EXPECT_FALSE( forward_merged_.FindFileContainingExtension("Foo", 6, &file)); } } TEST_F(MergedDescriptorDatabaseTest, FindAllExtensionNumbers) { { // Message only has extension in database1_ std::vector numbers; EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Foo", &numbers)); ASSERT_EQ(1, numbers.size()); EXPECT_EQ(3, numbers[0]); } { // Message only has extension in database2_ std::vector numbers; EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Bar", &numbers)); ASSERT_EQ(1, numbers.size()); EXPECT_EQ(5, numbers[0]); } { // Merge results from the two databases. std::vector numbers; EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Baz", &numbers)); ASSERT_EQ(2, numbers.size()); std::sort(numbers.begin(), numbers.end()); EXPECT_EQ(12, numbers[0]); EXPECT_EQ(13, numbers[1]); } { std::vector numbers; EXPECT_TRUE(reverse_merged_.FindAllExtensionNumbers("Baz", &numbers)); ASSERT_EQ(2, numbers.size()); std::sort(numbers.begin(), numbers.end()); EXPECT_EQ(12, numbers[0]); EXPECT_EQ(13, numbers[1]); } { // Can't find extensions for a non-existent message. std::vector numbers; EXPECT_FALSE(reverse_merged_.FindAllExtensionNumbers("Blah", &numbers)); } } } // anonymous namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/descriptor_unittest.cc000066400000000000000000010232171334102242000317230ustar00rootroot00000000000000// 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. // // This file makes extensive use of RFC 3092. :) #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { // Can't use an anonymous namespace here due to brokenness of Tru64 compiler. namespace descriptor_unittest { // Some helpers to make assembling descriptors faster. DescriptorProto* AddMessage(FileDescriptorProto* file, const string& name) { DescriptorProto* result = file->add_message_type(); result->set_name(name); return result; } DescriptorProto* AddNestedMessage(DescriptorProto* parent, const string& name) { DescriptorProto* result = parent->add_nested_type(); result->set_name(name); return result; } EnumDescriptorProto* AddEnum(FileDescriptorProto* file, const string& name) { EnumDescriptorProto* result = file->add_enum_type(); result->set_name(name); return result; } EnumDescriptorProto* AddNestedEnum(DescriptorProto* parent, const string& name) { EnumDescriptorProto* result = parent->add_enum_type(); result->set_name(name); return result; } ServiceDescriptorProto* AddService(FileDescriptorProto* file, const string& name) { ServiceDescriptorProto* result = file->add_service(); result->set_name(name); return result; } FieldDescriptorProto* AddField(DescriptorProto* parent, const string& name, int number, FieldDescriptorProto::Label label, FieldDescriptorProto::Type type) { FieldDescriptorProto* result = parent->add_field(); result->set_name(name); result->set_number(number); result->set_label(label); result->set_type(type); return result; } FieldDescriptorProto* AddExtension(FileDescriptorProto* file, const string& extendee, const string& name, int number, FieldDescriptorProto::Label label, FieldDescriptorProto::Type type) { FieldDescriptorProto* result = file->add_extension(); result->set_name(name); result->set_number(number); result->set_label(label); result->set_type(type); result->set_extendee(extendee); return result; } FieldDescriptorProto* AddNestedExtension(DescriptorProto* parent, const string& extendee, const string& name, int number, FieldDescriptorProto::Label label, FieldDescriptorProto::Type type) { FieldDescriptorProto* result = parent->add_extension(); result->set_name(name); result->set_number(number); result->set_label(label); result->set_type(type); result->set_extendee(extendee); return result; } DescriptorProto::ExtensionRange* AddExtensionRange(DescriptorProto* parent, int start, int end) { DescriptorProto::ExtensionRange* result = parent->add_extension_range(); result->set_start(start); result->set_end(end); return result; } DescriptorProto::ReservedRange* AddReservedRange(DescriptorProto* parent, int start, int end) { DescriptorProto::ReservedRange* result = parent->add_reserved_range(); result->set_start(start); result->set_end(end); return result; } EnumDescriptorProto::EnumReservedRange* AddReservedRange( EnumDescriptorProto* parent, int start, int end) { EnumDescriptorProto::EnumReservedRange* result = parent->add_reserved_range(); result->set_start(start); result->set_end(end); return result; } EnumValueDescriptorProto* AddEnumValue(EnumDescriptorProto* enum_proto, const string& name, int number) { EnumValueDescriptorProto* result = enum_proto->add_value(); result->set_name(name); result->set_number(number); return result; } MethodDescriptorProto* AddMethod(ServiceDescriptorProto* service, const string& name, const string& input_type, const string& output_type) { MethodDescriptorProto* result = service->add_method(); result->set_name(name); result->set_input_type(input_type); result->set_output_type(output_type); return result; } // Empty enums technically aren't allowed. We need to insert a dummy value // into them. void AddEmptyEnum(FileDescriptorProto* file, const string& name) { AddEnumValue(AddEnum(file, name), name + "_DUMMY", 1); } class MockErrorCollector : public DescriptorPool::ErrorCollector { public: MockErrorCollector() {} ~MockErrorCollector() {} string text_; string warning_text_; // implements ErrorCollector --------------------------------------- void AddError(const string& filename, const string& element_name, const Message* descriptor, ErrorLocation location, const string& message) { const char* location_name = NULL; switch (location) { case NAME : location_name = "NAME" ; break; case NUMBER : location_name = "NUMBER" ; break; case TYPE : location_name = "TYPE" ; break; case EXTENDEE : location_name = "EXTENDEE" ; break; case DEFAULT_VALUE: location_name = "DEFAULT_VALUE"; break; case OPTION_NAME : location_name = "OPTION_NAME" ; break; case OPTION_VALUE : location_name = "OPTION_VALUE" ; break; case INPUT_TYPE : location_name = "INPUT_TYPE" ; break; case OUTPUT_TYPE : location_name = "OUTPUT_TYPE" ; break; case OTHER : location_name = "OTHER" ; break; } strings::SubstituteAndAppend( &text_, "$0: $1: $2: $3\n", filename, element_name, location_name, message); } // implements ErrorCollector --------------------------------------- void AddWarning(const string& filename, const string& element_name, const Message* descriptor, ErrorLocation location, const string& message) { const char* location_name = NULL; switch (location) { case NAME : location_name = "NAME" ; break; case NUMBER : location_name = "NUMBER" ; break; case TYPE : location_name = "TYPE" ; break; case EXTENDEE : location_name = "EXTENDEE" ; break; case DEFAULT_VALUE: location_name = "DEFAULT_VALUE"; break; case OPTION_NAME : location_name = "OPTION_NAME" ; break; case OPTION_VALUE : location_name = "OPTION_VALUE" ; break; case INPUT_TYPE : location_name = "INPUT_TYPE" ; break; case OUTPUT_TYPE : location_name = "OUTPUT_TYPE" ; break; case OTHER : location_name = "OTHER" ; break; } strings::SubstituteAndAppend( &warning_text_, "$0: $1: $2: $3\n", filename, element_name, location_name, message); } }; // =================================================================== // Test simple files. class FileDescriptorTest : public testing::Test { protected: virtual void SetUp() { // Build descriptors for the following definitions: // // // in "foo.proto" // message FooMessage { extensions 1; } // enum FooEnum {FOO_ENUM_VALUE = 1;} // service FooService {} // extend FooMessage { optional int32 foo_extension = 1; } // // // in "bar.proto" // package bar_package; // message BarMessage { extensions 1; } // enum BarEnum {BAR_ENUM_VALUE = 1;} // service BarService {} // extend BarMessage { optional int32 bar_extension = 1; } // // Also, we have an empty file "baz.proto". This file's purpose is to // make sure that even though it has the same package as foo.proto, // searching it for members of foo.proto won't work. FileDescriptorProto foo_file; foo_file.set_name("foo.proto"); AddExtensionRange(AddMessage(&foo_file, "FooMessage"), 1, 2); AddEnumValue(AddEnum(&foo_file, "FooEnum"), "FOO_ENUM_VALUE", 1); AddService(&foo_file, "FooService"); AddExtension(&foo_file, "FooMessage", "foo_extension", 1, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); FileDescriptorProto bar_file; bar_file.set_name("bar.proto"); bar_file.set_package("bar_package"); bar_file.add_dependency("foo.proto"); AddExtensionRange(AddMessage(&bar_file, "BarMessage"), 1, 2); AddEnumValue(AddEnum(&bar_file, "BarEnum"), "BAR_ENUM_VALUE", 1); AddService(&bar_file, "BarService"); AddExtension(&bar_file, "bar_package.BarMessage", "bar_extension", 1, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); FileDescriptorProto baz_file; baz_file.set_name("baz.proto"); // Build the descriptors and get the pointers. foo_file_ = pool_.BuildFile(foo_file); ASSERT_TRUE(foo_file_ != NULL); bar_file_ = pool_.BuildFile(bar_file); ASSERT_TRUE(bar_file_ != NULL); baz_file_ = pool_.BuildFile(baz_file); ASSERT_TRUE(baz_file_ != NULL); ASSERT_EQ(1, foo_file_->message_type_count()); foo_message_ = foo_file_->message_type(0); ASSERT_EQ(1, foo_file_->enum_type_count()); foo_enum_ = foo_file_->enum_type(0); ASSERT_EQ(1, foo_enum_->value_count()); foo_enum_value_ = foo_enum_->value(0); ASSERT_EQ(1, foo_file_->service_count()); foo_service_ = foo_file_->service(0); ASSERT_EQ(1, foo_file_->extension_count()); foo_extension_ = foo_file_->extension(0); ASSERT_EQ(1, bar_file_->message_type_count()); bar_message_ = bar_file_->message_type(0); ASSERT_EQ(1, bar_file_->enum_type_count()); bar_enum_ = bar_file_->enum_type(0); ASSERT_EQ(1, bar_enum_->value_count()); bar_enum_value_ = bar_enum_->value(0); ASSERT_EQ(1, bar_file_->service_count()); bar_service_ = bar_file_->service(0); ASSERT_EQ(1, bar_file_->extension_count()); bar_extension_ = bar_file_->extension(0); } DescriptorPool pool_; const FileDescriptor* foo_file_; const FileDescriptor* bar_file_; const FileDescriptor* baz_file_; const Descriptor* foo_message_; const EnumDescriptor* foo_enum_; const EnumValueDescriptor* foo_enum_value_; const ServiceDescriptor* foo_service_; const FieldDescriptor* foo_extension_; const Descriptor* bar_message_; const EnumDescriptor* bar_enum_; const EnumValueDescriptor* bar_enum_value_; const ServiceDescriptor* bar_service_; const FieldDescriptor* bar_extension_; }; TEST_F(FileDescriptorTest, Name) { EXPECT_EQ("foo.proto", foo_file_->name()); EXPECT_EQ("bar.proto", bar_file_->name()); EXPECT_EQ("baz.proto", baz_file_->name()); } TEST_F(FileDescriptorTest, Package) { EXPECT_EQ("", foo_file_->package()); EXPECT_EQ("bar_package", bar_file_->package()); } TEST_F(FileDescriptorTest, Dependencies) { EXPECT_EQ(0, foo_file_->dependency_count()); EXPECT_EQ(1, bar_file_->dependency_count()); EXPECT_EQ(foo_file_, bar_file_->dependency(0)); } TEST_F(FileDescriptorTest, FindMessageTypeByName) { EXPECT_EQ(foo_message_, foo_file_->FindMessageTypeByName("FooMessage")); EXPECT_EQ(bar_message_, bar_file_->FindMessageTypeByName("BarMessage")); EXPECT_TRUE(foo_file_->FindMessageTypeByName("BarMessage") == NULL); EXPECT_TRUE(bar_file_->FindMessageTypeByName("FooMessage") == NULL); EXPECT_TRUE(baz_file_->FindMessageTypeByName("FooMessage") == NULL); EXPECT_TRUE(foo_file_->FindMessageTypeByName("NoSuchMessage") == NULL); EXPECT_TRUE(foo_file_->FindMessageTypeByName("FooEnum") == NULL); } TEST_F(FileDescriptorTest, FindEnumTypeByName) { EXPECT_EQ(foo_enum_, foo_file_->FindEnumTypeByName("FooEnum")); EXPECT_EQ(bar_enum_, bar_file_->FindEnumTypeByName("BarEnum")); EXPECT_TRUE(foo_file_->FindEnumTypeByName("BarEnum") == NULL); EXPECT_TRUE(bar_file_->FindEnumTypeByName("FooEnum") == NULL); EXPECT_TRUE(baz_file_->FindEnumTypeByName("FooEnum") == NULL); EXPECT_TRUE(foo_file_->FindEnumTypeByName("NoSuchEnum") == NULL); EXPECT_TRUE(foo_file_->FindEnumTypeByName("FooMessage") == NULL); } TEST_F(FileDescriptorTest, FindEnumValueByName) { EXPECT_EQ(foo_enum_value_, foo_file_->FindEnumValueByName("FOO_ENUM_VALUE")); EXPECT_EQ(bar_enum_value_, bar_file_->FindEnumValueByName("BAR_ENUM_VALUE")); EXPECT_TRUE(foo_file_->FindEnumValueByName("BAR_ENUM_VALUE") == NULL); EXPECT_TRUE(bar_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL); EXPECT_TRUE(baz_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL); EXPECT_TRUE(foo_file_->FindEnumValueByName("NO_SUCH_VALUE") == NULL); EXPECT_TRUE(foo_file_->FindEnumValueByName("FooMessage") == NULL); } TEST_F(FileDescriptorTest, FindServiceByName) { EXPECT_EQ(foo_service_, foo_file_->FindServiceByName("FooService")); EXPECT_EQ(bar_service_, bar_file_->FindServiceByName("BarService")); EXPECT_TRUE(foo_file_->FindServiceByName("BarService") == NULL); EXPECT_TRUE(bar_file_->FindServiceByName("FooService") == NULL); EXPECT_TRUE(baz_file_->FindServiceByName("FooService") == NULL); EXPECT_TRUE(foo_file_->FindServiceByName("NoSuchService") == NULL); EXPECT_TRUE(foo_file_->FindServiceByName("FooMessage") == NULL); } TEST_F(FileDescriptorTest, FindExtensionByName) { EXPECT_EQ(foo_extension_, foo_file_->FindExtensionByName("foo_extension")); EXPECT_EQ(bar_extension_, bar_file_->FindExtensionByName("bar_extension")); EXPECT_TRUE(foo_file_->FindExtensionByName("bar_extension") == NULL); EXPECT_TRUE(bar_file_->FindExtensionByName("foo_extension") == NULL); EXPECT_TRUE(baz_file_->FindExtensionByName("foo_extension") == NULL); EXPECT_TRUE(foo_file_->FindExtensionByName("no_such_extension") == NULL); EXPECT_TRUE(foo_file_->FindExtensionByName("FooMessage") == NULL); } TEST_F(FileDescriptorTest, FindExtensionByNumber) { EXPECT_EQ(foo_extension_, pool_.FindExtensionByNumber(foo_message_, 1)); EXPECT_EQ(bar_extension_, pool_.FindExtensionByNumber(bar_message_, 1)); EXPECT_TRUE(pool_.FindExtensionByNumber(foo_message_, 2) == NULL); } TEST_F(FileDescriptorTest, BuildAgain) { // Test that if te call BuildFile again on the same input we get the same // FileDescriptor back. FileDescriptorProto file; foo_file_->CopyTo(&file); EXPECT_EQ(foo_file_, pool_.BuildFile(file)); // But if we change the file then it won't work. file.set_package("some.other.package"); EXPECT_TRUE(pool_.BuildFile(file) == NULL); } TEST_F(FileDescriptorTest, BuildAgainWithSyntax) { // Test that if te call BuildFile again on the same input we get the same // FileDescriptor back even if syntax param is specified. FileDescriptorProto proto_syntax2; proto_syntax2.set_name("foo_syntax2"); proto_syntax2.set_syntax("proto2"); const FileDescriptor* proto2_descriptor = pool_.BuildFile(proto_syntax2); EXPECT_TRUE(proto2_descriptor != NULL); EXPECT_EQ(proto2_descriptor, pool_.BuildFile(proto_syntax2)); FileDescriptorProto implicit_proto2; implicit_proto2.set_name("foo_implicit_syntax2"); const FileDescriptor* implicit_proto2_descriptor = pool_.BuildFile(implicit_proto2); EXPECT_TRUE(implicit_proto2_descriptor != NULL); // We get the same FileDescriptor back if syntax param is explicitly // specified. implicit_proto2.set_syntax("proto2"); EXPECT_EQ(implicit_proto2_descriptor, pool_.BuildFile(implicit_proto2)); FileDescriptorProto proto_syntax3; proto_syntax3.set_name("foo_syntax3"); proto_syntax3.set_syntax("proto3"); const FileDescriptor* proto3_descriptor = pool_.BuildFile(proto_syntax3); EXPECT_TRUE(proto3_descriptor != NULL); EXPECT_EQ(proto3_descriptor, pool_.BuildFile(proto_syntax3)); } TEST_F(FileDescriptorTest, Syntax) { FileDescriptorProto proto; proto.set_name("foo"); // Enable the test when we also populate the syntax for proto2. #if 0 { proto.set_syntax("proto2"); DescriptorPool pool; const FileDescriptor* file = pool.BuildFile(proto); EXPECT_TRUE(file != NULL); EXPECT_EQ(FileDescriptor::SYNTAX_PROTO2, file->syntax()); FileDescriptorProto other; file->CopyTo(&other); EXPECT_EQ("proto2", other.syntax()); } #endif { proto.set_syntax("proto3"); DescriptorPool pool; const FileDescriptor* file = pool.BuildFile(proto); EXPECT_TRUE(file != NULL); EXPECT_EQ(FileDescriptor::SYNTAX_PROTO3, file->syntax()); FileDescriptorProto other; file->CopyTo(&other); EXPECT_EQ("proto3", other.syntax()); } } void ExtractDebugString( const FileDescriptor* file, std::set* visited, std::vector >* debug_strings) { if (!visited->insert(file->name()).second) { return; } for (int i = 0; i < file->dependency_count(); ++i) { ExtractDebugString(file->dependency(i), visited, debug_strings); } debug_strings->push_back(std::make_pair(file->name(), file->DebugString())); } class SimpleErrorCollector : public google::protobuf::io::ErrorCollector { public: // implements ErrorCollector --------------------------------------- void AddError(int line, int column, const string& message) { last_error_ = StringPrintf("%d:%d:", line, column) + message; } const string& last_error() { return last_error_; } private: string last_error_; }; // Test that the result of FileDescriptor::DebugString() can be used to create // the original descriptors. TEST_F(FileDescriptorTest, DebugStringRoundTrip) { std::set visited; std::vector > debug_strings; ExtractDebugString(protobuf_unittest::TestAllTypes::descriptor()->file(), &visited, &debug_strings); ExtractDebugString( protobuf_unittest::TestMessageWithCustomOptions::descriptor()->file(), &visited, &debug_strings); ExtractDebugString(proto3_arena_unittest::TestAllTypes::descriptor()->file(), &visited, &debug_strings); ASSERT_GE(debug_strings.size(), 3); DescriptorPool pool; for (int i = 0; i < debug_strings.size(); ++i) { const string& name = debug_strings[i].first; const string& content = debug_strings[i].second; google::protobuf::io::ArrayInputStream input_stream(content.data(), content.size()); SimpleErrorCollector error_collector; google::protobuf::io::Tokenizer tokenizer(&input_stream, &error_collector); google::protobuf::compiler::Parser parser; parser.RecordErrorsTo(&error_collector); FileDescriptorProto proto; ASSERT_TRUE(parser.Parse(&tokenizer, &proto)) << error_collector.last_error() << "\n" << content; ASSERT_EQ("", error_collector.last_error()); proto.set_name(name); const FileDescriptor* descriptor = pool.BuildFile(proto); ASSERT_TRUE(descriptor != NULL) << proto.DebugString(); EXPECT_EQ(content, descriptor->DebugString()); } } // =================================================================== // Test simple flat messages and fields. class DescriptorTest : public testing::Test { protected: virtual void SetUp() { // Build descriptors for the following definitions: // // // in "foo.proto" // message TestForeign {} // enum TestEnum {} // // message TestMessage { // required string foo = 1; // optional TestEnum bar = 6; // repeated TestForeign baz = 500000000; // optional group qux = 15 {} // } // // // in "bar.proto" // package corge.grault; // message TestMessage2 { // required string foo = 1; // required string bar = 2; // required string quux = 6; // } // // // in "map.proto" // message TestMessage3 { // map map_int32_int32 = 1; // } // // // in "json.proto" // message TestMessage4 { // 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"]; // } // // We cheat and use TestForeign as the type for qux rather than create // an actual nested type. // // Since all primitive types (including string) use the same building // code, there's no need to test each one individually. // // TestMessage2 is primarily here to test FindFieldByName and friends. // All messages created from the same DescriptorPool share the same lookup // table, so we need to insure that they don't interfere. FileDescriptorProto foo_file; foo_file.set_name("foo.proto"); AddMessage(&foo_file, "TestForeign"); AddEmptyEnum(&foo_file, "TestEnum"); DescriptorProto* message = AddMessage(&foo_file, "TestMessage"); AddField(message, "foo", 1, FieldDescriptorProto::LABEL_REQUIRED, FieldDescriptorProto::TYPE_STRING); AddField(message, "bar", 6, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_ENUM) ->set_type_name("TestEnum"); AddField(message, "baz", 500000000, FieldDescriptorProto::LABEL_REPEATED, FieldDescriptorProto::TYPE_MESSAGE) ->set_type_name("TestForeign"); AddField(message, "qux", 15, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_GROUP) ->set_type_name("TestForeign"); FileDescriptorProto bar_file; bar_file.set_name("bar.proto"); bar_file.set_package("corge.grault"); DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2"); AddField(message2, "foo", 1, FieldDescriptorProto::LABEL_REQUIRED, FieldDescriptorProto::TYPE_STRING); AddField(message2, "bar", 2, FieldDescriptorProto::LABEL_REQUIRED, FieldDescriptorProto::TYPE_STRING); AddField(message2, "quux", 6, FieldDescriptorProto::LABEL_REQUIRED, FieldDescriptorProto::TYPE_STRING); FileDescriptorProto map_file; map_file.set_name("map.proto"); DescriptorProto* message3 = AddMessage(&map_file, "TestMessage3"); DescriptorProto* entry = AddNestedMessage(message3, "MapInt32Int32Entry"); AddField(entry, "key", 1, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddField(entry, "value", 2, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); entry->mutable_options()->set_map_entry(true); AddField(message3, "map_int32_int32", 1, FieldDescriptorProto::LABEL_REPEATED, FieldDescriptorProto::TYPE_MESSAGE) ->set_type_name("MapInt32Int32Entry"); FileDescriptorProto json_file; json_file.set_name("json.proto"); json_file.set_syntax("proto3"); DescriptorProto* message4 = AddMessage(&json_file, "TestMessage4"); AddField(message4, "field_name1", 1, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddField(message4, "fieldName2", 2, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddField(message4, "FieldName3", 3, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddField(message4, "_field_name4", 4, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddField(message4, "FIELD_NAME5", 5, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddField(message4, "field_name6", 6, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32) ->set_json_name("@type"); // Build the descriptors and get the pointers. foo_file_ = pool_.BuildFile(foo_file); ASSERT_TRUE(foo_file_ != NULL); bar_file_ = pool_.BuildFile(bar_file); ASSERT_TRUE(bar_file_ != NULL); map_file_ = pool_.BuildFile(map_file); ASSERT_TRUE(map_file_ != NULL); json_file_ = pool_.BuildFile(json_file); ASSERT_TRUE(json_file_ != NULL); ASSERT_EQ(1, foo_file_->enum_type_count()); enum_ = foo_file_->enum_type(0); ASSERT_EQ(2, foo_file_->message_type_count()); foreign_ = foo_file_->message_type(0); message_ = foo_file_->message_type(1); ASSERT_EQ(4, message_->field_count()); foo_ = message_->field(0); bar_ = message_->field(1); baz_ = message_->field(2); qux_ = message_->field(3); ASSERT_EQ(1, bar_file_->message_type_count()); message2_ = bar_file_->message_type(0); ASSERT_EQ(3, message2_->field_count()); foo2_ = message2_->field(0); bar2_ = message2_->field(1); quux2_ = message2_->field(2); ASSERT_EQ(1, map_file_->message_type_count()); message3_ = map_file_->message_type(0); ASSERT_EQ(1, message3_->field_count()); map_ = message3_->field(0); ASSERT_EQ(1, json_file_->message_type_count()); message4_ = json_file_->message_type(0); } void CopyWithJsonName(const Descriptor* message, DescriptorProto* proto) { message->CopyTo(proto); message->CopyJsonNameTo(proto); } DescriptorPool pool_; const FileDescriptor* foo_file_; const FileDescriptor* bar_file_; const FileDescriptor* map_file_; const FileDescriptor* json_file_; const Descriptor* message_; const Descriptor* message2_; const Descriptor* message3_; const Descriptor* message4_; const Descriptor* foreign_; const EnumDescriptor* enum_; const FieldDescriptor* foo_; const FieldDescriptor* bar_; const FieldDescriptor* baz_; const FieldDescriptor* qux_; const FieldDescriptor* foo2_; const FieldDescriptor* bar2_; const FieldDescriptor* quux2_; const FieldDescriptor* map_; }; TEST_F(DescriptorTest, Name) { EXPECT_EQ("TestMessage", message_->name()); EXPECT_EQ("TestMessage", message_->full_name()); EXPECT_EQ(foo_file_, message_->file()); EXPECT_EQ("TestMessage2", message2_->name()); EXPECT_EQ("corge.grault.TestMessage2", message2_->full_name()); EXPECT_EQ(bar_file_, message2_->file()); } TEST_F(DescriptorTest, ContainingType) { EXPECT_TRUE(message_->containing_type() == NULL); EXPECT_TRUE(message2_->containing_type() == NULL); } TEST_F(DescriptorTest, FieldsByIndex) { ASSERT_EQ(4, message_->field_count()); EXPECT_EQ(foo_, message_->field(0)); EXPECT_EQ(bar_, message_->field(1)); EXPECT_EQ(baz_, message_->field(2)); EXPECT_EQ(qux_, message_->field(3)); } TEST_F(DescriptorTest, FindFieldByName) { // All messages in the same DescriptorPool share a single lookup table for // fields. So, in addition to testing that FindFieldByName finds the fields // of the message, we need to test that it does *not* find the fields of // *other* messages. EXPECT_EQ(foo_, message_->FindFieldByName("foo")); EXPECT_EQ(bar_, message_->FindFieldByName("bar")); EXPECT_EQ(baz_, message_->FindFieldByName("baz")); EXPECT_EQ(qux_, message_->FindFieldByName("qux")); EXPECT_TRUE(message_->FindFieldByName("no_such_field") == NULL); EXPECT_TRUE(message_->FindFieldByName("quux") == NULL); EXPECT_EQ(foo2_ , message2_->FindFieldByName("foo" )); EXPECT_EQ(bar2_ , message2_->FindFieldByName("bar" )); EXPECT_EQ(quux2_, message2_->FindFieldByName("quux")); EXPECT_TRUE(message2_->FindFieldByName("baz") == NULL); EXPECT_TRUE(message2_->FindFieldByName("qux") == NULL); } TEST_F(DescriptorTest, FindFieldByNumber) { EXPECT_EQ(foo_, message_->FindFieldByNumber(1)); EXPECT_EQ(bar_, message_->FindFieldByNumber(6)); EXPECT_EQ(baz_, message_->FindFieldByNumber(500000000)); EXPECT_EQ(qux_, message_->FindFieldByNumber(15)); EXPECT_TRUE(message_->FindFieldByNumber(837592) == NULL); EXPECT_TRUE(message_->FindFieldByNumber(2) == NULL); EXPECT_EQ(foo2_ , message2_->FindFieldByNumber(1)); EXPECT_EQ(bar2_ , message2_->FindFieldByNumber(2)); EXPECT_EQ(quux2_, message2_->FindFieldByNumber(6)); EXPECT_TRUE(message2_->FindFieldByNumber(15) == NULL); EXPECT_TRUE(message2_->FindFieldByNumber(500000000) == NULL); } TEST_F(DescriptorTest, FieldName) { EXPECT_EQ("foo", foo_->name()); EXPECT_EQ("bar", bar_->name()); EXPECT_EQ("baz", baz_->name()); EXPECT_EQ("qux", qux_->name()); } TEST_F(DescriptorTest, FieldFullName) { EXPECT_EQ("TestMessage.foo", foo_->full_name()); EXPECT_EQ("TestMessage.bar", bar_->full_name()); EXPECT_EQ("TestMessage.baz", baz_->full_name()); EXPECT_EQ("TestMessage.qux", qux_->full_name()); EXPECT_EQ("corge.grault.TestMessage2.foo", foo2_->full_name()); EXPECT_EQ("corge.grault.TestMessage2.bar", bar2_->full_name()); EXPECT_EQ("corge.grault.TestMessage2.quux", quux2_->full_name()); } TEST_F(DescriptorTest, FieldJsonName) { EXPECT_EQ("fieldName1", message4_->field(0)->json_name()); EXPECT_EQ("fieldName2", message4_->field(1)->json_name()); EXPECT_EQ("FieldName3", message4_->field(2)->json_name()); EXPECT_EQ("FieldName4", message4_->field(3)->json_name()); EXPECT_EQ("FIELDNAME5", message4_->field(4)->json_name()); EXPECT_EQ("@type", message4_->field(5)->json_name()); DescriptorProto proto; message4_->CopyTo(&proto); ASSERT_EQ(6, proto.field_size()); EXPECT_FALSE(proto.field(0).has_json_name()); EXPECT_FALSE(proto.field(1).has_json_name()); EXPECT_FALSE(proto.field(2).has_json_name()); EXPECT_FALSE(proto.field(3).has_json_name()); EXPECT_FALSE(proto.field(4).has_json_name()); EXPECT_EQ("@type", proto.field(5).json_name()); proto.Clear(); CopyWithJsonName(message4_, &proto); ASSERT_EQ(6, proto.field_size()); EXPECT_EQ("fieldName1", proto.field(0).json_name()); EXPECT_EQ("fieldName2", proto.field(1).json_name()); EXPECT_EQ("FieldName3", proto.field(2).json_name()); EXPECT_EQ("FieldName4", proto.field(3).json_name()); EXPECT_EQ("FIELDNAME5", proto.field(4).json_name()); EXPECT_EQ("@type", proto.field(5).json_name()); // Test generated descriptor. const Descriptor* generated = protobuf_unittest::TestJsonName::descriptor(); ASSERT_EQ(6, generated->field_count()); EXPECT_EQ("fieldName1", generated->field(0)->json_name()); EXPECT_EQ("fieldName2", generated->field(1)->json_name()); EXPECT_EQ("FieldName3", generated->field(2)->json_name()); EXPECT_EQ("FieldName4", generated->field(3)->json_name()); EXPECT_EQ("FIELDNAME5", generated->field(4)->json_name()); EXPECT_EQ("@type", generated->field(5)->json_name()); } TEST_F(DescriptorTest, FieldFile) { EXPECT_EQ(foo_file_, foo_->file()); EXPECT_EQ(foo_file_, bar_->file()); EXPECT_EQ(foo_file_, baz_->file()); EXPECT_EQ(foo_file_, qux_->file()); EXPECT_EQ(bar_file_, foo2_->file()); EXPECT_EQ(bar_file_, bar2_->file()); EXPECT_EQ(bar_file_, quux2_->file()); } TEST_F(DescriptorTest, FieldIndex) { EXPECT_EQ(0, foo_->index()); EXPECT_EQ(1, bar_->index()); EXPECT_EQ(2, baz_->index()); EXPECT_EQ(3, qux_->index()); } TEST_F(DescriptorTest, FieldNumber) { EXPECT_EQ( 1, foo_->number()); EXPECT_EQ( 6, bar_->number()); EXPECT_EQ(500000000, baz_->number()); EXPECT_EQ( 15, qux_->number()); } TEST_F(DescriptorTest, FieldType) { EXPECT_EQ(FieldDescriptor::TYPE_STRING , foo_->type()); EXPECT_EQ(FieldDescriptor::TYPE_ENUM , bar_->type()); EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_->type()); EXPECT_EQ(FieldDescriptor::TYPE_GROUP , qux_->type()); } TEST_F(DescriptorTest, FieldLabel) { EXPECT_EQ(FieldDescriptor::LABEL_REQUIRED, foo_->label()); EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->label()); EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, baz_->label()); EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, qux_->label()); EXPECT_TRUE (foo_->is_required()); EXPECT_FALSE(foo_->is_optional()); EXPECT_FALSE(foo_->is_repeated()); EXPECT_FALSE(bar_->is_required()); EXPECT_TRUE (bar_->is_optional()); EXPECT_FALSE(bar_->is_repeated()); EXPECT_FALSE(baz_->is_required()); EXPECT_FALSE(baz_->is_optional()); EXPECT_TRUE (baz_->is_repeated()); } TEST_F(DescriptorTest, IsMap) { EXPECT_TRUE(map_->is_map()); EXPECT_FALSE(baz_->is_map()); EXPECT_TRUE(map_->message_type()->options().map_entry()); } TEST_F(DescriptorTest, FieldHasDefault) { EXPECT_FALSE(foo_->has_default_value()); EXPECT_FALSE(bar_->has_default_value()); EXPECT_FALSE(baz_->has_default_value()); EXPECT_FALSE(qux_->has_default_value()); } TEST_F(DescriptorTest, FieldContainingType) { EXPECT_EQ(message_, foo_->containing_type()); EXPECT_EQ(message_, bar_->containing_type()); EXPECT_EQ(message_, baz_->containing_type()); EXPECT_EQ(message_, qux_->containing_type()); EXPECT_EQ(message2_, foo2_ ->containing_type()); EXPECT_EQ(message2_, bar2_ ->containing_type()); EXPECT_EQ(message2_, quux2_->containing_type()); } TEST_F(DescriptorTest, FieldMessageType) { EXPECT_TRUE(foo_->message_type() == NULL); EXPECT_TRUE(bar_->message_type() == NULL); EXPECT_EQ(foreign_, baz_->message_type()); EXPECT_EQ(foreign_, qux_->message_type()); } TEST_F(DescriptorTest, FieldEnumType) { EXPECT_TRUE(foo_->enum_type() == NULL); EXPECT_TRUE(baz_->enum_type() == NULL); EXPECT_TRUE(qux_->enum_type() == NULL); EXPECT_EQ(enum_, bar_->enum_type()); } // =================================================================== // Test simple flat messages and fields. class OneofDescriptorTest : public testing::Test { protected: virtual void SetUp() { // Build descriptors for the following definitions: // // package garply; // message TestOneof { // optional int32 a = 1; // oneof foo { // string b = 2; // TestOneof c = 3; // } // oneof bar { // float d = 4; // } // } FileDescriptorProto baz_file; baz_file.set_name("baz.proto"); baz_file.set_package("garply"); DescriptorProto* oneof_message = AddMessage(&baz_file, "TestOneof"); oneof_message->add_oneof_decl()->set_name("foo"); oneof_message->add_oneof_decl()->set_name("bar"); AddField(oneof_message, "a", 1, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddField(oneof_message, "b", 2, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_STRING); oneof_message->mutable_field(1)->set_oneof_index(0); AddField(oneof_message, "c", 3, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_MESSAGE); oneof_message->mutable_field(2)->set_oneof_index(0); oneof_message->mutable_field(2)->set_type_name("TestOneof"); AddField(oneof_message, "d", 4, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_FLOAT); oneof_message->mutable_field(3)->set_oneof_index(1); // Build the descriptors and get the pointers. baz_file_ = pool_.BuildFile(baz_file); ASSERT_TRUE(baz_file_ != NULL); ASSERT_EQ(1, baz_file_->message_type_count()); oneof_message_ = baz_file_->message_type(0); ASSERT_EQ(2, oneof_message_->oneof_decl_count()); oneof_ = oneof_message_->oneof_decl(0); oneof2_ = oneof_message_->oneof_decl(1); ASSERT_EQ(4, oneof_message_->field_count()); a_ = oneof_message_->field(0); b_ = oneof_message_->field(1); c_ = oneof_message_->field(2); d_ = oneof_message_->field(3); } DescriptorPool pool_; const FileDescriptor* baz_file_; const Descriptor* oneof_message_; const OneofDescriptor* oneof_; const OneofDescriptor* oneof2_; const FieldDescriptor* a_; const FieldDescriptor* b_; const FieldDescriptor* c_; const FieldDescriptor* d_; const FieldDescriptor* e_; const FieldDescriptor* f_; }; TEST_F(OneofDescriptorTest, Normal) { EXPECT_EQ("foo", oneof_->name()); EXPECT_EQ("garply.TestOneof.foo", oneof_->full_name()); EXPECT_EQ(0, oneof_->index()); ASSERT_EQ(2, oneof_->field_count()); EXPECT_EQ(b_, oneof_->field(0)); EXPECT_EQ(c_, oneof_->field(1)); EXPECT_TRUE(a_->containing_oneof() == NULL); EXPECT_EQ(oneof_, b_->containing_oneof()); EXPECT_EQ(oneof_, c_->containing_oneof()); } TEST_F(OneofDescriptorTest, FindByName) { EXPECT_EQ(oneof_, oneof_message_->FindOneofByName("foo")); EXPECT_EQ(oneof2_, oneof_message_->FindOneofByName("bar")); EXPECT_TRUE(oneof_message_->FindOneofByName("no_such_oneof") == NULL); } // =================================================================== class StylizedFieldNamesTest : public testing::Test { protected: void SetUp() { FileDescriptorProto file; file.set_name("foo.proto"); AddExtensionRange(AddMessage(&file, "ExtendableMessage"), 1, 1000); DescriptorProto* message = AddMessage(&file, "TestMessage"); AddField(message, "foo_foo", 1, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddField(message, "FooBar", 2, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddField(message, "fooBaz", 3, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddField(message, "fooFoo", 4, // Camel-case conflict with foo_foo. FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddField(message, "foobar", 5, // Lower-case conflict with FooBar. FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddNestedExtension(message, "ExtendableMessage", "bar_foo", 1, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddNestedExtension(message, "ExtendableMessage", "BarBar", 2, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddNestedExtension(message, "ExtendableMessage", "BarBaz", 3, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddNestedExtension(message, "ExtendableMessage", "barFoo", 4, // Conflict FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddNestedExtension(message, "ExtendableMessage", "barbar", 5, // Conflict FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddExtension(&file, "ExtendableMessage", "baz_foo", 11, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddExtension(&file, "ExtendableMessage", "BazBar", 12, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddExtension(&file, "ExtendableMessage", "BazBaz", 13, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddExtension(&file, "ExtendableMessage", "bazFoo", 14, // Conflict FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddExtension(&file, "ExtendableMessage", "bazbar", 15, // Conflict FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); file_ = pool_.BuildFile(file); ASSERT_TRUE(file_ != NULL); ASSERT_EQ(2, file_->message_type_count()); message_ = file_->message_type(1); ASSERT_EQ("TestMessage", message_->name()); ASSERT_EQ(5, message_->field_count()); ASSERT_EQ(5, message_->extension_count()); ASSERT_EQ(5, file_->extension_count()); } DescriptorPool pool_; const FileDescriptor* file_; const Descriptor* message_; }; TEST_F(StylizedFieldNamesTest, LowercaseName) { EXPECT_EQ("foo_foo", message_->field(0)->lowercase_name()); EXPECT_EQ("foobar" , message_->field(1)->lowercase_name()); EXPECT_EQ("foobaz" , message_->field(2)->lowercase_name()); EXPECT_EQ("foofoo" , message_->field(3)->lowercase_name()); EXPECT_EQ("foobar" , message_->field(4)->lowercase_name()); EXPECT_EQ("bar_foo", message_->extension(0)->lowercase_name()); EXPECT_EQ("barbar" , message_->extension(1)->lowercase_name()); EXPECT_EQ("barbaz" , message_->extension(2)->lowercase_name()); EXPECT_EQ("barfoo" , message_->extension(3)->lowercase_name()); EXPECT_EQ("barbar" , message_->extension(4)->lowercase_name()); EXPECT_EQ("baz_foo", file_->extension(0)->lowercase_name()); EXPECT_EQ("bazbar" , file_->extension(1)->lowercase_name()); EXPECT_EQ("bazbaz" , file_->extension(2)->lowercase_name()); EXPECT_EQ("bazfoo" , file_->extension(3)->lowercase_name()); EXPECT_EQ("bazbar" , file_->extension(4)->lowercase_name()); } TEST_F(StylizedFieldNamesTest, CamelcaseName) { EXPECT_EQ("fooFoo", message_->field(0)->camelcase_name()); EXPECT_EQ("fooBar", message_->field(1)->camelcase_name()); EXPECT_EQ("fooBaz", message_->field(2)->camelcase_name()); EXPECT_EQ("fooFoo", message_->field(3)->camelcase_name()); EXPECT_EQ("foobar", message_->field(4)->camelcase_name()); EXPECT_EQ("barFoo", message_->extension(0)->camelcase_name()); EXPECT_EQ("barBar", message_->extension(1)->camelcase_name()); EXPECT_EQ("barBaz", message_->extension(2)->camelcase_name()); EXPECT_EQ("barFoo", message_->extension(3)->camelcase_name()); EXPECT_EQ("barbar", message_->extension(4)->camelcase_name()); EXPECT_EQ("bazFoo", file_->extension(0)->camelcase_name()); EXPECT_EQ("bazBar", file_->extension(1)->camelcase_name()); EXPECT_EQ("bazBaz", file_->extension(2)->camelcase_name()); EXPECT_EQ("bazFoo", file_->extension(3)->camelcase_name()); EXPECT_EQ("bazbar", file_->extension(4)->camelcase_name()); } TEST_F(StylizedFieldNamesTest, FindByLowercaseName) { EXPECT_EQ(message_->field(0), message_->FindFieldByLowercaseName("foo_foo")); EXPECT_EQ(message_->field(1), message_->FindFieldByLowercaseName("foobar")); EXPECT_EQ(message_->field(2), message_->FindFieldByLowercaseName("foobaz")); EXPECT_TRUE(message_->FindFieldByLowercaseName("FooBar") == NULL); EXPECT_TRUE(message_->FindFieldByLowercaseName("fooBaz") == NULL); EXPECT_TRUE(message_->FindFieldByLowercaseName("bar_foo") == NULL); EXPECT_TRUE(message_->FindFieldByLowercaseName("nosuchfield") == NULL); EXPECT_EQ(message_->extension(0), message_->FindExtensionByLowercaseName("bar_foo")); EXPECT_EQ(message_->extension(1), message_->FindExtensionByLowercaseName("barbar")); EXPECT_EQ(message_->extension(2), message_->FindExtensionByLowercaseName("barbaz")); EXPECT_TRUE(message_->FindExtensionByLowercaseName("BarBar") == NULL); EXPECT_TRUE(message_->FindExtensionByLowercaseName("barBaz") == NULL); EXPECT_TRUE(message_->FindExtensionByLowercaseName("foo_foo") == NULL); EXPECT_TRUE(message_->FindExtensionByLowercaseName("nosuchfield") == NULL); EXPECT_EQ(file_->extension(0), file_->FindExtensionByLowercaseName("baz_foo")); EXPECT_EQ(file_->extension(1), file_->FindExtensionByLowercaseName("bazbar")); EXPECT_EQ(file_->extension(2), file_->FindExtensionByLowercaseName("bazbaz")); EXPECT_TRUE(file_->FindExtensionByLowercaseName("BazBar") == NULL); EXPECT_TRUE(file_->FindExtensionByLowercaseName("bazBaz") == NULL); EXPECT_TRUE(file_->FindExtensionByLowercaseName("nosuchfield") == NULL); } TEST_F(StylizedFieldNamesTest, FindByCamelcaseName) { EXPECT_EQ(message_->field(0), message_->FindFieldByCamelcaseName("fooFoo")); EXPECT_EQ(message_->field(1), message_->FindFieldByCamelcaseName("fooBar")); EXPECT_EQ(message_->field(2), message_->FindFieldByCamelcaseName("fooBaz")); EXPECT_TRUE(message_->FindFieldByCamelcaseName("foo_foo") == NULL); EXPECT_TRUE(message_->FindFieldByCamelcaseName("FooBar") == NULL); EXPECT_TRUE(message_->FindFieldByCamelcaseName("barFoo") == NULL); EXPECT_TRUE(message_->FindFieldByCamelcaseName("nosuchfield") == NULL); EXPECT_EQ(message_->extension(0), message_->FindExtensionByCamelcaseName("barFoo")); EXPECT_EQ(message_->extension(1), message_->FindExtensionByCamelcaseName("barBar")); EXPECT_EQ(message_->extension(2), message_->FindExtensionByCamelcaseName("barBaz")); EXPECT_TRUE(message_->FindExtensionByCamelcaseName("bar_foo") == NULL); EXPECT_TRUE(message_->FindExtensionByCamelcaseName("BarBar") == NULL); EXPECT_TRUE(message_->FindExtensionByCamelcaseName("fooFoo") == NULL); EXPECT_TRUE(message_->FindExtensionByCamelcaseName("nosuchfield") == NULL); EXPECT_EQ(file_->extension(0), file_->FindExtensionByCamelcaseName("bazFoo")); EXPECT_EQ(file_->extension(1), file_->FindExtensionByCamelcaseName("bazBar")); EXPECT_EQ(file_->extension(2), file_->FindExtensionByCamelcaseName("bazBaz")); EXPECT_TRUE(file_->FindExtensionByCamelcaseName("baz_foo") == NULL); EXPECT_TRUE(file_->FindExtensionByCamelcaseName("BazBar") == NULL); EXPECT_TRUE(file_->FindExtensionByCamelcaseName("nosuchfield") == NULL); } // =================================================================== // Test enum descriptors. class EnumDescriptorTest : public testing::Test { protected: virtual void SetUp() { // Build descriptors for the following definitions: // // // in "foo.proto" // enum TestEnum { // FOO = 1; // BAR = 2; // } // // // in "bar.proto" // package corge.grault; // enum TestEnum2 { // FOO = 1; // BAZ = 3; // } // // TestEnum2 is primarily here to test FindValueByName and friends. // All enums created from the same DescriptorPool share the same lookup // table, so we need to insure that they don't interfere. // TestEnum FileDescriptorProto foo_file; foo_file.set_name("foo.proto"); EnumDescriptorProto* enum_proto = AddEnum(&foo_file, "TestEnum"); AddEnumValue(enum_proto, "FOO", 1); AddEnumValue(enum_proto, "BAR", 2); // TestEnum2 FileDescriptorProto bar_file; bar_file.set_name("bar.proto"); bar_file.set_package("corge.grault"); EnumDescriptorProto* enum2_proto = AddEnum(&bar_file, "TestEnum2"); AddEnumValue(enum2_proto, "FOO", 1); AddEnumValue(enum2_proto, "BAZ", 3); // Build the descriptors and get the pointers. foo_file_ = pool_.BuildFile(foo_file); ASSERT_TRUE(foo_file_ != NULL); bar_file_ = pool_.BuildFile(bar_file); ASSERT_TRUE(bar_file_ != NULL); ASSERT_EQ(1, foo_file_->enum_type_count()); enum_ = foo_file_->enum_type(0); ASSERT_EQ(2, enum_->value_count()); foo_ = enum_->value(0); bar_ = enum_->value(1); ASSERT_EQ(1, bar_file_->enum_type_count()); enum2_ = bar_file_->enum_type(0); ASSERT_EQ(2, enum2_->value_count()); foo2_ = enum2_->value(0); baz2_ = enum2_->value(1); } DescriptorPool pool_; const FileDescriptor* foo_file_; const FileDescriptor* bar_file_; const EnumDescriptor* enum_; const EnumDescriptor* enum2_; const EnumValueDescriptor* foo_; const EnumValueDescriptor* bar_; const EnumValueDescriptor* foo2_; const EnumValueDescriptor* baz2_; }; TEST_F(EnumDescriptorTest, Name) { EXPECT_EQ("TestEnum", enum_->name()); EXPECT_EQ("TestEnum", enum_->full_name()); EXPECT_EQ(foo_file_, enum_->file()); EXPECT_EQ("TestEnum2", enum2_->name()); EXPECT_EQ("corge.grault.TestEnum2", enum2_->full_name()); EXPECT_EQ(bar_file_, enum2_->file()); } TEST_F(EnumDescriptorTest, ContainingType) { EXPECT_TRUE(enum_->containing_type() == NULL); EXPECT_TRUE(enum2_->containing_type() == NULL); } TEST_F(EnumDescriptorTest, ValuesByIndex) { ASSERT_EQ(2, enum_->value_count()); EXPECT_EQ(foo_, enum_->value(0)); EXPECT_EQ(bar_, enum_->value(1)); } TEST_F(EnumDescriptorTest, FindValueByName) { EXPECT_EQ(foo_ , enum_ ->FindValueByName("FOO")); EXPECT_EQ(bar_ , enum_ ->FindValueByName("BAR")); EXPECT_EQ(foo2_, enum2_->FindValueByName("FOO")); EXPECT_EQ(baz2_, enum2_->FindValueByName("BAZ")); EXPECT_TRUE(enum_ ->FindValueByName("NO_SUCH_VALUE") == NULL); EXPECT_TRUE(enum_ ->FindValueByName("BAZ" ) == NULL); EXPECT_TRUE(enum2_->FindValueByName("BAR" ) == NULL); } TEST_F(EnumDescriptorTest, FindValueByNumber) { EXPECT_EQ(foo_ , enum_ ->FindValueByNumber(1)); EXPECT_EQ(bar_ , enum_ ->FindValueByNumber(2)); EXPECT_EQ(foo2_, enum2_->FindValueByNumber(1)); EXPECT_EQ(baz2_, enum2_->FindValueByNumber(3)); EXPECT_TRUE(enum_ ->FindValueByNumber(416) == NULL); EXPECT_TRUE(enum_ ->FindValueByNumber(3) == NULL); EXPECT_TRUE(enum2_->FindValueByNumber(2) == NULL); } TEST_F(EnumDescriptorTest, ValueName) { EXPECT_EQ("FOO", foo_->name()); EXPECT_EQ("BAR", bar_->name()); } TEST_F(EnumDescriptorTest, ValueFullName) { EXPECT_EQ("FOO", foo_->full_name()); EXPECT_EQ("BAR", bar_->full_name()); EXPECT_EQ("corge.grault.FOO", foo2_->full_name()); EXPECT_EQ("corge.grault.BAZ", baz2_->full_name()); } TEST_F(EnumDescriptorTest, ValueIndex) { EXPECT_EQ(0, foo_->index()); EXPECT_EQ(1, bar_->index()); } TEST_F(EnumDescriptorTest, ValueNumber) { EXPECT_EQ(1, foo_->number()); EXPECT_EQ(2, bar_->number()); } TEST_F(EnumDescriptorTest, ValueType) { EXPECT_EQ(enum_ , foo_ ->type()); EXPECT_EQ(enum_ , bar_ ->type()); EXPECT_EQ(enum2_, foo2_->type()); EXPECT_EQ(enum2_, baz2_->type()); } // =================================================================== // Test service descriptors. class ServiceDescriptorTest : public testing::Test { protected: virtual void SetUp() { // Build descriptors for the following messages and service: // // in "foo.proto" // message FooRequest {} // message FooResponse {} // message BarRequest {} // message BarResponse {} // message BazRequest {} // message BazResponse {} // // service TestService { // rpc Foo(FooRequest) returns (FooResponse); // rpc Bar(BarRequest) returns (BarResponse); // } // // // in "bar.proto" // package corge.grault // service TestService2 { // rpc Foo(FooRequest) returns (FooResponse); // rpc Baz(BazRequest) returns (BazResponse); // } FileDescriptorProto foo_file; foo_file.set_name("foo.proto"); AddMessage(&foo_file, "FooRequest"); AddMessage(&foo_file, "FooResponse"); AddMessage(&foo_file, "BarRequest"); AddMessage(&foo_file, "BarResponse"); AddMessage(&foo_file, "BazRequest"); AddMessage(&foo_file, "BazResponse"); ServiceDescriptorProto* service = AddService(&foo_file, "TestService"); AddMethod(service, "Foo", "FooRequest", "FooResponse"); AddMethod(service, "Bar", "BarRequest", "BarResponse"); FileDescriptorProto bar_file; bar_file.set_name("bar.proto"); bar_file.set_package("corge.grault"); bar_file.add_dependency("foo.proto"); ServiceDescriptorProto* service2 = AddService(&bar_file, "TestService2"); AddMethod(service2, "Foo", "FooRequest", "FooResponse"); AddMethod(service2, "Baz", "BazRequest", "BazResponse"); // Build the descriptors and get the pointers. foo_file_ = pool_.BuildFile(foo_file); ASSERT_TRUE(foo_file_ != NULL); bar_file_ = pool_.BuildFile(bar_file); ASSERT_TRUE(bar_file_ != NULL); ASSERT_EQ(6, foo_file_->message_type_count()); foo_request_ = foo_file_->message_type(0); foo_response_ = foo_file_->message_type(1); bar_request_ = foo_file_->message_type(2); bar_response_ = foo_file_->message_type(3); baz_request_ = foo_file_->message_type(4); baz_response_ = foo_file_->message_type(5); ASSERT_EQ(1, foo_file_->service_count()); service_ = foo_file_->service(0); ASSERT_EQ(2, service_->method_count()); foo_ = service_->method(0); bar_ = service_->method(1); ASSERT_EQ(1, bar_file_->service_count()); service2_ = bar_file_->service(0); ASSERT_EQ(2, service2_->method_count()); foo2_ = service2_->method(0); baz2_ = service2_->method(1); } DescriptorPool pool_; const FileDescriptor* foo_file_; const FileDescriptor* bar_file_; const Descriptor* foo_request_; const Descriptor* foo_response_; const Descriptor* bar_request_; const Descriptor* bar_response_; const Descriptor* baz_request_; const Descriptor* baz_response_; const ServiceDescriptor* service_; const ServiceDescriptor* service2_; const MethodDescriptor* foo_; const MethodDescriptor* bar_; const MethodDescriptor* foo2_; const MethodDescriptor* baz2_; }; TEST_F(ServiceDescriptorTest, Name) { EXPECT_EQ("TestService", service_->name()); EXPECT_EQ("TestService", service_->full_name()); EXPECT_EQ(foo_file_, service_->file()); EXPECT_EQ("TestService2", service2_->name()); EXPECT_EQ("corge.grault.TestService2", service2_->full_name()); EXPECT_EQ(bar_file_, service2_->file()); } TEST_F(ServiceDescriptorTest, MethodsByIndex) { ASSERT_EQ(2, service_->method_count()); EXPECT_EQ(foo_, service_->method(0)); EXPECT_EQ(bar_, service_->method(1)); } TEST_F(ServiceDescriptorTest, FindMethodByName) { EXPECT_EQ(foo_ , service_ ->FindMethodByName("Foo")); EXPECT_EQ(bar_ , service_ ->FindMethodByName("Bar")); EXPECT_EQ(foo2_, service2_->FindMethodByName("Foo")); EXPECT_EQ(baz2_, service2_->FindMethodByName("Baz")); EXPECT_TRUE(service_ ->FindMethodByName("NoSuchMethod") == NULL); EXPECT_TRUE(service_ ->FindMethodByName("Baz" ) == NULL); EXPECT_TRUE(service2_->FindMethodByName("Bar" ) == NULL); } TEST_F(ServiceDescriptorTest, MethodName) { EXPECT_EQ("Foo", foo_->name()); EXPECT_EQ("Bar", bar_->name()); } TEST_F(ServiceDescriptorTest, MethodFullName) { EXPECT_EQ("TestService.Foo", foo_->full_name()); EXPECT_EQ("TestService.Bar", bar_->full_name()); EXPECT_EQ("corge.grault.TestService2.Foo", foo2_->full_name()); EXPECT_EQ("corge.grault.TestService2.Baz", baz2_->full_name()); } TEST_F(ServiceDescriptorTest, MethodIndex) { EXPECT_EQ(0, foo_->index()); EXPECT_EQ(1, bar_->index()); } TEST_F(ServiceDescriptorTest, MethodParent) { EXPECT_EQ(service_, foo_->service()); EXPECT_EQ(service_, bar_->service()); } TEST_F(ServiceDescriptorTest, MethodInputType) { EXPECT_EQ(foo_request_, foo_->input_type()); EXPECT_EQ(bar_request_, bar_->input_type()); } TEST_F(ServiceDescriptorTest, MethodOutputType) { EXPECT_EQ(foo_response_, foo_->output_type()); EXPECT_EQ(bar_response_, bar_->output_type()); } // =================================================================== // Test nested types. class NestedDescriptorTest : public testing::Test { protected: virtual void SetUp() { // Build descriptors for the following definitions: // // // in "foo.proto" // message TestMessage { // message Foo {} // message Bar {} // enum Baz { A = 1; } // enum Qux { B = 1; } // } // // // in "bar.proto" // package corge.grault; // message TestMessage2 { // message Foo {} // message Baz {} // enum Qux { A = 1; } // enum Quux { C = 1; } // } // // TestMessage2 is primarily here to test FindNestedTypeByName and friends. // All messages created from the same DescriptorPool share the same lookup // table, so we need to insure that they don't interfere. // // We add enum values to the enums in order to test searching for enum // values across a message's scope. FileDescriptorProto foo_file; foo_file.set_name("foo.proto"); DescriptorProto* message = AddMessage(&foo_file, "TestMessage"); AddNestedMessage(message, "Foo"); AddNestedMessage(message, "Bar"); EnumDescriptorProto* baz = AddNestedEnum(message, "Baz"); AddEnumValue(baz, "A", 1); EnumDescriptorProto* qux = AddNestedEnum(message, "Qux"); AddEnumValue(qux, "B", 1); FileDescriptorProto bar_file; bar_file.set_name("bar.proto"); bar_file.set_package("corge.grault"); DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2"); AddNestedMessage(message2, "Foo"); AddNestedMessage(message2, "Baz"); EnumDescriptorProto* qux2 = AddNestedEnum(message2, "Qux"); AddEnumValue(qux2, "A", 1); EnumDescriptorProto* quux2 = AddNestedEnum(message2, "Quux"); AddEnumValue(quux2, "C", 1); // Build the descriptors and get the pointers. foo_file_ = pool_.BuildFile(foo_file); ASSERT_TRUE(foo_file_ != NULL); bar_file_ = pool_.BuildFile(bar_file); ASSERT_TRUE(bar_file_ != NULL); ASSERT_EQ(1, foo_file_->message_type_count()); message_ = foo_file_->message_type(0); ASSERT_EQ(2, message_->nested_type_count()); foo_ = message_->nested_type(0); bar_ = message_->nested_type(1); ASSERT_EQ(2, message_->enum_type_count()); baz_ = message_->enum_type(0); qux_ = message_->enum_type(1); ASSERT_EQ(1, baz_->value_count()); a_ = baz_->value(0); ASSERT_EQ(1, qux_->value_count()); b_ = qux_->value(0); ASSERT_EQ(1, bar_file_->message_type_count()); message2_ = bar_file_->message_type(0); ASSERT_EQ(2, message2_->nested_type_count()); foo2_ = message2_->nested_type(0); baz2_ = message2_->nested_type(1); ASSERT_EQ(2, message2_->enum_type_count()); qux2_ = message2_->enum_type(0); quux2_ = message2_->enum_type(1); ASSERT_EQ(1, qux2_->value_count()); a2_ = qux2_->value(0); ASSERT_EQ(1, quux2_->value_count()); c2_ = quux2_->value(0); } DescriptorPool pool_; const FileDescriptor* foo_file_; const FileDescriptor* bar_file_; const Descriptor* message_; const Descriptor* message2_; const Descriptor* foo_; const Descriptor* bar_; const EnumDescriptor* baz_; const EnumDescriptor* qux_; const EnumValueDescriptor* a_; const EnumValueDescriptor* b_; const Descriptor* foo2_; const Descriptor* baz2_; const EnumDescriptor* qux2_; const EnumDescriptor* quux2_; const EnumValueDescriptor* a2_; const EnumValueDescriptor* c2_; }; TEST_F(NestedDescriptorTest, MessageName) { EXPECT_EQ("Foo", foo_ ->name()); EXPECT_EQ("Bar", bar_ ->name()); EXPECT_EQ("Foo", foo2_->name()); EXPECT_EQ("Baz", baz2_->name()); EXPECT_EQ("TestMessage.Foo", foo_->full_name()); EXPECT_EQ("TestMessage.Bar", bar_->full_name()); EXPECT_EQ("corge.grault.TestMessage2.Foo", foo2_->full_name()); EXPECT_EQ("corge.grault.TestMessage2.Baz", baz2_->full_name()); } TEST_F(NestedDescriptorTest, MessageContainingType) { EXPECT_EQ(message_ , foo_ ->containing_type()); EXPECT_EQ(message_ , bar_ ->containing_type()); EXPECT_EQ(message2_, foo2_->containing_type()); EXPECT_EQ(message2_, baz2_->containing_type()); } TEST_F(NestedDescriptorTest, NestedMessagesByIndex) { ASSERT_EQ(2, message_->nested_type_count()); EXPECT_EQ(foo_, message_->nested_type(0)); EXPECT_EQ(bar_, message_->nested_type(1)); } TEST_F(NestedDescriptorTest, FindFieldByNameDoesntFindNestedTypes) { EXPECT_TRUE(message_->FindFieldByName("Foo") == NULL); EXPECT_TRUE(message_->FindFieldByName("Qux") == NULL); EXPECT_TRUE(message_->FindExtensionByName("Foo") == NULL); EXPECT_TRUE(message_->FindExtensionByName("Qux") == NULL); } TEST_F(NestedDescriptorTest, FindNestedTypeByName) { EXPECT_EQ(foo_ , message_ ->FindNestedTypeByName("Foo")); EXPECT_EQ(bar_ , message_ ->FindNestedTypeByName("Bar")); EXPECT_EQ(foo2_, message2_->FindNestedTypeByName("Foo")); EXPECT_EQ(baz2_, message2_->FindNestedTypeByName("Baz")); EXPECT_TRUE(message_ ->FindNestedTypeByName("NoSuchType") == NULL); EXPECT_TRUE(message_ ->FindNestedTypeByName("Baz" ) == NULL); EXPECT_TRUE(message2_->FindNestedTypeByName("Bar" ) == NULL); EXPECT_TRUE(message_->FindNestedTypeByName("Qux") == NULL); } TEST_F(NestedDescriptorTest, EnumName) { EXPECT_EQ("Baz" , baz_ ->name()); EXPECT_EQ("Qux" , qux_ ->name()); EXPECT_EQ("Qux" , qux2_->name()); EXPECT_EQ("Quux", quux2_->name()); EXPECT_EQ("TestMessage.Baz", baz_->full_name()); EXPECT_EQ("TestMessage.Qux", qux_->full_name()); EXPECT_EQ("corge.grault.TestMessage2.Qux" , qux2_ ->full_name()); EXPECT_EQ("corge.grault.TestMessage2.Quux", quux2_->full_name()); } TEST_F(NestedDescriptorTest, EnumContainingType) { EXPECT_EQ(message_ , baz_ ->containing_type()); EXPECT_EQ(message_ , qux_ ->containing_type()); EXPECT_EQ(message2_, qux2_ ->containing_type()); EXPECT_EQ(message2_, quux2_->containing_type()); } TEST_F(NestedDescriptorTest, NestedEnumsByIndex) { ASSERT_EQ(2, message_->nested_type_count()); EXPECT_EQ(foo_, message_->nested_type(0)); EXPECT_EQ(bar_, message_->nested_type(1)); } TEST_F(NestedDescriptorTest, FindEnumTypeByName) { EXPECT_EQ(baz_ , message_ ->FindEnumTypeByName("Baz" )); EXPECT_EQ(qux_ , message_ ->FindEnumTypeByName("Qux" )); EXPECT_EQ(qux2_ , message2_->FindEnumTypeByName("Qux" )); EXPECT_EQ(quux2_, message2_->FindEnumTypeByName("Quux")); EXPECT_TRUE(message_ ->FindEnumTypeByName("NoSuchType") == NULL); EXPECT_TRUE(message_ ->FindEnumTypeByName("Quux" ) == NULL); EXPECT_TRUE(message2_->FindEnumTypeByName("Baz" ) == NULL); EXPECT_TRUE(message_->FindEnumTypeByName("Foo") == NULL); } TEST_F(NestedDescriptorTest, FindEnumValueByName) { EXPECT_EQ(a_ , message_ ->FindEnumValueByName("A")); EXPECT_EQ(b_ , message_ ->FindEnumValueByName("B")); EXPECT_EQ(a2_, message2_->FindEnumValueByName("A")); EXPECT_EQ(c2_, message2_->FindEnumValueByName("C")); EXPECT_TRUE(message_ ->FindEnumValueByName("NO_SUCH_VALUE") == NULL); EXPECT_TRUE(message_ ->FindEnumValueByName("C" ) == NULL); EXPECT_TRUE(message2_->FindEnumValueByName("B" ) == NULL); EXPECT_TRUE(message_->FindEnumValueByName("Foo") == NULL); } // =================================================================== // Test extensions. class ExtensionDescriptorTest : public testing::Test { protected: virtual void SetUp() { // Build descriptors for the following definitions: // // enum Baz {} // message Qux {} // // message Foo { // extensions 10 to 19; // extensions 30 to 39; // } // extends Foo with optional int32 foo_int32 = 10; // extends Foo with repeated TestEnum foo_enum = 19; // message Bar { // extends Foo with optional Qux foo_message = 30; // // (using Qux as the group type) // extends Foo with repeated group foo_group = 39; // } FileDescriptorProto foo_file; foo_file.set_name("foo.proto"); AddEmptyEnum(&foo_file, "Baz"); AddMessage(&foo_file, "Qux"); DescriptorProto* foo = AddMessage(&foo_file, "Foo"); AddExtensionRange(foo, 10, 20); AddExtensionRange(foo, 30, 40); AddExtension(&foo_file, "Foo", "foo_int32", 10, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); AddExtension(&foo_file, "Foo", "foo_enum", 19, FieldDescriptorProto::LABEL_REPEATED, FieldDescriptorProto::TYPE_ENUM) ->set_type_name("Baz"); DescriptorProto* bar = AddMessage(&foo_file, "Bar"); AddNestedExtension(bar, "Foo", "foo_message", 30, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_MESSAGE) ->set_type_name("Qux"); AddNestedExtension(bar, "Foo", "foo_group", 39, FieldDescriptorProto::LABEL_REPEATED, FieldDescriptorProto::TYPE_GROUP) ->set_type_name("Qux"); // Build the descriptors and get the pointers. foo_file_ = pool_.BuildFile(foo_file); ASSERT_TRUE(foo_file_ != NULL); ASSERT_EQ(1, foo_file_->enum_type_count()); baz_ = foo_file_->enum_type(0); ASSERT_EQ(3, foo_file_->message_type_count()); qux_ = foo_file_->message_type(0); foo_ = foo_file_->message_type(1); bar_ = foo_file_->message_type(2); } DescriptorPool pool_; const FileDescriptor* foo_file_; const Descriptor* foo_; const Descriptor* bar_; const EnumDescriptor* baz_; const Descriptor* qux_; }; TEST_F(ExtensionDescriptorTest, ExtensionRanges) { EXPECT_EQ(0, bar_->extension_range_count()); ASSERT_EQ(2, foo_->extension_range_count()); EXPECT_EQ(10, foo_->extension_range(0)->start); EXPECT_EQ(30, foo_->extension_range(1)->start); EXPECT_EQ(20, foo_->extension_range(0)->end); EXPECT_EQ(40, foo_->extension_range(1)->end); }; TEST_F(ExtensionDescriptorTest, Extensions) { EXPECT_EQ(0, foo_->extension_count()); ASSERT_EQ(2, foo_file_->extension_count()); ASSERT_EQ(2, bar_->extension_count()); EXPECT_TRUE(foo_file_->extension(0)->is_extension()); EXPECT_TRUE(foo_file_->extension(1)->is_extension()); EXPECT_TRUE(bar_->extension(0)->is_extension()); EXPECT_TRUE(bar_->extension(1)->is_extension()); EXPECT_EQ("foo_int32" , foo_file_->extension(0)->name()); EXPECT_EQ("foo_enum" , foo_file_->extension(1)->name()); EXPECT_EQ("foo_message", bar_->extension(0)->name()); EXPECT_EQ("foo_group" , bar_->extension(1)->name()); EXPECT_EQ(10, foo_file_->extension(0)->number()); EXPECT_EQ(19, foo_file_->extension(1)->number()); EXPECT_EQ(30, bar_->extension(0)->number()); EXPECT_EQ(39, bar_->extension(1)->number()); EXPECT_EQ(FieldDescriptor::TYPE_INT32 , foo_file_->extension(0)->type()); EXPECT_EQ(FieldDescriptor::TYPE_ENUM , foo_file_->extension(1)->type()); EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_->extension(0)->type()); EXPECT_EQ(FieldDescriptor::TYPE_GROUP , bar_->extension(1)->type()); EXPECT_EQ(baz_, foo_file_->extension(1)->enum_type()); EXPECT_EQ(qux_, bar_->extension(0)->message_type()); EXPECT_EQ(qux_, bar_->extension(1)->message_type()); EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, foo_file_->extension(0)->label()); EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, foo_file_->extension(1)->label()); EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->extension(0)->label()); EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, bar_->extension(1)->label()); EXPECT_EQ(foo_, foo_file_->extension(0)->containing_type()); EXPECT_EQ(foo_, foo_file_->extension(1)->containing_type()); EXPECT_EQ(foo_, bar_->extension(0)->containing_type()); EXPECT_EQ(foo_, bar_->extension(1)->containing_type()); EXPECT_TRUE(foo_file_->extension(0)->extension_scope() == NULL); EXPECT_TRUE(foo_file_->extension(1)->extension_scope() == NULL); EXPECT_EQ(bar_, bar_->extension(0)->extension_scope()); EXPECT_EQ(bar_, bar_->extension(1)->extension_scope()); }; TEST_F(ExtensionDescriptorTest, IsExtensionNumber) { EXPECT_FALSE(foo_->IsExtensionNumber( 9)); EXPECT_TRUE (foo_->IsExtensionNumber(10)); EXPECT_TRUE (foo_->IsExtensionNumber(19)); EXPECT_FALSE(foo_->IsExtensionNumber(20)); EXPECT_FALSE(foo_->IsExtensionNumber(29)); EXPECT_TRUE (foo_->IsExtensionNumber(30)); EXPECT_TRUE (foo_->IsExtensionNumber(39)); EXPECT_FALSE(foo_->IsExtensionNumber(40)); } TEST_F(ExtensionDescriptorTest, FindExtensionByName) { // Note that FileDescriptor::FindExtensionByName() is tested by // FileDescriptorTest. ASSERT_EQ(2, bar_->extension_count()); EXPECT_EQ(bar_->extension(0), bar_->FindExtensionByName("foo_message")); EXPECT_EQ(bar_->extension(1), bar_->FindExtensionByName("foo_group" )); EXPECT_TRUE(bar_->FindExtensionByName("no_such_extension") == NULL); EXPECT_TRUE(foo_->FindExtensionByName("foo_int32") == NULL); EXPECT_TRUE(foo_->FindExtensionByName("foo_message") == NULL); } TEST_F(ExtensionDescriptorTest, FindAllExtensions) { std::vector extensions; pool_.FindAllExtensions(foo_, &extensions); ASSERT_EQ(4, extensions.size()); EXPECT_EQ(10, extensions[0]->number()); EXPECT_EQ(19, extensions[1]->number()); EXPECT_EQ(30, extensions[2]->number()); EXPECT_EQ(39, extensions[3]->number()); } TEST_F(ExtensionDescriptorTest, DuplicateFieldNumber) { DescriptorPool pool; FileDescriptorProto file_proto; // Add "google/protobuf/descriptor.proto". FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); // Add "foo.proto": // import "google/protobuf/descriptor.proto"; // extend google.protobuf.FieldOptions { // optional int32 option1 = 1000; // } file_proto.Clear(); file_proto.set_name("foo.proto"); file_proto.add_dependency("google/protobuf/descriptor.proto"); AddExtension(&file_proto, "google.protobuf.FieldOptions", "option1", 1000, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); // Add "bar.proto": // import "google/protobuf/descriptor.proto"; // extend google.protobuf.FieldOptions { // optional int32 option2 = 1000; // } file_proto.Clear(); file_proto.set_name("bar.proto"); file_proto.add_dependency("google/protobuf/descriptor.proto"); AddExtension(&file_proto, "google.protobuf.FieldOptions", "option2", 1000, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); // Currently we only generate a warning for conflicting extension numbers. // TODO(xiaofeng): Change it to an error. ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); } // =================================================================== // Test reserved fields. class ReservedDescriptorTest : public testing::Test { protected: virtual void SetUp() { // Build descriptors for the following definitions: // // message Foo { // reserved 2, 9 to 11, 15; // reserved "foo", "bar"; // } FileDescriptorProto foo_file; foo_file.set_name("foo.proto"); DescriptorProto* foo = AddMessage(&foo_file, "Foo"); AddReservedRange(foo, 2, 3); AddReservedRange(foo, 9, 12); AddReservedRange(foo, 15, 16); foo->add_reserved_name("foo"); foo->add_reserved_name("bar"); // Build the descriptors and get the pointers. foo_file_ = pool_.BuildFile(foo_file); ASSERT_TRUE(foo_file_ != NULL); ASSERT_EQ(1, foo_file_->message_type_count()); foo_ = foo_file_->message_type(0); } DescriptorPool pool_; const FileDescriptor* foo_file_; const Descriptor* foo_; }; TEST_F(ReservedDescriptorTest, ReservedRanges) { ASSERT_EQ(3, foo_->reserved_range_count()); EXPECT_EQ(2, foo_->reserved_range(0)->start); EXPECT_EQ(3, foo_->reserved_range(0)->end); EXPECT_EQ(9, foo_->reserved_range(1)->start); EXPECT_EQ(12, foo_->reserved_range(1)->end); EXPECT_EQ(15, foo_->reserved_range(2)->start); EXPECT_EQ(16, foo_->reserved_range(2)->end); }; TEST_F(ReservedDescriptorTest, IsReservedNumber) { EXPECT_FALSE(foo_->IsReservedNumber(1)); EXPECT_TRUE (foo_->IsReservedNumber(2)); EXPECT_FALSE(foo_->IsReservedNumber(3)); EXPECT_FALSE(foo_->IsReservedNumber(8)); EXPECT_TRUE (foo_->IsReservedNumber(9)); EXPECT_TRUE (foo_->IsReservedNumber(10)); EXPECT_TRUE (foo_->IsReservedNumber(11)); EXPECT_FALSE(foo_->IsReservedNumber(12)); EXPECT_FALSE(foo_->IsReservedNumber(13)); EXPECT_FALSE(foo_->IsReservedNumber(14)); EXPECT_TRUE (foo_->IsReservedNumber(15)); EXPECT_FALSE(foo_->IsReservedNumber(16)); }; TEST_F(ReservedDescriptorTest, ReservedNames) { ASSERT_EQ(2, foo_->reserved_name_count()); EXPECT_EQ("foo", foo_->reserved_name(0)); EXPECT_EQ("bar", foo_->reserved_name(1)); }; TEST_F(ReservedDescriptorTest, IsReservedName) { EXPECT_TRUE (foo_->IsReservedName("foo")); EXPECT_TRUE (foo_->IsReservedName("bar")); EXPECT_FALSE(foo_->IsReservedName("baz")); }; // =================================================================== // Test reserved enum fields. class ReservedEnumDescriptorTest : public testing::Test { protected: virtual void SetUp() { // Build descriptors for the following definitions: // // enum Foo { // BAR = 1; // reserved 2, 9 to 11, 15; // reserved "foo", "bar"; // } FileDescriptorProto foo_file; foo_file.set_name("foo.proto"); EnumDescriptorProto* foo = AddEnum(&foo_file, "Foo"); EnumDescriptorProto* edge1 = AddEnum(&foo_file, "Edge1"); EnumDescriptorProto* edge2 = AddEnum(&foo_file, "Edge2"); AddEnumValue(foo, "BAR", 4); AddReservedRange(foo, -5, -3); AddReservedRange(foo, -2, 1); AddReservedRange(foo, 2, 3); AddReservedRange(foo, 9, 12); AddReservedRange(foo, 15, 16); foo->add_reserved_name("foo"); foo->add_reserved_name("bar"); // Some additional edge cases that cover most or all of the range of enum // values // Note: We use INT_MAX as the maximum reserved range upper bound, // inclusive. AddEnumValue(edge1, "EDGE1", 1); AddReservedRange(edge1, 10, INT_MAX); AddEnumValue(edge2, "EDGE2", 15); AddReservedRange(edge2, INT_MIN, 10); // Build the descriptors and get the pointers. foo_file_ = pool_.BuildFile(foo_file); ASSERT_TRUE(foo_file_ != NULL); ASSERT_EQ(3, foo_file_->enum_type_count()); foo_ = foo_file_->enum_type(0); edge1_ = foo_file_->enum_type(1); edge2_ = foo_file_->enum_type(2); } DescriptorPool pool_; const FileDescriptor* foo_file_; const EnumDescriptor* foo_; const EnumDescriptor* edge1_; const EnumDescriptor* edge2_; }; TEST_F(ReservedEnumDescriptorTest, ReservedRanges) { ASSERT_EQ(5, foo_->reserved_range_count()); EXPECT_EQ(-5, foo_->reserved_range(0)->start); EXPECT_EQ(-3, foo_->reserved_range(0)->end); EXPECT_EQ(-2, foo_->reserved_range(1)->start); EXPECT_EQ(1, foo_->reserved_range(1)->end); EXPECT_EQ(2, foo_->reserved_range(2)->start); EXPECT_EQ(3, foo_->reserved_range(2)->end); EXPECT_EQ(9, foo_->reserved_range(3)->start); EXPECT_EQ(12, foo_->reserved_range(3)->end); EXPECT_EQ(15, foo_->reserved_range(4)->start); EXPECT_EQ(16, foo_->reserved_range(4)->end); ASSERT_EQ(1, edge1_->reserved_range_count()); EXPECT_EQ(10, edge1_->reserved_range(0)->start); EXPECT_EQ(INT_MAX, edge1_->reserved_range(0)->end); ASSERT_EQ(1, edge2_->reserved_range_count()); EXPECT_EQ(INT_MIN, edge2_->reserved_range(0)->start); EXPECT_EQ(10, edge2_->reserved_range(0)->end); } TEST_F(ReservedEnumDescriptorTest, IsReservedNumber) { EXPECT_TRUE(foo_->IsReservedNumber(-5)); EXPECT_TRUE(foo_->IsReservedNumber(-4)); EXPECT_TRUE(foo_->IsReservedNumber(-3)); EXPECT_TRUE(foo_->IsReservedNumber(-2)); EXPECT_TRUE(foo_->IsReservedNumber(-1)); EXPECT_TRUE(foo_->IsReservedNumber(0)); EXPECT_TRUE(foo_->IsReservedNumber(1)); EXPECT_TRUE (foo_->IsReservedNumber(2)); EXPECT_TRUE(foo_->IsReservedNumber(3)); EXPECT_FALSE(foo_->IsReservedNumber(8)); EXPECT_TRUE (foo_->IsReservedNumber(9)); EXPECT_TRUE (foo_->IsReservedNumber(10)); EXPECT_TRUE (foo_->IsReservedNumber(11)); EXPECT_TRUE(foo_->IsReservedNumber(12)); EXPECT_FALSE(foo_->IsReservedNumber(13)); EXPECT_FALSE(foo_->IsReservedNumber(13)); EXPECT_FALSE(foo_->IsReservedNumber(14)); EXPECT_TRUE (foo_->IsReservedNumber(15)); EXPECT_TRUE(foo_->IsReservedNumber(16)); EXPECT_FALSE(foo_->IsReservedNumber(17)); EXPECT_FALSE(edge1_->IsReservedNumber(9)); EXPECT_TRUE(edge1_->IsReservedNumber(10)); EXPECT_TRUE(edge1_->IsReservedNumber(INT_MAX - 1)); EXPECT_TRUE(edge1_->IsReservedNumber(INT_MAX)); EXPECT_TRUE(edge2_->IsReservedNumber(INT_MIN)); EXPECT_TRUE(edge2_->IsReservedNumber(9)); EXPECT_TRUE(edge2_->IsReservedNumber(10)); EXPECT_FALSE(edge2_->IsReservedNumber(11)); } TEST_F(ReservedEnumDescriptorTest, ReservedNames) { ASSERT_EQ(2, foo_->reserved_name_count()); EXPECT_EQ("foo", foo_->reserved_name(0)); EXPECT_EQ("bar", foo_->reserved_name(1)); } TEST_F(ReservedEnumDescriptorTest, IsReservedName) { EXPECT_TRUE (foo_->IsReservedName("foo")); EXPECT_TRUE (foo_->IsReservedName("bar")); EXPECT_FALSE(foo_->IsReservedName("baz")); } // =================================================================== class MiscTest : public testing::Test { protected: // Function which makes a field descriptor of the given type. const FieldDescriptor* GetFieldDescriptorOfType(FieldDescriptor::Type type) { FileDescriptorProto file_proto; file_proto.set_name("foo.proto"); AddEmptyEnum(&file_proto, "DummyEnum"); DescriptorProto* message = AddMessage(&file_proto, "TestMessage"); FieldDescriptorProto* field = AddField(message, "foo", 1, FieldDescriptorProto::LABEL_OPTIONAL, static_cast(static_cast(type))); if (type == FieldDescriptor::TYPE_MESSAGE || type == FieldDescriptor::TYPE_GROUP) { field->set_type_name("TestMessage"); } else if (type == FieldDescriptor::TYPE_ENUM) { field->set_type_name("DummyEnum"); } // Build the descriptors and get the pointers. pool_.reset(new DescriptorPool()); const FileDescriptor* file = pool_->BuildFile(file_proto); if (file != NULL && file->message_type_count() == 1 && file->message_type(0)->field_count() == 1) { return file->message_type(0)->field(0); } else { return NULL; } } const char* GetTypeNameForFieldType(FieldDescriptor::Type type) { const FieldDescriptor* field = GetFieldDescriptorOfType(type); return field != NULL ? field->type_name() : ""; } FieldDescriptor::CppType GetCppTypeForFieldType(FieldDescriptor::Type type) { const FieldDescriptor* field = GetFieldDescriptorOfType(type); return field != NULL ? field->cpp_type() : static_cast(0); } const char* GetCppTypeNameForFieldType(FieldDescriptor::Type type) { const FieldDescriptor* field = GetFieldDescriptorOfType(type); return field != NULL ? field->cpp_type_name() : ""; } const Descriptor* GetMessageDescriptorForFieldType( FieldDescriptor::Type type) { const FieldDescriptor* field = GetFieldDescriptorOfType(type); return field != NULL ? field->message_type() : NULL; } const EnumDescriptor* GetEnumDescriptorForFieldType( FieldDescriptor::Type type) { const FieldDescriptor* field = GetFieldDescriptorOfType(type); return field != NULL ? field->enum_type() : NULL; } google::protobuf::scoped_ptr pool_; }; TEST_F(MiscTest, TypeNames) { // Test that correct type names are returned. typedef FieldDescriptor FD; // avoid ugly line wrapping EXPECT_STREQ("double" , GetTypeNameForFieldType(FD::TYPE_DOUBLE )); EXPECT_STREQ("float" , GetTypeNameForFieldType(FD::TYPE_FLOAT )); EXPECT_STREQ("int64" , GetTypeNameForFieldType(FD::TYPE_INT64 )); EXPECT_STREQ("uint64" , GetTypeNameForFieldType(FD::TYPE_UINT64 )); EXPECT_STREQ("int32" , GetTypeNameForFieldType(FD::TYPE_INT32 )); EXPECT_STREQ("fixed64" , GetTypeNameForFieldType(FD::TYPE_FIXED64 )); EXPECT_STREQ("fixed32" , GetTypeNameForFieldType(FD::TYPE_FIXED32 )); EXPECT_STREQ("bool" , GetTypeNameForFieldType(FD::TYPE_BOOL )); EXPECT_STREQ("string" , GetTypeNameForFieldType(FD::TYPE_STRING )); EXPECT_STREQ("group" , GetTypeNameForFieldType(FD::TYPE_GROUP )); EXPECT_STREQ("message" , GetTypeNameForFieldType(FD::TYPE_MESSAGE )); EXPECT_STREQ("bytes" , GetTypeNameForFieldType(FD::TYPE_BYTES )); EXPECT_STREQ("uint32" , GetTypeNameForFieldType(FD::TYPE_UINT32 )); EXPECT_STREQ("enum" , GetTypeNameForFieldType(FD::TYPE_ENUM )); EXPECT_STREQ("sfixed32", GetTypeNameForFieldType(FD::TYPE_SFIXED32)); EXPECT_STREQ("sfixed64", GetTypeNameForFieldType(FD::TYPE_SFIXED64)); EXPECT_STREQ("sint32" , GetTypeNameForFieldType(FD::TYPE_SINT32 )); EXPECT_STREQ("sint64" , GetTypeNameForFieldType(FD::TYPE_SINT64 )); } TEST_F(MiscTest, StaticTypeNames) { // Test that correct type names are returned. typedef FieldDescriptor FD; // avoid ugly line wrapping EXPECT_STREQ("double" , FD::TypeName(FD::TYPE_DOUBLE )); EXPECT_STREQ("float" , FD::TypeName(FD::TYPE_FLOAT )); EXPECT_STREQ("int64" , FD::TypeName(FD::TYPE_INT64 )); EXPECT_STREQ("uint64" , FD::TypeName(FD::TYPE_UINT64 )); EXPECT_STREQ("int32" , FD::TypeName(FD::TYPE_INT32 )); EXPECT_STREQ("fixed64" , FD::TypeName(FD::TYPE_FIXED64 )); EXPECT_STREQ("fixed32" , FD::TypeName(FD::TYPE_FIXED32 )); EXPECT_STREQ("bool" , FD::TypeName(FD::TYPE_BOOL )); EXPECT_STREQ("string" , FD::TypeName(FD::TYPE_STRING )); EXPECT_STREQ("group" , FD::TypeName(FD::TYPE_GROUP )); EXPECT_STREQ("message" , FD::TypeName(FD::TYPE_MESSAGE )); EXPECT_STREQ("bytes" , FD::TypeName(FD::TYPE_BYTES )); EXPECT_STREQ("uint32" , FD::TypeName(FD::TYPE_UINT32 )); EXPECT_STREQ("enum" , FD::TypeName(FD::TYPE_ENUM )); EXPECT_STREQ("sfixed32", FD::TypeName(FD::TYPE_SFIXED32)); EXPECT_STREQ("sfixed64", FD::TypeName(FD::TYPE_SFIXED64)); EXPECT_STREQ("sint32" , FD::TypeName(FD::TYPE_SINT32 )); EXPECT_STREQ("sint64" , FD::TypeName(FD::TYPE_SINT64 )); } TEST_F(MiscTest, CppTypes) { // Test that CPP types are assigned correctly. typedef FieldDescriptor FD; // avoid ugly line wrapping EXPECT_EQ(FD::CPPTYPE_DOUBLE , GetCppTypeForFieldType(FD::TYPE_DOUBLE )); EXPECT_EQ(FD::CPPTYPE_FLOAT , GetCppTypeForFieldType(FD::TYPE_FLOAT )); EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_INT64 )); EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_UINT64 )); EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_INT32 )); EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_FIXED64 )); EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_FIXED32 )); EXPECT_EQ(FD::CPPTYPE_BOOL , GetCppTypeForFieldType(FD::TYPE_BOOL )); EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_STRING )); EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_GROUP )); EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_MESSAGE )); EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_BYTES )); EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_UINT32 )); EXPECT_EQ(FD::CPPTYPE_ENUM , GetCppTypeForFieldType(FD::TYPE_ENUM )); EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_SFIXED32)); EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_SFIXED64)); EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_SINT32 )); EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_SINT64 )); } TEST_F(MiscTest, CppTypeNames) { // Test that correct CPP type names are returned. typedef FieldDescriptor FD; // avoid ugly line wrapping EXPECT_STREQ("double" , GetCppTypeNameForFieldType(FD::TYPE_DOUBLE )); EXPECT_STREQ("float" , GetCppTypeNameForFieldType(FD::TYPE_FLOAT )); EXPECT_STREQ("int64" , GetCppTypeNameForFieldType(FD::TYPE_INT64 )); EXPECT_STREQ("uint64" , GetCppTypeNameForFieldType(FD::TYPE_UINT64 )); EXPECT_STREQ("int32" , GetCppTypeNameForFieldType(FD::TYPE_INT32 )); EXPECT_STREQ("uint64" , GetCppTypeNameForFieldType(FD::TYPE_FIXED64 )); EXPECT_STREQ("uint32" , GetCppTypeNameForFieldType(FD::TYPE_FIXED32 )); EXPECT_STREQ("bool" , GetCppTypeNameForFieldType(FD::TYPE_BOOL )); EXPECT_STREQ("string" , GetCppTypeNameForFieldType(FD::TYPE_STRING )); EXPECT_STREQ("message", GetCppTypeNameForFieldType(FD::TYPE_GROUP )); EXPECT_STREQ("message", GetCppTypeNameForFieldType(FD::TYPE_MESSAGE )); EXPECT_STREQ("string" , GetCppTypeNameForFieldType(FD::TYPE_BYTES )); EXPECT_STREQ("uint32" , GetCppTypeNameForFieldType(FD::TYPE_UINT32 )); EXPECT_STREQ("enum" , GetCppTypeNameForFieldType(FD::TYPE_ENUM )); EXPECT_STREQ("int32" , GetCppTypeNameForFieldType(FD::TYPE_SFIXED32)); EXPECT_STREQ("int64" , GetCppTypeNameForFieldType(FD::TYPE_SFIXED64)); EXPECT_STREQ("int32" , GetCppTypeNameForFieldType(FD::TYPE_SINT32 )); EXPECT_STREQ("int64" , GetCppTypeNameForFieldType(FD::TYPE_SINT64 )); } TEST_F(MiscTest, StaticCppTypeNames) { // Test that correct CPP type names are returned. typedef FieldDescriptor FD; // avoid ugly line wrapping EXPECT_STREQ("int32" , FD::CppTypeName(FD::CPPTYPE_INT32 )); EXPECT_STREQ("int64" , FD::CppTypeName(FD::CPPTYPE_INT64 )); EXPECT_STREQ("uint32" , FD::CppTypeName(FD::CPPTYPE_UINT32 )); EXPECT_STREQ("uint64" , FD::CppTypeName(FD::CPPTYPE_UINT64 )); EXPECT_STREQ("double" , FD::CppTypeName(FD::CPPTYPE_DOUBLE )); EXPECT_STREQ("float" , FD::CppTypeName(FD::CPPTYPE_FLOAT )); EXPECT_STREQ("bool" , FD::CppTypeName(FD::CPPTYPE_BOOL )); EXPECT_STREQ("enum" , FD::CppTypeName(FD::CPPTYPE_ENUM )); EXPECT_STREQ("string" , FD::CppTypeName(FD::CPPTYPE_STRING )); EXPECT_STREQ("message", FD::CppTypeName(FD::CPPTYPE_MESSAGE)); } TEST_F(MiscTest, MessageType) { // Test that message_type() is NULL for non-aggregate fields typedef FieldDescriptor FD; // avoid ugly line wrapping EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_DOUBLE )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FLOAT )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_INT64 )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_UINT64 )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_INT32 )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FIXED64 )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FIXED32 )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_BOOL )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_STRING )); EXPECT_TRUE(NULL != GetMessageDescriptorForFieldType(FD::TYPE_GROUP )); EXPECT_TRUE(NULL != GetMessageDescriptorForFieldType(FD::TYPE_MESSAGE )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_BYTES )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_UINT32 )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_ENUM )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SFIXED32)); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SFIXED64)); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SINT32 )); EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SINT64 )); } TEST_F(MiscTest, EnumType) { // Test that enum_type() is NULL for non-enum fields typedef FieldDescriptor FD; // avoid ugly line wrapping EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_DOUBLE )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FLOAT )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_INT64 )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_UINT64 )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_INT32 )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FIXED64 )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FIXED32 )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_BOOL )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_STRING )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_GROUP )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_MESSAGE )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_BYTES )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_UINT32 )); EXPECT_TRUE(NULL != GetEnumDescriptorForFieldType(FD::TYPE_ENUM )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SFIXED32)); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SFIXED64)); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SINT32 )); EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SINT64 )); } TEST_F(MiscTest, DefaultValues) { // Test that setting default values works. FileDescriptorProto file_proto; file_proto.set_name("foo.proto"); EnumDescriptorProto* enum_type_proto = AddEnum(&file_proto, "DummyEnum"); AddEnumValue(enum_type_proto, "A", 1); AddEnumValue(enum_type_proto, "B", 2); DescriptorProto* message_proto = AddMessage(&file_proto, "TestMessage"); typedef FieldDescriptorProto FD; // avoid ugly line wrapping const FD::Label label = FD::LABEL_OPTIONAL; // Create fields of every CPP type with default values. AddField(message_proto, "int32" , 1, label, FD::TYPE_INT32 ) ->set_default_value("-1"); AddField(message_proto, "int64" , 2, label, FD::TYPE_INT64 ) ->set_default_value("-1000000000000"); AddField(message_proto, "uint32", 3, label, FD::TYPE_UINT32) ->set_default_value("42"); AddField(message_proto, "uint64", 4, label, FD::TYPE_UINT64) ->set_default_value("2000000000000"); AddField(message_proto, "float" , 5, label, FD::TYPE_FLOAT ) ->set_default_value("4.5"); AddField(message_proto, "double", 6, label, FD::TYPE_DOUBLE) ->set_default_value("10e100"); AddField(message_proto, "bool" , 7, label, FD::TYPE_BOOL ) ->set_default_value("true"); AddField(message_proto, "string", 8, label, FD::TYPE_STRING) ->set_default_value("hello"); AddField(message_proto, "data" , 9, label, FD::TYPE_BYTES ) ->set_default_value("\\001\\002\\003"); FieldDescriptorProto* enum_field = AddField(message_proto, "enum", 10, label, FD::TYPE_ENUM); enum_field->set_type_name("DummyEnum"); enum_field->set_default_value("B"); // Strings are allowed to have empty defaults. (At one point, due to // a bug, empty defaults for strings were rejected. Oops.) AddField(message_proto, "empty_string", 11, label, FD::TYPE_STRING) ->set_default_value(""); // Add a second set of fields with implicit defalut values. AddField(message_proto, "implicit_int32" , 21, label, FD::TYPE_INT32 ); AddField(message_proto, "implicit_int64" , 22, label, FD::TYPE_INT64 ); AddField(message_proto, "implicit_uint32", 23, label, FD::TYPE_UINT32); AddField(message_proto, "implicit_uint64", 24, label, FD::TYPE_UINT64); AddField(message_proto, "implicit_float" , 25, label, FD::TYPE_FLOAT ); AddField(message_proto, "implicit_double", 26, label, FD::TYPE_DOUBLE); AddField(message_proto, "implicit_bool" , 27, label, FD::TYPE_BOOL ); AddField(message_proto, "implicit_string", 28, label, FD::TYPE_STRING); AddField(message_proto, "implicit_data" , 29, label, FD::TYPE_BYTES ); AddField(message_proto, "implicit_enum" , 30, label, FD::TYPE_ENUM) ->set_type_name("DummyEnum"); // Build it. DescriptorPool pool; const FileDescriptor* file = pool.BuildFile(file_proto); ASSERT_TRUE(file != NULL); ASSERT_EQ(1, file->enum_type_count()); const EnumDescriptor* enum_type = file->enum_type(0); ASSERT_EQ(2, enum_type->value_count()); const EnumValueDescriptor* enum_value_a = enum_type->value(0); const EnumValueDescriptor* enum_value_b = enum_type->value(1); ASSERT_EQ(1, file->message_type_count()); const Descriptor* message = file->message_type(0); ASSERT_EQ(21, message->field_count()); // Check the default values. ASSERT_TRUE(message->field(0)->has_default_value()); ASSERT_TRUE(message->field(1)->has_default_value()); ASSERT_TRUE(message->field(2)->has_default_value()); ASSERT_TRUE(message->field(3)->has_default_value()); ASSERT_TRUE(message->field(4)->has_default_value()); ASSERT_TRUE(message->field(5)->has_default_value()); ASSERT_TRUE(message->field(6)->has_default_value()); ASSERT_TRUE(message->field(7)->has_default_value()); ASSERT_TRUE(message->field(8)->has_default_value()); ASSERT_TRUE(message->field(9)->has_default_value()); ASSERT_TRUE(message->field(10)->has_default_value()); EXPECT_EQ(-1 , message->field(0)->default_value_int32 ()); EXPECT_EQ(-GOOGLE_ULONGLONG(1000000000000), message->field(1)->default_value_int64 ()); EXPECT_EQ(42 , message->field(2)->default_value_uint32()); EXPECT_EQ(GOOGLE_ULONGLONG(2000000000000), message->field(3)->default_value_uint64()); EXPECT_EQ(4.5 , message->field(4)->default_value_float ()); EXPECT_EQ(10e100 , message->field(5)->default_value_double()); EXPECT_TRUE( message->field(6)->default_value_bool ()); EXPECT_EQ("hello" , message->field(7)->default_value_string()); EXPECT_EQ("\001\002\003" , message->field(8)->default_value_string()); EXPECT_EQ(enum_value_b , message->field(9)->default_value_enum ()); EXPECT_EQ("" , message->field(10)->default_value_string()); ASSERT_FALSE(message->field(11)->has_default_value()); ASSERT_FALSE(message->field(12)->has_default_value()); ASSERT_FALSE(message->field(13)->has_default_value()); ASSERT_FALSE(message->field(14)->has_default_value()); ASSERT_FALSE(message->field(15)->has_default_value()); ASSERT_FALSE(message->field(16)->has_default_value()); ASSERT_FALSE(message->field(17)->has_default_value()); ASSERT_FALSE(message->field(18)->has_default_value()); ASSERT_FALSE(message->field(19)->has_default_value()); ASSERT_FALSE(message->field(20)->has_default_value()); EXPECT_EQ(0 , message->field(11)->default_value_int32 ()); EXPECT_EQ(0 , message->field(12)->default_value_int64 ()); EXPECT_EQ(0 , message->field(13)->default_value_uint32()); EXPECT_EQ(0 , message->field(14)->default_value_uint64()); EXPECT_EQ(0.0f , message->field(15)->default_value_float ()); EXPECT_EQ(0.0 , message->field(16)->default_value_double()); EXPECT_FALSE( message->field(17)->default_value_bool ()); EXPECT_EQ("" , message->field(18)->default_value_string()); EXPECT_EQ("" , message->field(19)->default_value_string()); EXPECT_EQ(enum_value_a, message->field(20)->default_value_enum()); } TEST_F(MiscTest, FieldOptions) { // Try setting field options. FileDescriptorProto file_proto; file_proto.set_name("foo.proto"); DescriptorProto* message_proto = AddMessage(&file_proto, "TestMessage"); AddField(message_proto, "foo", 1, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); FieldDescriptorProto* bar_proto = AddField(message_proto, "bar", 2, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); FieldOptions* options = bar_proto->mutable_options(); options->set_ctype(FieldOptions::CORD); // Build the descriptors and get the pointers. DescriptorPool pool; const FileDescriptor* file = pool.BuildFile(file_proto); ASSERT_TRUE(file != NULL); ASSERT_EQ(1, file->message_type_count()); const Descriptor* message = file->message_type(0); ASSERT_EQ(2, message->field_count()); const FieldDescriptor* foo = message->field(0); const FieldDescriptor* bar = message->field(1); // "foo" had no options set, so it should return the default options. EXPECT_EQ(&FieldOptions::default_instance(), &foo->options()); // "bar" had options set. EXPECT_NE(&FieldOptions::default_instance(), options); EXPECT_TRUE(bar->options().has_ctype()); EXPECT_EQ(FieldOptions::CORD, bar->options().ctype()); } // =================================================================== enum DescriptorPoolMode { NO_DATABASE, FALLBACK_DATABASE }; class AllowUnknownDependenciesTest : public testing::TestWithParam { protected: DescriptorPoolMode mode() { return GetParam(); } virtual void SetUp() { FileDescriptorProto foo_proto, bar_proto; switch (mode()) { case NO_DATABASE: pool_.reset(new DescriptorPool); break; case FALLBACK_DATABASE: pool_.reset(new DescriptorPool(&db_)); break; } pool_->AllowUnknownDependencies(); ASSERT_TRUE(TextFormat::ParseFromString( "name: 'foo.proto'" "dependency: 'bar.proto'" "dependency: 'baz.proto'" "message_type {" " name: 'Foo'" " field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'Bar' }" " field { name:'baz' number:2 label:LABEL_OPTIONAL type_name:'Baz' }" " field { name:'qux' number:3 label:LABEL_OPTIONAL" " type_name: '.corge.Qux'" " type: TYPE_ENUM" " options {" " uninterpreted_option {" " name {" " name_part: 'grault'" " is_extension: true" " }" " positive_int_value: 1234" " }" " }" " }" "}", &foo_proto)); ASSERT_TRUE(TextFormat::ParseFromString( "name: 'bar.proto'" "message_type { name: 'Bar' }", &bar_proto)); // Collect pointers to stuff. bar_file_ = BuildFile(bar_proto); ASSERT_TRUE(bar_file_ != NULL); ASSERT_EQ(1, bar_file_->message_type_count()); bar_type_ = bar_file_->message_type(0); foo_file_ = BuildFile(foo_proto); ASSERT_TRUE(foo_file_ != NULL); ASSERT_EQ(1, foo_file_->message_type_count()); foo_type_ = foo_file_->message_type(0); ASSERT_EQ(3, foo_type_->field_count()); bar_field_ = foo_type_->field(0); baz_field_ = foo_type_->field(1); qux_field_ = foo_type_->field(2); } const FileDescriptor* BuildFile(const FileDescriptorProto& proto) { switch (mode()) { case NO_DATABASE: return pool_->BuildFile(proto); break; case FALLBACK_DATABASE: { EXPECT_TRUE(db_.Add(proto)); return pool_->FindFileByName(proto.name()); } } GOOGLE_LOG(FATAL) << "Can't get here."; return NULL; } const FileDescriptor* bar_file_; const Descriptor* bar_type_; const FileDescriptor* foo_file_; const Descriptor* foo_type_; const FieldDescriptor* bar_field_; const FieldDescriptor* baz_field_; const FieldDescriptor* qux_field_; SimpleDescriptorDatabase db_; // used if in FALLBACK_DATABASE mode. google::protobuf::scoped_ptr pool_; }; TEST_P(AllowUnknownDependenciesTest, PlaceholderFile) { ASSERT_EQ(2, foo_file_->dependency_count()); EXPECT_EQ(bar_file_, foo_file_->dependency(0)); EXPECT_FALSE(bar_file_->is_placeholder()); const FileDescriptor* baz_file = foo_file_->dependency(1); EXPECT_EQ("baz.proto", baz_file->name()); EXPECT_EQ(0, baz_file->message_type_count()); EXPECT_TRUE(baz_file->is_placeholder()); // Placeholder files should not be findable. EXPECT_EQ(bar_file_, pool_->FindFileByName(bar_file_->name())); EXPECT_TRUE(pool_->FindFileByName(baz_file->name()) == NULL); // Copy*To should not crash for placeholder files. FileDescriptorProto baz_file_proto; baz_file->CopyTo(&baz_file_proto); baz_file->CopySourceCodeInfoTo(&baz_file_proto); EXPECT_FALSE(baz_file_proto.has_source_code_info()); } TEST_P(AllowUnknownDependenciesTest, PlaceholderTypes) { ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_field_->type()); EXPECT_EQ(bar_type_, bar_field_->message_type()); EXPECT_FALSE(bar_type_->is_placeholder()); ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_field_->type()); const Descriptor* baz_type = baz_field_->message_type(); EXPECT_EQ("Baz", baz_type->name()); EXPECT_EQ("Baz", baz_type->full_name()); EXPECT_EQ(0, baz_type->extension_range_count()); EXPECT_TRUE(baz_type->is_placeholder()); ASSERT_EQ(FieldDescriptor::TYPE_ENUM, qux_field_->type()); const EnumDescriptor* qux_type = qux_field_->enum_type(); EXPECT_EQ("Qux", qux_type->name()); EXPECT_EQ("corge.Qux", qux_type->full_name()); EXPECT_TRUE(qux_type->is_placeholder()); // Placeholder types should not be findable. EXPECT_EQ(bar_type_, pool_->FindMessageTypeByName(bar_type_->full_name())); EXPECT_TRUE(pool_->FindMessageTypeByName(baz_type->full_name()) == NULL); EXPECT_TRUE(pool_->FindEnumTypeByName(qux_type->full_name()) == NULL); } TEST_P(AllowUnknownDependenciesTest, CopyTo) { // FieldDescriptor::CopyTo() should write non-fully-qualified type names // for placeholder types which were not originally fully-qualified. FieldDescriptorProto proto; // Bar is not a placeholder, so it is fully-qualified. bar_field_->CopyTo(&proto); EXPECT_EQ(".Bar", proto.type_name()); EXPECT_EQ(FieldDescriptorProto::TYPE_MESSAGE, proto.type()); // Baz is an unqualified placeholder. proto.Clear(); baz_field_->CopyTo(&proto); EXPECT_EQ("Baz", proto.type_name()); EXPECT_FALSE(proto.has_type()); // Qux is a fully-qualified placeholder. proto.Clear(); qux_field_->CopyTo(&proto); EXPECT_EQ(".corge.Qux", proto.type_name()); EXPECT_EQ(FieldDescriptorProto::TYPE_ENUM, proto.type()); } TEST_P(AllowUnknownDependenciesTest, CustomOptions) { // Qux should still have the uninterpreted option attached. ASSERT_EQ(1, qux_field_->options().uninterpreted_option_size()); const UninterpretedOption& option = qux_field_->options().uninterpreted_option(0); ASSERT_EQ(1, option.name_size()); EXPECT_EQ("grault", option.name(0).name_part()); } TEST_P(AllowUnknownDependenciesTest, UnknownExtendee) { // Test that we can extend an unknown type. This is slightly tricky because // it means that the placeholder type must have an extension range. FileDescriptorProto extension_proto; ASSERT_TRUE(TextFormat::ParseFromString( "name: 'extension.proto'" "extension { extendee: 'UnknownType' name:'some_extension' number:123" " label:LABEL_OPTIONAL type:TYPE_INT32 }", &extension_proto)); const FileDescriptor* file = BuildFile(extension_proto); ASSERT_TRUE(file != NULL); ASSERT_EQ(1, file->extension_count()); const Descriptor* extendee = file->extension(0)->containing_type(); EXPECT_EQ("UnknownType", extendee->name()); EXPECT_TRUE(extendee->is_placeholder()); ASSERT_EQ(1, extendee->extension_range_count()); EXPECT_EQ(1, extendee->extension_range(0)->start); EXPECT_EQ(FieldDescriptor::kMaxNumber + 1, extendee->extension_range(0)->end); } TEST_P(AllowUnknownDependenciesTest, CustomOption) { // Test that we can use a custom option without having parsed // descriptor.proto. FileDescriptorProto option_proto; ASSERT_TRUE(TextFormat::ParseFromString( "name: \"unknown_custom_options.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { " " extendee: \"google.protobuf.FileOptions\" " " name: \"some_option\" " " number: 123456 " " label: LABEL_OPTIONAL " " type: TYPE_INT32 " "} " "options { " " uninterpreted_option { " " name { " " name_part: \"some_option\" " " is_extension: true " " } " " positive_int_value: 1234 " " } " " uninterpreted_option { " " name { " " name_part: \"unknown_option\" " " is_extension: true " " } " " positive_int_value: 1234 " " } " " uninterpreted_option { " " name { " " name_part: \"optimize_for\" " " is_extension: false " " } " " identifier_value: \"SPEED\" " " } " "}", &option_proto)); const FileDescriptor* file = BuildFile(option_proto); ASSERT_TRUE(file != NULL); // Verify that no extension options were set, but they were left as // uninterpreted_options. std::vector fields; file->options().GetReflection()->ListFields(file->options(), &fields); ASSERT_EQ(2, fields.size()); EXPECT_TRUE(file->options().has_optimize_for()); EXPECT_EQ(2, file->options().uninterpreted_option_size()); } TEST_P(AllowUnknownDependenciesTest, UndeclaredDependencyTriggersBuildOfDependency) { // Crazy case: suppose foo.proto refers to a symbol without declaring the // dependency that finds it. In the event that the pool is backed by a // DescriptorDatabase, the pool will attempt to find the symbol in the // database. If successful, it will build the undeclared dependency to verify // that the file does indeed contain the symbol. If that file fails to build, // then its descriptors must be rolled back. However, we still want foo.proto // to build successfully, since we are allowing unknown dependencies. FileDescriptorProto undeclared_dep_proto; // We make this file fail to build by giving it two fields with tag 1. ASSERT_TRUE(TextFormat::ParseFromString( "name: \"invalid_file_as_undeclared_dep.proto\" " "package: \"undeclared\" " "message_type: { " " name: \"Quux\" " " field { " " name:'qux' number:1 label:LABEL_OPTIONAL type: TYPE_INT32 " " }" " field { " " name:'quux' number:1 label:LABEL_OPTIONAL type: TYPE_INT64 " " }" "}", &undeclared_dep_proto)); // We can't use the BuildFile() helper because we don't actually want to build // it into the descriptor pool in the fallback database case: it just needs to // be sitting in the database so that it gets built during the building of // test.proto below. switch (mode()) { case NO_DATABASE: { ASSERT_TRUE(pool_->BuildFile(undeclared_dep_proto) == NULL); break; } case FALLBACK_DATABASE: { ASSERT_TRUE(db_.Add(undeclared_dep_proto)); } } FileDescriptorProto test_proto; ASSERT_TRUE(TextFormat::ParseFromString( "name: \"test.proto\" " "message_type: { " " name: \"Corge\" " " field { " " name:'quux' number:1 label: LABEL_OPTIONAL " " type_name:'undeclared.Quux' type: TYPE_MESSAGE " " }" "}", &test_proto)); const FileDescriptor* file = BuildFile(test_proto); ASSERT_TRUE(file != NULL); GOOGLE_LOG(INFO) << file->DebugString(); EXPECT_EQ(0, file->dependency_count()); ASSERT_EQ(1, file->message_type_count()); const Descriptor* corge_desc = file->message_type(0); ASSERT_EQ("Corge", corge_desc->name()); ASSERT_EQ(1, corge_desc->field_count()); EXPECT_FALSE(corge_desc->is_placeholder()); const FieldDescriptor* quux_field = corge_desc->field(0); ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, quux_field->type()); ASSERT_EQ("Quux", quux_field->message_type()->name()); ASSERT_EQ("undeclared.Quux", quux_field->message_type()->full_name()); EXPECT_TRUE(quux_field->message_type()->is_placeholder()); // The place holder type should not be findable. ASSERT_TRUE(pool_->FindMessageTypeByName("undeclared.Quux") == NULL); } INSTANTIATE_TEST_CASE_P(DatabaseSource, AllowUnknownDependenciesTest, testing::Values(NO_DATABASE, FALLBACK_DATABASE)); // =================================================================== TEST(CustomOptions, OptionLocations) { const Descriptor* message = protobuf_unittest::TestMessageWithCustomOptions::descriptor(); const FileDescriptor* file = message->file(); const FieldDescriptor* field = message->FindFieldByName("field1"); const OneofDescriptor* oneof = message->FindOneofByName("AnOneof"); const EnumDescriptor* enm = message->FindEnumTypeByName("AnEnum"); // TODO(benjy): Support EnumValue options, once the compiler does. const ServiceDescriptor* service = file->FindServiceByName("TestServiceWithCustomOptions"); const MethodDescriptor* method = service->FindMethodByName("Foo"); EXPECT_EQ(GOOGLE_LONGLONG(9876543210), file->options().GetExtension(protobuf_unittest::file_opt1)); EXPECT_EQ(-56, message->options().GetExtension(protobuf_unittest::message_opt1)); EXPECT_EQ(GOOGLE_LONGLONG(8765432109), field->options().GetExtension(protobuf_unittest::field_opt1)); EXPECT_EQ(42, // Check that we get the default for an option we don't set. field->options().GetExtension(protobuf_unittest::field_opt2)); EXPECT_EQ(-99, oneof->options().GetExtension(protobuf_unittest::oneof_opt1)); EXPECT_EQ(-789, enm->options().GetExtension(protobuf_unittest::enum_opt1)); EXPECT_EQ(123, enm->value(1)->options().GetExtension( protobuf_unittest::enum_value_opt1)); EXPECT_EQ(GOOGLE_LONGLONG(-9876543210), service->options().GetExtension(protobuf_unittest::service_opt1)); EXPECT_EQ(protobuf_unittest::METHODOPT1_VAL2, method->options().GetExtension(protobuf_unittest::method_opt1)); // See that the regular options went through unscathed. EXPECT_TRUE(message->options().has_message_set_wire_format()); EXPECT_EQ(FieldOptions::CORD, field->options().ctype()); } TEST(CustomOptions, OptionTypes) { const MessageOptions* options = NULL; options = &protobuf_unittest::CustomOptionMinIntegerValues::descriptor()->options(); EXPECT_EQ(false , options->GetExtension(protobuf_unittest::bool_opt)); EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::int32_opt)); EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::int64_opt)); EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::uint32_opt)); EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::uint64_opt)); EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sint32_opt)); EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sint64_opt)); EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::fixed32_opt)); EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::fixed64_opt)); EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sfixed32_opt)); EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sfixed64_opt)); options = &protobuf_unittest::CustomOptionMaxIntegerValues::descriptor()->options(); EXPECT_EQ(true , options->GetExtension(protobuf_unittest::bool_opt)); EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::int32_opt)); EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::int64_opt)); EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::uint32_opt)); EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::uint64_opt)); EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sint32_opt)); EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sint64_opt)); EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::fixed32_opt)); EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::fixed64_opt)); EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sfixed32_opt)); EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sfixed64_opt)); options = &protobuf_unittest::CustomOptionOtherValues::descriptor()->options(); EXPECT_EQ(-100, options->GetExtension(protobuf_unittest::int32_opt)); EXPECT_FLOAT_EQ(12.3456789, options->GetExtension(protobuf_unittest::float_opt)); EXPECT_DOUBLE_EQ(1.234567890123456789, options->GetExtension(protobuf_unittest::double_opt)); EXPECT_EQ("Hello, \"World\"", options->GetExtension(protobuf_unittest::string_opt)); EXPECT_EQ(string("Hello\0World", 11), options->GetExtension(protobuf_unittest::bytes_opt)); EXPECT_EQ(protobuf_unittest::DummyMessageContainingEnum::TEST_OPTION_ENUM_TYPE2, options->GetExtension(protobuf_unittest::enum_opt)); options = &protobuf_unittest::SettingRealsFromPositiveInts::descriptor()->options(); EXPECT_FLOAT_EQ(12, options->GetExtension(protobuf_unittest::float_opt)); EXPECT_DOUBLE_EQ(154, options->GetExtension(protobuf_unittest::double_opt)); options = &protobuf_unittest::SettingRealsFromNegativeInts::descriptor()->options(); EXPECT_FLOAT_EQ(-12, options->GetExtension(protobuf_unittest::float_opt)); EXPECT_DOUBLE_EQ(-154, options->GetExtension(protobuf_unittest::double_opt)); } TEST(CustomOptions, ComplexExtensionOptions) { const MessageOptions* options = &protobuf_unittest::VariousComplexOptions::descriptor()->options(); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1).foo(), 42); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1). GetExtension(protobuf_unittest::quux), 324); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1). GetExtension(protobuf_unittest::corge).qux(), 876); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).baz(), 987); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). GetExtension(protobuf_unittest::grault), 654); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar().foo(), 743); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar(). GetExtension(protobuf_unittest::quux), 1999); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar(). GetExtension(protobuf_unittest::corge).qux(), 2008); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). GetExtension(protobuf_unittest::garply).foo(), 741); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). GetExtension(protobuf_unittest::garply). GetExtension(protobuf_unittest::quux), 1998); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). GetExtension(protobuf_unittest::garply). GetExtension(protobuf_unittest::corge).qux(), 2121); EXPECT_EQ(options->GetExtension( protobuf_unittest::ComplexOptionType2::ComplexOptionType4::complex_opt4). waldo(), 1971); EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). fred().waldo(), 321); EXPECT_EQ(9, options->GetExtension(protobuf_unittest::complex_opt3).qux()); EXPECT_EQ(22, options->GetExtension(protobuf_unittest::complex_opt3). complexoptiontype5().plugh()); EXPECT_EQ(24, options->GetExtension(protobuf_unittest::complexopt6).xyzzy()); } TEST(CustomOptions, OptionsFromOtherFile) { // Test that to use a custom option, we only need to import the file // defining the option; we do not also have to import descriptor.proto. DescriptorPool pool; FileDescriptorProto file_proto; FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); protobuf_unittest::TestMessageWithCustomOptions::descriptor() ->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); ASSERT_TRUE(TextFormat::ParseFromString( "name: \"custom_options_import.proto\" " "package: \"protobuf_unittest\" " "dependency: \"google/protobuf/unittest_custom_options.proto\" " "options { " " uninterpreted_option { " " name { " " name_part: \"file_opt1\" " " is_extension: true " " } " " positive_int_value: 1234 " " } " // Test a non-extension option too. (At one point this failed due to a // bug.) " uninterpreted_option { " " name { " " name_part: \"java_package\" " " is_extension: false " " } " " string_value: \"foo\" " " } " // Test that enum-typed options still work too. (At one point this also // failed due to a bug.) " uninterpreted_option { " " name { " " name_part: \"optimize_for\" " " is_extension: false " " } " " identifier_value: \"SPEED\" " " } " "}" , &file_proto)); const FileDescriptor* file = pool.BuildFile(file_proto); ASSERT_TRUE(file != NULL); EXPECT_EQ(1234, file->options().GetExtension(protobuf_unittest::file_opt1)); EXPECT_TRUE(file->options().has_java_package()); EXPECT_EQ("foo", file->options().java_package()); EXPECT_TRUE(file->options().has_optimize_for()); EXPECT_EQ(FileOptions::SPEED, file->options().optimize_for()); } TEST(CustomOptions, MessageOptionThreeFieldsSet) { // This tests a bug which previously existed in custom options parsing. The // bug occurred when you defined a custom option with message type and then // set three fields of that option on a single definition (see the example // below). The bug is a bit hard to explain, so check the change history if // you want to know more. DescriptorPool pool; FileDescriptorProto file_proto; FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); protobuf_unittest::TestMessageWithCustomOptions::descriptor() ->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); // The following represents the definition: // // import "google/protobuf/unittest_custom_options.proto" // package protobuf_unittest; // message Foo { // option (complex_opt1).foo = 1234; // option (complex_opt1).foo2 = 1234; // option (complex_opt1).foo3 = 1234; // } ASSERT_TRUE(TextFormat::ParseFromString( "name: \"custom_options_import.proto\" " "package: \"protobuf_unittest\" " "dependency: \"google/protobuf/unittest_custom_options.proto\" " "message_type { " " name: \"Foo\" " " options { " " uninterpreted_option { " " name { " " name_part: \"complex_opt1\" " " is_extension: true " " } " " name { " " name_part: \"foo\" " " is_extension: false " " } " " positive_int_value: 1234 " " } " " uninterpreted_option { " " name { " " name_part: \"complex_opt1\" " " is_extension: true " " } " " name { " " name_part: \"foo2\" " " is_extension: false " " } " " positive_int_value: 1234 " " } " " uninterpreted_option { " " name { " " name_part: \"complex_opt1\" " " is_extension: true " " } " " name { " " name_part: \"foo3\" " " is_extension: false " " } " " positive_int_value: 1234 " " } " " } " "}", &file_proto)); const FileDescriptor* file = pool.BuildFile(file_proto); ASSERT_TRUE(file != NULL); ASSERT_EQ(1, file->message_type_count()); const MessageOptions& options = file->message_type(0)->options(); EXPECT_EQ(1234, options.GetExtension(protobuf_unittest::complex_opt1).foo()); } TEST(CustomOptions, MessageOptionRepeatedLeafFieldSet) { // This test verifies that repeated fields in custom options can be // given multiple values by repeating the option with a different value. // This test checks repeated leaf values. Each repeated custom value // appears in a different uninterpreted_option, which will be concatenated // when they are merged into the final option value. DescriptorPool pool; FileDescriptorProto file_proto; FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); protobuf_unittest::TestMessageWithCustomOptions::descriptor() ->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); // The following represents the definition: // // import "google/protobuf/unittest_custom_options.proto" // package protobuf_unittest; // message Foo { // option (complex_opt1).foo4 = 12; // option (complex_opt1).foo4 = 34; // option (complex_opt1).foo4 = 56; // } ASSERT_TRUE(TextFormat::ParseFromString( "name: \"custom_options_import.proto\" " "package: \"protobuf_unittest\" " "dependency: \"google/protobuf/unittest_custom_options.proto\" " "message_type { " " name: \"Foo\" " " options { " " uninterpreted_option { " " name { " " name_part: \"complex_opt1\" " " is_extension: true " " } " " name { " " name_part: \"foo4\" " " is_extension: false " " } " " positive_int_value: 12 " " } " " uninterpreted_option { " " name { " " name_part: \"complex_opt1\" " " is_extension: true " " } " " name { " " name_part: \"foo4\" " " is_extension: false " " } " " positive_int_value: 34 " " } " " uninterpreted_option { " " name { " " name_part: \"complex_opt1\" " " is_extension: true " " } " " name { " " name_part: \"foo4\" " " is_extension: false " " } " " positive_int_value: 56 " " } " " } " "}", &file_proto)); const FileDescriptor* file = pool.BuildFile(file_proto); ASSERT_TRUE(file != NULL); ASSERT_EQ(1, file->message_type_count()); const MessageOptions& options = file->message_type(0)->options(); EXPECT_EQ(3, options.GetExtension(protobuf_unittest::complex_opt1).foo4_size()); EXPECT_EQ(12, options.GetExtension(protobuf_unittest::complex_opt1).foo4(0)); EXPECT_EQ(34, options.GetExtension(protobuf_unittest::complex_opt1).foo4(1)); EXPECT_EQ(56, options.GetExtension(protobuf_unittest::complex_opt1).foo4(2)); } TEST(CustomOptions, MessageOptionRepeatedMsgFieldSet) { // This test verifies that repeated fields in custom options can be // given multiple values by repeating the option with a different value. // This test checks repeated message values. Each repeated custom value // appears in a different uninterpreted_option, which will be concatenated // when they are merged into the final option value. DescriptorPool pool; FileDescriptorProto file_proto; FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); protobuf_unittest::TestMessageWithCustomOptions::descriptor() ->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); // The following represents the definition: // // import "google/protobuf/unittest_custom_options.proto" // package protobuf_unittest; // message Foo { // option (complex_opt2).barney = {waldo: 1}; // option (complex_opt2).barney = {waldo: 10}; // option (complex_opt2).barney = {waldo: 100}; // } ASSERT_TRUE(TextFormat::ParseFromString( "name: \"custom_options_import.proto\" " "package: \"protobuf_unittest\" " "dependency: \"google/protobuf/unittest_custom_options.proto\" " "message_type { " " name: \"Foo\" " " options { " " uninterpreted_option { " " name { " " name_part: \"complex_opt2\" " " is_extension: true " " } " " name { " " name_part: \"barney\" " " is_extension: false " " } " " aggregate_value: \"waldo: 1\" " " } " " uninterpreted_option { " " name { " " name_part: \"complex_opt2\" " " is_extension: true " " } " " name { " " name_part: \"barney\" " " is_extension: false " " } " " aggregate_value: \"waldo: 10\" " " } " " uninterpreted_option { " " name { " " name_part: \"complex_opt2\" " " is_extension: true " " } " " name { " " name_part: \"barney\" " " is_extension: false " " } " " aggregate_value: \"waldo: 100\" " " } " " } " "}", &file_proto)); const FileDescriptor* file = pool.BuildFile(file_proto); ASSERT_TRUE(file != NULL); ASSERT_EQ(1, file->message_type_count()); const MessageOptions& options = file->message_type(0)->options(); EXPECT_EQ(3, options.GetExtension( protobuf_unittest::complex_opt2).barney_size()); EXPECT_EQ(1,options.GetExtension( protobuf_unittest::complex_opt2).barney(0).waldo()); EXPECT_EQ(10, options.GetExtension( protobuf_unittest::complex_opt2).barney(1).waldo()); EXPECT_EQ(100, options.GetExtension( protobuf_unittest::complex_opt2).barney(2).waldo()); } // Check that aggregate options were parsed and saved correctly in // the appropriate descriptors. TEST(CustomOptions, AggregateOptions) { const Descriptor* msg = protobuf_unittest::AggregateMessage::descriptor(); const FileDescriptor* file = msg->file(); const FieldDescriptor* field = msg->FindFieldByName("fieldname"); const EnumDescriptor* enumd = file->FindEnumTypeByName("AggregateEnum"); const EnumValueDescriptor* enumv = enumd->FindValueByName("VALUE"); const ServiceDescriptor* service = file->FindServiceByName( "AggregateService"); const MethodDescriptor* method = service->FindMethodByName("Method"); // Tests for the different types of data embedded in fileopt const protobuf_unittest::Aggregate& file_options = file->options().GetExtension(protobuf_unittest::fileopt); EXPECT_EQ(100, file_options.i()); EXPECT_EQ("FileAnnotation", file_options.s()); EXPECT_EQ("NestedFileAnnotation", file_options.sub().s()); EXPECT_EQ("FileExtensionAnnotation", file_options.file().GetExtension(protobuf_unittest::fileopt).s()); EXPECT_EQ("EmbeddedMessageSetElement", file_options.mset().GetExtension( protobuf_unittest::AggregateMessageSetElement ::message_set_extension).s()); // Simple tests for all the other types of annotations EXPECT_EQ("MessageAnnotation", msg->options().GetExtension(protobuf_unittest::msgopt).s()); EXPECT_EQ("FieldAnnotation", field->options().GetExtension(protobuf_unittest::fieldopt).s()); EXPECT_EQ("EnumAnnotation", enumd->options().GetExtension(protobuf_unittest::enumopt).s()); EXPECT_EQ("EnumValueAnnotation", enumv->options().GetExtension(protobuf_unittest::enumvalopt).s()); EXPECT_EQ("ServiceAnnotation", service->options().GetExtension(protobuf_unittest::serviceopt).s()); EXPECT_EQ("MethodAnnotation", method->options().GetExtension(protobuf_unittest::methodopt).s()); } TEST(CustomOptions, UnusedImportWarning) { DescriptorPool pool; FileDescriptorProto file_proto; FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); protobuf_unittest::TestMessageWithCustomOptions::descriptor() ->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); pool.AddUnusedImportTrackFile("custom_options_import.proto"); ASSERT_TRUE(TextFormat::ParseFromString( "name: \"custom_options_import.proto\" " "package: \"protobuf_unittest\" " "dependency: \"google/protobuf/unittest_custom_options.proto\" ", &file_proto)); MockErrorCollector error_collector; EXPECT_TRUE(pool.BuildFileCollectingErrors(file_proto, &error_collector)); EXPECT_EQ("", error_collector.warning_text_); } // Verifies that proto files can correctly be parsed, even if the // custom options defined in the file are incompatible with those // compiled in the binary. See http://b/19276250. TEST(CustomOptions, OptionsWithRequiredEnums) { DescriptorPool pool; FileDescriptorProto file_proto; MessageOptions::descriptor()->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); // Create a new file descriptor proto containing a subset of the // messages defined in google/protobuf/unittest_custom_options.proto. file_proto.Clear(); file_proto.set_name("unittest_custom_options.proto"); file_proto.set_package("protobuf_unittest"); file_proto.add_dependency("google/protobuf/descriptor.proto"); // Add the "required_enum_opt" extension. FieldDescriptorProto* extension = file_proto.add_extension(); protobuf_unittest::OldOptionType::descriptor()->file() ->FindExtensionByName("required_enum_opt")->CopyTo(extension); // Add a test message that uses the "required_enum_opt" option. DescriptorProto* test_message_type = file_proto.add_message_type(); protobuf_unittest::TestMessageWithRequiredEnumOption::descriptor() ->CopyTo(test_message_type); // Instruct the extension to use NewOptionType instead of // OldOptionType, and add the descriptor of NewOptionType. extension->set_type_name(".protobuf_unittest.NewOptionType"); DescriptorProto* new_option_type = file_proto.add_message_type(); protobuf_unittest::NewOptionType::descriptor() ->CopyTo(new_option_type); // Replace the value of the "required_enum_opt" option used in the // test message with an enum value that only exists in NewOptionType. ASSERT_TRUE(TextFormat::ParseFromString( "uninterpreted_option { " " name { " " name_part: 'required_enum_opt' " " is_extension: true " " } " " aggregate_value: 'value: NEW_VALUE' " "}", test_message_type->mutable_options())); // Add the file descriptor to the pool. ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); // Find the test message. const Descriptor* test_message = pool.FindMessageTypeByName( "protobuf_unittest.TestMessageWithRequiredEnumOption"); ASSERT_TRUE(test_message != NULL); const MessageOptions& options = test_message->options(); // Extract the "required_enum_opt" option. Since the binary does not // know that the extension was updated, this will still return an // OldOptionType message. ASSERT_TRUE( options.HasExtension(protobuf_unittest::required_enum_opt)); const protobuf_unittest::OldOptionType& old_enum_opt = options.GetExtension(protobuf_unittest::required_enum_opt); // Confirm that the required enum field is missing. EXPECT_FALSE(old_enum_opt.IsInitialized()); EXPECT_FALSE(old_enum_opt.has_value()); string buf; // Verify that the required enum field does show up when the option // is re-parsed as a NewOptionType message; protobuf_unittest::NewOptionType new_enum_opt; EXPECT_TRUE(old_enum_opt.AppendPartialToString(&buf)); EXPECT_TRUE(new_enum_opt.ParseFromString(buf)); EXPECT_EQ(protobuf_unittest::NewOptionType::NEW_VALUE, new_enum_opt.value()); } // Test that FileDescriptor::DebugString() formats custom options correctly. TEST(CustomOptions, DebugString) { DescriptorPool pool; FileDescriptorProto file_proto; MessageOptions::descriptor()->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); // Add "foo.proto": // import "google/protobuf/descriptor.proto"; // package "protobuf_unittest"; // option (protobuf_unittest.cc_option1) = 1; // option (protobuf_unittest.cc_option2) = 2; // extend google.protobuf.FieldOptions { // optional int32 cc_option1 = 7736974; // optional int32 cc_option2 = 7736975; // } ASSERT_TRUE(TextFormat::ParseFromString( "name: \"foo.proto\" " "package: \"protobuf_unittest\" " "dependency: \"google/protobuf/descriptor.proto\" " "options { " " uninterpreted_option { " " name { " " name_part: \"protobuf_unittest.cc_option1\" " " is_extension: true " " } " " positive_int_value: 1 " " } " " uninterpreted_option { " " name { " " name_part: \"protobuf_unittest.cc_option2\" " " is_extension: true " " } " " positive_int_value: 2 " " } " "} " "extension { " " name: \"cc_option1\" " " extendee: \".google.protobuf.FileOptions\" " // This field number is intentionally chosen to be the same as // (.fileopt1) defined in unittest_custom_options.proto (linked // in this test binary). This is to test whether we are messing // generated pool with custom descriptor pools when dealing with // custom options. " number: 7736974 " " label: LABEL_OPTIONAL " " type: TYPE_INT32 " "}" "extension { " " name: \"cc_option2\" " " extendee: \".google.protobuf.FileOptions\" " " number: 7736975 " " label: LABEL_OPTIONAL " " type: TYPE_INT32 " "}", &file_proto)); const FileDescriptor* descriptor = pool.BuildFile(file_proto); ASSERT_TRUE(descriptor != NULL); EXPECT_EQ(2, descriptor->extension_count()); ASSERT_EQ( "syntax = \"proto2\";\n" "\n" "import \"google/protobuf/descriptor.proto\";\n" "package protobuf_unittest;\n" "\n" "option (.protobuf_unittest.cc_option1) = 1;\n" "option (.protobuf_unittest.cc_option2) = 2;\n" "\n" "extend .google.protobuf.FileOptions {\n" " optional int32 cc_option1 = 7736974;\n" " optional int32 cc_option2 = 7736975;\n" "}\n" "\n", descriptor->DebugString()); } // =================================================================== class ValidationErrorTest : public testing::Test { protected: // Parse file_text as a FileDescriptorProto in text format and add it // to the DescriptorPool. Expect no errors. const FileDescriptor* BuildFile(const string& file_text) { FileDescriptorProto file_proto; EXPECT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); return GOOGLE_CHECK_NOTNULL(pool_.BuildFile(file_proto)); } // Parse file_text as a FileDescriptorProto in text format and add it // to the DescriptorPool. Expect errors to be produced which match the // given error text. void BuildFileWithErrors(const string& file_text, const string& expected_errors) { FileDescriptorProto file_proto; ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); MockErrorCollector error_collector; EXPECT_TRUE( pool_.BuildFileCollectingErrors(file_proto, &error_collector) == NULL); EXPECT_EQ(expected_errors, error_collector.text_); } // Parse file_text as a FileDescriptorProto in text format and add it // to the DescriptorPool. Expect errors to be produced which match the // given warning text. void BuildFileWithWarnings(const string& file_text, const string& expected_warnings) { FileDescriptorProto file_proto; ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); MockErrorCollector error_collector; EXPECT_TRUE(pool_.BuildFileCollectingErrors(file_proto, &error_collector)); EXPECT_EQ(expected_warnings, error_collector.warning_text_); } // Builds some already-parsed file in our test pool. void BuildFileInTestPool(const FileDescriptor* file) { FileDescriptorProto file_proto; file->CopyTo(&file_proto); ASSERT_TRUE(pool_.BuildFile(file_proto) != NULL); } // Build descriptor.proto in our test pool. This allows us to extend it in // the test pool, so we can test custom options. void BuildDescriptorMessagesInTestPool() { BuildFileInTestPool(DescriptorProto::descriptor()->file()); } DescriptorPool pool_; }; TEST_F(ValidationErrorTest, AlreadyDefined) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { name: \"Foo\" }" "message_type { name: \"Foo\" }", "foo.proto: Foo: NAME: \"Foo\" is already defined.\n"); } TEST_F(ValidationErrorTest, AlreadyDefinedInPackage) { BuildFileWithErrors( "name: \"foo.proto\" " "package: \"foo.bar\" " "message_type { name: \"Foo\" }" "message_type { name: \"Foo\" }", "foo.proto: foo.bar.Foo: NAME: \"Foo\" is already defined in " "\"foo.bar\".\n"); } TEST_F(ValidationErrorTest, AlreadyDefinedInOtherFile) { BuildFile( "name: \"foo.proto\" " "message_type { name: \"Foo\" }"); BuildFileWithErrors( "name: \"bar.proto\" " "message_type { name: \"Foo\" }", "bar.proto: Foo: NAME: \"Foo\" is already defined in file " "\"foo.proto\".\n"); } TEST_F(ValidationErrorTest, PackageAlreadyDefined) { BuildFile( "name: \"foo.proto\" " "message_type { name: \"foo\" }"); BuildFileWithErrors( "name: \"bar.proto\" " "package: \"foo.bar\"", "bar.proto: foo: NAME: \"foo\" is already defined (as something other " "than a package) in file \"foo.proto\".\n"); } TEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParent) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } " "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ", "foo.proto: FOO: NAME: \"FOO\" is already defined.\n" "foo.proto: FOO: NAME: Note that enum values use C++ scoping rules, " "meaning that enum values are siblings of their type, not children of " "it. Therefore, \"FOO\" must be unique within the global scope, not " "just within \"Bar\".\n"); } TEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParentNonGlobal) { BuildFileWithErrors( "name: \"foo.proto\" " "package: \"pkg\" " "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } " "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ", "foo.proto: pkg.FOO: NAME: \"FOO\" is already defined in \"pkg\".\n" "foo.proto: pkg.FOO: NAME: Note that enum values use C++ scoping rules, " "meaning that enum values are siblings of their type, not children of " "it. Therefore, \"FOO\" must be unique within \"pkg\", not just within " "\"Bar\".\n"); } TEST_F(ValidationErrorTest, MissingName) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { }", "foo.proto: : NAME: Missing name.\n"); } TEST_F(ValidationErrorTest, InvalidName) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { name: \"$\" }", "foo.proto: $: NAME: \"$\" is not a valid identifier.\n"); } TEST_F(ValidationErrorTest, InvalidPackageName) { BuildFileWithErrors( "name: \"foo.proto\" " "package: \"foo.$\"", "foo.proto: foo.$: NAME: \"$\" is not a valid identifier.\n"); } TEST_F(ValidationErrorTest, MissingFileName) { BuildFileWithErrors( "", ": : OTHER: Missing field: FileDescriptorProto.name.\n"); } TEST_F(ValidationErrorTest, DupeDependency) { BuildFile("name: \"foo.proto\""); BuildFileWithErrors( "name: \"bar.proto\" " "dependency: \"foo.proto\" " "dependency: \"foo.proto\" ", "bar.proto: bar.proto: OTHER: Import \"foo.proto\" was listed twice.\n"); } TEST_F(ValidationErrorTest, UnknownDependency) { BuildFileWithErrors( "name: \"bar.proto\" " "dependency: \"foo.proto\" ", "bar.proto: bar.proto: OTHER: Import \"foo.proto\" has not been loaded.\n"); } TEST_F(ValidationErrorTest, InvalidPublicDependencyIndex) { BuildFile("name: \"foo.proto\""); BuildFileWithErrors( "name: \"bar.proto\" " "dependency: \"foo.proto\" " "public_dependency: 1", "bar.proto: bar.proto: OTHER: Invalid public dependency index.\n"); } TEST_F(ValidationErrorTest, ForeignUnimportedPackageNoCrash) { // Used to crash: If we depend on a non-existent file and then refer to a // package defined in a file that we didn't import, and that package is // nested within a parent package which this file is also in, and we don't // include that parent package in the name (i.e. we do a relative lookup)... // Yes, really. BuildFile( "name: 'foo.proto' " "package: 'outer.foo' "); BuildFileWithErrors( "name: 'bar.proto' " "dependency: 'baz.proto' " "package: 'outer.bar' " "message_type { " " name: 'Bar' " " field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'foo.Foo' }" "}", "bar.proto: bar.proto: OTHER: Import \"baz.proto\" has not been loaded.\n" "bar.proto: outer.bar.Bar.bar: TYPE: \"outer.foo\" seems to be defined in " "\"foo.proto\", which is not imported by \"bar.proto\". To use it here, " "please add the necessary import.\n"); } TEST_F(ValidationErrorTest, DupeFile) { BuildFile( "name: \"foo.proto\" " "message_type { name: \"Foo\" }"); // Note: We should *not* get redundant errors about "Foo" already being // defined. BuildFileWithErrors( "name: \"foo.proto\" " "message_type { name: \"Foo\" } " // Add another type so that the files aren't identical (in which case there // would be no error). "enum_type { name: \"Bar\" }", "foo.proto: foo.proto: OTHER: A file with this name is already in the " "pool.\n"); } TEST_F(ValidationErrorTest, FieldInExtensionRange) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name: \"foo\" number: 9 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field { name: \"bar\" number: 10 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field { name: \"baz\" number: 19 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field { name: \"qux\" number: 20 label:LABEL_OPTIONAL type:TYPE_INT32 }" " extension_range { start: 10 end: 20 }" "}", "foo.proto: Foo.bar: NUMBER: Extension range 10 to 19 includes field " "\"bar\" (10).\n" "foo.proto: Foo.baz: NUMBER: Extension range 10 to 19 includes field " "\"baz\" (19).\n"); } TEST_F(ValidationErrorTest, OverlappingExtensionRanges) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " extension_range { start: 10 end: 20 }" " extension_range { start: 20 end: 30 }" " extension_range { start: 19 end: 21 }" "}", "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with " "already-defined range 10 to 19.\n" "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with " "already-defined range 20 to 29.\n"); } TEST_F(ValidationErrorTest, ReservedFieldError) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name: \"foo\" number: 15 label:LABEL_OPTIONAL type:TYPE_INT32 }" " reserved_range { start: 10 end: 20 }" "}", "foo.proto: Foo.foo: NUMBER: Field \"foo\" uses reserved number 15.\n"); } TEST_F(ValidationErrorTest, ReservedExtensionRangeError) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " extension_range { start: 10 end: 20 }" " reserved_range { start: 5 end: 15 }" "}", "foo.proto: Foo: NUMBER: Extension range 10 to 19" " overlaps with reserved range 5 to 14.\n"); } TEST_F(ValidationErrorTest, ReservedExtensionRangeAdjacent) { BuildFile( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " extension_range { start: 10 end: 20 }" " reserved_range { start: 5 end: 10 }" "}"); } TEST_F(ValidationErrorTest, ReservedRangeOverlap) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " reserved_range { start: 10 end: 20 }" " reserved_range { start: 5 end: 15 }" "}", "foo.proto: Foo: NUMBER: Reserved range 5 to 14" " overlaps with already-defined range 10 to 19.\n"); } TEST_F(ValidationErrorTest, ReservedNameError) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name: \"foo\" number: 15 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field { name: \"bar\" number: 16 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field { name: \"baz\" number: 17 label:LABEL_OPTIONAL type:TYPE_INT32 }" " reserved_name: \"foo\"" " reserved_name: \"bar\"" "}", "foo.proto: Foo.foo: NAME: Field name \"foo\" is reserved.\n" "foo.proto: Foo.bar: NAME: Field name \"bar\" is reserved.\n"); } TEST_F(ValidationErrorTest, ReservedNameRedundant) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " reserved_name: \"foo\"" " reserved_name: \"foo\"" "}", "foo.proto: foo: NAME: Field name \"foo\" is reserved multiple times.\n"); } TEST_F(ValidationErrorTest, ReservedFieldsDebugString) { const FileDescriptor* file = BuildFile( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " reserved_name: \"foo\"" " reserved_name: \"bar\"" " reserved_range { start: 5 end: 6 }" " reserved_range { start: 10 end: 20 }" "}"); ASSERT_EQ( "syntax = \"proto2\";\n\n" "message Foo {\n" " reserved 5, 10 to 19;\n" " reserved \"foo\", \"bar\";\n" "}\n\n", file->DebugString()); } TEST_F(ValidationErrorTest, EnumReservedFieldError) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type {" " name: \"Foo\"" " value { name:\"BAR\" number:15 }" " reserved_range { start: 10 end: 20 }" "}", "foo.proto: BAR: NUMBER: Enum value \"BAR\" uses reserved number 15.\n"); } TEST_F(ValidationErrorTest, EnumNegativeReservedFieldError) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type {" " name: \"Foo\"" " value { name:\"BAR\" number:-15 }" " reserved_range { start: -20 end: -10 }" "}", "foo.proto: BAR: NUMBER: Enum value \"BAR\" uses reserved number -15.\n"); } TEST_F(ValidationErrorTest, EnumReservedRangeOverlap) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type {" " name: \"Foo\"" " value { name:\"BAR\" number:0 }" " reserved_range { start: 10 end: 20 }" " reserved_range { start: 5 end: 15 }" "}", "foo.proto: Foo: NUMBER: Reserved range 5 to 14" " overlaps with already-defined range 10 to 19.\n"); } TEST_F(ValidationErrorTest, EnumNegativeReservedRangeOverlap) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type {" " name: \"Foo\"" " value { name:\"BAR\" number:0 }" " reserved_range { start: -20 end: -10 }" " reserved_range { start: -15 end: -5 }" "}", "foo.proto: Foo: NUMBER: Reserved range -15 to -6" " overlaps with already-defined range -20 to -11.\n"); } TEST_F(ValidationErrorTest, EnumMixedReservedRangeOverlap) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type {" " name: \"Foo\"" " value { name:\"BAR\" number:20 }" " reserved_range { start: -20 end: 10 }" " reserved_range { start: -15 end: 5 }" "}", "foo.proto: Foo: NUMBER: Reserved range -15 to 4" " overlaps with already-defined range -20 to 9.\n"); } TEST_F(ValidationErrorTest, EnumReservedRangeStartGreaterThanEnd) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type {" " name: \"Foo\"" " value { name:\"BAR\" number:20 }" " reserved_range { start: 11 end: 10 }" "}", "foo.proto: Foo: NUMBER: Reserved range end number must be greater" " than start number.\n"); } TEST_F(ValidationErrorTest, EnumReservedNameError) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type {" " name: \"Foo\"" " value { name:\"FOO\" number:15 }" " value { name:\"BAR\" number:15 }" " reserved_name: \"FOO\"" " reserved_name: \"BAR\"" "}", "foo.proto: FOO: NAME: Enum value \"FOO\" is reserved.\n" "foo.proto: BAR: NAME: Enum value \"BAR\" is reserved.\n"); } TEST_F(ValidationErrorTest, EnumReservedNameRedundant) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type {" " name: \"Foo\"" " value { name:\"FOO\" number:15 }" " reserved_name: \"foo\"" " reserved_name: \"foo\"" "}", "foo.proto: foo: NAME: Enum value \"foo\" is reserved multiple times.\n"); } TEST_F(ValidationErrorTest, EnumReservedFieldsDebugString) { const FileDescriptor* file = BuildFile( "name: \"foo.proto\" " "enum_type {" " name: \"Foo\"" " value { name:\"FOO\" number:3 }" " reserved_name: \"foo\"" " reserved_name: \"bar\"" " reserved_range { start: -6 end: -6 }" " reserved_range { start: -5 end: -4 }" " reserved_range { start: -1 end: 1 }" " reserved_range { start: 5 end: 5 }" " reserved_range { start: 10 end: 19 }" "}"); ASSERT_EQ( "syntax = \"proto2\";\n\n" "enum Foo {\n" " FOO = 3;\n" " reserved -6, -5 to -4, -1 to 1, 5, 10 to 19;\n" " reserved \"foo\", \"bar\";\n" "}\n\n", file->DebugString()); } TEST_F(ValidationErrorTest, InvalidDefaults) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" // Invalid number. " field { name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32" " default_value: \"abc\" }" // Empty default value. " field { name: \"bar\" number: 2 label: LABEL_OPTIONAL type: TYPE_INT32" " default_value: \"\" }" // Invalid boolean. " field { name: \"baz\" number: 3 label: LABEL_OPTIONAL type: TYPE_BOOL" " default_value: \"abc\" }" // Messages can't have defaults. " field { name: \"qux\" number: 4 label: LABEL_OPTIONAL type: TYPE_MESSAGE" " default_value: \"abc\" type_name: \"Foo\" }" // Same thing, but we don't know that this field has message type until // we look up the type name. " field { name: \"quux\" number: 5 label: LABEL_OPTIONAL" " default_value: \"abc\" type_name: \"Foo\" }" // Repeateds can't have defaults. " field { name: \"corge\" number: 6 label: LABEL_REPEATED type: TYPE_INT32" " default_value: \"1\" }" "}", "foo.proto: Foo.foo: DEFAULT_VALUE: Couldn't parse default value \"abc\".\n" "foo.proto: Foo.bar: DEFAULT_VALUE: Couldn't parse default value \"\".\n" "foo.proto: Foo.baz: DEFAULT_VALUE: Boolean default must be true or " "false.\n" "foo.proto: Foo.qux: DEFAULT_VALUE: Messages can't have default values.\n" "foo.proto: Foo.corge: DEFAULT_VALUE: Repeated fields can't have default " "values.\n" // This ends up being reported later because the error is detected at // cross-linking time. "foo.proto: Foo.quux: DEFAULT_VALUE: Messages can't have default " "values.\n"); } TEST_F(ValidationErrorTest, NegativeFieldNumber) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name: \"foo\" number: -1 label:LABEL_OPTIONAL type:TYPE_INT32 }" "}", "foo.proto: Foo.foo: NUMBER: Field numbers must be positive integers.\n"); } TEST_F(ValidationErrorTest, HugeFieldNumber) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name: \"foo\" number: 0x70000000 " " label:LABEL_OPTIONAL type:TYPE_INT32 }" "}", "foo.proto: Foo.foo: NUMBER: Field numbers cannot be greater than " "536870911.\n"); } TEST_F(ValidationErrorTest, ReservedFieldNumber) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field {name:\"foo\" number: 18999 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field {name:\"bar\" number: 19000 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field {name:\"baz\" number: 19999 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field {name:\"qux\" number: 20000 label:LABEL_OPTIONAL type:TYPE_INT32 }" "}", "foo.proto: Foo.bar: NUMBER: Field numbers 19000 through 19999 are " "reserved for the protocol buffer library implementation.\n" "foo.proto: Foo.baz: NUMBER: Field numbers 19000 through 19999 are " "reserved for the protocol buffer library implementation.\n"); } TEST_F(ValidationErrorTest, ExtensionMissingExtendee) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " extension { name: \"foo\" number: 1 label: LABEL_OPTIONAL" " type_name: \"Foo\" }" "}", "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee not set for " "extension field.\n"); } TEST_F(ValidationErrorTest, NonExtensionWithExtendee) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Bar\"" " extension_range { start: 1 end: 2 }" "}" "message_type {" " name: \"Foo\"" " field { name: \"foo\" number: 1 label: LABEL_OPTIONAL" " type_name: \"Foo\" extendee: \"Bar\" }" "}", "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee set for " "non-extension field.\n"); } TEST_F(ValidationErrorTest, FieldOneofIndexTooLarge) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 1 }" " field { name:\"dummy\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 0 }" " oneof_decl { name:\"bar\" }" "}", "foo.proto: Foo.foo: OTHER: FieldDescriptorProto.oneof_index 1 is out of " "range for type \"Foo\".\n"); } TEST_F(ValidationErrorTest, FieldOneofIndexNegative) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: -1 }" " field { name:\"dummy\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 0 }" " oneof_decl { name:\"bar\" }" "}", "foo.proto: Foo.foo: OTHER: FieldDescriptorProto.oneof_index -1 is out of " "range for type \"Foo\".\n"); } TEST_F(ValidationErrorTest, OneofFieldsConsecutiveDefinition) { // Fields belonging to the same oneof must be defined consecutively. BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo1\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 0 }" " field { name:\"bar\" number: 2 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field { name:\"foo2\" number: 3 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 0 }" " oneof_decl { name:\"foos\" }" "}", "foo.proto: Foo.bar: OTHER: Fields in the same oneof must be defined " "consecutively. \"bar\" cannot be defined before the completion of the " "\"foos\" oneof definition.\n"); // Prevent interleaved fields, which belong to different oneofs. BuildFileWithErrors( "name: \"foo2.proto\" " "message_type {" " name: \"Foo2\"" " field { name:\"foo1\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 0 }" " field { name:\"bar1\" number: 2 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 1 }" " field { name:\"foo2\" number: 3 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 0 }" " field { name:\"bar2\" number: 4 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 1 }" " oneof_decl { name:\"foos\" }" " oneof_decl { name:\"bars\" }" "}", "foo2.proto: Foo2.bar1: OTHER: Fields in the same oneof must be defined " "consecutively. \"bar1\" cannot be defined before the completion of the " "\"foos\" oneof definition.\n" "foo2.proto: Foo2.foo2: OTHER: Fields in the same oneof must be defined " "consecutively. \"foo2\" cannot be defined before the completion of the " "\"bars\" oneof definition.\n"); // Another case for normal fields and different oneof fields interleave. BuildFileWithErrors( "name: \"foo3.proto\" " "message_type {" " name: \"Foo3\"" " field { name:\"foo1\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 0 }" " field { name:\"bar1\" number: 2 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 1 }" " field { name:\"baz\" number: 3 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field { name:\"foo2\" number: 4 label:LABEL_OPTIONAL type:TYPE_INT32 " " oneof_index: 0 }" " oneof_decl { name:\"foos\" }" " oneof_decl { name:\"bars\" }" "}", "foo3.proto: Foo3.baz: OTHER: Fields in the same oneof must be defined " "consecutively. \"baz\" cannot be defined before the completion of the " "\"foos\" oneof definition.\n"); } TEST_F(ValidationErrorTest, FieldNumberConflict) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field { name: \"bar\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" "}", "foo.proto: Foo.bar: NUMBER: Field number 1 has already been used in " "\"Foo\" by field \"foo\".\n"); } TEST_F(ValidationErrorTest, BadMessageSetExtensionType) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"MessageSet\"" " options { message_set_wire_format: true }" " extension_range { start: 4 end: 5 }" "}" "message_type {" " name: \"Foo\"" " extension { name:\"foo\" number:4 label:LABEL_OPTIONAL type:TYPE_INT32" " extendee: \"MessageSet\" }" "}", "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional " "messages.\n"); } TEST_F(ValidationErrorTest, BadMessageSetExtensionLabel) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"MessageSet\"" " options { message_set_wire_format: true }" " extension_range { start: 4 end: 5 }" "}" "message_type {" " name: \"Foo\"" " extension { name:\"foo\" number:4 label:LABEL_REPEATED type:TYPE_MESSAGE" " type_name: \"Foo\" extendee: \"MessageSet\" }" "}", "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional " "messages.\n"); } TEST_F(ValidationErrorTest, FieldInMessageSet) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " options { message_set_wire_format: true }" " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" "}", "foo.proto: Foo.foo: NAME: MessageSets cannot have fields, only " "extensions.\n"); } TEST_F(ValidationErrorTest, NegativeExtensionRangeNumber) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " extension_range { start: -10 end: -1 }" "}", "foo.proto: Foo: NUMBER: Extension numbers must be positive integers.\n"); } TEST_F(ValidationErrorTest, HugeExtensionRangeNumber) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " extension_range { start: 1 end: 0x70000000 }" "}", "foo.proto: Foo: NUMBER: Extension numbers cannot be greater than " "536870911.\n"); } TEST_F(ValidationErrorTest, ExtensionRangeEndBeforeStart) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " extension_range { start: 10 end: 10 }" " extension_range { start: 10 end: 5 }" "}", "foo.proto: Foo: NUMBER: Extension range end number must be greater than " "start number.\n" "foo.proto: Foo: NUMBER: Extension range end number must be greater than " "start number.\n"); } TEST_F(ValidationErrorTest, EmptyEnum) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type { name: \"Foo\" }" // Also use the empty enum in a message to make sure there are no crashes // during validation (possible if the code attempts to derive a default // value for the field). "message_type {" " name: \"Bar\"" " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type_name:\"Foo\" }" " field { name: \"bar\" number: 2 label:LABEL_OPTIONAL type_name:\"Foo\" " " default_value: \"NO_SUCH_VALUE\" }" "}", "foo.proto: Foo: NAME: Enums must contain at least one value.\n" "foo.proto: Bar.bar: DEFAULT_VALUE: Enum type \"Foo\" has no value named " "\"NO_SUCH_VALUE\".\n"); } TEST_F(ValidationErrorTest, UndefinedExtendee) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" " extendee: \"Bar\" }" "}", "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not defined.\n"); } TEST_F(ValidationErrorTest, NonMessageExtendee) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } }" "message_type {" " name: \"Foo\"" " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" " extendee: \"Bar\" }" "}", "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not a message type.\n"); } TEST_F(ValidationErrorTest, NotAnExtensionNumber) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Bar\"" "}" "message_type {" " name: \"Foo\"" " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" " extendee: \"Bar\" }" "}", "foo.proto: Foo.foo: NUMBER: \"Bar\" does not declare 1 as an extension " "number.\n"); } TEST_F(ValidationErrorTest, RequiredExtension) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Bar\"" " extension_range { start: 1000 end: 10000 }" "}" "message_type {" " name: \"Foo\"" " extension {" " name:\"foo\"" " number:1000" " label:LABEL_REQUIRED" " type:TYPE_INT32" " extendee: \"Bar\"" " }" "}", "foo.proto: Foo.foo: TYPE: Message extensions cannot have required " "fields.\n"); } TEST_F(ValidationErrorTest, UndefinedFieldType) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" "}", "foo.proto: Foo.foo: TYPE: \"Bar\" is not defined.\n"); } TEST_F(ValidationErrorTest, UndefinedFieldTypeWithDefault) { // See b/12533582. Previously this failed because the default value was not // accepted by the parser, which assumed an enum type, leading to an unclear // error message. We want this input to yield a validation error instead, // since the unknown type is the primary problem. BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"int\" " " default_value:\"1\" }" "}", "foo.proto: Foo.foo: TYPE: \"int\" is not defined.\n"); } TEST_F(ValidationErrorTest, UndefinedNestedFieldType) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " nested_type { name:\"Baz\" }" " field { name:\"foo\" number:1" " label:LABEL_OPTIONAL" " type_name:\"Foo.Baz.Bar\" }" "}", "foo.proto: Foo.foo: TYPE: \"Foo.Baz.Bar\" is not defined.\n"); } TEST_F(ValidationErrorTest, FieldTypeDefinedInUndeclaredDependency) { BuildFile( "name: \"bar.proto\" " "message_type { name: \"Bar\" } "); BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" "}", "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", " "which is not imported by \"foo.proto\". To use it here, please add the " "necessary import.\n"); } TEST_F(ValidationErrorTest, FieldTypeDefinedInIndirectDependency) { // Test for hidden dependencies. // // // bar.proto // message Bar{} // // // forward.proto // import "bar.proto" // // // foo.proto // import "forward.proto" // message Foo { // optional Bar foo = 1; // Error, needs to import bar.proto explicitly. // } // BuildFile( "name: \"bar.proto\" " "message_type { name: \"Bar\" }"); BuildFile( "name: \"forward.proto\"" "dependency: \"bar.proto\""); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"forward.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" "}", "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", " "which is not imported by \"foo.proto\". To use it here, please add the " "necessary import.\n"); } TEST_F(ValidationErrorTest, FieldTypeDefinedInPublicDependency) { // Test for public dependencies. // // // bar.proto // message Bar{} // // // forward.proto // import public "bar.proto" // // // foo.proto // import "forward.proto" // message Foo { // optional Bar foo = 1; // Correct. "bar.proto" is public imported into // // forward.proto, so when "foo.proto" imports // // "forward.proto", it imports "bar.proto" too. // } // BuildFile( "name: \"bar.proto\" " "message_type { name: \"Bar\" }"); BuildFile( "name: \"forward.proto\"" "dependency: \"bar.proto\" " "public_dependency: 0"); BuildFile( "name: \"foo.proto\" " "dependency: \"forward.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" "}"); } TEST_F(ValidationErrorTest, FieldTypeDefinedInTransitivePublicDependency) { // Test for public dependencies. // // // bar.proto // message Bar{} // // // forward.proto // import public "bar.proto" // // // forward2.proto // import public "forward.proto" // // // foo.proto // import "forward2.proto" // message Foo { // optional Bar foo = 1; // Correct, public imports are transitive. // } // BuildFile( "name: \"bar.proto\" " "message_type { name: \"Bar\" }"); BuildFile( "name: \"forward.proto\"" "dependency: \"bar.proto\" " "public_dependency: 0"); BuildFile( "name: \"forward2.proto\"" "dependency: \"forward.proto\" " "public_dependency: 0"); BuildFile( "name: \"foo.proto\" " "dependency: \"forward2.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" "}"); } TEST_F(ValidationErrorTest, FieldTypeDefinedInPrivateDependencyOfPublicDependency) { // Test for public dependencies. // // // bar.proto // message Bar{} // // // forward.proto // import "bar.proto" // // // forward2.proto // import public "forward.proto" // // // foo.proto // import "forward2.proto" // message Foo { // optional Bar foo = 1; // Error, the "bar.proto" is not public imported // // into "forward.proto", so will not be imported // // into either "forward2.proto" or "foo.proto". // } // BuildFile( "name: \"bar.proto\" " "message_type { name: \"Bar\" }"); BuildFile( "name: \"forward.proto\"" "dependency: \"bar.proto\""); BuildFile( "name: \"forward2.proto\"" "dependency: \"forward.proto\" " "public_dependency: 0"); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"forward2.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" "}", "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", " "which is not imported by \"foo.proto\". To use it here, please add the " "necessary import.\n"); } TEST_F(ValidationErrorTest, SearchMostLocalFirst) { // The following should produce an error that Bar.Baz is resolved but // not defined: // message Bar { message Baz {} } // message Foo { // message Bar { // // Placing "message Baz{}" here, or removing Foo.Bar altogether, // // would fix the error. // } // optional Bar.Baz baz = 1; // } // An one point the lookup code incorrectly did not produce an error in this // case, because when looking for Bar.Baz, it would try "Foo.Bar.Baz" first, // fail, and ten try "Bar.Baz" and succeed, even though "Bar" should actually // refer to the inner Bar, not the outer one. BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Bar\"" " nested_type { name: \"Baz\" }" "}" "message_type {" " name: \"Foo\"" " nested_type { name: \"Bar\" }" " field { name:\"baz\" number:1 label:LABEL_OPTIONAL" " type_name:\"Bar.Baz\" }" "}", "foo.proto: Foo.baz: TYPE: \"Bar.Baz\" is resolved to \"Foo.Bar.Baz\"," " which is not defined. The innermost scope is searched first in name " "resolution. Consider using a leading '.'(i.e., \".Bar.Baz\") to start " "from the outermost scope.\n"); } TEST_F(ValidationErrorTest, SearchMostLocalFirst2) { // This test would find the most local "Bar" first, and does, but // proceeds to find the outer one because the inner one's not an // aggregate. BuildFile( "name: \"foo.proto\" " "message_type {" " name: \"Bar\"" " nested_type { name: \"Baz\" }" "}" "message_type {" " name: \"Foo\"" " field { name: \"Bar\" number:1 type:TYPE_BYTES } " " field { name:\"baz\" number:2 label:LABEL_OPTIONAL" " type_name:\"Bar.Baz\" }" "}"); } TEST_F(ValidationErrorTest, PackageOriginallyDeclaredInTransitiveDependent) { // Imagine we have the following: // // foo.proto: // package foo.bar; // bar.proto: // package foo.bar; // import "foo.proto"; // message Bar {} // baz.proto: // package foo; // import "bar.proto" // message Baz { optional bar.Bar qux = 1; } // // When validating baz.proto, we will look up "bar.Bar". As part of this // lookup, we first lookup "bar" then try to find "Bar" within it. "bar" // should resolve to "foo.bar". Note, though, that "foo.bar" was originally // defined in foo.proto, which is not a direct dependency of baz.proto. The // implementation of FindSymbol() normally only returns symbols in direct // dependencies, not indirect ones. This test insures that this does not // prevent it from finding "foo.bar". BuildFile( "name: \"foo.proto\" " "package: \"foo.bar\" "); BuildFile( "name: \"bar.proto\" " "package: \"foo.bar\" " "dependency: \"foo.proto\" " "message_type { name: \"Bar\" }"); BuildFile( "name: \"baz.proto\" " "package: \"foo\" " "dependency: \"bar.proto\" " "message_type { " " name: \"Baz\" " " field { name:\"qux\" number:1 label:LABEL_OPTIONAL " " type_name:\"bar.Bar\" }" "}"); } TEST_F(ValidationErrorTest, FieldTypeNotAType) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL " " type_name:\".Foo.bar\" }" " field { name:\"bar\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }" "}", "foo.proto: Foo.foo: TYPE: \".Foo.bar\" is not a type.\n"); } TEST_F(ValidationErrorTest, RelativeFieldTypeNotAType) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " nested_type {" " name: \"Bar\"" " field { name:\"Baz\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }" " }" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL " " type_name:\"Bar.Baz\" }" "}", "foo.proto: Foo.foo: TYPE: \"Bar.Baz\" is not a type.\n"); } TEST_F(ValidationErrorTest, FieldTypeMayBeItsName) { BuildFile( "name: \"foo.proto\" " "message_type {" " name: \"Bar\"" "}" "message_type {" " name: \"Foo\"" " field { name:\"Bar\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" "}"); } TEST_F(ValidationErrorTest, EnumFieldTypeIsMessage) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { name: \"Bar\" } " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_ENUM" " type_name:\"Bar\" }" "}", "foo.proto: Foo.foo: TYPE: \"Bar\" is not an enum type.\n"); } TEST_F(ValidationErrorTest, MessageFieldTypeIsEnum) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE" " type_name:\"Bar\" }" "}", "foo.proto: Foo.foo: TYPE: \"Bar\" is not a message type.\n"); } TEST_F(ValidationErrorTest, BadEnumDefaultValue) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\"" " default_value:\"NO_SUCH_VALUE\" }" "}", "foo.proto: Foo.foo: DEFAULT_VALUE: Enum type \"Bar\" has no value named " "\"NO_SUCH_VALUE\".\n"); } TEST_F(ValidationErrorTest, EnumDefaultValueIsInteger) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\"" " default_value:\"0\" }" "}", "foo.proto: Foo.foo: DEFAULT_VALUE: Default value for an enum field must " "be an identifier.\n"); } TEST_F(ValidationErrorTest, PrimitiveWithTypeName) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" " type_name:\"Foo\" }" "}", "foo.proto: Foo.foo: TYPE: Field with primitive type has type_name.\n"); } TEST_F(ValidationErrorTest, NonPrimitiveWithoutTypeName) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE }" "}", "foo.proto: Foo.foo: TYPE: Field with message or enum type missing " "type_name.\n"); } TEST_F(ValidationErrorTest, OneofWithNoFields) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " oneof_decl { name:\"bar\" }" "}", "foo.proto: Foo.bar: NAME: Oneof must have at least one field.\n"); } TEST_F(ValidationErrorTest, OneofLabelMismatch) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"Foo\"" " field { name:\"foo\" number:1 label:LABEL_REPEATED type:TYPE_INT32 " " oneof_index:0 }" " oneof_decl { name:\"bar\" }" "}", "foo.proto: Foo.foo: NAME: Fields of oneofs must themselves have label " "LABEL_OPTIONAL.\n"); } TEST_F(ValidationErrorTest, InputTypeNotDefined) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { name: \"Foo\" } " "service {" " name: \"TestService\"" " method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }" "}", "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not defined.\n" ); } TEST_F(ValidationErrorTest, InputTypeNotAMessage) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { name: \"Foo\" } " "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " "service {" " name: \"TestService\"" " method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }" "}", "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not a message type.\n" ); } TEST_F(ValidationErrorTest, OutputTypeNotDefined) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { name: \"Foo\" } " "service {" " name: \"TestService\"" " method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }" "}", "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not defined.\n" ); } TEST_F(ValidationErrorTest, OutputTypeNotAMessage) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { name: \"Foo\" } " "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " "service {" " name: \"TestService\"" " method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }" "}", "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not a message type.\n" ); } TEST_F(ValidationErrorTest, IllegalPackedField) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type {\n" " name: \"Foo\"" " field { name:\"packed_string\" number:1 label:LABEL_REPEATED " " type:TYPE_STRING " " options { uninterpreted_option {" " name { name_part: \"packed\" is_extension: false }" " identifier_value: \"true\" }}}\n" " field { name:\"packed_message\" number:3 label:LABEL_REPEATED " " type_name: \"Foo\"" " options { uninterpreted_option {" " name { name_part: \"packed\" is_extension: false }" " identifier_value: \"true\" }}}\n" " field { name:\"optional_int32\" number: 4 label: LABEL_OPTIONAL " " type:TYPE_INT32 " " options { uninterpreted_option {" " name { name_part: \"packed\" is_extension: false }" " identifier_value: \"true\" }}}\n" "}", "foo.proto: Foo.packed_string: TYPE: [packed = true] can only be " "specified for repeated primitive fields.\n" "foo.proto: Foo.packed_message: TYPE: [packed = true] can only be " "specified for repeated primitive fields.\n" "foo.proto: Foo.optional_int32: TYPE: [packed = true] can only be " "specified for repeated primitive fields.\n" ); } TEST_F(ValidationErrorTest, OptionWrongType) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { " " name: \"TestMessage\" " " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING " " options { uninterpreted_option { name { name_part: \"ctype\" " " is_extension: false }" " positive_int_value: 1 }" " }" " }" "}\n", "foo.proto: TestMessage.foo: OPTION_VALUE: Value must be identifier for " "enum-valued option \"google.protobuf.FieldOptions.ctype\".\n"); } TEST_F(ValidationErrorTest, OptionExtendsAtomicType) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { " " name: \"TestMessage\" " " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING " " options { uninterpreted_option { name { name_part: \"ctype\" " " is_extension: false }" " name { name_part: \"foo\" " " is_extension: true }" " positive_int_value: 1 }" " }" " }" "}\n", "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" is an " "atomic type, not a message.\n"); } TEST_F(ValidationErrorTest, DupOption) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { " " name: \"TestMessage\" " " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_UINT32 " " options { uninterpreted_option { name { name_part: \"ctype\" " " is_extension: false }" " identifier_value: \"CORD\" }" " uninterpreted_option { name { name_part: \"ctype\" " " is_extension: false }" " identifier_value: \"CORD\" }" " }" " }" "}\n", "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" was " "already set.\n"); } TEST_F(ValidationErrorTest, InvalidOptionName) { BuildFileWithErrors( "name: \"foo.proto\" " "message_type { " " name: \"TestMessage\" " " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL " " options { uninterpreted_option { " " name { name_part: \"uninterpreted_option\" " " is_extension: false }" " positive_int_value: 1 " " }" " }" " }" "}\n", "foo.proto: TestMessage.foo: OPTION_NAME: Option must not use " "reserved name \"uninterpreted_option\".\n"); } TEST_F(ValidationErrorTest, RepeatedMessageOption) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "message_type: { name: \"Bar\" field: { " " name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32 } " "} " "extension { name: \"bar\" number: 7672757 label: LABEL_REPEATED " " type: TYPE_MESSAGE type_name: \"Bar\" " " extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"bar\" " " is_extension: true } " " name { name_part: \"foo\" " " is_extension: false } " " positive_int_value: 1 } }", "foo.proto: foo.proto: OPTION_NAME: Option field \"(bar)\" is a " "repeated message. Repeated message options must be initialized " "using an aggregate value.\n"); } TEST_F(ValidationErrorTest, ResolveUndefinedOption) { // The following should produce an eror that baz.bar is resolved but not // defined. // foo.proto: // package baz // import google/protobuf/descriptor.proto // message Bar { optional int32 foo = 1; } // extend FileOptions { optional Bar bar = 7672757; } // // qux.proto: // package qux.baz // option (baz.bar).foo = 1; // // Although "baz.bar" is already defined, the lookup code will try // "qux.baz.bar", since it's the match from the innermost scope, which will // cause a symbol not defined error. BuildDescriptorMessagesInTestPool(); BuildFile( "name: \"foo.proto\" " "package: \"baz\" " "dependency: \"google/protobuf/descriptor.proto\" " "message_type: { name: \"Bar\" field: { " " name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32 } " "} " "extension { name: \"bar\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_MESSAGE type_name: \"Bar\" " " extendee: \"google.protobuf.FileOptions\" }"); BuildFileWithErrors( "name: \"qux.proto\" " "package: \"qux.baz\" " "options { uninterpreted_option { name { name_part: \"baz.bar\" " " is_extension: true } " " name { name_part: \"foo\" " " is_extension: false } " " positive_int_value: 1 } }", "qux.proto: qux.proto: OPTION_NAME: Option \"(baz.bar)\" is resolved to " "\"(qux.baz.bar)\"," " which is not defined. The innermost scope is searched first in name " "resolution. Consider using a leading '.'(i.e., \"(.baz.bar)\") to start " "from the outermost scope.\n"); } TEST_F(ValidationErrorTest, UnknownOption) { BuildFileWithErrors( "name: \"qux.proto\" " "package: \"qux.baz\" " "options { uninterpreted_option { name { name_part: \"baaz.bar\" " " is_extension: true } " " name { name_part: \"foo\" " " is_extension: false } " " positive_int_value: 1 } }", "qux.proto: qux.proto: OPTION_NAME: Option \"(baaz.bar)\" unknown.\n"); } TEST_F(ValidationErrorTest, CustomOptionConflictingFieldNumber) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo1\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }" "extension { name: \"foo2\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }", "foo.proto: foo2: NUMBER: Extension number 7672757 has already been used " "in \"google.protobuf.FieldOptions\" by extension \"foo1\".\n"); } TEST_F(ValidationErrorTest, Int32OptionValueOutOfPositiveRange) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " positive_int_value: 0x80000000 } " "}", "foo.proto: foo.proto: OPTION_VALUE: Value out of range " "for int32 option \"foo\".\n"); } TEST_F(ValidationErrorTest, Int32OptionValueOutOfNegativeRange) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " negative_int_value: -0x80000001 } " "}", "foo.proto: foo.proto: OPTION_VALUE: Value out of range " "for int32 option \"foo\".\n"); } TEST_F(ValidationErrorTest, Int32OptionValueIsNotPositiveInt) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " string_value: \"5\" } }", "foo.proto: foo.proto: OPTION_VALUE: Value must be integer " "for int32 option \"foo\".\n"); } TEST_F(ValidationErrorTest, Int64OptionValueOutOfRange) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " positive_int_value: 0x8000000000000000 } " "}", "foo.proto: foo.proto: OPTION_VALUE: Value out of range " "for int64 option \"foo\".\n"); } TEST_F(ValidationErrorTest, Int64OptionValueIsNotPositiveInt) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " identifier_value: \"5\" } }", "foo.proto: foo.proto: OPTION_VALUE: Value must be integer " "for int64 option \"foo\".\n"); } TEST_F(ValidationErrorTest, UInt32OptionValueOutOfRange) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " positive_int_value: 0x100000000 } }", "foo.proto: foo.proto: OPTION_VALUE: Value out of range " "for uint32 option \"foo\".\n"); } TEST_F(ValidationErrorTest, UInt32OptionValueIsNotPositiveInt) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " double_value: -5.6 } }", "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer " "for uint32 option \"foo\".\n"); } TEST_F(ValidationErrorTest, UInt64OptionValueIsNotPositiveInt) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_UINT64 extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " negative_int_value: -5 } }", "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer " "for uint64 option \"foo\".\n"); } TEST_F(ValidationErrorTest, FloatOptionValueIsNotNumber) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_FLOAT extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " string_value: \"bar\" } }", "foo.proto: foo.proto: OPTION_VALUE: Value must be number " "for float option \"foo\".\n"); } TEST_F(ValidationErrorTest, DoubleOptionValueIsNotNumber) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_DOUBLE extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " string_value: \"bar\" } }", "foo.proto: foo.proto: OPTION_VALUE: Value must be number " "for double option \"foo\".\n"); } TEST_F(ValidationErrorTest, BoolOptionValueIsNotTrueOrFalse) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_BOOL extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " identifier_value: \"bar\" } }", "foo.proto: foo.proto: OPTION_VALUE: Value must be \"true\" or \"false\" " "for boolean option \"foo\".\n"); } TEST_F(ValidationErrorTest, EnumOptionValueIsNotIdentifier) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } " " value { name: \"BAZ\" number: 2 } }" "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_ENUM type_name: \"FooEnum\" " " extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " string_value: \"QUUX\" } }", "foo.proto: foo.proto: OPTION_VALUE: Value must be identifier for " "enum-valued option \"foo\".\n"); } TEST_F(ValidationErrorTest, EnumOptionValueIsNotEnumValueName) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } " " value { name: \"BAZ\" number: 2 } }" "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_ENUM type_name: \"FooEnum\" " " extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " identifier_value: \"QUUX\" } }", "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum\" has no value " "named \"QUUX\" for option \"foo\".\n"); } TEST_F(ValidationErrorTest, EnumOptionValueIsSiblingEnumValueName) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "enum_type { name: \"FooEnum1\" value { name: \"BAR\" number: 1 } " " value { name: \"BAZ\" number: 2 } }" "enum_type { name: \"FooEnum2\" value { name: \"QUX\" number: 1 } " " value { name: \"QUUX\" number: 2 } }" "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_ENUM type_name: \"FooEnum1\" " " extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " identifier_value: \"QUUX\" } }", "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum1\" has no value " "named \"QUUX\" for option \"foo\". This appears to be a value from a " "sibling type.\n"); } TEST_F(ValidationErrorTest, StringOptionValueIsNotString) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_STRING extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " identifier_value: \"QUUX\" } }", "foo.proto: foo.proto: OPTION_VALUE: Value must be quoted string for " "string option \"foo\".\n"); } TEST_F(ValidationErrorTest, DuplicateExtensionFieldNumber) { BuildDescriptorMessagesInTestPool(); BuildFile( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"option1\" number: 1000 label: LABEL_OPTIONAL " " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }"); BuildFileWithWarnings( "name: \"bar.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "extension { name: \"option2\" number: 1000 label: LABEL_OPTIONAL " " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }", "bar.proto: option2: NUMBER: Extension number 1000 has already been used " "in \"google.protobuf.FileOptions\" by extension \"option1\" defined in " "foo.proto.\n"); } // Helper function for tests that check for aggregate value parsing // errors. The "value" argument is embedded inside the // "uninterpreted_option" portion of the result. static string EmbedAggregateValue(const char* value) { return strings::Substitute( "name: \"foo.proto\" " "dependency: \"google/protobuf/descriptor.proto\" " "message_type { name: \"Foo\" } " "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " " type: TYPE_MESSAGE type_name: \"Foo\" " " extendee: \"google.protobuf.FileOptions\" }" "options { uninterpreted_option { name { name_part: \"foo\" " " is_extension: true } " " $0 } }", value); } TEST_F(ValidationErrorTest, AggregateValueNotFound) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( EmbedAggregateValue("string_value: \"\""), "foo.proto: foo.proto: OPTION_VALUE: Option \"foo\" is a message. " "To set the entire message, use syntax like " "\"foo = { }\". To set fields within it, use " "syntax like \"foo.foo = value\".\n"); } TEST_F(ValidationErrorTest, AggregateValueParseError) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( EmbedAggregateValue("aggregate_value: \"1+2\""), "foo.proto: foo.proto: OPTION_VALUE: Error while parsing option " "value for \"foo\": Expected identifier, got: 1\n"); } TEST_F(ValidationErrorTest, AggregateValueUnknownFields) { BuildDescriptorMessagesInTestPool(); BuildFileWithErrors( EmbedAggregateValue("aggregate_value: \"x:100\""), "foo.proto: foo.proto: OPTION_VALUE: Error while parsing option " "value for \"foo\": Message type \"Foo\" has no field named \"x\".\n"); } TEST_F(ValidationErrorTest, NotLiteImportsLite) { BuildFile( "name: \"bar.proto\" " "options { optimize_for: LITE_RUNTIME } "); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"bar.proto\" ", "foo.proto: foo.proto: OTHER: Files that do not use optimize_for = " "LITE_RUNTIME cannot import files which do use this option. This file " "is not lite, but it imports \"bar.proto\" which is.\n"); } TEST_F(ValidationErrorTest, LiteExtendsNotLite) { BuildFile( "name: \"bar.proto\" " "message_type: {" " name: \"Bar\"" " extension_range { start: 1 end: 1000 }" "}"); BuildFileWithErrors( "name: \"foo.proto\" " "dependency: \"bar.proto\" " "options { optimize_for: LITE_RUNTIME } " "extension { name: \"ext\" number: 123 label: LABEL_OPTIONAL " " type: TYPE_INT32 extendee: \"Bar\" }", "foo.proto: ext: EXTENDEE: Extensions to non-lite types can only be " "declared in non-lite files. Note that you cannot extend a non-lite " "type to contain a lite type, but the reverse is allowed.\n"); } TEST_F(ValidationErrorTest, NoLiteServices) { BuildFileWithErrors( "name: \"foo.proto\" " "options {" " optimize_for: LITE_RUNTIME" " cc_generic_services: true" " java_generic_services: true" "} " "service { name: \"Foo\" }", "foo.proto: Foo: NAME: Files with optimize_for = LITE_RUNTIME cannot " "define services unless you set both options cc_generic_services and " "java_generic_sevices to false.\n"); BuildFile( "name: \"bar.proto\" " "options {" " optimize_for: LITE_RUNTIME" " cc_generic_services: false" " java_generic_services: false" "} " "service { name: \"Bar\" }"); } TEST_F(ValidationErrorTest, RollbackAfterError) { // Build a file which contains every kind of construct but references an // undefined type. All these constructs will be added to the symbol table // before the undefined type error is noticed. The DescriptorPool will then // have to roll everything back. BuildFileWithErrors( "name: \"foo.proto\" " "message_type {" " name: \"TestMessage\"" " field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }" "} " "enum_type {" " name: \"TestEnum\"" " value { name:\"BAR\" number:1 }" "} " "service {" " name: \"TestService\"" " method {" " name: \"Baz\"" " input_type: \"NoSuchType\"" // error " output_type: \"TestMessage\"" " }" "}", "foo.proto: TestService.Baz: INPUT_TYPE: \"NoSuchType\" is not defined.\n" ); // Make sure that if we build the same file again with the error fixed, // it works. If the above rollback was incomplete, then some symbols will // be left defined, and this second attempt will fail since it tries to // re-define the same symbols. BuildFile( "name: \"foo.proto\" " "message_type {" " name: \"TestMessage\"" " field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }" "} " "enum_type {" " name: \"TestEnum\"" " value { name:\"BAR\" number:1 }" "} " "service {" " name: \"TestService\"" " method { name:\"Baz\"" " input_type:\"TestMessage\"" " output_type:\"TestMessage\" }" "}"); } TEST_F(ValidationErrorTest, ErrorsReportedToLogError) { // Test that errors are reported to GOOGLE_LOG(ERROR) if no error collector is // provided. FileDescriptorProto file_proto; ASSERT_TRUE(TextFormat::ParseFromString( "name: \"foo.proto\" " "message_type { name: \"Foo\" } " "message_type { name: \"Foo\" } ", &file_proto)); std::vector errors; { ScopedMemoryLog log; EXPECT_TRUE(pool_.BuildFile(file_proto) == NULL); errors = log.GetMessages(ERROR); } ASSERT_EQ(2, errors.size()); EXPECT_EQ("Invalid proto descriptor for file \"foo.proto\":", errors[0]); EXPECT_EQ(" Foo: \"Foo\" is already defined.", errors[1]); } TEST_F(ValidationErrorTest, DisallowEnumAlias) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type {" " name: \"Bar\"" " value { name:\"ENUM_A\" number:0 }" " value { name:\"ENUM_B\" number:0 }" "}", "foo.proto: Bar: NUMBER: " "\"ENUM_B\" uses the same enum value as \"ENUM_A\". " "If this is intended, set 'option allow_alias = true;' to the enum " "definition.\n"); } TEST_F(ValidationErrorTest, AllowEnumAlias) { BuildFile( "name: \"foo.proto\" " "enum_type {" " name: \"Bar\"" " value { name:\"ENUM_A\" number:0 }" " value { name:\"ENUM_B\" number:0 }" " options { allow_alias: true }" "}"); } TEST_F(ValidationErrorTest, UnusedImportWarning) { pool_.AddUnusedImportTrackFile("bar.proto"); BuildFile( "name: \"bar.proto\" " "message_type { name: \"Bar\" }"); pool_.AddUnusedImportTrackFile("base.proto"); BuildFile( "name: \"base.proto\" " "message_type { name: \"Base\" }"); pool_.AddUnusedImportTrackFile("baz.proto"); BuildFile( "name: \"baz.proto\" " "message_type { name: \"Baz\" }"); pool_.AddUnusedImportTrackFile("public.proto"); BuildFile( "name: \"public.proto\" " "dependency: \"bar.proto\"" "public_dependency: 0"); // // forward.proto // import "base.proto" // No warning: Base message is used. // import "bar.proto" // Will log a warning. // import public "baz.proto" // No warning: Do not track import public. // import "public.proto" // No warning: public.proto has import public. // message Forward { // optional Base base = 1; // } // pool_.AddUnusedImportTrackFile("forward.proto"); BuildFileWithWarnings( "name: \"forward.proto\"" "dependency: \"base.proto\"" "dependency: \"bar.proto\"" "dependency: \"baz.proto\"" "dependency: \"public.proto\"" "public_dependency: 2 " "message_type {" " name: \"Forward\"" " field { name:\"base\" number:1 label:LABEL_OPTIONAL type_name:\"Base\" }" "}", "forward.proto: bar.proto: OTHER: Import bar.proto but not used.\n"); } namespace { void FillValidMapEntry(FileDescriptorProto* file_proto) { ASSERT_TRUE(TextFormat::ParseFromString( "name: 'foo.proto' " "message_type { " " name: 'Foo' " " field { " " name: 'foo_map' number: 1 label:LABEL_REPEATED " " type_name: 'FooMapEntry' " " } " " nested_type { " " name: 'FooMapEntry' " " options { map_entry: true } " " field { " " name: 'key' number: 1 type:TYPE_INT32 label:LABEL_OPTIONAL " " } " " field { " " name: 'value' number: 2 type:TYPE_INT32 label:LABEL_OPTIONAL " " } " " } " "} " "message_type { " " name: 'Bar' " " extension_range { start: 1 end: 10 }" "} ", file_proto)); } static const char* kMapEntryErrorMessage = "foo.proto: Foo.foo_map: OTHER: map_entry should not be set explicitly. " "Use map instead.\n"; static const char* kMapEntryKeyTypeErrorMessage = "foo.proto: Foo.foo_map: TYPE: Key in map fields cannot be float/double, " "bytes or message types.\n"; } // namespace TEST_F(ValidationErrorTest, MapEntryBase) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); BuildFile(file_proto.DebugString()); } TEST_F(ValidationErrorTest, MapEntryExtensionRange) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); TextFormat::MergeFromString( "extension_range { " " start: 10 end: 20 " "} ", file_proto.mutable_message_type(0)->mutable_nested_type(0)); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryExtension) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); TextFormat::MergeFromString( "extension { " " name: 'foo_ext' extendee: '.Bar' number: 5" "} ", file_proto.mutable_message_type(0)->mutable_nested_type(0)); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryNestedType) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); TextFormat::MergeFromString( "nested_type { " " name: 'Bar' " "} ", file_proto.mutable_message_type(0)->mutable_nested_type(0)); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryEnumTypes) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); TextFormat::MergeFromString( "enum_type { " " name: 'BarEnum' " " value { name: 'BAR_BAR' number:0 } " "} ", file_proto.mutable_message_type(0)->mutable_nested_type(0)); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryExtraField) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); TextFormat::MergeFromString( "field { " " name: 'other_field' " " label: LABEL_OPTIONAL " " type: TYPE_INT32 " " number: 3 " "} ", file_proto.mutable_message_type(0)->mutable_nested_type(0)); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryMessageName) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); file_proto.mutable_message_type(0)->mutable_nested_type(0)->set_name( "OtherMapEntry"); file_proto.mutable_message_type(0)->mutable_field(0)->set_type_name( "OtherMapEntry"); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryNoneRepeatedMapEntry) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); file_proto.mutable_message_type(0)->mutable_field(0)->set_label( FieldDescriptorProto::LABEL_OPTIONAL); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryDifferentContainingType) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); // Move the nested MapEntry message into the top level, which should not pass // the validation. file_proto.mutable_message_type()->AddAllocated( file_proto.mutable_message_type(0)->mutable_nested_type()->ReleaseLast()); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryKeyName) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); FieldDescriptorProto* key = file_proto.mutable_message_type(0) ->mutable_nested_type(0) ->mutable_field(0); key->set_name("Key"); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryKeyLabel) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); FieldDescriptorProto* key = file_proto.mutable_message_type(0) ->mutable_nested_type(0) ->mutable_field(0); key->set_label(FieldDescriptorProto::LABEL_REQUIRED); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryKeyNumber) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); FieldDescriptorProto* key = file_proto.mutable_message_type(0) ->mutable_nested_type(0) ->mutable_field(0); key->set_number(3); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryValueName) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); FieldDescriptorProto* value = file_proto.mutable_message_type(0) ->mutable_nested_type(0) ->mutable_field(1); value->set_name("Value"); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryValueLabel) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); FieldDescriptorProto* value = file_proto.mutable_message_type(0) ->mutable_nested_type(0) ->mutable_field(1); value->set_label(FieldDescriptorProto::LABEL_REQUIRED); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryValueNumber) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); FieldDescriptorProto* value = file_proto.mutable_message_type(0) ->mutable_nested_type(0) ->mutable_field(1); value->set_number(3); BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage); } TEST_F(ValidationErrorTest, MapEntryKeyTypeFloat) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); FieldDescriptorProto* key = file_proto.mutable_message_type(0) ->mutable_nested_type(0) ->mutable_field(0); key->set_type(FieldDescriptorProto::TYPE_FLOAT); BuildFileWithErrors(file_proto.DebugString(), kMapEntryKeyTypeErrorMessage); } TEST_F(ValidationErrorTest, MapEntryKeyTypeDouble) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); FieldDescriptorProto* key = file_proto.mutable_message_type(0) ->mutable_nested_type(0) ->mutable_field(0); key->set_type(FieldDescriptorProto::TYPE_DOUBLE); BuildFileWithErrors(file_proto.DebugString(), kMapEntryKeyTypeErrorMessage); } TEST_F(ValidationErrorTest, MapEntryKeyTypeBytes) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); FieldDescriptorProto* key = file_proto.mutable_message_type(0) ->mutable_nested_type(0) ->mutable_field(0); key->set_type(FieldDescriptorProto::TYPE_BYTES); BuildFileWithErrors(file_proto.DebugString(), kMapEntryKeyTypeErrorMessage); } TEST_F(ValidationErrorTest, MapEntryKeyTypeEnum) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); FieldDescriptorProto* key = file_proto.mutable_message_type(0) ->mutable_nested_type(0) ->mutable_field(0); key->clear_type(); key->set_type_name("BarEnum"); EnumDescriptorProto* enum_proto = file_proto.add_enum_type(); enum_proto->set_name("BarEnum"); EnumValueDescriptorProto* enum_value_proto = enum_proto->add_value(); enum_value_proto->set_name("BAR_VALUE0"); enum_value_proto->set_number(0); BuildFileWithErrors(file_proto.DebugString(), "foo.proto: Foo.foo_map: TYPE: Key in map fields cannot " "be enum types.\n"); // Enum keys are not allowed in proto3 as well. // Get rid of extensions for proto3 to make it proto3 compatible. file_proto.mutable_message_type()->RemoveLast(); file_proto.set_syntax("proto3"); BuildFileWithErrors(file_proto.DebugString(), "foo.proto: Foo.foo_map: TYPE: Key in map fields cannot " "be enum types.\n"); } TEST_F(ValidationErrorTest, MapEntryKeyTypeMessage) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); FieldDescriptorProto* key = file_proto.mutable_message_type(0) ->mutable_nested_type(0) ->mutable_field(0); key->clear_type(); key->set_type_name(".Bar"); BuildFileWithErrors(file_proto.DebugString(), kMapEntryKeyTypeErrorMessage); } TEST_F(ValidationErrorTest, MapEntryConflictsWithField) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); TextFormat::MergeFromString( "field { " " name: 'FooMapEntry' " " type: TYPE_INT32 " " label: LABEL_OPTIONAL " " number: 100 " "}", file_proto.mutable_message_type(0)); BuildFileWithErrors( file_proto.DebugString(), "foo.proto: Foo.FooMapEntry: NAME: \"FooMapEntry\" is already defined in " "\"Foo\".\n" "foo.proto: Foo.foo_map: TYPE: \"FooMapEntry\" is not defined.\n" "foo.proto: Foo: NAME: Expanded map entry type FooMapEntry conflicts " "with an existing field.\n"); } TEST_F(ValidationErrorTest, MapEntryConflictsWithMessage) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); TextFormat::MergeFromString( "nested_type { " " name: 'FooMapEntry' " "}", file_proto.mutable_message_type(0)); BuildFileWithErrors( file_proto.DebugString(), "foo.proto: Foo.FooMapEntry: NAME: \"FooMapEntry\" is already defined in " "\"Foo\".\n" "foo.proto: Foo: NAME: Expanded map entry type FooMapEntry conflicts " "with an existing nested message type.\n"); } TEST_F(ValidationErrorTest, MapEntryConflictsWithEnum) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); TextFormat::MergeFromString( "enum_type { " " name: 'FooMapEntry' " " value { name: 'ENTRY_FOO' number: 0 }" "}", file_proto.mutable_message_type(0)); BuildFileWithErrors( file_proto.DebugString(), "foo.proto: Foo.FooMapEntry: NAME: \"FooMapEntry\" is already defined in " "\"Foo\".\n" "foo.proto: Foo: NAME: Expanded map entry type FooMapEntry conflicts " "with an existing enum type.\n"); } TEST_F(ValidationErrorTest, EnumValuesConflictWhenPrefixesStripped) { BuildFileWithErrors( "syntax: 'proto3'" "name: 'foo.proto' " "enum_type {" " name: 'FooEnum' " " value { name: 'FOO_ENUM_BAZ' number: 0 }" " value { name: 'BAZ' number: 1 }" "}", "foo.proto: BAZ: NAME: When enum name is stripped and label is " "PascalCased (Baz), this value label conflicts with FOO_ENUM_BAZ. This " "will make the proto fail to compile for some languages, such as C#.\n"); BuildFileWithErrors( "syntax: 'proto3'" "name: 'foo.proto' " "enum_type {" " name: 'FooEnum' " " value { name: 'FOOENUM_BAZ' number: 0 }" " value { name: 'BAZ' number: 1 }" "}", "foo.proto: BAZ: NAME: When enum name is stripped and label is " "PascalCased (Baz), this value label conflicts with FOOENUM_BAZ. This " "will make the proto fail to compile for some languages, such as C#.\n"); BuildFileWithErrors( "syntax: 'proto3'" "name: 'foo.proto' " "enum_type {" " name: 'FooEnum' " " value { name: 'FOO_ENUM_BAR_BAZ' number: 0 }" " value { name: 'BAR__BAZ' number: 1 }" "}", "foo.proto: BAR__BAZ: NAME: When enum name is stripped and label is " "PascalCased (BarBaz), this value label conflicts with " "FOO_ENUM_BAR_BAZ. This will make the proto fail to compile for some " "languages, such as C#.\n"); BuildFileWithErrors( "syntax: 'proto3'" "name: 'foo.proto' " "enum_type {" " name: 'FooEnum' " " value { name: 'FOO_ENUM__BAR_BAZ' number: 0 }" " value { name: 'BAR_BAZ' number: 1 }" "}", "foo.proto: BAR_BAZ: NAME: When enum name is stripped and label is " "PascalCased (BarBaz), this value label conflicts with " "FOO_ENUM__BAR_BAZ. This will make the proto fail to compile for some " "languages, such as C#.\n"); // This isn't an error because the underscore will cause the PascalCase to // differ by case (BarBaz vs. Barbaz). BuildFile( "syntax: 'proto3'" "name: 'foo.proto' " "enum_type {" " name: 'FooEnum' " " value { name: 'BAR_BAZ' number: 0 }" " value { name: 'BARBAZ' number: 1 }" "}"); } TEST_F(ValidationErrorTest, MapEntryConflictsWithOneof) { FileDescriptorProto file_proto; FillValidMapEntry(&file_proto); TextFormat::MergeFromString( "oneof_decl { " " name: 'FooMapEntry' " "}" "field { " " name: 'int_field' " " type: TYPE_INT32 " " label: LABEL_OPTIONAL " " oneof_index: 0 " " number: 100 " "} ", file_proto.mutable_message_type(0)); BuildFileWithErrors( file_proto.DebugString(), "foo.proto: Foo.FooMapEntry: NAME: \"FooMapEntry\" is already defined in " "\"Foo\".\n" "foo.proto: Foo.foo_map: TYPE: \"FooMapEntry\" is not defined.\n" "foo.proto: Foo: NAME: Expanded map entry type FooMapEntry conflicts " "with an existing oneof type.\n"); } TEST_F(ValidationErrorTest, MapEntryUsesNoneZeroEnumDefaultValue) { BuildFileWithErrors( "name: \"foo.proto\" " "enum_type {" " name: \"Bar\"" " value { name:\"ENUM_A\" number:1 }" " value { name:\"ENUM_B\" number:2 }" "}" "message_type {" " name: 'Foo' " " field { " " name: 'foo_map' number: 1 label:LABEL_REPEATED " " type_name: 'FooMapEntry' " " } " " nested_type { " " name: 'FooMapEntry' " " options { map_entry: true } " " field { " " name: 'key' number: 1 type:TYPE_INT32 label:LABEL_OPTIONAL " " } " " field { " " name: 'value' number: 2 type_name:\"Bar\" label:LABEL_OPTIONAL " " } " " } " "}", "foo.proto: Foo.foo_map: " "TYPE: Enum value in map must define 0 as the first value.\n"); } TEST_F(ValidationErrorTest, Proto3RequiredFields) { BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "message_type { " " name: 'Foo' " " field { name:'foo' number:1 label:LABEL_REQUIRED type:TYPE_INT32 } " "}", "foo.proto: Foo.foo: OTHER: Required fields are not allowed in " "proto3.\n"); // applied to nested types as well. BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "message_type { " " name: 'Foo' " " nested_type { " " name : 'Bar' " " field { name:'bar' number:1 label:LABEL_REQUIRED type:TYPE_INT32 } " " } " "}", "foo.proto: Foo.Bar.bar: OTHER: Required fields are not allowed in " "proto3.\n"); // optional and repeated fields are OK. BuildFile( "name: 'foo.proto' " "syntax: 'proto3' " "message_type { " " name: 'Foo' " " field { name:'foo' number:1 label:LABEL_OPTIONAL type:TYPE_INT32 } " " field { name:'bar' number:2 label:LABEL_REPEATED type:TYPE_INT32 } " "}"); } TEST_F(ValidationErrorTest, ValidateProto3DefaultValue) { BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "message_type { " " name: 'Foo' " " field { name:'foo' number:1 label:LABEL_OPTIONAL type:TYPE_INT32 " " default_value: '1' }" "}", "foo.proto: Foo.foo: OTHER: Explicit default values are not allowed in " "proto3.\n"); BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "message_type { " " name: 'Foo' " " nested_type { " " name : 'Bar' " " field { name:'bar' number:1 label:LABEL_OPTIONAL type:TYPE_INT32 " " default_value: '1' }" " } " "}", "foo.proto: Foo.Bar.bar: OTHER: Explicit default values are not allowed " "in proto3.\n"); } TEST_F(ValidationErrorTest, ValidateProto3ExtensionRange) { BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "message_type { " " name: 'Foo' " " field { name:'foo' number:1 label:LABEL_OPTIONAL type:TYPE_INT32 } " " extension_range { start:10 end:100 } " "}", "foo.proto: Foo: OTHER: Extension ranges are not allowed in " "proto3.\n"); BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "message_type { " " name: 'Foo' " " nested_type { " " name : 'Bar' " " field { name:'bar' number:1 label:LABEL_OPTIONAL type:TYPE_INT32 } " " extension_range { start:10 end:100 } " " } " "}", "foo.proto: Foo.Bar: OTHER: Extension ranges are not allowed in " "proto3.\n"); } TEST_F(ValidationErrorTest, ValidateProto3MessageSetWireFormat) { BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "message_type { " " name: 'Foo' " " options { message_set_wire_format: true } " "}", "foo.proto: Foo: OTHER: MessageSet is not supported " "in proto3.\n"); } TEST_F(ValidationErrorTest, ValidateProto3Enum) { BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "enum_type { " " name: 'FooEnum' " " value { name: 'FOO_FOO' number:1 } " "}", "foo.proto: FooEnum: OTHER: The first enum value must be " "zero in proto3.\n"); BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "message_type { " " name: 'Foo' " " enum_type { " " name: 'FooEnum' " " value { name: 'FOO_FOO' number:1 } " " } " "}", "foo.proto: Foo.FooEnum: OTHER: The first enum value must be " "zero in proto3.\n"); // valid case. BuildFile( "name: 'foo.proto' " "syntax: 'proto3' " "enum_type { " " name: 'FooEnum' " " value { name: 'FOO_FOO' number:0 } " "}"); } TEST_F(ValidationErrorTest, ValidateProto3Group) { BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "message_type { " " name: 'Foo' " " nested_type { " " name: 'FooGroup' " " } " " field { name:'foo_group' number: 1 label:LABEL_OPTIONAL " " type: TYPE_GROUP type_name:'FooGroup' } " "}", "foo.proto: Foo.foo_group: TYPE: Groups are not supported in proto3 " "syntax.\n"); } TEST_F(ValidationErrorTest, ValidateProto3EnumFromProto2) { // Define an enum in a proto2 file. BuildFile( "name: 'foo.proto' " "package: 'foo' " "syntax: 'proto2' " "enum_type { " " name: 'FooEnum' " " value { name: 'DEFAULT_OPTION' number:0 } " "}"); // Now try to refer to it. (All tests in the fixture use the same pool, so we // can refer to the enum above in this definition.) BuildFileWithErrors( "name: 'bar.proto' " "dependency: 'foo.proto' " "syntax: 'proto3' " "message_type { " " name: 'Foo' " " field { name:'bar' number:1 label:LABEL_OPTIONAL type:TYPE_ENUM " " type_name: 'foo.FooEnum' }" "}", "bar.proto: Foo.bar: TYPE: Enum type \"foo.FooEnum\" is not a proto3 " "enum, but is used in \"Foo\" which is a proto3 message type.\n"); } TEST_F(ValidationErrorTest, ValidateProto3Extension) { // Valid for options. DescriptorPool pool; FileDescriptorProto file_proto; // Add "google/protobuf/descriptor.proto". FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); // Add "foo.proto": // import "google/protobuf/descriptor.proto"; // extend google.protobuf.FieldOptions { // optional int32 option1 = 1000; // } file_proto.Clear(); file_proto.set_name("foo.proto"); file_proto.set_syntax("proto3"); file_proto.add_dependency("google/protobuf/descriptor.proto"); AddExtension(&file_proto, "google.protobuf.FieldOptions", "option1", 1000, FieldDescriptorProto::LABEL_OPTIONAL, FieldDescriptorProto::TYPE_INT32); ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); // Copy and change the package of the descriptor.proto BuildFile( "name: 'google.protobuf.proto' " "syntax: 'proto2' " "message_type { " " name: 'Container' extension_range { start: 1 end: 1000 } " "}"); BuildFileWithErrors( "name: 'bar.proto' " "syntax: 'proto3' " "dependency: 'google.protobuf.proto' " "extension { " " name: 'bar' number: 1 label: LABEL_OPTIONAL type: TYPE_INT32 " " extendee: 'Container' " "}", "bar.proto: bar: OTHER: Extensions in proto3 are only allowed for " "defining options.\n"); } // Test that field names that may conflict in JSON is not allowed by protoc. TEST_F(ValidationErrorTest, ValidateProto3JsonName) { // The comparison is case-insensitive. BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "message_type {" " name: 'Foo'" " field { name:'name' number:1 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field { name:'Name' number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }" "}", "foo.proto: Foo: OTHER: The JSON camel-case name of field \"Name\" " "conflicts with field \"name\". This is not allowed in proto3.\n"); // Underscores are ignored. BuildFileWithErrors( "name: 'foo.proto' " "syntax: 'proto3' " "message_type {" " name: 'Foo'" " field { name:'ab' number:1 label:LABEL_OPTIONAL type:TYPE_INT32 }" " field { name:'_a__b_' number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }" "}", "foo.proto: Foo: OTHER: The JSON camel-case name of field \"_a__b_\" " "conflicts with field \"ab\". This is not allowed in proto3.\n"); } // =================================================================== // DescriptorDatabase static void AddToDatabase(SimpleDescriptorDatabase* database, const char* file_text) { FileDescriptorProto file_proto; EXPECT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); database->Add(file_proto); } class DatabaseBackedPoolTest : public testing::Test { protected: DatabaseBackedPoolTest() {} SimpleDescriptorDatabase database_; virtual void SetUp() { AddToDatabase(&database_, "name: 'foo.proto' " "message_type { name:'Foo' extension_range { start: 1 end: 100 } } " "enum_type { name:'TestEnum' value { name:'DUMMY' number:0 } } " "service { name:'TestService' } "); AddToDatabase(&database_, "name: 'bar.proto' " "dependency: 'foo.proto' " "message_type { name:'Bar' } " "extension { name:'foo_ext' extendee: '.Foo' number:5 " " label:LABEL_OPTIONAL type:TYPE_INT32 } "); // Baz has an undeclared dependency on Foo. AddToDatabase(&database_, "name: 'baz.proto' " "message_type { " " name:'Baz' " " field { name:'foo' number:1 label:LABEL_OPTIONAL type_name:'Foo' } " "}"); } // We can't inject a file containing errors into a DescriptorPool, so we // need an actual mock DescriptorDatabase to test errors. class ErrorDescriptorDatabase : public DescriptorDatabase { public: ErrorDescriptorDatabase() {} ~ErrorDescriptorDatabase() {} // implements DescriptorDatabase --------------------------------- bool FindFileByName(const string& filename, FileDescriptorProto* output) { // error.proto and error2.proto cyclically import each other. if (filename == "error.proto") { output->Clear(); output->set_name("error.proto"); output->add_dependency("error2.proto"); return true; } else if (filename == "error2.proto") { output->Clear(); output->set_name("error2.proto"); output->add_dependency("error.proto"); return true; } else { return false; } } bool FindFileContainingSymbol(const string& symbol_name, FileDescriptorProto* output) { return false; } bool FindFileContainingExtension(const string& containing_type, int field_number, FileDescriptorProto* output) { return false; } }; // A DescriptorDatabase that counts how many times each method has been // called and forwards to some other DescriptorDatabase. class CallCountingDatabase : public DescriptorDatabase { public: CallCountingDatabase(DescriptorDatabase* wrapped_db) : wrapped_db_(wrapped_db) { Clear(); } ~CallCountingDatabase() {} DescriptorDatabase* wrapped_db_; int call_count_; void Clear() { call_count_ = 0; } // implements DescriptorDatabase --------------------------------- bool FindFileByName(const string& filename, FileDescriptorProto* output) { ++call_count_; return wrapped_db_->FindFileByName(filename, output); } bool FindFileContainingSymbol(const string& symbol_name, FileDescriptorProto* output) { ++call_count_; return wrapped_db_->FindFileContainingSymbol(symbol_name, output); } bool FindFileContainingExtension(const string& containing_type, int field_number, FileDescriptorProto* output) { ++call_count_; return wrapped_db_->FindFileContainingExtension( containing_type, field_number, output); } }; // A DescriptorDatabase which falsely always returns foo.proto when searching // for any symbol or extension number. This shouldn't cause the // DescriptorPool to reload foo.proto if it is already loaded. class FalsePositiveDatabase : public DescriptorDatabase { public: FalsePositiveDatabase(DescriptorDatabase* wrapped_db) : wrapped_db_(wrapped_db) {} ~FalsePositiveDatabase() {} DescriptorDatabase* wrapped_db_; // implements DescriptorDatabase --------------------------------- bool FindFileByName(const string& filename, FileDescriptorProto* output) { return wrapped_db_->FindFileByName(filename, output); } bool FindFileContainingSymbol(const string& symbol_name, FileDescriptorProto* output) { return FindFileByName("foo.proto", output); } bool FindFileContainingExtension(const string& containing_type, int field_number, FileDescriptorProto* output) { return FindFileByName("foo.proto", output); } }; }; TEST_F(DatabaseBackedPoolTest, FindFileByName) { DescriptorPool pool(&database_); const FileDescriptor* foo = pool.FindFileByName("foo.proto"); ASSERT_TRUE(foo != NULL); EXPECT_EQ("foo.proto", foo->name()); ASSERT_EQ(1, foo->message_type_count()); EXPECT_EQ("Foo", foo->message_type(0)->name()); EXPECT_EQ(foo, pool.FindFileByName("foo.proto")); EXPECT_TRUE(pool.FindFileByName("no_such_file.proto") == NULL); } TEST_F(DatabaseBackedPoolTest, FindDependencyBeforeDependent) { DescriptorPool pool(&database_); const FileDescriptor* foo = pool.FindFileByName("foo.proto"); ASSERT_TRUE(foo != NULL); EXPECT_EQ("foo.proto", foo->name()); ASSERT_EQ(1, foo->message_type_count()); EXPECT_EQ("Foo", foo->message_type(0)->name()); const FileDescriptor* bar = pool.FindFileByName("bar.proto"); ASSERT_TRUE(bar != NULL); EXPECT_EQ("bar.proto", bar->name()); ASSERT_EQ(1, bar->message_type_count()); EXPECT_EQ("Bar", bar->message_type(0)->name()); ASSERT_EQ(1, bar->dependency_count()); EXPECT_EQ(foo, bar->dependency(0)); } TEST_F(DatabaseBackedPoolTest, FindDependentBeforeDependency) { DescriptorPool pool(&database_); const FileDescriptor* bar = pool.FindFileByName("bar.proto"); ASSERT_TRUE(bar != NULL); EXPECT_EQ("bar.proto", bar->name()); ASSERT_EQ(1, bar->message_type_count()); ASSERT_EQ("Bar", bar->message_type(0)->name()); const FileDescriptor* foo = pool.FindFileByName("foo.proto"); ASSERT_TRUE(foo != NULL); EXPECT_EQ("foo.proto", foo->name()); ASSERT_EQ(1, foo->message_type_count()); ASSERT_EQ("Foo", foo->message_type(0)->name()); ASSERT_EQ(1, bar->dependency_count()); EXPECT_EQ(foo, bar->dependency(0)); } TEST_F(DatabaseBackedPoolTest, FindFileContainingSymbol) { DescriptorPool pool(&database_); const FileDescriptor* file = pool.FindFileContainingSymbol("Foo"); ASSERT_TRUE(file != NULL); EXPECT_EQ("foo.proto", file->name()); EXPECT_EQ(file, pool.FindFileByName("foo.proto")); EXPECT_TRUE(pool.FindFileContainingSymbol("NoSuchSymbol") == NULL); } TEST_F(DatabaseBackedPoolTest, FindMessageTypeByName) { DescriptorPool pool(&database_); const Descriptor* type = pool.FindMessageTypeByName("Foo"); ASSERT_TRUE(type != NULL); EXPECT_EQ("Foo", type->name()); EXPECT_EQ(type->file(), pool.FindFileByName("foo.proto")); EXPECT_TRUE(pool.FindMessageTypeByName("NoSuchType") == NULL); } TEST_F(DatabaseBackedPoolTest, FindExtensionByNumber) { DescriptorPool pool(&database_); const Descriptor* foo = pool.FindMessageTypeByName("Foo"); ASSERT_TRUE(foo != NULL); const FieldDescriptor* extension = pool.FindExtensionByNumber(foo, 5); ASSERT_TRUE(extension != NULL); EXPECT_EQ("foo_ext", extension->name()); EXPECT_EQ(extension->file(), pool.FindFileByName("bar.proto")); EXPECT_TRUE(pool.FindExtensionByNumber(foo, 12) == NULL); } TEST_F(DatabaseBackedPoolTest, FindAllExtensions) { DescriptorPool pool(&database_); const Descriptor* foo = pool.FindMessageTypeByName("Foo"); for (int i = 0; i < 2; ++i) { // Repeat the lookup twice, to check that we get consistent // results despite the fallback database lookup mutating the pool. std::vector extensions; pool.FindAllExtensions(foo, &extensions); ASSERT_EQ(1, extensions.size()); EXPECT_EQ(5, extensions[0]->number()); } } TEST_F(DatabaseBackedPoolTest, ErrorWithoutErrorCollector) { ErrorDescriptorDatabase error_database; DescriptorPool pool(&error_database); std::vector errors; { ScopedMemoryLog log; EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); errors = log.GetMessages(ERROR); } EXPECT_FALSE(errors.empty()); } TEST_F(DatabaseBackedPoolTest, ErrorWithErrorCollector) { ErrorDescriptorDatabase error_database; MockErrorCollector error_collector; DescriptorPool pool(&error_database, &error_collector); EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); EXPECT_EQ( "error.proto: error.proto: OTHER: File recursively imports itself: " "error.proto -> error2.proto -> error.proto\n" "error2.proto: error2.proto: OTHER: Import \"error.proto\" was not " "found or had errors.\n" "error.proto: error.proto: OTHER: Import \"error2.proto\" was not " "found or had errors.\n", error_collector.text_); } TEST_F(DatabaseBackedPoolTest, UndeclaredDependencyOnUnbuiltType) { // Check that we find and report undeclared dependencies on types that exist // in the descriptor database but that have not not been built yet. MockErrorCollector error_collector; DescriptorPool pool(&database_, &error_collector); EXPECT_TRUE(pool.FindMessageTypeByName("Baz") == NULL); EXPECT_EQ( "baz.proto: Baz.foo: TYPE: \"Foo\" seems to be defined in \"foo.proto\", " "which is not imported by \"baz.proto\". To use it here, please add " "the necessary import.\n", error_collector.text_); } TEST_F(DatabaseBackedPoolTest, RollbackAfterError) { // Make sure that all traces of bad types are removed from the pool. This used // to be b/4529436, due to the fact that a symbol resolution failure could // potentially cause another file to be recursively built, which would trigger // a checkpoint _past_ possibly invalid symbols. // Baz is defined in the database, but the file is invalid because it is // missing a necessary import. DescriptorPool pool(&database_); EXPECT_TRUE(pool.FindMessageTypeByName("Baz") == NULL); // Make sure that searching again for the file or the type fails. EXPECT_TRUE(pool.FindFileByName("baz.proto") == NULL); EXPECT_TRUE(pool.FindMessageTypeByName("Baz") == NULL); } TEST_F(DatabaseBackedPoolTest, UnittestProto) { // Try to load all of unittest.proto from a DescriptorDatabase. This should // thoroughly test all paths through DescriptorBuilder to insure that there // are no deadlocking problems when pool_->mutex_ is non-NULL. const FileDescriptor* original_file = protobuf_unittest::TestAllTypes::descriptor()->file(); DescriptorPoolDatabase database(*DescriptorPool::generated_pool()); DescriptorPool pool(&database); const FileDescriptor* file_from_database = pool.FindFileByName(original_file->name()); ASSERT_TRUE(file_from_database != NULL); FileDescriptorProto original_file_proto; original_file->CopyTo(&original_file_proto); FileDescriptorProto file_from_database_proto; file_from_database->CopyTo(&file_from_database_proto); EXPECT_EQ(original_file_proto.DebugString(), file_from_database_proto.DebugString()); // Also verify that CopyTo() did not omit any information. EXPECT_EQ(original_file->DebugString(), file_from_database->DebugString()); } TEST_F(DatabaseBackedPoolTest, DoesntRetryDbUnnecessarily) { // Searching for a child of an existing descriptor should never fall back // to the DescriptorDatabase even if it isn't found, because we know all // children are already loaded. CallCountingDatabase call_counter(&database_); DescriptorPool pool(&call_counter); const FileDescriptor* file = pool.FindFileByName("foo.proto"); ASSERT_TRUE(file != NULL); const Descriptor* foo = pool.FindMessageTypeByName("Foo"); ASSERT_TRUE(foo != NULL); const EnumDescriptor* test_enum = pool.FindEnumTypeByName("TestEnum"); ASSERT_TRUE(test_enum != NULL); const ServiceDescriptor* test_service = pool.FindServiceByName("TestService"); ASSERT_TRUE(test_service != NULL); EXPECT_NE(0, call_counter.call_count_); call_counter.Clear(); EXPECT_TRUE(foo->FindFieldByName("no_such_field") == NULL); EXPECT_TRUE(foo->FindExtensionByName("no_such_extension") == NULL); EXPECT_TRUE(foo->FindNestedTypeByName("NoSuchMessageType") == NULL); EXPECT_TRUE(foo->FindEnumTypeByName("NoSuchEnumType") == NULL); EXPECT_TRUE(foo->FindEnumValueByName("NO_SUCH_VALUE") == NULL); EXPECT_TRUE(test_enum->FindValueByName("NO_SUCH_VALUE") == NULL); EXPECT_TRUE(test_service->FindMethodByName("NoSuchMethod") == NULL); EXPECT_TRUE(file->FindMessageTypeByName("NoSuchMessageType") == NULL); EXPECT_TRUE(file->FindEnumTypeByName("NoSuchEnumType") == NULL); EXPECT_TRUE(file->FindEnumValueByName("NO_SUCH_VALUE") == NULL); EXPECT_TRUE(file->FindServiceByName("NO_SUCH_VALUE") == NULL); EXPECT_TRUE(file->FindExtensionByName("no_such_extension") == NULL); EXPECT_TRUE(pool.FindFileContainingSymbol("Foo.no.such.field") == NULL); EXPECT_TRUE(pool.FindFileContainingSymbol("Foo.no_such_field") == NULL); EXPECT_TRUE(pool.FindMessageTypeByName("Foo.NoSuchMessageType") == NULL); EXPECT_TRUE(pool.FindFieldByName("Foo.no_such_field") == NULL); EXPECT_TRUE(pool.FindExtensionByName("Foo.no_such_extension") == NULL); EXPECT_TRUE(pool.FindEnumTypeByName("Foo.NoSuchEnumType") == NULL); EXPECT_TRUE(pool.FindEnumValueByName("Foo.NO_SUCH_VALUE") == NULL); EXPECT_TRUE(pool.FindMethodByName("TestService.NoSuchMethod") == NULL); EXPECT_EQ(0, call_counter.call_count_); } TEST_F(DatabaseBackedPoolTest, DoesntReloadFilesUncesessarily) { // If FindFileContainingSymbol() or FindFileContainingExtension() return a // file that is already in the DescriptorPool, it should not attempt to // reload the file. FalsePositiveDatabase false_positive_database(&database_); MockErrorCollector error_collector; DescriptorPool pool(&false_positive_database, &error_collector); // First make sure foo.proto is loaded. const Descriptor* foo = pool.FindMessageTypeByName("Foo"); ASSERT_TRUE(foo != NULL); // Try inducing false positives. EXPECT_TRUE(pool.FindMessageTypeByName("NoSuchSymbol") == NULL); EXPECT_TRUE(pool.FindExtensionByNumber(foo, 22) == NULL); // No errors should have been reported. (If foo.proto was incorrectly // loaded multiple times, errors would have been reported.) EXPECT_EQ("", error_collector.text_); } // DescriptorDatabase that attempts to induce exponentially-bad performance // in DescriptorPool. For every positive N, the database contains a file // fileN.proto, which defines a message MessageN, which contains fields of // type MessageK for all K in [0,N). Message0 is not defined anywhere // (file0.proto exists, but is empty), so every other file and message type // will fail to build. // // If the DescriptorPool is not careful to memoize errors, an attempt to // build a descriptor for MessageN can require O(2^N) time. class ExponentialErrorDatabase : public DescriptorDatabase { public: ExponentialErrorDatabase() {} ~ExponentialErrorDatabase() {} // implements DescriptorDatabase --------------------------------- bool FindFileByName(const string& filename, FileDescriptorProto* output) { int file_num = -1; FullMatch(filename, "file", ".proto", &file_num); if (file_num > -1) { return PopulateFile(file_num, output); } else { return false; } } bool FindFileContainingSymbol(const string& symbol_name, FileDescriptorProto* output) { int file_num = -1; FullMatch(symbol_name, "Message", "", &file_num); if (file_num > 0) { return PopulateFile(file_num, output); } else { return false; } } bool FindFileContainingExtension(const string& containing_type, int field_number, FileDescriptorProto* output) { return false; } private: void FullMatch(const string& name, const string& begin_with, const string& end_with, int* file_num) { int begin_size = begin_with.size(); int end_size = end_with.size(); if (name.substr(0, begin_size) != begin_with || name.substr(name.size()- end_size, end_size) != end_with) { return; } safe_strto32(name.substr(begin_size, name.size() - end_size - begin_size), file_num); } bool PopulateFile(int file_num, FileDescriptorProto* output) { using strings::Substitute; GOOGLE_CHECK_GE(file_num, 0); output->Clear(); output->set_name(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(Substitute("Message$0", file_num)); for (int i = 0; i < file_num; ++i) { output->add_dependency(Substitute("file$0.proto", i)); FieldDescriptorProto* field = message->add_field(); field->set_name(Substitute("field$0", i)); field->set_number(i); field->set_label(FieldDescriptorProto::LABEL_OPTIONAL); field->set_type(FieldDescriptorProto::TYPE_MESSAGE); field->set_type_name(Substitute("Message$0", i)); } } return true; } }; TEST_F(DatabaseBackedPoolTest, DoesntReloadKnownBadFiles) { ExponentialErrorDatabase error_database; DescriptorPool pool(&error_database); GOOGLE_LOG(INFO) << "A timeout in this test probably indicates a real bug."; EXPECT_TRUE(pool.FindFileByName("file40.proto") == NULL); EXPECT_TRUE(pool.FindMessageTypeByName("Message40") == NULL); } TEST_F(DatabaseBackedPoolTest, DoesntFallbackOnWrongType) { // If a lookup finds a symbol of the wrong type (e.g. we pass a type name // to FindFieldByName()), we should fail fast, without checking the fallback // database. CallCountingDatabase call_counter(&database_); DescriptorPool pool(&call_counter); const FileDescriptor* file = pool.FindFileByName("foo.proto"); ASSERT_TRUE(file != NULL); const Descriptor* foo = pool.FindMessageTypeByName("Foo"); ASSERT_TRUE(foo != NULL); const EnumDescriptor* test_enum = pool.FindEnumTypeByName("TestEnum"); ASSERT_TRUE(test_enum != NULL); EXPECT_NE(0, call_counter.call_count_); call_counter.Clear(); EXPECT_TRUE(pool.FindMessageTypeByName("TestEnum") == NULL); EXPECT_TRUE(pool.FindFieldByName("Foo") == NULL); EXPECT_TRUE(pool.FindExtensionByName("Foo") == NULL); EXPECT_TRUE(pool.FindEnumTypeByName("Foo") == NULL); EXPECT_TRUE(pool.FindEnumValueByName("Foo") == NULL); EXPECT_TRUE(pool.FindServiceByName("Foo") == NULL); EXPECT_TRUE(pool.FindMethodByName("Foo") == NULL); EXPECT_EQ(0, call_counter.call_count_); } // =================================================================== class AbortingErrorCollector : public DescriptorPool::ErrorCollector { public: AbortingErrorCollector() {} virtual void AddError( const string &filename, const string &element_name, const Message *message, ErrorLocation location, const string &error_message) { GOOGLE_LOG(FATAL) << "AddError() called unexpectedly: " << filename << " [" << element_name << "]: " << error_message; } private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AbortingErrorCollector); }; // A source tree containing only one file. class SingletonSourceTree : public compiler::SourceTree { public: SingletonSourceTree(const string& filename, const string& contents) : filename_(filename), contents_(contents) {} virtual io::ZeroCopyInputStream* Open(const string& filename) { return filename == filename_ ? new io::ArrayInputStream(contents_.data(), contents_.size()) : NULL; } private: const string filename_; const string contents_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SingletonSourceTree); }; const char *const kSourceLocationTestInput = "syntax = \"proto2\";\n" "message A {\n" " optional int32 a = 1;\n" " message B {\n" " required double b = 1;\n" " }\n" "}\n" "enum Indecision {\n" " YES = 1;\n" " NO = 2;\n" " MAYBE = 3;\n" "}\n" "service S {\n" " rpc Method(A) returns (A.B);\n" // Put an empty line here to make the source location range match. "\n" "}\n" "message MessageWithExtensions {\n" " extensions 1000 to max;\n" "}\n" "extend MessageWithExtensions {\n" " optional int32 int32_extension = 1001;\n" "}\n" "message C {\n" " extend MessageWithExtensions {\n" " optional C message_extension = 1002;\n" " }\n" "}\n"; class SourceLocationTest : public testing::Test { public: SourceLocationTest() : source_tree_("/test/test.proto", kSourceLocationTestInput), db_(&source_tree_), pool_(&db_, &collector_) {} static string PrintSourceLocation(const SourceLocation &loc) { return strings::Substitute("$0:$1-$2:$3", 1 + loc.start_line, 1 + loc.start_column, 1 + loc.end_line, 1 + loc.end_column); } private: AbortingErrorCollector collector_; SingletonSourceTree source_tree_; compiler::SourceTreeDescriptorDatabase db_; protected: DescriptorPool pool_; }; // TODO(adonovan): implement support for option fields and for // subparts of declarations. TEST_F(SourceLocationTest, GetSourceLocation) { SourceLocation loc; const FileDescriptor *file_desc = GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); const Descriptor *a_desc = file_desc->FindMessageTypeByName("A"); EXPECT_TRUE(a_desc->GetSourceLocation(&loc)); EXPECT_EQ("2:1-7:2", PrintSourceLocation(loc)); const Descriptor *a_b_desc = a_desc->FindNestedTypeByName("B"); EXPECT_TRUE(a_b_desc->GetSourceLocation(&loc)); EXPECT_EQ("4:3-6:4", PrintSourceLocation(loc)); const EnumDescriptor *e_desc = file_desc->FindEnumTypeByName("Indecision"); EXPECT_TRUE(e_desc->GetSourceLocation(&loc)); EXPECT_EQ("8:1-12:2", PrintSourceLocation(loc)); const EnumValueDescriptor *yes_desc = e_desc->FindValueByName("YES"); EXPECT_TRUE(yes_desc->GetSourceLocation(&loc)); EXPECT_EQ("9:3-9:13", PrintSourceLocation(loc)); const ServiceDescriptor *s_desc = file_desc->FindServiceByName("S"); EXPECT_TRUE(s_desc->GetSourceLocation(&loc)); EXPECT_EQ("13:1-16:2", PrintSourceLocation(loc)); const MethodDescriptor *m_desc = s_desc->FindMethodByName("Method"); EXPECT_TRUE(m_desc->GetSourceLocation(&loc)); EXPECT_EQ("14:3-14:31", PrintSourceLocation(loc)); } TEST_F(SourceLocationTest, ExtensionSourceLocation) { SourceLocation loc; const FileDescriptor *file_desc = GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); const FieldDescriptor *int32_extension_desc = file_desc->FindExtensionByName("int32_extension"); EXPECT_TRUE(int32_extension_desc->GetSourceLocation(&loc)); EXPECT_EQ("21:3-21:41", PrintSourceLocation(loc)); const Descriptor *c_desc = file_desc->FindMessageTypeByName("C"); EXPECT_TRUE(c_desc->GetSourceLocation(&loc)); EXPECT_EQ("23:1-27:2", PrintSourceLocation(loc)); const FieldDescriptor *message_extension_desc = c_desc->FindExtensionByName("message_extension"); EXPECT_TRUE(message_extension_desc->GetSourceLocation(&loc)); EXPECT_EQ("25:5-25:41", PrintSourceLocation(loc)); } // Missing SourceCodeInfo doesn't cause crash: TEST_F(SourceLocationTest, GetSourceLocation_MissingSourceCodeInfo) { SourceLocation loc; const FileDescriptor *file_desc = GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); FileDescriptorProto proto; file_desc->CopyTo(&proto); // Note, this discards the SourceCodeInfo. EXPECT_FALSE(proto.has_source_code_info()); DescriptorPool bad1_pool(&pool_); const FileDescriptor* bad1_file_desc = GOOGLE_CHECK_NOTNULL(bad1_pool.BuildFile(proto)); const Descriptor *bad1_a_desc = bad1_file_desc->FindMessageTypeByName("A"); EXPECT_FALSE(bad1_a_desc->GetSourceLocation(&loc)); } // Corrupt SourceCodeInfo doesn't cause crash: TEST_F(SourceLocationTest, GetSourceLocation_BogusSourceCodeInfo) { SourceLocation loc; const FileDescriptor *file_desc = GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); FileDescriptorProto proto; file_desc->CopyTo(&proto); // Note, this discards the SourceCodeInfo. EXPECT_FALSE(proto.has_source_code_info()); SourceCodeInfo_Location *loc_msg = proto.mutable_source_code_info()->add_location(); loc_msg->add_path(1); loc_msg->add_path(2); loc_msg->add_path(3); loc_msg->add_span(4); loc_msg->add_span(5); loc_msg->add_span(6); DescriptorPool bad2_pool(&pool_); const FileDescriptor* bad2_file_desc = GOOGLE_CHECK_NOTNULL(bad2_pool.BuildFile(proto)); const Descriptor *bad2_a_desc = bad2_file_desc->FindMessageTypeByName("A"); EXPECT_FALSE(bad2_a_desc->GetSourceLocation(&loc)); } // =================================================================== const char* const kCopySourceCodeInfoToTestInput = "syntax = \"proto2\";\n" "message Foo {}\n"; // Required since source code information is not preserved by // FileDescriptorTest. class CopySourceCodeInfoToTest : public testing::Test { public: CopySourceCodeInfoToTest() : source_tree_("/test/test.proto", kCopySourceCodeInfoToTestInput), db_(&source_tree_), pool_(&db_, &collector_) {} private: AbortingErrorCollector collector_; SingletonSourceTree source_tree_; compiler::SourceTreeDescriptorDatabase db_; protected: DescriptorPool pool_; }; TEST_F(CopySourceCodeInfoToTest, CopyTo_DoesNotCopySourceCodeInfo) { const FileDescriptor* file_desc = GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); FileDescriptorProto file_desc_proto; ASSERT_FALSE(file_desc_proto.has_source_code_info()); file_desc->CopyTo(&file_desc_proto); EXPECT_FALSE(file_desc_proto.has_source_code_info()); } TEST_F(CopySourceCodeInfoToTest, CopySourceCodeInfoTo) { const FileDescriptor* file_desc = GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto")); FileDescriptorProto file_desc_proto; ASSERT_FALSE(file_desc_proto.has_source_code_info()); file_desc->CopySourceCodeInfoTo(&file_desc_proto); const SourceCodeInfo& info = file_desc_proto.source_code_info(); ASSERT_EQ(4, info.location_size()); // Get the Foo message location const SourceCodeInfo_Location& foo_location = info.location(2); ASSERT_EQ(2, foo_location.path_size()); EXPECT_EQ(FileDescriptorProto::kMessageTypeFieldNumber, foo_location.path(0)); EXPECT_EQ(0, foo_location.path(1)); // Foo is the first message defined ASSERT_EQ(3, foo_location.span_size()); // Foo spans one line EXPECT_EQ(1, foo_location.span(0)); // Foo is declared on line 1 EXPECT_EQ(0, foo_location.span(1)); // Foo starts at column 0 EXPECT_EQ(14, foo_location.span(2)); // Foo ends on column 14 } // =================================================================== class LazilyBuildDependenciesTest : public testing::Test { public: LazilyBuildDependenciesTest() : pool_(&db_, NULL) { pool_.InternalSetLazilyBuildDependencies(); } void ParseProtoAndAddToDb(const char* proto) { FileDescriptorProto tmp; ASSERT_TRUE(TextFormat::ParseFromString(proto, &tmp)); db_.Add(tmp); } void ParseProtoAndAddToDb(const string& proto) { FileDescriptorProto tmp; ASSERT_TRUE(TextFormat::ParseFromString(proto, &tmp)); db_.Add(tmp); } void AddSimpleMessageProtoFileToDb(const char* file_name, const char* message_name) { ParseProtoAndAddToDb("name: '" + string(file_name) + ".proto' " "package: \"protobuf_unittest\" " "message_type { " " name:'" + string(message_name) + "' " " field { name:'a' number:1 " " label:LABEL_OPTIONAL " " type_name:'int32' } " "}"); } void AddSimpleEnumProtoFileToDb(const char* file_name, const char* enum_name, const char* enum_value_name) { ParseProtoAndAddToDb("name: '" + string(file_name) + ".proto' " "package: 'protobuf_unittest' " "enum_type { " " name:'" + string(enum_name) + "' " " value { name:'" + string(enum_value_name) + "' number:1 } " "}"); } protected: SimpleDescriptorDatabase db_; DescriptorPool pool_; }; TEST_F(LazilyBuildDependenciesTest, Message) { ParseProtoAndAddToDb( "name: 'foo.proto' " "package: 'protobuf_unittest' " "dependency: 'bar.proto' " "message_type { " " name:'Foo' " " field { name:'bar' number:1 label:LABEL_OPTIONAL " "type_name:'.protobuf_unittest.Bar' } " "}"); AddSimpleMessageProtoFileToDb("bar", "Bar"); // Verify neither has been built yet. EXPECT_FALSE(pool_.InternalIsFileLoaded("foo.proto")); EXPECT_FALSE(pool_.InternalIsFileLoaded("bar.proto")); const FileDescriptor* file = pool_.FindFileByName("foo.proto"); // Verify only foo gets built when asking for foo.proto EXPECT_TRUE(file != NULL); EXPECT_TRUE(pool_.InternalIsFileLoaded("foo.proto")); EXPECT_FALSE(pool_.InternalIsFileLoaded("bar.proto")); // Verify calling FindFieldBy* works when the type of the field was // not built at cross link time. Verify this doesn't build the file // the field's type is defined in, as well. const Descriptor* desc = file->FindMessageTypeByName("Foo"); const FieldDescriptor* field = desc->FindFieldByName("bar"); EXPECT_TRUE(field != NULL); EXPECT_EQ(field, desc->FindFieldByNumber(1)); EXPECT_EQ(field, desc->FindFieldByLowercaseName("bar")); EXPECT_EQ(field, desc->FindFieldByCamelcaseName("bar")); EXPECT_FALSE(pool_.InternalIsFileLoaded("bar.proto")); // Finally, verify that if we call message_type() on the field, we will // buid the file where the message is defined, and get a valid descriptor EXPECT_TRUE(field->message_type() != NULL); EXPECT_TRUE(pool_.InternalIsFileLoaded("bar.proto")); } TEST_F(LazilyBuildDependenciesTest, Enum) { ParseProtoAndAddToDb( "name: 'foo.proto' " "package: 'protobuf_unittest' " "dependency: 'enum1.proto' " "dependency: 'enum2.proto' " "message_type { " " name:'Lazy' " " field { name:'enum1' number:1 label:LABEL_OPTIONAL " "type_name:'.protobuf_unittest.Enum1' } " " field { name:'enum2' number:1 label:LABEL_OPTIONAL " "type_name:'.protobuf_unittest.Enum2' } " "}"); AddSimpleEnumProtoFileToDb("enum1", "Enum1", "ENUM1"); AddSimpleEnumProtoFileToDb("enum2", "Enum2", "ENUM2"); const FileDescriptor* file = pool_.FindFileByName("foo.proto"); // Verify calling enum_type() on a field whose definition is not // yet built will build the file and return a descriptor. EXPECT_FALSE(pool_.InternalIsFileLoaded("enum1.proto")); const Descriptor* desc = file->FindMessageTypeByName("Lazy"); EXPECT_TRUE(desc != NULL); const FieldDescriptor* field = desc->FindFieldByName("enum1"); EXPECT_TRUE(field != NULL); EXPECT_TRUE(field->enum_type() != NULL); EXPECT_TRUE(pool_.InternalIsFileLoaded("enum1.proto")); // Verify calling default_value_enum() on a field whose definition is not // yet built will build the file and return a descriptor to the value. EXPECT_FALSE(pool_.InternalIsFileLoaded("enum2.proto")); field = desc->FindFieldByName("enum2"); EXPECT_TRUE(field != NULL); EXPECT_TRUE(field->default_value_enum() != NULL); EXPECT_TRUE(pool_.InternalIsFileLoaded("enum2.proto")); } TEST_F(LazilyBuildDependenciesTest, Type) { ParseProtoAndAddToDb( "name: 'foo.proto' " "package: 'protobuf_unittest' " "dependency: 'message1.proto' " "dependency: 'message2.proto' " "dependency: 'enum1.proto' " "dependency: 'enum2.proto' " "message_type { " " name:'Lazy' " " field { name:'message1' number:1 label:LABEL_OPTIONAL " "type_name:'.protobuf_unittest.Message1' } " " field { name:'message2' number:1 label:LABEL_OPTIONAL " "type_name:'.protobuf_unittest.Message2' } " " field { name:'enum1' number:1 label:LABEL_OPTIONAL " "type_name:'.protobuf_unittest.Enum1' } " " field { name:'enum2' number:1 label:LABEL_OPTIONAL " "type_name:'.protobuf_unittest.Enum2' } " "}"); AddSimpleMessageProtoFileToDb("message1", "Message1"); AddSimpleMessageProtoFileToDb("message2", "Message2"); AddSimpleEnumProtoFileToDb("enum1", "Enum1", "ENUM1"); AddSimpleEnumProtoFileToDb("enum2", "Enum2", "ENUM2"); const FileDescriptor* file = pool_.FindFileByName("foo.proto"); // Verify calling type() on a field that is a message type will // build the type defined in another file. EXPECT_FALSE(pool_.InternalIsFileLoaded("message1.proto")); const Descriptor* desc = file->FindMessageTypeByName("Lazy"); EXPECT_TRUE(desc != NULL); const FieldDescriptor* field = desc->FindFieldByName("message1"); EXPECT_TRUE(field != NULL); EXPECT_EQ(field->type(), FieldDescriptor::TYPE_MESSAGE); EXPECT_TRUE(pool_.InternalIsFileLoaded("message1.proto")); // Verify calling cpp_type() on a field that is a message type will // build the type defined in another file. EXPECT_FALSE(pool_.InternalIsFileLoaded("message2.proto")); field = desc->FindFieldByName("message2"); EXPECT_TRUE(field != NULL); EXPECT_EQ(field->cpp_type(), FieldDescriptor::CPPTYPE_MESSAGE); EXPECT_TRUE(pool_.InternalIsFileLoaded("message2.proto")); // Verify calling type() on a field that is an enum type will // build the type defined in another file. EXPECT_FALSE(pool_.InternalIsFileLoaded("enum1.proto")); field = desc->FindFieldByName("enum1"); EXPECT_TRUE(field != NULL); EXPECT_EQ(field->type(), FieldDescriptor::TYPE_ENUM); EXPECT_TRUE(pool_.InternalIsFileLoaded("enum1.proto")); // Verify calling cpp_type() on a field that is an enum type will // build the type defined in another file. EXPECT_FALSE(pool_.InternalIsFileLoaded("enum2.proto")); field = desc->FindFieldByName("enum2"); EXPECT_TRUE(field != NULL); EXPECT_EQ(field->cpp_type(), FieldDescriptor::CPPTYPE_ENUM); EXPECT_TRUE(pool_.InternalIsFileLoaded("enum2.proto")); } TEST_F(LazilyBuildDependenciesTest, Extension) { ParseProtoAndAddToDb( "name: 'foo.proto' " "package: 'protobuf_unittest' " "dependency: 'bar.proto' " "dependency: 'baz.proto' " "extension { extendee: '.protobuf_unittest.Bar' name:'bar' number:11" " label:LABEL_OPTIONAL type_name:'.protobuf_unittest.Baz' }"); ParseProtoAndAddToDb( "name: 'bar.proto' " "package: 'protobuf_unittest' " "message_type { " " name:'Bar' " " extension_range { start: 10 end: 20 }" "}"); AddSimpleMessageProtoFileToDb("baz", "Baz"); // Verify none have been built yet. EXPECT_FALSE(pool_.InternalIsFileLoaded("foo.proto")); EXPECT_FALSE(pool_.InternalIsFileLoaded("bar.proto")); EXPECT_FALSE(pool_.InternalIsFileLoaded("baz.proto")); const FileDescriptor* file = pool_.FindFileByName("foo.proto"); // Verify foo.bar gets loaded, and bar.proto gets loaded // to register the extension. baz.proto should not get loaded. EXPECT_TRUE(file != NULL); EXPECT_TRUE(pool_.InternalIsFileLoaded("foo.proto")); EXPECT_TRUE(pool_.InternalIsFileLoaded("bar.proto")); EXPECT_FALSE(pool_.InternalIsFileLoaded("baz.proto")); } TEST_F(LazilyBuildDependenciesTest, Service) { ParseProtoAndAddToDb( "name: 'foo.proto' " "package: 'protobuf_unittest' " "dependency: 'message1.proto' " "dependency: 'message2.proto' " "dependency: 'message3.proto' " "dependency: 'message4.proto' " "service {" " name: 'LazyService'" " method { name: 'A' input_type: '.protobuf_unittest.Message1' " " output_type: '.protobuf_unittest.Message2' }" "}"); AddSimpleMessageProtoFileToDb("message1", "Message1"); AddSimpleMessageProtoFileToDb("message2", "Message2"); AddSimpleMessageProtoFileToDb("message3", "Message3"); AddSimpleMessageProtoFileToDb("message4", "Message4"); const FileDescriptor* file = pool_.FindFileByName("foo.proto"); // Verify calling FindServiceByName or FindMethodByName doesn't build the // files defining the input and output type, and input_type() and // output_type() does indeed build the appropriate files. const ServiceDescriptor* service = file->FindServiceByName("LazyService"); EXPECT_TRUE(service != NULL); const MethodDescriptor* method = service->FindMethodByName("A"); EXPECT_FALSE(pool_.InternalIsFileLoaded("message1.proto")); EXPECT_FALSE(pool_.InternalIsFileLoaded("message2.proto")); EXPECT_TRUE(method != NULL); EXPECT_TRUE(method->input_type() != NULL); EXPECT_TRUE(pool_.InternalIsFileLoaded("message1.proto")); EXPECT_FALSE(pool_.InternalIsFileLoaded("message2.proto")); EXPECT_TRUE(method->output_type() != NULL); EXPECT_TRUE(pool_.InternalIsFileLoaded("message2.proto")); } TEST_F(LazilyBuildDependenciesTest, GeneratedFile) { // Most testing is done with custom pools with lazy dependencies forced on, // do some sanity checking that lazy imports is on by default for the // generated pool, and do custom options testing with generated to // be able to use the GetExtension ids for the custom options. // Verify none of the files are loaded yet. EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded( "google/protobuf/unittest_lazy_dependencies.proto")); EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded( "google/protobuf/unittest_lazy_dependencies_custom_option.proto")); EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded( "google/protobuf/unittest_lazy_dependencies_enum.proto")); // Verify calling autogenerated function to get a descriptor in the base // file will build that file but none of it's imports. This verifies that // lazily_build_dependencies_ is set on the generated pool, and also that // the generated function "descriptor()" doesn't somehow subvert the laziness // by manually loading the dependencies or something. EXPECT_TRUE(protobuf_unittest::lazy_imports::ImportedMessage::descriptor() != NULL); EXPECT_TRUE(DescriptorPool::generated_pool()->InternalIsFileLoaded( "google/protobuf/unittest_lazy_dependencies.proto")); EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded( "google/protobuf/unittest_lazy_dependencies_custom_option.proto")); EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded( "google/protobuf/unittest_lazy_dependencies_enum.proto")); // Verify custom options work when defined in an import that isn't loaded, // and that a non-default value of a custom option doesn't load the file // where that enum is defined. const google::protobuf::MessageOptions& options = protobuf_unittest::lazy_imports::MessageCustomOption::descriptor() ->options(); protobuf_unittest::lazy_imports::LazyEnum custom_option_value = options.GetExtension(protobuf_unittest::lazy_imports::lazy_enum_option); EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded( "google/protobuf/unittest_lazy_dependencies_custom_option.proto")); EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded( "google/protobuf/unittest_lazy_dependencies_enum.proto")); EXPECT_EQ(custom_option_value, protobuf_unittest::lazy_imports::LAZY_ENUM_1); const google::protobuf::MessageOptions& options2 = protobuf_unittest::lazy_imports::MessageCustomOption2::descriptor() ->options(); custom_option_value = options2.GetExtension(protobuf_unittest::lazy_imports::lazy_enum_option); EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded( "google/protobuf/unittest_lazy_dependencies_custom_option.proto")); EXPECT_FALSE(DescriptorPool::generated_pool()->InternalIsFileLoaded( "google/protobuf/unittest_lazy_dependencies_enum.proto")); EXPECT_EQ(custom_option_value, protobuf_unittest::lazy_imports::LAZY_ENUM_0); } TEST_F(LazilyBuildDependenciesTest, Dependency) { ParseProtoAndAddToDb( "name: 'foo.proto' " "package: 'protobuf_unittest' " "dependency: 'bar.proto' " "message_type { " " name:'Foo' " " field { name:'bar' number:1 label:LABEL_OPTIONAL " "type_name:'.protobuf_unittest.Bar' } " "}"); ParseProtoAndAddToDb( "name: 'bar.proto' " "package: 'protobuf_unittest' " "dependency: 'baz.proto' " "message_type { " " name:'Bar' " " field { name:'baz' number:1 label:LABEL_OPTIONAL " "type_name:'.protobuf_unittest.Baz' } " "}"); AddSimpleMessageProtoFileToDb("baz", "Baz"); const FileDescriptor* foo_file = pool_.FindFileByName("foo.proto"); EXPECT_TRUE(foo_file != NULL); // As expected, requesting foo.proto shouldn't build it's dependencies EXPECT_TRUE(pool_.InternalIsFileLoaded("foo.proto")); EXPECT_FALSE(pool_.InternalIsFileLoaded("bar.proto")); EXPECT_FALSE(pool_.InternalIsFileLoaded("baz.proto")); // Verify calling dependency(N) will build the dependency, but // not that file's dependencies. const FileDescriptor* bar_file = foo_file->dependency(0); EXPECT_TRUE(bar_file != NULL); EXPECT_TRUE(pool_.InternalIsFileLoaded("bar.proto")); EXPECT_FALSE(pool_.InternalIsFileLoaded("baz.proto")); } // =================================================================== } // namespace descriptor_unittest } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/drop_unknown_fields_test.cc000066400000000000000000000134651334102242000327210ustar00rootroot00000000000000// 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 #ifndef _SHARED_PTR_H #include #endif #include #include #include #include namespace google { using unittest_drop_unknown_fields::Foo; using unittest_drop_unknown_fields::FooWithExtraFields; namespace protobuf { TEST(DropUnknownFieldsTest, GeneratedMessageDefaultDrop) { ::google::protobuf::internal::SetProto3PreserveUnknownsDefault(false); FooWithExtraFields foo_with_extra_fields; foo_with_extra_fields.set_int32_value(1); foo_with_extra_fields.set_enum_value(FooWithExtraFields::QUX); foo_with_extra_fields.set_extra_int32_value(2); Foo foo; ASSERT_TRUE(foo.ParseFromString(foo_with_extra_fields.SerializeAsString())); EXPECT_EQ(1, foo.int32_value()); EXPECT_EQ(static_cast(FooWithExtraFields::QUX), static_cast(foo.enum_value())); EXPECT_TRUE(foo.GetReflection()->GetUnknownFields(foo).empty()); ASSERT_TRUE(foo_with_extra_fields.ParseFromString(foo.SerializeAsString())); EXPECT_EQ(1, foo_with_extra_fields.int32_value()); EXPECT_EQ(FooWithExtraFields::QUX, foo_with_extra_fields.enum_value()); // The "extra_int32_value" field should be lost. EXPECT_EQ(0, foo_with_extra_fields.extra_int32_value()); } TEST(DropUnknownFieldsTest, GeneratedMessageDefaultPreserve) { ::google::protobuf::internal::SetProto3PreserveUnknownsDefault(true); FooWithExtraFields foo_with_extra_fields; foo_with_extra_fields.set_int32_value(1); foo_with_extra_fields.set_enum_value(FooWithExtraFields::QUX); foo_with_extra_fields.set_extra_int32_value(2); Foo foo; ASSERT_TRUE(foo.ParseFromString(foo_with_extra_fields.SerializeAsString())); EXPECT_EQ(1, foo.int32_value()); EXPECT_EQ(static_cast(FooWithExtraFields::QUX), static_cast(foo.enum_value())); EXPECT_FALSE(foo.GetReflection()->GetUnknownFields(foo).empty()); ASSERT_TRUE(foo_with_extra_fields.ParseFromString(foo.SerializeAsString())); EXPECT_EQ(1, foo_with_extra_fields.int32_value()); EXPECT_EQ(FooWithExtraFields::QUX, foo_with_extra_fields.enum_value()); // The "extra_int32_value" field should not be lost. EXPECT_EQ(2, foo_with_extra_fields.extra_int32_value()); } TEST(DropUnknownFieldsTest, DynamicMessageDefaultDrop) { internal::SetProto3PreserveUnknownsDefault(false); FooWithExtraFields foo_with_extra_fields; foo_with_extra_fields.set_int32_value(1); foo_with_extra_fields.set_enum_value(FooWithExtraFields::QUX); foo_with_extra_fields.set_extra_int32_value(2); google::protobuf::DynamicMessageFactory factory; google::protobuf::scoped_ptr foo( factory.GetPrototype(Foo::descriptor())->New()); ASSERT_TRUE(foo->ParseFromString(foo_with_extra_fields.SerializeAsString())); EXPECT_TRUE(foo->GetReflection()->GetUnknownFields(*foo).empty()); ASSERT_TRUE(foo_with_extra_fields.ParseFromString(foo->SerializeAsString())); EXPECT_EQ(1, foo_with_extra_fields.int32_value()); EXPECT_EQ(FooWithExtraFields::QUX, foo_with_extra_fields.enum_value()); // The "extra_int32_value" field should be lost. EXPECT_EQ(0, foo_with_extra_fields.extra_int32_value()); } TEST(DropUnknownFieldsTest, DynamicMessageDefaultPreserve) { internal::SetProto3PreserveUnknownsDefault(true); FooWithExtraFields foo_with_extra_fields; foo_with_extra_fields.set_int32_value(1); foo_with_extra_fields.set_enum_value(FooWithExtraFields::QUX); foo_with_extra_fields.set_extra_int32_value(2); google::protobuf::DynamicMessageFactory factory; google::protobuf::scoped_ptr foo( factory.GetPrototype(Foo::descriptor())->New()); ASSERT_TRUE(foo->ParseFromString(foo_with_extra_fields.SerializeAsString())); EXPECT_FALSE(foo->GetReflection()->GetUnknownFields(*foo).empty()); ASSERT_TRUE(foo_with_extra_fields.ParseFromString(foo->SerializeAsString())); EXPECT_EQ(1, foo_with_extra_fields.int32_value()); EXPECT_EQ(FooWithExtraFields::QUX, foo_with_extra_fields.enum_value()); // The "extra_int32_value" field should not be lost. EXPECT_EQ(2, foo_with_extra_fields.extra_int32_value()); } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/duration.pb.cc000066400000000000000000000360731334102242000300360ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/duration.proto #include #include #include #include #include #include #include #include #include #include #include // This is a temporary google only hack #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS #include "third_party/protobuf/version.h" #endif // @@protoc_insertion_point(includes) namespace google { namespace protobuf { class DurationDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Duration_default_instance_; } // namespace protobuf } // namespace google namespace protobuf_google_2fprotobuf_2fduration_2eproto { void InitDefaultsDurationImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_Duration_default_instance_; new (ptr) ::google::protobuf::Duration(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::Duration::InitAsDefaultInstance(); } void InitDefaultsDuration() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsDurationImpl); } ::google::protobuf::Metadata file_level_metadata[1]; const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Duration, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Duration, seconds_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Duration, nanos_), }; static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { { 0, -1, sizeof(::google::protobuf::Duration)}, }; static ::google::protobuf::Message const * const file_default_instances[] = { reinterpret_cast(&::google::protobuf::_Duration_default_instance_), }; void protobuf_AssignDescriptors() { AddDescriptors(); ::google::protobuf::MessageFactory* factory = NULL; AssignDescriptors( "google/protobuf/duration.proto", schemas, file_default_instances, TableStruct::offsets, factory, file_level_metadata, NULL, NULL); } void protobuf_AssignDescriptorsOnce() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors); } void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD; void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1); } void AddDescriptorsImpl() { InitDefaults(); static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_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|\n\023com.google.protobufB\rDu" "rationProtoP\001Z*github.com/golang/protobu" "f/ptypes/duration\370\001\001\242\002\003GPB\252\002\036Google.Prot" "obuf.WellKnownTypesb\006proto3" }; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( descriptor, 227); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "google/protobuf/duration.proto", &protobuf_RegisterTypes); } void AddDescriptors() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl); } // Force AddDescriptors() to be called at dynamic initialization time. struct StaticDescriptorInitializer { StaticDescriptorInitializer() { AddDescriptors(); } } static_descriptor_initializer; } // namespace protobuf_google_2fprotobuf_2fduration_2eproto namespace google { namespace protobuf { // =================================================================== void Duration::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int Duration::kSecondsFieldNumber; const int Duration::kNanosFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Duration::Duration() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fduration_2eproto::InitDefaultsDuration(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.Duration) } Duration::Duration(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2fduration_2eproto::InitDefaultsDuration(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.Duration) } Duration::Duration(const Duration& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); ::memcpy(&seconds_, &from.seconds_, static_cast(reinterpret_cast(&nanos_) - reinterpret_cast(&seconds_)) + sizeof(nanos_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.Duration) } void Duration::SharedCtor() { ::memset(&seconds_, 0, static_cast( reinterpret_cast(&nanos_) - reinterpret_cast(&seconds_)) + sizeof(nanos_)); _cached_size_ = 0; } Duration::~Duration() { // @@protoc_insertion_point(destructor:google.protobuf.Duration) SharedDtor(); } void Duration::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void Duration::ArenaDtor(void* object) { Duration* _this = reinterpret_cast< Duration* >(object); (void)_this; } void Duration::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void Duration::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* Duration::descriptor() { ::protobuf_google_2fprotobuf_2fduration_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fduration_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const Duration& Duration::default_instance() { ::protobuf_google_2fprotobuf_2fduration_2eproto::InitDefaultsDuration(); return *internal_default_instance(); } Duration* Duration::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void Duration::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.Duration) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; ::memset(&seconds_, 0, static_cast( reinterpret_cast(&nanos_) - reinterpret_cast(&seconds_)) + sizeof(nanos_)); _internal_metadata_.Clear(); } bool Duration::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.Duration) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // int64 seconds = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( input, &seconds_))); } else { goto handle_unusual; } break; } // int32 nanos = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &nanos_))); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.Duration) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.Duration) return false; #undef DO_ } void Duration::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.Duration) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // int64 seconds = 1; if (this->seconds() != 0) { ::google::protobuf::internal::WireFormatLite::WriteInt64(1, this->seconds(), output); } // int32 nanos = 2; if (this->nanos() != 0) { ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->nanos(), output); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.Duration) } ::google::protobuf::uint8* Duration::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Duration) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // int64 seconds = 1; if (this->seconds() != 0) { target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(1, this->seconds(), target); } // int32 nanos = 2; if (this->nanos() != 0) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->nanos(), target); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Duration) return target; } size_t Duration::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Duration) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } // int64 seconds = 1; if (this->seconds() != 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int64Size( this->seconds()); } // int32 nanos = 2; if (this->nanos() != 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->nanos()); } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void Duration::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Duration) GOOGLE_DCHECK_NE(&from, this); const Duration* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.Duration) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.Duration) MergeFrom(*source); } } void Duration::MergeFrom(const Duration& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Duration) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; if (from.seconds() != 0) { set_seconds(from.seconds()); } if (from.nanos() != 0) { set_nanos(from.nanos()); } } void Duration::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.Duration) if (&from == this) return; Clear(); MergeFrom(from); } void Duration::CopyFrom(const Duration& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Duration) if (&from == this) return; Clear(); MergeFrom(from); } bool Duration::IsInitialized() const { return true; } void Duration::Swap(Duration* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { Duration* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void Duration::UnsafeArenaSwap(Duration* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void Duration::InternalSwap(Duration* other) { using std::swap; swap(seconds_, other->seconds_); swap(nanos_, other->nanos_); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata Duration::GetMetadata() const { protobuf_google_2fprotobuf_2fduration_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fduration_2eproto::file_level_metadata[kIndexInFileMessages]; } // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/duration.pb.h000066400000000000000000000174561334102242000277040ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/duration.proto #ifndef PROTOBUF_google_2fprotobuf_2fduration_2eproto__INCLUDED #define PROTOBUF_google_2fprotobuf_2fduration_2eproto__INCLUDED #include #include #if GOOGLE_PROTOBUF_VERSION < 3005000 #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 3005001 < GOOGLE_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 #include #include #include #include #include #include #include #include // IWYU pragma: export #include // IWYU pragma: export #include // @@protoc_insertion_point(includes) namespace protobuf_google_2fprotobuf_2fduration_2eproto { // Internal implementation detail -- do not use these members. struct LIBPROTOBUF_EXPORT TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; static const ::google::protobuf::internal::ParseTable schema[1]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; }; void LIBPROTOBUF_EXPORT AddDescriptors(); void LIBPROTOBUF_EXPORT InitDefaultsDurationImpl(); void LIBPROTOBUF_EXPORT InitDefaultsDuration(); inline void LIBPROTOBUF_EXPORT InitDefaults() { InitDefaultsDuration(); } } // namespace protobuf_google_2fprotobuf_2fduration_2eproto namespace google { namespace protobuf { class Duration; class DurationDefaultTypeInternal; LIBPROTOBUF_EXPORT extern DurationDefaultTypeInternal _Duration_default_instance_; } // namespace protobuf } // namespace google namespace google { namespace protobuf { // =================================================================== class LIBPROTOBUF_EXPORT Duration : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Duration) */ { public: Duration(); virtual ~Duration(); Duration(const Duration& from); inline Duration& operator=(const Duration& from) { CopyFrom(from); return *this; } #if LANG_CXX11 Duration(Duration&& from) noexcept : Duration() { *this = ::std::move(from); } inline Duration& operator=(Duration&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const Duration& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const Duration* internal_default_instance() { return reinterpret_cast( &_Duration_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 0; void UnsafeArenaSwap(Duration* other); void Swap(Duration* other); friend void swap(Duration& a, Duration& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline Duration* New() const PROTOBUF_FINAL { return New(NULL); } Duration* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const Duration& from); void MergeFrom(const Duration& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(Duration* other); protected: explicit Duration(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // int64 seconds = 1; void clear_seconds(); static const int kSecondsFieldNumber = 1; ::google::protobuf::int64 seconds() const; void set_seconds(::google::protobuf::int64 value); // int32 nanos = 2; void clear_nanos(); static const int kNanosFieldNumber = 2; ::google::protobuf::int32 nanos() const; void set_nanos(::google::protobuf::int32 value); // @@protoc_insertion_point(class_scope:google.protobuf.Duration) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::int64 seconds_; ::google::protobuf::int32 nanos_; mutable int _cached_size_; friend struct ::protobuf_google_2fprotobuf_2fduration_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fduration_2eproto::InitDefaultsDurationImpl(); }; // =================================================================== // =================================================================== #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif // __GNUC__ // Duration // int64 seconds = 1; inline void Duration::clear_seconds() { seconds_ = GOOGLE_LONGLONG(0); } inline ::google::protobuf::int64 Duration::seconds() const { // @@protoc_insertion_point(field_get:google.protobuf.Duration.seconds) return seconds_; } inline void Duration::set_seconds(::google::protobuf::int64 value) { seconds_ = value; // @@protoc_insertion_point(field_set:google.protobuf.Duration.seconds) } // int32 nanos = 2; inline void Duration::clear_nanos() { nanos_ = 0; } inline ::google::protobuf::int32 Duration::nanos() const { // @@protoc_insertion_point(field_get:google.protobuf.Duration.nanos) return nanos_; } inline void Duration::set_nanos(::google::protobuf::int32 value) { nanos_ = value; // @@protoc_insertion_point(field_set:google.protobuf.Duration.nanos) } #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) #endif // PROTOBUF_google_2fprotobuf_2fduration_2eproto__INCLUDED python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/duration.proto000066400000000000000000000114321334102242000302040ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; option go_package = "github.com/golang/protobuf/ptypes/duration"; option java_package = "com.google.protobuf"; option java_outer_classname = "DurationProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // A Duration represents a signed, fixed-length span of time represented // as a count of seconds and fractions of seconds at nanosecond // resolution. It is independent of any calendar and concepts like "day" // or "month". It is related to Timestamp in that the difference between // two Timestamp values is a Duration and it can be added or subtracted // from a Timestamp. Range is approximately +-10,000 years. // // # Examples // // Example 1: Compute Duration from two Timestamps in pseudo code. // // Timestamp start = ...; // Timestamp end = ...; // Duration duration = ...; // // duration.seconds = end.seconds - start.seconds; // duration.nanos = end.nanos - start.nanos; // // if (duration.seconds < 0 && duration.nanos > 0) { // duration.seconds += 1; // duration.nanos -= 1000000000; // } else if (durations.seconds > 0 && duration.nanos < 0) { // duration.seconds -= 1; // duration.nanos += 1000000000; // } // // Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. // // Timestamp start = ...; // Duration duration = ...; // Timestamp end = ...; // // end.seconds = start.seconds + duration.seconds; // end.nanos = start.nanos + duration.nanos; // // if (end.nanos < 0) { // end.seconds -= 1; // end.nanos += 1000000000; // } else if (end.nanos >= 1000000000) { // end.seconds += 1; // end.nanos -= 1000000000; // } // // Example 3: Compute Duration from datetime.timedelta in Python. // // td = datetime.timedelta(days=3, minutes=10) // duration = Duration() // duration.FromTimedelta(td) // // # JSON Mapping // // In JSON format, the Duration type is encoded as a string rather than an // object, where the string ends in the suffix "s" (indicating seconds) and // is preceded by the number of seconds, with nanoseconds expressed as // fractional seconds. For example, 3 seconds with 0 nanoseconds should be // encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should // be expressed in JSON format as "3.000000001s", and 3 seconds and 1 // microsecond should be expressed in JSON format as "3.000001s". // // message Duration { // Signed seconds of the span of time. Must be from -315,576,000,000 // to +315,576,000,000 inclusive. Note: these bounds are computed from: // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years int64 seconds = 1; // Signed fractions of a second at nanosecond resolution of the span // of time. Durations less than one second are represented with a 0 // `seconds` field and a positive or negative `nanos` field. For durations // of one second or more, a non-zero value for the `nanos` field must be // of the same sign as the `seconds` field. Must be from -999,999,999 // to +999,999,999 inclusive. int32 nanos = 2; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/dynamic_message.cc000066400000000000000000000761411334102242000307410ustar00rootroot00000000000000// 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. // // DynamicMessage is implemented by constructing a data structure which // has roughly the same memory layout as a generated message would have. // Then, we use GeneratedMessageReflection to implement our reflection // interface. All the other operations we need to implement (e.g. // parsing, copying, etc.) are already implemented in terms of // Reflection, so the rest is easy. // // The up side of this strategy is that it's very efficient. We don't // need to use hash_maps or generic representations of fields. The // down side is that this is a low-level memory management hack which // can be tricky to get right. // // As mentioned in the header, we only expose a DynamicMessageFactory // publicly, not the DynamicMessage class itself. This is because // GenericMessageReflection wants to have a pointer to a "default" // copy of the class, with all fields initialized to their default // values. We only want to construct one of these per message type, // so DynamicMessageFactory stores a cache of default messages for // each type it sees (each unique Descriptor pointer). The code // refers to the "default" copy of the class as the "prototype". // // Note on memory allocation: This module often calls "operator new()" // to allocate untyped memory, rather than calling something like // "new uint8[]". This is because "operator new()" means "Give me some // space which I can use as I please." while "new uint8[]" means "Give // me an array of 8-bit integers.". In practice, the later may return // a pointer that is not aligned correctly for general use. I believe // 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 #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { using internal::DynamicMapField; using internal::ExtensionSet; using internal::GeneratedMessageReflection; using internal::InternalMetadataWithArena; using internal::MapField; using internal::ArenaStringPtr; // =================================================================== // Some helper tables and functions... namespace { bool IsMapFieldInApi(const FieldDescriptor* field) { return field->is_map(); } // Compute the byte size of the in-memory representation of the field. int FieldSpaceUsed(const FieldDescriptor* field) { typedef FieldDescriptor FD; // avoid line wrapping if (field->label() == FD::LABEL_REPEATED) { switch (field->cpp_type()) { case FD::CPPTYPE_INT32 : return sizeof(RepeatedField); case FD::CPPTYPE_INT64 : return sizeof(RepeatedField); case FD::CPPTYPE_UINT32 : return sizeof(RepeatedField); case FD::CPPTYPE_UINT64 : return sizeof(RepeatedField); case FD::CPPTYPE_DOUBLE : return sizeof(RepeatedField); case FD::CPPTYPE_FLOAT : return sizeof(RepeatedField); case FD::CPPTYPE_BOOL : return sizeof(RepeatedField); case FD::CPPTYPE_ENUM : return sizeof(RepeatedField); case FD::CPPTYPE_MESSAGE: if (IsMapFieldInApi(field)) { return sizeof(DynamicMapField); } else { return sizeof(RepeatedPtrField); } case FD::CPPTYPE_STRING: switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: return sizeof(RepeatedPtrField); } break; } } else { switch (field->cpp_type()) { case FD::CPPTYPE_INT32 : return sizeof(int32 ); case FD::CPPTYPE_INT64 : return sizeof(int64 ); case FD::CPPTYPE_UINT32 : return sizeof(uint32 ); case FD::CPPTYPE_UINT64 : return sizeof(uint64 ); case FD::CPPTYPE_DOUBLE : return sizeof(double ); case FD::CPPTYPE_FLOAT : return sizeof(float ); case FD::CPPTYPE_BOOL : return sizeof(bool ); case FD::CPPTYPE_ENUM : return sizeof(int ); case FD::CPPTYPE_MESSAGE: return sizeof(Message*); case FD::CPPTYPE_STRING: switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: return sizeof(ArenaStringPtr); } break; } } GOOGLE_LOG(DFATAL) << "Can't get here."; return 0; } // Compute the byte size of in-memory representation of the oneof fields // in default oneof instance. int OneofFieldSpaceUsed(const FieldDescriptor* field) { typedef FieldDescriptor FD; // avoid line wrapping switch (field->cpp_type()) { case FD::CPPTYPE_INT32 : return sizeof(int32 ); case FD::CPPTYPE_INT64 : return sizeof(int64 ); case FD::CPPTYPE_UINT32 : return sizeof(uint32 ); case FD::CPPTYPE_UINT64 : return sizeof(uint64 ); case FD::CPPTYPE_DOUBLE : return sizeof(double ); case FD::CPPTYPE_FLOAT : return sizeof(float ); case FD::CPPTYPE_BOOL : return sizeof(bool ); case FD::CPPTYPE_ENUM : return sizeof(int ); case FD::CPPTYPE_MESSAGE: return sizeof(Message*); case FD::CPPTYPE_STRING: switch (field->options().ctype()) { default: case FieldOptions::STRING: return sizeof(ArenaStringPtr); } break; } GOOGLE_LOG(DFATAL) << "Can't get here."; return 0; } inline int DivideRoundingUp(int i, int j) { return (i + (j - 1)) / j; } static const int kSafeAlignment = sizeof(uint64); static const int kMaxOneofUnionSize = sizeof(uint64); inline int AlignTo(int offset, int alignment) { return DivideRoundingUp(offset, alignment) * alignment; } // Rounds the given byte offset up to the next offset aligned such that any // type may be stored at it. inline int AlignOffset(int offset) { return AlignTo(offset, kSafeAlignment); } #define bitsizeof(T) (sizeof(T) * 8) } // namespace // =================================================================== class DynamicMessage : public Message { public: struct TypeInfo { int size; int has_bits_offset; int oneof_case_offset; int internal_metadata_offset; int extensions_offset; // Not owned by the TypeInfo. DynamicMessageFactory* factory; // The factory that created this object. const DescriptorPool* pool; // The factory's DescriptorPool. const Descriptor* type; // Type of this DynamicMessage. // Warning: The order in which the following pointers are defined is // important (the prototype must be deleted *before* the offsets). google::protobuf::scoped_array offsets; google::protobuf::scoped_array has_bits_indices; google::protobuf::scoped_ptr reflection; // Don't use a scoped_ptr to hold the prototype: the destructor for // DynamicMessage needs to know whether it is the prototype, and does so by // looking back at this field. This would assume details about the // implementation of scoped_ptr. const DynamicMessage* prototype; int weak_field_map_offset; // The offset for the weak_field_map; TypeInfo() : prototype(NULL) {} ~TypeInfo() { delete prototype; } }; DynamicMessage(const TypeInfo* type_info); // This should only be used by GetPrototypeNoLock() to avoid dead lock. DynamicMessage(const TypeInfo* type_info, bool lock_factory); ~DynamicMessage(); // Called on the prototype after construction to initialize message fields. void CrossLinkPrototypes(); // implements Message ---------------------------------------------- Message* New() const; Message* New(::google::protobuf::Arena* arena) const; ::google::protobuf::Arena* GetArena() const { return NULL; }; int GetCachedSize() const; void SetCachedSize(int size) const; Metadata GetMetadata() const; // We actually allocate more memory than sizeof(*this) when this // class's memory is allocated via the global operator new. Thus, we need to // manually call the global operator delete. Calling the destructor is taken // care of for us. This makes DynamicMessage compatible with -fsized-delete. // It doesn't work for MSVC though. #ifndef _MSC_VER static void operator delete(void* ptr) { ::operator delete(ptr); } #endif // !_MSC_VER private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessage); DynamicMessage(const TypeInfo* type_info, ::google::protobuf::Arena* arena); void SharedCtor(bool lock_factory); inline bool is_prototype() const { return type_info_->prototype == this || // If type_info_->prototype is NULL, then we must be constructing // the prototype now, which means we must be the prototype. type_info_->prototype == NULL; } inline void* OffsetToPointer(int offset) { return reinterpret_cast(this) + offset; } inline const void* OffsetToPointer(int offset) const { return reinterpret_cast(this) + offset; } const TypeInfo* type_info_; // TODO(kenton): Make this an atomic when C++ supports it. mutable int cached_byte_size_; }; DynamicMessage::DynamicMessage(const TypeInfo* type_info) : type_info_(type_info), cached_byte_size_(0) { SharedCtor(true); } DynamicMessage::DynamicMessage(const TypeInfo* type_info, ::google::protobuf::Arena* arena) : type_info_(type_info), cached_byte_size_(0) { SharedCtor(true); } DynamicMessage::DynamicMessage(const TypeInfo* type_info, bool lock_factory) : type_info_(type_info), cached_byte_size_(0) { SharedCtor(lock_factory); } void DynamicMessage::SharedCtor(bool lock_factory) { // We need to call constructors for various fields manually and set // default values where appropriate. We use placement new to call // constructors. If you haven't heard of placement new, I suggest Googling // it now. We use placement new even for primitive types that don't have // constructors for consistency. (In theory, placement new should be used // any time you are trying to convert untyped memory to typed memory, though // in practice that's not strictly necessary for types that don't have a // constructor.) const Descriptor* descriptor = type_info_->type; // Initialize oneof cases. for (int i = 0 ; i < descriptor->oneof_decl_count(); ++i) { new (OffsetToPointer(type_info_->oneof_case_offset + sizeof(uint32) * i)) uint32(0); } new (OffsetToPointer(type_info_->internal_metadata_offset)) InternalMetadataWithArena; if (type_info_->extensions_offset != -1) { new (OffsetToPointer(type_info_->extensions_offset)) ExtensionSet; } for (int i = 0; i < descriptor->field_count(); i++) { const FieldDescriptor* field = descriptor->field(i); void* field_ptr = OffsetToPointer(type_info_->offsets[i]); if (field->containing_oneof()) { continue; } switch (field->cpp_type()) { #define HANDLE_TYPE(CPPTYPE, TYPE) \ case FieldDescriptor::CPPTYPE_##CPPTYPE: \ if (!field->is_repeated()) { \ new(field_ptr) TYPE(field->default_value_##TYPE()); \ } else { \ new(field_ptr) RepeatedField(); \ } \ break; HANDLE_TYPE(INT32 , int32 ); HANDLE_TYPE(INT64 , int64 ); HANDLE_TYPE(UINT32, uint32); HANDLE_TYPE(UINT64, uint64); HANDLE_TYPE(DOUBLE, double); HANDLE_TYPE(FLOAT , float ); HANDLE_TYPE(BOOL , bool ); #undef HANDLE_TYPE case FieldDescriptor::CPPTYPE_ENUM: if (!field->is_repeated()) { new(field_ptr) int(field->default_value_enum()->number()); } else { new(field_ptr) RepeatedField(); } break; case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: if (!field->is_repeated()) { const string* default_value; if (is_prototype()) { default_value = &field->default_value_string(); } else { default_value = &(reinterpret_cast( type_info_->prototype->OffsetToPointer( type_info_->offsets[i])) ->Get()); } ArenaStringPtr* asp = new(field_ptr) ArenaStringPtr(); asp->UnsafeSetDefault(default_value); } else { new(field_ptr) RepeatedPtrField(); } break; } break; case FieldDescriptor::CPPTYPE_MESSAGE: { if (!field->is_repeated()) { new(field_ptr) Message*(NULL); } else { if (IsMapFieldInApi(field)) { // We need to lock in most cases to avoid data racing. Only not lock // when the constructor is called inside GetPrototype(), in which // case we have already locked the factory. if (lock_factory) { new (field_ptr) DynamicMapField( type_info_->factory->GetPrototype(field->message_type())); } else { new (field_ptr) DynamicMapField(type_info_->factory->GetPrototypeNoLock( field->message_type())); } } else { new (field_ptr) RepeatedPtrField(); } } break; } } } } DynamicMessage::~DynamicMessage() { const Descriptor* descriptor = type_info_->type; reinterpret_cast( OffsetToPointer(type_info_->internal_metadata_offset)) ->~InternalMetadataWithArena(); if (type_info_->extensions_offset != -1) { reinterpret_cast( OffsetToPointer(type_info_->extensions_offset))->~ExtensionSet(); } // We need to manually run the destructors for repeated fields and strings, // just as we ran their constructors in the DynamicMessage constructor. // We also need to manually delete oneof fields if it is set and is string // or message. // Additionally, if any singular embedded messages have been allocated, we // need to delete them, UNLESS we are the prototype message of this type, // in which case any embedded messages are other prototypes and shouldn't // be touched. for (int i = 0; i < descriptor->field_count(); i++) { const FieldDescriptor* field = descriptor->field(i); if (field->containing_oneof()) { void* field_ptr = OffsetToPointer( type_info_->oneof_case_offset + sizeof(uint32) * field->containing_oneof()->index()); if (*(reinterpret_cast(field_ptr)) == field->number()) { field_ptr = OffsetToPointer(type_info_->offsets[ descriptor->field_count() + field->containing_oneof()->index()]); if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { switch (field->options().ctype()) { default: case FieldOptions::STRING: { const ::std::string* default_value = &(reinterpret_cast( reinterpret_cast( type_info_->prototype) + type_info_->offsets[i]) ->Get()); reinterpret_cast(field_ptr)->Destroy( default_value, NULL); break; } } } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { delete *reinterpret_cast(field_ptr); } } continue; } void* field_ptr = OffsetToPointer(type_info_->offsets[i]); if (field->is_repeated()) { switch (field->cpp_type()) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ case FieldDescriptor::CPPTYPE_##UPPERCASE : \ reinterpret_cast*>(field_ptr) \ ->~RepeatedField(); \ break HANDLE_TYPE( INT32, int32); HANDLE_TYPE( INT64, int64); HANDLE_TYPE(UINT32, uint32); HANDLE_TYPE(UINT64, uint64); HANDLE_TYPE(DOUBLE, double); HANDLE_TYPE( FLOAT, float); HANDLE_TYPE( BOOL, bool); HANDLE_TYPE( ENUM, int); #undef HANDLE_TYPE case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: reinterpret_cast*>(field_ptr) ->~RepeatedPtrField(); break; } break; case FieldDescriptor::CPPTYPE_MESSAGE: if (IsMapFieldInApi(field)) { reinterpret_cast(field_ptr)->~DynamicMapField(); } else { reinterpret_cast*>(field_ptr) ->~RepeatedPtrField(); } break; } } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: { const ::std::string* default_value = &(reinterpret_cast( type_info_->prototype->OffsetToPointer( type_info_->offsets[i])) ->Get()); reinterpret_cast(field_ptr)->Destroy( default_value, NULL); break; } } } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { if (!is_prototype()) { Message* message = *reinterpret_cast(field_ptr); if (message != NULL) { delete message; } } } } } void DynamicMessage::CrossLinkPrototypes() { // This should only be called on the prototype message. GOOGLE_CHECK(is_prototype()); DynamicMessageFactory* factory = type_info_->factory; const Descriptor* descriptor = type_info_->type; // Cross-link default messages. for (int i = 0; i < descriptor->field_count(); i++) { const FieldDescriptor* field = descriptor->field(i); void* field_ptr = OffsetToPointer(type_info_->offsets[i]); if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && !field->is_repeated()) { // For fields with message types, we need to cross-link with the // prototype for the field's type. // For singular fields, the field is just a pointer which should // point to the prototype. *reinterpret_cast(field_ptr) = factory->GetPrototypeNoLock(field->message_type()); } } } Message* DynamicMessage::New() const { void* new_base = operator new(type_info_->size); memset(new_base, 0, type_info_->size); return new(new_base) DynamicMessage(type_info_); } Message* DynamicMessage::New(::google::protobuf::Arena* arena) const { if (arena != NULL) { Message* message = New(); arena->Own(message); return message; } else { return New(); } } int DynamicMessage::GetCachedSize() const { return cached_byte_size_; } void DynamicMessage::SetCachedSize(int size) const { // This is theoretically not thread-compatible, but in practice it works // because if multiple threads write this simultaneously, they will be // writing the exact same value. GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); cached_byte_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } Metadata DynamicMessage::GetMetadata() const { Metadata metadata; metadata.descriptor = type_info_->type; metadata.reflection = type_info_->reflection.get(); return metadata; } // =================================================================== struct DynamicMessageFactory::PrototypeMap { typedef hash_map Map; Map map_; }; DynamicMessageFactory::DynamicMessageFactory() : pool_(NULL), delegate_to_generated_factory_(false), prototypes_(new PrototypeMap) { } DynamicMessageFactory::DynamicMessageFactory(const DescriptorPool* pool) : pool_(pool), delegate_to_generated_factory_(false), prototypes_(new PrototypeMap) { } DynamicMessageFactory::~DynamicMessageFactory() { for (PrototypeMap::Map::iterator iter = prototypes_->map_.begin(); iter != prototypes_->map_.end(); ++iter) { DeleteDefaultOneofInstance(iter->second->type, iter->second->offsets.get(), iter->second->prototype); delete iter->second; } } const Message* DynamicMessageFactory::GetPrototype(const Descriptor* type) { MutexLock lock(&prototypes_mutex_); return GetPrototypeNoLock(type); } const Message* DynamicMessageFactory::GetPrototypeNoLock( const Descriptor* type) { if (delegate_to_generated_factory_ && type->file()->pool() == DescriptorPool::generated_pool()) { return MessageFactory::generated_factory()->GetPrototype(type); } const DynamicMessage::TypeInfo** target = &prototypes_->map_[type]; if (*target != NULL) { // Already exists. return (*target)->prototype; } DynamicMessage::TypeInfo* type_info = new DynamicMessage::TypeInfo; *target = type_info; type_info->type = type; type_info->pool = (pool_ == NULL) ? type->file()->pool() : pool_; type_info->factory = this; // We need to construct all the structures passed to // GeneratedMessageReflection's constructor. This includes: // - A block of memory that contains space for all the message's fields. // - An array of integers indicating the byte offset of each field within // this block. // - A big bitfield containing a bit for each field indicating whether // or not that field is set. // Compute size and offsets. uint32* offsets = new uint32[type->field_count() + type->oneof_decl_count()]; type_info->offsets.reset(offsets); // Decide all field offsets by packing in order. // We place the DynamicMessage object itself at the beginning of the allocated // space. int size = sizeof(DynamicMessage); size = AlignOffset(size); // Next the has_bits, which is an array of uint32s. if (type->file()->syntax() == FileDescriptor::SYNTAX_PROTO3) { type_info->has_bits_offset = -1; } else { type_info->has_bits_offset = size; int has_bits_array_size = DivideRoundingUp(type->field_count(), bitsizeof(uint32)); size += has_bits_array_size * sizeof(uint32); size = AlignOffset(size); uint32* has_bits_indices = new uint32[type->field_count()]; for (int i = 0; i < type->field_count(); i++) { has_bits_indices[i] = i; } type_info->has_bits_indices.reset(has_bits_indices); } // The oneof_case, if any. It is an array of uint32s. if (type->oneof_decl_count() > 0) { type_info->oneof_case_offset = size; size += type->oneof_decl_count() * sizeof(uint32); size = AlignOffset(size); } // The ExtensionSet, if any. if (type->extension_range_count() > 0) { type_info->extensions_offset = size; size += sizeof(ExtensionSet); size = AlignOffset(size); } else { // No extensions. type_info->extensions_offset = -1; } // All the fields. // // TODO(b/31226269): Optimize the order of fields to minimize padding. int num_weak_fields = 0; for (int i = 0; i < type->field_count(); i++) { // Make sure field is aligned to avoid bus errors. // Oneof fields do not use any space. if (!type->field(i)->containing_oneof()) { int field_size = FieldSpaceUsed(type->field(i)); size = AlignTo(size, std::min(kSafeAlignment, field_size)); offsets[i] = size; size += field_size; } } // The oneofs. for (int i = 0; i < type->oneof_decl_count(); i++) { size = AlignTo(size, kSafeAlignment); offsets[type->field_count() + i] = size; size += kMaxOneofUnionSize; } // Add the InternalMetadataWithArena to the end. size = AlignOffset(size); type_info->internal_metadata_offset = size; size += sizeof(InternalMetadataWithArena); type_info->weak_field_map_offset = -1; // Align the final size to make sure no clever allocators think that // alignment is not necessary. type_info->size = size; // Construct the reflection object. if (type->oneof_decl_count() > 0) { // Compute the size of default oneof instance and offsets of default // oneof fields. for (int i = 0; i < type->oneof_decl_count(); i++) { for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = type->oneof_decl(i)->field(j); int field_size = OneofFieldSpaceUsed(field); size = AlignTo(size, std::min(kSafeAlignment, field_size)); offsets[field->index()] = size; size += field_size; } } } size = AlignOffset(size); // Allocate the prototype + oneof fields. void* base = operator new(size); memset(base, 0, size); // The prototype in type_info has to be set before creating the prototype // instance on memory. e.g., message Foo { map a = 1; }. When // creating prototype for Foo, prototype of the map entry will also be // created, which needs the address of the prototype of Foo (the value in // map). To break the cyclic dependency, we have to assgin the address of // prototype into type_info first. type_info->prototype = static_cast(base); // We have already locked the factory so we should not lock in the constructor // of dynamic message to avoid dead lock. DynamicMessage* prototype = new (base) DynamicMessage(type_info, false); if (type->oneof_decl_count() > 0 || num_weak_fields > 0) { // Construct default oneof instance. ConstructDefaultOneofInstance(type_info->type, type_info->offsets.get(), prototype); } internal::ReflectionSchema schema = { type_info->prototype, type_info->offsets.get(), type_info->has_bits_indices.get(), type_info->has_bits_offset, type_info->internal_metadata_offset, type_info->extensions_offset, type_info->oneof_case_offset, type_info->size, type_info->weak_field_map_offset}; type_info->reflection.reset(new GeneratedMessageReflection( type_info->type, schema, type_info->pool, this)); // Cross link prototypes. prototype->CrossLinkPrototypes(); return prototype; } void DynamicMessageFactory::ConstructDefaultOneofInstance( const Descriptor* type, const uint32 offsets[], void* default_oneof_or_weak_instance) { for (int i = 0; i < type->oneof_decl_count(); i++) { for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = type->oneof_decl(i)->field(j); void* field_ptr = reinterpret_cast( default_oneof_or_weak_instance) + offsets[field->index()]; switch (field->cpp_type()) { #define HANDLE_TYPE(CPPTYPE, TYPE) \ case FieldDescriptor::CPPTYPE_##CPPTYPE: \ new(field_ptr) TYPE(field->default_value_##TYPE()); \ break; HANDLE_TYPE(INT32 , int32 ); HANDLE_TYPE(INT64 , int64 ); HANDLE_TYPE(UINT32, uint32); HANDLE_TYPE(UINT64, uint64); HANDLE_TYPE(DOUBLE, double); HANDLE_TYPE(FLOAT , float ); HANDLE_TYPE(BOOL , bool ); #undef HANDLE_TYPE case FieldDescriptor::CPPTYPE_ENUM: new(field_ptr) int(field->default_value_enum()->number()); break; case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: case FieldOptions::STRING: ArenaStringPtr* asp = new (field_ptr) ArenaStringPtr(); asp->UnsafeSetDefault(&field->default_value_string()); break; } break; case FieldDescriptor::CPPTYPE_MESSAGE: { new(field_ptr) Message*(NULL); break; } } } } } void DynamicMessageFactory::DeleteDefaultOneofInstance( const Descriptor* type, const uint32 offsets[], const void* default_oneof_instance) { for (int i = 0; i < type->oneof_decl_count(); i++) { for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) { const FieldDescriptor* field = type->oneof_decl(i)->field(j); if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { switch (field->options().ctype()) { default: case FieldOptions::STRING: break; } } } } } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/dynamic_message.h000066400000000000000000000235051334102242000305770ustar00rootroot00000000000000// 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. // // Defines an implementation of Message which can emulate types which are not // known at compile-time. #ifndef GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__ #define GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__ #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include namespace google { namespace protobuf { // Defined in other files. class Descriptor; // descriptor.h class DescriptorPool; // descriptor.h // Constructs implementations of Message which can emulate types which are not // known at compile-time. // // Sometimes you want to be able to manipulate protocol types that you don't // know about at compile time. It would be nice to be able to construct // a Message object which implements the message type given by any arbitrary // Descriptor. DynamicMessage provides this. // // As it turns out, a DynamicMessage needs to construct extra // information about its type in order to operate. Most of this information // can be shared between all DynamicMessages of the same type. But, caching // this information in some sort of global map would be a bad idea, since // the cached information for a particular descriptor could outlive the // descriptor itself. To avoid this problem, DynamicMessageFactory // 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. class LIBPROTOBUF_EXPORT DynamicMessageFactory : public MessageFactory { public: // Construct a DynamicMessageFactory that will search for extensions in // the DescriptorPool in which the extendee is defined. DynamicMessageFactory(); // Construct a DynamicMessageFactory that will search for extensions in // the given DescriptorPool. // // DEPRECATED: Use CodedInputStream::SetExtensionRegistry() to tell the // parser to look for extensions in an alternate pool. However, note that // this is almost never what you want to do. Almost all users should use // the zero-arg constructor. DynamicMessageFactory(const DescriptorPool* pool); ~DynamicMessageFactory(); // Call this to tell the DynamicMessageFactory that if it is given a // Descriptor d for which: // d->file()->pool() == DescriptorPool::generated_pool(), // then it should delegate to MessageFactory::generated_factory() instead // of constructing a dynamic implementation of the message. In theory there // is no down side to doing this, so it may become the default in the future. void SetDelegateToGeneratedFactory(bool enable) { delegate_to_generated_factory_ = enable; } // implements MessageFactory --------------------------------------- // Given a Descriptor, constructs the default (prototype) Message of that // type. You can then call that message's New() method to construct a // mutable message of that type. // // Calling this method twice with the same Descriptor returns the same // object. The returned object remains property of the factory and will // be destroyed when the factory is destroyed. Also, any objects created // by calling the prototype's New() method share some data with the // prototype, so these must be destroyed before the DynamicMessageFactory // is destroyed. // // The given descriptor must outlive the returned message, and hence must // outlive the DynamicMessageFactory. // // The method is thread-safe. const Message* GetPrototype(const Descriptor* type); private: const DescriptorPool* pool_; bool delegate_to_generated_factory_; // This struct just contains a hash_map. We can't #include from // this header due to hacks needed for hash_map portability in the open source // release. Namely, stubs/hash.h, which defines hash_map portably, is not a // public header (for good reason), but dynamic_message.h is, and public // headers may only #include other public headers. struct PrototypeMap; google::protobuf::scoped_ptr prototypes_; mutable Mutex prototypes_mutex_; friend class DynamicMessage; const Message* GetPrototypeNoLock(const Descriptor* type); // Construct default oneof instance for reflection usage if oneof // is defined. static void ConstructDefaultOneofInstance(const Descriptor* type, const uint32 offsets[], void* default_oneof_instance); // Delete default oneof instance. Called by ~DynamicMessageFactory. static void DeleteDefaultOneofInstance(const Descriptor* type, const uint32 offsets[], const void* default_oneof_instance); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessageFactory); }; // Helper for computing a sorted list of map entries via reflection. class LIBPROTOBUF_EXPORT DynamicMapSorter { public: static std::vector Sort(const Message& message, int map_size, const Reflection* reflection, const FieldDescriptor* field) { std::vector result(static_cast(map_size)); const RepeatedPtrField& map_field = reflection->GetRepeatedPtrField(message, field); size_t i = 0; for (RepeatedPtrField::const_pointer_iterator it = map_field.pointer_begin(); it != map_field.pointer_end(); ) { result[i++] = *it++; } GOOGLE_DCHECK_EQ(result.size(), i); MapEntryMessageComparator comparator(field->message_type()); std::stable_sort(result.begin(), result.end(), comparator); // Complain if the keys aren't in ascending order. #ifndef NDEBUG for (size_t j = 1; j < static_cast(map_size); j++) { if (!comparator(result[j - 1], result[j])) { GOOGLE_LOG(ERROR) << (comparator(result[j], result[j - 1]) ? "internal error in map key sorting" : "map keys are not unique"); } } #endif return result; } private: class LIBPROTOBUF_EXPORT MapEntryMessageComparator { public: explicit MapEntryMessageComparator(const Descriptor* descriptor) : field_(descriptor->field(0)) {} bool operator()(const Message* a, const Message* b) { const Reflection* reflection = a->GetReflection(); switch (field_->cpp_type()) { case FieldDescriptor::CPPTYPE_BOOL: { bool first = reflection->GetBool(*a, field_); bool second = reflection->GetBool(*b, field_); return first < second; } case FieldDescriptor::CPPTYPE_INT32: { int32 first = reflection->GetInt32(*a, field_); int32 second = reflection->GetInt32(*b, field_); return first < second; } case FieldDescriptor::CPPTYPE_INT64: { int64 first = reflection->GetInt64(*a, field_); int64 second = reflection->GetInt64(*b, field_); return first < second; } case FieldDescriptor::CPPTYPE_UINT32: { uint32 first = reflection->GetUInt32(*a, field_); uint32 second = reflection->GetUInt32(*b, field_); return first < second; } case FieldDescriptor::CPPTYPE_UINT64: { uint64 first = reflection->GetUInt64(*a, field_); uint64 second = reflection->GetUInt64(*b, field_); return first < second; } case FieldDescriptor::CPPTYPE_STRING: { string first = reflection->GetString(*a, field_); string second = reflection->GetString(*b, field_); return first < second; } default: GOOGLE_LOG(DFATAL) << "Invalid key for map field."; return true; } } private: const FieldDescriptor* field_; }; }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/dynamic_message_unittest.cc000066400000000000000000000300711334102242000326700ustar00rootroot00000000000000// 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. // // Since the reflection interface for DynamicMessage is implemented by // GenericMessageReflection, the only thing we really have to test is // that DynamicMessage correctly sets up the information that // GenericMessageReflection needs to use. So, we focus on that in this // test. Other tests, such as generic_message_reflection_unittest and // reflection_ops_unittest, cover the rest of the functionality used by // DynamicMessage. #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { class DynamicMessageTest : public testing::Test { protected: DescriptorPool pool_; DynamicMessageFactory factory_; const Descriptor* descriptor_; const Message* prototype_; const Descriptor* extensions_descriptor_; const Message* extensions_prototype_; const Descriptor* packed_descriptor_; const Message* packed_prototype_; const Descriptor* oneof_descriptor_; const Message* oneof_prototype_; const Descriptor* proto3_descriptor_; const Message* proto3_prototype_; DynamicMessageTest(): factory_(&pool_) {} virtual void SetUp() { // We want to make sure that DynamicMessage works (particularly with // extensions) even if we use descriptors that are *not* from compiled-in // types, so we make copies of the descriptors for unittest.proto and // unittest_import.proto. FileDescriptorProto unittest_file; FileDescriptorProto unittest_import_file; FileDescriptorProto unittest_import_public_file; FileDescriptorProto unittest_no_field_presence_file; unittest::TestAllTypes::descriptor()->file()->CopyTo(&unittest_file); unittest_import::ImportMessage::descriptor()->file()->CopyTo( &unittest_import_file); unittest_import::PublicImportMessage::descriptor()->file()->CopyTo( &unittest_import_public_file); proto2_nofieldpresence_unittest::TestAllTypes::descriptor()-> file()->CopyTo(&unittest_no_field_presence_file); ASSERT_TRUE(pool_.BuildFile(unittest_import_public_file) != NULL); ASSERT_TRUE(pool_.BuildFile(unittest_import_file) != NULL); ASSERT_TRUE(pool_.BuildFile(unittest_file) != NULL); ASSERT_TRUE(pool_.BuildFile(unittest_no_field_presence_file) != NULL); descriptor_ = pool_.FindMessageTypeByName("protobuf_unittest.TestAllTypes"); ASSERT_TRUE(descriptor_ != NULL); prototype_ = factory_.GetPrototype(descriptor_); extensions_descriptor_ = pool_.FindMessageTypeByName("protobuf_unittest.TestAllExtensions"); ASSERT_TRUE(extensions_descriptor_ != NULL); extensions_prototype_ = factory_.GetPrototype(extensions_descriptor_); packed_descriptor_ = pool_.FindMessageTypeByName("protobuf_unittest.TestPackedTypes"); ASSERT_TRUE(packed_descriptor_ != NULL); packed_prototype_ = factory_.GetPrototype(packed_descriptor_); oneof_descriptor_ = pool_.FindMessageTypeByName("protobuf_unittest.TestOneof2"); ASSERT_TRUE(oneof_descriptor_ != NULL); oneof_prototype_ = factory_.GetPrototype(oneof_descriptor_); proto3_descriptor_ = pool_.FindMessageTypeByName( "proto2_nofieldpresence_unittest.TestAllTypes"); ASSERT_TRUE(proto3_descriptor_ != NULL); proto3_prototype_ = factory_.GetPrototype(proto3_descriptor_); } }; TEST_F(DynamicMessageTest, Descriptor) { // Check that the descriptor on the DynamicMessage matches the descriptor // passed to GetPrototype(). EXPECT_EQ(prototype_->GetDescriptor(), descriptor_); } TEST_F(DynamicMessageTest, OnePrototype) { // Check that requesting the same prototype twice produces the same object. EXPECT_EQ(prototype_, factory_.GetPrototype(descriptor_)); } TEST_F(DynamicMessageTest, Defaults) { // Check that all default values are set correctly in the initial message. TestUtil::ReflectionTester reflection_tester(descriptor_); reflection_tester.ExpectClearViaReflection(*prototype_); } TEST_F(DynamicMessageTest, IndependentOffsets) { // Check that all fields have independent offsets by setting each // one to a unique value then checking that they all still have those // unique values (i.e. they don't stomp each other). google::protobuf::scoped_ptr message(prototype_->New()); TestUtil::ReflectionTester reflection_tester(descriptor_); reflection_tester.SetAllFieldsViaReflection(message.get()); reflection_tester.ExpectAllFieldsSetViaReflection(*message); } TEST_F(DynamicMessageTest, Extensions) { // Check that extensions work. google::protobuf::scoped_ptr message(extensions_prototype_->New()); TestUtil::ReflectionTester reflection_tester(extensions_descriptor_); reflection_tester.SetAllFieldsViaReflection(message.get()); reflection_tester.ExpectAllFieldsSetViaReflection(*message); } TEST_F(DynamicMessageTest, PackedFields) { // Check that packed fields work properly. google::protobuf::scoped_ptr message(packed_prototype_->New()); TestUtil::ReflectionTester reflection_tester(packed_descriptor_); reflection_tester.SetPackedFieldsViaReflection(message.get()); reflection_tester.ExpectPackedFieldsSetViaReflection(*message); } TEST_F(DynamicMessageTest, Oneof) { // Check that oneof fields work properly. google::protobuf::scoped_ptr message(oneof_prototype_->New()); // Check default values. const Descriptor* descriptor = message->GetDescriptor(); const Reflection* reflection = message->GetReflection(); EXPECT_EQ(0, reflection->GetInt32( *message, descriptor->FindFieldByName("foo_int"))); EXPECT_EQ("", reflection->GetString( *message, descriptor->FindFieldByName("foo_string"))); EXPECT_EQ("", reflection->GetString( *message, descriptor->FindFieldByName("foo_cord"))); EXPECT_EQ("", reflection->GetString( *message, descriptor->FindFieldByName("foo_string_piece"))); EXPECT_EQ("", reflection->GetString( *message, descriptor->FindFieldByName("foo_bytes"))); EXPECT_EQ(unittest::TestOneof2::FOO, reflection->GetEnum( *message, descriptor->FindFieldByName("foo_enum"))->number()); const Descriptor* nested_descriptor; const Message* nested_prototype; nested_descriptor = pool_.FindMessageTypeByName("protobuf_unittest.TestOneof2.NestedMessage"); nested_prototype = factory_.GetPrototype(nested_descriptor); EXPECT_EQ(nested_prototype, &reflection->GetMessage( *message, descriptor->FindFieldByName("foo_message"))); const Descriptor* foogroup_descriptor; const Message* foogroup_prototype; foogroup_descriptor = pool_.FindMessageTypeByName("protobuf_unittest.TestOneof2.FooGroup"); foogroup_prototype = factory_.GetPrototype(foogroup_descriptor); EXPECT_EQ(foogroup_prototype, &reflection->GetMessage( *message, descriptor->FindFieldByName("foogroup"))); EXPECT_NE(foogroup_prototype, &reflection->GetMessage( *message, descriptor->FindFieldByName("foo_lazy_message"))); EXPECT_EQ(5, reflection->GetInt32( *message, descriptor->FindFieldByName("bar_int"))); EXPECT_EQ("STRING", reflection->GetString( *message, descriptor->FindFieldByName("bar_string"))); EXPECT_EQ("CORD", reflection->GetString( *message, descriptor->FindFieldByName("bar_cord"))); EXPECT_EQ("SPIECE", reflection->GetString( *message, descriptor->FindFieldByName("bar_string_piece"))); EXPECT_EQ("BYTES", reflection->GetString( *message, descriptor->FindFieldByName("bar_bytes"))); EXPECT_EQ(unittest::TestOneof2::BAR, reflection->GetEnum( *message, descriptor->FindFieldByName("bar_enum"))->number()); // Check set functions. TestUtil::ReflectionTester reflection_tester(oneof_descriptor_); reflection_tester.SetOneofViaReflection(message.get()); reflection_tester.ExpectOneofSetViaReflection(*message); } TEST_F(DynamicMessageTest, SpaceUsed) { // Test that SpaceUsed() works properly // Since we share the implementation with generated messages, we don't need // to test very much here. Just make sure it appears to be working. google::protobuf::scoped_ptr message(prototype_->New()); TestUtil::ReflectionTester reflection_tester(descriptor_); int initial_space_used = message->SpaceUsed(); reflection_tester.SetAllFieldsViaReflection(message.get()); EXPECT_LT(initial_space_used, message->SpaceUsed()); } TEST_F(DynamicMessageTest, Arena) { Arena arena; Message* message = prototype_->New(&arena); (void)message; // avoid unused-variable error. // Return without freeing: should not leak. } TEST_F(DynamicMessageTest, Proto3) { Message* message = proto3_prototype_->New(); const Reflection* refl = message->GetReflection(); const Descriptor* desc = message->GetDescriptor(); // Just test a single primtive and single message field here to make sure we // are getting the no-field-presence semantics elsewhere. DynamicMessage uses // GeneratedMessageReflection under the hood, so the rest should be fine as // long as GMR recognizes that we're using a proto3 message. const FieldDescriptor* optional_int32 = desc->FindFieldByName("optional_int32"); const FieldDescriptor* optional_msg = desc->FindFieldByName("optional_nested_message"); EXPECT_TRUE(optional_int32 != NULL); EXPECT_TRUE(optional_msg != NULL); EXPECT_EQ(false, refl->HasField(*message, optional_int32)); refl->SetInt32(message, optional_int32, 42); EXPECT_EQ(true, refl->HasField(*message, optional_int32)); refl->SetInt32(message, optional_int32, 0); EXPECT_EQ(false, refl->HasField(*message, optional_int32)); EXPECT_EQ(false, refl->HasField(*message, optional_msg)); refl->MutableMessage(message, optional_msg); EXPECT_EQ(true, refl->HasField(*message, optional_msg)); delete refl->ReleaseMessage(message, optional_msg); EXPECT_EQ(false, refl->HasField(*message, optional_msg)); // Also ensure that the default instance handles field presence properly. EXPECT_EQ(false, refl->HasField(*proto3_prototype_, optional_msg)); delete message; } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/empty.pb.cc000066400000000000000000000274701334102242000273500ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/empty.proto #include #include #include #include #include #include #include #include #include #include #include // This is a temporary google only hack #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS #include "third_party/protobuf/version.h" #endif // @@protoc_insertion_point(includes) namespace google { namespace protobuf { class EmptyDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Empty_default_instance_; } // namespace protobuf } // namespace google namespace protobuf_google_2fprotobuf_2fempty_2eproto { void InitDefaultsEmptyImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_Empty_default_instance_; new (ptr) ::google::protobuf::Empty(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::Empty::InitAsDefaultInstance(); } void InitDefaultsEmpty() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsEmptyImpl); } ::google::protobuf::Metadata file_level_metadata[1]; const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Empty, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ }; static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { { 0, -1, sizeof(::google::protobuf::Empty)}, }; static ::google::protobuf::Message const * const file_default_instances[] = { reinterpret_cast(&::google::protobuf::_Empty_default_instance_), }; void protobuf_AssignDescriptors() { AddDescriptors(); ::google::protobuf::MessageFactory* factory = NULL; AssignDescriptors( "google/protobuf/empty.proto", schemas, file_default_instances, TableStruct::offsets, factory, file_level_metadata, NULL, NULL); } void protobuf_AssignDescriptorsOnce() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors); } void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD; void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1); } void AddDescriptorsImpl() { InitDefaults(); static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { "\n\033google/protobuf/empty.proto\022\017google.pr" "otobuf\"\007\n\005EmptyBv\n\023com.google.protobufB\n" "EmptyProtoP\001Z\'github.com/golang/protobuf" "/ptypes/empty\370\001\001\242\002\003GPB\252\002\036Google.Protobuf" ".WellKnownTypesb\006proto3" }; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( descriptor, 183); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "google/protobuf/empty.proto", &protobuf_RegisterTypes); } void AddDescriptors() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl); } // Force AddDescriptors() to be called at dynamic initialization time. struct StaticDescriptorInitializer { StaticDescriptorInitializer() { AddDescriptors(); } } static_descriptor_initializer; } // namespace protobuf_google_2fprotobuf_2fempty_2eproto namespace google { namespace protobuf { // =================================================================== void Empty::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Empty::Empty() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fempty_2eproto::InitDefaultsEmpty(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.Empty) } Empty::Empty(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2fempty_2eproto::InitDefaultsEmpty(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.Empty) } Empty::Empty(const Empty& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); // @@protoc_insertion_point(copy_constructor:google.protobuf.Empty) } void Empty::SharedCtor() { _cached_size_ = 0; } Empty::~Empty() { // @@protoc_insertion_point(destructor:google.protobuf.Empty) SharedDtor(); } void Empty::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void Empty::ArenaDtor(void* object) { Empty* _this = reinterpret_cast< Empty* >(object); (void)_this; } void Empty::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void Empty::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* Empty::descriptor() { ::protobuf_google_2fprotobuf_2fempty_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fempty_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const Empty& Empty::default_instance() { ::protobuf_google_2fprotobuf_2fempty_2eproto::InitDefaultsEmpty(); return *internal_default_instance(); } Empty* Empty::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void Empty::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.Empty) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; _internal_metadata_.Clear(); } bool Empty::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.Empty) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); } success: // @@protoc_insertion_point(parse_success:google.protobuf.Empty) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.Empty) return false; #undef DO_ } void Empty::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.Empty) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.Empty) } ::google::protobuf::uint8* Empty::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Empty) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Empty) return target; } size_t Empty::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Empty) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void Empty::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Empty) GOOGLE_DCHECK_NE(&from, this); const Empty* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.Empty) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.Empty) MergeFrom(*source); } } void Empty::MergeFrom(const Empty& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Empty) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; } void Empty::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.Empty) if (&from == this) return; Clear(); MergeFrom(from); } void Empty::CopyFrom(const Empty& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Empty) if (&from == this) return; Clear(); MergeFrom(from); } bool Empty::IsInitialized() const { return true; } void Empty::Swap(Empty* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { Empty* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void Empty::UnsafeArenaSwap(Empty* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void Empty::InternalSwap(Empty* other) { using std::swap; _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata Empty::GetMetadata() const { protobuf_google_2fprotobuf_2fempty_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fempty_2eproto::file_level_metadata[kIndexInFileMessages]; } // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/empty.pb.h000066400000000000000000000147001334102242000272020ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/empty.proto #ifndef PROTOBUF_google_2fprotobuf_2fempty_2eproto__INCLUDED #define PROTOBUF_google_2fprotobuf_2fempty_2eproto__INCLUDED #include #include #if GOOGLE_PROTOBUF_VERSION < 3005000 #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 3005001 < GOOGLE_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 #include #include #include #include #include #include #include #include // IWYU pragma: export #include // IWYU pragma: export #include // @@protoc_insertion_point(includes) namespace protobuf_google_2fprotobuf_2fempty_2eproto { // Internal implementation detail -- do not use these members. struct LIBPROTOBUF_EXPORT TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; static const ::google::protobuf::internal::ParseTable schema[1]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; }; void LIBPROTOBUF_EXPORT AddDescriptors(); void LIBPROTOBUF_EXPORT InitDefaultsEmptyImpl(); void LIBPROTOBUF_EXPORT InitDefaultsEmpty(); inline void LIBPROTOBUF_EXPORT InitDefaults() { InitDefaultsEmpty(); } } // namespace protobuf_google_2fprotobuf_2fempty_2eproto namespace google { namespace protobuf { class Empty; class EmptyDefaultTypeInternal; LIBPROTOBUF_EXPORT extern EmptyDefaultTypeInternal _Empty_default_instance_; } // namespace protobuf } // namespace google namespace google { namespace protobuf { // =================================================================== class LIBPROTOBUF_EXPORT Empty : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Empty) */ { public: Empty(); virtual ~Empty(); Empty(const Empty& from); inline Empty& operator=(const Empty& from) { CopyFrom(from); return *this; } #if LANG_CXX11 Empty(Empty&& from) noexcept : Empty() { *this = ::std::move(from); } inline Empty& operator=(Empty&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const Empty& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const Empty* internal_default_instance() { return reinterpret_cast( &_Empty_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 0; void UnsafeArenaSwap(Empty* other); void Swap(Empty* other); friend void swap(Empty& a, Empty& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline Empty* New() const PROTOBUF_FINAL { return New(NULL); } Empty* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const Empty& from); void MergeFrom(const Empty& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(Empty* other); protected: explicit Empty(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // @@protoc_insertion_point(class_scope:google.protobuf.Empty) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; mutable int _cached_size_; friend struct ::protobuf_google_2fprotobuf_2fempty_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fempty_2eproto::InitDefaultsEmptyImpl(); }; // =================================================================== // =================================================================== #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif // __GNUC__ // Empty #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) #endif // PROTOBUF_google_2fprotobuf_2fempty_2eproto__INCLUDED python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/empty.proto000066400000000000000000000045661334102242000275270ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option go_package = "github.com/golang/protobuf/ptypes/empty"; option java_package = "com.google.protobuf"; option java_outer_classname = "EmptyProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; option cc_enable_arenas = true; // A generic empty message that you can re-use to avoid defining duplicated // empty messages in your APIs. A typical example is to use it as the request // or the response type of an API method. For instance: // // service Foo { // rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); // } // // The JSON representation for `Empty` is empty JSON object `{}`. message Empty {} python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/extension_set.cc000066400000000000000000002170551334102242000305010ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { namespace { inline WireFormatLite::FieldType real_type(FieldType type) { GOOGLE_DCHECK(type > 0 && type <= WireFormatLite::MAX_FIELD_TYPE); return static_cast(type); } inline WireFormatLite::CppType cpp_type(FieldType type) { return WireFormatLite::FieldTypeToCppType(real_type(type)); } inline bool is_packable(WireFormatLite::WireType type) { switch (type) { case WireFormatLite::WIRETYPE_VARINT: case WireFormatLite::WIRETYPE_FIXED64: case WireFormatLite::WIRETYPE_FIXED32: return true; case WireFormatLite::WIRETYPE_LENGTH_DELIMITED: case WireFormatLite::WIRETYPE_START_GROUP: case WireFormatLite::WIRETYPE_END_GROUP: return false; // Do not add a default statement. Let the compiler complain when someone // adds a new wire type. } GOOGLE_LOG(FATAL) << "can't reach here."; return false; } // Registry stuff. typedef hash_map, ExtensionInfo> ExtensionRegistry; ExtensionRegistry* registry_ = NULL; GOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_); void DeleteRegistry() { delete registry_; registry_ = NULL; } void InitRegistry() { registry_ = new ExtensionRegistry; OnShutdown(&DeleteRegistry); } // This function is only called at startup, so there is no need for thread- // safety. void Register(const MessageLite* containing_type, int number, ExtensionInfo info) { ::google::protobuf::GoogleOnceInit(®istry_init_, &InitRegistry); if (!InsertIfNotPresent(registry_, std::make_pair(containing_type, number), info)) { GOOGLE_LOG(FATAL) << "Multiple extension registrations for type \"" << containing_type->GetTypeName() << "\", field number " << number << "."; } } const ExtensionInfo* FindRegisteredExtension( const MessageLite* containing_type, int number) { return (registry_ == NULL) ? NULL : FindOrNull(*registry_, std::make_pair(containing_type, number)); } } // namespace ExtensionFinder::~ExtensionFinder() {} bool GeneratedExtensionFinder::Find(int number, ExtensionInfo* output) { const ExtensionInfo* extension = FindRegisteredExtension(containing_type_, number); if (extension == NULL) { return false; } else { *output = *extension; return true; } } void ExtensionSet::RegisterExtension(const MessageLite* containing_type, int number, FieldType type, bool is_repeated, bool is_packed) { GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_ENUM); GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_MESSAGE); GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_GROUP); ExtensionInfo info(type, is_repeated, is_packed); Register(containing_type, number, info); } static bool CallNoArgValidityFunc(const void* arg, int number) { // Note: Must use C-style cast here rather than reinterpret_cast because // the C++ standard at one point did not allow casts between function and // data pointers and some compilers enforce this for C++-style casts. No // compiler enforces it for C-style casts since lots of C-style code has // relied on these kinds of casts for a long time, despite being // technically undefined. See: // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#195 // Also note: Some compilers do not allow function pointers to be "const". // Which makes sense, I suppose, because it's meaningless. return ((EnumValidityFunc*)arg)(number); } void ExtensionSet::RegisterEnumExtension(const MessageLite* containing_type, int number, FieldType type, bool is_repeated, bool is_packed, EnumValidityFunc* is_valid) { GOOGLE_CHECK_EQ(type, WireFormatLite::TYPE_ENUM); ExtensionInfo info(type, is_repeated, is_packed); info.enum_validity_check.func = CallNoArgValidityFunc; // See comment in CallNoArgValidityFunc() about why we use a c-style cast. info.enum_validity_check.arg = (void*)is_valid; Register(containing_type, number, info); } void ExtensionSet::RegisterMessageExtension(const MessageLite* containing_type, int number, FieldType type, bool is_repeated, bool is_packed, const MessageLite* prototype) { GOOGLE_CHECK(type == WireFormatLite::TYPE_MESSAGE || type == WireFormatLite::TYPE_GROUP); ExtensionInfo info(type, is_repeated, is_packed); info.message_prototype = prototype; Register(containing_type, number, info); } // =================================================================== // Constructors and basic methods. ExtensionSet::ExtensionSet(::google::protobuf::Arena* arena) : arena_(arena) { if (arena_ != NULL) { arena_->OwnDestructor(&extensions_); } } ExtensionSet::ExtensionSet() : arena_(NULL) {} ExtensionSet::~ExtensionSet() { // Deletes all allocated extensions. if (arena_ == NULL) { for (ExtensionMap::iterator iter = extensions_.begin(); iter != extensions_.end(); ++iter) { iter->second.Free(); } } } // Defined in extension_set_heavy.cc. // void ExtensionSet::AppendToList(const Descriptor* containing_type, // const DescriptorPool* pool, // vector* output) const bool ExtensionSet::Has(int number) const { ExtensionMap::const_iterator iter = extensions_.find(number); if (iter == extensions_.end()) return false; GOOGLE_DCHECK(!iter->second.is_repeated); return !iter->second.is_cleared; } int ExtensionSet::NumExtensions() const { int result = 0; for (ExtensionMap::const_iterator iter = extensions_.begin(); iter != extensions_.end(); ++iter) { if (!iter->second.is_cleared) { ++result; } } return result; } int ExtensionSet::ExtensionSize(int number) const { ExtensionMap::const_iterator iter = extensions_.find(number); if (iter == extensions_.end()) return 0; return iter->second.GetSize(); } FieldType ExtensionSet::ExtensionType(int number) const { ExtensionMap::const_iterator iter = extensions_.find(number); if (iter == extensions_.end()) { GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present (1). "; return 0; } if (iter->second.is_cleared) { GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present (2). "; } return iter->second.type; } void ExtensionSet::ClearExtension(int number) { ExtensionMap::iterator iter = extensions_.find(number); if (iter == extensions_.end()) return; iter->second.Clear(); } // =================================================================== // Field accessors namespace { enum Cardinality { REPEATED, OPTIONAL }; } // namespace #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \ GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED : OPTIONAL, LABEL); \ GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE) // ------------------------------------------------------------------- // Primitives #define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE) \ \ LOWERCASE ExtensionSet::Get##CAMELCASE(int number, \ LOWERCASE default_value) const { \ ExtensionMap::const_iterator iter = extensions_.find(number); \ if (iter == extensions_.end() || iter->second.is_cleared) { \ return default_value; \ } else { \ GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, UPPERCASE); \ return iter->second.LOWERCASE##_value; \ } \ } \ \ void ExtensionSet::Set##CAMELCASE(int number, FieldType type, \ LOWERCASE value, \ const FieldDescriptor* descriptor) { \ Extension* extension; \ if (MaybeNewExtension(number, descriptor, &extension)) { \ extension->type = type; \ GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \ extension->is_repeated = false; \ } else { \ GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, UPPERCASE); \ } \ extension->is_cleared = false; \ extension->LOWERCASE##_value = value; \ } \ \ LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const { \ ExtensionMap::const_iterator iter = extensions_.find(number); \ GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \ GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \ return iter->second.repeated_##LOWERCASE##_value->Get(index); \ } \ \ void ExtensionSet::SetRepeated##CAMELCASE( \ int number, int index, LOWERCASE value) { \ ExtensionMap::iterator iter = extensions_.find(number); \ GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \ GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \ iter->second.repeated_##LOWERCASE##_value->Set(index, value); \ } \ \ void ExtensionSet::Add##CAMELCASE(int number, FieldType type, \ bool packed, LOWERCASE value, \ const FieldDescriptor* descriptor) { \ Extension* extension; \ if (MaybeNewExtension(number, descriptor, &extension)) { \ extension->type = type; \ GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \ extension->is_repeated = true; \ extension->is_packed = packed; \ extension->repeated_##LOWERCASE##_value = \ Arena::CreateMessage >(arena_); \ } else { \ GOOGLE_DCHECK_TYPE(*extension, REPEATED, UPPERCASE); \ GOOGLE_DCHECK_EQ(extension->is_packed, packed); \ } \ extension->repeated_##LOWERCASE##_value->Add(value); \ } PRIMITIVE_ACCESSORS( INT32, int32, Int32) PRIMITIVE_ACCESSORS( INT64, int64, Int64) PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32) PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64) PRIMITIVE_ACCESSORS( FLOAT, float, Float) PRIMITIVE_ACCESSORS(DOUBLE, double, Double) PRIMITIVE_ACCESSORS( BOOL, bool, Bool) #undef PRIMITIVE_ACCESSORS const void* ExtensionSet::GetRawRepeatedField(int number, const void* default_value) const { ExtensionMap::const_iterator iter = extensions_.find(number); if (iter == extensions_.end()) { return default_value; } // We assume that all the RepeatedField<>* pointers have the same // size and alignment within the anonymous union in Extension. return iter->second.repeated_int32_value; } void* ExtensionSet::MutableRawRepeatedField(int number, FieldType field_type, bool packed, const FieldDescriptor* desc) { Extension* extension; // We instantiate an empty Repeated{,Ptr}Field if one doesn't exist for this // extension. if (MaybeNewExtension(number, desc, &extension)) { extension->is_repeated = true; extension->type = field_type; extension->is_packed = packed; switch (WireFormatLite::FieldTypeToCppType( static_cast(field_type))) { case WireFormatLite::CPPTYPE_INT32: extension->repeated_int32_value = Arena::CreateMessage >(arena_); break; case WireFormatLite::CPPTYPE_INT64: extension->repeated_int64_value = Arena::CreateMessage >(arena_); break; case WireFormatLite::CPPTYPE_UINT32: extension->repeated_uint32_value = Arena::CreateMessage >(arena_); break; case WireFormatLite::CPPTYPE_UINT64: extension->repeated_uint64_value = Arena::CreateMessage >(arena_); break; case WireFormatLite::CPPTYPE_DOUBLE: extension->repeated_double_value = Arena::CreateMessage >(arena_); break; case WireFormatLite::CPPTYPE_FLOAT: extension->repeated_float_value = Arena::CreateMessage >(arena_); break; case WireFormatLite::CPPTYPE_BOOL: extension->repeated_bool_value = Arena::CreateMessage >(arena_); break; case WireFormatLite::CPPTYPE_ENUM: extension->repeated_enum_value = Arena::CreateMessage >(arena_); break; case WireFormatLite::CPPTYPE_STRING: extension->repeated_string_value = Arena::CreateMessage >(arena_); break; case WireFormatLite::CPPTYPE_MESSAGE: extension->repeated_message_value = Arena::CreateMessage >(arena_); break; } } // We assume that all the RepeatedField<>* pointers have the same // size and alignment within the anonymous union in Extension. return extension->repeated_int32_value; } // Compatible version using old call signature. Does not create extensions when // the don't already exist; instead, just GOOGLE_CHECK-fails. void* ExtensionSet::MutableRawRepeatedField(int number) { ExtensionMap::iterator iter = extensions_.find(number); GOOGLE_CHECK(iter == extensions_.end()) << "Extension not found."; // We assume that all the RepeatedField<>* pointers have the same // size and alignment within the anonymous union in Extension. return iter->second.repeated_int32_value; } // ------------------------------------------------------------------- // Enums int ExtensionSet::GetEnum(int number, int default_value) const { ExtensionMap::const_iterator iter = extensions_.find(number); if (iter == extensions_.end() || iter->second.is_cleared) { // Not present. Return the default value. return default_value; } else { GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM); return iter->second.enum_value; } } void ExtensionSet::SetEnum(int number, FieldType type, int value, const FieldDescriptor* descriptor) { Extension* extension; if (MaybeNewExtension(number, descriptor, &extension)) { extension->type = type; GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM); extension->is_repeated = false; } else { GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, ENUM); } extension->is_cleared = false; extension->enum_value = value; } int ExtensionSet::GetRepeatedEnum(int number, int index) const { ExtensionMap::const_iterator iter = extensions_.find(number); GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM); return iter->second.repeated_enum_value->Get(index); } void ExtensionSet::SetRepeatedEnum(int number, int index, int value) { ExtensionMap::iterator iter = extensions_.find(number); GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM); iter->second.repeated_enum_value->Set(index, value); } void ExtensionSet::AddEnum(int number, FieldType type, bool packed, int value, const FieldDescriptor* descriptor) { Extension* extension; if (MaybeNewExtension(number, descriptor, &extension)) { extension->type = type; GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM); extension->is_repeated = true; extension->is_packed = packed; extension->repeated_enum_value = Arena::CreateMessage >(arena_); } else { GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM); GOOGLE_DCHECK_EQ(extension->is_packed, packed); } extension->repeated_enum_value->Add(value); } // ------------------------------------------------------------------- // Strings const string& ExtensionSet::GetString(int number, const string& default_value) const { ExtensionMap::const_iterator iter = extensions_.find(number); if (iter == extensions_.end() || iter->second.is_cleared) { // Not present. Return the default value. return default_value; } else { GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING); return *iter->second.string_value; } } string* ExtensionSet::MutableString(int number, FieldType type, const FieldDescriptor* descriptor) { Extension* extension; if (MaybeNewExtension(number, descriptor, &extension)) { extension->type = type; GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); extension->is_repeated = false; extension->string_value = Arena::Create(arena_); } else { GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING); } extension->is_cleared = false; return extension->string_value; } const string& ExtensionSet::GetRepeatedString(int number, int index) const { ExtensionMap::const_iterator iter = extensions_.find(number); GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); return iter->second.repeated_string_value->Get(index); } string* ExtensionSet::MutableRepeatedString(int number, int index) { ExtensionMap::iterator iter = extensions_.find(number); GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); return iter->second.repeated_string_value->Mutable(index); } string* ExtensionSet::AddString(int number, FieldType type, const FieldDescriptor* descriptor) { Extension* extension; if (MaybeNewExtension(number, descriptor, &extension)) { extension->type = type; GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); extension->is_repeated = true; extension->is_packed = false; extension->repeated_string_value = Arena::CreateMessage >(arena_); } else { GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING); } return extension->repeated_string_value->Add(); } // ------------------------------------------------------------------- // Messages const MessageLite& ExtensionSet::GetMessage( int number, const MessageLite& default_value) const { ExtensionMap::const_iterator iter = extensions_.find(number); if (iter == extensions_.end()) { // Not present. Return the default value. return default_value; } else { GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); if (iter->second.is_lazy) { return iter->second.lazymessage_value->GetMessage(default_value); } else { return *iter->second.message_value; } } } // Defined in extension_set_heavy.cc. // const MessageLite& ExtensionSet::GetMessage(int number, // const Descriptor* message_type, // MessageFactory* factory) const MessageLite* ExtensionSet::MutableMessage(int number, FieldType type, const MessageLite& prototype, const FieldDescriptor* descriptor) { Extension* extension; if (MaybeNewExtension(number, descriptor, &extension)) { extension->type = type; GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE); extension->is_repeated = false; extension->is_lazy = false; extension->message_value = prototype.New(arena_); extension->is_cleared = false; return extension->message_value; } else { GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); extension->is_cleared = false; if (extension->is_lazy) { return extension->lazymessage_value->MutableMessage(prototype); } else { return extension->message_value; } } } // Defined in extension_set_heavy.cc. // MessageLite* ExtensionSet::MutableMessage(int number, FieldType type, // const Descriptor* message_type, // MessageFactory* factory) void ExtensionSet::SetAllocatedMessage(int number, FieldType type, const FieldDescriptor* descriptor, MessageLite* message) { if (message == NULL) { ClearExtension(number); return; } ::google::protobuf::Arena* message_arena = message->GetArena(); Extension* extension; if (MaybeNewExtension(number, descriptor, &extension)) { extension->type = type; GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE); extension->is_repeated = false; extension->is_lazy = false; if (message_arena == arena_) { extension->message_value = message; } else if (message_arena == NULL) { extension->message_value = message; arena_->Own(message); // not NULL because not equal to message_arena } else { extension->message_value = message->New(arena_); extension->message_value->CheckTypeAndMergeFrom(*message); } } else { GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); if (extension->is_lazy) { extension->lazymessage_value->SetAllocatedMessage(message); } else { if (arena_ == NULL) { delete extension->message_value; } if (message_arena == arena_) { extension->message_value = message; } else if (message_arena == NULL) { extension->message_value = message; arena_->Own(message); // not NULL because not equal to message_arena } else { extension->message_value = message->New(arena_); extension->message_value->CheckTypeAndMergeFrom(*message); } } } extension->is_cleared = false; } void ExtensionSet::UnsafeArenaSetAllocatedMessage( int number, FieldType type, const FieldDescriptor* descriptor, MessageLite* message) { if (message == NULL) { ClearExtension(number); return; } Extension* extension; if (MaybeNewExtension(number, descriptor, &extension)) { extension->type = type; GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE); extension->is_repeated = false; extension->is_lazy = false; extension->message_value = message; } else { GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); if (extension->is_lazy) { extension->lazymessage_value->UnsafeArenaSetAllocatedMessage(message); } else { if (arena_ == NULL) { delete extension->message_value; } extension->message_value = message; } } extension->is_cleared = false; } MessageLite* ExtensionSet::ReleaseMessage(int number, const MessageLite& prototype) { ExtensionMap::iterator iter = extensions_.find(number); if (iter == extensions_.end()) { // Not present. Return NULL. return NULL; } else { GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); MessageLite* ret = NULL; if (iter->second.is_lazy) { ret = iter->second.lazymessage_value->ReleaseMessage(prototype); if (arena_ == NULL) { delete iter->second.lazymessage_value; } } else { if (arena_ == NULL) { ret = iter->second.message_value; } else { // ReleaseMessage() always returns a heap-allocated message, and we are // on an arena, so we need to make a copy of this message to return. ret = (iter->second.message_value)->New(); ret->CheckTypeAndMergeFrom(*iter->second.message_value); } } extensions_.erase(number); return ret; } } MessageLite* ExtensionSet::UnsafeArenaReleaseMessage( int number, const MessageLite& prototype) { ExtensionMap::iterator iter = extensions_.find(number); if (iter == extensions_.end()) { // Not present. Return NULL. return NULL; } else { GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); MessageLite* ret = NULL; if (iter->second.is_lazy) { ret = iter->second.lazymessage_value->UnsafeArenaReleaseMessage(prototype); if (arena_ == NULL) { delete iter->second.lazymessage_value; } } else { ret = iter->second.message_value; } extensions_.erase(number); return ret; } } // Defined in extension_set_heavy.cc. // MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor, // MessageFactory* factory); const MessageLite& ExtensionSet::GetRepeatedMessage( int number, int index) const { ExtensionMap::const_iterator iter = extensions_.find(number); GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE); return iter->second.repeated_message_value->Get(index); } MessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) { ExtensionMap::iterator iter = extensions_.find(number); GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE); return iter->second.repeated_message_value->Mutable(index); } MessageLite* ExtensionSet::AddMessage(int number, FieldType type, const MessageLite& prototype, const FieldDescriptor* descriptor) { Extension* extension; if (MaybeNewExtension(number, descriptor, &extension)) { extension->type = type; GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE); extension->is_repeated = true; extension->repeated_message_value = Arena::CreateMessage >(arena_); } else { GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE); } // RepeatedPtrField does not know how to Add() since it cannot // allocate an abstract object, so we have to be tricky. MessageLite* result = extension->repeated_message_value ->AddFromCleared >(); if (result == NULL) { result = prototype.New(arena_); extension->repeated_message_value->AddAllocated(result); } return result; } // Defined in extension_set_heavy.cc. // MessageLite* ExtensionSet::AddMessage(int number, FieldType type, // const Descriptor* message_type, // MessageFactory* factory) #undef GOOGLE_DCHECK_TYPE void ExtensionSet::RemoveLast(int number) { ExtensionMap::iterator iter = extensions_.find(number); GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; Extension* extension = &iter->second; GOOGLE_DCHECK(extension->is_repeated); switch(cpp_type(extension->type)) { case WireFormatLite::CPPTYPE_INT32: extension->repeated_int32_value->RemoveLast(); break; case WireFormatLite::CPPTYPE_INT64: extension->repeated_int64_value->RemoveLast(); break; case WireFormatLite::CPPTYPE_UINT32: extension->repeated_uint32_value->RemoveLast(); break; case WireFormatLite::CPPTYPE_UINT64: extension->repeated_uint64_value->RemoveLast(); break; case WireFormatLite::CPPTYPE_FLOAT: extension->repeated_float_value->RemoveLast(); break; case WireFormatLite::CPPTYPE_DOUBLE: extension->repeated_double_value->RemoveLast(); break; case WireFormatLite::CPPTYPE_BOOL: extension->repeated_bool_value->RemoveLast(); break; case WireFormatLite::CPPTYPE_ENUM: extension->repeated_enum_value->RemoveLast(); break; case WireFormatLite::CPPTYPE_STRING: extension->repeated_string_value->RemoveLast(); break; case WireFormatLite::CPPTYPE_MESSAGE: extension->repeated_message_value->RemoveLast(); break; } } MessageLite* ExtensionSet::ReleaseLast(int number) { ExtensionMap::iterator iter = extensions_.find(number); GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; Extension* extension = &iter->second; GOOGLE_DCHECK(extension->is_repeated); GOOGLE_DCHECK(cpp_type(extension->type) == WireFormatLite::CPPTYPE_MESSAGE); return extension->repeated_message_value->ReleaseLast(); } void ExtensionSet::SwapElements(int number, int index1, int index2) { ExtensionMap::iterator iter = extensions_.find(number); GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; Extension* extension = &iter->second; GOOGLE_DCHECK(extension->is_repeated); switch(cpp_type(extension->type)) { case WireFormatLite::CPPTYPE_INT32: extension->repeated_int32_value->SwapElements(index1, index2); break; case WireFormatLite::CPPTYPE_INT64: extension->repeated_int64_value->SwapElements(index1, index2); break; case WireFormatLite::CPPTYPE_UINT32: extension->repeated_uint32_value->SwapElements(index1, index2); break; case WireFormatLite::CPPTYPE_UINT64: extension->repeated_uint64_value->SwapElements(index1, index2); break; case WireFormatLite::CPPTYPE_FLOAT: extension->repeated_float_value->SwapElements(index1, index2); break; case WireFormatLite::CPPTYPE_DOUBLE: extension->repeated_double_value->SwapElements(index1, index2); break; case WireFormatLite::CPPTYPE_BOOL: extension->repeated_bool_value->SwapElements(index1, index2); break; case WireFormatLite::CPPTYPE_ENUM: extension->repeated_enum_value->SwapElements(index1, index2); break; case WireFormatLite::CPPTYPE_STRING: extension->repeated_string_value->SwapElements(index1, index2); break; case WireFormatLite::CPPTYPE_MESSAGE: extension->repeated_message_value->SwapElements(index1, index2); break; } } // =================================================================== void ExtensionSet::Clear() { for (ExtensionMap::iterator iter = extensions_.begin(); iter != extensions_.end(); ++iter) { iter->second.Clear(); } } void ExtensionSet::MergeFrom(const ExtensionSet& other) { for (ExtensionMap::const_iterator iter = other.extensions_.begin(); iter != other.extensions_.end(); ++iter) { const Extension& other_extension = iter->second; InternalExtensionMergeFrom(iter->first, other_extension); } } void ExtensionSet::InternalExtensionMergeFrom( int number, const Extension& other_extension) { if (other_extension.is_repeated) { Extension* extension; bool is_new = MaybeNewExtension(number, other_extension.descriptor, &extension); if (is_new) { // Extension did not already exist in set. extension->type = other_extension.type; extension->is_packed = other_extension.is_packed; extension->is_repeated = true; } else { GOOGLE_DCHECK_EQ(extension->type, other_extension.type); GOOGLE_DCHECK_EQ(extension->is_packed, other_extension.is_packed); GOOGLE_DCHECK(extension->is_repeated); } switch (cpp_type(other_extension.type)) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE) \ case WireFormatLite::CPPTYPE_##UPPERCASE: \ if (is_new) { \ extension->repeated_##LOWERCASE##_value = \ Arena::CreateMessage(arena_); \ } \ extension->repeated_##LOWERCASE##_value->MergeFrom( \ *other_extension.repeated_##LOWERCASE##_value); \ break; HANDLE_TYPE( INT32, int32, RepeatedField < int32>); HANDLE_TYPE( INT64, int64, RepeatedField < int64>); HANDLE_TYPE( UINT32, uint32, RepeatedField < uint32>); HANDLE_TYPE( UINT64, uint64, RepeatedField < uint64>); HANDLE_TYPE( FLOAT, float, RepeatedField < float>); HANDLE_TYPE( DOUBLE, double, RepeatedField < double>); HANDLE_TYPE( BOOL, bool, RepeatedField < bool>); HANDLE_TYPE( ENUM, enum, RepeatedField < int>); HANDLE_TYPE( STRING, string, RepeatedPtrField< string>); #undef HANDLE_TYPE case WireFormatLite::CPPTYPE_MESSAGE: if (is_new) { extension->repeated_message_value = Arena::CreateMessage >(arena_); } // We can't call RepeatedPtrField::MergeFrom() because // it would attempt to allocate new objects. RepeatedPtrField* other_repeated_message = other_extension.repeated_message_value; for (int i = 0; i < other_repeated_message->size(); i++) { const MessageLite& other_message = other_repeated_message->Get(i); MessageLite* target = extension->repeated_message_value ->AddFromCleared >(); if (target == NULL) { target = other_message.New(arena_); extension->repeated_message_value->AddAllocated(target); } target->CheckTypeAndMergeFrom(other_message); } break; } } else { if (!other_extension.is_cleared) { switch (cpp_type(other_extension.type)) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE) \ case WireFormatLite::CPPTYPE_##UPPERCASE: \ Set##CAMELCASE(number, other_extension.type, \ other_extension.LOWERCASE##_value, \ other_extension.descriptor); \ break; HANDLE_TYPE( INT32, int32, Int32); HANDLE_TYPE( INT64, int64, Int64); HANDLE_TYPE(UINT32, uint32, UInt32); HANDLE_TYPE(UINT64, uint64, UInt64); HANDLE_TYPE( FLOAT, float, Float); HANDLE_TYPE(DOUBLE, double, Double); HANDLE_TYPE( BOOL, bool, Bool); HANDLE_TYPE( ENUM, enum, Enum); #undef HANDLE_TYPE case WireFormatLite::CPPTYPE_STRING: SetString(number, other_extension.type, *other_extension.string_value, other_extension.descriptor); break; case WireFormatLite::CPPTYPE_MESSAGE: { Extension* extension; bool is_new = MaybeNewExtension(number, other_extension.descriptor, &extension); if (is_new) { extension->type = other_extension.type; extension->is_packed = other_extension.is_packed; extension->is_repeated = false; if (other_extension.is_lazy) { extension->is_lazy = true; extension->lazymessage_value = other_extension.lazymessage_value->New(arena_); extension->lazymessage_value->MergeFrom( *other_extension.lazymessage_value); } else { extension->is_lazy = false; extension->message_value = other_extension.message_value->New(arena_); extension->message_value->CheckTypeAndMergeFrom( *other_extension.message_value); } } else { GOOGLE_DCHECK_EQ(extension->type, other_extension.type); GOOGLE_DCHECK_EQ(extension->is_packed,other_extension.is_packed); GOOGLE_DCHECK(!extension->is_repeated); if (other_extension.is_lazy) { if (extension->is_lazy) { extension->lazymessage_value->MergeFrom( *other_extension.lazymessage_value); } else { extension->message_value->CheckTypeAndMergeFrom( other_extension.lazymessage_value->GetMessage( *extension->message_value)); } } else { if (extension->is_lazy) { extension->lazymessage_value->MutableMessage( *other_extension.message_value)->CheckTypeAndMergeFrom( *other_extension.message_value); } else { extension->message_value->CheckTypeAndMergeFrom( *other_extension.message_value); } } } extension->is_cleared = false; break; } } } } } void ExtensionSet::Swap(ExtensionSet* x) { if (GetArenaNoVirtual() == x->GetArenaNoVirtual()) { extensions_.swap(x->extensions_); } else { // TODO(cfallin, rohananil): We maybe able to optimize a case where we are // swapping from heap to arena-allocated extension set, by just Own()'ing // the extensions. ExtensionSet extension_set; extension_set.MergeFrom(*x); x->Clear(); x->MergeFrom(*this); Clear(); MergeFrom(extension_set); } } void ExtensionSet::SwapExtension(ExtensionSet* other, int number) { if (this == other) return; ExtensionMap::iterator this_iter = extensions_.find(number); ExtensionMap::iterator other_iter = other->extensions_.find(number); if (this_iter == extensions_.end() && other_iter == other->extensions_.end()) { return; } if (this_iter != extensions_.end() && other_iter != other->extensions_.end()) { if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { using std::swap; swap(this_iter->second, other_iter->second); } else { // TODO(cfallin, rohananil): We could further optimize these cases, // especially avoid creation of ExtensionSet, and move MergeFrom logic // into Extensions itself (which takes arena as an argument). // We do it this way to reuse the copy-across-arenas logic already // implemented in ExtensionSet's MergeFrom. ExtensionSet temp; temp.InternalExtensionMergeFrom(number, other_iter->second); ExtensionMap::iterator temp_iter = temp.extensions_.find(number); other_iter->second.Clear(); other->InternalExtensionMergeFrom(number, this_iter->second); this_iter->second.Clear(); InternalExtensionMergeFrom(number, temp_iter->second); } return; } if (this_iter == extensions_.end()) { if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { extensions_.insert(std::make_pair(number, other_iter->second)); } else { InternalExtensionMergeFrom(number, other_iter->second); } other->extensions_.erase(number); return; } if (other_iter == other->extensions_.end()) { if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { other->extensions_.insert(std::make_pair(number, this_iter->second)); } else { other->InternalExtensionMergeFrom(number, this_iter->second); } extensions_.erase(number); return; } } bool ExtensionSet::IsInitialized() const { // Extensions are never required. However, we need to check that all // embedded messages are initialized. for (ExtensionMap::const_iterator iter = extensions_.begin(); iter != extensions_.end(); ++iter) { const Extension& extension = iter->second; if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) { if (extension.is_repeated) { for (int i = 0; i < extension.repeated_message_value->size(); i++) { if (!extension.repeated_message_value->Get(i).IsInitialized()) { return false; } } } else { if (!extension.is_cleared) { if (extension.is_lazy) { if (!extension.lazymessage_value->IsInitialized()) return false; } else { if (!extension.message_value->IsInitialized()) return false; } } } } } return true; } bool ExtensionSet::FindExtensionInfoFromTag( uint32 tag, ExtensionFinder* extension_finder, int* field_number, ExtensionInfo* extension, bool* was_packed_on_wire) { *field_number = WireFormatLite::GetTagFieldNumber(tag); WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); return FindExtensionInfoFromFieldNumber(wire_type, *field_number, extension_finder, extension, was_packed_on_wire); } bool ExtensionSet::FindExtensionInfoFromFieldNumber( int wire_type, int field_number, ExtensionFinder* extension_finder, ExtensionInfo* extension, bool* was_packed_on_wire) { if (!extension_finder->Find(field_number, extension)) { return false; } WireFormatLite::WireType expected_wire_type = WireFormatLite::WireTypeForFieldType(real_type(extension->type)); // Check if this is a packed field. *was_packed_on_wire = false; if (extension->is_repeated && wire_type == WireFormatLite::WIRETYPE_LENGTH_DELIMITED && is_packable(expected_wire_type)) { *was_packed_on_wire = true; return true; } // Otherwise the wire type must match. return expected_wire_type == wire_type; } bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, ExtensionFinder* extension_finder, FieldSkipper* field_skipper) { int number; bool was_packed_on_wire; ExtensionInfo extension; if (!FindExtensionInfoFromTag( tag, extension_finder, &number, &extension, &was_packed_on_wire)) { return field_skipper->SkipField(input, tag); } else { return ParseFieldWithExtensionInfo( number, was_packed_on_wire, extension, input, field_skipper); } } bool ExtensionSet::ParseFieldWithExtensionInfo( int number, bool was_packed_on_wire, const ExtensionInfo& extension, io::CodedInputStream* input, FieldSkipper* field_skipper) { // Explicitly not read extension.is_packed, instead check whether the field // was encoded in packed form on the wire. if (was_packed_on_wire) { uint32 size; if (!input->ReadVarint32(&size)) return false; io::CodedInputStream::Limit limit = input->PushLimit(size); switch (extension.type) { #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \ case WireFormatLite::TYPE_##UPPERCASE: \ while (input->BytesUntilLimit() > 0) { \ CPP_LOWERCASE value; \ if (!WireFormatLite::ReadPrimitive< \ CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \ input, &value)) return false; \ Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \ extension.is_packed, value, \ extension.descriptor); \ } \ break HANDLE_TYPE( INT32, Int32, int32); HANDLE_TYPE( INT64, Int64, int64); HANDLE_TYPE( UINT32, UInt32, uint32); HANDLE_TYPE( UINT64, UInt64, uint64); HANDLE_TYPE( SINT32, Int32, int32); HANDLE_TYPE( SINT64, Int64, int64); HANDLE_TYPE( FIXED32, UInt32, uint32); HANDLE_TYPE( FIXED64, UInt64, uint64); HANDLE_TYPE(SFIXED32, Int32, int32); HANDLE_TYPE(SFIXED64, Int64, int64); HANDLE_TYPE( FLOAT, Float, float); HANDLE_TYPE( DOUBLE, Double, double); HANDLE_TYPE( BOOL, Bool, bool); #undef HANDLE_TYPE case WireFormatLite::TYPE_ENUM: while (input->BytesUntilLimit() > 0) { int value; if (!WireFormatLite::ReadPrimitive( input, &value)) return false; if (extension.enum_validity_check.func( extension.enum_validity_check.arg, value)) { AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed, value, extension.descriptor); } else { // Invalid value. Treat as unknown. field_skipper->SkipUnknownEnum(number, value); } } break; case WireFormatLite::TYPE_STRING: case WireFormatLite::TYPE_BYTES: case WireFormatLite::TYPE_GROUP: case WireFormatLite::TYPE_MESSAGE: GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; break; } input->PopLimit(limit); } else { switch (extension.type) { #define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \ case WireFormatLite::TYPE_##UPPERCASE: { \ CPP_LOWERCASE value; \ if (!WireFormatLite::ReadPrimitive< \ CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \ input, &value)) return false; \ if (extension.is_repeated) { \ Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \ extension.is_packed, value, \ extension.descriptor); \ } else { \ Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value, \ extension.descriptor); \ } \ } break HANDLE_TYPE( INT32, Int32, int32); HANDLE_TYPE( INT64, Int64, int64); HANDLE_TYPE( UINT32, UInt32, uint32); HANDLE_TYPE( UINT64, UInt64, uint64); HANDLE_TYPE( SINT32, Int32, int32); HANDLE_TYPE( SINT64, Int64, int64); HANDLE_TYPE( FIXED32, UInt32, uint32); HANDLE_TYPE( FIXED64, UInt64, uint64); HANDLE_TYPE(SFIXED32, Int32, int32); HANDLE_TYPE(SFIXED64, Int64, int64); HANDLE_TYPE( FLOAT, Float, float); HANDLE_TYPE( DOUBLE, Double, double); HANDLE_TYPE( BOOL, Bool, bool); #undef HANDLE_TYPE case WireFormatLite::TYPE_ENUM: { int value; if (!WireFormatLite::ReadPrimitive( input, &value)) return false; if (!extension.enum_validity_check.func( extension.enum_validity_check.arg, value)) { // Invalid value. Treat as unknown. field_skipper->SkipUnknownEnum(number, value); } else if (extension.is_repeated) { AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed, value, extension.descriptor); } else { SetEnum(number, WireFormatLite::TYPE_ENUM, value, extension.descriptor); } break; } case WireFormatLite::TYPE_STRING: { string* value = extension.is_repeated ? AddString(number, WireFormatLite::TYPE_STRING, extension.descriptor) : MutableString(number, WireFormatLite::TYPE_STRING, extension.descriptor); if (!WireFormatLite::ReadString(input, value)) return false; break; } case WireFormatLite::TYPE_BYTES: { string* value = extension.is_repeated ? AddString(number, WireFormatLite::TYPE_BYTES, extension.descriptor) : MutableString(number, WireFormatLite::TYPE_BYTES, extension.descriptor); if (!WireFormatLite::ReadBytes(input, value)) return false; break; } case WireFormatLite::TYPE_GROUP: { MessageLite* value = extension.is_repeated ? AddMessage(number, WireFormatLite::TYPE_GROUP, *extension.message_prototype, extension.descriptor) : MutableMessage(number, WireFormatLite::TYPE_GROUP, *extension.message_prototype, extension.descriptor); if (!WireFormatLite::ReadGroup(number, input, value)) return false; break; } case WireFormatLite::TYPE_MESSAGE: { MessageLite* value = extension.is_repeated ? AddMessage(number, WireFormatLite::TYPE_MESSAGE, *extension.message_prototype, extension.descriptor) : MutableMessage(number, WireFormatLite::TYPE_MESSAGE, *extension.message_prototype, extension.descriptor); if (!WireFormatLite::ReadMessage(input, value)) return false; break; } } } return true; } bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, const MessageLite* containing_type) { FieldSkipper skipper; GeneratedExtensionFinder finder(containing_type); return ParseField(tag, input, &finder, &skipper); } bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, const MessageLite* containing_type, io::CodedOutputStream* unknown_fields) { CodedOutputStreamFieldSkipper skipper(unknown_fields); GeneratedExtensionFinder finder(containing_type); return ParseField(tag, input, &finder, &skipper); } // Defined in extension_set_heavy.cc. // bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, // const MessageLite* containing_type, // UnknownFieldSet* unknown_fields) // Defined in extension_set_heavy.cc. // bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, // const MessageLite* containing_type, // UnknownFieldSet* unknown_fields); void ExtensionSet::SerializeWithCachedSizes( int start_field_number, int end_field_number, io::CodedOutputStream* output) const { ExtensionMap::const_iterator iter; for (iter = extensions_.lower_bound(start_field_number); iter != extensions_.end() && iter->first < end_field_number; ++iter) { iter->second.SerializeFieldWithCachedSizes(iter->first, output); } } size_t ExtensionSet::ByteSize() const { size_t total_size = 0; for (ExtensionMap::const_iterator iter = extensions_.begin(); iter != extensions_.end(); ++iter) { total_size += iter->second.ByteSize(iter->first); } return total_size; } // Defined in extension_set_heavy.cc. // int ExtensionSet::SpaceUsedExcludingSelf() const bool ExtensionSet::MaybeNewExtension(int number, const FieldDescriptor* descriptor, Extension** result) { std::pair insert_result = extensions_.insert(std::make_pair(number, Extension())); *result = &insert_result.first->second; (*result)->descriptor = descriptor; return insert_result.second; } // =================================================================== // Methods of ExtensionSet::Extension void ExtensionSet::Extension::Clear() { if (is_repeated) { switch (cpp_type(type)) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ case WireFormatLite::CPPTYPE_##UPPERCASE: \ repeated_##LOWERCASE##_value->Clear(); \ break HANDLE_TYPE( INT32, int32); HANDLE_TYPE( INT64, int64); HANDLE_TYPE( UINT32, uint32); HANDLE_TYPE( UINT64, uint64); HANDLE_TYPE( FLOAT, float); HANDLE_TYPE( DOUBLE, double); HANDLE_TYPE( BOOL, bool); HANDLE_TYPE( ENUM, enum); HANDLE_TYPE( STRING, string); HANDLE_TYPE(MESSAGE, message); #undef HANDLE_TYPE } } else { if (!is_cleared) { switch (cpp_type(type)) { case WireFormatLite::CPPTYPE_STRING: string_value->clear(); break; case WireFormatLite::CPPTYPE_MESSAGE: if (is_lazy) { lazymessage_value->Clear(); } else { message_value->Clear(); } break; default: // No need to do anything. Get*() will return the default value // as long as is_cleared is true and Set*() will overwrite the // previous value. break; } is_cleared = true; } } } void ExtensionSet::Extension::SerializeFieldWithCachedSizes( int number, io::CodedOutputStream* output) const { if (is_repeated) { if (is_packed) { if (cached_size == 0) return; WireFormatLite::WriteTag(number, WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); output->WriteVarint32(cached_size); switch (real_type(type)) { #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ case WireFormatLite::TYPE_##UPPERCASE: \ for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ WireFormatLite::Write##CAMELCASE##NoTag( \ repeated_##LOWERCASE##_value->Get(i), output); \ } \ break HANDLE_TYPE( INT32, Int32, int32); HANDLE_TYPE( INT64, Int64, int64); HANDLE_TYPE( UINT32, UInt32, uint32); HANDLE_TYPE( UINT64, UInt64, uint64); HANDLE_TYPE( SINT32, SInt32, int32); HANDLE_TYPE( SINT64, SInt64, int64); HANDLE_TYPE( FIXED32, Fixed32, uint32); HANDLE_TYPE( FIXED64, Fixed64, uint64); HANDLE_TYPE(SFIXED32, SFixed32, int32); HANDLE_TYPE(SFIXED64, SFixed64, int64); HANDLE_TYPE( FLOAT, Float, float); HANDLE_TYPE( DOUBLE, Double, double); HANDLE_TYPE( BOOL, Bool, bool); HANDLE_TYPE( ENUM, Enum, enum); #undef HANDLE_TYPE case WireFormatLite::TYPE_STRING: case WireFormatLite::TYPE_BYTES: case WireFormatLite::TYPE_GROUP: case WireFormatLite::TYPE_MESSAGE: GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; break; } } else { switch (real_type(type)) { #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ case WireFormatLite::TYPE_##UPPERCASE: \ for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ WireFormatLite::Write##CAMELCASE(number, \ repeated_##LOWERCASE##_value->Get(i), output); \ } \ break HANDLE_TYPE( INT32, Int32, int32); HANDLE_TYPE( INT64, Int64, int64); HANDLE_TYPE( UINT32, UInt32, uint32); HANDLE_TYPE( UINT64, UInt64, uint64); HANDLE_TYPE( SINT32, SInt32, int32); HANDLE_TYPE( SINT64, SInt64, int64); HANDLE_TYPE( FIXED32, Fixed32, uint32); HANDLE_TYPE( FIXED64, Fixed64, uint64); HANDLE_TYPE(SFIXED32, SFixed32, int32); HANDLE_TYPE(SFIXED64, SFixed64, int64); HANDLE_TYPE( FLOAT, Float, float); HANDLE_TYPE( DOUBLE, Double, double); HANDLE_TYPE( BOOL, Bool, bool); HANDLE_TYPE( STRING, String, string); HANDLE_TYPE( BYTES, Bytes, string); HANDLE_TYPE( ENUM, Enum, enum); HANDLE_TYPE( GROUP, Group, message); HANDLE_TYPE( MESSAGE, Message, message); #undef HANDLE_TYPE } } } else if (!is_cleared) { switch (real_type(type)) { #define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \ case WireFormatLite::TYPE_##UPPERCASE: \ WireFormatLite::Write##CAMELCASE(number, VALUE, output); \ break HANDLE_TYPE( INT32, Int32, int32_value); HANDLE_TYPE( INT64, Int64, int64_value); HANDLE_TYPE( UINT32, UInt32, uint32_value); HANDLE_TYPE( UINT64, UInt64, uint64_value); HANDLE_TYPE( SINT32, SInt32, int32_value); HANDLE_TYPE( SINT64, SInt64, int64_value); HANDLE_TYPE( FIXED32, Fixed32, uint32_value); HANDLE_TYPE( FIXED64, Fixed64, uint64_value); HANDLE_TYPE(SFIXED32, SFixed32, int32_value); HANDLE_TYPE(SFIXED64, SFixed64, int64_value); HANDLE_TYPE( FLOAT, Float, float_value); HANDLE_TYPE( DOUBLE, Double, double_value); HANDLE_TYPE( BOOL, Bool, bool_value); HANDLE_TYPE( STRING, String, *string_value); HANDLE_TYPE( BYTES, Bytes, *string_value); HANDLE_TYPE( ENUM, Enum, enum_value); HANDLE_TYPE( GROUP, Group, *message_value); #undef HANDLE_TYPE case WireFormatLite::TYPE_MESSAGE: if (is_lazy) { lazymessage_value->WriteMessage(number, output); } else { WireFormatLite::WriteMessage(number, *message_value, output); } break; } } } size_t ExtensionSet::Extension::ByteSize(int number) const { size_t result = 0; if (is_repeated) { if (is_packed) { switch (real_type(type)) { #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ case WireFormatLite::TYPE_##UPPERCASE: \ for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ result += WireFormatLite::CAMELCASE##Size( \ repeated_##LOWERCASE##_value->Get(i)); \ } \ break HANDLE_TYPE( INT32, Int32, int32); HANDLE_TYPE( INT64, Int64, int64); HANDLE_TYPE( UINT32, UInt32, uint32); HANDLE_TYPE( UINT64, UInt64, uint64); HANDLE_TYPE( SINT32, SInt32, int32); HANDLE_TYPE( SINT64, SInt64, int64); HANDLE_TYPE( ENUM, Enum, enum); #undef HANDLE_TYPE // Stuff with fixed size. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ case WireFormatLite::TYPE_##UPPERCASE: \ result += WireFormatLite::k##CAMELCASE##Size * \ FromIntSize(repeated_##LOWERCASE##_value->size()); \ break HANDLE_TYPE( FIXED32, Fixed32, uint32); HANDLE_TYPE( FIXED64, Fixed64, uint64); HANDLE_TYPE(SFIXED32, SFixed32, int32); HANDLE_TYPE(SFIXED64, SFixed64, int64); HANDLE_TYPE( FLOAT, Float, float); HANDLE_TYPE( DOUBLE, Double, double); HANDLE_TYPE( BOOL, Bool, bool); #undef HANDLE_TYPE case WireFormatLite::TYPE_STRING: case WireFormatLite::TYPE_BYTES: case WireFormatLite::TYPE_GROUP: case WireFormatLite::TYPE_MESSAGE: GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; break; } cached_size = ToCachedSize(result); if (result > 0) { result += io::CodedOutputStream::VarintSize32(result); result += io::CodedOutputStream::VarintSize32( WireFormatLite::MakeTag(number, WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); } } else { size_t tag_size = WireFormatLite::TagSize(number, real_type(type)); switch (real_type(type)) { #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ case WireFormatLite::TYPE_##UPPERCASE: \ result += tag_size * \ FromIntSize(repeated_##LOWERCASE##_value->size()); \ for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ result += WireFormatLite::CAMELCASE##Size( \ repeated_##LOWERCASE##_value->Get(i)); \ } \ break HANDLE_TYPE( INT32, Int32, int32); HANDLE_TYPE( INT64, Int64, int64); HANDLE_TYPE( UINT32, UInt32, uint32); HANDLE_TYPE( UINT64, UInt64, uint64); HANDLE_TYPE( SINT32, SInt32, int32); HANDLE_TYPE( SINT64, SInt64, int64); HANDLE_TYPE( STRING, String, string); HANDLE_TYPE( BYTES, Bytes, string); HANDLE_TYPE( ENUM, Enum, enum); HANDLE_TYPE( GROUP, Group, message); HANDLE_TYPE( MESSAGE, Message, message); #undef HANDLE_TYPE // Stuff with fixed size. #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ case WireFormatLite::TYPE_##UPPERCASE: \ result += (tag_size + WireFormatLite::k##CAMELCASE##Size) * \ FromIntSize(repeated_##LOWERCASE##_value->size()); \ break HANDLE_TYPE( FIXED32, Fixed32, uint32); HANDLE_TYPE( FIXED64, Fixed64, uint64); HANDLE_TYPE(SFIXED32, SFixed32, int32); HANDLE_TYPE(SFIXED64, SFixed64, int64); HANDLE_TYPE( FLOAT, Float, float); HANDLE_TYPE( DOUBLE, Double, double); HANDLE_TYPE( BOOL, Bool, bool); #undef HANDLE_TYPE } } } else if (!is_cleared) { result += WireFormatLite::TagSize(number, real_type(type)); switch (real_type(type)) { #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ case WireFormatLite::TYPE_##UPPERCASE: \ result += WireFormatLite::CAMELCASE##Size(LOWERCASE); \ break HANDLE_TYPE( INT32, Int32, int32_value); HANDLE_TYPE( INT64, Int64, int64_value); HANDLE_TYPE( UINT32, UInt32, uint32_value); HANDLE_TYPE( UINT64, UInt64, uint64_value); HANDLE_TYPE( SINT32, SInt32, int32_value); HANDLE_TYPE( SINT64, SInt64, int64_value); HANDLE_TYPE( STRING, String, *string_value); HANDLE_TYPE( BYTES, Bytes, *string_value); HANDLE_TYPE( ENUM, Enum, enum_value); HANDLE_TYPE( GROUP, Group, *message_value); #undef HANDLE_TYPE case WireFormatLite::TYPE_MESSAGE: { if (is_lazy) { size_t size = lazymessage_value->ByteSize(); result += io::CodedOutputStream::VarintSize32(size) + size; } else { result += WireFormatLite::MessageSize(*message_value); } break; } // Stuff with fixed size. #define HANDLE_TYPE(UPPERCASE, CAMELCASE) \ case WireFormatLite::TYPE_##UPPERCASE: \ result += WireFormatLite::k##CAMELCASE##Size; \ break HANDLE_TYPE( FIXED32, Fixed32); HANDLE_TYPE( FIXED64, Fixed64); HANDLE_TYPE(SFIXED32, SFixed32); HANDLE_TYPE(SFIXED64, SFixed64); HANDLE_TYPE( FLOAT, Float); HANDLE_TYPE( DOUBLE, Double); HANDLE_TYPE( BOOL, Bool); #undef HANDLE_TYPE } } return result; } int ExtensionSet::Extension::GetSize() const { GOOGLE_DCHECK(is_repeated); switch (cpp_type(type)) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ case WireFormatLite::CPPTYPE_##UPPERCASE: \ return repeated_##LOWERCASE##_value->size() HANDLE_TYPE( INT32, int32); HANDLE_TYPE( INT64, int64); HANDLE_TYPE( UINT32, uint32); HANDLE_TYPE( UINT64, uint64); HANDLE_TYPE( FLOAT, float); HANDLE_TYPE( DOUBLE, double); HANDLE_TYPE( BOOL, bool); HANDLE_TYPE( ENUM, enum); HANDLE_TYPE( STRING, string); HANDLE_TYPE(MESSAGE, message); #undef HANDLE_TYPE } GOOGLE_LOG(FATAL) << "Can't get here."; return 0; } // This function deletes all allocated objects. This function should be only // called if the Extension was created with an arena. void ExtensionSet::Extension::Free() { if (is_repeated) { switch (cpp_type(type)) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ case WireFormatLite::CPPTYPE_##UPPERCASE: \ delete repeated_##LOWERCASE##_value; \ break HANDLE_TYPE( INT32, int32); HANDLE_TYPE( INT64, int64); HANDLE_TYPE( UINT32, uint32); HANDLE_TYPE( UINT64, uint64); HANDLE_TYPE( FLOAT, float); HANDLE_TYPE( DOUBLE, double); HANDLE_TYPE( BOOL, bool); HANDLE_TYPE( ENUM, enum); HANDLE_TYPE( STRING, string); HANDLE_TYPE(MESSAGE, message); #undef HANDLE_TYPE } } else { switch (cpp_type(type)) { case WireFormatLite::CPPTYPE_STRING: delete string_value; break; case WireFormatLite::CPPTYPE_MESSAGE: if (is_lazy) { delete lazymessage_value; } else { delete message_value; } break; default: break; } } } // Defined in extension_set_heavy.cc. // int ExtensionSet::Extension::SpaceUsedExcludingSelf() const // ================================================================== // Default repeated field instances for iterator-compatible accessors GOOGLE_PROTOBUF_DECLARE_ONCE(repeated_primitive_generic_type_traits_once_init_); GOOGLE_PROTOBUF_DECLARE_ONCE(repeated_string_type_traits_once_init_); GOOGLE_PROTOBUF_DECLARE_ONCE(repeated_message_generic_type_traits_once_init_); void RepeatedPrimitiveGenericTypeTraits::InitializeDefaultRepeatedFields() { default_repeated_field_int32_ = new RepeatedField; default_repeated_field_int64_ = new RepeatedField; default_repeated_field_uint32_ = new RepeatedField; default_repeated_field_uint64_ = new RepeatedField; default_repeated_field_double_ = new RepeatedField; default_repeated_field_float_ = new RepeatedField; default_repeated_field_bool_ = new RepeatedField; OnShutdown(&DestroyDefaultRepeatedFields); } void RepeatedPrimitiveGenericTypeTraits::DestroyDefaultRepeatedFields() { delete default_repeated_field_int32_; delete default_repeated_field_int64_; delete default_repeated_field_uint32_; delete default_repeated_field_uint64_; delete default_repeated_field_double_; delete default_repeated_field_float_; delete default_repeated_field_bool_; } void RepeatedStringTypeTraits::InitializeDefaultRepeatedFields() { default_repeated_field_ = new RepeatedFieldType; OnShutdown(&DestroyDefaultRepeatedFields); } void RepeatedStringTypeTraits::DestroyDefaultRepeatedFields() { delete default_repeated_field_; } void RepeatedMessageGenericTypeTraits::InitializeDefaultRepeatedFields() { default_repeated_field_ = new RepeatedFieldType; OnShutdown(&DestroyDefaultRepeatedFields); } void RepeatedMessageGenericTypeTraits::DestroyDefaultRepeatedFields() { delete default_repeated_field_; } const RepeatedField* RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int32_ = NULL; const RepeatedField* RepeatedPrimitiveGenericTypeTraits::default_repeated_field_int64_ = NULL; const RepeatedField* RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint32_ = NULL; const RepeatedField* RepeatedPrimitiveGenericTypeTraits::default_repeated_field_uint64_ = NULL; const RepeatedField* RepeatedPrimitiveGenericTypeTraits::default_repeated_field_double_ = NULL; const RepeatedField* RepeatedPrimitiveGenericTypeTraits::default_repeated_field_float_ = NULL; const RepeatedField* RepeatedPrimitiveGenericTypeTraits::default_repeated_field_bool_ = NULL; const RepeatedStringTypeTraits::RepeatedFieldType* RepeatedStringTypeTraits::default_repeated_field_ = NULL; const RepeatedMessageGenericTypeTraits::RepeatedFieldType* RepeatedMessageGenericTypeTraits::default_repeated_field_ = NULL; } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/extension_set.h000066400000000000000000002123331334102242000303350ustar00rootroot00000000000000// 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. // // This header is logically internal, but is made public because it is used // from protocol-compiler-generated code, which may reside in other components. #ifndef GOOGLE_PROTOBUF_EXTENSION_SET_H__ #define GOOGLE_PROTOBUF_EXTENSION_SET_H__ #include #include #include #include #include #include #include #include namespace google { namespace protobuf { class Arena; class Descriptor; // descriptor.h class FieldDescriptor; // descriptor.h class DescriptorPool; // descriptor.h class MessageLite; // message_lite.h class Message; // message.h class MessageFactory; // message.h class UnknownFieldSet; // unknown_field_set.h namespace io { class CodedInputStream; // coded_stream.h class CodedOutputStream; // coded_stream.h } namespace internal { class FieldSkipper; // wire_format_lite.h } } namespace protobuf { namespace internal { // Used to store values of type WireFormatLite::FieldType without having to // #include wire_format_lite.h. Also, ensures that we use only one byte to // store these values, which is important to keep the layout of // ExtensionSet::Extension small. typedef uint8 FieldType; // A function which, given an integer value, returns true if the number // matches one of the defined values for the corresponding enum type. This // is used with RegisterEnumExtension, below. typedef bool EnumValidityFunc(int number); // Version of the above which takes an argument. This is needed to deal with // extensions that are not compiled in. typedef bool EnumValidityFuncWithArg(const void* arg, int number); // Information about a registered extension. struct ExtensionInfo { inline ExtensionInfo() {} inline ExtensionInfo(FieldType type_param, bool isrepeated, bool ispacked) : type(type_param), is_repeated(isrepeated), is_packed(ispacked), descriptor(NULL) {} FieldType type; bool is_repeated; bool is_packed; struct EnumValidityCheck { EnumValidityFuncWithArg* func; const void* arg; }; union { EnumValidityCheck enum_validity_check; const MessageLite* message_prototype; }; // The descriptor for this extension, if one exists and is known. May be // NULL. Must not be NULL if the descriptor for the extension does not // live in the same pool as the descriptor for the containing type. const FieldDescriptor* descriptor; }; // Abstract interface for an object which looks up extension definitions. Used // when parsing. class LIBPROTOBUF_EXPORT ExtensionFinder { public: virtual ~ExtensionFinder(); // Find the extension with the given containing type and number. virtual bool Find(int number, ExtensionInfo* output) = 0; }; // Implementation of ExtensionFinder which finds extensions defined in .proto // files which have been compiled into the binary. class LIBPROTOBUF_EXPORT GeneratedExtensionFinder : public ExtensionFinder { public: GeneratedExtensionFinder(const MessageLite* containing_type) : containing_type_(containing_type) {} virtual ~GeneratedExtensionFinder() {} // Returns true and fills in *output if found, otherwise returns false. virtual bool Find(int number, ExtensionInfo* output); private: const MessageLite* containing_type_; }; // A FieldSkipper used for parsing MessageSet. class MessageSetFieldSkipper; // Note: extension_set_heavy.cc defines DescriptorPoolExtensionFinder for // finding extensions from a DescriptorPool. // This is an internal helper class intended for use within the protocol buffer // library and generated classes. Clients should not use it directly. Instead, // use the generated accessors such as GetExtension() of the class being // extended. // // This class manages extensions for a protocol message object. The // message's HasExtension(), GetExtension(), MutableExtension(), and // ClearExtension() methods are just thin wrappers around the embedded // ExtensionSet. When parsing, if a tag number is encountered which is // inside one of the message type's extension ranges, the tag is passed // off to the ExtensionSet for parsing. Etc. class LIBPROTOBUF_EXPORT ExtensionSet { public: ExtensionSet(); explicit ExtensionSet(::google::protobuf::Arena* arena); ~ExtensionSet(); // These are called at startup by protocol-compiler-generated code to // register known extensions. The registrations are used by ParseField() // to look up extensions for parsed field numbers. Note that dynamic parsing // does not use ParseField(); only protocol-compiler-generated parsing // methods do. static void RegisterExtension(const MessageLite* containing_type, int number, FieldType type, bool is_repeated, bool is_packed); static void RegisterEnumExtension(const MessageLite* containing_type, int number, FieldType type, bool is_repeated, bool is_packed, EnumValidityFunc* is_valid); static void RegisterMessageExtension(const MessageLite* containing_type, int number, FieldType type, bool is_repeated, bool is_packed, const MessageLite* prototype); // ================================================================= // Add all fields which are currently present to the given vector. This // is useful to implement Reflection::ListFields(). void AppendToList(const Descriptor* containing_type, const DescriptorPool* pool, std::vector* output) const; // ================================================================= // Accessors // // Generated message classes include type-safe templated wrappers around // these methods. Generally you should use those rather than call these // directly, unless you are doing low-level memory management. // // When calling any of these accessors, the extension number requested // MUST exist in the DescriptorPool provided to the constructor. Otherwise, // the method will fail an assert. Normally, though, you would not call // these directly; you would either call the generated accessors of your // message class (e.g. GetExtension()) or you would call the accessors // of the reflection interface. In both cases, it is impossible to // trigger this assert failure: the generated accessors only accept // linked-in extension types as parameters, while the Reflection interface // requires you to provide the FieldDescriptor describing the extension. // // When calling any of these accessors, a protocol-compiler-generated // implementation of the extension corresponding to the number MUST // be linked in, and the FieldDescriptor used to refer to it MUST be // the one generated by that linked-in code. Otherwise, the method will // die on an assert failure. The message objects returned by the message // accessors are guaranteed to be of the correct linked-in type. // // These methods pretty much match Reflection except that: // - They're not virtual. // - They identify fields by number rather than FieldDescriptors. // - They identify enum values using integers rather than descriptors. // - Strings provide Mutable() in addition to Set() accessors. bool Has(int number) const; int ExtensionSize(int number) const; // Size of a repeated extension. int NumExtensions() const; // The number of extensions FieldType ExtensionType(int number) const; void ClearExtension(int number); // singular fields ------------------------------------------------- int32 GetInt32 (int number, int32 default_value) const; int64 GetInt64 (int number, int64 default_value) const; uint32 GetUInt32(int number, uint32 default_value) const; uint64 GetUInt64(int number, uint64 default_value) const; float GetFloat (int number, float default_value) const; double GetDouble(int number, double default_value) const; bool GetBool (int number, bool default_value) const; int GetEnum (int number, int default_value) const; const string & GetString (int number, const string& default_value) const; const MessageLite& GetMessage(int number, const MessageLite& default_value) const; const MessageLite& GetMessage(int number, const Descriptor* message_type, MessageFactory* factory) const; // |descriptor| may be NULL so long as it is known that the descriptor for // the extension lives in the same pool as the descriptor for the containing // type. #define desc const FieldDescriptor* descriptor // avoid line wrapping void SetInt32 (int number, FieldType type, int32 value, desc); void SetInt64 (int number, FieldType type, int64 value, desc); void SetUInt32(int number, FieldType type, uint32 value, desc); void SetUInt64(int number, FieldType type, uint64 value, desc); void SetFloat (int number, FieldType type, float value, desc); void SetDouble(int number, FieldType type, double value, desc); void SetBool (int number, FieldType type, bool value, desc); void SetEnum (int number, FieldType type, int value, desc); void SetString(int number, FieldType type, const string& value, desc); string * MutableString (int number, FieldType type, desc); MessageLite* MutableMessage(int number, FieldType type, const MessageLite& prototype, desc); MessageLite* MutableMessage(const FieldDescriptor* decsriptor, MessageFactory* factory); // Adds the given message to the ExtensionSet, taking ownership of the // message object. Existing message with the same number will be deleted. // If "message" is NULL, this is equivalent to "ClearExtension(number)". void SetAllocatedMessage(int number, FieldType type, const FieldDescriptor* descriptor, MessageLite* message); void UnsafeArenaSetAllocatedMessage(int number, FieldType type, const FieldDescriptor* descriptor, MessageLite* message); MessageLite* ReleaseMessage(int number, const MessageLite& prototype); MessageLite* UnsafeArenaReleaseMessage( int number, const MessageLite& prototype); MessageLite* ReleaseMessage(const FieldDescriptor* descriptor, MessageFactory* factory); MessageLite* UnsafeArenaReleaseMessage(const FieldDescriptor* descriptor, MessageFactory* factory); #undef desc ::google::protobuf::Arena* GetArenaNoVirtual() const { return arena_; } // repeated fields ------------------------------------------------- // Fetches a RepeatedField extension by number; returns |default_value| // if no such extension exists. User should not touch this directly; it is // used by the GetRepeatedExtension() method. const void* GetRawRepeatedField(int number, const void* default_value) const; // Fetches a mutable version of a RepeatedField extension by number, // instantiating one if none exists. Similar to above, user should not use // this directly; it underlies MutableRepeatedExtension(). void* MutableRawRepeatedField(int number, FieldType field_type, bool packed, const FieldDescriptor* desc); // This is an overload of MutableRawRepeatedField to maintain compatibility // with old code using a previous API. This version of // MutableRawRepeatedField() will GOOGLE_CHECK-fail on a missing extension. // (E.g.: borg/clients/internal/proto1/proto2_reflection.cc.) void* MutableRawRepeatedField(int number); int32 GetRepeatedInt32 (int number, int index) const; int64 GetRepeatedInt64 (int number, int index) const; uint32 GetRepeatedUInt32(int number, int index) const; uint64 GetRepeatedUInt64(int number, int index) const; float GetRepeatedFloat (int number, int index) const; double GetRepeatedDouble(int number, int index) const; bool GetRepeatedBool (int number, int index) const; int GetRepeatedEnum (int number, int index) const; const string & GetRepeatedString (int number, int index) const; const MessageLite& GetRepeatedMessage(int number, int index) const; void SetRepeatedInt32 (int number, int index, int32 value); void SetRepeatedInt64 (int number, int index, int64 value); void SetRepeatedUInt32(int number, int index, uint32 value); void SetRepeatedUInt64(int number, int index, uint64 value); void SetRepeatedFloat (int number, int index, float value); void SetRepeatedDouble(int number, int index, double value); void SetRepeatedBool (int number, int index, bool value); void SetRepeatedEnum (int number, int index, int value); void SetRepeatedString(int number, int index, const string& value); string * MutableRepeatedString (int number, int index); MessageLite* MutableRepeatedMessage(int number, int index); #define desc const FieldDescriptor* descriptor // avoid line wrapping void AddInt32 (int number, FieldType type, bool packed, int32 value, desc); void AddInt64 (int number, FieldType type, bool packed, int64 value, desc); void AddUInt32(int number, FieldType type, bool packed, uint32 value, desc); void AddUInt64(int number, FieldType type, bool packed, uint64 value, desc); void AddFloat (int number, FieldType type, bool packed, float value, desc); void AddDouble(int number, FieldType type, bool packed, double value, desc); void AddBool (int number, FieldType type, bool packed, bool value, desc); void AddEnum (int number, FieldType type, bool packed, int value, desc); void AddString(int number, FieldType type, const string& value, desc); string * AddString (int number, FieldType type, desc); MessageLite* AddMessage(int number, FieldType type, const MessageLite& prototype, desc); MessageLite* AddMessage(const FieldDescriptor* descriptor, MessageFactory* factory); void AddAllocatedMessage(const FieldDescriptor* descriptor, MessageLite* new_entry); #undef desc void RemoveLast(int number); MessageLite* ReleaseLast(int number); void SwapElements(int number, int index1, int index2); // ----------------------------------------------------------------- // TODO(kenton): Hardcore memory management accessors // ================================================================= // convenience methods for implementing methods of Message // // These could all be implemented in terms of the other methods of this // class, but providing them here helps keep the generated code size down. void Clear(); void MergeFrom(const ExtensionSet& other); void Swap(ExtensionSet* other); void SwapExtension(ExtensionSet* other, int number); bool IsInitialized() const; // Parses a single extension from the input. The input should start out // positioned immediately after the tag. bool ParseField(uint32 tag, io::CodedInputStream* input, ExtensionFinder* extension_finder, FieldSkipper* field_skipper); // Specific versions for lite or full messages (constructs the appropriate // FieldSkipper automatically). |containing_type| is the default // instance for the containing message; it is used only to look up the // extension by number. See RegisterExtension(), above. Unlike the other // methods of ExtensionSet, this only works for generated message types -- // it looks up extensions registered using RegisterExtension(). bool ParseField(uint32 tag, io::CodedInputStream* input, const MessageLite* containing_type); bool ParseField(uint32 tag, io::CodedInputStream* input, const Message* containing_type, UnknownFieldSet* unknown_fields); bool ParseField(uint32 tag, io::CodedInputStream* input, const MessageLite* containing_type, io::CodedOutputStream* unknown_fields); // Parse an entire message in MessageSet format. Such messages have no // fields, only extensions. bool ParseMessageSet(io::CodedInputStream* input, ExtensionFinder* extension_finder, MessageSetFieldSkipper* field_skipper); // Specific versions for lite or full messages (constructs the appropriate // FieldSkipper automatically). bool ParseMessageSet(io::CodedInputStream* input, const MessageLite* containing_type); bool ParseMessageSet(io::CodedInputStream* input, const Message* containing_type, UnknownFieldSet* unknown_fields); // Write all extension fields with field numbers in the range // [start_field_number, end_field_number) // to the output stream, using the cached sizes computed when ByteSize() was // last called. Note that the range bounds are inclusive-exclusive. void SerializeWithCachedSizes(int start_field_number, int end_field_number, io::CodedOutputStream* output) const; // Same as SerializeWithCachedSizes, but without any bounds checking. // The caller must ensure that target has sufficient capacity for the // serialized extensions. // // Returns a pointer past the last written byte. uint8* InternalSerializeWithCachedSizesToArray(int start_field_number, int end_field_number, bool deterministic, uint8* target) const; // Like above but serializes in MessageSet format. void SerializeMessageSetWithCachedSizes(io::CodedOutputStream* output) const; uint8* InternalSerializeMessageSetWithCachedSizesToArray(bool deterministic, uint8* target) const; // For backward-compatibility, versions of two of the above methods that // serialize deterministically iff SetDefaultSerializationDeterministic() // has been called. uint8* SerializeWithCachedSizesToArray(int start_field_number, int end_field_number, uint8* target) const; uint8* SerializeMessageSetWithCachedSizesToArray(uint8* target) const; // Returns the total serialized size of all the extensions. size_t ByteSize() const; // Like ByteSize() but uses MessageSet format. size_t MessageSetByteSize() const; // Returns (an estimate of) the total number of bytes used for storing the // extensions in memory, excluding sizeof(*this). If the ExtensionSet is // for a lite message (and thus possibly contains lite messages), the results // are undefined (might work, might crash, might corrupt data, might not even // be linked in). It's up to the protocol compiler to avoid calling this on // such ExtensionSets (easy enough since lite messages don't implement // SpaceUsed()). size_t SpaceUsedExcludingSelfLong() const; // This method just calls SpaceUsedExcludingSelfLong() but it can not be // inlined because the definition of SpaceUsedExcludingSelfLong() is not // included in lite runtime and when an inline method refers to it MSVC // will complain about unresolved symbols when building the lite runtime // as .dll. int SpaceUsedExcludingSelf() const; private: // Interface of a lazily parsed singular message extension. class LIBPROTOBUF_EXPORT LazyMessageExtension { public: LazyMessageExtension() {} virtual ~LazyMessageExtension() {} virtual LazyMessageExtension* New(::google::protobuf::Arena* arena) const = 0; virtual const MessageLite& GetMessage( const MessageLite& prototype) const = 0; virtual MessageLite* MutableMessage(const MessageLite& prototype) = 0; virtual void SetAllocatedMessage(MessageLite *message) = 0; virtual void UnsafeArenaSetAllocatedMessage(MessageLite *message) = 0; virtual MessageLite* ReleaseMessage(const MessageLite& prototype) = 0; virtual MessageLite* UnsafeArenaReleaseMessage( const MessageLite& prototype) = 0; virtual bool IsInitialized() const = 0; virtual int ByteSize() const = 0; virtual size_t SpaceUsedLong() const = 0; virtual void MergeFrom(const LazyMessageExtension& other) = 0; virtual void Clear() = 0; virtual bool ReadMessage(const MessageLite& prototype, io::CodedInputStream* input) = 0; virtual void WriteMessage(int number, io::CodedOutputStream* output) const = 0; virtual uint8* WriteMessageToArray(int number, uint8* target) const = 0; virtual uint8* InternalWriteMessageToArray(int number, bool, uint8* target) const { // TODO(gpike): make this pure virtual. This is a placeholder because we // need to update third_party/upb, for example. return WriteMessageToArray(number, target); } private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LazyMessageExtension); }; struct Extension { // The order of these fields packs Extension into 24 bytes when using 8 // byte alignment. Consider this when adding or removing fields here. union { int32 int32_value; int64 int64_value; uint32 uint32_value; uint64 uint64_value; float float_value; double double_value; bool bool_value; int enum_value; string* string_value; MessageLite* message_value; LazyMessageExtension* lazymessage_value; RepeatedField * repeated_int32_value; RepeatedField * repeated_int64_value; RepeatedField * repeated_uint32_value; RepeatedField * repeated_uint64_value; RepeatedField * repeated_float_value; RepeatedField * repeated_double_value; RepeatedField * repeated_bool_value; RepeatedField * repeated_enum_value; RepeatedPtrField* repeated_string_value; RepeatedPtrField* repeated_message_value; }; FieldType type; bool is_repeated; // For singular types, indicates if the extension is "cleared". This // happens when an extension is set and then later cleared by the caller. // We want to keep the Extension object around for reuse, so instead of // removing it from the map, we just set is_cleared = true. This has no // meaning for repeated types; for those, the size of the RepeatedField // simply becomes zero when cleared. bool is_cleared : 4; // For singular message types, indicates whether lazy parsing is enabled // for this extension. This field is only valid when type == TYPE_MESSAGE // and !is_repeated because we only support lazy parsing for singular // message types currently. If is_lazy = true, the extension is stored in // lazymessage_value. Otherwise, the extension will be message_value. bool is_lazy : 4; // For repeated types, this indicates if the [packed=true] option is set. bool is_packed; // For packed fields, the size of the packed data is recorded here when // ByteSize() is called then used during serialization. // TODO(kenton): Use atomic when C++ supports it. mutable int cached_size; // The descriptor for this extension, if one exists and is known. May be // NULL. Must not be NULL if the descriptor for the extension does not // live in the same pool as the descriptor for the containing type. const FieldDescriptor* descriptor; // Some helper methods for operations on a single Extension. void SerializeFieldWithCachedSizes( int number, io::CodedOutputStream* output) const; uint8* InternalSerializeFieldWithCachedSizesToArray( int number, bool deterministic, uint8* target) const; void SerializeMessageSetItemWithCachedSizes( int number, io::CodedOutputStream* output) const; uint8* InternalSerializeMessageSetItemWithCachedSizesToArray( int number, bool deterministic, uint8* target) const; size_t ByteSize(int number) const; size_t MessageSetItemByteSize(int number) const; void Clear(); int GetSize() const; void Free(); size_t SpaceUsedExcludingSelfLong() const; }; typedef std::map ExtensionMap; // Merges existing Extension from other_extension void InternalExtensionMergeFrom(int number, const Extension& other_extension); // Returns true and fills field_number and extension if extension is found. // Note to support packed repeated field compatibility, it also fills whether // the tag on wire is packed, which can be different from // extension->is_packed (whether packed=true is specified). bool FindExtensionInfoFromTag(uint32 tag, ExtensionFinder* extension_finder, int* field_number, ExtensionInfo* extension, bool* was_packed_on_wire); // Returns true and fills extension if extension is found. // Note to support packed repeated field compatibility, it also fills whether // the tag on wire is packed, which can be different from // extension->is_packed (whether packed=true is specified). bool FindExtensionInfoFromFieldNumber(int wire_type, int field_number, ExtensionFinder* extension_finder, ExtensionInfo* extension, bool* was_packed_on_wire); // Parses a single extension from the input. The input should start out // positioned immediately after the wire tag. This method is called in // ParseField() after field number and was_packed_on_wire is extracted from // the wire tag and ExtensionInfo is found by the field number. bool ParseFieldWithExtensionInfo(int field_number, bool was_packed_on_wire, const ExtensionInfo& extension, io::CodedInputStream* input, FieldSkipper* field_skipper); // Like ParseField(), but this method may parse singular message extensions // lazily depending on the value of FLAGS_eagerly_parse_message_sets. bool ParseFieldMaybeLazily(int wire_type, int field_number, io::CodedInputStream* input, ExtensionFinder* extension_finder, MessageSetFieldSkipper* field_skipper); // Gets the extension with the given number, creating it if it does not // already exist. Returns true if the extension did not already exist. bool MaybeNewExtension(int number, const FieldDescriptor* descriptor, Extension** result); // Gets the repeated extension for the given descriptor, creating it if // it does not exist. Extension* MaybeNewRepeatedExtension(const FieldDescriptor* descriptor); // Parse a single MessageSet item -- called just after the item group start // tag has been read. bool ParseMessageSetItem(io::CodedInputStream* input, ExtensionFinder* extension_finder, MessageSetFieldSkipper* field_skipper); // Hack: RepeatedPtrFieldBase declares ExtensionSet as a friend. This // friendship should automatically extend to ExtensionSet::Extension, but // unfortunately some older compilers (e.g. GCC 3.4.4) do not implement this // correctly. So, we must provide helpers for calling methods of that // class. // Defined in extension_set_heavy.cc. static inline size_t RepeatedMessage_SpaceUsedExcludingSelfLong( RepeatedPtrFieldBase* field); // The Extension struct is small enough to be passed by value, so we use it // directly as the value type in the map rather than use pointers. We use // a map rather than hash_map here because we expect most ExtensionSets will // only contain a small number of extensions whereas hash_map is optimized // for 100 elements or more. Also, we want AppendToList() to order fields // by field number. ExtensionMap extensions_; ::google::protobuf::Arena* arena_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionSet); }; // These are just for convenience... inline void ExtensionSet::SetString(int number, FieldType type, const string& value, const FieldDescriptor* descriptor) { MutableString(number, type, descriptor)->assign(value); } inline void ExtensionSet::SetRepeatedString(int number, int index, const string& value) { MutableRepeatedString(number, index)->assign(value); } inline void ExtensionSet::AddString(int number, FieldType type, const string& value, const FieldDescriptor* descriptor) { AddString(number, type, descriptor)->assign(value); } // =================================================================== // Glue for generated extension accessors // ------------------------------------------------------------------- // Template magic // First we have a set of classes representing "type traits" for different // field types. A type traits class knows how to implement basic accessors // for extensions of a particular type given an ExtensionSet. The signature // for a type traits class looks like this: // // class TypeTraits { // public: // typedef ? ConstType; // typedef ? MutableType; // // TypeTraits for singular fields and repeated fields will define the // // symbol "Singular" or "Repeated" respectively. These two symbols will // // be used in extension accessors to distinguish between singular // // extensions and repeated extensions. If the TypeTraits for the passed // // in extension doesn't have the expected symbol defined, it means the // // user is passing a repeated extension to a singular accessor, or the // // opposite. In that case the C++ compiler will generate an error // // message "no matching member function" to inform the user. // typedef ? Singular // typedef ? Repeated // // static inline ConstType Get(int number, const ExtensionSet& set); // static inline void Set(int number, ConstType value, ExtensionSet* set); // static inline MutableType Mutable(int number, ExtensionSet* set); // // // Variants for repeated fields. // static inline ConstType Get(int number, const ExtensionSet& set, // int index); // static inline void Set(int number, int index, // ConstType value, ExtensionSet* set); // static inline MutableType Mutable(int number, int index, // ExtensionSet* set); // static inline void Add(int number, ConstType value, ExtensionSet* set); // static inline MutableType Add(int number, ExtensionSet* set); // This is used by the ExtensionIdentifier constructor to register // the extension at dynamic initialization. // template // static void Register(int number, FieldType type, bool is_packed); // }; // // Not all of these methods make sense for all field types. For example, the // "Mutable" methods only make sense for strings and messages, and the // repeated methods only make sense for repeated types. So, each type // traits class implements only the set of methods from this signature that it // actually supports. This will cause a compiler error if the user tries to // access an extension using a method that doesn't make sense for its type. // For example, if "foo" is an extension of type "optional int32", then if you // try to write code like: // my_message.MutableExtension(foo) // you will get a compile error because PrimitiveTypeTraits does not // have a "Mutable()" method. // ------------------------------------------------------------------- // PrimitiveTypeTraits // Since the ExtensionSet has different methods for each primitive type, // we must explicitly define the methods of the type traits class for each // known type. template class PrimitiveTypeTraits { public: typedef Type ConstType; typedef Type MutableType; typedef PrimitiveTypeTraits Singular; static inline ConstType Get(int number, const ExtensionSet& set, ConstType default_value); static inline void Set(int number, FieldType field_type, ConstType value, ExtensionSet* set); template static void Register(int number, FieldType type, bool is_packed) { ExtensionSet::RegisterExtension(&ExtendeeT::default_instance(), number, type, false, is_packed); } }; template class RepeatedPrimitiveTypeTraits { public: typedef Type ConstType; typedef Type MutableType; typedef RepeatedPrimitiveTypeTraits Repeated; typedef RepeatedField RepeatedFieldType; static inline Type Get(int number, const ExtensionSet& set, int index); static inline void Set(int number, int index, Type value, ExtensionSet* set); static inline void Add(int number, FieldType field_type, bool is_packed, Type value, ExtensionSet* set); static inline const RepeatedField& GetRepeated(int number, const ExtensionSet& set); static inline RepeatedField* MutableRepeated(int number, FieldType field_type, bool is_packed, ExtensionSet* set); static const RepeatedFieldType* GetDefaultRepeatedField(); template static void Register(int number, FieldType type, bool is_packed) { ExtensionSet::RegisterExtension(&ExtendeeT::default_instance(), number, type, true, is_packed); } }; LIBPROTOBUF_EXPORT extern ProtobufOnceType repeated_primitive_generic_type_traits_once_init_; class LIBPROTOBUF_EXPORT RepeatedPrimitiveGenericTypeTraits { private: template friend class RepeatedPrimitiveTypeTraits; static void InitializeDefaultRepeatedFields(); static void DestroyDefaultRepeatedFields(); static const RepeatedField* default_repeated_field_int32_; static const RepeatedField* default_repeated_field_int64_; static const RepeatedField* default_repeated_field_uint32_; static const RepeatedField* default_repeated_field_uint64_; static const RepeatedField* default_repeated_field_double_; static const RepeatedField* default_repeated_field_float_; static const RepeatedField* default_repeated_field_bool_; }; #define PROTOBUF_DEFINE_PRIMITIVE_TYPE(TYPE, METHOD) \ template<> inline TYPE PrimitiveTypeTraits::Get( \ int number, const ExtensionSet& set, TYPE default_value) { \ return set.Get##METHOD(number, default_value); \ } \ template<> inline void PrimitiveTypeTraits::Set( \ int number, FieldType field_type, TYPE value, ExtensionSet* set) { \ set->Set##METHOD(number, field_type, value, NULL); \ } \ \ template<> inline TYPE RepeatedPrimitiveTypeTraits::Get( \ int number, const ExtensionSet& set, int index) { \ return set.GetRepeated##METHOD(number, index); \ } \ template<> inline void RepeatedPrimitiveTypeTraits::Set( \ int number, int index, TYPE value, ExtensionSet* set) { \ set->SetRepeated##METHOD(number, index, value); \ } \ template<> inline void RepeatedPrimitiveTypeTraits::Add( \ int number, FieldType field_type, bool is_packed, \ TYPE value, ExtensionSet* set) { \ set->Add##METHOD(number, field_type, is_packed, value, NULL); \ } \ template<> inline const RepeatedField* \ RepeatedPrimitiveTypeTraits::GetDefaultRepeatedField() { \ ::google::protobuf::GoogleOnceInit( \ &repeated_primitive_generic_type_traits_once_init_, \ &RepeatedPrimitiveGenericTypeTraits::InitializeDefaultRepeatedFields); \ return RepeatedPrimitiveGenericTypeTraits:: \ default_repeated_field_##TYPE##_; \ } \ template<> inline const RepeatedField& \ RepeatedPrimitiveTypeTraits::GetRepeated(int number, \ const ExtensionSet& set) { \ return *reinterpret_cast*>( \ set.GetRawRepeatedField( \ number, GetDefaultRepeatedField())); \ } \ template<> inline RepeatedField* \ RepeatedPrimitiveTypeTraits::MutableRepeated(int number, \ FieldType field_type, \ bool is_packed, \ ExtensionSet* set) { \ return reinterpret_cast*>( \ set->MutableRawRepeatedField(number, field_type, is_packed, NULL)); \ } PROTOBUF_DEFINE_PRIMITIVE_TYPE( int32, Int32) PROTOBUF_DEFINE_PRIMITIVE_TYPE( int64, Int64) PROTOBUF_DEFINE_PRIMITIVE_TYPE(uint32, UInt32) PROTOBUF_DEFINE_PRIMITIVE_TYPE(uint64, UInt64) PROTOBUF_DEFINE_PRIMITIVE_TYPE( float, Float) PROTOBUF_DEFINE_PRIMITIVE_TYPE(double, Double) PROTOBUF_DEFINE_PRIMITIVE_TYPE( bool, Bool) #undef PROTOBUF_DEFINE_PRIMITIVE_TYPE // ------------------------------------------------------------------- // StringTypeTraits // Strings support both Set() and Mutable(). class LIBPROTOBUF_EXPORT StringTypeTraits { public: typedef const string& ConstType; typedef string* MutableType; typedef StringTypeTraits Singular; static inline const string& Get(int number, const ExtensionSet& set, ConstType default_value) { return set.GetString(number, default_value); } static inline void Set(int number, FieldType field_type, const string& value, ExtensionSet* set) { set->SetString(number, field_type, value, NULL); } static inline string* Mutable(int number, FieldType field_type, ExtensionSet* set) { return set->MutableString(number, field_type, NULL); } template static void Register(int number, FieldType type, bool is_packed) { ExtensionSet::RegisterExtension(&ExtendeeT::default_instance(), number, type, false, is_packed); } }; LIBPROTOBUF_EXPORT extern ProtobufOnceType repeated_string_type_traits_once_init_; class LIBPROTOBUF_EXPORT RepeatedStringTypeTraits { public: typedef const string& ConstType; typedef string* MutableType; typedef RepeatedStringTypeTraits Repeated; typedef RepeatedPtrField RepeatedFieldType; static inline const string& Get(int number, const ExtensionSet& set, int index) { return set.GetRepeatedString(number, index); } static inline void Set(int number, int index, const string& value, ExtensionSet* set) { set->SetRepeatedString(number, index, value); } static inline string* Mutable(int number, int index, ExtensionSet* set) { return set->MutableRepeatedString(number, index); } static inline void Add(int number, FieldType field_type, bool /*is_packed*/, const string& value, ExtensionSet* set) { set->AddString(number, field_type, value, NULL); } static inline string* Add(int number, FieldType field_type, ExtensionSet* set) { return set->AddString(number, field_type, NULL); } static inline const RepeatedPtrField& GetRepeated(int number, const ExtensionSet& set) { return *reinterpret_cast*>( set.GetRawRepeatedField(number, GetDefaultRepeatedField())); } static inline RepeatedPtrField* MutableRepeated(int number, FieldType field_type, bool is_packed, ExtensionSet* set) { return reinterpret_cast*>( set->MutableRawRepeatedField(number, field_type, is_packed, NULL)); } static const RepeatedFieldType* GetDefaultRepeatedField() { ::google::protobuf::GoogleOnceInit(&repeated_string_type_traits_once_init_, &InitializeDefaultRepeatedFields); return default_repeated_field_; } template static void Register(int number, FieldType type, bool is_packed) { ExtensionSet::RegisterExtension(&ExtendeeT::default_instance(), number, type, true, is_packed); } private: static void InitializeDefaultRepeatedFields(); static void DestroyDefaultRepeatedFields(); static const RepeatedFieldType *default_repeated_field_; }; // ------------------------------------------------------------------- // EnumTypeTraits // ExtensionSet represents enums using integers internally, so we have to // static_cast around. template class EnumTypeTraits { public: typedef Type ConstType; typedef Type MutableType; typedef EnumTypeTraits Singular; static inline ConstType Get(int number, const ExtensionSet& set, ConstType default_value) { return static_cast(set.GetEnum(number, default_value)); } static inline void Set(int number, FieldType field_type, ConstType value, ExtensionSet* set) { GOOGLE_DCHECK(IsValid(value)); set->SetEnum(number, field_type, value, NULL); } template static void Register(int number, FieldType type, bool is_packed) { ExtensionSet::RegisterEnumExtension(&ExtendeeT::default_instance(), number, type, false, is_packed, IsValid); } }; template class RepeatedEnumTypeTraits { public: typedef Type ConstType; typedef Type MutableType; typedef RepeatedEnumTypeTraits Repeated; typedef RepeatedField RepeatedFieldType; static inline ConstType Get(int number, const ExtensionSet& set, int index) { return static_cast(set.GetRepeatedEnum(number, index)); } static inline void Set(int number, int index, ConstType value, ExtensionSet* set) { GOOGLE_DCHECK(IsValid(value)); set->SetRepeatedEnum(number, index, value); } static inline void Add(int number, FieldType field_type, bool is_packed, ConstType value, ExtensionSet* set) { GOOGLE_DCHECK(IsValid(value)); set->AddEnum(number, field_type, is_packed, value, NULL); } static inline const RepeatedField& GetRepeated(int number, const ExtensionSet& set) { // Hack: the `Extension` struct stores a RepeatedField for enums. // RepeatedField cannot implicitly convert to RepeatedField // so we need to do some casting magic. See message.h for similar // contortions for non-extension fields. return *reinterpret_cast*>( set.GetRawRepeatedField(number, GetDefaultRepeatedField())); } static inline RepeatedField* MutableRepeated(int number, FieldType field_type, bool is_packed, ExtensionSet* set) { return reinterpret_cast*>( set->MutableRawRepeatedField(number, field_type, is_packed, NULL)); } static const RepeatedFieldType* GetDefaultRepeatedField() { // Hack: as noted above, repeated enum fields are internally stored as a // RepeatedField. We need to be able to instantiate global static // objects to return as default (empty) repeated fields on non-existent // extensions. We would not be able to know a-priori all of the enum types // (values of |Type|) to instantiate all of these, so we just re-use int32's // default repeated field object. return reinterpret_cast*>( RepeatedPrimitiveTypeTraits::GetDefaultRepeatedField()); } template static void Register(int number, FieldType type, bool is_packed) { ExtensionSet::RegisterEnumExtension(&ExtendeeT::default_instance(), number, type, true, is_packed, IsValid); } }; // ------------------------------------------------------------------- // MessageTypeTraits // ExtensionSet guarantees that when manipulating extensions with message // types, the implementation used will be the compiled-in class representing // that type. So, we can static_cast down to the exact type we expect. template class MessageTypeTraits { public: typedef const Type& ConstType; typedef Type* MutableType; typedef MessageTypeTraits Singular; static inline ConstType Get(int number, const ExtensionSet& set, ConstType default_value) { return static_cast( set.GetMessage(number, default_value)); } static inline MutableType Mutable(int number, FieldType field_type, ExtensionSet* set) { return static_cast( set->MutableMessage(number, field_type, Type::default_instance(), NULL)); } static inline void SetAllocated(int number, FieldType field_type, MutableType message, ExtensionSet* set) { set->SetAllocatedMessage(number, field_type, NULL, message); } static inline void UnsafeArenaSetAllocated(int number, FieldType field_type, MutableType message, ExtensionSet* set) { set->UnsafeArenaSetAllocatedMessage(number, field_type, NULL, message); } static inline MutableType Release(int number, FieldType /* field_type */, ExtensionSet* set) { return static_cast(set->ReleaseMessage( number, Type::default_instance())); } static inline MutableType UnsafeArenaRelease(int number, FieldType /* field_type */, ExtensionSet* set) { return static_cast(set->UnsafeArenaReleaseMessage( number, Type::default_instance())); } template static void Register(int number, FieldType type, bool is_packed) { ExtensionSet::RegisterMessageExtension(&ExtendeeT::default_instance(), number, type, false, is_packed, &Type::default_instance()); } }; // forward declaration class RepeatedMessageGenericTypeTraits; template class RepeatedMessageTypeTraits { public: typedef const Type& ConstType; typedef Type* MutableType; typedef RepeatedMessageTypeTraits Repeated; typedef RepeatedPtrField RepeatedFieldType; static inline ConstType Get(int number, const ExtensionSet& set, int index) { return static_cast(set.GetRepeatedMessage(number, index)); } static inline MutableType Mutable(int number, int index, ExtensionSet* set) { return static_cast(set->MutableRepeatedMessage(number, index)); } static inline MutableType Add(int number, FieldType field_type, ExtensionSet* set) { return static_cast( set->AddMessage(number, field_type, Type::default_instance(), NULL)); } static inline const RepeatedPtrField& GetRepeated(int number, const ExtensionSet& set) { // See notes above in RepeatedEnumTypeTraits::GetRepeated(): same // casting hack applies here, because a RepeatedPtrField // cannot naturally become a RepeatedPtrType even though Type is // presumably a message. google::protobuf::Message goes through similar contortions // with a reinterpret_cast<>. return *reinterpret_cast*>( set.GetRawRepeatedField(number, GetDefaultRepeatedField())); } static inline RepeatedPtrField* MutableRepeated(int number, FieldType field_type, bool is_packed, ExtensionSet* set) { return reinterpret_cast*>( set->MutableRawRepeatedField(number, field_type, is_packed, NULL)); } static const RepeatedFieldType* GetDefaultRepeatedField(); template static void Register(int number, FieldType type, bool is_packed) { ExtensionSet::RegisterMessageExtension(&ExtendeeT::default_instance(), number, type, true, is_packed, &Type::default_instance()); } }; LIBPROTOBUF_EXPORT extern ProtobufOnceType repeated_message_generic_type_traits_once_init_; // This class exists only to hold a generic default empty repeated field for all // message-type repeated field extensions. class LIBPROTOBUF_EXPORT RepeatedMessageGenericTypeTraits { public: typedef RepeatedPtrField< ::google::protobuf::MessageLite*> RepeatedFieldType; private: template friend class RepeatedMessageTypeTraits; static void InitializeDefaultRepeatedFields(); static void DestroyDefaultRepeatedFields(); static const RepeatedFieldType* default_repeated_field_; }; template inline const typename RepeatedMessageTypeTraits::RepeatedFieldType* RepeatedMessageTypeTraits::GetDefaultRepeatedField() { ::google::protobuf::GoogleOnceInit( &repeated_message_generic_type_traits_once_init_, &RepeatedMessageGenericTypeTraits::InitializeDefaultRepeatedFields); return reinterpret_cast( RepeatedMessageGenericTypeTraits::default_repeated_field_); } // ------------------------------------------------------------------- // ExtensionIdentifier // This is the type of actual extension objects. E.g. if you have: // extends Foo with optional int32 bar = 1234; // then "bar" will be defined in C++ as: // ExtensionIdentifier, 1, false> bar(1234); // // Note that we could, in theory, supply the field number as a template // parameter, and thus make an instance of ExtensionIdentifier have no // actual contents. However, if we did that, then using at extension // identifier would not necessarily cause the compiler to output any sort // of reference to any symbol defined in the extension's .pb.o file. Some // linkers will actually drop object files that are not explicitly referenced, // but that would be bad because it would cause this extension to not be // registered at static initialization, and therefore using it would crash. template class ExtensionIdentifier { public: typedef TypeTraitsType TypeTraits; typedef ExtendeeType Extendee; ExtensionIdentifier(int number, typename TypeTraits::ConstType default_value) : number_(number), default_value_(default_value) { Register(number); } inline int number() const { return number_; } typename TypeTraits::ConstType default_value() const { return default_value_; } static void Register(int number) { TypeTraits::template Register(number, field_type, is_packed); } private: const int number_; typename TypeTraits::ConstType default_value_; }; // ------------------------------------------------------------------- // Generated accessors // This macro should be expanded in the context of a generated type which // has extensions. // // We use "_proto_TypeTraits" as a type name below because "TypeTraits" // causes problems if the class has a nested message or enum type with that // name and "_TypeTraits" is technically reserved for the C++ library since // it starts with an underscore followed by a capital letter. // // For similar reason, we use "_field_type" and "_is_packed" as parameter names // below, so that "field_type" and "is_packed" can be used as field names. #define GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(CLASSNAME) \ /* Has, Size, Clear */ \ template \ inline bool HasExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ return _extensions_.Has(id.number()); \ } \ \ template \ inline void ClearExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ _extensions_.ClearExtension(id.number()); \ } \ \ template \ inline int ExtensionSize( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ return _extensions_.ExtensionSize(id.number()); \ } \ \ /* Singular accessors */ \ template \ inline typename _proto_TypeTraits::Singular::ConstType GetExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ return _proto_TypeTraits::Get(id.number(), _extensions_, \ id.default_value()); \ } \ \ template \ inline typename _proto_TypeTraits::Singular::MutableType MutableExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ return _proto_TypeTraits::Mutable(id.number(), _field_type, \ &_extensions_); \ } \ \ template \ inline void SetExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ typename _proto_TypeTraits::Singular::ConstType value) { \ _proto_TypeTraits::Set(id.number(), _field_type, value, &_extensions_); \ } \ \ template \ inline void SetAllocatedExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ typename _proto_TypeTraits::Singular::MutableType value) { \ _proto_TypeTraits::SetAllocated(id.number(), _field_type, \ value, &_extensions_); \ } \ template \ inline void UnsafeArenaSetAllocatedExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ typename _proto_TypeTraits::Singular::MutableType value) { \ _proto_TypeTraits::UnsafeArenaSetAllocated(id.number(), _field_type, \ value, &_extensions_); \ } \ template \ inline typename _proto_TypeTraits::Singular::MutableType ReleaseExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ return _proto_TypeTraits::Release(id.number(), _field_type, \ &_extensions_); \ } \ template \ inline typename _proto_TypeTraits::Singular::MutableType \ UnsafeArenaReleaseExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ return _proto_TypeTraits::UnsafeArenaRelease(id.number(), _field_type, \ &_extensions_); \ } \ \ /* Repeated accessors */ \ template \ inline typename _proto_TypeTraits::Repeated::ConstType GetExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ int index) const { \ return _proto_TypeTraits::Get(id.number(), _extensions_, index); \ } \ \ template \ inline typename _proto_TypeTraits::Repeated::MutableType MutableExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ int index) { \ return _proto_TypeTraits::Mutable(id.number(), index, &_extensions_); \ } \ \ template \ inline void SetExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ int index, typename _proto_TypeTraits::Repeated::ConstType value) { \ _proto_TypeTraits::Set(id.number(), index, value, &_extensions_); \ } \ \ template \ inline typename _proto_TypeTraits::Repeated::MutableType AddExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ return _proto_TypeTraits::Add(id.number(), _field_type, &_extensions_); \ } \ \ template \ inline void AddExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ typename _proto_TypeTraits::Repeated::ConstType value) { \ _proto_TypeTraits::Add(id.number(), _field_type, _is_packed, \ value, &_extensions_); \ } \ \ template \ inline const typename _proto_TypeTraits::Repeated::RepeatedFieldType& \ GetRepeatedExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, \ _is_packed>& id) const { \ return _proto_TypeTraits::GetRepeated(id.number(), _extensions_); \ } \ \ template \ inline typename _proto_TypeTraits::Repeated::RepeatedFieldType* \ MutableRepeatedExtension( \ const ::google::protobuf::internal::ExtensionIdentifier< \ CLASSNAME, _proto_TypeTraits, _field_type, \ _is_packed>& id) { \ return _proto_TypeTraits::MutableRepeated(id.number(), _field_type, \ _is_packed, &_extensions_); \ } } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_EXTENSION_SET_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/extension_set_heavy.cc000066400000000000000000000743311334102242000316730ustar00rootroot00000000000000// 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. // // Contains methods defined in extension_set.h which cannot be part of the // lite library because they use descriptors or reflection. #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { // A FieldSkipper used to store unknown MessageSet fields into UnknownFieldSet. class MessageSetFieldSkipper : public UnknownFieldSetFieldSkipper { public: explicit MessageSetFieldSkipper(UnknownFieldSet* unknown_fields) : UnknownFieldSetFieldSkipper(unknown_fields) {} virtual ~MessageSetFieldSkipper() {} virtual bool SkipMessageSetField(io::CodedInputStream* input, int field_number); }; bool MessageSetFieldSkipper::SkipMessageSetField( io::CodedInputStream* input, int field_number) { uint32 length; if (!input->ReadVarint32(&length)) return false; if (unknown_fields_ == NULL) { return input->Skip(length); } else { return input->ReadString( unknown_fields_->AddLengthDelimited(field_number), length); } } // Implementation of ExtensionFinder which finds extensions in a given // DescriptorPool, using the given MessageFactory to construct sub-objects. // This class is implemented in extension_set_heavy.cc. class DescriptorPoolExtensionFinder : public ExtensionFinder { public: DescriptorPoolExtensionFinder(const DescriptorPool* pool, MessageFactory* factory, const Descriptor* containing_type) : pool_(pool), factory_(factory), containing_type_(containing_type) {} virtual ~DescriptorPoolExtensionFinder() {} virtual bool Find(int number, ExtensionInfo* output); private: const DescriptorPool* pool_; MessageFactory* factory_; const Descriptor* containing_type_; }; void ExtensionSet::AppendToList( const Descriptor* containing_type, const DescriptorPool* pool, std::vector* output) const { for (ExtensionMap::const_iterator iter = extensions_.begin(); iter != extensions_.end(); ++iter) { bool has = false; if (iter->second.is_repeated) { has = iter->second.GetSize() > 0; } else { has = !iter->second.is_cleared; } if (has) { // TODO(kenton): Looking up each field by number is somewhat unfortunate. // Is there a better way? The problem is that descriptors are lazily- // initialized, so they might not even be constructed until // AppendToList() is called. if (iter->second.descriptor == NULL) { output->push_back(pool->FindExtensionByNumber( containing_type, iter->first)); } else { output->push_back(iter->second.descriptor); } } } } inline FieldDescriptor::Type real_type(FieldType type) { GOOGLE_DCHECK(type > 0 && type <= FieldDescriptor::MAX_TYPE); return static_cast(type); } inline FieldDescriptor::CppType cpp_type(FieldType type) { return FieldDescriptor::TypeToCppType( static_cast(type)); } inline WireFormatLite::FieldType field_type(FieldType type) { GOOGLE_DCHECK(type > 0 && type <= WireFormatLite::MAX_FIELD_TYPE); return static_cast(type); } #define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \ GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? FieldDescriptor::LABEL_REPEATED \ : FieldDescriptor::LABEL_OPTIONAL, \ FieldDescriptor::LABEL_##LABEL); \ GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), FieldDescriptor::CPPTYPE_##CPPTYPE) const MessageLite& ExtensionSet::GetMessage(int number, const Descriptor* message_type, MessageFactory* factory) const { ExtensionMap::const_iterator iter = extensions_.find(number); if (iter == extensions_.end() || iter->second.is_cleared) { // Not present. Return the default value. return *factory->GetPrototype(message_type); } else { GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); if (iter->second.is_lazy) { return iter->second.lazymessage_value->GetMessage( *factory->GetPrototype(message_type)); } else { return *iter->second.message_value; } } } MessageLite* ExtensionSet::MutableMessage(const FieldDescriptor* descriptor, MessageFactory* factory) { Extension* extension; if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) { extension->type = descriptor->type(); GOOGLE_DCHECK_EQ(cpp_type(extension->type), FieldDescriptor::CPPTYPE_MESSAGE); extension->is_repeated = false; extension->is_packed = false; const MessageLite* prototype = factory->GetPrototype(descriptor->message_type()); extension->is_lazy = false; extension->message_value = prototype->New(arena_); extension->is_cleared = false; return extension->message_value; } else { GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); extension->is_cleared = false; if (extension->is_lazy) { return extension->lazymessage_value->MutableMessage( *factory->GetPrototype(descriptor->message_type())); } else { return extension->message_value; } } } MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor, MessageFactory* factory) { ExtensionMap::iterator iter = extensions_.find(descriptor->number()); if (iter == extensions_.end()) { // Not present. Return NULL. return NULL; } else { GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); MessageLite* ret = NULL; if (iter->second.is_lazy) { ret = iter->second.lazymessage_value->ReleaseMessage( *factory->GetPrototype(descriptor->message_type())); if (arena_ == NULL) { delete iter->second.lazymessage_value; } } else { if (arena_ != NULL) { ret = (iter->second.message_value)->New(); ret->CheckTypeAndMergeFrom(*(iter->second.message_value)); } else { ret = iter->second.message_value; } } extensions_.erase(descriptor->number()); return ret; } } MessageLite* ExtensionSet::UnsafeArenaReleaseMessage( const FieldDescriptor* descriptor, MessageFactory* factory) { ExtensionMap::iterator iter = extensions_.find(descriptor->number()); if (iter == extensions_.end()) { // Not present. Return NULL. return NULL; } else { GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); MessageLite* ret = NULL; if (iter->second.is_lazy) { ret = iter->second.lazymessage_value->UnsafeArenaReleaseMessage( *factory->GetPrototype(descriptor->message_type())); if (arena_ == NULL) { delete iter->second.lazymessage_value; } } else { ret = iter->second.message_value; } extensions_.erase(descriptor->number()); return ret; } } ExtensionSet::Extension* ExtensionSet::MaybeNewRepeatedExtension(const FieldDescriptor* descriptor) { Extension* extension; if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) { extension->type = descriptor->type(); GOOGLE_DCHECK_EQ(cpp_type(extension->type), FieldDescriptor::CPPTYPE_MESSAGE); extension->is_repeated = true; extension->repeated_message_value = ::google::protobuf::Arena::CreateMessage >(arena_); } else { GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE); } return extension; } MessageLite* ExtensionSet::AddMessage(const FieldDescriptor* descriptor, MessageFactory* factory) { Extension* extension = MaybeNewRepeatedExtension(descriptor); // RepeatedPtrField does not know how to Add() since it cannot // allocate an abstract object, so we have to be tricky. MessageLite* result = extension->repeated_message_value ->AddFromCleared >(); if (result == NULL) { const MessageLite* prototype; if (extension->repeated_message_value->size() == 0) { prototype = factory->GetPrototype(descriptor->message_type()); GOOGLE_CHECK(prototype != NULL); } else { prototype = &extension->repeated_message_value->Get(0); } result = prototype->New(arena_); extension->repeated_message_value->AddAllocated(result); } return result; } void ExtensionSet::AddAllocatedMessage(const FieldDescriptor* descriptor, MessageLite* new_entry) { Extension* extension = MaybeNewRepeatedExtension(descriptor); extension->repeated_message_value->AddAllocated(new_entry); } static bool ValidateEnumUsingDescriptor(const void* arg, int number) { return reinterpret_cast(arg) ->FindValueByNumber(number) != NULL; } bool DescriptorPoolExtensionFinder::Find(int number, ExtensionInfo* output) { const FieldDescriptor* extension = pool_->FindExtensionByNumber(containing_type_, number); if (extension == NULL) { return false; } else { output->type = extension->type(); output->is_repeated = extension->is_repeated(); output->is_packed = extension->options().packed(); output->descriptor = extension; if (extension->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { output->message_prototype = factory_->GetPrototype(extension->message_type()); GOOGLE_CHECK(output->message_prototype != NULL) << "Extension factory's GetPrototype() returned NULL for extension: " << extension->full_name(); } else if (extension->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { output->enum_validity_check.func = ValidateEnumUsingDescriptor; output->enum_validity_check.arg = extension->enum_type(); } return true; } } bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, const Message* containing_type, UnknownFieldSet* unknown_fields) { UnknownFieldSetFieldSkipper skipper(unknown_fields); if (input->GetExtensionPool() == NULL) { GeneratedExtensionFinder finder(containing_type); return ParseField(tag, input, &finder, &skipper); } else { DescriptorPoolExtensionFinder finder(input->GetExtensionPool(), input->GetExtensionFactory(), containing_type->GetDescriptor()); return ParseField(tag, input, &finder, &skipper); } } bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, const Message* containing_type, UnknownFieldSet* unknown_fields) { MessageSetFieldSkipper skipper(unknown_fields); if (input->GetExtensionPool() == NULL) { GeneratedExtensionFinder finder(containing_type); return ParseMessageSet(input, &finder, &skipper); } else { DescriptorPoolExtensionFinder finder(input->GetExtensionPool(), input->GetExtensionFactory(), containing_type->GetDescriptor()); return ParseMessageSet(input, &finder, &skipper); } } int ExtensionSet::SpaceUsedExcludingSelf() const { return internal::FromIntSize(SpaceUsedExcludingSelfLong()); } size_t ExtensionSet::SpaceUsedExcludingSelfLong() const { size_t total_size = extensions_.size() * sizeof(ExtensionMap::value_type); for (ExtensionMap::const_iterator iter = extensions_.begin(), end = extensions_.end(); iter != end; ++iter) { total_size += iter->second.SpaceUsedExcludingSelfLong(); } return total_size; } inline size_t ExtensionSet::RepeatedMessage_SpaceUsedExcludingSelfLong( RepeatedPtrFieldBase* field) { return field->SpaceUsedExcludingSelfLong >(); } size_t ExtensionSet::Extension::SpaceUsedExcludingSelfLong() const { size_t total_size = 0; if (is_repeated) { switch (cpp_type(type)) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ case FieldDescriptor::CPPTYPE_##UPPERCASE: \ total_size += sizeof(*repeated_##LOWERCASE##_value) + \ repeated_##LOWERCASE##_value->SpaceUsedExcludingSelfLong(); \ break HANDLE_TYPE( INT32, int32); HANDLE_TYPE( INT64, int64); HANDLE_TYPE( UINT32, uint32); HANDLE_TYPE( UINT64, uint64); HANDLE_TYPE( FLOAT, float); HANDLE_TYPE( DOUBLE, double); HANDLE_TYPE( BOOL, bool); HANDLE_TYPE( ENUM, enum); HANDLE_TYPE( STRING, string); #undef HANDLE_TYPE case FieldDescriptor::CPPTYPE_MESSAGE: // repeated_message_value is actually a RepeatedPtrField, // but MessageLite has no SpaceUsedLong(), so we must directly call // RepeatedPtrFieldBase::SpaceUsedExcludingSelfLong() with a different // type handler. total_size += sizeof(*repeated_message_value) + RepeatedMessage_SpaceUsedExcludingSelfLong(repeated_message_value); break; } } else { switch (cpp_type(type)) { case FieldDescriptor::CPPTYPE_STRING: total_size += sizeof(*string_value) + StringSpaceUsedExcludingSelfLong(*string_value); break; case FieldDescriptor::CPPTYPE_MESSAGE: if (is_lazy) { total_size += lazymessage_value->SpaceUsedLong(); } else { total_size += down_cast(message_value)->SpaceUsedLong(); } break; default: // No extra storage costs for primitive types. break; } } return total_size; } // The Serialize*ToArray methods are only needed in the heavy library, as // the lite library only generates SerializeWithCachedSizes. uint8* ExtensionSet::SerializeWithCachedSizesToArray(int start_field_number, int end_field_number, uint8* target) const { return InternalSerializeWithCachedSizesToArray( start_field_number, end_field_number, google::protobuf::io::CodedOutputStream::IsDefaultSerializationDeterministic(), target); } uint8* ExtensionSet::SerializeMessageSetWithCachedSizesToArray( uint8* target) const { return InternalSerializeMessageSetWithCachedSizesToArray( google::protobuf::io::CodedOutputStream::IsDefaultSerializationDeterministic(), target); } uint8* ExtensionSet::InternalSerializeWithCachedSizesToArray( int start_field_number, int end_field_number, bool deterministic, uint8* target) const { ExtensionMap::const_iterator iter; for (iter = extensions_.lower_bound(start_field_number); iter != extensions_.end() && iter->first < end_field_number; ++iter) { target = iter->second.InternalSerializeFieldWithCachedSizesToArray( iter->first, deterministic, target); } return target; } uint8* ExtensionSet::InternalSerializeMessageSetWithCachedSizesToArray( bool deterministic, uint8* target) const { ExtensionMap::const_iterator iter; for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) { target = iter->second.InternalSerializeMessageSetItemWithCachedSizesToArray( iter->first, deterministic, target); } return target; } uint8* ExtensionSet::Extension::InternalSerializeFieldWithCachedSizesToArray( int number, bool deterministic, uint8* target) const { if (is_repeated) { if (is_packed) { if (cached_size == 0) return target; target = WireFormatLite::WriteTagToArray(number, WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target); target = WireFormatLite::WriteInt32NoTagToArray(cached_size, target); switch (real_type(type)) { #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ case FieldDescriptor::TYPE_##UPPERCASE: \ for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ target = WireFormatLite::Write##CAMELCASE##NoTagToArray( \ repeated_##LOWERCASE##_value->Get(i), target); \ } \ break HANDLE_TYPE( INT32, Int32, int32); HANDLE_TYPE( INT64, Int64, int64); HANDLE_TYPE( UINT32, UInt32, uint32); HANDLE_TYPE( UINT64, UInt64, uint64); HANDLE_TYPE( SINT32, SInt32, int32); HANDLE_TYPE( SINT64, SInt64, int64); HANDLE_TYPE( FIXED32, Fixed32, uint32); HANDLE_TYPE( FIXED64, Fixed64, uint64); HANDLE_TYPE(SFIXED32, SFixed32, int32); HANDLE_TYPE(SFIXED64, SFixed64, int64); HANDLE_TYPE( FLOAT, Float, float); HANDLE_TYPE( DOUBLE, Double, double); HANDLE_TYPE( BOOL, Bool, bool); HANDLE_TYPE( ENUM, Enum, enum); #undef HANDLE_TYPE case FieldDescriptor::TYPE_STRING: case FieldDescriptor::TYPE_BYTES: case FieldDescriptor::TYPE_GROUP: case FieldDescriptor::TYPE_MESSAGE: GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; break; } } else { switch (real_type(type)) { #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ case FieldDescriptor::TYPE_##UPPERCASE: \ for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ target = WireFormatLite::Write##CAMELCASE##ToArray(number, \ repeated_##LOWERCASE##_value->Get(i), target); \ } \ break HANDLE_TYPE( INT32, Int32, int32); HANDLE_TYPE( INT64, Int64, int64); HANDLE_TYPE( UINT32, UInt32, uint32); HANDLE_TYPE( UINT64, UInt64, uint64); HANDLE_TYPE( SINT32, SInt32, int32); HANDLE_TYPE( SINT64, SInt64, int64); HANDLE_TYPE( FIXED32, Fixed32, uint32); HANDLE_TYPE( FIXED64, Fixed64, uint64); HANDLE_TYPE(SFIXED32, SFixed32, int32); HANDLE_TYPE(SFIXED64, SFixed64, int64); HANDLE_TYPE( FLOAT, Float, float); HANDLE_TYPE( DOUBLE, Double, double); HANDLE_TYPE( BOOL, Bool, bool); HANDLE_TYPE( STRING, String, string); HANDLE_TYPE( BYTES, Bytes, string); HANDLE_TYPE( ENUM, Enum, enum); #undef HANDLE_TYPE #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ case FieldDescriptor::TYPE_##UPPERCASE: \ for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ target = WireFormatLite::InternalWrite##CAMELCASE##ToArray( \ number, repeated_##LOWERCASE##_value->Get(i), \ deterministic, target); \ } \ break HANDLE_TYPE( GROUP, Group, message); HANDLE_TYPE( MESSAGE, Message, message); #undef HANDLE_TYPE } } } else if (!is_cleared) { switch (real_type(type)) { #define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \ case FieldDescriptor::TYPE_##UPPERCASE: \ target = WireFormatLite::Write##CAMELCASE##ToArray( \ number, VALUE, target); \ break HANDLE_TYPE( INT32, Int32, int32_value); HANDLE_TYPE( INT64, Int64, int64_value); HANDLE_TYPE( UINT32, UInt32, uint32_value); HANDLE_TYPE( UINT64, UInt64, uint64_value); HANDLE_TYPE( SINT32, SInt32, int32_value); HANDLE_TYPE( SINT64, SInt64, int64_value); HANDLE_TYPE( FIXED32, Fixed32, uint32_value); HANDLE_TYPE( FIXED64, Fixed64, uint64_value); HANDLE_TYPE(SFIXED32, SFixed32, int32_value); HANDLE_TYPE(SFIXED64, SFixed64, int64_value); HANDLE_TYPE( FLOAT, Float, float_value); HANDLE_TYPE( DOUBLE, Double, double_value); HANDLE_TYPE( BOOL, Bool, bool_value); HANDLE_TYPE( STRING, String, *string_value); HANDLE_TYPE( BYTES, Bytes, *string_value); HANDLE_TYPE( ENUM, Enum, enum_value); HANDLE_TYPE( GROUP, Group, *message_value); #undef HANDLE_TYPE case FieldDescriptor::TYPE_MESSAGE: if (is_lazy) { target = lazymessage_value->InternalWriteMessageToArray( number, deterministic, target); } else { target = WireFormatLite::InternalWriteMessageToArray( number, *message_value, deterministic, target); } break; } } return target; } uint8* ExtensionSet::Extension::InternalSerializeMessageSetItemWithCachedSizesToArray( int number, bool deterministic, uint8* target) const { if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { // Not a valid MessageSet extension, but serialize it the normal way. GOOGLE_LOG(WARNING) << "Invalid message set extension."; return InternalSerializeFieldWithCachedSizesToArray(number, deterministic, target); } if (is_cleared) return target; // Start group. target = io::CodedOutputStream::WriteTagToArray( WireFormatLite::kMessageSetItemStartTag, target); // Write type ID. target = WireFormatLite::WriteUInt32ToArray( WireFormatLite::kMessageSetTypeIdNumber, number, target); // Write message. if (is_lazy) { target = lazymessage_value->InternalWriteMessageToArray( WireFormatLite::kMessageSetMessageNumber, deterministic, target); } else { target = WireFormatLite::InternalWriteMessageToArray( WireFormatLite::kMessageSetMessageNumber, *message_value, deterministic, target); } // End group. target = io::CodedOutputStream::WriteTagToArray( WireFormatLite::kMessageSetItemEndTag, target); return target; } bool ExtensionSet::ParseFieldMaybeLazily( int wire_type, int field_number, io::CodedInputStream* input, ExtensionFinder* extension_finder, MessageSetFieldSkipper* field_skipper) { return ParseField(WireFormatLite::MakeTag( field_number, static_cast(wire_type)), input, extension_finder, field_skipper); } bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, ExtensionFinder* extension_finder, MessageSetFieldSkipper* field_skipper) { while (true) { const uint32 tag = input->ReadTag(); switch (tag) { case 0: return true; case WireFormatLite::kMessageSetItemStartTag: if (!ParseMessageSetItem(input, extension_finder, field_skipper)) { return false; } break; default: if (!ParseField(tag, input, extension_finder, field_skipper)) { return false; } break; } } } bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, const MessageLite* containing_type) { MessageSetFieldSkipper skipper(NULL); GeneratedExtensionFinder finder(containing_type); return ParseMessageSet(input, &finder, &skipper); } bool ExtensionSet::ParseMessageSetItem(io::CodedInputStream* input, ExtensionFinder* extension_finder, MessageSetFieldSkipper* field_skipper) { // TODO(kenton): It would be nice to share code between this and // WireFormatLite::ParseAndMergeMessageSetItem(), but I think the // differences would be hard to factor out. // This method parses a group which should contain two fields: // required int32 type_id = 2; // required data message = 3; uint32 last_type_id = 0; // If we see message data before the type_id, we'll append it to this so // we can parse it later. string message_data; while (true) { const uint32 tag = input->ReadTagNoLastTag(); if (tag == 0) return false; switch (tag) { case WireFormatLite::kMessageSetTypeIdTag: { uint32 type_id; if (!input->ReadVarint32(&type_id)) return false; last_type_id = type_id; if (!message_data.empty()) { // We saw some message data before the type_id. Have to parse it // now. io::CodedInputStream sub_input( reinterpret_cast(message_data.data()), message_data.size()); if (!ParseFieldMaybeLazily(WireFormatLite::WIRETYPE_LENGTH_DELIMITED, last_type_id, &sub_input, extension_finder, field_skipper)) { return false; } message_data.clear(); } break; } case WireFormatLite::kMessageSetMessageTag: { if (last_type_id == 0) { // We haven't seen a type_id yet. Append this data to message_data. string temp; uint32 length; if (!input->ReadVarint32(&length)) return false; if (!input->ReadString(&temp, length)) return false; io::StringOutputStream output_stream(&message_data); io::CodedOutputStream coded_output(&output_stream); coded_output.WriteVarint32(length); coded_output.WriteString(temp); } else { // Already saw type_id, so we can parse this directly. if (!ParseFieldMaybeLazily(WireFormatLite::WIRETYPE_LENGTH_DELIMITED, last_type_id, input, extension_finder, field_skipper)) { return false; } } break; } case WireFormatLite::kMessageSetItemEndTag: { return true; } default: { if (!field_skipper->SkipField(input, tag)) return false; } } } } void ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizes( int number, io::CodedOutputStream* output) const { if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { // Not a valid MessageSet extension, but serialize it the normal way. SerializeFieldWithCachedSizes(number, output); return; } if (is_cleared) return; // Start group. output->WriteTag(WireFormatLite::kMessageSetItemStartTag); // Write type ID. WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber, number, output); // Write message. if (is_lazy) { lazymessage_value->WriteMessage( WireFormatLite::kMessageSetMessageNumber, output); } else { WireFormatLite::WriteMessageMaybeToArray( WireFormatLite::kMessageSetMessageNumber, *message_value, output); } // End group. output->WriteTag(WireFormatLite::kMessageSetItemEndTag); } size_t ExtensionSet::Extension::MessageSetItemByteSize(int number) const { if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { // Not a valid MessageSet extension, but compute the byte size for it the // normal way. return ByteSize(number); } if (is_cleared) return 0; size_t our_size = WireFormatLite::kMessageSetItemTagsSize; // type_id our_size += io::CodedOutputStream::VarintSize32(number); // message size_t message_size = 0; if (is_lazy) { message_size = lazymessage_value->ByteSize(); } else { message_size = message_value->ByteSize(); } our_size += io::CodedOutputStream::VarintSize32(message_size); our_size += message_size; return our_size; } void ExtensionSet::SerializeMessageSetWithCachedSizes( io::CodedOutputStream* output) const { for (ExtensionMap::const_iterator iter = extensions_.begin(); iter != extensions_.end(); ++iter) { iter->second.SerializeMessageSetItemWithCachedSizes(iter->first, output); } } size_t ExtensionSet::MessageSetByteSize() const { size_t total_size = 0; for (ExtensionMap::const_iterator iter = extensions_.begin(); iter != extensions_.end(); ++iter) { total_size += iter->second.MessageSetItemByteSize(iter->first); } return total_size; } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/extension_set_unittest.cc000066400000000000000000001474121334102242000324370ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { namespace { // This test closely mirrors google/protobuf/compiler/cpp/unittest.cc // except that it uses extensions rather than regular fields. TEST(ExtensionSetTest, Defaults) { // Check that all default values are set correctly in the initial message. unittest::TestAllExtensions message; TestUtil::ExpectExtensionsClear(message); // Messages should return pointers to default instances until first use. // (This is not checked by ExpectClear() since it is not actually true after // the fields have been set and then cleared.) EXPECT_EQ(&unittest::OptionalGroup_extension::default_instance(), &message.GetExtension(unittest::optionalgroup_extension)); EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), &message.GetExtension(unittest::optional_nested_message_extension)); EXPECT_EQ(&unittest::ForeignMessage::default_instance(), &message.GetExtension( unittest::optional_foreign_message_extension)); EXPECT_EQ(&unittest_import::ImportMessage::default_instance(), &message.GetExtension(unittest::optional_import_message_extension)); } TEST(ExtensionSetTest, Accessors) { // Set every field to a unique value then go back and check all those // values. unittest::TestAllExtensions message; TestUtil::SetAllExtensions(&message); TestUtil::ExpectAllExtensionsSet(message); TestUtil::ModifyRepeatedExtensions(&message); TestUtil::ExpectRepeatedExtensionsModified(message); } TEST(ExtensionSetTest, Clear) { // Set every field to a unique value, clear the message, then check that // it is cleared. unittest::TestAllExtensions message; TestUtil::SetAllExtensions(&message); message.Clear(); TestUtil::ExpectExtensionsClear(message); // Unlike with the defaults test, we do NOT expect that requesting embedded // messages will return a pointer to the default instance. Instead, they // should return the objects that were created when mutable_blah() was // called. EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(), &message.GetExtension(unittest::optionalgroup_extension)); EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), &message.GetExtension(unittest::optional_nested_message_extension)); EXPECT_NE(&unittest::ForeignMessage::default_instance(), &message.GetExtension( unittest::optional_foreign_message_extension)); EXPECT_NE(&unittest_import::ImportMessage::default_instance(), &message.GetExtension(unittest::optional_import_message_extension)); // Make sure setting stuff again after clearing works. (This takes slightly // different code paths since the objects are reused.) TestUtil::SetAllExtensions(&message); TestUtil::ExpectAllExtensionsSet(message); } TEST(ExtensionSetTest, ClearOneField) { // Set every field to a unique value, then clear one value and insure that // only that one value is cleared. unittest::TestAllExtensions message; TestUtil::SetAllExtensions(&message); int64 original_value = message.GetExtension(unittest::optional_int64_extension); // Clear the field and make sure it shows up as cleared. message.ClearExtension(unittest::optional_int64_extension); EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension)); EXPECT_EQ(0, message.GetExtension(unittest::optional_int64_extension)); // Other adjacent fields should not be cleared. EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension)); EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension)); // Make sure if we set it again, then all fields are set. message.SetExtension(unittest::optional_int64_extension, original_value); TestUtil::ExpectAllExtensionsSet(message); } TEST(ExtensionSetTest, SetAllocatedExtension) { unittest::TestAllExtensions message; EXPECT_FALSE(message.HasExtension( unittest::optional_foreign_message_extension)); // Add a extension using SetAllocatedExtension unittest::ForeignMessage* foreign_message = new unittest::ForeignMessage(); message.SetAllocatedExtension(unittest::optional_foreign_message_extension, foreign_message); EXPECT_TRUE(message.HasExtension( unittest::optional_foreign_message_extension)); EXPECT_EQ(foreign_message, message.MutableExtension( unittest::optional_foreign_message_extension)); EXPECT_EQ(foreign_message, &message.GetExtension( unittest::optional_foreign_message_extension)); // SetAllocatedExtension should delete the previously existing extension. // (We reply on unittest to check memory leaks for this case) message.SetAllocatedExtension(unittest::optional_foreign_message_extension, new unittest::ForeignMessage()); // SetAllocatedExtension with a NULL parameter is equivalent to ClearExtenion. message.SetAllocatedExtension(unittest::optional_foreign_message_extension, NULL); EXPECT_FALSE(message.HasExtension( unittest::optional_foreign_message_extension)); } TEST(ExtensionSetTest, ReleaseExtension) { proto2_wireformat_unittest::TestMessageSet message; EXPECT_FALSE(message.HasExtension( unittest::TestMessageSetExtension1::message_set_extension)); // Add a extension using SetAllocatedExtension unittest::TestMessageSetExtension1* extension = new unittest::TestMessageSetExtension1(); message.SetAllocatedExtension( unittest::TestMessageSetExtension1::message_set_extension, extension); EXPECT_TRUE(message.HasExtension( unittest::TestMessageSetExtension1::message_set_extension)); // Release the extension using ReleaseExtension unittest::TestMessageSetExtension1* released_extension = message.ReleaseExtension( unittest::TestMessageSetExtension1::message_set_extension); EXPECT_EQ(extension, released_extension); EXPECT_FALSE(message.HasExtension( unittest::TestMessageSetExtension1::message_set_extension)); // ReleaseExtension will return the underlying object even after // ClearExtension is called. message.SetAllocatedExtension( unittest::TestMessageSetExtension1::message_set_extension, extension); message.ClearExtension( unittest::TestMessageSetExtension1::message_set_extension); released_extension = message.ReleaseExtension( unittest::TestMessageSetExtension1::message_set_extension); EXPECT_TRUE(released_extension != NULL); delete released_extension; } TEST(ExtensionSetTest, ArenaUnsafeArenaSetAllocatedAndRelease) { ::google::protobuf::Arena arena; unittest::TestAllExtensions* message = ::google::protobuf::Arena::CreateMessage(&arena); unittest::ForeignMessage extension; message->UnsafeArenaSetAllocatedExtension( unittest::optional_foreign_message_extension, &extension); // No copy when set. unittest::ForeignMessage* mutable_extension = message->MutableExtension(unittest::optional_foreign_message_extension); EXPECT_EQ(&extension, mutable_extension); // No copy when unsafe released. unittest::ForeignMessage* released_extension = message->UnsafeArenaReleaseExtension( unittest::optional_foreign_message_extension); EXPECT_EQ(&extension, released_extension); EXPECT_FALSE(message->HasExtension( unittest::optional_foreign_message_extension)); // Set the ownership back and let the destructors run. It should not take // ownership, so this should not crash. message->UnsafeArenaSetAllocatedExtension( unittest::optional_foreign_message_extension, &extension); } TEST(ExtensionSetTest, UnsafeArenaSetAllocatedAndRelease) { unittest::TestAllExtensions message; unittest::ForeignMessage* extension = new unittest::ForeignMessage(); message.UnsafeArenaSetAllocatedExtension( unittest::optional_foreign_message_extension, extension); // No copy when set. unittest::ForeignMessage* mutable_extension = message.MutableExtension(unittest::optional_foreign_message_extension); EXPECT_EQ(extension, mutable_extension); // No copy when unsafe released. unittest::ForeignMessage* released_extension = message.UnsafeArenaReleaseExtension( unittest::optional_foreign_message_extension); EXPECT_EQ(extension, released_extension); EXPECT_FALSE(message.HasExtension( unittest::optional_foreign_message_extension)); // Set the ownership back and let the destructors run. It should take // ownership, so this should not leak. message.UnsafeArenaSetAllocatedExtension( unittest::optional_foreign_message_extension, extension); } TEST(ExtensionSetTest, ArenaUnsafeArenaReleaseOfHeapAlloc) { ::google::protobuf::Arena arena; unittest::TestAllExtensions* message = ::google::protobuf::Arena::CreateMessage(&arena); unittest::ForeignMessage* extension = new unittest::ForeignMessage; message->SetAllocatedExtension( unittest::optional_foreign_message_extension, extension); // The arena should maintain ownership of the heap allocated proto because we // used UnsafeArenaReleaseExtension. The leak checker will ensure this. unittest::ForeignMessage* released_extension = message->UnsafeArenaReleaseExtension( unittest::optional_foreign_message_extension); EXPECT_EQ(extension, released_extension); EXPECT_FALSE(message->HasExtension( unittest::optional_foreign_message_extension)); } TEST(ExtensionSetTest, CopyFrom) { unittest::TestAllExtensions message1, message2; TestUtil::SetAllExtensions(&message1); message2.CopyFrom(message1); TestUtil::ExpectAllExtensionsSet(message2); message2.CopyFrom(message1); // exercise copy when fields already exist TestUtil::ExpectAllExtensionsSet(message2); } TEST(ExtensioSetTest, CopyFromPacked) { unittest::TestPackedExtensions message1, message2; TestUtil::SetPackedExtensions(&message1); message2.CopyFrom(message1); TestUtil::ExpectPackedExtensionsSet(message2); message2.CopyFrom(message1); // exercise copy when fields already exist TestUtil::ExpectPackedExtensionsSet(message2); } TEST(ExtensionSetTest, CopyFromUpcasted) { unittest::TestAllExtensions message1, message2; const Message& upcasted_message = message1; TestUtil::SetAllExtensions(&message1); message2.CopyFrom(upcasted_message); TestUtil::ExpectAllExtensionsSet(message2); // exercise copy when fields already exist message2.CopyFrom(upcasted_message); TestUtil::ExpectAllExtensionsSet(message2); } TEST(ExtensionSetTest, SwapWithEmpty) { unittest::TestAllExtensions message1, message2; TestUtil::SetAllExtensions(&message1); TestUtil::ExpectAllExtensionsSet(message1); TestUtil::ExpectExtensionsClear(message2); message1.Swap(&message2); TestUtil::ExpectAllExtensionsSet(message2); TestUtil::ExpectExtensionsClear(message1); } TEST(ExtensionSetTest, SwapWithSelf) { unittest::TestAllExtensions message; TestUtil::SetAllExtensions(&message); TestUtil::ExpectAllExtensionsSet(message); message.Swap(&message); TestUtil::ExpectAllExtensionsSet(message); } TEST(ExtensionSetTest, SwapExtension) { unittest::TestAllExtensions message1; unittest::TestAllExtensions message2; TestUtil::SetAllExtensions(&message1); std::vector fields; // Swap empty fields. const Reflection* reflection = message1.GetReflection(); reflection->SwapFields(&message1, &message2, fields); TestUtil::ExpectAllExtensionsSet(message1); TestUtil::ExpectExtensionsClear(message2); // Swap two extensions. fields.push_back( reflection->FindKnownExtensionByNumber(12)); fields.push_back( reflection->FindKnownExtensionByNumber(25)); reflection->SwapFields(&message1, &message2, fields); EXPECT_TRUE(message1.HasExtension(unittest::optional_int32_extension)); EXPECT_FALSE(message1.HasExtension(unittest::optional_double_extension)); EXPECT_FALSE(message1.HasExtension(unittest::optional_cord_extension)); EXPECT_FALSE(message2.HasExtension(unittest::optional_int32_extension)); EXPECT_TRUE(message2.HasExtension(unittest::optional_double_extension)); EXPECT_TRUE(message2.HasExtension(unittest::optional_cord_extension)); } TEST(ExtensionSetTest, SwapExtensionWithEmpty) { unittest::TestAllExtensions message1; unittest::TestAllExtensions message2; unittest::TestAllExtensions message3; TestUtil::SetAllExtensions(&message3); const Reflection* reflection = message3.GetReflection(); std::vector fields; reflection->ListFields(message3, &fields); reflection->SwapFields(&message1, &message2, fields); TestUtil::ExpectExtensionsClear(message1); TestUtil::ExpectExtensionsClear(message2); } TEST(ExtensionSetTest, SwapExtensionBothFull) { unittest::TestAllExtensions message1; unittest::TestAllExtensions message2; TestUtil::SetAllExtensions(&message1); TestUtil::SetAllExtensions(&message2); const Reflection* reflection = message1.GetReflection(); std::vector fields; reflection->ListFields(message1, &fields); reflection->SwapFields(&message1, &message2, fields); TestUtil::ExpectAllExtensionsSet(message1); TestUtil::ExpectAllExtensionsSet(message2); } TEST(ExtensionSetTest, ArenaSetAllExtension) { ::google::protobuf::Arena arena1; unittest::TestAllExtensions* message1 = ::google::protobuf::Arena::CreateMessage(&arena1); TestUtil::SetAllExtensions(message1); TestUtil::ExpectAllExtensionsSet(*message1); } TEST(ExtensionSetTest, ArenaCopyConstructor) { ::google::protobuf::Arena arena1; unittest::TestAllExtensions* message1 = ::google::protobuf::Arena::CreateMessage(&arena1); TestUtil::SetAllExtensions(message1); unittest::TestAllExtensions message2(*message1); arena1.Reset(); TestUtil::ExpectAllExtensionsSet(message2); } TEST(ExtensionSetTest, ArenaMergeFrom) { ::google::protobuf::Arena arena1; unittest::TestAllExtensions* message1 = ::google::protobuf::Arena::CreateMessage(&arena1); TestUtil::SetAllExtensions(message1); unittest::TestAllExtensions message2; message2.MergeFrom(*message1); arena1.Reset(); TestUtil::ExpectAllExtensionsSet(message2); } TEST(ExtensionSetTest, ArenaSetAllocatedMessageAndRelease) { ::google::protobuf::Arena arena; unittest::TestAllExtensions* message = ::google::protobuf::Arena::CreateMessage(&arena); EXPECT_FALSE(message->HasExtension( unittest::optional_foreign_message_extension)); // Add a extension using SetAllocatedExtension unittest::ForeignMessage* foreign_message = new unittest::ForeignMessage(); message->SetAllocatedExtension(unittest::optional_foreign_message_extension, foreign_message); // foreign_message is now owned by the arena. EXPECT_EQ(foreign_message, message->MutableExtension( unittest::optional_foreign_message_extension)); // Underlying message is copied, and returned. unittest::ForeignMessage* released_message = message->ReleaseExtension( unittest::optional_foreign_message_extension); delete released_message; EXPECT_FALSE(message->HasExtension( unittest::optional_foreign_message_extension)); } TEST(ExtensionSetTest, SwapExtensionBothFullWithArena) { ::google::protobuf::Arena arena1; google::protobuf::scoped_ptr arena2(new ::google::protobuf::Arena()); unittest::TestAllExtensions* message1 = Arena::CreateMessage(&arena1); unittest::TestAllExtensions* message2 = Arena::CreateMessage(arena2.get()); TestUtil::SetAllExtensions(message1); TestUtil::SetAllExtensions(message2); message1->SetExtension(unittest::optional_int32_extension, 1); message2->SetExtension(unittest::optional_int32_extension, 2); message1->Swap(message2); EXPECT_EQ(2, message1->GetExtension(unittest::optional_int32_extension)); EXPECT_EQ(1, message2->GetExtension(unittest::optional_int32_extension)); // Re-set the original values so ExpectAllExtensionsSet is happy. message1->SetExtension(unittest::optional_int32_extension, 101); message2->SetExtension(unittest::optional_int32_extension, 101); TestUtil::ExpectAllExtensionsSet(*message1); TestUtil::ExpectAllExtensionsSet(*message2); arena2.reset(NULL); TestUtil::ExpectAllExtensionsSet(*message1); // Test corner cases, when one is empty and other is not. ::google::protobuf::Arena arena3, arena4; unittest::TestAllExtensions* message3 = Arena::CreateMessage(&arena3); unittest::TestAllExtensions* message4 = Arena::CreateMessage(&arena4); TestUtil::SetAllExtensions(message3); message3->Swap(message4); arena3.Reset(); TestUtil::ExpectAllExtensionsSet(*message4); } TEST(ExtensionSetTest, SwapFieldsOfExtensionBothFullWithArena) { google::protobuf::Arena arena1; google::protobuf::Arena* arena2 = new ::google::protobuf::Arena(); unittest::TestAllExtensions* message1 = Arena::CreateMessage(&arena1); unittest::TestAllExtensions* message2 = Arena::CreateMessage(arena2); TestUtil::SetAllExtensions(message1); TestUtil::SetAllExtensions(message2); const Reflection* reflection = message1->GetReflection(); std::vector fields; reflection->ListFields(*message1, &fields); reflection->SwapFields(message1, message2, fields); TestUtil::ExpectAllExtensionsSet(*message1); TestUtil::ExpectAllExtensionsSet(*message2); delete arena2; TestUtil::ExpectAllExtensionsSet(*message1); } TEST(ExtensionSetTest, SwapExtensionWithSelf) { unittest::TestAllExtensions message1; TestUtil::SetAllExtensions(&message1); std::vector fields; const Reflection* reflection = message1.GetReflection(); reflection->ListFields(message1, &fields); reflection->SwapFields(&message1, &message1, fields); TestUtil::ExpectAllExtensionsSet(message1); } TEST(ExtensionSetTest, SerializationToArray) { // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire // compatibility of extensions. // // This checks serialization to a flat array by explicitly reserving space in // the string and calling the generated message's // SerializeWithCachedSizesToArray. unittest::TestAllExtensions source; unittest::TestAllTypes destination; TestUtil::SetAllExtensions(&source); int size = source.ByteSize(); string data; data.resize(size); uint8* target = reinterpret_cast(string_as_array(&data)); uint8* end = source.SerializeWithCachedSizesToArray(target); EXPECT_EQ(size, end - target); EXPECT_TRUE(destination.ParseFromString(data)); TestUtil::ExpectAllFieldsSet(destination); } TEST(ExtensionSetTest, SerializationToStream) { // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire // compatibility of extensions. // // This checks serialization to an output stream by creating an array output // stream that can only buffer 1 byte at a time - this prevents the message // from ever jumping to the fast path, ensuring that serialization happens via // the CodedOutputStream. unittest::TestAllExtensions source; unittest::TestAllTypes destination; TestUtil::SetAllExtensions(&source); int size = source.ByteSize(); string data; data.resize(size); { io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); io::CodedOutputStream output_stream(&array_stream); source.SerializeWithCachedSizes(&output_stream); ASSERT_FALSE(output_stream.HadError()); } EXPECT_TRUE(destination.ParseFromString(data)); TestUtil::ExpectAllFieldsSet(destination); } TEST(ExtensionSetTest, PackedSerializationToArray) { // Serialize as TestPackedExtensions and parse as TestPackedTypes to insure // wire compatibility of extensions. // // This checks serialization to a flat array by explicitly reserving space in // the string and calling the generated message's // SerializeWithCachedSizesToArray. unittest::TestPackedExtensions source; unittest::TestPackedTypes destination; TestUtil::SetPackedExtensions(&source); int size = source.ByteSize(); string data; data.resize(size); uint8* target = reinterpret_cast(string_as_array(&data)); uint8* end = source.SerializeWithCachedSizesToArray(target); EXPECT_EQ(size, end - target); EXPECT_TRUE(destination.ParseFromString(data)); TestUtil::ExpectPackedFieldsSet(destination); } TEST(ExtensionSetTest, PackedSerializationToStream) { // Serialize as TestPackedExtensions and parse as TestPackedTypes to insure // wire compatibility of extensions. // // This checks serialization to an output stream by creating an array output // stream that can only buffer 1 byte at a time - this prevents the message // from ever jumping to the fast path, ensuring that serialization happens via // the CodedOutputStream. unittest::TestPackedExtensions source; unittest::TestPackedTypes destination; TestUtil::SetPackedExtensions(&source); int size = source.ByteSize(); string data; data.resize(size); { io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); io::CodedOutputStream output_stream(&array_stream); source.SerializeWithCachedSizes(&output_stream); ASSERT_FALSE(output_stream.HadError()); } EXPECT_TRUE(destination.ParseFromString(data)); TestUtil::ExpectPackedFieldsSet(destination); } TEST(ExtensionSetTest, Parsing) { // Serialize as TestAllTypes and parse as TestAllExtensions. unittest::TestAllTypes source; unittest::TestAllExtensions destination; string data; TestUtil::SetAllFields(&source); source.SerializeToString(&data); EXPECT_TRUE(destination.ParseFromString(data)); TestUtil::SetOneofFields(&destination); TestUtil::ExpectAllExtensionsSet(destination); } TEST(ExtensionSetTest, PackedParsing) { // Serialize as TestPackedTypes and parse as TestPackedExtensions. unittest::TestPackedTypes source; unittest::TestPackedExtensions destination; string data; TestUtil::SetPackedFields(&source); source.SerializeToString(&data); EXPECT_TRUE(destination.ParseFromString(data)); TestUtil::ExpectPackedExtensionsSet(destination); } TEST(ExtensionSetTest, PackedToUnpackedParsing) { unittest::TestPackedTypes source; unittest::TestUnpackedExtensions destination; string data; TestUtil::SetPackedFields(&source); source.SerializeToString(&data); EXPECT_TRUE(destination.ParseFromString(data)); TestUtil::ExpectUnpackedExtensionsSet(destination); // Reserialize unittest::TestUnpackedTypes unpacked; TestUtil::SetUnpackedFields(&unpacked); EXPECT_TRUE(unpacked.SerializeAsString() == destination.SerializeAsString()); // Make sure we can add extensions. destination.AddExtension(unittest::unpacked_int32_extension, 1); destination.AddExtension(unittest::unpacked_enum_extension, protobuf_unittest::FOREIGN_BAR); } TEST(ExtensionSetTest, UnpackedToPackedParsing) { unittest::TestUnpackedTypes source; unittest::TestPackedExtensions destination; string data; TestUtil::SetUnpackedFields(&source); source.SerializeToString(&data); EXPECT_TRUE(destination.ParseFromString(data)); TestUtil::ExpectPackedExtensionsSet(destination); // Reserialize unittest::TestPackedTypes packed; TestUtil::SetPackedFields(&packed); EXPECT_TRUE(packed.SerializeAsString() == destination.SerializeAsString()); // Make sure we can add extensions. destination.AddExtension(unittest::packed_int32_extension, 1); destination.AddExtension(unittest::packed_enum_extension, protobuf_unittest::FOREIGN_BAR); } TEST(ExtensionSetTest, IsInitialized) { // Test that IsInitialized() returns false if required fields in nested // extensions are missing. unittest::TestAllExtensions message; EXPECT_TRUE(message.IsInitialized()); message.MutableExtension(unittest::TestRequired::single); EXPECT_FALSE(message.IsInitialized()); message.MutableExtension(unittest::TestRequired::single)->set_a(1); EXPECT_FALSE(message.IsInitialized()); message.MutableExtension(unittest::TestRequired::single)->set_b(2); EXPECT_FALSE(message.IsInitialized()); message.MutableExtension(unittest::TestRequired::single)->set_c(3); EXPECT_TRUE(message.IsInitialized()); message.AddExtension(unittest::TestRequired::multi); EXPECT_FALSE(message.IsInitialized()); message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1); EXPECT_FALSE(message.IsInitialized()); message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2); EXPECT_FALSE(message.IsInitialized()); message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3); EXPECT_TRUE(message.IsInitialized()); } TEST(ExtensionSetTest, MutableString) { // Test the mutable string accessors. unittest::TestAllExtensions message; message.MutableExtension(unittest::optional_string_extension)->assign("foo"); EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension)); EXPECT_EQ("foo", message.GetExtension(unittest::optional_string_extension)); message.AddExtension(unittest::repeated_string_extension)->assign("bar"); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_extension)); EXPECT_EQ("bar", message.GetExtension(unittest::repeated_string_extension, 0)); } TEST(ExtensionSetTest, SpaceUsedExcludingSelf) { // Scalar primitive extensions should increase the extension set size by a // minimum of the size of the primitive type. #define TEST_SCALAR_EXTENSIONS_SPACE_USED(type, value) \ do { \ unittest::TestAllExtensions message; \ const int base_size = message.SpaceUsed(); \ message.SetExtension(unittest::optional_##type##_extension, value); \ int min_expected_size = base_size + \ sizeof(message.GetExtension(unittest::optional_##type##_extension)); \ EXPECT_LE(min_expected_size, message.SpaceUsed()); \ } while (0) TEST_SCALAR_EXTENSIONS_SPACE_USED(int32 , 101); TEST_SCALAR_EXTENSIONS_SPACE_USED(int64 , 102); TEST_SCALAR_EXTENSIONS_SPACE_USED(uint32 , 103); TEST_SCALAR_EXTENSIONS_SPACE_USED(uint64 , 104); TEST_SCALAR_EXTENSIONS_SPACE_USED(sint32 , 105); TEST_SCALAR_EXTENSIONS_SPACE_USED(sint64 , 106); TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed32 , 107); TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed64 , 108); TEST_SCALAR_EXTENSIONS_SPACE_USED(sfixed32, 109); TEST_SCALAR_EXTENSIONS_SPACE_USED(sfixed64, 110); TEST_SCALAR_EXTENSIONS_SPACE_USED(float , 111); TEST_SCALAR_EXTENSIONS_SPACE_USED(double , 112); TEST_SCALAR_EXTENSIONS_SPACE_USED(bool , true); #undef TEST_SCALAR_EXTENSIONS_SPACE_USED { unittest::TestAllExtensions message; const int base_size = message.SpaceUsed(); message.SetExtension(unittest::optional_nested_enum_extension, unittest::TestAllTypes::FOO); int min_expected_size = base_size + sizeof(message.GetExtension(unittest::optional_nested_enum_extension)); EXPECT_LE(min_expected_size, message.SpaceUsed()); } { // Strings may cause extra allocations depending on their length; ensure // that gets included as well. unittest::TestAllExtensions message; const int base_size = message.SpaceUsed(); const string s("this is a fairly large string that will cause some " "allocation in order to store it in the extension"); message.SetExtension(unittest::optional_string_extension, s); int min_expected_size = base_size + s.length(); EXPECT_LE(min_expected_size, message.SpaceUsed()); } { // Messages also have additional allocation that need to be counted. unittest::TestAllExtensions message; const int base_size = message.SpaceUsed(); unittest::ForeignMessage foreign; foreign.set_c(42); message.MutableExtension(unittest::optional_foreign_message_extension)-> CopyFrom(foreign); int min_expected_size = base_size + foreign.SpaceUsed(); EXPECT_LE(min_expected_size, message.SpaceUsed()); } // Repeated primitive extensions will increase space used by at least a // RepeatedField, and will cause additional allocations when the array // gets too big for the initial space. // This macro: // - Adds a value to the repeated extension, then clears it, establishing // the base size. // - Adds a small number of values, testing that it doesn't increase the // SpaceUsed() // - Adds a large number of values (requiring allocation in the repeated // field), and ensures that that allocation is included in SpaceUsed() #define TEST_REPEATED_EXTENSIONS_SPACE_USED(type, cpptype, value) \ do { \ unittest::TestAllExtensions message; \ const int base_size = message.SpaceUsed(); \ int min_expected_size = sizeof(RepeatedField) + base_size; \ message.AddExtension(unittest::repeated_##type##_extension, value); \ message.ClearExtension(unittest::repeated_##type##_extension); \ const int empty_repeated_field_size = message.SpaceUsed(); \ EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type; \ message.AddExtension(unittest::repeated_##type##_extension, value); \ message.AddExtension(unittest::repeated_##type##_extension, value); \ EXPECT_EQ(empty_repeated_field_size, message.SpaceUsed()) << #type; \ message.ClearExtension(unittest::repeated_##type##_extension); \ for (int i = 0; i < 16; ++i) { \ message.AddExtension(unittest::repeated_##type##_extension, value); \ } \ int expected_size = sizeof(cpptype) * (16 - \ kMinRepeatedFieldAllocationSize) + empty_repeated_field_size; \ EXPECT_LE(expected_size, message.SpaceUsed()) << #type; \ } while (0) TEST_REPEATED_EXTENSIONS_SPACE_USED(int32 , int32 , 101); TEST_REPEATED_EXTENSIONS_SPACE_USED(int64 , int64 , 102); TEST_REPEATED_EXTENSIONS_SPACE_USED(uint32 , uint32, 103); TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64 , uint64, 104); TEST_REPEATED_EXTENSIONS_SPACE_USED(sint32 , int32 , 105); TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64 , int64 , 106); TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed32 , uint32, 107); TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64 , uint64, 108); TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed32, int32 , 109); TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed64, int64 , 110); TEST_REPEATED_EXTENSIONS_SPACE_USED(float , float , 111); TEST_REPEATED_EXTENSIONS_SPACE_USED(double , double, 112); TEST_REPEATED_EXTENSIONS_SPACE_USED(bool , bool , true); TEST_REPEATED_EXTENSIONS_SPACE_USED(nested_enum, int, unittest::TestAllTypes::FOO); #undef TEST_REPEATED_EXTENSIONS_SPACE_USED // Repeated strings { unittest::TestAllExtensions message; const int base_size = message.SpaceUsed(); int min_expected_size = sizeof(RepeatedPtrField) + base_size; const string value(256, 'x'); // Once items are allocated, they may stick around even when cleared so // without the hardcore memory management accessors there isn't a notion of // the empty repeated field memory usage as there is with primitive types. for (int i = 0; i < 16; ++i) { message.AddExtension(unittest::repeated_string_extension, value); } min_expected_size += (sizeof(value) + value.size()) * (16 - kMinRepeatedFieldAllocationSize); EXPECT_LE(min_expected_size, message.SpaceUsed()); } // Repeated messages { unittest::TestAllExtensions message; const int base_size = message.SpaceUsed(); int min_expected_size = sizeof(RepeatedPtrField) + base_size; unittest::ForeignMessage prototype; prototype.set_c(2); for (int i = 0; i < 16; ++i) { message.AddExtension(unittest::repeated_foreign_message_extension)-> CopyFrom(prototype); } min_expected_size += (16 - kMinRepeatedFieldAllocationSize) * prototype.SpaceUsed(); EXPECT_LE(min_expected_size, message.SpaceUsed()); } } // N.B.: We do not test range-based for here because we remain C++03 compatible. template inline T SumAllExtensions(const M& message, ID extension, T zero) { T sum = zero; typename RepeatedField::const_iterator iter = message.GetRepeatedExtension(extension).begin(); typename RepeatedField::const_iterator end = message.GetRepeatedExtension(extension).end(); for (; iter != end; ++iter) { sum += *iter; } return sum; } template inline void IncAllExtensions(M* message, ID extension, T val) { typename RepeatedField::iterator iter = message->MutableRepeatedExtension(extension)->begin(); typename RepeatedField::iterator end = message->MutableRepeatedExtension(extension)->end(); for (; iter != end; ++iter) { *iter += val; } } TEST(ExtensionSetTest, RepeatedFields) { unittest::TestAllExtensions message; // Test empty repeated-field case (b/12926163) ASSERT_EQ(0, message.GetRepeatedExtension( unittest::repeated_int32_extension).size()); ASSERT_EQ(0, message.GetRepeatedExtension( unittest::repeated_nested_enum_extension).size()); ASSERT_EQ(0, message.GetRepeatedExtension( unittest::repeated_string_extension).size()); ASSERT_EQ(0, message.GetRepeatedExtension( unittest::repeated_nested_message_extension).size()); unittest::TestAllTypes::NestedMessage nested_message; nested_message.set_bb(42); unittest::TestAllTypes::NestedEnum nested_enum = unittest::TestAllTypes::NestedEnum_MIN; for (int i = 0; i < 10; ++i) { message.AddExtension(unittest::repeated_int32_extension, 1); message.AddExtension(unittest::repeated_int64_extension, 2); message.AddExtension(unittest::repeated_uint32_extension, 3); message.AddExtension(unittest::repeated_uint64_extension, 4); message.AddExtension(unittest::repeated_sint32_extension, 5); message.AddExtension(unittest::repeated_sint64_extension, 6); message.AddExtension(unittest::repeated_fixed32_extension, 7); message.AddExtension(unittest::repeated_fixed64_extension, 8); message.AddExtension(unittest::repeated_sfixed32_extension, 7); message.AddExtension(unittest::repeated_sfixed64_extension, 8); message.AddExtension(unittest::repeated_float_extension, 9.0); message.AddExtension(unittest::repeated_double_extension, 10.0); message.AddExtension(unittest::repeated_bool_extension, true); message.AddExtension(unittest::repeated_nested_enum_extension, nested_enum); message.AddExtension(unittest::repeated_string_extension, ::std::string("test")); message.AddExtension(unittest::repeated_bytes_extension, ::std::string("test\xFF")); message.AddExtension( unittest::repeated_nested_message_extension)->CopyFrom(nested_message); message.AddExtension(unittest::repeated_nested_enum_extension, nested_enum); } ASSERT_EQ(10, SumAllExtensions( message, unittest::repeated_int32_extension, 0)); IncAllExtensions( &message, unittest::repeated_int32_extension, 1); ASSERT_EQ(20, SumAllExtensions( message, unittest::repeated_int32_extension, 0)); ASSERT_EQ(20, SumAllExtensions( message, unittest::repeated_int64_extension, 0)); IncAllExtensions( &message, unittest::repeated_int64_extension, 1); ASSERT_EQ(30, SumAllExtensions( message, unittest::repeated_int64_extension, 0)); ASSERT_EQ(30, SumAllExtensions( message, unittest::repeated_uint32_extension, 0)); IncAllExtensions( &message, unittest::repeated_uint32_extension, 1); ASSERT_EQ(40, SumAllExtensions( message, unittest::repeated_uint32_extension, 0)); ASSERT_EQ(40, SumAllExtensions( message, unittest::repeated_uint64_extension, 0)); IncAllExtensions( &message, unittest::repeated_uint64_extension, 1); ASSERT_EQ(50, SumAllExtensions( message, unittest::repeated_uint64_extension, 0)); ASSERT_EQ(50, SumAllExtensions( message, unittest::repeated_sint32_extension, 0)); IncAllExtensions( &message, unittest::repeated_sint32_extension, 1); ASSERT_EQ(60, SumAllExtensions( message, unittest::repeated_sint32_extension, 0)); ASSERT_EQ(60, SumAllExtensions( message, unittest::repeated_sint64_extension, 0)); IncAllExtensions( &message, unittest::repeated_sint64_extension, 1); ASSERT_EQ(70, SumAllExtensions( message, unittest::repeated_sint64_extension, 0)); ASSERT_EQ(70, SumAllExtensions( message, unittest::repeated_fixed32_extension, 0)); IncAllExtensions( &message, unittest::repeated_fixed32_extension, 1); ASSERT_EQ(80, SumAllExtensions( message, unittest::repeated_fixed32_extension, 0)); ASSERT_EQ(80, SumAllExtensions( message, unittest::repeated_fixed64_extension, 0)); IncAllExtensions( &message, unittest::repeated_fixed64_extension, 1); ASSERT_EQ(90, SumAllExtensions( message, unittest::repeated_fixed64_extension, 0)); // Usually, floating-point arithmetic cannot be trusted to be exact, so it is // a Bad Idea to assert equality in a test like this. However, we're dealing // with integers with a small number of significant mantissa bits, so we // should actually have exact precision here. ASSERT_EQ(90, SumAllExtensions( message, unittest::repeated_float_extension, 0)); IncAllExtensions( &message, unittest::repeated_float_extension, 1); ASSERT_EQ(100, SumAllExtensions( message, unittest::repeated_float_extension, 0)); ASSERT_EQ(100, SumAllExtensions( message, unittest::repeated_double_extension, 0)); IncAllExtensions( &message, unittest::repeated_double_extension, 1); ASSERT_EQ(110, SumAllExtensions( message, unittest::repeated_double_extension, 0)); RepeatedPtrField< ::std::string>::iterator string_iter; RepeatedPtrField< ::std::string>::iterator string_end; for (string_iter = message.MutableRepeatedExtension( unittest::repeated_string_extension)->begin(), string_end = message.MutableRepeatedExtension( unittest::repeated_string_extension)->end(); string_iter != string_end; ++string_iter) { *string_iter += "test"; } RepeatedPtrField< ::std::string>::const_iterator string_const_iter; RepeatedPtrField< ::std::string>::const_iterator string_const_end; for (string_const_iter = message.GetRepeatedExtension( unittest::repeated_string_extension).begin(), string_const_end = message.GetRepeatedExtension( unittest::repeated_string_extension).end(); string_iter != string_end; ++string_iter) { ASSERT_TRUE(*string_iter == "testtest"); } RepeatedField::iterator enum_iter; RepeatedField::iterator enum_end; for (enum_iter = message.MutableRepeatedExtension( unittest::repeated_nested_enum_extension)->begin(), enum_end = message.MutableRepeatedExtension( unittest::repeated_nested_enum_extension)->end(); enum_iter != enum_end; ++enum_iter) { *enum_iter = unittest::TestAllTypes::NestedEnum_MAX; } RepeatedField::const_iterator enum_const_iter; RepeatedField::const_iterator enum_const_end; for (enum_const_iter = message.GetRepeatedExtension( unittest::repeated_nested_enum_extension).begin(), enum_const_end = message.GetRepeatedExtension( unittest::repeated_nested_enum_extension).end(); enum_iter != enum_end; ++enum_iter) { ASSERT_EQ(*enum_const_iter, unittest::TestAllTypes::NestedEnum_MAX); } RepeatedPtrField::iterator msg_iter; RepeatedPtrField::iterator msg_end; for (msg_iter = message.MutableRepeatedExtension( unittest::repeated_nested_message_extension)->begin(), msg_end = message.MutableRepeatedExtension( unittest::repeated_nested_message_extension)->end(); msg_iter != msg_end; ++msg_iter) { msg_iter->set_bb(1234); } RepeatedPtrField:: const_iterator msg_const_iter; RepeatedPtrField:: const_iterator msg_const_end; for (msg_const_iter = message.GetRepeatedExtension( unittest::repeated_nested_message_extension).begin(), msg_const_end = message.GetRepeatedExtension( unittest::repeated_nested_message_extension).end(); msg_const_iter != msg_const_end; ++msg_const_iter) { ASSERT_EQ(msg_const_iter->bb(), 1234); } // Test range-based for as well, but only if compiled as C++11. #if __cplusplus >= 201103L // Test one primitive field. for (auto& x : *message.MutableRepeatedExtension( unittest::repeated_int32_extension)) { x = 4321; } for (const auto& x : message.GetRepeatedExtension( unittest::repeated_int32_extension)) { ASSERT_EQ(x, 4321); } // Test one string field. for (auto& x : *message.MutableRepeatedExtension( unittest::repeated_string_extension)) { x = "test_range_based_for"; } for (const auto& x : message.GetRepeatedExtension( unittest::repeated_string_extension)) { ASSERT_TRUE(x == "test_range_based_for"); } // Test one message field. for (auto& x : *message.MutableRepeatedExtension( unittest::repeated_nested_message_extension)) { x.set_bb(4321); } for (const auto& x : *message.MutableRepeatedExtension( unittest::repeated_nested_message_extension)) { ASSERT_EQ(x.bb(), 4321); } #endif } // From b/12926163 TEST(ExtensionSetTest, AbsentExtension) { unittest::TestAllExtensions message; message.MutableRepeatedExtension(unittest::repeated_nested_message_extension) ->Add()->set_bb(123); ASSERT_EQ(1, message.ExtensionSize( unittest::repeated_nested_message_extension)); EXPECT_EQ( 123, message.GetExtension( unittest::repeated_nested_message_extension, 0).bb()); } #ifdef PROTOBUF_HAS_DEATH_TEST TEST(ExtensionSetTest, InvalidEnumDeath) { unittest::TestAllExtensions message; EXPECT_DEBUG_DEATH( message.SetExtension(unittest::optional_foreign_enum_extension, static_cast(53)), "IsValid"); } #endif // PROTOBUF_HAS_DEATH_TEST TEST(ExtensionSetTest, DynamicExtensions) { // Test adding a dynamic extension to a compiled-in message object. FileDescriptorProto dynamic_proto; dynamic_proto.set_name("dynamic_extensions_test.proto"); dynamic_proto.add_dependency( unittest::TestAllExtensions::descriptor()->file()->name()); dynamic_proto.set_package("dynamic_extensions"); // Copy the fields and nested types from TestDynamicExtensions into our new // proto, converting the fields into extensions. const Descriptor* template_descriptor = unittest::TestDynamicExtensions::descriptor(); DescriptorProto template_descriptor_proto; template_descriptor->CopyTo(&template_descriptor_proto); dynamic_proto.mutable_message_type()->MergeFrom( template_descriptor_proto.nested_type()); dynamic_proto.mutable_enum_type()->MergeFrom( template_descriptor_proto.enum_type()); dynamic_proto.mutable_extension()->MergeFrom( template_descriptor_proto.field()); // For each extension that we added... for (int i = 0; i < dynamic_proto.extension_size(); i++) { // Set its extendee to TestAllExtensions. FieldDescriptorProto* extension = dynamic_proto.mutable_extension(i); extension->set_extendee( unittest::TestAllExtensions::descriptor()->full_name()); // If the field refers to one of the types nested in TestDynamicExtensions, // make it refer to the type in our dynamic proto instead. string prefix = "." + template_descriptor->full_name() + "."; if (extension->has_type_name()) { string* type_name = extension->mutable_type_name(); if (HasPrefixString(*type_name, prefix)) { type_name->replace(0, prefix.size(), ".dynamic_extensions."); } } } // Now build the file, using the generated pool as an underlay. DescriptorPool dynamic_pool(DescriptorPool::generated_pool()); const FileDescriptor* file = dynamic_pool.BuildFile(dynamic_proto); ASSERT_TRUE(file != NULL); DynamicMessageFactory dynamic_factory(&dynamic_pool); dynamic_factory.SetDelegateToGeneratedFactory(true); // Construct a message that we can parse with the extensions we defined. // Since the extensions were based off of the fields of TestDynamicExtensions, // we can use that message to create this test message. string data; { unittest::TestDynamicExtensions message; message.set_scalar_extension(123); message.set_enum_extension(unittest::FOREIGN_BAR); message.set_dynamic_enum_extension( unittest::TestDynamicExtensions::DYNAMIC_BAZ); message.mutable_message_extension()->set_c(456); message.mutable_dynamic_message_extension()->set_dynamic_field(789); message.add_repeated_extension("foo"); message.add_repeated_extension("bar"); message.add_packed_extension(12); message.add_packed_extension(-34); message.add_packed_extension(56); message.add_packed_extension(-78); // Also add some unknown fields. // An unknown enum value (for a known field). message.mutable_unknown_fields()->AddVarint( unittest::TestDynamicExtensions::kDynamicEnumExtensionFieldNumber, 12345); // A regular unknown field. message.mutable_unknown_fields()->AddLengthDelimited(54321, "unknown"); message.SerializeToString(&data); } // Now we can parse this using our dynamic extension definitions... unittest::TestAllExtensions message; { io::ArrayInputStream raw_input(data.data(), data.size()); io::CodedInputStream input(&raw_input); input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory); ASSERT_TRUE(message.ParseFromCodedStream(&input)); ASSERT_TRUE(input.ConsumedEntireMessage()); } // Can we print it? EXPECT_EQ( "[dynamic_extensions.scalar_extension]: 123\n" "[dynamic_extensions.enum_extension]: FOREIGN_BAR\n" "[dynamic_extensions.dynamic_enum_extension]: DYNAMIC_BAZ\n" "[dynamic_extensions.message_extension] {\n" " c: 456\n" "}\n" "[dynamic_extensions.dynamic_message_extension] {\n" " dynamic_field: 789\n" "}\n" "[dynamic_extensions.repeated_extension]: \"foo\"\n" "[dynamic_extensions.repeated_extension]: \"bar\"\n" "[dynamic_extensions.packed_extension]: 12\n" "[dynamic_extensions.packed_extension]: -34\n" "[dynamic_extensions.packed_extension]: 56\n" "[dynamic_extensions.packed_extension]: -78\n" "2002: 12345\n" "54321: \"unknown\"\n", message.DebugString()); // Can we serialize it? // (Don't use EXPECT_EQ because we don't want to dump raw binary data to the // terminal on failure.) EXPECT_TRUE(message.SerializeAsString() == data); // What if we parse using the reflection-based parser? { unittest::TestAllExtensions message2; io::ArrayInputStream raw_input(data.data(), data.size()); io::CodedInputStream input(&raw_input); input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory); ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message2)); ASSERT_TRUE(input.ConsumedEntireMessage()); EXPECT_EQ(message.DebugString(), message2.DebugString()); } // Are the embedded generated types actually using the generated objects? { const FieldDescriptor* message_extension = file->FindExtensionByName("message_extension"); ASSERT_TRUE(message_extension != NULL); const Message& sub_message = message.GetReflection()->GetMessage(message, message_extension); const unittest::ForeignMessage* typed_sub_message = #ifdef GOOGLE_PROTOBUF_NO_RTTI static_cast(&sub_message); #else dynamic_cast(&sub_message); #endif ASSERT_TRUE(typed_sub_message != NULL); EXPECT_EQ(456, typed_sub_message->c()); } // What does GetMessage() return for the embedded dynamic type if it isn't // present? { const FieldDescriptor* dynamic_message_extension = file->FindExtensionByName("dynamic_message_extension"); ASSERT_TRUE(dynamic_message_extension != NULL); const Message& parent = unittest::TestAllExtensions::default_instance(); const Message& sub_message = parent.GetReflection()->GetMessage(parent, dynamic_message_extension, &dynamic_factory); const Message* prototype = dynamic_factory.GetPrototype(dynamic_message_extension->message_type()); EXPECT_EQ(prototype, &sub_message); } } } // namespace } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/field_mask.pb.cc000066400000000000000000000330261334102242000303020ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/field_mask.proto #include #include #include #include #include #include #include #include #include #include #include // This is a temporary google only hack #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS #include "third_party/protobuf/version.h" #endif // @@protoc_insertion_point(includes) namespace google { namespace protobuf { class FieldMaskDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _FieldMask_default_instance_; } // namespace protobuf } // namespace google namespace protobuf_google_2fprotobuf_2ffield_5fmask_2eproto { void InitDefaultsFieldMaskImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_FieldMask_default_instance_; new (ptr) ::google::protobuf::FieldMask(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::FieldMask::InitAsDefaultInstance(); } void InitDefaultsFieldMask() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsFieldMaskImpl); } ::google::protobuf::Metadata file_level_metadata[1]; const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldMask, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::FieldMask, paths_), }; static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { { 0, -1, sizeof(::google::protobuf::FieldMask)}, }; static ::google::protobuf::Message const * const file_default_instances[] = { reinterpret_cast(&::google::protobuf::_FieldMask_default_instance_), }; void protobuf_AssignDescriptors() { AddDescriptors(); ::google::protobuf::MessageFactory* factory = NULL; AssignDescriptors( "google/protobuf/field_mask.proto", schemas, file_default_instances, TableStruct::offsets, factory, file_level_metadata, NULL, NULL); } void protobuf_AssignDescriptorsOnce() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors); } void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD; void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1); } void AddDescriptorsImpl() { InitDefaults(); static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_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" "\211\001\n\023com.google.protobufB\016FieldMaskProtoP" "\001Z9google.golang.org/genproto/protobuf/f" "ield_mask;field_mask\242\002\003GPB\252\002\036Google.Prot" "obuf.WellKnownTypesb\006proto3" }; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( descriptor, 227); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "google/protobuf/field_mask.proto", &protobuf_RegisterTypes); } void AddDescriptors() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl); } // Force AddDescriptors() to be called at dynamic initialization time. struct StaticDescriptorInitializer { StaticDescriptorInitializer() { AddDescriptors(); } } static_descriptor_initializer; } // namespace protobuf_google_2fprotobuf_2ffield_5fmask_2eproto namespace google { namespace protobuf { // =================================================================== void FieldMask::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int FieldMask::kPathsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 FieldMask::FieldMask() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::InitDefaultsFieldMask(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.FieldMask) } FieldMask::FieldMask(const FieldMask& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), paths_(from.paths_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); // @@protoc_insertion_point(copy_constructor:google.protobuf.FieldMask) } void FieldMask::SharedCtor() { _cached_size_ = 0; } FieldMask::~FieldMask() { // @@protoc_insertion_point(destructor:google.protobuf.FieldMask) SharedDtor(); } void FieldMask::SharedDtor() { } void FieldMask::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* FieldMask::descriptor() { ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const FieldMask& FieldMask::default_instance() { ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::InitDefaultsFieldMask(); return *internal_default_instance(); } FieldMask* FieldMask::New(::google::protobuf::Arena* arena) const { FieldMask* n = new FieldMask; if (arena != NULL) { arena->Own(n); } return n; } void FieldMask::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.FieldMask) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; paths_.Clear(); _internal_metadata_.Clear(); } bool FieldMask::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.FieldMask) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated string paths = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->add_paths())); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->paths(this->paths_size() - 1).data(), static_cast(this->paths(this->paths_size() - 1).length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.FieldMask.paths")); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.FieldMask) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.FieldMask) return false; #undef DO_ } void FieldMask::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.FieldMask) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated string paths = 1; for (int i = 0, n = this->paths_size(); i < n; i++) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->paths(i).data(), static_cast(this->paths(i).length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.FieldMask.paths"); ::google::protobuf::internal::WireFormatLite::WriteString( 1, this->paths(i), output); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.FieldMask) } ::google::protobuf::uint8* FieldMask::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.FieldMask) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated string paths = 1; for (int i = 0, n = this->paths_size(); i < n; i++) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->paths(i).data(), static_cast(this->paths(i).length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.FieldMask.paths"); target = ::google::protobuf::internal::WireFormatLite:: WriteStringToArray(1, this->paths(i), target); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.FieldMask) return target; } size_t FieldMask::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.FieldMask) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } // repeated string paths = 1; total_size += 1 * ::google::protobuf::internal::FromIntSize(this->paths_size()); for (int i = 0, n = this->paths_size(); i < n; i++) { total_size += ::google::protobuf::internal::WireFormatLite::StringSize( this->paths(i)); } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void FieldMask::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.FieldMask) GOOGLE_DCHECK_NE(&from, this); const FieldMask* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.FieldMask) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.FieldMask) MergeFrom(*source); } } void FieldMask::MergeFrom(const FieldMask& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.FieldMask) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; paths_.MergeFrom(from.paths_); } void FieldMask::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.FieldMask) if (&from == this) return; Clear(); MergeFrom(from); } void FieldMask::CopyFrom(const FieldMask& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.FieldMask) if (&from == this) return; Clear(); MergeFrom(from); } bool FieldMask::IsInitialized() const { return true; } void FieldMask::Swap(FieldMask* other) { if (other == this) return; InternalSwap(other); } void FieldMask::InternalSwap(FieldMask* other) { using std::swap; paths_.InternalSwap(&other->paths_); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata FieldMask::GetMetadata() const { protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::file_level_metadata[kIndexInFileMessages]; } // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/field_mask.pb.h000066400000000000000000000227661334102242000301550ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/field_mask.proto #ifndef PROTOBUF_google_2fprotobuf_2ffield_5fmask_2eproto__INCLUDED #define PROTOBUF_google_2fprotobuf_2ffield_5fmask_2eproto__INCLUDED #include #include #if GOOGLE_PROTOBUF_VERSION < 3005000 #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 3005001 < GOOGLE_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 #include #include #include #include #include #include #include #include // IWYU pragma: export #include // IWYU pragma: export #include // @@protoc_insertion_point(includes) namespace protobuf_google_2fprotobuf_2ffield_5fmask_2eproto { // Internal implementation detail -- do not use these members. struct LIBPROTOBUF_EXPORT TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; static const ::google::protobuf::internal::ParseTable schema[1]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; }; void LIBPROTOBUF_EXPORT AddDescriptors(); void LIBPROTOBUF_EXPORT InitDefaultsFieldMaskImpl(); void LIBPROTOBUF_EXPORT InitDefaultsFieldMask(); inline void LIBPROTOBUF_EXPORT InitDefaults() { InitDefaultsFieldMask(); } } // namespace protobuf_google_2fprotobuf_2ffield_5fmask_2eproto namespace google { namespace protobuf { class FieldMask; class FieldMaskDefaultTypeInternal; LIBPROTOBUF_EXPORT extern FieldMaskDefaultTypeInternal _FieldMask_default_instance_; } // namespace protobuf } // namespace google namespace google { namespace protobuf { // =================================================================== class LIBPROTOBUF_EXPORT FieldMask : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.FieldMask) */ { public: FieldMask(); virtual ~FieldMask(); FieldMask(const FieldMask& from); inline FieldMask& operator=(const FieldMask& from) { CopyFrom(from); return *this; } #if LANG_CXX11 FieldMask(FieldMask&& from) noexcept : FieldMask() { *this = ::std::move(from); } inline FieldMask& operator=(FieldMask&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif static const ::google::protobuf::Descriptor* descriptor(); static const FieldMask& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const FieldMask* internal_default_instance() { return reinterpret_cast( &_FieldMask_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 0; void Swap(FieldMask* other); friend void swap(FieldMask& a, FieldMask& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline FieldMask* New() const PROTOBUF_FINAL { return New(NULL); } FieldMask* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const FieldMask& from); void MergeFrom(const FieldMask& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(FieldMask* other); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return NULL; } inline void* MaybeArenaPtr() const { return NULL; } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated string paths = 1; int paths_size() const; void clear_paths(); static const int kPathsFieldNumber = 1; const ::std::string& paths(int index) const; ::std::string* mutable_paths(int index); void set_paths(int index, const ::std::string& value); #if LANG_CXX11 void set_paths(int index, ::std::string&& value); #endif void set_paths(int index, const char* value); void set_paths(int index, const char* value, size_t size); ::std::string* add_paths(); void add_paths(const ::std::string& value); #if LANG_CXX11 void add_paths(::std::string&& value); #endif void add_paths(const char* value); void add_paths(const char* value, size_t size); const ::google::protobuf::RepeatedPtrField< ::std::string>& paths() const; ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_paths(); // @@protoc_insertion_point(class_scope:google.protobuf.FieldMask) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; ::google::protobuf::RepeatedPtrField< ::std::string> paths_; mutable int _cached_size_; friend struct ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2ffield_5fmask_2eproto::InitDefaultsFieldMaskImpl(); }; // =================================================================== // =================================================================== #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif // __GNUC__ // FieldMask // repeated string paths = 1; inline int FieldMask::paths_size() const { return paths_.size(); } inline void FieldMask::clear_paths() { paths_.Clear(); } inline const ::std::string& FieldMask::paths(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.FieldMask.paths) return paths_.Get(index); } inline ::std::string* FieldMask::mutable_paths(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.FieldMask.paths) return paths_.Mutable(index); } inline void FieldMask::set_paths(int index, const ::std::string& value) { // @@protoc_insertion_point(field_set:google.protobuf.FieldMask.paths) paths_.Mutable(index)->assign(value); } #if LANG_CXX11 inline void FieldMask::set_paths(int index, ::std::string&& value) { // @@protoc_insertion_point(field_set:google.protobuf.FieldMask.paths) paths_.Mutable(index)->assign(std::move(value)); } #endif inline void FieldMask::set_paths(int index, const char* value) { GOOGLE_DCHECK(value != NULL); 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) { paths_.Mutable(index)->assign( reinterpret_cast(value), size); // @@protoc_insertion_point(field_set_pointer:google.protobuf.FieldMask.paths) } inline ::std::string* FieldMask::add_paths() { // @@protoc_insertion_point(field_add_mutable:google.protobuf.FieldMask.paths) return paths_.Add(); } inline void FieldMask::add_paths(const ::std::string& value) { paths_.Add()->assign(value); // @@protoc_insertion_point(field_add:google.protobuf.FieldMask.paths) } #if LANG_CXX11 inline void FieldMask::add_paths(::std::string&& value) { paths_.Add(std::move(value)); // @@protoc_insertion_point(field_add:google.protobuf.FieldMask.paths) } #endif inline void FieldMask::add_paths(const char* value) { GOOGLE_DCHECK(value != NULL); 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) { paths_.Add()->assign(reinterpret_cast(value), size); // @@protoc_insertion_point(field_add_pointer:google.protobuf.FieldMask.paths) } inline const ::google::protobuf::RepeatedPtrField< ::std::string>& FieldMask::paths() const { // @@protoc_insertion_point(field_list:google.protobuf.FieldMask.paths) return paths_; } inline ::google::protobuf::RepeatedPtrField< ::std::string>* FieldMask::mutable_paths() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.FieldMask.paths) return &paths_; } #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) #endif // PROTOBUF_google_2fprotobuf_2ffield_5fmask_2eproto__INCLUDED python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/field_mask.proto000066400000000000000000000200041334102242000304500ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option java_package = "com.google.protobuf"; option java_outer_classname = "FieldMaskProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; option go_package = "google.golang.org/genproto/protobuf/field_mask;field_mask"; // `FieldMask` represents a set of symbolic field paths, for example: // // paths: "f.a" // paths: "f.b.d" // // Here `f` represents a field in some root message, `a` and `b` // fields in the message found in `f`, and `d` a field found in the // message in `f.b`. // // Field masks are used to specify a subset of fields that should be // returned by a get operation or modified by an update operation. // Field masks also have a custom JSON encoding (see below). // // # Field Masks in Projections // // When used in the context of a projection, a response message or // sub-message is filtered by the API to only contain those fields as // specified in the mask. For example, if the mask in the previous // example is applied to a response message as follows: // // f { // a : 22 // b { // d : 1 // x : 2 // } // y : 13 // } // z: 8 // // The result will not contain specific values for fields x,y and z // (their value will be set to the default, and omitted in proto text // output): // // // f { // a : 22 // b { // d : 1 // } // } // // A repeated field is not allowed except at the last position of a // paths string. // // If a FieldMask object is not present in a get operation, the // operation applies to all fields (as if a FieldMask of all fields // had been specified). // // Note that a field mask does not necessarily apply to the // top-level response message. In case of a REST get operation, the // field mask applies directly to the response, but in case of a REST // list operation, the mask instead applies to each individual message // in the returned resource list. In case of a REST custom method, // other definitions may be used. Where the mask applies will be // clearly documented together with its declaration in the API. In // any case, the effect on the returned resource/resources is required // behavior for APIs. // // # Field Masks in Update Operations // // A field mask in update operations specifies which fields of the // targeted resource are going to be updated. The API is required // to only change the values of the fields as specified in the mask // and leave the others untouched. If a resource is passed in to // describe the updated values, the API ignores the values of all // fields not covered by the mask. // // If a repeated field is specified for an update operation, the existing // repeated values in the target resource will be overwritten by the new values. // Note that a repeated field is only allowed in the last position of a `paths` // string. // // If a sub-message is specified in the last position of the field mask for an // update operation, then the existing sub-message in the target resource is // overwritten. Given the target message: // // f { // b { // d : 1 // x : 2 // } // c : 1 // } // // And an update message: // // f { // b { // d : 10 // } // } // // then if the field mask is: // // paths: "f.b" // // then the result will be: // // f { // b { // d : 10 // } // c : 1 // } // // However, if the update mask was: // // paths: "f.b.d" // // then the result would be: // // f { // b { // d : 10 // x : 2 // } // c : 1 // } // // In order to reset a field's value to the default, the field must // be in the mask and set to the default value in the provided resource. // Hence, in order to reset all fields of a resource, provide a default // instance of the resource and set all fields in the mask, or do // not provide a mask as described below. // // If a field mask is not present on update, the operation applies to // all fields (as if a field mask of all fields has been specified). // Note that in the presence of schema evolution, this may mean that // fields the client does not know and has therefore not filled into // the request will be reset to their default. If this is unwanted // behavior, a specific service may require a client to always specify // a field mask, producing an error if not. // // As with get operations, the location of the resource which // describes the updated values in the request message depends on the // operation kind. In any case, the effect of the field mask is // required to be honored by the API. // // ## Considerations for HTTP REST // // The HTTP kind of an update operation which uses a field mask must // be set to PATCH instead of PUT in order to satisfy HTTP semantics // (PUT must only be used for full updates). // // # JSON Encoding of Field Masks // // In JSON, a field mask is encoded as a single string where paths are // separated by a comma. Fields name in each path are converted // to/from lower-camel naming conventions. // // As an example, consider the following message declarations: // // message Profile { // User user = 1; // Photo photo = 2; // } // message User { // string display_name = 1; // string address = 2; // } // // In proto a field mask for `Profile` may look as such: // // mask { // paths: "user.display_name" // paths: "photo" // } // // In JSON, the same mask is represented as below: // // { // mask: "user.displayName,photo" // } // // # Field Masks and Oneof Fields // // Field masks treat fields in oneofs just as regular fields. Consider the // following message: // // message SampleMessage { // oneof test_oneof { // string name = 4; // SubMessage sub_message = 9; // } // } // // The field mask can be: // // mask { // paths: "name" // } // // Or: // // mask { // paths: "sub_message" // } // // Note that oneof type names ("test_oneof" in this case) cannot be used in // paths. // // ## Field Mask Verification // // The implementation of the all the API methods, which have any FieldMask type // field in the request, should verify the included field paths, and return // `INVALID_ARGUMENT` error if any path is duplicated or unmappable. message FieldMask { // The set of field mask paths. repeated string paths = 1; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/generated_enum_reflection.h000066400000000000000000000072521334102242000326440ustar00rootroot00000000000000// 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: jasonh@google.com (Jason Hsueh) // // This header is logically internal, but is made public because it is used // from protocol-compiler-generated code, which may reside in other components. // It provides reflection support for generated enums, and is included in // generated .pb.h files and should have minimal dependencies. The methods are // implemented in generated_message_reflection.cc. #ifndef GOOGLE_PROTOBUF_GENERATED_ENUM_REFLECTION_H__ #define GOOGLE_PROTOBUF_GENERATED_ENUM_REFLECTION_H__ #include #include #include namespace google { namespace protobuf { class EnumDescriptor; } // namespace protobuf namespace protobuf { // Returns the EnumDescriptor for enum type E, which must be a // proto-declared enum type. Code generated by the protocol compiler // will include specializations of this template for each enum type declared. template const EnumDescriptor* GetEnumDescriptor(); namespace internal { // Helper for EnumType_Parse functions: try to parse the string 'name' as an // enum name of the given type, returning true and filling in value on success, // or returning false and leaving value unchanged on failure. LIBPROTOBUF_EXPORT bool ParseNamedEnum(const EnumDescriptor* descriptor, const string& name, int* value); template bool ParseNamedEnum(const EnumDescriptor* descriptor, const string& name, EnumType* value) { int tmp; if (!ParseNamedEnum(descriptor, name, &tmp)) return false; *value = static_cast(tmp); return true; } // Just a wrapper around printing the name of a value. The main point of this // function is not to be inlined, so that you can do this without including // descriptor.h. LIBPROTOBUF_EXPORT const string& NameOfEnum(const EnumDescriptor* descriptor, int value); } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_GENERATED_ENUM_REFLECTION_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/generated_enum_util.h000066400000000000000000000041151334102242000314620ustar00rootroot00000000000000// 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_GENERATED_ENUM_UTIL_H__ #define GOOGLE_PROTOBUF_GENERATED_ENUM_UTIL_H__ #include namespace google { namespace protobuf { // This type trait can be used to cause templates to only match proto2 enum // types. template struct is_proto_enum : ::google::protobuf::internal::false_type {}; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_GENERATED_ENUM_UTIL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/generated_message_reflection.cc000066400000000000000000002564371334102242000334750ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include #include #define GOOGLE_PROTOBUF_HAS_ONEOF namespace google { namespace protobuf { namespace internal { namespace { bool IsMapFieldInApi(const FieldDescriptor* field) { return field->is_map(); } } // anonymous namespace bool ParseNamedEnum(const EnumDescriptor* descriptor, const string& name, int* value) { const EnumValueDescriptor* d = descriptor->FindValueByName(name); if (d == NULL) return false; *value = d->number(); return true; } const string& NameOfEnum(const EnumDescriptor* descriptor, int value) { const EnumValueDescriptor* d = descriptor->FindValueByNumber(value); return (d == NULL ? GetEmptyString() : d->name()); } // =================================================================== // Helpers for reporting usage errors (e.g. trying to use GetInt32() on // a string field). namespace { template To* GetPointerAtOffset(Message* message, uint32 offset) { return reinterpret_cast(reinterpret_cast(message) + offset); } template const To* GetConstPointerAtOffset(const Message* message, uint32 offset) { return reinterpret_cast(reinterpret_cast(message) + offset); } template const To& GetConstRefAtOffset(const Message& message, uint32 offset) { return *GetConstPointerAtOffset(&message, offset); } void ReportReflectionUsageError( const Descriptor* descriptor, const FieldDescriptor* field, const char* method, const char* description) { GOOGLE_LOG(FATAL) << "Protocol Buffer reflection usage error:\n" " Method : google::protobuf::Reflection::" << method << "\n" " Message type: " << descriptor->full_name() << "\n" " Field : " << field->full_name() << "\n" " Problem : " << description; } const char* cpptype_names_[FieldDescriptor::MAX_CPPTYPE + 1] = { "INVALID_CPPTYPE", "CPPTYPE_INT32", "CPPTYPE_INT64", "CPPTYPE_UINT32", "CPPTYPE_UINT64", "CPPTYPE_DOUBLE", "CPPTYPE_FLOAT", "CPPTYPE_BOOL", "CPPTYPE_ENUM", "CPPTYPE_STRING", "CPPTYPE_MESSAGE" }; static void ReportReflectionUsageTypeError( const Descriptor* descriptor, const FieldDescriptor* field, const char* method, FieldDescriptor::CppType expected_type) { GOOGLE_LOG(FATAL) << "Protocol Buffer reflection usage error:\n" " Method : google::protobuf::Reflection::" << method << "\n" " Message type: " << descriptor->full_name() << "\n" " Field : " << field->full_name() << "\n" " Problem : Field is not the right type for this message:\n" " Expected : " << cpptype_names_[expected_type] << "\n" " Field type: " << cpptype_names_[field->cpp_type()]; } static void ReportReflectionUsageEnumTypeError( const Descriptor* descriptor, const FieldDescriptor* field, const char* method, const EnumValueDescriptor* value) { GOOGLE_LOG(FATAL) << "Protocol Buffer reflection usage error:\n" " Method : google::protobuf::Reflection::" << method << "\n" " Message type: " << descriptor->full_name() << "\n" " Field : " << field->full_name() << "\n" " Problem : Enum value did not match field type:\n" " Expected : " << field->enum_type()->full_name() << "\n" " Actual : " << value->full_name(); } #define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION) \ if (!(CONDITION)) \ ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION) #define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION) \ USAGE_CHECK((A) == (B), METHOD, ERROR_DESCRIPTION) #define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION) \ USAGE_CHECK((A) != (B), METHOD, ERROR_DESCRIPTION) #define USAGE_CHECK_TYPE(METHOD, CPPTYPE) \ if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE) \ ReportReflectionUsageTypeError(descriptor_, field, #METHOD, \ FieldDescriptor::CPPTYPE_##CPPTYPE) #define USAGE_CHECK_ENUM_VALUE(METHOD) \ if (value->type() != field->enum_type()) \ ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value) #define USAGE_CHECK_MESSAGE_TYPE(METHOD) \ USAGE_CHECK_EQ(field->containing_type(), descriptor_, \ METHOD, "Field does not match message type."); #define USAGE_CHECK_SINGULAR(METHOD) \ USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \ "Field is repeated; the method requires a singular field.") #define USAGE_CHECK_REPEATED(METHOD) \ USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \ "Field is singular; the method requires a repeated field.") #define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE) \ USAGE_CHECK_MESSAGE_TYPE(METHOD); \ USAGE_CHECK_##LABEL(METHOD); \ USAGE_CHECK_TYPE(METHOD, CPPTYPE) } // namespace // =================================================================== GeneratedMessageReflection::GeneratedMessageReflection( const Descriptor* descriptor, const ReflectionSchema& schema, const DescriptorPool* pool, MessageFactory* factory) : descriptor_(descriptor), schema_(schema), descriptor_pool_((pool == NULL) ? DescriptorPool::generated_pool() : pool), message_factory_(factory), last_non_weak_field_index_(-1) { last_non_weak_field_index_ = descriptor_->field_count() - 1; } GeneratedMessageReflection::~GeneratedMessageReflection() {} const UnknownFieldSet& GeneratedMessageReflection::GetUnknownFields( const Message& message) const { if (descriptor_->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 && !GetProto3PreserveUnknownsDefault()) { // We have to ensure that any mutations made to the return value of // MutableUnknownFields() are not reflected here when Proto3 defaults to // discard unknowns. return *UnknownFieldSet::default_instance(); } else { return GetInternalMetadataWithArena(message).unknown_fields(); } } UnknownFieldSet* GeneratedMessageReflection::MutableUnknownFields( Message* message) const { return MutableInternalMetadataWithArena(message)->mutable_unknown_fields(); } size_t GeneratedMessageReflection::SpaceUsedLong(const Message& message) const { // object_size_ already includes the in-memory representation of each field // in the message, so we only need to account for additional memory used by // the fields. size_t total_size = schema_.GetObjectSize(); total_size += GetUnknownFields(message).SpaceUsedExcludingSelfLong(); if (schema_.HasExtensionSet()) { total_size += GetExtensionSet(message).SpaceUsedExcludingSelfLong(); } for (int i = 0; i <= last_non_weak_field_index_; i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->is_repeated()) { switch (field->cpp_type()) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ case FieldDescriptor::CPPTYPE_##UPPERCASE : \ total_size += GetRaw >(message, field) \ .SpaceUsedExcludingSelfLong(); \ break HANDLE_TYPE( INT32, int32); HANDLE_TYPE( INT64, int64); HANDLE_TYPE(UINT32, uint32); HANDLE_TYPE(UINT64, uint64); HANDLE_TYPE(DOUBLE, double); HANDLE_TYPE( FLOAT, float); HANDLE_TYPE( BOOL, bool); HANDLE_TYPE( ENUM, int); #undef HANDLE_TYPE case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: total_size += GetRaw >(message, field) .SpaceUsedExcludingSelfLong(); break; } break; case FieldDescriptor::CPPTYPE_MESSAGE: if (IsMapFieldInApi(field)) { total_size += GetRaw(message, field) .SpaceUsedExcludingSelfLong(); } else { // We don't know which subclass of RepeatedPtrFieldBase the type is, // so we use RepeatedPtrFieldBase directly. total_size += GetRaw(message, field) .SpaceUsedExcludingSelfLong >(); } break; } } else { if (field->containing_oneof() && !HasOneofField(message, field)) { continue; } switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32 : case FieldDescriptor::CPPTYPE_INT64 : case FieldDescriptor::CPPTYPE_UINT32: case FieldDescriptor::CPPTYPE_UINT64: case FieldDescriptor::CPPTYPE_DOUBLE: case FieldDescriptor::CPPTYPE_FLOAT : case FieldDescriptor::CPPTYPE_BOOL : case FieldDescriptor::CPPTYPE_ENUM : // Field is inline, so we've already counted it. break; case FieldDescriptor::CPPTYPE_STRING: { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: { // Initially, the string points to the default value stored in // the prototype. Only count the string if it has been changed // from the default value. const string* default_ptr = &DefaultRaw(field).Get(); const string* ptr = &GetField(message, field).Get(); if (ptr != default_ptr) { // string fields are represented by just a pointer, so also // include sizeof(string) as well. total_size += sizeof(*ptr) + StringSpaceUsedExcludingSelfLong(*ptr); } break; } } break; } case FieldDescriptor::CPPTYPE_MESSAGE: if (schema_.IsDefaultInstance(message)) { // For singular fields, the prototype just stores a pointer to the // external type's prototype, so there is no extra memory usage. } else { const Message* sub_message = GetRaw(message, field); if (sub_message != NULL) { total_size += sub_message->SpaceUsedLong(); } } break; } } } return total_size; } void GeneratedMessageReflection::SwapField( Message* message1, Message* message2, const FieldDescriptor* field) const { if (field->is_repeated()) { switch (field->cpp_type()) { #define SWAP_ARRAYS(CPPTYPE, TYPE) \ case FieldDescriptor::CPPTYPE_##CPPTYPE: \ MutableRaw >(message1, field)->Swap( \ MutableRaw >(message2, field)); \ break; SWAP_ARRAYS(INT32 , int32 ); SWAP_ARRAYS(INT64 , int64 ); SWAP_ARRAYS(UINT32, uint32); SWAP_ARRAYS(UINT64, uint64); SWAP_ARRAYS(FLOAT , float ); SWAP_ARRAYS(DOUBLE, double); SWAP_ARRAYS(BOOL , bool ); SWAP_ARRAYS(ENUM , int ); #undef SWAP_ARRAYS case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: MutableRaw(message1, field)-> Swap >( MutableRaw(message2, field)); break; } break; case FieldDescriptor::CPPTYPE_MESSAGE: if (IsMapFieldInApi(field)) { MutableRaw(message1, field)-> MutableRepeatedField()-> Swap >( MutableRaw(message2, field)-> MutableRepeatedField()); } else { MutableRaw(message1, field)-> Swap >( MutableRaw(message2, field)); } break; default: GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type(); } } else { switch (field->cpp_type()) { #define SWAP_VALUES(CPPTYPE, TYPE) \ case FieldDescriptor::CPPTYPE_##CPPTYPE: \ std::swap(*MutableRaw(message1, field), \ *MutableRaw(message2, field)); \ break; SWAP_VALUES(INT32 , int32 ); SWAP_VALUES(INT64 , int64 ); SWAP_VALUES(UINT32, uint32); SWAP_VALUES(UINT64, uint64); SWAP_VALUES(FLOAT , float ); SWAP_VALUES(DOUBLE, double); SWAP_VALUES(BOOL , bool ); SWAP_VALUES(ENUM , int ); #undef SWAP_VALUES case FieldDescriptor::CPPTYPE_MESSAGE: if (GetArena(message1) == GetArena(message2)) { std::swap(*MutableRaw(message1, field), *MutableRaw(message2, field)); } else { Message** sub_msg1 = MutableRaw(message1, field); Message** sub_msg2 = MutableRaw(message2, field); if (*sub_msg1 == NULL && *sub_msg2 == NULL) break; if (*sub_msg1 && *sub_msg2) { (*sub_msg1)->GetReflection()->Swap(*sub_msg1, *sub_msg2); break; } if (*sub_msg1 == NULL) { *sub_msg1 = (*sub_msg2)->New(message1->GetArena()); (*sub_msg1)->CopyFrom(**sub_msg2); ClearField(message2, field); } else { *sub_msg2 = (*sub_msg1)->New(message2->GetArena()); (*sub_msg2)->CopyFrom(**sub_msg1); ClearField(message1, field); } } break; case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: { Arena* arena1 = GetArena(message1); Arena* arena2 = GetArena(message2); ArenaStringPtr* string1 = MutableRaw(message1, field); ArenaStringPtr* string2 = MutableRaw(message2, field); if (arena1 == arena2) { string1->Swap(string2); } else { const string* default_ptr = &DefaultRaw(field).Get(); const string temp = string1->Get(); string1->Set(default_ptr, string2->Get(), arena1); string2->Set(default_ptr, temp, arena2); } } break; } break; default: GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type(); } } } void GeneratedMessageReflection::SwapOneofField( Message* message1, Message* message2, const OneofDescriptor* oneof_descriptor) const { uint32 oneof_case1 = GetOneofCase(*message1, oneof_descriptor); uint32 oneof_case2 = GetOneofCase(*message2, oneof_descriptor); int32 temp_int32; int64 temp_int64; uint32 temp_uint32; uint64 temp_uint64; float temp_float; double temp_double; bool temp_bool; int temp_int; Message* temp_message = NULL; string temp_string; // Stores message1's oneof field to a temp variable. const FieldDescriptor* field1 = NULL; if (oneof_case1 > 0) { field1 = descriptor_->FindFieldByNumber(oneof_case1); //oneof_descriptor->field(oneof_case1); switch (field1->cpp_type()) { #define GET_TEMP_VALUE(CPPTYPE, TYPE) \ case FieldDescriptor::CPPTYPE_##CPPTYPE: \ temp_##TYPE = GetField(*message1, field1); \ break; GET_TEMP_VALUE(INT32 , int32 ); GET_TEMP_VALUE(INT64 , int64 ); GET_TEMP_VALUE(UINT32, uint32); GET_TEMP_VALUE(UINT64, uint64); GET_TEMP_VALUE(FLOAT , float ); GET_TEMP_VALUE(DOUBLE, double); GET_TEMP_VALUE(BOOL , bool ); GET_TEMP_VALUE(ENUM , int ); #undef GET_TEMP_VALUE case FieldDescriptor::CPPTYPE_MESSAGE: temp_message = ReleaseMessage(message1, field1); break; case FieldDescriptor::CPPTYPE_STRING: temp_string = GetString(*message1, field1); break; default: GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type(); } } // Sets message1's oneof field from the message2's oneof field. if (oneof_case2 > 0) { const FieldDescriptor* field2 = descriptor_->FindFieldByNumber(oneof_case2); switch (field2->cpp_type()) { #define SET_ONEOF_VALUE1(CPPTYPE, TYPE) \ case FieldDescriptor::CPPTYPE_##CPPTYPE: \ SetField(message1, field2, GetField(*message2, field2)); \ break; SET_ONEOF_VALUE1(INT32 , int32 ); SET_ONEOF_VALUE1(INT64 , int64 ); SET_ONEOF_VALUE1(UINT32, uint32); SET_ONEOF_VALUE1(UINT64, uint64); SET_ONEOF_VALUE1(FLOAT , float ); SET_ONEOF_VALUE1(DOUBLE, double); SET_ONEOF_VALUE1(BOOL , bool ); SET_ONEOF_VALUE1(ENUM , int ); #undef SET_ONEOF_VALUE1 case FieldDescriptor::CPPTYPE_MESSAGE: SetAllocatedMessage(message1, ReleaseMessage(message2, field2), field2); break; case FieldDescriptor::CPPTYPE_STRING: SetString(message1, field2, GetString(*message2, field2)); break; default: GOOGLE_LOG(FATAL) << "Unimplemented type: " << field2->cpp_type(); } } else { ClearOneof(message1, oneof_descriptor); } // Sets message2's oneof field from the temp variable. if (oneof_case1 > 0) { switch (field1->cpp_type()) { #define SET_ONEOF_VALUE2(CPPTYPE, TYPE) \ case FieldDescriptor::CPPTYPE_##CPPTYPE: \ SetField(message2, field1, temp_##TYPE); \ break; SET_ONEOF_VALUE2(INT32 , int32 ); SET_ONEOF_VALUE2(INT64 , int64 ); SET_ONEOF_VALUE2(UINT32, uint32); SET_ONEOF_VALUE2(UINT64, uint64); SET_ONEOF_VALUE2(FLOAT , float ); SET_ONEOF_VALUE2(DOUBLE, double); SET_ONEOF_VALUE2(BOOL , bool ); SET_ONEOF_VALUE2(ENUM , int ); #undef SET_ONEOF_VALUE2 case FieldDescriptor::CPPTYPE_MESSAGE: SetAllocatedMessage(message2, temp_message, field1); break; case FieldDescriptor::CPPTYPE_STRING: SetString(message2, field1, temp_string); break; default: GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type(); } } else { ClearOneof(message2, oneof_descriptor); } } void GeneratedMessageReflection::Swap( Message* message1, Message* message2) const { if (message1 == message2) return; // TODO(kenton): Other Reflection methods should probably check this too. GOOGLE_CHECK_EQ(message1->GetReflection(), this) << "First argument to Swap() (of type \"" << message1->GetDescriptor()->full_name() << "\") is not compatible with this reflection object (which is for type \"" << descriptor_->full_name() << "\"). Note that the exact same class is required; not just the same " "descriptor."; GOOGLE_CHECK_EQ(message2->GetReflection(), this) << "Second argument to Swap() (of type \"" << message2->GetDescriptor()->full_name() << "\") is not compatible with this reflection object (which is for type \"" << descriptor_->full_name() << "\"). Note that the exact same class is required; not just the same " "descriptor."; // Check that both messages are in the same arena (or both on the heap). We // need to copy all data if not, due to ownership semantics. if (GetArena(message1) != GetArena(message2)) { // Slow copy path. // Use our arena as temp space, if available. Message* temp = message1->New(GetArena(message1)); temp->MergeFrom(*message2); message2->CopyFrom(*message1); Swap(message1, temp); if (GetArena(message1) == NULL) { delete temp; } return; } if (schema_.HasHasbits()) { uint32* has_bits1 = MutableHasBits(message1); uint32* has_bits2 = MutableHasBits(message2); int fields_with_has_bits = 0; for (int i = 0; i < descriptor_->field_count(); i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->is_repeated() || field->containing_oneof()) { continue; } fields_with_has_bits++; } int has_bits_size = (fields_with_has_bits + 31) / 32; for (int i = 0; i < has_bits_size; i++) { std::swap(has_bits1[i], has_bits2[i]); } } for (int i = 0; i <= last_non_weak_field_index_; i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->containing_oneof()) continue; SwapField(message1, message2, field); } const int oneof_decl_count = descriptor_->oneof_decl_count(); for (int i = 0; i < oneof_decl_count; i++) { SwapOneofField(message1, message2, descriptor_->oneof_decl(i)); } if (schema_.HasExtensionSet()) { MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2)); } MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2)); } void GeneratedMessageReflection::SwapFields( Message* message1, Message* message2, const std::vector& fields) const { if (message1 == message2) return; // TODO(kenton): Other Reflection methods should probably check this too. GOOGLE_CHECK_EQ(message1->GetReflection(), this) << "First argument to SwapFields() (of type \"" << message1->GetDescriptor()->full_name() << "\") is not compatible with this reflection object (which is for type \"" << descriptor_->full_name() << "\"). Note that the exact same class is required; not just the same " "descriptor."; GOOGLE_CHECK_EQ(message2->GetReflection(), this) << "Second argument to SwapFields() (of type \"" << message2->GetDescriptor()->full_name() << "\") is not compatible with this reflection object (which is for type \"" << descriptor_->full_name() << "\"). Note that the exact same class is required; not just the same " "descriptor."; std::set swapped_oneof; const int fields_size = static_cast(fields.size()); for (int i = 0; i < fields_size; i++) { const FieldDescriptor* field = fields[i]; if (field->is_extension()) { MutableExtensionSet(message1)->SwapExtension( MutableExtensionSet(message2), field->number()); } else { if (field->containing_oneof()) { int oneof_index = field->containing_oneof()->index(); // Only swap the oneof field once. if (swapped_oneof.find(oneof_index) != swapped_oneof.end()) { continue; } swapped_oneof.insert(oneof_index); SwapOneofField(message1, message2, field->containing_oneof()); } else { // Swap has bit for non-repeated fields. We have already checked for // oneof already. if (!field->is_repeated()) { SwapBit(message1, message2, field); } // Swap field. SwapField(message1, message2, field); } } } } // ------------------------------------------------------------------- bool GeneratedMessageReflection::HasField(const Message& message, const FieldDescriptor* field) const { USAGE_CHECK_MESSAGE_TYPE(HasField); USAGE_CHECK_SINGULAR(HasField); if (field->is_extension()) { return GetExtensionSet(message).Has(field->number()); } else { if (field->containing_oneof()) { return HasOneofField(message, field); } else { return HasBit(message, field); } } } int GeneratedMessageReflection::FieldSize(const Message& message, const FieldDescriptor* field) const { USAGE_CHECK_MESSAGE_TYPE(FieldSize); USAGE_CHECK_REPEATED(FieldSize); if (field->is_extension()) { return GetExtensionSet(message).ExtensionSize(field->number()); } else { switch (field->cpp_type()) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ case FieldDescriptor::CPPTYPE_##UPPERCASE : \ return GetRaw >(message, field).size() HANDLE_TYPE( INT32, int32); HANDLE_TYPE( INT64, int64); HANDLE_TYPE(UINT32, uint32); HANDLE_TYPE(UINT64, uint64); HANDLE_TYPE(DOUBLE, double); HANDLE_TYPE( FLOAT, float); HANDLE_TYPE( BOOL, bool); HANDLE_TYPE( ENUM, int); #undef HANDLE_TYPE case FieldDescriptor::CPPTYPE_STRING: case FieldDescriptor::CPPTYPE_MESSAGE: if (IsMapFieldInApi(field)) { return GetRaw(message, field).GetRepeatedField().size(); } else { return GetRaw(message, field).size(); } } GOOGLE_LOG(FATAL) << "Can't get here."; return 0; } } void GeneratedMessageReflection::ClearField( Message* message, const FieldDescriptor* field) const { USAGE_CHECK_MESSAGE_TYPE(ClearField); if (field->is_extension()) { MutableExtensionSet(message)->ClearExtension(field->number()); } else if (!field->is_repeated()) { if (field->containing_oneof()) { ClearOneofField(message, field); return; } if (HasBit(*message, field)) { ClearBit(message, field); // We need to set the field back to its default value. switch (field->cpp_type()) { #define CLEAR_TYPE(CPPTYPE, TYPE) \ case FieldDescriptor::CPPTYPE_##CPPTYPE: \ *MutableRaw(message, field) = \ field->default_value_##TYPE(); \ break; CLEAR_TYPE(INT32 , int32 ); CLEAR_TYPE(INT64 , int64 ); CLEAR_TYPE(UINT32, uint32); CLEAR_TYPE(UINT64, uint64); CLEAR_TYPE(FLOAT , float ); CLEAR_TYPE(DOUBLE, double); CLEAR_TYPE(BOOL , bool ); #undef CLEAR_TYPE case FieldDescriptor::CPPTYPE_ENUM: *MutableRaw(message, field) = field->default_value_enum()->number(); break; case FieldDescriptor::CPPTYPE_STRING: { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: { const string* default_ptr = &DefaultRaw(field).Get(); MutableRaw(message, field)->SetAllocated( default_ptr, NULL, GetArena(message)); break; } } break; } case FieldDescriptor::CPPTYPE_MESSAGE: if (!schema_.HasHasbits()) { // Proto3 does not have has-bits and we need to set a message field // to NULL in order to indicate its un-presence. if (GetArena(message) == NULL) { delete *MutableRaw(message, field); } *MutableRaw(message, field) = NULL; } else { (*MutableRaw(message, field))->Clear(); } break; } } } else { switch (field->cpp_type()) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ case FieldDescriptor::CPPTYPE_##UPPERCASE : \ MutableRaw >(message, field)->Clear(); \ break HANDLE_TYPE( INT32, int32); HANDLE_TYPE( INT64, int64); HANDLE_TYPE(UINT32, uint32); HANDLE_TYPE(UINT64, uint64); HANDLE_TYPE(DOUBLE, double); HANDLE_TYPE( FLOAT, float); HANDLE_TYPE( BOOL, bool); HANDLE_TYPE( ENUM, int); #undef HANDLE_TYPE case FieldDescriptor::CPPTYPE_STRING: { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: MutableRaw >(message, field)->Clear(); break; } break; } case FieldDescriptor::CPPTYPE_MESSAGE: { if (IsMapFieldInApi(field)) { MutableRaw(message, field) ->MutableRepeatedField() ->Clear >(); } else { // We don't know which subclass of RepeatedPtrFieldBase the type is, // so we use RepeatedPtrFieldBase directly. MutableRaw(message, field) ->Clear >(); } break; } } } } void GeneratedMessageReflection::RemoveLast( Message* message, const FieldDescriptor* field) const { USAGE_CHECK_MESSAGE_TYPE(RemoveLast); USAGE_CHECK_REPEATED(RemoveLast); if (field->is_extension()) { MutableExtensionSet(message)->RemoveLast(field->number()); } else { switch (field->cpp_type()) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ case FieldDescriptor::CPPTYPE_##UPPERCASE : \ MutableRaw >(message, field)->RemoveLast(); \ break HANDLE_TYPE( INT32, int32); HANDLE_TYPE( INT64, int64); HANDLE_TYPE(UINT32, uint32); HANDLE_TYPE(UINT64, uint64); HANDLE_TYPE(DOUBLE, double); HANDLE_TYPE( FLOAT, float); HANDLE_TYPE( BOOL, bool); HANDLE_TYPE( ENUM, int); #undef HANDLE_TYPE case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: MutableRaw >(message, field)->RemoveLast(); break; } break; case FieldDescriptor::CPPTYPE_MESSAGE: if (IsMapFieldInApi(field)) { MutableRaw(message, field) ->MutableRepeatedField() ->RemoveLast >(); } else { MutableRaw(message, field) ->RemoveLast >(); } break; } } } Message* GeneratedMessageReflection::ReleaseLast( Message* message, const FieldDescriptor* field) const { USAGE_CHECK_ALL(ReleaseLast, REPEATED, MESSAGE); if (field->is_extension()) { return static_cast( MutableExtensionSet(message)->ReleaseLast(field->number())); } else { if (IsMapFieldInApi(field)) { return MutableRaw(message, field) ->MutableRepeatedField() ->ReleaseLast >(); } else { return MutableRaw(message, field) ->ReleaseLast >(); } } } void GeneratedMessageReflection::SwapElements( Message* message, const FieldDescriptor* field, int index1, int index2) const { USAGE_CHECK_MESSAGE_TYPE(Swap); USAGE_CHECK_REPEATED(Swap); if (field->is_extension()) { MutableExtensionSet(message)->SwapElements(field->number(), index1, index2); } else { switch (field->cpp_type()) { #define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ case FieldDescriptor::CPPTYPE_##UPPERCASE : \ MutableRaw >(message, field) \ ->SwapElements(index1, index2); \ break HANDLE_TYPE( INT32, int32); HANDLE_TYPE( INT64, int64); HANDLE_TYPE(UINT32, uint32); HANDLE_TYPE(UINT64, uint64); HANDLE_TYPE(DOUBLE, double); HANDLE_TYPE( FLOAT, float); HANDLE_TYPE( BOOL, bool); HANDLE_TYPE( ENUM, int); #undef HANDLE_TYPE case FieldDescriptor::CPPTYPE_STRING: case FieldDescriptor::CPPTYPE_MESSAGE: if (IsMapFieldInApi(field)) { MutableRaw(message, field) ->MutableRepeatedField() ->SwapElements(index1, index2); } else { MutableRaw(message, field) ->SwapElements(index1, index2); } break; } } } namespace { // Comparison functor for sorting FieldDescriptors by field number. struct FieldNumberSorter { bool operator()(const FieldDescriptor* left, const FieldDescriptor* right) const { return left->number() < right->number(); } }; inline bool IsIndexInHasBitSet( const uint32* has_bit_set, uint32 has_bit_index) { GOOGLE_DCHECK_NE(has_bit_index, ~0u); return ((has_bit_set[has_bit_index / 32] >> (has_bit_index % 32)) & static_cast(1)) != 0; } } // namespace void GeneratedMessageReflection::ListFields( const Message& message, std::vector* output) const { output->clear(); // Optimization: The default instance never has any fields set. if (schema_.IsDefaultInstance(message)) return; // Optimization: Avoid calling GetHasBits() and HasOneofField() many times // within the field loop. We allow this violation of ReflectionSchema // encapsulation because this function takes a noticable about of CPU // fleetwide and properly allowing this optimization through public interfaces // seems more trouble than it is worth. const uint32* const has_bits = schema_.HasHasbits() ? GetHasBits(message) : NULL; const uint32* const has_bits_indices = schema_.has_bit_indices_; const uint32* const oneof_case_array = GetConstPointerAtOffset(&message, schema_.oneof_case_offset_); output->reserve(descriptor_->field_count()); for (int i = 0; i <= last_non_weak_field_index_; i++) { const FieldDescriptor* field = descriptor_->field(i); if (field->is_repeated()) { if (FieldSize(message, field) > 0) { output->push_back(field); } } else { const OneofDescriptor* containing_oneof = field->containing_oneof(); if (containing_oneof) { // Equivalent to: HasOneofField(message, field) if (oneof_case_array[containing_oneof->index()] == field->number()) { output->push_back(field); } } else if (has_bits) { // Equivalent to: HasBit(message, field) if (IsIndexInHasBitSet(has_bits, has_bits_indices[i])) { output->push_back(field); } } else if (HasBit(message, field)) { // Fall back on proto3-style HasBit. output->push_back(field); } } } if (schema_.HasExtensionSet()) { GetExtensionSet(message).AppendToList(descriptor_, descriptor_pool_, output); } // ListFields() must sort output by field number. std::sort(output->begin(), output->end(), FieldNumberSorter()); } // ------------------------------------------------------------------- #undef DEFINE_PRIMITIVE_ACCESSORS #define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE) \ PASSTYPE GeneratedMessageReflection::Get##TYPENAME( \ const Message& message, const FieldDescriptor* field) const { \ USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE); \ if (field->is_extension()) { \ return GetExtensionSet(message).Get##TYPENAME( \ field->number(), field->default_value_##PASSTYPE()); \ } else { \ return GetField(message, field); \ } \ } \ \ void GeneratedMessageReflection::Set##TYPENAME( \ Message* message, const FieldDescriptor* field, \ PASSTYPE value) const { \ USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE); \ if (field->is_extension()) { \ return MutableExtensionSet(message)->Set##TYPENAME( \ field->number(), field->type(), value, field); \ } else { \ SetField(message, field, value); \ } \ } \ \ PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME( \ const Message& message, \ const FieldDescriptor* field, int index) const { \ USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE); \ if (field->is_extension()) { \ return GetExtensionSet(message).GetRepeated##TYPENAME( \ field->number(), index); \ } else { \ return GetRepeatedField(message, field, index); \ } \ } \ \ void GeneratedMessageReflection::SetRepeated##TYPENAME( \ Message* message, const FieldDescriptor* field, \ int index, PASSTYPE value) const { \ USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE); \ if (field->is_extension()) { \ MutableExtensionSet(message)->SetRepeated##TYPENAME( \ field->number(), index, value); \ } else { \ SetRepeatedField(message, field, index, value); \ } \ } \ \ void GeneratedMessageReflection::Add##TYPENAME( \ Message* message, const FieldDescriptor* field, \ PASSTYPE value) const { \ USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE); \ if (field->is_extension()) { \ MutableExtensionSet(message)->Add##TYPENAME( \ field->number(), field->type(), field->options().packed(), value, \ field); \ } else { \ AddField(message, field, value); \ } \ } DEFINE_PRIMITIVE_ACCESSORS(Int32 , int32 , int32 , INT32 ) DEFINE_PRIMITIVE_ACCESSORS(Int64 , int64 , int64 , INT64 ) DEFINE_PRIMITIVE_ACCESSORS(UInt32, uint32, uint32, UINT32) DEFINE_PRIMITIVE_ACCESSORS(UInt64, uint64, uint64, UINT64) DEFINE_PRIMITIVE_ACCESSORS(Float , float , float , FLOAT ) DEFINE_PRIMITIVE_ACCESSORS(Double, double, double, DOUBLE) DEFINE_PRIMITIVE_ACCESSORS(Bool , bool , bool , BOOL ) #undef DEFINE_PRIMITIVE_ACCESSORS // ------------------------------------------------------------------- string GeneratedMessageReflection::GetString( const Message& message, const FieldDescriptor* field) const { USAGE_CHECK_ALL(GetString, SINGULAR, STRING); if (field->is_extension()) { return GetExtensionSet(message).GetString(field->number(), field->default_value_string()); } else { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: { return GetField(message, field).Get(); } } GOOGLE_LOG(FATAL) << "Can't get here."; return GetEmptyString(); // Make compiler happy. } } const string& GeneratedMessageReflection::GetStringReference( const Message& message, const FieldDescriptor* field, string* scratch) const { USAGE_CHECK_ALL(GetStringReference, SINGULAR, STRING); if (field->is_extension()) { return GetExtensionSet(message).GetString(field->number(), field->default_value_string()); } else { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: { return GetField(message, field).Get(); } } GOOGLE_LOG(FATAL) << "Can't get here."; return GetEmptyString(); // Make compiler happy. } } void GeneratedMessageReflection::SetString( Message* message, const FieldDescriptor* field, const string& value) const { USAGE_CHECK_ALL(SetString, SINGULAR, STRING); if (field->is_extension()) { return MutableExtensionSet(message)->SetString(field->number(), field->type(), value, field); } else { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: { const string* default_ptr = &DefaultRaw(field).Get(); if (field->containing_oneof() && !HasOneofField(*message, field)) { ClearOneof(message, field->containing_oneof()); MutableField(message, field)->UnsafeSetDefault( default_ptr); } MutableField(message, field)->Set(default_ptr, value, GetArena(message)); break; } } } } string GeneratedMessageReflection::GetRepeatedString( const Message& message, const FieldDescriptor* field, int index) const { USAGE_CHECK_ALL(GetRepeatedString, REPEATED, STRING); if (field->is_extension()) { return GetExtensionSet(message).GetRepeatedString(field->number(), index); } else { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: return GetRepeatedPtrField(message, field, index); } GOOGLE_LOG(FATAL) << "Can't get here."; return GetEmptyString(); // Make compiler happy. } } const string& GeneratedMessageReflection::GetRepeatedStringReference( const Message& message, const FieldDescriptor* field, int index, string* scratch) const { USAGE_CHECK_ALL(GetRepeatedStringReference, REPEATED, STRING); if (field->is_extension()) { return GetExtensionSet(message).GetRepeatedString(field->number(), index); } else { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: return GetRepeatedPtrField(message, field, index); } GOOGLE_LOG(FATAL) << "Can't get here."; return GetEmptyString(); // Make compiler happy. } } void GeneratedMessageReflection::SetRepeatedString( Message* message, const FieldDescriptor* field, int index, const string& value) const { USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING); if (field->is_extension()) { MutableExtensionSet(message)->SetRepeatedString( field->number(), index, value); } else { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: *MutableRepeatedField(message, field, index) = value; break; } } } void GeneratedMessageReflection::AddString( Message* message, const FieldDescriptor* field, const string& value) const { USAGE_CHECK_ALL(AddString, REPEATED, STRING); if (field->is_extension()) { MutableExtensionSet(message)->AddString(field->number(), field->type(), value, field); } else { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: *AddField(message, field) = value; break; } } } // ------------------------------------------------------------------- inline bool CreateUnknownEnumValues(const FileDescriptor* file) { return file->syntax() == FileDescriptor::SYNTAX_PROTO3; } const EnumValueDescriptor* GeneratedMessageReflection::GetEnum( const Message& message, const FieldDescriptor* field) const { // Usage checked by GetEnumValue. int value = GetEnumValue(message, field); return field->enum_type()->FindValueByNumberCreatingIfUnknown(value); } int GeneratedMessageReflection::GetEnumValue( const Message& message, const FieldDescriptor* field) const { USAGE_CHECK_ALL(GetEnumValue, SINGULAR, ENUM); int32 value; if (field->is_extension()) { value = GetExtensionSet(message).GetEnum( field->number(), field->default_value_enum()->number()); } else { value = GetField(message, field); } return value; } void GeneratedMessageReflection::SetEnum( Message* message, const FieldDescriptor* field, const EnumValueDescriptor* value) const { // Usage checked by SetEnumValue. USAGE_CHECK_ENUM_VALUE(SetEnum); SetEnumValueInternal(message, field, value->number()); } void GeneratedMessageReflection::SetEnumValue( Message* message, const FieldDescriptor* field, int value) const { USAGE_CHECK_ALL(SetEnumValue, SINGULAR, ENUM); if (!CreateUnknownEnumValues(descriptor_->file())) { // Check that the value is valid if we don't support direct storage of // unknown enum values. const EnumValueDescriptor* value_desc = field->enum_type()->FindValueByNumber(value); if (value_desc == NULL) { GOOGLE_LOG(DFATAL) << "SetEnumValue accepts only valid integer values: value " << value << " unexpected for field " << field->full_name(); // In production builds, DFATAL will not terminate the program, so we have // to do something reasonable: just set the default value. value = field->default_value_enum()->number(); } } SetEnumValueInternal(message, field, value); } void GeneratedMessageReflection::SetEnumValueInternal( Message* message, const FieldDescriptor* field, int value) const { if (field->is_extension()) { MutableExtensionSet(message)->SetEnum(field->number(), field->type(), value, field); } else { SetField(message, field, value); } } const EnumValueDescriptor* GeneratedMessageReflection::GetRepeatedEnum( const Message& message, const FieldDescriptor* field, int index) const { // Usage checked by GetRepeatedEnumValue. int value = GetRepeatedEnumValue(message, field, index); return field->enum_type()->FindValueByNumberCreatingIfUnknown(value); } int GeneratedMessageReflection::GetRepeatedEnumValue( const Message& message, const FieldDescriptor* field, int index) const { USAGE_CHECK_ALL(GetRepeatedEnumValue, REPEATED, ENUM); int value; if (field->is_extension()) { value = GetExtensionSet(message).GetRepeatedEnum(field->number(), index); } else { value = GetRepeatedField(message, field, index); } return value; } void GeneratedMessageReflection::SetRepeatedEnum( Message* message, const FieldDescriptor* field, int index, const EnumValueDescriptor* value) const { // Usage checked by SetRepeatedEnumValue. USAGE_CHECK_ENUM_VALUE(SetRepeatedEnum); SetRepeatedEnumValueInternal(message, field, index, value->number()); } void GeneratedMessageReflection::SetRepeatedEnumValue( Message* message, const FieldDescriptor* field, int index, int value) const { USAGE_CHECK_ALL(SetRepeatedEnum, REPEATED, ENUM); if (!CreateUnknownEnumValues(descriptor_->file())) { // Check that the value is valid if we don't support direct storage of // unknown enum values. const EnumValueDescriptor* value_desc = field->enum_type()->FindValueByNumber(value); if (value_desc == NULL) { GOOGLE_LOG(DFATAL) << "SetRepeatedEnumValue accepts only valid integer values: " << "value " << value << " unexpected for field " << field->full_name(); // In production builds, DFATAL will not terminate the program, so we have // to do something reasonable: just set the default value. value = field->default_value_enum()->number(); } } SetRepeatedEnumValueInternal(message, field, index, value); } void GeneratedMessageReflection::SetRepeatedEnumValueInternal( Message* message, const FieldDescriptor* field, int index, int value) const { if (field->is_extension()) { MutableExtensionSet(message)->SetRepeatedEnum( field->number(), index, value); } else { SetRepeatedField(message, field, index, value); } } void GeneratedMessageReflection::AddEnum( Message* message, const FieldDescriptor* field, const EnumValueDescriptor* value) const { // Usage checked by AddEnumValue. USAGE_CHECK_ENUM_VALUE(AddEnum); AddEnumValueInternal(message, field, value->number()); } void GeneratedMessageReflection::AddEnumValue( Message* message, const FieldDescriptor* field, int value) const { USAGE_CHECK_ALL(AddEnum, REPEATED, ENUM); if (!CreateUnknownEnumValues(descriptor_->file())) { // Check that the value is valid if we don't support direct storage of // unknown enum values. const EnumValueDescriptor* value_desc = field->enum_type()->FindValueByNumber(value); if (value_desc == NULL) { GOOGLE_LOG(DFATAL) << "AddEnumValue accepts only valid integer values: value " << value << " unexpected for field " << field->full_name(); // In production builds, DFATAL will not terminate the program, so we have // to do something reasonable: just set the default value. value = field->default_value_enum()->number(); } } AddEnumValueInternal(message, field, value); } void GeneratedMessageReflection::AddEnumValueInternal( Message* message, const FieldDescriptor* field, int value) const { if (field->is_extension()) { MutableExtensionSet(message)->AddEnum(field->number(), field->type(), field->options().packed(), value, field); } else { AddField(message, field, value); } } // ------------------------------------------------------------------- const Message& GeneratedMessageReflection::GetMessage( const Message& message, const FieldDescriptor* field, MessageFactory* factory) const { USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE); if (factory == NULL) factory = message_factory_; if (field->is_extension()) { return static_cast( GetExtensionSet(message).GetMessage( field->number(), field->message_type(), factory)); } else { const Message* result = GetRaw(message, field); if (result == NULL) { result = DefaultRaw(field); } return *result; } } Message* GeneratedMessageReflection::MutableMessage( Message* message, const FieldDescriptor* field, MessageFactory* factory) const { USAGE_CHECK_ALL(MutableMessage, SINGULAR, MESSAGE); if (factory == NULL) factory = message_factory_; if (field->is_extension()) { return static_cast( MutableExtensionSet(message)->MutableMessage(field, factory)); } else { Message* result; Message** result_holder = MutableRaw(message, field); if (field->containing_oneof()) { if (!HasOneofField(*message, field)) { ClearOneof(message, field->containing_oneof()); result_holder = MutableField(message, field); const Message* default_message = DefaultRaw(field); *result_holder = default_message->New(message->GetArena()); } } else { SetBit(message, field); } if (*result_holder == NULL) { const Message* default_message = DefaultRaw(field); *result_holder = default_message->New(message->GetArena()); } result = *result_holder; return result; } } void GeneratedMessageReflection::UnsafeArenaSetAllocatedMessage( Message* message, Message* sub_message, const FieldDescriptor* field) const { USAGE_CHECK_ALL(SetAllocatedMessage, SINGULAR, MESSAGE); if (field->is_extension()) { MutableExtensionSet(message)->UnsafeArenaSetAllocatedMessage( field->number(), field->type(), field, sub_message); } else { if (field->containing_oneof()) { if (sub_message == NULL) { ClearOneof(message, field->containing_oneof()); return; } ClearOneof(message, field->containing_oneof()); *MutableRaw(message, field) = sub_message; SetOneofCase(message, field); return; } if (sub_message == NULL) { ClearBit(message, field); } else { SetBit(message, field); } Message** sub_message_holder = MutableRaw(message, field); if (GetArena(message) == NULL) { delete *sub_message_holder; } *sub_message_holder = sub_message; } } void GeneratedMessageReflection::SetAllocatedMessage( Message* message, Message* sub_message, const FieldDescriptor* field) const { // If message and sub-message are in different memory ownership domains // (different arenas, or one is on heap and one is not), then we may need to // do a copy. if (sub_message != NULL && sub_message->GetArena() != message->GetArena()) { if (sub_message->GetArena() == NULL && message->GetArena() != NULL) { // Case 1: parent is on an arena and child is heap-allocated. We can add // the child to the arena's Own() list to free on arena destruction, then // set our pointer. message->GetArena()->Own(sub_message); UnsafeArenaSetAllocatedMessage(message, sub_message, field); } else { // Case 2: all other cases. We need to make a copy. MutableMessage() will // either get the existing message object, or instantiate a new one as // appropriate w.r.t. our arena. Message* sub_message_copy = MutableMessage(message, field); sub_message_copy->CopyFrom(*sub_message); } } else { // Same memory ownership domains. UnsafeArenaSetAllocatedMessage(message, sub_message, field); } } Message* GeneratedMessageReflection::UnsafeArenaReleaseMessage( Message* message, const FieldDescriptor* field, MessageFactory* factory) const { USAGE_CHECK_ALL(ReleaseMessage, SINGULAR, MESSAGE); if (factory == NULL) factory = message_factory_; if (field->is_extension()) { return static_cast( MutableExtensionSet(message)->UnsafeArenaReleaseMessage(field, factory)); } else { if (!(field->is_repeated() || field->containing_oneof())) { ClearBit(message, field); } if (field->containing_oneof()) { if (HasOneofField(*message, field)) { *MutableOneofCase(message, field->containing_oneof()) = 0; } else { return NULL; } } Message** result = MutableRaw(message, field); Message* ret = *result; *result = NULL; return ret; } } Message* GeneratedMessageReflection::ReleaseMessage( Message* message, const FieldDescriptor* field, MessageFactory* factory) const { Message* released = UnsafeArenaReleaseMessage(message, field, factory); if (GetArena(message) != NULL && released != NULL) { Message* copy_from_arena = released->New(); copy_from_arena->CopyFrom(*released); released = copy_from_arena; } return released; } const Message& GeneratedMessageReflection::GetRepeatedMessage( const Message& message, const FieldDescriptor* field, int index) const { USAGE_CHECK_ALL(GetRepeatedMessage, REPEATED, MESSAGE); if (field->is_extension()) { return static_cast( GetExtensionSet(message).GetRepeatedMessage(field->number(), index)); } else { if (IsMapFieldInApi(field)) { return GetRaw(message, field) .GetRepeatedField() .Get >(index); } else { return GetRaw(message, field) .Get >(index); } } } Message* GeneratedMessageReflection::MutableRepeatedMessage( Message* message, const FieldDescriptor* field, int index) const { USAGE_CHECK_ALL(MutableRepeatedMessage, REPEATED, MESSAGE); if (field->is_extension()) { return static_cast( MutableExtensionSet(message)->MutableRepeatedMessage( field->number(), index)); } else { if (IsMapFieldInApi(field)) { return MutableRaw(message, field) ->MutableRepeatedField() ->Mutable >(index); } else { return MutableRaw(message, field) ->Mutable >(index); } } } Message* GeneratedMessageReflection::AddMessage( Message* message, const FieldDescriptor* field, MessageFactory* factory) const { USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE); if (factory == NULL) factory = message_factory_; if (field->is_extension()) { return static_cast( MutableExtensionSet(message)->AddMessage(field, factory)); } else { Message* result = NULL; // We can't use AddField() because RepeatedPtrFieldBase doesn't // know how to allocate one. RepeatedPtrFieldBase* repeated = NULL; if (IsMapFieldInApi(field)) { repeated = MutableRaw(message, field)->MutableRepeatedField(); } else { repeated = MutableRaw(message, field); } result = repeated->AddFromCleared >(); if (result == NULL) { // We must allocate a new object. const Message* prototype; if (repeated->size() == 0) { prototype = factory->GetPrototype(field->message_type()); } else { prototype = &repeated->Get >(0); } result = prototype->New(message->GetArena()); // We can guarantee here that repeated and result are either both heap // allocated or arena owned. So it is safe to call the unsafe version // of AddAllocated. repeated->UnsafeArenaAddAllocated >(result); } return result; } } void GeneratedMessageReflection::AddAllocatedMessage( Message* message, const FieldDescriptor* field, Message* new_entry) const { USAGE_CHECK_ALL(AddAllocatedMessage, REPEATED, MESSAGE); if (field->is_extension()) { MutableExtensionSet(message)->AddAllocatedMessage(field, new_entry); } else { RepeatedPtrFieldBase* repeated = NULL; if (IsMapFieldInApi(field)) { repeated = MutableRaw(message, field)->MutableRepeatedField(); } else { repeated = MutableRaw(message, field); } repeated->AddAllocated >(new_entry); } } void* GeneratedMessageReflection::MutableRawRepeatedField( Message* message, const FieldDescriptor* field, FieldDescriptor::CppType cpptype, int ctype, const Descriptor* desc) const { USAGE_CHECK_REPEATED("MutableRawRepeatedField"); if (field->cpp_type() != cpptype) ReportReflectionUsageTypeError(descriptor_, field, "MutableRawRepeatedField", cpptype); if (ctype >= 0) GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch"; if (desc != NULL) GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type"; if (field->is_extension()) { return MutableExtensionSet(message)->MutableRawRepeatedField( field->number(), field->type(), field->is_packed(), field); } else { // Trigger transform for MapField if (IsMapFieldInApi(field)) { return MutableRawNonOneof(message, field) ->MutableRepeatedField(); } return MutableRawNonOneof(message, field); } } const void* GeneratedMessageReflection::GetRawRepeatedField( const Message& message, const FieldDescriptor* field, FieldDescriptor::CppType cpptype, int ctype, const Descriptor* desc) const { USAGE_CHECK_REPEATED("GetRawRepeatedField"); if (field->cpp_type() != cpptype) ReportReflectionUsageTypeError(descriptor_, field, "GetRawRepeatedField", cpptype); if (ctype >= 0) GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch"; if (desc != NULL) GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type"; if (field->is_extension()) { // Should use extension_set::GetRawRepeatedField. However, the required // parameter "default repeated value" is not very easy to get here. // Map is not supported in extensions, it is acceptable to use // extension_set::MutableRawRepeatedField which does not change the message. return MutableExtensionSet(const_cast(&message)) ->MutableRawRepeatedField( field->number(), field->type(), field->is_packed(), field); } else { // Trigger transform for MapField if (IsMapFieldInApi(field)) { return &(GetRawNonOneof(message, field).GetRepeatedField()); } return &GetRawNonOneof(message, field); } } const FieldDescriptor* GeneratedMessageReflection::GetOneofFieldDescriptor( const Message& message, const OneofDescriptor* oneof_descriptor) const { uint32 field_number = GetOneofCase(message, oneof_descriptor); if (field_number == 0) { return NULL; } return descriptor_->FindFieldByNumber(field_number); } bool GeneratedMessageReflection::ContainsMapKey( const Message& message, const FieldDescriptor* field, const MapKey& key) const { USAGE_CHECK(IsMapFieldInApi(field), "LookupMapValue", "Field is not a map field."); return GetRaw(message, field).ContainsMapKey(key); } bool GeneratedMessageReflection::InsertOrLookupMapValue( Message* message, const FieldDescriptor* field, const MapKey& key, MapValueRef* val) const { USAGE_CHECK(IsMapFieldInApi(field), "InsertOrLookupMapValue", "Field is not a map field."); val->SetType(field->message_type()->FindFieldByName("value")->cpp_type()); return MutableRaw(message, field)->InsertOrLookupMapValue( key, val); } bool GeneratedMessageReflection::DeleteMapValue( Message* message, const FieldDescriptor* field, const MapKey& key) const { USAGE_CHECK(IsMapFieldInApi(field), "DeleteMapValue", "Field is not a map field."); return MutableRaw(message, field)->DeleteMapValue(key); } MapIterator GeneratedMessageReflection::MapBegin( Message* message, const FieldDescriptor* field) const { USAGE_CHECK(IsMapFieldInApi(field), "MapBegin", "Field is not a map field."); MapIterator iter(message, field); GetRaw(*message, field).MapBegin(&iter); return iter; } MapIterator GeneratedMessageReflection::MapEnd( Message* message, const FieldDescriptor* field) const { USAGE_CHECK(IsMapFieldInApi(field), "MapEnd", "Field is not a map field."); MapIterator iter(message, field); GetRaw(*message, field).MapEnd(&iter); return iter; } int GeneratedMessageReflection::MapSize( const Message& message, const FieldDescriptor* field) const { USAGE_CHECK(IsMapFieldInApi(field), "MapSize", "Field is not a map field."); return GetRaw(message, field).size(); } // ----------------------------------------------------------------------------- const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName( const string& name) const { if (!schema_.HasExtensionSet()) return NULL; const FieldDescriptor* result = descriptor_pool_->FindExtensionByName(name); if (result != NULL && result->containing_type() == descriptor_) { return result; } if (descriptor_->options().message_set_wire_format()) { // MessageSet extensions may be identified by type name. const Descriptor* type = descriptor_pool_->FindMessageTypeByName(name); if (type != NULL) { // Look for a matching extension in the foreign type's scope. const int type_extension_count = type->extension_count(); for (int i = 0; i < type_extension_count; i++) { const FieldDescriptor* extension = type->extension(i); if (extension->containing_type() == descriptor_ && extension->type() == FieldDescriptor::TYPE_MESSAGE && extension->is_optional() && extension->message_type() == type) { // Found it. return extension; } } } } return NULL; } const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByNumber( int number) const { if (!schema_.HasExtensionSet()) return NULL; return descriptor_pool_->FindExtensionByNumber(descriptor_, number); } bool GeneratedMessageReflection::SupportsUnknownEnumValues() const { return CreateUnknownEnumValues(descriptor_->file()); } // =================================================================== // Some private helpers. // These simple template accessors obtain pointers (or references) to // the given field. template const Type& GeneratedMessageReflection::GetRawNonOneof( const Message& message, const FieldDescriptor* field) const { return GetConstRefAtOffset(message, schema_.GetFieldOffsetNonOneof(field)); } template Type* GeneratedMessageReflection::MutableRawNonOneof( Message* message, const FieldDescriptor* field) const { return GetPointerAtOffset(message, schema_.GetFieldOffsetNonOneof(field)); } template const Type& GeneratedMessageReflection::GetRaw( const Message& message, const FieldDescriptor* field) const { if (field->containing_oneof() && !HasOneofField(message, field)) { return DefaultRaw(field); } return GetConstRefAtOffset(message, schema_.GetFieldOffset(field)); } template Type* GeneratedMessageReflection::MutableRaw(Message* message, const FieldDescriptor* field) const { return GetPointerAtOffset(message, schema_.GetFieldOffset(field)); } inline const uint32* GeneratedMessageReflection::GetHasBits( const Message& message) const { GOOGLE_DCHECK(schema_.HasHasbits()); return &GetConstRefAtOffset(message, schema_.HasBitsOffset()); } inline uint32* GeneratedMessageReflection::MutableHasBits( Message* message) const { GOOGLE_DCHECK(schema_.HasHasbits()); return GetPointerAtOffset(message, schema_.HasBitsOffset()); } inline uint32 GeneratedMessageReflection::GetOneofCase( const Message& message, const OneofDescriptor* oneof_descriptor) const { return GetConstRefAtOffset( message, schema_.GetOneofCaseOffset(oneof_descriptor)); } inline uint32* GeneratedMessageReflection::MutableOneofCase( Message* message, const OneofDescriptor* oneof_descriptor) const { return GetPointerAtOffset( message, schema_.GetOneofCaseOffset(oneof_descriptor)); } inline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet( const Message& message) const { return GetConstRefAtOffset(message, schema_.GetExtensionSetOffset()); } inline ExtensionSet* GeneratedMessageReflection::MutableExtensionSet( Message* message) const { return GetPointerAtOffset(message, schema_.GetExtensionSetOffset()); } inline Arena* GeneratedMessageReflection::GetArena(Message* message) const { return GetInternalMetadataWithArena(*message).arena(); } inline const InternalMetadataWithArena& GeneratedMessageReflection::GetInternalMetadataWithArena( const Message& message) const { return GetConstRefAtOffset( message, schema_.GetMetadataOffset()); } inline InternalMetadataWithArena* GeneratedMessageReflection::MutableInternalMetadataWithArena( Message* message) const { return GetPointerAtOffset( message, schema_.GetMetadataOffset()); } template inline const Type& GeneratedMessageReflection::DefaultRaw( const FieldDescriptor* field) const { return *reinterpret_cast(schema_.GetFieldDefault(field)); } // Simple accessors for manipulating has_bits_. inline bool GeneratedMessageReflection::HasBit( const Message& message, const FieldDescriptor* field) const { GOOGLE_DCHECK(!field->options().weak()); if (schema_.HasHasbits()) { return IsIndexInHasBitSet(GetHasBits(message), schema_.HasBitIndex(field)); } // proto3: no has-bits. All fields present except messages, which are // present only if their message-field pointer is non-NULL. if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { return !schema_.IsDefaultInstance(message) && GetRaw(message, field) != NULL; } else { // Non-message field (and non-oneof, since that was handled in HasField() // before calling us), and singular (again, checked in HasField). So, this // field must be a scalar. // Scalar primitive (numeric or string/bytes) fields are present if // their value is non-zero (numeric) or non-empty (string/bytes). N.B.: // we must use this definition here, rather than the "scalar fields // always present" in the proto3 docs, because MergeFrom() semantics // require presence as "present on wire", and reflection-based merge // (which uses HasField()) needs to be consistent with this. switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: { return GetField(message, field).Get().size() > 0; } } return false; case FieldDescriptor::CPPTYPE_BOOL: return GetRaw(message, field) != false; case FieldDescriptor::CPPTYPE_INT32: return GetRaw(message, field) != 0; case FieldDescriptor::CPPTYPE_INT64: return GetRaw(message, field) != 0; case FieldDescriptor::CPPTYPE_UINT32: return GetRaw(message, field) != 0; case FieldDescriptor::CPPTYPE_UINT64: return GetRaw(message, field) != 0; case FieldDescriptor::CPPTYPE_FLOAT: return GetRaw(message, field) != 0.0; case FieldDescriptor::CPPTYPE_DOUBLE: return GetRaw(message, field) != 0.0; case FieldDescriptor::CPPTYPE_ENUM: return GetRaw(message, field) != 0; case FieldDescriptor::CPPTYPE_MESSAGE: // handled above; avoid warning break; } GOOGLE_LOG(FATAL) << "Reached impossible case in HasBit()."; return false; } } inline void GeneratedMessageReflection::SetBit( Message* message, const FieldDescriptor* field) const { GOOGLE_DCHECK(!field->options().weak()); if (!schema_.HasHasbits()) { return; } const uint32 index = schema_.HasBitIndex(field); MutableHasBits(message)[index / 32] |= (static_cast(1) << (index % 32)); } inline void GeneratedMessageReflection::ClearBit( Message* message, const FieldDescriptor* field) const { GOOGLE_DCHECK(!field->options().weak()); if (!schema_.HasHasbits()) { return; } const uint32 index = schema_.HasBitIndex(field); MutableHasBits(message)[index / 32] &= ~(static_cast(1) << (index % 32)); } inline void GeneratedMessageReflection::SwapBit( Message* message1, Message* message2, const FieldDescriptor* field) const { GOOGLE_DCHECK(!field->options().weak()); if (!schema_.HasHasbits()) { return; } bool temp_has_bit = HasBit(*message1, field); if (HasBit(*message2, field)) { SetBit(message1, field); } else { ClearBit(message1, field); } if (temp_has_bit) { SetBit(message2, field); } else { ClearBit(message2, field); } } inline bool GeneratedMessageReflection::HasOneof( const Message& message, const OneofDescriptor* oneof_descriptor) const { return (GetOneofCase(message, oneof_descriptor) > 0); } inline bool GeneratedMessageReflection::HasOneofField( const Message& message, const FieldDescriptor* field) const { return (GetOneofCase(message, field->containing_oneof()) == field->number()); } inline void GeneratedMessageReflection::SetOneofCase( Message* message, const FieldDescriptor* field) const { *MutableOneofCase(message, field->containing_oneof()) = field->number(); } inline void GeneratedMessageReflection::ClearOneofField( Message* message, const FieldDescriptor* field) const { if (HasOneofField(*message, field)) { ClearOneof(message, field->containing_oneof()); } } inline void GeneratedMessageReflection::ClearOneof( Message* message, const OneofDescriptor* oneof_descriptor) const { // TODO(jieluo): Consider to cache the unused object instead of deleting // it. It will be much faster if an application switches a lot from // a few oneof fields. Time/space tradeoff uint32 oneof_case = GetOneofCase(*message, oneof_descriptor); if (oneof_case > 0) { const FieldDescriptor* field = descriptor_->FindFieldByNumber(oneof_case); if (GetArena(message) == NULL) { switch (field->cpp_type()) { case FieldDescriptor::CPPTYPE_STRING: { switch (field->options().ctype()) { default: // TODO(kenton): Support other string reps. case FieldOptions::STRING: { const string* default_ptr = &DefaultRaw(field).Get(); MutableField(message, field)-> Destroy(default_ptr, GetArena(message)); break; } } break; } case FieldDescriptor::CPPTYPE_MESSAGE: delete *MutableRaw(message, field); break; default: break; } } *MutableOneofCase(message, oneof_descriptor) = 0; } } // Template implementations of basic accessors. Inline because each // template instance is only called from one location. These are // used for all types except messages. template inline const Type& GeneratedMessageReflection::GetField( const Message& message, const FieldDescriptor* field) const { return GetRaw(message, field); } template inline void GeneratedMessageReflection::SetField( Message* message, const FieldDescriptor* field, const Type& value) const { if (field->containing_oneof() && !HasOneofField(*message, field)) { ClearOneof(message, field->containing_oneof()); } *MutableRaw(message, field) = value; field->containing_oneof() ? SetOneofCase(message, field) : SetBit(message, field); } template inline Type* GeneratedMessageReflection::MutableField( Message* message, const FieldDescriptor* field) const { field->containing_oneof() ? SetOneofCase(message, field) : SetBit(message, field); return MutableRaw(message, field); } template inline const Type& GeneratedMessageReflection::GetRepeatedField( const Message& message, const FieldDescriptor* field, int index) const { return GetRaw >(message, field).Get(index); } template inline const Type& GeneratedMessageReflection::GetRepeatedPtrField( const Message& message, const FieldDescriptor* field, int index) const { return GetRaw >(message, field).Get(index); } template inline void GeneratedMessageReflection::SetRepeatedField( Message* message, const FieldDescriptor* field, int index, Type value) const { MutableRaw >(message, field)->Set(index, value); } template inline Type* GeneratedMessageReflection::MutableRepeatedField( Message* message, const FieldDescriptor* field, int index) const { RepeatedPtrField* repeated = MutableRaw >(message, field); return repeated->Mutable(index); } template inline void GeneratedMessageReflection::AddField( Message* message, const FieldDescriptor* field, const Type& value) const { MutableRaw >(message, field)->Add(value); } template inline Type* GeneratedMessageReflection::AddField( Message* message, const FieldDescriptor* field) const { RepeatedPtrField* repeated = MutableRaw >(message, field); return repeated->Add(); } MessageFactory* GeneratedMessageReflection::GetMessageFactory() const { return message_factory_; } void* GeneratedMessageReflection::RepeatedFieldData( Message* message, const FieldDescriptor* field, FieldDescriptor::CppType cpp_type, const Descriptor* message_type) const { GOOGLE_CHECK(field->is_repeated()); GOOGLE_CHECK(field->cpp_type() == cpp_type || (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM && cpp_type == FieldDescriptor::CPPTYPE_INT32)) << "The type parameter T in RepeatedFieldRef API doesn't match " << "the actual field type (for enums T should be the generated enum " << "type or int32)."; if (message_type != NULL) { GOOGLE_CHECK_EQ(message_type, field->message_type()); } if (field->is_extension()) { return MutableExtensionSet(message)->MutableRawRepeatedField( field->number(), field->type(), field->is_packed(), field); } else { return MutableRawNonOneof(message, field); } } MapFieldBase* GeneratedMessageReflection::MapData( Message* message, const FieldDescriptor* field) const { USAGE_CHECK(IsMapFieldInApi(field), "GetMapData", "Field is not a map field."); return MutableRaw(message, field); } namespace { // Helper function to transform migration schema into reflection schema. ReflectionSchema MigrationToReflectionSchema( const Message* const* default_instance, const uint32* offsets, MigrationSchema migration_schema) { ReflectionSchema result; result.default_instance_ = *default_instance; // First 6 offsets are offsets to the special fields. The following offsets // are the proto fields. result.offsets_ = offsets + migration_schema.offsets_index + 5; 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]; result.extensions_offset_ = offsets[migration_schema.offsets_index + 2]; result.oneof_case_offset_ = offsets[migration_schema.offsets_index + 3]; result.object_size_ = migration_schema.object_size; result.weak_field_map_offset_ = offsets[migration_schema.offsets_index + 4]; return result; } template class AssignDescriptorsHelper { public: AssignDescriptorsHelper(MessageFactory* factory, Metadata* file_level_metadata, const EnumDescriptor** file_level_enum_descriptors, const Schema* schemas, const Message* const* default_instance_data, const uint32* offsets) : factory_(factory), file_level_metadata_(file_level_metadata), file_level_enum_descriptors_(file_level_enum_descriptors), schemas_(schemas), default_instance_data_(default_instance_data), offsets_(offsets) {} void AssignMessageDescriptor(const Descriptor* descriptor) { for (int i = 0; i < descriptor->nested_type_count(); i++) { AssignMessageDescriptor(descriptor->nested_type(i)); } file_level_metadata_->descriptor = descriptor; file_level_metadata_->reflection = new GeneratedMessageReflection( descriptor, MigrationToReflectionSchema(default_instance_data_, offsets_, *schemas_), ::google::protobuf::DescriptorPool::generated_pool(), factory_); for (int i = 0; i < descriptor->enum_type_count(); i++) { AssignEnumDescriptor(descriptor->enum_type(i)); } schemas_++; default_instance_data_++; file_level_metadata_++; } void AssignEnumDescriptor(const EnumDescriptor* descriptor) { *file_level_enum_descriptors_ = descriptor; file_level_enum_descriptors_++; } const Metadata* GetCurrentMetadataPtr() const { return file_level_metadata_; } private: MessageFactory* factory_; Metadata* file_level_metadata_; const EnumDescriptor** file_level_enum_descriptors_; const Schema* schemas_; const Message* const * default_instance_data_; const uint32* offsets_; }; // We have the routines that assign descriptors and build reflection // automatically delete the allocated reflection. MetadataOwner owns // all the allocated reflection instances. struct MetadataOwner { void AddArray(const Metadata* begin, const Metadata* end) { MutexLock lock(&mu_); metadata_arrays_.push_back(std::make_pair(begin, end)); } static MetadataOwner* Instance() { static MetadataOwner* res = new MetadataOwner; return res; } private: // Use the constructor to register the shutdown code. Because c++ makes sure // this called only once. MetadataOwner() { OnShutdown(&DeleteMetadata); } ~MetadataOwner() { for (int i = 0; i < metadata_arrays_.size(); i++) { for (const Metadata* m = metadata_arrays_[i].first; m < metadata_arrays_[i].second; m++) { delete m->reflection; } } } static void DeleteMetadata() { delete Instance(); } Mutex mu_; std::vector > metadata_arrays_; }; } // namespace void AssignDescriptors( const string& filename, const MigrationSchema* schemas, const Message* const* default_instances_, const uint32* offsets, MessageFactory* factory, // update the following descriptor arrays. Metadata* file_level_metadata, const EnumDescriptor** file_level_enum_descriptors, const ServiceDescriptor** file_level_service_descriptors) { const ::google::protobuf::FileDescriptor* file = ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(filename); GOOGLE_CHECK(file != NULL); if (!factory) factory = MessageFactory::generated_factory(); AssignDescriptorsHelper helper(factory, file_level_metadata, file_level_enum_descriptors, schemas, default_instances_, offsets); for (int i = 0; i < file->message_type_count(); i++) { helper.AssignMessageDescriptor(file->message_type(i)); } for (int i = 0; i < file->enum_type_count(); i++) { helper.AssignEnumDescriptor(file->enum_type(i)); } if (file->options().cc_generic_services()) { for (int i = 0; i < file->service_count(); i++) { file_level_service_descriptors[i] = file->service(i); } } MetadataOwner::Instance()->AddArray( file_level_metadata, helper.GetCurrentMetadataPtr()); } void RegisterAllTypesInternal(const Metadata* file_level_metadata, int size) { for (int i = 0; i < size; i++) { const GeneratedMessageReflection* reflection = static_cast( file_level_metadata[i].reflection); if (reflection) { // It's not a map type ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( file_level_metadata[i].descriptor, reflection->schema_.default_instance_); } } } void RegisterAllTypes(const Metadata* file_level_metadata, int size) { RegisterAllTypesInternal(file_level_metadata, size); } void UnknownFieldSetSerializer(const uint8* base, uint32 offset, uint32 tag, uint32 has_offset, ::google::protobuf::io::CodedOutputStream* output) { const void* ptr = base + offset; const InternalMetadataWithArena* metadata = static_cast(ptr); if (metadata->have_unknown_fields()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( metadata->unknown_fields(), output); } } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/generated_message_reflection.h000066400000000000000000001001701334102242000333150ustar00rootroot00000000000000// 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. // // This header is logically internal, but is made public because it is used // from protocol-compiler-generated code, which may reside in other components. #ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__ #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__ #include #include #include #include // TODO(jasonh): Remove this once the compiler change to directly include this // is released to components. #include #include #include #include namespace google { namespace upb { namespace google_opensource { class GMR_Handlers; } // namespace google_opensource } // namespace upb namespace protobuf { class DescriptorPool; class MapKey; class MapValueRef; } // namespace protobuf namespace protobuf { namespace flat { class MetadataBuilder; } // namespace flat } // namespace protobuf namespace protobuf { namespace internal { class DefaultEmptyOneof; // Defined in this file. class GeneratedMessageReflection; // Defined in other files. class ExtensionSet; // extension_set.h class WeakFieldMap; // weak_field_map.h // 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 // used to obtain pointers to default instances of embedded // messages, which GetMessage() will return if the particular // sub-message has not been initialized yet. (Thus, all // embedded message fields *must* have non-NULL pointers // in the default instance.) // offsets: An array of ints giving the byte offsets. // For each oneof or weak field, the offset is relative to the // default_instance. These can be computed at compile time // using the // GOOGLE_PROTOBUF_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET() // macro. For each none oneof field, the offset is related to // the start of the message object. These can be computed at // compile time using the // GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro. // Besides offsets for all fields, this array also contains // offsets for oneof unions. The offset of the i-th oneof union // is offsets[descriptor->field_count() + i]. // has_bit_indices: Mapping from field indexes to their index in the has // bit array. // has_bits_offset: Offset in the message of an array of uint32s of size // descriptor->field_count()/32, rounded up. This is a // bitfield where each bit indicates whether or not the // corresponding field of the message has been initialized. // The bit for field index i is obtained by the expression: // has_bits[i / 32] & (1 << (i % 32)) // unknown_fields_offset: Offset in the message of the UnknownFieldSet for // the message. // extensions_offset: Offset in the message of the ExtensionSet for the // message, or -1 if the message type has no extension // ranges. // oneof_case_offset: Offset in the message of an array of uint32s of // size descriptor->oneof_decl_count(). Each uint32 // indicates what field is set for each oneof. // object_size: The size of a message object of this type, as measured // by sizeof(). // arena_offset: If a message doesn't have a unknown_field_set that stores // the arena, it must have a direct pointer to the arena. // weak_field_map_offset: If the message proto has weak fields, this is the // offset of _weak_field_map_ in the generated proto. Otherwise // -1. struct ReflectionSchema { public: // Size of a google::protobuf::Message object of this type. uint32 GetObjectSize() const { return static_cast(object_size_); } // Offset of a non-oneof field. Getting a field offset is slightly more // efficient when we know statically that it is not a oneof field. uint32 GetFieldOffsetNonOneof(const FieldDescriptor* field) const { GOOGLE_DCHECK(!field->containing_oneof()); return offsets_[field->index()]; } // Offset of any field. uint32 GetFieldOffset(const FieldDescriptor* field) const { if (field->containing_oneof()) { size_t offset = static_cast(field->containing_type()->field_count() + field->containing_oneof()->index()); return offsets_[offset]; } else { return GetFieldOffsetNonOneof(field); } } uint32 GetOneofCaseOffset(const OneofDescriptor* oneof_descriptor) const { return static_cast(oneof_case_offset_) + static_cast( static_cast(oneof_descriptor->index()) * sizeof(uint32)); } bool HasHasbits() const { return has_bits_offset_ != -1; } // Bit index within the bit array of hasbits. Bit order is low-to-high. uint32 HasBitIndex(const FieldDescriptor* field) const { GOOGLE_DCHECK(HasHasbits()); return has_bit_indices_[field->index()]; } // Byte offset of the hasbits array. uint32 HasBitsOffset() const { GOOGLE_DCHECK(HasHasbits()); return static_cast(has_bits_offset_); } // The offset of the InternalMetadataWithArena member. // For Lite this will actually be an InternalMetadataWithArenaLite. // The schema doesn't contain enough information to distinguish between // these two cases. uint32 GetMetadataOffset() const { return static_cast(metadata_offset_); } // Whether this message has an ExtensionSet. bool HasExtensionSet() const { return extensions_offset_ != -1; } // The offset of the ExtensionSet in this message. uint32 GetExtensionSetOffset() const { GOOGLE_DCHECK(HasExtensionSet()); return static_cast(extensions_offset_); } // The off set of WeakFieldMap when the message contains weak fields. // The default is 0 for now. int GetWeakFieldMapOffset() const { return weak_field_map_offset_; } bool IsDefaultInstance(const Message& message) const { return &message == default_instance_; } // Returns a pointer to the default value for this field. The size and type // of the underlying data depends on the field's type. const void *GetFieldDefault(const FieldDescriptor* field) const { return reinterpret_cast(default_instance_) + offsets_[field->index()]; } bool HasWeakFields() const { return weak_field_map_offset_ > 0; } // These members are intended to be private, but we cannot actually make them // private because this prevents us from using aggregate initialization of // them, ie. // // ReflectionSchema schema = {a, b, c, d, e, ...}; // private: const Message* default_instance_; const uint32* offsets_; const uint32* has_bit_indices_; int has_bits_offset_; int metadata_offset_; int extensions_offset_; int oneof_case_offset_; int object_size_; int weak_field_map_offset_; }; // Structs that the code generator emits directly to describe a message. // These should never used directly except to build a ReflectionSchema // object. // // EXPERIMENTAL: these are changing rapidly, and may completely disappear // or merge with ReflectionSchema. struct MigrationSchema { int32 offsets_index; int32 has_bit_indices_index; int object_size; }; // THIS CLASS IS NOT INTENDED FOR DIRECT USE. It is intended for use // by generated code. This class is just a big hack that reduces code // size. // // A GeneratedMessageReflection is an implementation of Reflection // which expects all fields to be backed by simple variables located in // memory. The locations are given using a base pointer and a set of // offsets. // // It is required that the user represents fields of each type in a standard // way, so that GeneratedMessageReflection can cast the void* pointer to // the appropriate type. For primitive fields and string fields, each field // should be represented using the obvious C++ primitive type. Enums and // Messages are different: // - Singular Message fields are stored as a pointer to a Message. These // should start out NULL, except for in the default instance where they // should start out pointing to other default instances. // - Enum fields are stored as an int. This int must always contain // a valid value, such that EnumDescriptor::FindValueByNumber() would // not return NULL. // - Repeated fields are stored as RepeatedFields or RepeatedPtrFields // of whatever type the individual field would be. Strings and // Messages use RepeatedPtrFields while everything else uses // RepeatedFields. class LIBPROTOBUF_EXPORT GeneratedMessageReflection PROTOBUF_FINAL : public Reflection { public: // Constructs a GeneratedMessageReflection. // Parameters: // descriptor: The descriptor for the message type being implemented. // schema: The description of the internal guts of the message. // pool: DescriptorPool to search for extension definitions. Only // used by FindKnownExtensionByName() and // FindKnownExtensionByNumber(). // factory: MessageFactory to use to construct extension messages. GeneratedMessageReflection(const Descriptor* descriptor, const ReflectionSchema& schema, const DescriptorPool* pool, MessageFactory* factory); ~GeneratedMessageReflection(); // implements Reflection ------------------------------------------- const UnknownFieldSet& GetUnknownFields(const Message& message) const; UnknownFieldSet* MutableUnknownFields(Message* message) const; size_t SpaceUsedLong(const Message& message) const; bool HasField(const Message& message, const FieldDescriptor* field) const; int FieldSize(const Message& message, const FieldDescriptor* field) const; void ClearField(Message* message, const FieldDescriptor* field) const; bool HasOneof(const Message& message, const OneofDescriptor* oneof_descriptor) const; void ClearOneof(Message* message, const OneofDescriptor* field) const; void RemoveLast(Message* message, const FieldDescriptor* field) const; Message* ReleaseLast(Message* message, const FieldDescriptor* field) const; void Swap(Message* message1, Message* message2) const; void SwapFields(Message* message1, Message* message2, const std::vector& fields) const; void SwapElements(Message* message, const FieldDescriptor* field, int index1, int index2) const; void ListFields(const Message& message, std::vector* output) const; int32 GetInt32 (const Message& message, const FieldDescriptor* field) const; int64 GetInt64 (const Message& message, const FieldDescriptor* field) const; uint32 GetUInt32(const Message& message, const FieldDescriptor* field) const; uint64 GetUInt64(const Message& message, const FieldDescriptor* field) const; float GetFloat (const Message& message, const FieldDescriptor* field) const; double GetDouble(const Message& message, const FieldDescriptor* field) const; bool GetBool (const Message& message, const FieldDescriptor* field) const; string GetString(const Message& message, const FieldDescriptor* field) const; const string& GetStringReference(const Message& message, const FieldDescriptor* field, string* scratch) const; const EnumValueDescriptor* GetEnum(const Message& message, const FieldDescriptor* field) const; int GetEnumValue(const Message& message, const FieldDescriptor* field) const; const Message& GetMessage(const Message& message, const FieldDescriptor* field, MessageFactory* factory = NULL) const; const FieldDescriptor* GetOneofFieldDescriptor( const Message& message, const OneofDescriptor* oneof_descriptor) const; private: bool ContainsMapKey(const Message& message, const FieldDescriptor* field, const MapKey& key) const; bool InsertOrLookupMapValue(Message* message, const FieldDescriptor* field, const MapKey& key, MapValueRef* val) const; bool DeleteMapValue(Message* message, const FieldDescriptor* field, const MapKey& key) const; MapIterator MapBegin( Message* message, const FieldDescriptor* field) const; MapIterator MapEnd( Message* message, const FieldDescriptor* field) const; int MapSize(const Message& message, const FieldDescriptor* field) const; public: void SetInt32 (Message* message, const FieldDescriptor* field, int32 value) const; void SetInt64 (Message* message, const FieldDescriptor* field, int64 value) const; void SetUInt32(Message* message, const FieldDescriptor* field, uint32 value) const; void SetUInt64(Message* message, const FieldDescriptor* field, uint64 value) const; void SetFloat (Message* message, const FieldDescriptor* field, float value) const; void SetDouble(Message* message, const FieldDescriptor* field, double value) const; void SetBool (Message* message, const FieldDescriptor* field, bool value) const; void SetString(Message* message, const FieldDescriptor* field, const string& value) const; void SetEnum (Message* message, const FieldDescriptor* field, const EnumValueDescriptor* value) const; void SetEnumValue(Message* message, const FieldDescriptor* field, int value) const; Message* MutableMessage(Message* message, const FieldDescriptor* field, MessageFactory* factory = NULL) const; void SetAllocatedMessage(Message* message, Message* sub_message, const FieldDescriptor* field) const; Message* ReleaseMessage(Message* message, const FieldDescriptor* field, MessageFactory* factory = NULL) const; int32 GetRepeatedInt32 (const Message& message, const FieldDescriptor* field, int index) const; int64 GetRepeatedInt64 (const Message& message, const FieldDescriptor* field, int index) const; uint32 GetRepeatedUInt32(const Message& message, const FieldDescriptor* field, int index) const; uint64 GetRepeatedUInt64(const Message& message, const FieldDescriptor* field, int index) const; float GetRepeatedFloat (const Message& message, const FieldDescriptor* field, int index) const; double GetRepeatedDouble(const Message& message, const FieldDescriptor* field, int index) const; bool GetRepeatedBool (const Message& message, const FieldDescriptor* field, int index) const; string GetRepeatedString(const Message& message, const FieldDescriptor* field, int index) const; const string& GetRepeatedStringReference(const Message& message, const FieldDescriptor* field, int index, string* scratch) const; const EnumValueDescriptor* GetRepeatedEnum(const Message& message, const FieldDescriptor* field, int index) const; int GetRepeatedEnumValue(const Message& message, const FieldDescriptor* field, int index) const; const Message& GetRepeatedMessage(const Message& message, const FieldDescriptor* field, int index) const; // Set the value of a field. void SetRepeatedInt32 (Message* message, const FieldDescriptor* field, int index, int32 value) const; void SetRepeatedInt64 (Message* message, const FieldDescriptor* field, int index, int64 value) const; void SetRepeatedUInt32(Message* message, const FieldDescriptor* field, int index, uint32 value) const; void SetRepeatedUInt64(Message* message, const FieldDescriptor* field, int index, uint64 value) const; void SetRepeatedFloat (Message* message, const FieldDescriptor* field, int index, float value) const; void SetRepeatedDouble(Message* message, const FieldDescriptor* field, int index, double value) const; void SetRepeatedBool (Message* message, const FieldDescriptor* field, int index, bool value) const; void SetRepeatedString(Message* message, const FieldDescriptor* field, int index, const string& value) const; void SetRepeatedEnum(Message* message, const FieldDescriptor* field, int index, const EnumValueDescriptor* value) const; void SetRepeatedEnumValue(Message* message, const FieldDescriptor* field, int index, int value) const; // Get a mutable pointer to a field with a message type. Message* MutableRepeatedMessage(Message* message, const FieldDescriptor* field, int index) const; void AddInt32 (Message* message, const FieldDescriptor* field, int32 value) const; void AddInt64 (Message* message, const FieldDescriptor* field, int64 value) const; void AddUInt32(Message* message, const FieldDescriptor* field, uint32 value) const; void AddUInt64(Message* message, const FieldDescriptor* field, uint64 value) const; void AddFloat (Message* message, const FieldDescriptor* field, float value) const; void AddDouble(Message* message, const FieldDescriptor* field, double value) const; void AddBool (Message* message, const FieldDescriptor* field, bool value) const; void AddString(Message* message, const FieldDescriptor* field, const string& value) const; void AddEnum(Message* message, const FieldDescriptor* field, const EnumValueDescriptor* value) const; void AddEnumValue(Message* message, const FieldDescriptor* field, int value) const; Message* AddMessage(Message* message, const FieldDescriptor* field, MessageFactory* factory = NULL) const; void AddAllocatedMessage( Message* message, const FieldDescriptor* field, Message* new_entry) const; const FieldDescriptor* FindKnownExtensionByName(const string& name) const; const FieldDescriptor* FindKnownExtensionByNumber(int number) const; bool SupportsUnknownEnumValues() const; // This value for arena_offset_ indicates that there is no arena pointer in // this message (e.g., old generated code). static const int kNoArenaPointer = -1; // This value for unknown_field_offset_ indicates that there is no // UnknownFieldSet in this message, and that instead, we are using the // Zero-Overhead Arena Pointer trick. When this is the case, arena_offset_ // actually indexes to an InternalMetadataWithArena instance, which can return // either an arena pointer or an UnknownFieldSet or both. It is never the case // that unknown_field_offset_ == kUnknownFieldSetInMetadata && arena_offset_ // == kNoArenaPointer. static const int kUnknownFieldSetInMetadata = -1; protected: void* MutableRawRepeatedField( Message* message, const FieldDescriptor* field, FieldDescriptor::CppType, int ctype, const Descriptor* desc) const; const void* GetRawRepeatedField( const Message& message, const FieldDescriptor* field, FieldDescriptor::CppType, int ctype, const Descriptor* desc) const; virtual MessageFactory* GetMessageFactory() const; virtual void* RepeatedFieldData( Message* message, const FieldDescriptor* field, FieldDescriptor::CppType cpp_type, const Descriptor* message_type) const; private: friend class google::protobuf::flat::MetadataBuilder; friend class upb::google_opensource::GMR_Handlers; const Descriptor* const descriptor_; const ReflectionSchema schema_; const DescriptorPool* const descriptor_pool_; MessageFactory* const message_factory_; // Last non weak field index. This is an optimization when most weak fields // are at the end of the containing message. If a message proto doesn't // contain weak fields, then this field equals descriptor_->field_count(). int last_non_weak_field_index_; template const T& GetRawNonOneof(const Message& message, const FieldDescriptor* field) const; template T* MutableRawNonOneof(Message* message, const FieldDescriptor* field) const; template const Type& GetRaw(const Message& message, const FieldDescriptor* field) const; template inline Type* MutableRaw(Message* message, const FieldDescriptor* field) const; template inline const Type& DefaultRaw(const FieldDescriptor* field) const; inline const uint32* GetHasBits(const Message& message) const; inline uint32* MutableHasBits(Message* message) const; inline uint32 GetOneofCase( const Message& message, const OneofDescriptor* oneof_descriptor) const; inline uint32* MutableOneofCase( Message* message, const OneofDescriptor* oneof_descriptor) const; inline const ExtensionSet& GetExtensionSet(const Message& message) const; inline ExtensionSet* MutableExtensionSet(Message* message) const; inline Arena* GetArena(Message* message) const; inline const InternalMetadataWithArena& GetInternalMetadataWithArena( const Message& message) const; inline InternalMetadataWithArena* MutableInternalMetadataWithArena(Message* message) const; inline bool HasBit(const Message& message, const FieldDescriptor* field) const; inline void SetBit(Message* message, const FieldDescriptor* field) const; inline void ClearBit(Message* message, const FieldDescriptor* field) const; inline void SwapBit(Message* message1, Message* message2, const FieldDescriptor* field) const; // This function only swaps the field. Should swap corresponding has_bit // before or after using this function. void SwapField(Message* message1, Message* message2, const FieldDescriptor* field) const; void SwapOneofField(Message* message1, Message* message2, const OneofDescriptor* oneof_descriptor) const; inline bool HasOneofField(const Message& message, const FieldDescriptor* field) const; inline void SetOneofCase(Message* message, const FieldDescriptor* field) const; inline void ClearOneofField(Message* message, const FieldDescriptor* field) const; template inline const Type& GetField(const Message& message, const FieldDescriptor* field) const; template inline void SetField(Message* message, const FieldDescriptor* field, const Type& value) const; template inline Type* MutableField(Message* message, const FieldDescriptor* field) const; template inline const Type& GetRepeatedField(const Message& message, const FieldDescriptor* field, int index) const; template inline const Type& GetRepeatedPtrField(const Message& message, const FieldDescriptor* field, int index) const; template inline void SetRepeatedField(Message* message, const FieldDescriptor* field, int index, Type value) const; template inline Type* MutableRepeatedField(Message* message, const FieldDescriptor* field, int index) const; template inline void AddField(Message* message, const FieldDescriptor* field, const Type& value) const; template inline Type* AddField(Message* message, const FieldDescriptor* field) const; int GetExtensionNumberOrDie(const Descriptor* type) const; // Internal versions of EnumValue API perform no checking. Called after checks // by public methods. void SetEnumValueInternal(Message* message, const FieldDescriptor* field, int value) const; void SetRepeatedEnumValueInternal(Message* message, const FieldDescriptor* field, int index, int value) const; void AddEnumValueInternal(Message* message, const FieldDescriptor* field, int value) const; Message* UnsafeArenaReleaseMessage(Message* message, const FieldDescriptor* field, MessageFactory* factory = NULL) const; void UnsafeArenaSetAllocatedMessage(Message* message, Message* sub_message, const FieldDescriptor* field) const; internal::MapFieldBase* MapData( Message* message, const FieldDescriptor* field) const; friend inline // inline so nobody can call this function. void RegisterAllTypesInternal(const Metadata* file_level_metadata, int size); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratedMessageReflection); }; // There are some places in proto2 where dynamic_cast would be useful as an // optimization. For example, take Message::MergeFrom(const Message& other). // For a given generated message FooMessage, we generate these two methods: // void MergeFrom(const FooMessage& other); // void MergeFrom(const Message& other); // The former method can be implemented directly in terms of FooMessage's // inline accessors, but the latter method must work with the reflection // interface. However, if the parameter to the latter method is actually of // type FooMessage, then we'd like to be able to just call the other method // as an optimization. So, we use dynamic_cast to check this. // // That said, dynamic_cast requires RTTI, which many people like to disable // for performance and code size reasons. When RTTI is not available, we // still need to produce correct results. So, in this case we have to fall // back to using reflection, which is what we would have done anyway if the // objects were not of the exact same class. // // dynamic_cast_if_available() implements this logic. If RTTI is // enabled, it does a dynamic_cast. If RTTI is disabled, it just returns // NULL. // // If you need to compile without RTTI, simply #define GOOGLE_PROTOBUF_NO_RTTI. // On MSVC, this should be detected automatically. template inline To dynamic_cast_if_available(From from) { #if defined(GOOGLE_PROTOBUF_NO_RTTI) || (defined(_MSC_VER)&&!defined(_CPPRTTI)) // Avoid the compiler warning about unused variables. (void)from; return NULL; #else return dynamic_cast(from); #endif } // Tries to downcast this message to a generated message type. // Returns NULL if this class is not an instance of T. // // This is like dynamic_cast_if_available, except it works even when // dynamic_cast is not available by using Reflection. However it only works // with Message objects. // // TODO(haberman): can we remove dynamic_cast_if_available in favor of this? template T* DynamicCastToGenerated(const Message* from) { // Compile-time assert that T is a generated type that has a // default_instance() accessor, but avoid actually calling it. const T&(*get_default_instance)() = &T::default_instance; (void)get_default_instance; // Compile-time assert that T is a subclass of google::protobuf::Message. const Message* unused = static_cast(NULL); (void)unused; #if defined(GOOGLE_PROTOBUF_NO_RTTI) || \ (defined(_MSC_VER) && !defined(_CPPRTTI)) bool ok = &T::default_instance() == from->GetReflection()->GetMessageFactory()->GetPrototype( from->GetDescriptor()); return ok ? down_cast(from) : NULL; #else return dynamic_cast(from); #endif } template T* DynamicCastToGenerated(Message* from) { const Message* message_const = from; return const_cast(DynamicCastToGenerated(message_const)); } LIBPROTOBUF_EXPORT void AssignDescriptors( const string& filename, const MigrationSchema* schemas, const Message* const* default_instances_, const uint32* offsets, MessageFactory* factory, // update the following descriptor arrays. Metadata* file_level_metadata, const EnumDescriptor** file_level_enum_descriptors, const ServiceDescriptor** file_level_service_descriptors); LIBPROTOBUF_EXPORT void RegisterAllTypes(const Metadata* file_level_metadata, int size); // These cannot be in lite so we put them in the reflection. LIBPROTOBUF_EXPORT void UnknownFieldSetSerializer(const uint8* base, uint32 offset, uint32 tag, uint32 has_offset, ::google::protobuf::io::CodedOutputStream* output); } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__ generated_message_reflection_unittest.cc000066400000000000000000001212341334102242000353370ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf// 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. // // To test GeneratedMessageReflection, we actually let the protocol compiler // generate a full protocol message implementation and then test its // reflection interface. This is much easier and more maintainable than // trying to create our own Message class for GeneratedMessageReflection // to wrap. // // The tests here closely mirror some of the tests in // compiler/cpp/unittest, except using the reflection interface // rather than generated accessors. #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace { // Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes. const FieldDescriptor* F(const string& name) { const FieldDescriptor* result = unittest::TestAllTypes::descriptor()->FindFieldByName(name); GOOGLE_CHECK(result != NULL); return result; } TEST(GeneratedMessageReflectionTest, Defaults) { // Check that all default values are set correctly in the initial message. unittest::TestAllTypes message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllTypes::descriptor()); reflection_tester.ExpectClearViaReflection(message); const Reflection* reflection = message.GetReflection(); // Messages should return pointers to default instances until first use. // (This is not checked by ExpectClear() since it is not actually true after // the fields have been set and then cleared.) EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(), &reflection->GetMessage(message, F("optionalgroup"))); EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), &reflection->GetMessage(message, F("optional_nested_message"))); EXPECT_EQ(&unittest::ForeignMessage::default_instance(), &reflection->GetMessage(message, F("optional_foreign_message"))); EXPECT_EQ(&unittest_import::ImportMessage::default_instance(), &reflection->GetMessage(message, F("optional_import_message"))); } TEST(GeneratedMessageReflectionTest, Accessors) { // Set every field to a unique value then go back and check all those // values. unittest::TestAllTypes message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllTypes::descriptor()); reflection_tester.SetAllFieldsViaReflection(&message); TestUtil::ExpectAllFieldsSet(message); reflection_tester.ExpectAllFieldsSetViaReflection(message); reflection_tester.ModifyRepeatedFieldsViaReflection(&message); TestUtil::ExpectRepeatedFieldsModified(message); } TEST(GeneratedMessageReflectionTest, GetStringReference) { // Test that GetStringReference() returns the underlying string when it is // a normal string field. unittest::TestAllTypes message; message.set_optional_string("foo"); message.add_repeated_string("foo"); const Reflection* reflection = message.GetReflection(); string scratch; EXPECT_EQ(&message.optional_string(), &reflection->GetStringReference(message, F("optional_string"), &scratch)) << "For simple string fields, GetStringReference() should return a " "reference to the underlying string."; EXPECT_EQ(&message.repeated_string(0), &reflection->GetRepeatedStringReference(message, F("repeated_string"), 0, &scratch)) << "For simple string fields, GetRepeatedStringReference() should return " "a reference to the underlying string."; } TEST(GeneratedMessageReflectionTest, DefaultsAfterClear) { // Check that after setting all fields and then clearing, getting an // embedded message does NOT return the default instance. unittest::TestAllTypes message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllTypes::descriptor()); TestUtil::SetAllFields(&message); message.Clear(); const Reflection* reflection = message.GetReflection(); EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(), &reflection->GetMessage(message, F("optionalgroup"))); EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), &reflection->GetMessage(message, F("optional_nested_message"))); EXPECT_NE(&unittest::ForeignMessage::default_instance(), &reflection->GetMessage(message, F("optional_foreign_message"))); EXPECT_NE(&unittest_import::ImportMessage::default_instance(), &reflection->GetMessage(message, F("optional_import_message"))); } TEST(GeneratedMessageReflectionTest, Swap) { unittest::TestAllTypes message1; unittest::TestAllTypes message2; TestUtil::SetAllFields(&message1); const Reflection* reflection = message1.GetReflection(); reflection->Swap(&message1, &message2); TestUtil::ExpectClear(message1); TestUtil::ExpectAllFieldsSet(message2); } TEST(GeneratedMessageReflectionTest, SwapWithBothSet) { unittest::TestAllTypes message1; unittest::TestAllTypes message2; TestUtil::SetAllFields(&message1); TestUtil::SetAllFields(&message2); TestUtil::ModifyRepeatedFields(&message2); const Reflection* reflection = message1.GetReflection(); reflection->Swap(&message1, &message2); TestUtil::ExpectRepeatedFieldsModified(message1); TestUtil::ExpectAllFieldsSet(message2); message1.set_optional_int32(532819); reflection->Swap(&message1, &message2); EXPECT_EQ(532819, message2.optional_int32()); } TEST(GeneratedMessageReflectionTest, SwapExtensions) { unittest::TestAllExtensions message1; unittest::TestAllExtensions message2; TestUtil::SetAllExtensions(&message1); const Reflection* reflection = message1.GetReflection(); reflection->Swap(&message1, &message2); TestUtil::ExpectExtensionsClear(message1); TestUtil::ExpectAllExtensionsSet(message2); } TEST(GeneratedMessageReflectionTest, SwapUnknown) { unittest::TestEmptyMessage message1, message2; message1.mutable_unknown_fields()->AddVarint(1234, 1); EXPECT_EQ(1, message1.unknown_fields().field_count()); EXPECT_EQ(0, message2.unknown_fields().field_count()); const Reflection* reflection = message1.GetReflection(); reflection->Swap(&message1, &message2); EXPECT_EQ(0, message1.unknown_fields().field_count()); EXPECT_EQ(1, message2.unknown_fields().field_count()); } TEST(GeneratedMessageReflectionTest, SwapFields) { unittest::TestAllTypes message1, message2; message1.set_optional_double(12.3); message1.mutable_repeated_int32()->Add(10); message1.mutable_repeated_int32()->Add(20); message2.set_optional_string("hello"); message2.mutable_repeated_int64()->Add(30); std::vector fields; const Descriptor* descriptor = message1.GetDescriptor(); fields.push_back(descriptor->FindFieldByName("optional_double")); fields.push_back(descriptor->FindFieldByName("repeated_int32")); fields.push_back(descriptor->FindFieldByName("optional_string")); fields.push_back(descriptor->FindFieldByName("optional_uint64")); const Reflection* reflection = message1.GetReflection(); reflection->SwapFields(&message1, &message2, fields); EXPECT_FALSE(message1.has_optional_double()); EXPECT_EQ(0, message1.repeated_int32_size()); EXPECT_TRUE(message1.has_optional_string()); EXPECT_EQ("hello", message1.optional_string()); EXPECT_EQ(0, message1.repeated_int64_size()); EXPECT_FALSE(message1.has_optional_uint64()); EXPECT_TRUE(message2.has_optional_double()); EXPECT_EQ(12.3, message2.optional_double()); EXPECT_EQ(2, message2.repeated_int32_size()); EXPECT_EQ(10, message2.repeated_int32(0)); EXPECT_EQ(20, message2.repeated_int32(1)); EXPECT_FALSE(message2.has_optional_string()); EXPECT_EQ(1, message2.repeated_int64_size()); EXPECT_FALSE(message2.has_optional_uint64()); } TEST(GeneratedMessageReflectionTest, SwapFieldsAll) { unittest::TestAllTypes message1; unittest::TestAllTypes message2; TestUtil::SetAllFields(&message2); std::vector fields; const Reflection* reflection = message1.GetReflection(); reflection->ListFields(message2, &fields); reflection->SwapFields(&message1, &message2, fields); TestUtil::ExpectAllFieldsSet(message1); TestUtil::ExpectClear(message2); } TEST(GeneratedMessageReflectionTest, SwapFieldsAllExtension) { unittest::TestAllExtensions message1; unittest::TestAllExtensions message2; TestUtil::SetAllExtensions(&message1); std::vector fields; const Reflection* reflection = message1.GetReflection(); reflection->ListFields(message1, &fields); reflection->SwapFields(&message1, &message2, fields); TestUtil::ExpectExtensionsClear(message1); TestUtil::ExpectAllExtensionsSet(message2); } TEST(GeneratedMessageReflectionTest, SwapOneof) { unittest::TestOneof2 message1, message2; TestUtil::SetOneof1(&message1); const Reflection* reflection = message1.GetReflection(); reflection->Swap(&message1, &message2); TestUtil::ExpectOneofClear(message1); TestUtil::ExpectOneofSet1(message2); } TEST(GeneratedMessageReflectionTest, SwapOneofBothSet) { unittest::TestOneof2 message1, message2; TestUtil::SetOneof1(&message1); TestUtil::SetOneof2(&message2); const Reflection* reflection = message1.GetReflection(); reflection->Swap(&message1, &message2); TestUtil::ExpectOneofSet2(message1); TestUtil::ExpectOneofSet1(message2); } TEST(GeneratedMessageReflectionTest, SwapFieldsOneof) { unittest::TestOneof2 message1, message2; TestUtil::SetOneof1(&message1); std::vector fields; const Descriptor* descriptor = message1.GetDescriptor(); for (int i = 0; i < descriptor->field_count(); i++) { fields.push_back(descriptor->field(i)); } const Reflection* reflection = message1.GetReflection(); reflection->SwapFields(&message1, &message2, fields); TestUtil::ExpectOneofClear(message1); TestUtil::ExpectOneofSet1(message2); } TEST(GeneratedMessageReflectionTest, RemoveLast) { unittest::TestAllTypes message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllTypes::descriptor()); TestUtil::SetAllFields(&message); reflection_tester.RemoveLastRepeatedsViaReflection(&message); TestUtil::ExpectLastRepeatedsRemoved(message); } TEST(GeneratedMessageReflectionTest, RemoveLastExtensions) { unittest::TestAllExtensions message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllExtensions::descriptor()); TestUtil::SetAllExtensions(&message); reflection_tester.RemoveLastRepeatedsViaReflection(&message); TestUtil::ExpectLastRepeatedExtensionsRemoved(message); } TEST(GeneratedMessageReflectionTest, ReleaseLast) { unittest::TestAllTypes message; const Descriptor* descriptor = message.GetDescriptor(); TestUtil::ReflectionTester reflection_tester(descriptor); TestUtil::SetAllFields(&message); reflection_tester.ReleaseLastRepeatedsViaReflection(&message, false); TestUtil::ExpectLastRepeatedsReleased(message); // Now test that we actually release the right message. message.Clear(); TestUtil::SetAllFields(&message); ASSERT_EQ(2, message.repeated_foreign_message_size()); const protobuf_unittest::ForeignMessage* expected = message.mutable_repeated_foreign_message(1); google::protobuf::scoped_ptr released(message.GetReflection()->ReleaseLast( &message, descriptor->FindFieldByName("repeated_foreign_message"))); EXPECT_EQ(expected, released.get()); } TEST(GeneratedMessageReflectionTest, ReleaseLastExtensions) { unittest::TestAllExtensions message; const Descriptor* descriptor = message.GetDescriptor(); TestUtil::ReflectionTester reflection_tester(descriptor); TestUtil::SetAllExtensions(&message); reflection_tester.ReleaseLastRepeatedsViaReflection(&message, true); TestUtil::ExpectLastRepeatedExtensionsReleased(message); // Now test that we actually release the right message. message.Clear(); TestUtil::SetAllExtensions(&message); ASSERT_EQ(2, message.ExtensionSize( unittest::repeated_foreign_message_extension)); const protobuf_unittest::ForeignMessage* expected = message.MutableExtension( unittest::repeated_foreign_message_extension, 1); google::protobuf::scoped_ptr released(message.GetReflection()->ReleaseLast( &message, descriptor->file()->FindExtensionByName( "repeated_foreign_message_extension"))); EXPECT_EQ(expected, released.get()); } TEST(GeneratedMessageReflectionTest, SwapRepeatedElements) { unittest::TestAllTypes message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllTypes::descriptor()); TestUtil::SetAllFields(&message); // Swap and test that fields are all swapped. reflection_tester.SwapRepeatedsViaReflection(&message); TestUtil::ExpectRepeatedsSwapped(message); // Swap back and test that fields are all back to original values. reflection_tester.SwapRepeatedsViaReflection(&message); TestUtil::ExpectAllFieldsSet(message); } TEST(GeneratedMessageReflectionTest, SwapRepeatedElementsExtension) { unittest::TestAllExtensions message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllExtensions::descriptor()); TestUtil::SetAllExtensions(&message); // Swap and test that fields are all swapped. reflection_tester.SwapRepeatedsViaReflection(&message); TestUtil::ExpectRepeatedExtensionsSwapped(message); // Swap back and test that fields are all back to original values. reflection_tester.SwapRepeatedsViaReflection(&message); TestUtil::ExpectAllExtensionsSet(message); } TEST(GeneratedMessageReflectionTest, Extensions) { // Set every extension to a unique value then go back and check all those // values. unittest::TestAllExtensions message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllExtensions::descriptor()); reflection_tester.SetAllFieldsViaReflection(&message); TestUtil::ExpectAllExtensionsSet(message); reflection_tester.ExpectAllFieldsSetViaReflection(message); reflection_tester.ModifyRepeatedFieldsViaReflection(&message); TestUtil::ExpectRepeatedExtensionsModified(message); } TEST(GeneratedMessageReflectionTest, FindExtensionTypeByNumber) { const Reflection* reflection = unittest::TestAllExtensions::default_instance().GetReflection(); const FieldDescriptor* extension1 = unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( "optional_int32_extension"); const FieldDescriptor* extension2 = unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( "repeated_string_extension"); EXPECT_EQ(extension1, reflection->FindKnownExtensionByNumber(extension1->number())); EXPECT_EQ(extension2, reflection->FindKnownExtensionByNumber(extension2->number())); // Non-existent extension. EXPECT_TRUE(reflection->FindKnownExtensionByNumber(62341) == NULL); // Extensions of TestAllExtensions should not show up as extensions of // other types. EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()-> FindKnownExtensionByNumber(extension1->number()) == NULL); } TEST(GeneratedMessageReflectionTest, FindKnownExtensionByName) { const Reflection* reflection = unittest::TestAllExtensions::default_instance().GetReflection(); const FieldDescriptor* extension1 = unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( "optional_int32_extension"); const FieldDescriptor* extension2 = unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( "repeated_string_extension"); EXPECT_EQ(extension1, reflection->FindKnownExtensionByName(extension1->full_name())); EXPECT_EQ(extension2, reflection->FindKnownExtensionByName(extension2->full_name())); // Non-existent extension. EXPECT_TRUE(reflection->FindKnownExtensionByName("no_such_ext") == NULL); // Extensions of TestAllExtensions should not show up as extensions of // other types. EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()-> FindKnownExtensionByName(extension1->full_name()) == NULL); } TEST(GeneratedMessageReflectionTest, SetAllocatedMessageTest) { unittest::TestAllTypes from_message1; unittest::TestAllTypes from_message2; unittest::TestAllTypes to_message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllTypes::descriptor()); reflection_tester.SetAllFieldsViaReflection(&from_message1); reflection_tester.SetAllFieldsViaReflection(&from_message2); // Before moving fields, we expect the nested messages to be NULL. reflection_tester.ExpectMessagesReleasedViaReflection( &to_message, TestUtil::ReflectionTester::IS_NULL); // After fields are moved we should get non-NULL releases. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message1, &to_message); reflection_tester.ExpectMessagesReleasedViaReflection( &to_message, TestUtil::ReflectionTester::NOT_NULL); // Another move to make sure that we can SetAllocated several times. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message2, &to_message); reflection_tester.ExpectMessagesReleasedViaReflection( &to_message, TestUtil::ReflectionTester::NOT_NULL); // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the // releases to be NULL again. reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection( &to_message); reflection_tester.ExpectMessagesReleasedViaReflection( &to_message, TestUtil::ReflectionTester::IS_NULL); } TEST(GeneratedMessageReflectionTest, SetAllocatedMessageOnArenaTest) { unittest::TestAllTypes from_message1; unittest::TestAllTypes from_message2; ::google::protobuf::Arena arena; unittest::TestAllTypes* to_message = ::google::protobuf::Arena::CreateMessage(&arena); TestUtil::ReflectionTester reflection_tester( unittest::TestAllTypes::descriptor()); reflection_tester.SetAllFieldsViaReflection(&from_message1); reflection_tester.SetAllFieldsViaReflection(&from_message2); // Before moving fields, we expect the nested messages to be NULL. reflection_tester.ExpectMessagesReleasedViaReflection( to_message, TestUtil::ReflectionTester::IS_NULL); // After fields are moved we should get non-NULL releases. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message1, to_message); reflection_tester.ExpectMessagesReleasedViaReflection( to_message, TestUtil::ReflectionTester::NOT_NULL); // Another move to make sure that we can SetAllocated several times. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message2, to_message); reflection_tester.ExpectMessagesReleasedViaReflection( to_message, TestUtil::ReflectionTester::NOT_NULL); // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the // releases to be NULL again. reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection( to_message); reflection_tester.ExpectMessagesReleasedViaReflection( to_message, TestUtil::ReflectionTester::IS_NULL); } TEST(GeneratedMessageReflectionTest, SetAllocatedExtensionMessageTest) { unittest::TestAllExtensions from_message1; unittest::TestAllExtensions from_message2; unittest::TestAllExtensions to_message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllExtensions::descriptor()); reflection_tester.SetAllFieldsViaReflection(&from_message1); reflection_tester.SetAllFieldsViaReflection(&from_message2); // Before moving fields, we expect the nested messages to be NULL. reflection_tester.ExpectMessagesReleasedViaReflection( &to_message, TestUtil::ReflectionTester::IS_NULL); // After fields are moved we should get non-NULL releases. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message1, &to_message); reflection_tester.ExpectMessagesReleasedViaReflection( &to_message, TestUtil::ReflectionTester::NOT_NULL); // Another move to make sure that we can SetAllocated several times. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message2, &to_message); reflection_tester.ExpectMessagesReleasedViaReflection( &to_message, TestUtil::ReflectionTester::NOT_NULL); // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the // releases to be NULL again. reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection( &to_message); reflection_tester.ExpectMessagesReleasedViaReflection( &to_message, TestUtil::ReflectionTester::IS_NULL); } TEST(GeneratedMessageReflectionTest, SetAllocatedExtensionMessageOnArenaTest) { ::google::protobuf::Arena arena; unittest::TestAllExtensions* to_message = ::google::protobuf::Arena::CreateMessage(&arena); unittest::TestAllExtensions from_message1; unittest::TestAllExtensions from_message2; TestUtil::ReflectionTester reflection_tester( unittest::TestAllExtensions::descriptor()); reflection_tester.SetAllFieldsViaReflection(&from_message1); reflection_tester.SetAllFieldsViaReflection(&from_message2); // Before moving fields, we expect the nested messages to be NULL. reflection_tester.ExpectMessagesReleasedViaReflection( to_message, TestUtil::ReflectionTester::IS_NULL); // After fields are moved we should get non-NULL releases. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message1, to_message); reflection_tester.ExpectMessagesReleasedViaReflection( to_message, TestUtil::ReflectionTester::NOT_NULL); // Another move to make sure that we can SetAllocated several times. reflection_tester.SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message2, to_message); reflection_tester.ExpectMessagesReleasedViaReflection( to_message, TestUtil::ReflectionTester::NOT_NULL); // After SetAllocatedOptionalMessageFieldsToNullViaReflection() we expect the // releases to be NULL again. reflection_tester.SetAllocatedOptionalMessageFieldsToNullViaReflection( to_message); reflection_tester.ExpectMessagesReleasedViaReflection( to_message, TestUtil::ReflectionTester::IS_NULL); } TEST(GeneratedMessageReflectionTest, AddRepeatedMessage) { unittest::TestAllTypes message; const Reflection* reflection = message.GetReflection(); const Reflection* nested_reflection = unittest::TestAllTypes::NestedMessage::default_instance().GetReflection(); const FieldDescriptor* nested_bb = unittest::TestAllTypes::NestedMessage::descriptor()->FindFieldByName( "bb"); Message* nested = reflection->AddMessage( &message, F("repeated_nested_message")); nested_reflection->SetInt32(nested, nested_bb, 11); EXPECT_EQ(11, message.repeated_nested_message(0).bb()); } TEST(GeneratedMessageReflectionTest, MutableRepeatedMessage) { unittest::TestAllTypes message; const Reflection* reflection = message.GetReflection(); const Reflection* nested_reflection = unittest::TestAllTypes::NestedMessage::default_instance().GetReflection(); const FieldDescriptor* nested_bb = unittest::TestAllTypes::NestedMessage::descriptor()->FindFieldByName( "bb"); message.add_repeated_nested_message()->set_bb(12); Message* nested = reflection->MutableRepeatedMessage( &message, F("repeated_nested_message"), 0); EXPECT_EQ(12, nested_reflection->GetInt32(*nested, nested_bb)); nested_reflection->SetInt32(nested, nested_bb, 13); EXPECT_EQ(13, message.repeated_nested_message(0).bb()); } TEST(GeneratedMessageReflectionTest, AddAllocatedMessage) { unittest::TestAllTypes message; const Reflection* reflection = message.GetReflection(); unittest::TestAllTypes::NestedMessage* nested = new unittest::TestAllTypes::NestedMessage(); nested->set_bb(11); reflection->AddAllocatedMessage(&message, F("repeated_nested_message"), nested); EXPECT_EQ(1, message.repeated_nested_message_size()); EXPECT_EQ(11, message.repeated_nested_message(0).bb()); } TEST(GeneratedMessageReflectionTest, ListFieldsOneOf) { unittest::TestOneof2 message; TestUtil::SetOneof1(&message); const Reflection* reflection = message.GetReflection(); std::vector fields; reflection->ListFields(message, &fields); EXPECT_EQ(4, fields.size()); } TEST(GeneratedMessageReflectionTest, Oneof) { unittest::TestOneof2 message; const Descriptor* descriptor = message.GetDescriptor(); const Reflection* reflection = message.GetReflection(); // Check default values. EXPECT_EQ(0, reflection->GetInt32( message, descriptor->FindFieldByName("foo_int"))); EXPECT_EQ("", reflection->GetString( message, descriptor->FindFieldByName("foo_string"))); EXPECT_EQ("", reflection->GetString( message, descriptor->FindFieldByName("foo_cord"))); EXPECT_EQ("", reflection->GetString( message, descriptor->FindFieldByName("foo_string_piece"))); EXPECT_EQ("", reflection->GetString( message, descriptor->FindFieldByName("foo_bytes"))); EXPECT_EQ(unittest::TestOneof2::FOO, reflection->GetEnum( message, descriptor->FindFieldByName("foo_enum"))->number()); EXPECT_EQ(&unittest::TestOneof2::NestedMessage::default_instance(), &reflection->GetMessage( message, descriptor->FindFieldByName("foo_message"))); EXPECT_EQ(&unittest::TestOneof2::FooGroup::default_instance(), &reflection->GetMessage( message, descriptor->FindFieldByName("foogroup"))); EXPECT_NE(&unittest::TestOneof2::FooGroup::default_instance(), &reflection->GetMessage( message, descriptor->FindFieldByName("foo_lazy_message"))); EXPECT_EQ(5, reflection->GetInt32( message, descriptor->FindFieldByName("bar_int"))); EXPECT_EQ("STRING", reflection->GetString( message, descriptor->FindFieldByName("bar_string"))); EXPECT_EQ("CORD", reflection->GetString( message, descriptor->FindFieldByName("bar_cord"))); EXPECT_EQ("SPIECE", reflection->GetString( message, descriptor->FindFieldByName("bar_string_piece"))); EXPECT_EQ("BYTES", reflection->GetString( message, descriptor->FindFieldByName("bar_bytes"))); EXPECT_EQ(unittest::TestOneof2::BAR, reflection->GetEnum( message, descriptor->FindFieldByName("bar_enum"))->number()); // Check Set functions. reflection->SetInt32( &message, descriptor->FindFieldByName("foo_int"), 123); EXPECT_EQ(123, reflection->GetInt32( message, descriptor->FindFieldByName("foo_int"))); reflection->SetString( &message, descriptor->FindFieldByName("foo_string"), "abc"); EXPECT_EQ("abc", reflection->GetString( message, descriptor->FindFieldByName("foo_string"))); reflection->SetString( &message, descriptor->FindFieldByName("foo_bytes"), "bytes"); EXPECT_EQ("bytes", reflection->GetString( message, descriptor->FindFieldByName("foo_bytes"))); reflection->SetString( &message, descriptor->FindFieldByName("bar_cord"), "change_cord"); EXPECT_EQ("change_cord", reflection->GetString( message, descriptor->FindFieldByName("bar_cord"))); reflection->SetString( &message, descriptor->FindFieldByName("bar_string_piece"), "change_spiece"); EXPECT_EQ("change_spiece", reflection->GetString( message, descriptor->FindFieldByName("bar_string_piece"))); } TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageTest) { unittest::TestOneof2 from_message1; unittest::TestOneof2 from_message2; unittest::TestOneof2 to_message; const Descriptor* descriptor = unittest::TestOneof2::descriptor(); const Reflection* reflection = to_message.GetReflection(); Message* released = reflection->ReleaseMessage( &to_message, descriptor->FindFieldByName("foo_lazy_message")); EXPECT_TRUE(released == NULL); released = reflection->ReleaseMessage( &to_message, descriptor->FindFieldByName("foo_message")); EXPECT_TRUE(released == NULL); TestUtil::ReflectionTester::SetOneofViaReflection(&from_message1); TestUtil::ReflectionTester::ExpectOneofSetViaReflection(from_message1); TestUtil::ReflectionTester:: SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message1, &to_message); const Message& sub_message = reflection->GetMessage( to_message, descriptor->FindFieldByName("foo_lazy_message")); released = reflection->ReleaseMessage( &to_message, descriptor->FindFieldByName("foo_lazy_message")); EXPECT_TRUE(released != NULL); EXPECT_EQ(&sub_message, released); delete released; TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2); reflection->MutableMessage( &from_message2, descriptor->FindFieldByName("foo_message")); TestUtil::ReflectionTester:: SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message2, &to_message); const Message& sub_message2 = reflection->GetMessage( to_message, descriptor->FindFieldByName("foo_message")); released = reflection->ReleaseMessage( &to_message, descriptor->FindFieldByName("foo_message")); EXPECT_TRUE(released != NULL); EXPECT_EQ(&sub_message2, released); delete released; } TEST(GeneratedMessageReflectionTest, SetAllocatedOneofMessageOnArenaTest) { unittest::TestOneof2 from_message1; unittest::TestOneof2 from_message2; ::google::protobuf::Arena arena; unittest::TestOneof2* to_message = ::google::protobuf::Arena::CreateMessage(&arena); const Descriptor* descriptor = unittest::TestOneof2::descriptor(); const Reflection* reflection = to_message->GetReflection(); Message* released = reflection->ReleaseMessage( to_message, descriptor->FindFieldByName("foo_lazy_message")); EXPECT_TRUE(released == NULL); released = reflection->ReleaseMessage( to_message, descriptor->FindFieldByName("foo_message")); EXPECT_TRUE(released == NULL); TestUtil::ReflectionTester::SetOneofViaReflection(&from_message1); TestUtil::ReflectionTester::ExpectOneofSetViaReflection(from_message1); TestUtil::ReflectionTester:: SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message1, to_message); const Message& sub_message = reflection->GetMessage( *to_message, descriptor->FindFieldByName("foo_lazy_message")); released = reflection->ReleaseMessage( to_message, descriptor->FindFieldByName("foo_lazy_message")); EXPECT_TRUE(released != NULL); // Since sub_message is arena allocated, releasing it results in copying it // into new heap-allocated memory. EXPECT_NE(&sub_message, released); delete released; TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2); reflection->MutableMessage( &from_message2, descriptor->FindFieldByName("foo_message")); TestUtil::ReflectionTester:: SetAllocatedOptionalMessageFieldsToMessageViaReflection( &from_message2, to_message); const Message& sub_message2 = reflection->GetMessage( *to_message, descriptor->FindFieldByName("foo_message")); released = reflection->ReleaseMessage( to_message, descriptor->FindFieldByName("foo_message")); EXPECT_TRUE(released != NULL); // Since sub_message2 is arena allocated, releasing it results in copying it // into new heap-allocated memory. EXPECT_NE(&sub_message2, released); delete released; } TEST(GeneratedMessageReflectionTest, ReleaseMessageTest) { unittest::TestAllTypes message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllTypes::descriptor()); // When nothing is set, we expect all released messages to be NULL. reflection_tester.ExpectMessagesReleasedViaReflection( &message, TestUtil::ReflectionTester::IS_NULL); // After fields are set we should get non-NULL releases. reflection_tester.SetAllFieldsViaReflection(&message); reflection_tester.ExpectMessagesReleasedViaReflection( &message, TestUtil::ReflectionTester::NOT_NULL); // After Clear() we may or may not get a message from ReleaseMessage(). // This is implementation specific. reflection_tester.SetAllFieldsViaReflection(&message); message.Clear(); reflection_tester.ExpectMessagesReleasedViaReflection( &message, TestUtil::ReflectionTester::CAN_BE_NULL); // Test a different code path for setting after releasing. TestUtil::SetAllFields(&message); TestUtil::ExpectAllFieldsSet(message); } TEST(GeneratedMessageReflectionTest, ReleaseExtensionMessageTest) { unittest::TestAllExtensions message; TestUtil::ReflectionTester reflection_tester( unittest::TestAllExtensions::descriptor()); // When nothing is set, we expect all released messages to be NULL. reflection_tester.ExpectMessagesReleasedViaReflection( &message, TestUtil::ReflectionTester::IS_NULL); // After fields are set we should get non-NULL releases. reflection_tester.SetAllFieldsViaReflection(&message); reflection_tester.ExpectMessagesReleasedViaReflection( &message, TestUtil::ReflectionTester::NOT_NULL); // After Clear() we may or may not get a message from ReleaseMessage(). // This is implementation specific. reflection_tester.SetAllFieldsViaReflection(&message); message.Clear(); reflection_tester.ExpectMessagesReleasedViaReflection( &message, TestUtil::ReflectionTester::CAN_BE_NULL); // Test a different code path for setting after releasing. TestUtil::SetAllExtensions(&message); TestUtil::ExpectAllExtensionsSet(message); } TEST(GeneratedMessageReflectionTest, ReleaseOneofMessageTest) { unittest::TestOneof2 message; TestUtil::ReflectionTester::SetOneofViaReflection(&message); const Descriptor* descriptor = unittest::TestOneof2::descriptor(); const Reflection* reflection = message.GetReflection(); const Message& sub_message = reflection->GetMessage( message, descriptor->FindFieldByName("foo_lazy_message")); Message* released = reflection->ReleaseMessage( &message, descriptor->FindFieldByName("foo_lazy_message")); EXPECT_TRUE(released != NULL); EXPECT_EQ(&sub_message, released); delete released; released = reflection->ReleaseMessage( &message, descriptor->FindFieldByName("foo_lazy_message")); EXPECT_TRUE(released == NULL); } TEST(GeneratedMessageReflectionTest, ArenaReleaseMessageTest) { ::google::protobuf::Arena arena; unittest::TestAllTypes* message = ::google::protobuf::Arena::CreateMessage(&arena); TestUtil::ReflectionTester reflection_tester( unittest::TestAllTypes::descriptor()); // When nothing is set, we expect all released messages to be NULL. reflection_tester.ExpectMessagesReleasedViaReflection( message, TestUtil::ReflectionTester::IS_NULL); // After fields are set we should get non-NULL releases. reflection_tester.SetAllFieldsViaReflection(message); reflection_tester.ExpectMessagesReleasedViaReflection( message, TestUtil::ReflectionTester::NOT_NULL); // After Clear() we may or may not get a message from ReleaseMessage(). // This is implementation specific. reflection_tester.SetAllFieldsViaReflection(message); message->Clear(); reflection_tester.ExpectMessagesReleasedViaReflection( message, TestUtil::ReflectionTester::CAN_BE_NULL); } TEST(GeneratedMessageReflectionTest, ArenaReleaseExtensionMessageTest) { ::google::protobuf::Arena arena; unittest::TestAllExtensions* message = ::google::protobuf::Arena::CreateMessage(&arena); TestUtil::ReflectionTester reflection_tester( unittest::TestAllExtensions::descriptor()); // When nothing is set, we expect all released messages to be NULL. reflection_tester.ExpectMessagesReleasedViaReflection( message, TestUtil::ReflectionTester::IS_NULL); // After fields are set we should get non-NULL releases. reflection_tester.SetAllFieldsViaReflection(message); reflection_tester.ExpectMessagesReleasedViaReflection( message, TestUtil::ReflectionTester::NOT_NULL); // After Clear() we may or may not get a message from ReleaseMessage(). // This is implementation specific. reflection_tester.SetAllFieldsViaReflection(message); message->Clear(); reflection_tester.ExpectMessagesReleasedViaReflection( message, TestUtil::ReflectionTester::CAN_BE_NULL); } TEST(GeneratedMessageReflectionTest, ArenaReleaseOneofMessageTest) { ::google::protobuf::Arena arena; unittest::TestOneof2* message = ::google::protobuf::Arena::CreateMessage(&arena); TestUtil::ReflectionTester::SetOneofViaReflection(message); const Descriptor* descriptor = unittest::TestOneof2::descriptor(); const Reflection* reflection = message->GetReflection(); Message* released = reflection->ReleaseMessage( message, descriptor->FindFieldByName("foo_lazy_message")); EXPECT_TRUE(released != NULL); delete released; released = reflection->ReleaseMessage( message, descriptor->FindFieldByName("foo_lazy_message")); EXPECT_TRUE(released == NULL); } #ifdef PROTOBUF_HAS_DEATH_TEST TEST(GeneratedMessageReflectionTest, UsageErrors) { unittest::TestAllTypes message; 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( reflection->GetInt32( message, descriptor->FindFieldByName("optional_int64")), "Protocol Buffer reflection usage error:\n" " Method : google::protobuf::Reflection::GetInt32\n" " Message type: protobuf_unittest\\.TestAllTypes\n" " Field : protobuf_unittest\\.TestAllTypes\\.optional_int64\n" " Problem : Field is not the right type for this message:\n" " Expected : CPPTYPE_INT32\n" " Field type: CPPTYPE_INT64"); EXPECT_DEATH( reflection->GetInt32( message, descriptor->FindFieldByName("repeated_int32")), "Protocol Buffer reflection usage error:\n" " Method : google::protobuf::Reflection::GetInt32\n" " Message type: protobuf_unittest.TestAllTypes\n" " Field : protobuf_unittest.TestAllTypes.repeated_int32\n" " Problem : Field is repeated; the method requires a singular field."); EXPECT_DEATH( reflection->GetInt32( message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")), "Protocol Buffer reflection usage error:\n" " Method : google::protobuf::Reflection::GetInt32\n" " Message type: protobuf_unittest.TestAllTypes\n" " Field : protobuf_unittest.ForeignMessage.c\n" " Problem : Field does not match message type."); EXPECT_DEATH( reflection->HasField( message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")), "Protocol Buffer reflection usage error:\n" " Method : google::protobuf::Reflection::HasField\n" " 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 } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/generated_message_table_driven.cc000066400000000000000000000076271334102242000337740ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { namespace { UnknownFieldSet* MutableUnknownFields(MessageLite* msg, int64 arena_offset) { return Raw(msg, arena_offset) ->mutable_unknown_fields(); } struct UnknownFieldHandler { static bool Skip(MessageLite* msg, const ParseTable& table, io::CodedInputStream* input, int tag) { GOOGLE_DCHECK(table.unknown_field_set); return WireFormat::SkipField(input, tag, MutableUnknownFields(msg, table.arena_offset)); } static void Varint(MessageLite* msg, const ParseTable& table, int tag, int value) { GOOGLE_DCHECK(table.unknown_field_set); MutableUnknownFields(msg, table.arena_offset)->AddVarint( WireFormatLite::GetTagFieldNumber(tag), value); } static bool ParseExtension( MessageLite* msg, const ParseTable& table, io::CodedInputStream* input, int tag) { ExtensionSet* extensions = GetExtensionSet(msg, table.extension_offset); if (extensions == NULL) { return false; } const Message* prototype = down_cast( table.default_instance()); GOOGLE_DCHECK(prototype != NULL); GOOGLE_DCHECK(table.unknown_field_set); UnknownFieldSet* unknown_fields = MutableUnknownFields(msg, table.arena_offset); return extensions->ParseField(tag, input, prototype, unknown_fields); } }; } // namespace bool MergePartialFromCodedStream( MessageLite* msg, const ParseTable& table, io::CodedInputStream* input) { return MergePartialFromCodedStreamImpl(msg, table, input); } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/generated_message_table_driven.h000066400000000000000000000177171334102242000336370ustar00rootroot00000000000000// 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_GENERATED_MESSAGE_TABLE_DRIVEN_H__ #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_H__ #include #include #include #include #include #include #if LANG_CXX11 #define PROTOBUF_CONSTEXPR constexpr // We require C++11 and Clang to use constexpr for variables, as GCC 4.8 // requires constexpr to be consistent between declarations of variables // unnecessarily (see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58541). // VS 2017 Update 3 also supports this usage of constexpr. #if defined(__clang__) || (defined(_MSC_VER) && _MSC_VER >= 1911) #define PROTOBUF_CONSTEXPR_VAR constexpr #else // !__clang__ #define PROTOBUF_CONSTEXPR_VAR #endif // !_clang #else #define PROTOBUF_CONSTEXPR #define PROTOBUF_CONSTEXPR_VAR #endif namespace google { namespace protobuf { namespace internal { // Processing-type masks. static PROTOBUF_CONSTEXPR const unsigned char kOneofMask = 0x40; static PROTOBUF_CONSTEXPR const unsigned char kRepeatedMask = 0x20; // Mask for the raw type: either a WireFormatLite::FieldType or one of the // ProcessingTypes below, without the oneof or repeated flag. static PROTOBUF_CONSTEXPR const unsigned char kTypeMask = 0x1f; // Wire type masks. static PROTOBUF_CONSTEXPR const unsigned char kNotPackedMask = 0x10; static PROTOBUF_CONSTEXPR const unsigned char kInvalidMask = 0x20; enum ProcessingTypes { TYPE_STRING_CORD = 19, TYPE_STRING_STRING_PIECE = 20, TYPE_BYTES_CORD = 21, TYPE_BYTES_STRING_PIECE = 22, TYPE_MAP = 23, }; #if LANG_CXX11 static_assert(TYPE_MAP < kRepeatedMask, "Invalid enum"); #endif // TODO(ckennelly): Add a static assertion to ensure that these masks do not // conflict with wiretypes. // ParseTableField is kept small to help simplify instructions for computing // offsets, as we will always need this information to parse a field. // Additional data, needed for some types, is stored in // AuxillaryParseTableField. struct ParseTableField { uint32 offset; // The presence_index ordinarily represents a has_bit index, but for fields // inside a oneof it represents the index in _oneof_case_. uint32 presence_index; unsigned char normal_wiretype; unsigned char packed_wiretype; // processing_type is given by: // (FieldDescriptor->type() << 1) | FieldDescriptor->is_packed() unsigned char processing_type; unsigned char tag_size; }; struct ParseTable; union AuxillaryParseTableField { typedef bool (*EnumValidator)(int); // Enums struct enum_aux { EnumValidator validator; }; enum_aux enums; // Group, messages struct message_aux { // ExplicitlyInitialized -> T requires a reinterpret_cast, which prevents // the tables from being constructed as a constexpr. We use void to avoid // the cast. const void* default_message_void; const MessageLite* default_message() const { return static_cast(default_message_void); } const ParseTable* parse_table; }; message_aux messages; // Strings struct string_aux { const void* default_ptr; const char* field_name; }; string_aux strings; struct map_aux { bool (*parse_map)(io::CodedInputStream*, void*); }; map_aux maps; #if LANG_CXX11 AuxillaryParseTableField() = default; #else AuxillaryParseTableField() { } #endif PROTOBUF_CONSTEXPR AuxillaryParseTableField( AuxillaryParseTableField::enum_aux e) : enums(e) {} PROTOBUF_CONSTEXPR AuxillaryParseTableField( AuxillaryParseTableField::message_aux m) : messages(m) {} PROTOBUF_CONSTEXPR AuxillaryParseTableField( AuxillaryParseTableField::string_aux s) : strings(s) {} PROTOBUF_CONSTEXPR AuxillaryParseTableField( AuxillaryParseTableField::map_aux m) : maps(m) {} }; struct ParseTable { const ParseTableField* fields; const AuxillaryParseTableField* aux; int max_field_number; // TODO(ckennelly): Do something with this padding. // TODO(ckennelly): Vet these for sign extension. int64 has_bits_offset; int64 oneof_case_offset; int64 extension_offset; int64 arena_offset; // ExplicitlyInitialized -> T requires a reinterpret_cast, which prevents // the tables from being constructed as a constexpr. We use void to avoid // the cast. const void* default_instance_void; const MessageLite* default_instance() const { return static_cast(default_instance_void); } bool unknown_field_set; }; // TODO(jhen): Remove the __NVCC__ check when we get a version of nvcc that // supports these checks. #if LANG_CXX11 && !defined(__NVCC__) static_assert(sizeof(ParseTableField) <= 16, "ParseTableField is too large"); // The tables must be composed of POD components to ensure link-time // initialization. static_assert(std::is_pod::value, ""); static_assert(std::is_pod::value, ""); static_assert(std::is_pod::value, ""); static_assert(std::is_pod::value, ""); static_assert(std::is_pod::value, ""); static_assert(std::is_pod::value, ""); #endif // TODO(ckennelly): Consolidate these implementations into a single one, using // dynamic dispatch to the appropriate unknown field handler. bool MergePartialFromCodedStream(MessageLite* msg, const ParseTable& table, io::CodedInputStream* input); bool MergePartialFromCodedStreamLite(MessageLite* msg, const ParseTable& table, io::CodedInputStream* input); template bool ParseMap(io::CodedInputStream* input, void* map_field) { typedef typename MapEntryToMapField::MapFieldType MapFieldType; typedef google::protobuf::Map MapType; typedef typename Entry::template Parser ParserType; ParserType parser(static_cast(map_field)); return ::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(input, &parser); } } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_H__ generated_message_table_driven_lite.cc000066400000000000000000000104521334102242000347200ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf// 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 #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { namespace { string* MutableUnknownFields(MessageLite* msg, int64 arena_offset) { return Raw(msg, arena_offset) ->mutable_unknown_fields(); } struct UnknownFieldHandlerLite { static bool Skip(MessageLite* msg, const ParseTable& table, io::CodedInputStream* input, int tag) { GOOGLE_DCHECK(!table.unknown_field_set); ::google::protobuf::io::StringOutputStream unknown_fields_string( MutableUnknownFields(msg, table.arena_offset)); ::google::protobuf::io::CodedOutputStream unknown_fields_stream( &unknown_fields_string, false); return ::google::protobuf::internal::WireFormatLite::SkipField( input, tag, &unknown_fields_stream); } static void Varint(MessageLite* msg, const ParseTable& table, int tag, int value) { GOOGLE_DCHECK(!table.unknown_field_set); ::google::protobuf::io::StringOutputStream unknown_fields_string( MutableUnknownFields(msg, table.arena_offset)); ::google::protobuf::io::CodedOutputStream unknown_fields_stream( &unknown_fields_string, false); unknown_fields_stream.WriteVarint32(tag); unknown_fields_stream.WriteVarint32(value); } static bool ParseExtension( MessageLite* msg, const ParseTable& table, io::CodedInputStream* input, int tag) { ExtensionSet* extensions = GetExtensionSet(msg, table.extension_offset); if (extensions == NULL) { return false; } const MessageLite* prototype = table.default_instance(); GOOGLE_DCHECK(!table.unknown_field_set); ::google::protobuf::io::StringOutputStream unknown_fields_string( MutableUnknownFields(msg, table.arena_offset)); ::google::protobuf::io::CodedOutputStream unknown_fields_stream( &unknown_fields_string, false); return extensions->ParseField( tag, input, prototype, &unknown_fields_stream); } }; } // namespace bool MergePartialFromCodedStreamLite( MessageLite* msg, const ParseTable& table, io::CodedInputStream* input) { return MergePartialFromCodedStreamImpl( msg, table, input); } } // namespace internal } // namespace protobuf } // namespace google generated_message_table_driven_lite.h000066400000000000000000000745511334102242000345740ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf// 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_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__ #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__ #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { enum StringType { StringType_STRING = 0, StringType_CORD = 1, StringType_STRING_PIECE = 2 }; // Logically a superset of StringType, consisting of all field types that // require special initialization. enum ProcessingType { ProcessingType_STRING = 0, ProcessingType_CORD = 1, ProcessingType_STRING_PIECE = 2, ProcessingType_MESSAGE = 3 }; enum Cardinality { Cardinality_SINGULAR = 0, Cardinality_REPEATED = 1, Cardinality_ONEOF = 3 }; template inline Type* Raw(MessageLite* msg, int64 offset) { return reinterpret_cast(reinterpret_cast(msg) + offset); } template inline const Type* Raw(const MessageLite* msg, int64 offset) { return reinterpret_cast(reinterpret_cast(msg) + offset); } template inline Arena* GetArena(MessageLite* msg, int64 arena_offset) { if (GOOGLE_PREDICT_FALSE(arena_offset == -1)) { return NULL; } return Raw(msg, arena_offset)->arena(); } inline ExtensionSet* GetExtensionSet(MessageLite* msg, int64 extension_offset) { if (extension_offset == -1) { return NULL; } return Raw(msg, extension_offset); } template inline Type* AddField(MessageLite* msg, int64 offset) { #if LANG_CXX11 static_assert(has_trivial_copy::value, "Do not assign"); #endif google::protobuf::RepeatedField* repeated = Raw >(msg, offset); return repeated->Add(); } template <> inline string* AddField(MessageLite* msg, int64 offset) { google::protobuf::RepeatedPtrField* repeated = Raw >(msg, offset); return repeated->Add(); } template inline void AddField(MessageLite* msg, int64 offset, Type value) { #if LANG_CXX11 static_assert(has_trivial_copy::value, "Do not assign"); #endif *AddField(msg, offset) = value; } inline void SetBit(uint32* has_bits, uint32 has_bit_index) { GOOGLE_DCHECK(has_bits != NULL); uint32 mask = static_cast(1u) << (has_bit_index % 32); has_bits[has_bit_index / 32u] |= mask; } template inline Type* MutableField(MessageLite* msg, uint32* has_bits, uint32 has_bit_index, int64 offset) { SetBit(has_bits, has_bit_index); return Raw(msg, offset); } template inline void SetField(MessageLite* msg, uint32* has_bits, uint32 has_bit_index, int64 offset, Type value) { #if LANG_CXX11 static_assert(has_trivial_copy::value, "Do not assign"); #endif *MutableField(msg, has_bits, has_bit_index, offset) = value; } template inline void SetOneofField(MessageLite* msg, uint32* oneof_case, uint32 oneof_case_index, int64 offset, int field_number, Type value) { oneof_case[oneof_case_index] = field_number; *Raw(msg, offset) = value; } // Clears a oneof field. The field argument should correspond to the particular // field that is currently set in the oneof. inline void ClearOneofField(const ParseTableField& field, Arena* arena, MessageLite* msg) { switch (field.processing_type & kTypeMask) { case WireFormatLite::TYPE_MESSAGE: if (arena == NULL) { delete *Raw(msg, field.offset); } break; case WireFormatLite::TYPE_STRING: case WireFormatLite::TYPE_BYTES: Raw(msg, field.offset) ->Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), arena); break; default: // No cleanup needed. break; } } // Clears and reinitializes a oneof field as necessary, in preparation for // parsing a new value with type field_type and field number field_number. // // Note: the oneof_case argument should point directly to the _oneof_case_ // element corresponding to this particular oneof, not to the beginning of the // _oneof_case_ array. template inline void ResetOneofField(const ParseTable& table, int field_number, Arena* arena, MessageLite* msg, uint32* oneof_case, int64 offset, const void* default_ptr) { if (*oneof_case == field_number) { // The oneof is already set to the right type, so there is no need to clear // it. return; } if (*oneof_case != 0) { ClearOneofField(table.fields[*oneof_case], arena, msg); } *oneof_case = field_number; switch (field_type) { case ProcessingType_STRING: Raw(msg, offset) ->UnsafeSetDefault(static_cast(default_ptr)); break; case ProcessingType_MESSAGE: MessageLite** submessage = Raw(msg, offset); const MessageLite* prototype = table.aux[field_number].messages.default_message(); *submessage = prototype->New(arena); break; } } template static inline bool HandleString(io::CodedInputStream* input, MessageLite* msg, Arena* arena, uint32* has_bits, uint32 has_bit_index, int64 offset, const void* default_ptr, const char* field_name) { #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED const char* sdata; size_t size; #endif string* value; switch (cardinality) { case Cardinality_SINGULAR: // TODO(ckennelly): Is this optimal? value = MutableField(msg, has_bits, has_bit_index, offset) ->Mutable(static_cast(default_ptr), arena); break; case Cardinality_REPEATED: value = AddField(msg, offset); break; case Cardinality_ONEOF: value = Raw(msg, offset) ->Mutable(static_cast(default_ptr), arena); break; } GOOGLE_DCHECK(value != NULL); if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadString(input, value))) { return false; } #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED sdata = value->data(); size = value->size(); #endif #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED if (validate) { WireFormatLite::VerifyUtf8String(sdata, size, WireFormatLite::PARSE, field_name); } #endif return true; } template inline bool HandleEnum(const ParseTable& table, io::CodedInputStream* input, MessageLite* msg, uint32* presence, uint32 presence_index, int64 offset, uint32 tag, int field_number) { int value; if (GOOGLE_PREDICT_FALSE( (!WireFormatLite::ReadPrimitive( input, &value)))) { return false; } AuxillaryParseTableField::EnumValidator validator = table.aux[field_number].enums.validator; if (validator(value)) { switch (cardinality) { case Cardinality_SINGULAR: SetField(msg, presence, presence_index, offset, value); break; case Cardinality_REPEATED: AddField(msg, offset, value); break; case Cardinality_ONEOF: ClearOneofField(table.fields[presence[presence_index]], GetArena(msg, table.arena_offset), msg); SetOneofField(msg, presence, presence_index, offset, field_number, value); break; } } else { UnknownFieldHandler::Varint(msg, table, tag, value); } return true; } // RepeatedMessageTypeHandler allows us to operate on RepeatedPtrField fields // without instantiating the specific template. class RepeatedMessageTypeHandler { public: typedef MessageLite Type; static Arena* GetArena(Type* t) { return t->GetArena(); } static void* GetMaybeArenaPointer(Type* t) { return t->GetMaybeArenaPointer(); } static inline Type* NewFromPrototype(const Type* prototype, Arena* arena = NULL) { return prototype->New(arena); } static void Delete(Type* t, Arena* arena = NULL) { if (arena == NULL) { delete t; } } }; inline bool ReadGroup(int field_number, io::CodedInputStream* input, MessageLite* value) { if (GOOGLE_PREDICT_FALSE(!input->IncrementRecursionDepth())) { return false; } if (GOOGLE_PREDICT_FALSE(!value->MergePartialFromCodedStream(input))) { return false; } input->DecrementRecursionDepth(); // Make sure the last thing read was an end tag for this group. if (GOOGLE_PREDICT_FALSE(!input->LastTagWas(WireFormatLite::MakeTag( field_number, WireFormatLite::WIRETYPE_END_GROUP)))) { return false; } return true; } inline bool ReadMessage(io::CodedInputStream* input, MessageLite* value) { int length; if (GOOGLE_PREDICT_FALSE(!input->ReadVarintSizeAsInt(&length))) { return false; } std::pair p = input->IncrementRecursionDepthAndPushLimit(length); if (GOOGLE_PREDICT_FALSE(p.second < 0 || !value->MergePartialFromCodedStream(input))) { return false; } // Make sure that parsing stopped when the limit was hit, not at an endgroup // tag. return input->DecrementRecursionDepthAndPopLimit(p.first); } class MergePartialFromCodedStreamHelper { public: static MessageLite* Add(RepeatedPtrFieldBase* field, const MessageLite* prototype) { return field->Add( const_cast(prototype)); } }; template bool MergePartialFromCodedStreamImpl(MessageLite* msg, const ParseTable& table, io::CodedInputStream* input) { // We require that has_bits are present, as to avoid having to check for them // for every field. // // TODO(ckennelly): Make this a compile-time parameter with templates. GOOGLE_DCHECK_GE(table.has_bits_offset, 0); uint32* has_bits = Raw(msg, table.has_bits_offset); GOOGLE_DCHECK(has_bits != NULL); while (true) { uint32 tag = input->ReadTag(); const WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); const int field_number = WireFormatLite::GetTagFieldNumber(tag); if (field_number > table.max_field_number) { // check for possible extensions if (UnknownFieldHandler::ParseExtension(msg, table, input, tag)) { // successfully parsed continue; } if (GOOGLE_PREDICT_FALSE(!UnknownFieldHandler::Skip(msg, table, input, tag))) { return false; } continue; } // We implicitly verify that data points to a valid field as we check the // wire types. Entries in table.fields[i] that do not correspond to valid // field numbers have their normal_wiretype and packed_wiretype fields set // with the kInvalidMask value. As wire_type cannot take on that value, we // will never match. const ParseTableField* data = table.fields + field_number; // TODO(ckennelly): Avoid sign extension const int64 presence_index = data->presence_index; const int64 offset = data->offset; const unsigned char processing_type = data->processing_type; if (data->normal_wiretype == static_cast(wire_type)) { // TODO(ckennelly): Use a computed goto on GCC/LLVM or otherwise eliminate // the bounds check on processing_type. switch (processing_type) { #define HANDLE_TYPE(TYPE, CPPTYPE) \ case (WireFormatLite::TYPE_##TYPE): { \ CPPTYPE value; \ if (GOOGLE_PREDICT_FALSE( \ (!WireFormatLite::ReadPrimitive< \ CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)))) { \ return false; \ } \ SetField(msg, has_bits, presence_index, offset, value); \ break; \ } \ case (WireFormatLite::TYPE_##TYPE) | kRepeatedMask: { \ google::protobuf::RepeatedField* values = \ Raw >(msg, offset); \ if (GOOGLE_PREDICT_FALSE((!WireFormatLite::ReadRepeatedPrimitive< \ CPPTYPE, WireFormatLite::TYPE_##TYPE>( \ data->tag_size, tag, input, values)))) { \ return false; \ } \ break; \ } \ case (WireFormatLite::TYPE_##TYPE) | kOneofMask: { \ uint32* oneof_case = Raw(msg, table.oneof_case_offset); \ CPPTYPE value; \ if (GOOGLE_PREDICT_FALSE( \ (!WireFormatLite::ReadPrimitive< \ CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)))) { \ return false; \ } \ ClearOneofField(table.fields[oneof_case[presence_index]], \ GetArena(msg, table.arena_offset), msg); \ SetOneofField(msg, oneof_case, presence_index, offset, field_number, \ value); \ break; \ } HANDLE_TYPE(INT32, int32) HANDLE_TYPE(INT64, int64) HANDLE_TYPE(SINT32, int32) HANDLE_TYPE(SINT64, int64) HANDLE_TYPE(UINT32, uint32) HANDLE_TYPE(UINT64, uint64) HANDLE_TYPE(FIXED32, uint32) HANDLE_TYPE(FIXED64, uint64) HANDLE_TYPE(SFIXED32, int32) HANDLE_TYPE(SFIXED64, int64) HANDLE_TYPE(FLOAT, float) HANDLE_TYPE(DOUBLE, double) HANDLE_TYPE(BOOL, bool) #undef HANDLE_TYPE case WireFormatLite::TYPE_BYTES: #ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED case WireFormatLite::TYPE_STRING: #endif { Arena* const arena = GetArena(msg, table.arena_offset); const void* default_ptr = table.aux[field_number].strings.default_ptr; if (GOOGLE_PREDICT_FALSE(( !HandleString( input, msg, arena, has_bits, presence_index, offset, default_ptr, NULL)))) { return false; } break; } case WireFormatLite::TYPE_BYTES | kOneofMask: #ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED case WireFormatLite::TYPE_STRING | kOneofMask: #endif { Arena* const arena = GetArena(msg, table.arena_offset); uint32* oneof_case = Raw(msg, table.oneof_case_offset); const void* default_ptr = table.aux[field_number].strings.default_ptr; ResetOneofField( table, field_number, arena, msg, oneof_case + presence_index, offset, default_ptr); if (GOOGLE_PREDICT_FALSE( (!HandleString( input, msg, arena, has_bits, presence_index, offset, default_ptr, NULL)))) { return false; } break; } case (WireFormatLite::TYPE_BYTES) | kRepeatedMask: #ifndef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED case (WireFormatLite::TYPE_STRING) | kRepeatedMask: #endif { Arena* const arena = GetArena(msg, table.arena_offset); const void* default_ptr = table.aux[field_number].strings.default_ptr; if (GOOGLE_PREDICT_FALSE(( !HandleString( input, msg, arena, has_bits, presence_index, offset, default_ptr, NULL)))) { return false; } break; } #ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED case (WireFormatLite::TYPE_STRING): { Arena* const arena = GetArena(msg, table.arena_offset); const void* default_ptr = table.aux[field_number].strings.default_ptr; const char* field_name = table.aux[field_number].strings.field_name; if (GOOGLE_PREDICT_FALSE( (!HandleString( input, msg, arena, has_bits, presence_index, offset, default_ptr, field_name)))) { return false; } break; } case (WireFormatLite::TYPE_STRING) | kRepeatedMask: { Arena* const arena = GetArena(msg, table.arena_offset); const void* default_ptr = table.aux[field_number].strings.default_ptr; const char* field_name = table.aux[field_number].strings.field_name; if (GOOGLE_PREDICT_FALSE( (!HandleString( input, msg, arena, has_bits, presence_index, offset, default_ptr, field_name)))) { return false; } break; } case (WireFormatLite::TYPE_STRING) | kOneofMask: { Arena* const arena = GetArena(msg, table.arena_offset); uint32* oneof_case = Raw(msg, table.oneof_case_offset); const void* default_ptr = table.aux[field_number].strings.default_ptr; const char* field_name = table.aux[field_number].strings.field_name; ResetOneofField( table, field_number, arena, msg, oneof_case + presence_index, offset, default_ptr); if (GOOGLE_PREDICT_FALSE( (!HandleString( input, msg, arena, has_bits, presence_index, offset, default_ptr, field_name)))) { return false; } break; } #endif case WireFormatLite::TYPE_ENUM: { if (GOOGLE_PREDICT_FALSE((!HandleEnum( table, input, msg, has_bits, presence_index, offset, tag, field_number)))) { return false; } break; } case WireFormatLite::TYPE_ENUM | kRepeatedMask: { if (GOOGLE_PREDICT_FALSE((!HandleEnum( table, input, msg, has_bits, presence_index, offset, tag, field_number)))) { return false; } break; } case WireFormatLite::TYPE_ENUM | kOneofMask: { uint32* oneof_case = Raw(msg, table.oneof_case_offset); if (GOOGLE_PREDICT_FALSE((!HandleEnum( table, input, msg, oneof_case, presence_index, offset, tag, field_number)))) { return false; } break; } case WireFormatLite::TYPE_GROUP: { MessageLite** submsg_holder = MutableField(msg, has_bits, presence_index, offset); MessageLite* submsg = *submsg_holder; if (submsg == NULL) { Arena* const arena = GetArena(msg, table.arena_offset); const MessageLite* prototype = table.aux[field_number].messages.default_message(); submsg = prototype->New(arena); *submsg_holder = submsg; } if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadGroup( field_number, input, submsg))) { return false; } break; } case WireFormatLite::TYPE_GROUP | kRepeatedMask: { RepeatedPtrFieldBase* field = Raw(msg, offset); const MessageLite* prototype = table.aux[field_number].messages.default_message(); GOOGLE_DCHECK(prototype != NULL); MessageLite* submsg = MergePartialFromCodedStreamHelper::Add(field, prototype); if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadGroup( field_number, input, submsg))) { return false; } break; } case WireFormatLite::TYPE_MESSAGE: { MessageLite** submsg_holder = MutableField(msg, has_bits, presence_index, offset); MessageLite* submsg = *submsg_holder; if (submsg == NULL) { Arena* const arena = GetArena(msg, table.arena_offset); const MessageLite* prototype = table.aux[field_number].messages.default_message(); submsg = prototype->New(arena); *submsg_holder = submsg; } if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadMessage(input, submsg))) { return false; } break; } // TODO(ckennelly): Adapt ReadMessageNoVirtualNoRecursionDepth and // manage input->IncrementRecursionDepth() here. case WireFormatLite::TYPE_MESSAGE | kRepeatedMask: { RepeatedPtrFieldBase* field = Raw(msg, offset); const MessageLite* prototype = table.aux[field_number].messages.default_message(); GOOGLE_DCHECK(prototype != NULL); MessageLite* submsg = MergePartialFromCodedStreamHelper::Add(field, prototype); if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadMessage(input, submsg))) { return false; } break; } case WireFormatLite::TYPE_MESSAGE | kOneofMask: { Arena* const arena = GetArena(msg, table.arena_offset); uint32* oneof_case = Raw(msg, table.oneof_case_offset); MessageLite** submsg_holder = Raw(msg, offset); ResetOneofField( table, field_number, arena, msg, oneof_case + presence_index, offset, NULL); MessageLite* submsg = *submsg_holder; if (GOOGLE_PREDICT_FALSE(!WireFormatLite::ReadMessage(input, submsg))) { return false; } break; } case TYPE_MAP: { if (GOOGLE_PREDICT_FALSE(!(*table.aux[field_number].maps.parse_map)( input, Raw(msg, offset)))) { return false; } break; } case 0: { // Done. return true; } default: break; } } else if (data->packed_wiretype == static_cast(wire_type)) { // Non-packable fields have their packed_wiretype masked with // kNotPackedMask, which is impossible to match here. GOOGLE_DCHECK(processing_type & kRepeatedMask); GOOGLE_DCHECK_NE(processing_type, kRepeatedMask); GOOGLE_DCHECK_EQ(0, processing_type & kOneofMask); // TODO(ckennelly): Use a computed goto on GCC/LLVM. // // Mask out kRepeatedMask bit, allowing the jump table to be smaller. switch (static_cast( processing_type ^ kRepeatedMask)) { #define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \ case WireFormatLite::TYPE_##TYPE: { \ google::protobuf::RepeatedField* values = \ Raw >(msg, offset); \ if (GOOGLE_PREDICT_FALSE( \ (!WireFormatLite::ReadPackedPrimitive< \ CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, values)))) { \ return false; \ } \ break; \ } HANDLE_PACKED_TYPE(INT32, int32, Int32) HANDLE_PACKED_TYPE(INT64, int64, Int64) HANDLE_PACKED_TYPE(SINT32, int32, Int32) HANDLE_PACKED_TYPE(SINT64, int64, Int64) HANDLE_PACKED_TYPE(UINT32, uint32, UInt32) HANDLE_PACKED_TYPE(UINT64, uint64, UInt64) HANDLE_PACKED_TYPE(FIXED32, uint32, UInt32) HANDLE_PACKED_TYPE(FIXED64, uint64, UInt64) HANDLE_PACKED_TYPE(SFIXED32, int32, Int32) HANDLE_PACKED_TYPE(SFIXED64, int64, Int64) HANDLE_PACKED_TYPE(FLOAT, float, Float) HANDLE_PACKED_TYPE(DOUBLE, double, Double) HANDLE_PACKED_TYPE(BOOL, bool, Bool) #undef HANDLE_PACKED_TYPE case WireFormatLite::TYPE_ENUM: { // To avoid unnecessarily calling MutableUnknownFields (which mutates // InternalMetadataWithArena) when all inputs in the repeated series // are valid, we implement our own parser rather than call // WireFormat::ReadPackedEnumPreserveUnknowns. uint32 length; if (GOOGLE_PREDICT_FALSE(!input->ReadVarint32(&length))) { return false; } AuxillaryParseTableField::EnumValidator validator = table.aux[field_number].enums.validator; google::protobuf::RepeatedField* values = Raw >(msg, offset); io::CodedInputStream::Limit limit = input->PushLimit(length); while (input->BytesUntilLimit() > 0) { int value; if (GOOGLE_PREDICT_FALSE( (!google::protobuf::internal::WireFormatLite::ReadPrimitive< int, WireFormatLite::TYPE_ENUM>(input, &value)))) { return false; } if (validator(value)) { values->Add(value); } else { // TODO(ckennelly): Consider caching here. UnknownFieldHandler::Varint(msg, table, tag, value); } } input->PopLimit(limit); break; } case WireFormatLite::TYPE_STRING: case WireFormatLite::TYPE_GROUP: case WireFormatLite::TYPE_MESSAGE: case WireFormatLite::TYPE_BYTES: GOOGLE_DCHECK(false); return false; default: break; } } else { if (wire_type == WireFormatLite::WIRETYPE_END_GROUP) { // Must be the end of the message. return true; } // check for possible extensions if (UnknownFieldHandler::ParseExtension(msg, table, input, tag)) { // successfully parsed continue; } // process unknown field. if (GOOGLE_PREDICT_FALSE(!UnknownFieldHandler::Skip(msg, table, input, tag))) { return false; } } } } } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_TABLE_DRIVEN_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/generated_message_util.cc000066400000000000000000000647531334102242000323160ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { double Infinity() { return std::numeric_limits::infinity(); } double NaN() { return std::numeric_limits::quiet_NaN(); } ExplicitlyConstructed< ::std::string> fixed_address_empty_string; GOOGLE_PROTOBUF_DECLARE_ONCE(empty_string_once_init_); void DeleteEmptyString() { fixed_address_empty_string.Destruct(); } void InitEmptyString() { fixed_address_empty_string.DefaultConstruct(); OnShutdown(&DeleteEmptyString); } size_t StringSpaceUsedExcludingSelfLong(const string& str) { const void* start = &str; const void* end = &str + 1; if (start <= str.data() && str.data() < end) { // The string's data is stored inside the string object itself. return 0; } else { return str.capacity(); } } void InitProtobufDefaults() { GetEmptyString(); } template const T& Get(const void* ptr) { return *static_cast(ptr); } // PrimitiveTypeHelper is a wrapper around the interface of WireFormatLite. // WireFormatLite has a very inconvenient interface with respect to template // meta-programming. This class wraps the different named functions into // a single Serialize / SerializeToArray interface. template struct PrimitiveTypeHelper; template <> struct PrimitiveTypeHelper { typedef bool Type; static void Serialize(const void* ptr, ::google::protobuf::io::CodedOutputStream* output) { WireFormatLite::WriteBoolNoTag(Get(ptr), output); } static uint8* SerializeToArray(const void* ptr, uint8* buffer) { return WireFormatLite::WriteBoolNoTagToArray(Get(ptr), buffer); } }; template <> struct PrimitiveTypeHelper { typedef int32 Type; static void Serialize(const void* ptr, ::google::protobuf::io::CodedOutputStream* output) { WireFormatLite::WriteInt32NoTag(Get(ptr), output); } static uint8* SerializeToArray(const void* ptr, uint8* buffer) { return WireFormatLite::WriteInt32NoTagToArray(Get(ptr), buffer); } }; template <> struct PrimitiveTypeHelper { typedef int32 Type; static void Serialize(const void* ptr, ::google::protobuf::io::CodedOutputStream* output) { WireFormatLite::WriteSInt32NoTag(Get(ptr), output); } static uint8* SerializeToArray(const void* ptr, uint8* buffer) { return WireFormatLite::WriteSInt32NoTagToArray(Get(ptr), buffer); } }; template <> struct PrimitiveTypeHelper { typedef uint32 Type; static void Serialize(const void* ptr, ::google::protobuf::io::CodedOutputStream* output) { WireFormatLite::WriteUInt32NoTag(Get(ptr), output); } static uint8* SerializeToArray(const void* ptr, uint8* buffer) { return WireFormatLite::WriteUInt32NoTagToArray(Get(ptr), buffer); } }; template <> struct PrimitiveTypeHelper { typedef int64 Type; static void Serialize(const void* ptr, ::google::protobuf::io::CodedOutputStream* output) { WireFormatLite::WriteInt64NoTag(Get(ptr), output); } static uint8* SerializeToArray(const void* ptr, uint8* buffer) { return WireFormatLite::WriteInt64NoTagToArray(Get(ptr), buffer); } }; template <> struct PrimitiveTypeHelper { typedef int64 Type; static void Serialize(const void* ptr, ::google::protobuf::io::CodedOutputStream* output) { WireFormatLite::WriteSInt64NoTag(Get(ptr), output); } static uint8* SerializeToArray(const void* ptr, uint8* buffer) { return WireFormatLite::WriteSInt64NoTagToArray(Get(ptr), buffer); } }; template <> struct PrimitiveTypeHelper { typedef uint64 Type; static void Serialize(const void* ptr, ::google::protobuf::io::CodedOutputStream* output) { WireFormatLite::WriteUInt64NoTag(Get(ptr), output); } static uint8* SerializeToArray(const void* ptr, uint8* buffer) { return WireFormatLite::WriteUInt64NoTagToArray(Get(ptr), buffer); } }; template <> struct PrimitiveTypeHelper { typedef uint32 Type; static void Serialize(const void* ptr, ::google::protobuf::io::CodedOutputStream* output) { WireFormatLite::WriteFixed32NoTag(Get(ptr), output); } static uint8* SerializeToArray(const void* ptr, uint8* buffer) { return WireFormatLite::WriteFixed32NoTagToArray(Get(ptr), buffer); } }; template <> struct PrimitiveTypeHelper { typedef uint64 Type; static void Serialize(const void* ptr, ::google::protobuf::io::CodedOutputStream* output) { WireFormatLite::WriteFixed64NoTag(Get(ptr), output); } static uint8* SerializeToArray(const void* ptr, uint8* buffer) { return WireFormatLite::WriteFixed64NoTagToArray(Get(ptr), buffer); } }; template <> struct PrimitiveTypeHelper : PrimitiveTypeHelper {}; template <> struct PrimitiveTypeHelper : PrimitiveTypeHelper { typedef int32 Type; }; template <> struct PrimitiveTypeHelper : PrimitiveTypeHelper { typedef int64 Type; }; template <> struct PrimitiveTypeHelper : PrimitiveTypeHelper { typedef float Type; }; template <> struct PrimitiveTypeHelper : PrimitiveTypeHelper { typedef double Type; }; template <> struct PrimitiveTypeHelper { typedef string Type; static void Serialize(const void* ptr, ::google::protobuf::io::CodedOutputStream* output) { const Type& value = *static_cast(ptr); output->WriteVarint32(value.size()); output->WriteRawMaybeAliased(value.data(), value.size()); } static uint8* SerializeToArray(const void* ptr, uint8* buffer) { const Type& value = *static_cast(ptr); return io::CodedOutputStream::WriteStringWithSizeToArray(value, buffer); } }; template <> struct PrimitiveTypeHelper : PrimitiveTypeHelper {}; // We want to serialize to both CodedOutputStream and directly into byte arrays // without duplicating the code. In fact we might want extra output channels in // the future. template struct OutputHelper; template void SerializeTo(const void* ptr, O* output) { OutputHelper::Serialize(ptr, output); } template void WriteTagTo(uint32 tag, O* output) { SerializeTo(&tag, output); } template void WriteLengthTo(uint32 length, O* output) { SerializeTo(&length, output); } // Specialization for coded output stream template struct OutputHelper< ::google::protobuf::io::CodedOutputStream, type> { static void Serialize(const void* ptr, ::google::protobuf::io::CodedOutputStream* output) { PrimitiveTypeHelper::Serialize(ptr, output); } }; // Specialization for writing into a plain array struct ArrayOutput { uint8* ptr; bool is_deterministic; }; template struct OutputHelper { static void Serialize(const void* ptr, ArrayOutput* output) { output->ptr = PrimitiveTypeHelper::SerializeToArray(ptr, output->ptr); } }; void SerializeMessageNoTable(const MessageLite* msg, ::google::protobuf::io::CodedOutputStream* output) { msg->SerializeWithCachedSizes(output); } void SerializeMessageNoTable(const MessageLite* msg, ArrayOutput* output) { output->ptr = msg->InternalSerializeWithCachedSizesToArray( output->is_deterministic, output->ptr); } // Helper to branch to fast path if possible void SerializeMessageDispatch(const ::google::protobuf::MessageLite& msg, const FieldMetadata* field_table, int num_fields, int32 cached_size, ::google::protobuf::io::CodedOutputStream* output) { const uint8* base = reinterpret_cast(&msg); // Try the fast path uint8* ptr = output->GetDirectBufferForNBytesAndAdvance(cached_size); if (ptr) { // We use virtual dispatch to enable dedicated generated code for the // fast path. msg.InternalSerializeWithCachedSizesToArray( output->IsSerializationDeterministic(), ptr); return; } SerializeInternal(base, field_table, num_fields, output); } // Helper to branch to fast path if possible void SerializeMessageDispatch(const ::google::protobuf::MessageLite& msg, const FieldMetadata* field_table, int num_fields, int32 cached_size, ArrayOutput* output) { const uint8* base = reinterpret_cast(&msg); output->ptr = SerializeInternalToArray(base, field_table, num_fields, output->is_deterministic, output->ptr); } // Serializing messages is special as it's not a primitive type and needs an // explicit overload for each output type. template void SerializeMessageTo(const MessageLite* msg, const void* table_ptr, O* output) { const SerializationTable* table = static_cast(table_ptr); if (!table) { // Proto1 WriteLengthTo(msg->GetCachedSize(), output); SerializeMessageNoTable(msg, output); return; } const FieldMetadata* field_table = table->field_table; const uint8* base = reinterpret_cast(msg); int cached_size = *reinterpret_cast(base + field_table->offset); WriteLengthTo(cached_size, output); int num_fields = table->num_fields - 1; SerializeMessageDispatch(*msg, field_table + 1, num_fields, cached_size, output); } // Almost the same as above only it doesn't output the length field. template void SerializeGroupTo(const MessageLite* msg, const void* table_ptr, O* output) { const SerializationTable* table = static_cast(table_ptr); if (!table) { // Proto1 SerializeMessageNoTable(msg, output); return; } const FieldMetadata* field_table = table->field_table; const uint8* base = reinterpret_cast(msg); int cached_size = *reinterpret_cast(base + field_table->offset); int num_fields = table->num_fields - 1; SerializeMessageDispatch(*msg, field_table + 1, num_fields, cached_size, output); } template struct SingularFieldHelper { template static void Serialize(const void* field, const FieldMetadata& md, O* output) { WriteTagTo(md.tag, output); SerializeTo(field, output); } }; template <> struct SingularFieldHelper { template static void Serialize(const void* field, const FieldMetadata& md, O* output) { WriteTagTo(md.tag, output); SerializeTo(&Get(field).Get(), output); } }; template <> struct SingularFieldHelper : SingularFieldHelper {}; template <> struct SingularFieldHelper { template static void Serialize(const void* field, const FieldMetadata& md, O* output) { WriteTagTo(md.tag, output); SerializeGroupTo(Get(field), static_cast(md.ptr), output); WriteTagTo(md.tag + 1, output); } }; template <> struct SingularFieldHelper { template static void Serialize(const void* field, const FieldMetadata& md, O* output) { WriteTagTo(md.tag, output); SerializeMessageTo(Get(field), static_cast(md.ptr), output); } }; template struct RepeatedFieldHelper { template static void Serialize(const void* field, const FieldMetadata& md, O* output) { typedef typename PrimitiveTypeHelper::Type T; const RepeatedField& array = Get >(field); for (int i = 0; i < array.size(); i++) { WriteTagTo(md.tag, output); SerializeTo(&array[i], output); } } }; // We need to use a helper class to get access to the private members class AccessorHelper { public: static int Size(const RepeatedPtrFieldBase& x) { return x.size(); } static void const* Get(const RepeatedPtrFieldBase& x, int idx) { return x.raw_data()[idx]; } }; template <> struct RepeatedFieldHelper { template static void Serialize(const void* field, const FieldMetadata& md, O* output) { const internal::RepeatedPtrFieldBase& array = Get(field); for (int i = 0; i < AccessorHelper::Size(array); i++) { WriteTagTo(md.tag, output); SerializeTo(AccessorHelper::Get(array, i), output); } } }; template <> struct RepeatedFieldHelper : RepeatedFieldHelper {}; template <> struct RepeatedFieldHelper { template static void Serialize(const void* field, const FieldMetadata& md, O* output) { const internal::RepeatedPtrFieldBase& array = Get(field); for (int i = 0; i < AccessorHelper::Size(array); i++) { WriteTagTo(md.tag, output); SerializeGroupTo( static_cast(AccessorHelper::Get(array, i)), static_cast(md.ptr), output); WriteTagTo(md.tag + 1, output); } } }; template <> struct RepeatedFieldHelper { template static void Serialize(const void* field, const FieldMetadata& md, O* output) { const internal::RepeatedPtrFieldBase& array = Get(field); for (int i = 0; i < AccessorHelper::Size(array); i++) { WriteTagTo(md.tag, output); SerializeMessageTo( static_cast(AccessorHelper::Get(array, i)), md.ptr, output); } } }; template struct PackedFieldHelper { template static void Serialize(const void* field, const FieldMetadata& md, O* output) { typedef typename PrimitiveTypeHelper::Type T; const RepeatedField& array = Get >(field); if (array.empty()) return; WriteTagTo(md.tag, output); int cached_size = Get(static_cast(field) + sizeof(RepeatedField)); WriteLengthTo(cached_size, output); for (int i = 0; i < array.size(); i++) { SerializeTo(&array[i], output); } } }; template <> struct PackedFieldHelper { template static void Serialize(const void* field, const FieldMetadata& md, O* output) { GOOGLE_LOG(FATAL) << "Not implemented field number " << md.tag << " with type " << md.type; } }; template <> struct PackedFieldHelper : PackedFieldHelper {}; template <> struct PackedFieldHelper : PackedFieldHelper {}; template <> struct PackedFieldHelper : PackedFieldHelper {}; template struct OneOfFieldHelper { template static void Serialize(const void* field, const FieldMetadata& md, O* output) { SingularFieldHelper::Serialize(field, md, output); } }; void SerializeNotImplemented(int field) { GOOGLE_LOG(FATAL) << "Not implemented field number " << field; } // When switching to c++11 we should make these constexpr functions #define SERIALIZE_TABLE_OP(type, type_class) \ ((type - 1) + static_cast(type_class) * FieldMetadata::kNumTypes) int FieldMetadata::CalculateType(int type, FieldMetadata::FieldTypeClass type_class) { return SERIALIZE_TABLE_OP(type, type_class); } template bool IsNull(const void* ptr) { return *static_cast::Type*>(ptr) == 0; } template <> bool IsNull(const void* ptr) { return static_cast(ptr)->Get().size() == 0; } template <> bool IsNull(const void* ptr) { return static_cast(ptr)->Get().size() == 0; } template <> bool IsNull(const void* ptr) { return Get(ptr) == NULL; } template <> bool IsNull(const void* ptr) { return Get(ptr) == NULL; } #define SERIALIZERS_FOR_TYPE(type) \ case SERIALIZE_TABLE_OP(type, FieldMetadata::kPresence): \ if (!IsPresent(base, field_metadata.has_offset)) continue; \ SingularFieldHelper::Serialize(ptr, field_metadata, output); \ break; \ case SERIALIZE_TABLE_OP(type, FieldMetadata::kNoPresence): \ if (IsNull(ptr)) continue; \ SingularFieldHelper::Serialize(ptr, field_metadata, output); \ break; \ case SERIALIZE_TABLE_OP(type, FieldMetadata::kRepeated): \ RepeatedFieldHelper::Serialize(ptr, field_metadata, output); \ break; \ case SERIALIZE_TABLE_OP(type, FieldMetadata::kPacked): \ PackedFieldHelper::Serialize(ptr, field_metadata, output); \ break; \ case SERIALIZE_TABLE_OP(type, FieldMetadata::kOneOf): \ if (!IsOneofPresent(base, field_metadata.has_offset, field_metadata.tag)) \ continue; \ OneOfFieldHelper::Serialize(ptr, field_metadata, output); \ break void SerializeInternal(const uint8* base, const FieldMetadata* field_metadata_table, int32 num_fields, ::google::protobuf::io::CodedOutputStream* output) { for (int i = 0; i < num_fields; i++) { const FieldMetadata& field_metadata = field_metadata_table[i]; const uint8* ptr = base + field_metadata.offset; switch (field_metadata.type) { SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_DOUBLE); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FLOAT); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_INT64); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_UINT64); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_INT32); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FIXED64); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FIXED32); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_BOOL); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_STRING); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_GROUP); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_MESSAGE); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_BYTES); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_UINT32); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_ENUM); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SFIXED32); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SFIXED64); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SINT32); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SINT64); // Special cases case FieldMetadata::kSpecial: reinterpret_cast( const_cast(field_metadata.ptr))( base, field_metadata.offset, field_metadata.tag, field_metadata.has_offset, output); break; default: // __builtin_unreachable() SerializeNotImplemented(field_metadata.type); } } } uint8* SerializeInternalToArray(const uint8* base, const FieldMetadata* field_metadata_table, int32 num_fields, bool is_deterministic, uint8* buffer) { ArrayOutput array_output = {buffer, is_deterministic}; ArrayOutput* output = &array_output; for (int i = 0; i < num_fields; i++) { const FieldMetadata& field_metadata = field_metadata_table[i]; const uint8* ptr = base + field_metadata.offset; switch (field_metadata.type) { SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_DOUBLE); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FLOAT); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_INT64); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_UINT64); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_INT32); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FIXED64); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_FIXED32); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_BOOL); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_STRING); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_GROUP); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_MESSAGE); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_BYTES); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_UINT32); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_ENUM); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SFIXED32); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SFIXED64); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SINT32); SERIALIZERS_FOR_TYPE(WireFormatLite::TYPE_SINT64); // Special cases case FieldMetadata::kSpecial: { io::ArrayOutputStream array_stream(array_output.ptr, INT_MAX); io::CodedOutputStream output(&array_stream); output.SetSerializationDeterministic(is_deterministic); reinterpret_cast( const_cast(field_metadata.ptr))( base, field_metadata.offset, field_metadata.tag, field_metadata.has_offset, &output); array_output.ptr += output.ByteCount(); } break; default: // __builtin_unreachable() SerializeNotImplemented(field_metadata.type); } } return array_output.ptr; } #undef SERIALIZERS_FOR_TYPE void ExtensionSerializer(const uint8* ptr, uint32 offset, uint32 tag, uint32 has_offset, ::google::protobuf::io::CodedOutputStream* output) { reinterpret_cast(ptr + offset) ->SerializeWithCachedSizes(tag, has_offset, output); } void UnknownFieldSerializerLite(const uint8* ptr, uint32 offset, uint32 tag, uint32 has_offset, ::google::protobuf::io::CodedOutputStream* output) { output->WriteString( reinterpret_cast(ptr + offset) ->unknown_fields()); } MessageLite* DuplicateIfNonNullInternal(MessageLite* message, Arena* arena) { if (message) { MessageLite* ret = message->New(arena); ret->CheckTypeAndMergeFrom(*message); return ret; } else { return NULL; } } // Returns a message owned by this Arena. This may require Own()ing or // duplicating the message. MessageLite* GetOwnedMessageInternal(Arena* message_arena, MessageLite* submessage, Arena* submessage_arena) { GOOGLE_DCHECK(submessage->GetArena() == submessage_arena); GOOGLE_DCHECK(message_arena != submessage_arena); if (message_arena != NULL && submessage_arena == NULL) { message_arena->Own(submessage); return submessage; } else { MessageLite* ret = submessage->New(message_arena); ret->CheckTypeAndMergeFrom(*submessage); return ret; } } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/generated_message_util.h000066400000000000000000000311761334102242000321510ustar00rootroot00000000000000// 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. // // This file contains miscellaneous helper code used by generated code -- // including lite types -- but which should not be used directly by users. #ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { class Arena; namespace io { class CodedInputStream; } namespace internal { // Annotation for the compiler to emit a deprecation message if a field marked // with option 'deprecated=true' is used in the code, or for other things in // generated code which are deprecated. // // For internal use in the pb.cc files, deprecation warnings are suppressed // there. #undef DEPRECATED_PROTOBUF_FIELD #define PROTOBUF_DEPRECATED #define GOOGLE_PROTOBUF_DEPRECATED_ATTR // Returns the offset of the given field within the given aggregate type. // This is equivalent to the ANSI C offsetof() macro. However, according // to the C++ standard, offsetof() only works on POD types, and GCC // enforces this requirement with a warning. In practice, this rule is // unnecessarily strict; there is probably no compiler or platform on // which the offsets of the direct fields of a class are non-constant. // Fields inherited from superclasses *can* have non-constant offsets, // but that's not what this macro will be used for. #if defined(__clang__) // For Clang we use __builtin_offsetof() and suppress the warning, // to avoid Control Flow Integrity and UBSan vptr sanitizers from // crashing while trying to validate the invalid reinterpet_casts. #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD) \ _Pragma("clang diagnostic push") \ _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \ __builtin_offsetof(TYPE, FIELD) \ _Pragma("clang diagnostic pop") #else // Note that we calculate relative to the pointer value 16 here since if we // just use zero, GCC complains about dereferencing a NULL pointer. We // choose 16 rather than some other number just in case the compiler would // be confused by an unaligned pointer. #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD) \ static_cast< ::google::protobuf::uint32>( \ reinterpret_cast( \ &reinterpret_cast(16)->FIELD) - \ reinterpret_cast(16)) #endif // Constants for special floating point values. LIBPROTOBUF_EXPORT double Infinity(); LIBPROTOBUF_EXPORT double NaN(); // True if IsInitialized() is true for all elements of t. Type is expected // to be a RepeatedPtrField. It's useful to have this // helper here to keep the protobuf compiler from ever having to emit loops in // IsInitialized() methods. We want the C++ compiler to inline this or not // as it sees fit. template bool AllAreInitialized(const Type& t) { for (int i = t.size(); --i >= 0; ) { if (!t.Get(i).IsInitialized()) return false; } return true; } LIBPROTOBUF_EXPORT void InitProtobufDefaults(); struct LIBPROTOBUF_EXPORT FieldMetadata { uint32 offset; // offset of this field in the struct uint32 tag; // field * 8 + wire_type // byte offset * 8 + bit_offset; // if the high bit is set then this is the byte offset of the oneof_case // for this field. uint32 has_offset; uint32 type; // the type of this field. const void* ptr; // auxiliary data // From the serializer point of view each fundamental type can occur in // 4 different ways. For simplicity we treat all combinations as a cartesion // product although not all combinations are allowed. enum FieldTypeClass { kPresence, kNoPresence, kRepeated, kPacked, kOneOf, kNumTypeClasses // must be last enum }; // C++ protobuf has 20 fundamental types, were we added Cord and StringPiece // and also distinquish the same types if they have different wire format. enum { kCordType = 19, kStringPieceType = 20, kNumTypes = 20, kSpecial = kNumTypes * kNumTypeClasses, }; static int CalculateType(int fundamental_type, FieldTypeClass type_class); }; inline bool IsPresent(const void* base, uint32 hasbit) { const uint32* has_bits_array = static_cast(base); return has_bits_array[hasbit / 32] & (1u << (hasbit & 31)); } inline bool IsOneofPresent(const void* base, uint32 offset, uint32 tag) { const uint32* oneof = reinterpret_cast(static_cast(base) + offset); return *oneof == tag >> 3; } typedef void (*SpecialSerializer)(const uint8* base, uint32 offset, uint32 tag, uint32 has_offset, ::google::protobuf::io::CodedOutputStream* output); LIBPROTOBUF_EXPORT void ExtensionSerializer(const uint8* base, uint32 offset, uint32 tag, uint32 has_offset, ::google::protobuf::io::CodedOutputStream* output); LIBPROTOBUF_EXPORT void UnknownFieldSerializerLite(const uint8* base, uint32 offset, uint32 tag, uint32 has_offset, ::google::protobuf::io::CodedOutputStream* output); struct SerializationTable { int num_fields; const FieldMetadata* field_table; }; LIBPROTOBUF_EXPORT void SerializeInternal(const uint8* base, const FieldMetadata* table, int num_fields, ::google::protobuf::io::CodedOutputStream* output); inline void TableSerialize(const ::google::protobuf::MessageLite& msg, const SerializationTable* table, ::google::protobuf::io::CodedOutputStream* output) { const FieldMetadata* field_table = table->field_table; int num_fields = table->num_fields - 1; const uint8* base = reinterpret_cast(&msg); // TODO(gerbens) This skips the first test if we could use the fast // array serialization path, we should make this // int cached_size = // *reinterpret_cast(base + field_table->offset); // SerializeWithCachedSize(msg, field_table + 1, num_fields, cached_size, ...) // But we keep conformance with the old way for now. SerializeInternal(base, field_table + 1, num_fields, output); } uint8* SerializeInternalToArray(const uint8* base, const FieldMetadata* table, int num_fields, bool is_deterministic, uint8* buffer); inline uint8* TableSerializeToArray(const ::google::protobuf::MessageLite& msg, const SerializationTable* table, bool is_deterministic, uint8* buffer) { const uint8* base = reinterpret_cast(&msg); const FieldMetadata* field_table = table->field_table + 1; int num_fields = table->num_fields - 1; return SerializeInternalToArray(base, field_table, num_fields, is_deterministic, buffer); } template struct CompareHelper { bool operator()(const T& a, const T& b) { return a < b; } }; template <> struct CompareHelper { bool operator()(const ArenaStringPtr& a, const ArenaStringPtr& b) { return a.Get() < b.Get(); } }; struct CompareMapKey { template bool operator()(const MapEntryHelper& a, const MapEntryHelper& b) { return Compare(a.key_, b.key_); } template bool Compare(const T& a, const T& b) { return CompareHelper()(a, b); } }; template void MapFieldSerializer(const uint8* base, uint32 offset, uint32 tag, uint32 has_offset, ::google::protobuf::io::CodedOutputStream* output) { typedef MapEntryHelper Entry; typedef typename MapFieldType::MapType::const_iterator Iter; const MapFieldType& map_field = *reinterpret_cast(base + offset); const SerializationTable* t = table + has_offset; // has_offset is overloaded for maps to mean table offset if (!output->IsSerializationDeterministic()) { for (Iter it = map_field.GetMap().begin(); it != map_field.GetMap().end(); ++it) { Entry map_entry(*it); output->WriteVarint32(tag); output->WriteVarint32(map_entry._cached_size_); SerializeInternal(reinterpret_cast(&map_entry), t->field_table, t->num_fields, output); } } else { std::vector v; for (Iter it = map_field.GetMap().begin(); it != map_field.GetMap().end(); ++it) { v.push_back(Entry(*it)); } std::sort(v.begin(), v.end(), CompareMapKey()); for (int i = 0; i < v.size(); i++) { output->WriteVarint32(tag); output->WriteVarint32(v[i]._cached_size_); SerializeInternal(reinterpret_cast(&v[i]), t->field_table, t->num_fields, output); } } } LIBPROTOBUF_EXPORT MessageLite* DuplicateIfNonNullInternal(MessageLite* message, Arena* arena); LIBPROTOBUF_EXPORT MessageLite* GetOwnedMessageInternal(Arena* message_arena, MessageLite* submessage, Arena* submessage_arena); template T* DuplicateIfNonNull(T* message, Arena* arena) { // The casts must be reinterpret_cast<> because T might be a forward-declared // type that the compiler doesn't know is related to MessageLite. return reinterpret_cast(DuplicateIfNonNullInternal( reinterpret_cast(message), arena)); } template T* GetOwnedMessage(Arena* message_arena, T* submessage, Arena* submessage_arena) { // The casts must be reinterpret_cast<> because T might be a forward-declared // type that the compiler doesn't know is related to MessageLite. return reinterpret_cast(GetOwnedMessageInternal( message_arena, reinterpret_cast(submessage), submessage_arena)); } // Returns a message owned by this Arena. This may require Own()ing or // duplicating the message. template T* GetOwnedMessage(T* message, Arena* arena) { GOOGLE_DCHECK(message); Arena* message_arena = google::protobuf::Arena::GetArena(message); if (message_arena == arena) { return message; } else if (arena != NULL && message_arena == NULL) { arena->Own(message); return message; } else { return DuplicateIfNonNull(message, arena); } } } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/has_bits.h000066400000000000000000000065111334102242000272410ustar00rootroot00000000000000// 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_HAS_BITS_H__ #define GOOGLE_PROTOBUF_HAS_BITS_H__ #include #include namespace google { namespace protobuf { namespace internal { template class HasBits { public: HasBits() GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE { Clear(); } void Clear() GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE { memset(has_bits_, 0, sizeof(has_bits_)); } ::google::protobuf::uint32& operator[](int index) GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE { return has_bits_[index]; } const ::google::protobuf::uint32& operator[](int index) const GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE { return has_bits_[index]; } bool operator==(const HasBits& rhs) const { return memcmp(has_bits_, rhs.has_bits_, sizeof(has_bits_)) == 0; } bool operator!=(const HasBits& rhs) const { return !(*this == rhs); } bool empty() const; private: ::google::protobuf::uint32 has_bits_[doublewords]; }; template <> inline bool HasBits<1>::empty() const { return !has_bits_[0]; } template <> inline bool HasBits<2>::empty() const { return !(has_bits_[0] | has_bits_[1]); } template <> inline bool HasBits<3>::empty() const { return !(has_bits_[0] | has_bits_[1] | has_bits_[2]); } template <> inline bool HasBits<4>::empty() const { return !(has_bits_[0] | has_bits_[1] | has_bits_[2] | has_bits_[3]); } template inline bool HasBits::empty() const { for (size_t i = 0; i < doublewords; ++i) { if (has_bits_[i]) return false; } return true; } } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_HAS_BITS_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/implicit_weak_message.cc000066400000000000000000000044301334102242000321260ustar00rootroot00000000000000// 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 #include #include namespace google { namespace protobuf { namespace internal { ::google::protobuf::internal::ExplicitlyConstructed implicit_weak_message_default_instance; bool ImplicitWeakMessage::MergePartialFromCodedStream(io::CodedInputStream* input) { io::StringOutputStream string_stream(&data_); io::CodedOutputStream coded_stream(&string_stream, false); return WireFormatLite::SkipMessage(input, &coded_stream); } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/implicit_weak_message.h000066400000000000000000000063431334102242000317750ustar00rootroot00000000000000// 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_IMPLICIT_WEAK_MESSAGE_H__ #define GOOGLE_PROTOBUF_IMPLICIT_WEAK_MESSAGE_H__ #include #include #include namespace google { namespace protobuf { namespace internal { class LIBPROTOBUF_EXPORT ImplicitWeakMessage : public MessageLite { public: ImplicitWeakMessage() : arena_(NULL) {} explicit ImplicitWeakMessage(Arena* arena) : arena_(arena) {} string GetTypeName() const { return ""; } MessageLite* New() const { return new ImplicitWeakMessage; } MessageLite* New(Arena* arena) const { return Arena::CreateMessage(arena); } Arena* GetArena() const { return arena_; } void Clear() { data_.clear(); } bool IsInitialized() const { return true; } void CheckTypeAndMergeFrom(const MessageLite& other) { data_.append(static_cast(other).data_); } bool MergePartialFromCodedStream(io::CodedInputStream* input); size_t ByteSizeLong() const { return data_.size(); } void SerializeWithCachedSizes(io::CodedOutputStream* output) const { output->WriteString(data_); } int GetCachedSize() const { return data_.size(); } typedef void InternalArenaConstructable_; private: Arena* const arena_; string data_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImplicitWeakMessage); }; extern ::google::protobuf::internal::ExplicitlyConstructed implicit_weak_message_default_instance; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_IMPLICIT_WEAK_MESSAGE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/000077500000000000000000000000001334102242000257005ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/coded_stream.cc000066400000000000000000000621511334102242000306450ustar00rootroot00000000000000// 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. // // This implementation is heavily optimized to make reads and writes // of small values (especially varints) as fast as possible. In // particular, we optimize for the common case that a read or a write // will not cross the end of the buffer, since we can avoid a lot // of branching in this case. #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { namespace { static const int kMaxVarintBytes = 10; static const int kMaxVarint32Bytes = 5; inline bool NextNonEmpty(ZeroCopyInputStream* input, const void** data, int* size) { bool success; do { success = input->Next(data, size); } while (success && *size == 0); return success; } } // namespace // CodedInputStream ================================================== CodedInputStream::~CodedInputStream() { if (input_ != NULL) { BackUpInputToCurrentPosition(); } } // Static. int CodedInputStream::default_recursion_limit_ = 100; void CodedOutputStream::EnableAliasing(bool enabled) { aliasing_enabled_ = enabled && output_->AllowsAliasing(); } void CodedInputStream::BackUpInputToCurrentPosition() { int backup_bytes = BufferSize() + buffer_size_after_limit_ + overflow_bytes_; if (backup_bytes > 0) { input_->BackUp(backup_bytes); // total_bytes_read_ doesn't include overflow_bytes_. total_bytes_read_ -= BufferSize() + buffer_size_after_limit_; buffer_end_ = buffer_; buffer_size_after_limit_ = 0; overflow_bytes_ = 0; } } inline void CodedInputStream::RecomputeBufferLimits() { buffer_end_ += buffer_size_after_limit_; int closest_limit = std::min(current_limit_, total_bytes_limit_); if (closest_limit < total_bytes_read_) { // The limit position is in the current buffer. We must adjust // the buffer size accordingly. buffer_size_after_limit_ = total_bytes_read_ - closest_limit; buffer_end_ -= buffer_size_after_limit_; } else { buffer_size_after_limit_ = 0; } } CodedInputStream::Limit CodedInputStream::PushLimit(int byte_limit) { // Current position relative to the beginning of the stream. int current_position = CurrentPosition(); Limit old_limit = current_limit_; // security: byte_limit is possibly evil, so check for negative values // and overflow. Also check that the new requested limit is before the // previous limit; otherwise we continue to enforce the previous limit. if GOOGLE_PREDICT_TRUE(byte_limit >= 0 && byte_limit <= INT_MAX - current_position && byte_limit < current_limit_ - current_position) { current_limit_ = current_position + byte_limit; RecomputeBufferLimits(); } return old_limit; } void CodedInputStream::PopLimit(Limit limit) { // The limit passed in is actually the *old* limit, which we returned from // PushLimit(). current_limit_ = limit; RecomputeBufferLimits(); // We may no longer be at a legitimate message end. ReadTag() needs to be // called again to find out. legitimate_message_end_ = false; } std::pair CodedInputStream::IncrementRecursionDepthAndPushLimit(int byte_limit) { return std::make_pair(PushLimit(byte_limit), --recursion_budget_); } CodedInputStream::Limit CodedInputStream::ReadLengthAndPushLimit() { uint32 length; return PushLimit(ReadVarint32(&length) ? length : 0); } bool CodedInputStream::DecrementRecursionDepthAndPopLimit(Limit limit) { bool result = ConsumedEntireMessage(); PopLimit(limit); GOOGLE_DCHECK_LT(recursion_budget_, recursion_limit_); ++recursion_budget_; return result; } bool CodedInputStream::CheckEntireMessageConsumedAndPopLimit(Limit limit) { bool result = ConsumedEntireMessage(); PopLimit(limit); return result; } int CodedInputStream::BytesUntilLimit() const { if (current_limit_ == INT_MAX) return -1; int current_position = CurrentPosition(); return current_limit_ - current_position; } void CodedInputStream::SetTotalBytesLimit( int total_bytes_limit, int warning_threshold) { (void) warning_threshold; // Make sure the limit isn't already past, since this could confuse other // code. int current_position = CurrentPosition(); total_bytes_limit_ = std::max(current_position, total_bytes_limit); RecomputeBufferLimits(); } int CodedInputStream::BytesUntilTotalBytesLimit() const { if (total_bytes_limit_ == INT_MAX) return -1; return total_bytes_limit_ - CurrentPosition(); } void CodedInputStream::PrintTotalBytesLimitError() { GOOGLE_LOG(ERROR) << "A protocol message was rejected because it was too " "big (more than " << total_bytes_limit_ << " bytes). To increase the limit (or to disable these " "warnings), see CodedInputStream::SetTotalBytesLimit() " "in google/protobuf/io/coded_stream.h."; } bool CodedInputStream::SkipFallback(int count, int original_buffer_size) { if (buffer_size_after_limit_ > 0) { // We hit a limit inside this buffer. Advance to the limit and fail. Advance(original_buffer_size); return false; } count -= original_buffer_size; buffer_ = NULL; buffer_end_ = buffer_; // Make sure this skip doesn't try to skip past the current limit. int closest_limit = std::min(current_limit_, total_bytes_limit_); int bytes_until_limit = closest_limit - total_bytes_read_; if (bytes_until_limit < count) { // We hit the limit. Skip up to it then fail. if (bytes_until_limit > 0) { total_bytes_read_ = closest_limit; input_->Skip(bytes_until_limit); } return false; } total_bytes_read_ += count; return input_->Skip(count); } bool CodedInputStream::GetDirectBufferPointer(const void** data, int* size) { if (BufferSize() == 0 && !Refresh()) return false; *data = buffer_; *size = BufferSize(); return true; } bool CodedInputStream::ReadRaw(void* buffer, int size) { return InternalReadRawInline(buffer, size); } bool CodedInputStream::ReadString(string* buffer, int size) { if (size < 0) return false; // security: size is often user-supplied return InternalReadStringInline(buffer, size); } bool CodedInputStream::ReadStringFallback(string* buffer, int size) { if (!buffer->empty()) { buffer->clear(); } int closest_limit = std::min(current_limit_, total_bytes_limit_); if (closest_limit != INT_MAX) { int bytes_to_limit = closest_limit - CurrentPosition(); if (bytes_to_limit > 0 && size > 0 && size <= bytes_to_limit) { buffer->reserve(size); } } int current_buffer_size; while ((current_buffer_size = BufferSize()) < size) { // Some STL implementations "helpfully" crash on buffer->append(NULL, 0). if (current_buffer_size != 0) { // Note: string1.append(string2) is O(string2.size()) (as opposed to // O(string1.size() + string2.size()), which would be bad). buffer->append(reinterpret_cast(buffer_), current_buffer_size); } size -= current_buffer_size; Advance(current_buffer_size); if (!Refresh()) return false; } buffer->append(reinterpret_cast(buffer_), size); Advance(size); return true; } bool CodedInputStream::ReadLittleEndian32Fallback(uint32* value) { uint8 bytes[sizeof(*value)]; const uint8* ptr; if (BufferSize() >= sizeof(*value)) { // Fast path: Enough bytes in the buffer to read directly. ptr = buffer_; Advance(sizeof(*value)); } else { // Slow path: Had to read past the end of the buffer. if (!ReadRaw(bytes, sizeof(*value))) return false; ptr = bytes; } ReadLittleEndian32FromArray(ptr, value); return true; } bool CodedInputStream::ReadLittleEndian64Fallback(uint64* value) { uint8 bytes[sizeof(*value)]; const uint8* ptr; if (BufferSize() >= sizeof(*value)) { // Fast path: Enough bytes in the buffer to read directly. ptr = buffer_; Advance(sizeof(*value)); } else { // Slow path: Had to read past the end of the buffer. if (!ReadRaw(bytes, sizeof(*value))) return false; ptr = bytes; } ReadLittleEndian64FromArray(ptr, value); return true; } namespace { // Read a varint from the given buffer, write it to *value, and return a pair. // The first part of the pair is true iff the read was successful. The second // part is buffer + (number of bytes read). This function is always inlined, // so returning a pair is costless. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE ::std::pair ReadVarint32FromArray( uint32 first_byte, const uint8* buffer, uint32* value); inline ::std::pair ReadVarint32FromArray( uint32 first_byte, const uint8* buffer, uint32* value) { // Fast path: We have enough bytes left in the buffer to guarantee that // this read won't cross the end, so we can skip the checks. GOOGLE_DCHECK_EQ(*buffer, first_byte); GOOGLE_DCHECK_EQ(first_byte & 0x80, 0x80) << first_byte; const uint8* ptr = buffer; uint32 b; uint32 result = first_byte - 0x80; ++ptr; // We just processed the first byte. Move on to the second. b = *(ptr++); result += b << 7; if (!(b & 0x80)) goto done; result -= 0x80 << 7; b = *(ptr++); result += b << 14; if (!(b & 0x80)) goto done; result -= 0x80 << 14; b = *(ptr++); result += b << 21; if (!(b & 0x80)) goto done; result -= 0x80 << 21; b = *(ptr++); result += b << 28; if (!(b & 0x80)) goto done; // "result -= 0x80 << 28" is irrevelant. // If the input is larger than 32 bits, we still need to read it all // and discard the high-order bits. for (int i = 0; i < kMaxVarintBytes - kMaxVarint32Bytes; i++) { b = *(ptr++); if (!(b & 0x80)) goto done; } // We have overrun the maximum size of a varint (10 bytes). Assume // the data is corrupt. return std::make_pair(false, ptr); done: *value = result; return std::make_pair(true, ptr); } GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE::std::pair ReadVarint64FromArray(const uint8* buffer, uint64* value); inline ::std::pair ReadVarint64FromArray( const uint8* buffer, uint64* value) { const uint8* ptr = buffer; uint32 b; // Splitting into 32-bit pieces gives better performance on 32-bit // processors. uint32 part0 = 0, part1 = 0, part2 = 0; b = *(ptr++); part0 = b ; if (!(b & 0x80)) goto done; part0 -= 0x80; b = *(ptr++); part0 += b << 7; if (!(b & 0x80)) goto done; part0 -= 0x80 << 7; b = *(ptr++); part0 += b << 14; if (!(b & 0x80)) goto done; part0 -= 0x80 << 14; b = *(ptr++); part0 += b << 21; if (!(b & 0x80)) goto done; part0 -= 0x80 << 21; b = *(ptr++); part1 = b ; if (!(b & 0x80)) goto done; part1 -= 0x80; b = *(ptr++); part1 += b << 7; if (!(b & 0x80)) goto done; part1 -= 0x80 << 7; b = *(ptr++); part1 += b << 14; if (!(b & 0x80)) goto done; part1 -= 0x80 << 14; b = *(ptr++); part1 += b << 21; if (!(b & 0x80)) goto done; part1 -= 0x80 << 21; b = *(ptr++); part2 = b ; if (!(b & 0x80)) goto done; part2 -= 0x80; b = *(ptr++); part2 += b << 7; if (!(b & 0x80)) goto done; // "part2 -= 0x80 << 7" is irrelevant because (0x80 << 7) << 56 is 0. // We have overrun the maximum size of a varint (10 bytes). Assume // the data is corrupt. return std::make_pair(false, ptr); done: *value = (static_cast(part0)) | (static_cast(part1) << 28) | (static_cast(part2) << 56); return std::make_pair(true, ptr); } } // namespace bool CodedInputStream::ReadVarint32Slow(uint32* value) { // Directly invoke ReadVarint64Fallback, since we already tried to optimize // for one-byte varints. std::pair p = ReadVarint64Fallback(); *value = static_cast(p.first); return p.second; } int64 CodedInputStream::ReadVarint32Fallback(uint32 first_byte_or_zero) { if (BufferSize() >= kMaxVarintBytes || // Optimization: We're also safe if the buffer is non-empty and it ends // with a byte that would terminate a varint. (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) { GOOGLE_DCHECK_NE(first_byte_or_zero, 0) << "Caller should provide us with *buffer_ when buffer is non-empty"; uint32 temp; ::std::pair p = ReadVarint32FromArray(first_byte_or_zero, buffer_, &temp); if (!p.first) return -1; buffer_ = p.second; return temp; } else { // Really slow case: we will incur the cost of an extra function call here, // but moving this out of line reduces the size of this function, which // improves the common case. In micro benchmarks, this is worth about 10-15% uint32 temp; return ReadVarint32Slow(&temp) ? static_cast(temp) : -1; } } int CodedInputStream::ReadVarintSizeAsIntSlow() { // Directly invoke ReadVarint64Fallback, since we already tried to optimize // for one-byte varints. std::pair p = ReadVarint64Fallback(); if (!p.second || p.first > static_cast(INT_MAX)) return -1; return p.first; } int CodedInputStream::ReadVarintSizeAsIntFallback() { if (BufferSize() >= kMaxVarintBytes || // Optimization: We're also safe if the buffer is non-empty and it ends // with a byte that would terminate a varint. (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) { uint64 temp; ::std::pair p = ReadVarint64FromArray(buffer_, &temp); if (!p.first || temp > static_cast(INT_MAX)) return -1; buffer_ = p.second; return temp; } else { // Really slow case: we will incur the cost of an extra function call here, // but moving this out of line reduces the size of this function, which // improves the common case. In micro benchmarks, this is worth about 10-15% return ReadVarintSizeAsIntSlow(); } } uint32 CodedInputStream::ReadTagSlow() { if (buffer_ == buffer_end_) { // Call refresh. if (!Refresh()) { // Refresh failed. Make sure that it failed due to EOF, not because // we hit total_bytes_limit_, which, unlike normal limits, is not a // valid place to end a message. int current_position = total_bytes_read_ - buffer_size_after_limit_; if (current_position >= total_bytes_limit_) { // Hit total_bytes_limit_. But if we also hit the normal limit, // we're still OK. legitimate_message_end_ = current_limit_ == total_bytes_limit_; } else { legitimate_message_end_ = true; } return 0; } } // For the slow path, just do a 64-bit read. Try to optimize for one-byte tags // again, since we have now refreshed the buffer. uint64 result = 0; if (!ReadVarint64(&result)) return 0; return static_cast(result); } uint32 CodedInputStream::ReadTagFallback(uint32 first_byte_or_zero) { const int buf_size = BufferSize(); if (buf_size >= kMaxVarintBytes || // Optimization: We're also safe if the buffer is non-empty and it ends // with a byte that would terminate a varint. (buf_size > 0 && !(buffer_end_[-1] & 0x80))) { GOOGLE_DCHECK_EQ(first_byte_or_zero, buffer_[0]); if (first_byte_or_zero == 0) { ++buffer_; return 0; } uint32 tag; ::std::pair p = ReadVarint32FromArray(first_byte_or_zero, buffer_, &tag); if (!p.first) { return 0; } buffer_ = p.second; return tag; } else { // We are commonly at a limit when attempting to read tags. Try to quickly // detect this case without making another function call. if ((buf_size == 0) && ((buffer_size_after_limit_ > 0) || (total_bytes_read_ == current_limit_)) && // Make sure that the limit we hit is not total_bytes_limit_, since // in that case we still need to call Refresh() so that it prints an // error. total_bytes_read_ - buffer_size_after_limit_ < total_bytes_limit_) { // We hit a byte limit. legitimate_message_end_ = true; return 0; } return ReadTagSlow(); } } bool CodedInputStream::ReadVarint64Slow(uint64* value) { // Slow path: This read might cross the end of the buffer, so we // need to check and refresh the buffer if and when it does. uint64 result = 0; int count = 0; uint32 b; do { if (count == kMaxVarintBytes) { *value = 0; return false; } while (buffer_ == buffer_end_) { if (!Refresh()) { *value = 0; return false; } } b = *buffer_; result |= static_cast(b & 0x7F) << (7 * count); Advance(1); ++count; } while (b & 0x80); *value = result; return true; } std::pair CodedInputStream::ReadVarint64Fallback() { if (BufferSize() >= kMaxVarintBytes || // Optimization: We're also safe if the buffer is non-empty and it ends // with a byte that would terminate a varint. (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) { uint64 temp; ::std::pair p = ReadVarint64FromArray(buffer_, &temp); if (!p.first) { return std::make_pair(0, false); } buffer_ = p.second; return std::make_pair(temp, true); } else { uint64 temp; bool success = ReadVarint64Slow(&temp); return std::make_pair(temp, success); } } bool CodedInputStream::Refresh() { GOOGLE_DCHECK_EQ(0, BufferSize()); if (buffer_size_after_limit_ > 0 || overflow_bytes_ > 0 || total_bytes_read_ == current_limit_) { // We've hit a limit. Stop. int current_position = total_bytes_read_ - buffer_size_after_limit_; if (current_position >= total_bytes_limit_ && total_bytes_limit_ != current_limit_) { // Hit total_bytes_limit_. PrintTotalBytesLimitError(); } return false; } const void* void_buffer; int buffer_size; if (NextNonEmpty(input_, &void_buffer, &buffer_size)) { buffer_ = reinterpret_cast(void_buffer); buffer_end_ = buffer_ + buffer_size; GOOGLE_CHECK_GE(buffer_size, 0); if (total_bytes_read_ <= INT_MAX - buffer_size) { total_bytes_read_ += buffer_size; } else { // Overflow. Reset buffer_end_ to not include the bytes beyond INT_MAX. // We can't get that far anyway, because total_bytes_limit_ is guaranteed // to be less than it. We need to keep track of the number of bytes // we discarded, though, so that we can call input_->BackUp() to back // up over them on destruction. // The following line is equivalent to: // overflow_bytes_ = total_bytes_read_ + buffer_size - INT_MAX; // except that it avoids overflows. Signed integer overflow has // undefined results according to the C standard. overflow_bytes_ = total_bytes_read_ - (INT_MAX - buffer_size); buffer_end_ -= overflow_bytes_; total_bytes_read_ = INT_MAX; } RecomputeBufferLimits(); return true; } else { buffer_ = NULL; buffer_end_ = NULL; return false; } } // CodedOutputStream ================================================= google::protobuf::internal::AtomicWord CodedOutputStream::default_serialization_deterministic_ = 0; CodedOutputStream::CodedOutputStream(ZeroCopyOutputStream* output) : output_(output), buffer_(NULL), buffer_size_(0), total_bytes_(0), had_error_(false), aliasing_enabled_(false), serialization_deterministic_is_overridden_(false) { // Eagerly Refresh() so buffer space is immediately available. Refresh(); // The Refresh() may have failed. If the client doesn't write any data, // though, don't consider this an error. If the client does write data, then // another Refresh() will be attempted and it will set the error once again. had_error_ = false; } CodedOutputStream::CodedOutputStream(ZeroCopyOutputStream* output, bool do_eager_refresh) : output_(output), buffer_(NULL), buffer_size_(0), total_bytes_(0), had_error_(false), aliasing_enabled_(false), serialization_deterministic_is_overridden_(false) { if (do_eager_refresh) { // Eagerly Refresh() so buffer space is immediately available. Refresh(); // The Refresh() may have failed. If the client doesn't write any data, // though, don't consider this an error. If the client does write data, then // another Refresh() will be attempted and it will set the error once again. had_error_ = false; } } CodedOutputStream::~CodedOutputStream() { Trim(); } void CodedOutputStream::Trim() { if (buffer_size_ > 0) { output_->BackUp(buffer_size_); total_bytes_ -= buffer_size_; buffer_size_ = 0; buffer_ = NULL; } } bool CodedOutputStream::Skip(int count) { if (count < 0) return false; while (count > buffer_size_) { count -= buffer_size_; if (!Refresh()) return false; } Advance(count); return true; } bool CodedOutputStream::GetDirectBufferPointer(void** data, int* size) { if (buffer_size_ == 0 && !Refresh()) return false; *data = buffer_; *size = buffer_size_; return true; } void CodedOutputStream::WriteRaw(const void* data, int size) { while (buffer_size_ < size) { memcpy(buffer_, data, buffer_size_); size -= buffer_size_; data = reinterpret_cast(data) + buffer_size_; if (!Refresh()) return; } memcpy(buffer_, data, size); Advance(size); } uint8* CodedOutputStream::WriteRawToArray( const void* data, int size, uint8* target) { memcpy(target, data, size); return target + size; } void CodedOutputStream::WriteAliasedRaw(const void* data, int size) { if (size < buffer_size_ ) { WriteRaw(data, size); } else { Trim(); total_bytes_ += size; had_error_ |= !output_->WriteAliasedRaw(data, size); } } void CodedOutputStream::WriteLittleEndian32(uint32 value) { uint8 bytes[sizeof(value)]; bool use_fast = buffer_size_ >= sizeof(value); uint8* ptr = use_fast ? buffer_ : bytes; WriteLittleEndian32ToArray(value, ptr); if (use_fast) { Advance(sizeof(value)); } else { WriteRaw(bytes, sizeof(value)); } } void CodedOutputStream::WriteLittleEndian64(uint64 value) { uint8 bytes[sizeof(value)]; bool use_fast = buffer_size_ >= sizeof(value); uint8* ptr = use_fast ? buffer_ : bytes; WriteLittleEndian64ToArray(value, ptr); if (use_fast) { Advance(sizeof(value)); } else { WriteRaw(bytes, sizeof(value)); } } void CodedOutputStream::WriteVarint32SlowPath(uint32 value) { uint8 bytes[kMaxVarint32Bytes]; uint8* target = &bytes[0]; uint8* end = WriteVarint32ToArray(value, target); int size = end - target; WriteRaw(bytes, size); } void CodedOutputStream::WriteVarint64SlowPath(uint64 value) { uint8 bytes[kMaxVarintBytes]; uint8* target = &bytes[0]; uint8* end = WriteVarint64ToArray(value, target); int size = end - target; WriteRaw(bytes, size); } bool CodedOutputStream::Refresh() { void* void_buffer; if (output_->Next(&void_buffer, &buffer_size_)) { buffer_ = reinterpret_cast(void_buffer); total_bytes_ += buffer_size_; return true; } else { buffer_ = NULL; buffer_size_ = 0; had_error_ = true; return false; } } uint8* CodedOutputStream::WriteStringWithSizeToArray(const string& str, uint8* target) { GOOGLE_DCHECK_LE(str.size(), kuint32max); target = WriteVarint32ToArray(str.size(), target); return WriteStringToArray(str, target); } } // namespace io } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/coded_stream.h000066400000000000000000001625361334102242000305170ustar00rootroot00000000000000// 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. // // This file contains the CodedInputStream and CodedOutputStream classes, // which wrap a ZeroCopyInputStream or ZeroCopyOutputStream, respectively, // and allow you to read or write individual pieces of data in various // formats. In particular, these implement the varint encoding for // integers, a simple variable-length encoding in which smaller numbers // take fewer bytes. // // Typically these classes will only be used internally by the protocol // buffer library in order to encode and decode protocol buffers. Clients // of the library only need to know about this class if they wish to write // custom message parsing or serialization procedures. // // CodedOutputStream example: // // Write some data to "myfile". First we write a 4-byte "magic number" // // to identify the file type, then write a length-delimited string. The // // string is composed of a varint giving the length followed by the raw // // bytes. // int fd = open("myfile", O_CREAT | O_WRONLY); // ZeroCopyOutputStream* raw_output = new FileOutputStream(fd); // CodedOutputStream* coded_output = new CodedOutputStream(raw_output); // // int magic_number = 1234; // char text[] = "Hello world!"; // coded_output->WriteLittleEndian32(magic_number); // coded_output->WriteVarint32(strlen(text)); // coded_output->WriteRaw(text, strlen(text)); // // delete coded_output; // delete raw_output; // close(fd); // // CodedInputStream example: // // Read a file created by the above code. // int fd = open("myfile", O_RDONLY); // ZeroCopyInputStream* raw_input = new FileInputStream(fd); // CodedInputStream coded_input = new CodedInputStream(raw_input); // // coded_input->ReadLittleEndian32(&magic_number); // if (magic_number != 1234) { // cerr << "File not in expected format." << endl; // return; // } // // uint32 size; // coded_input->ReadVarint32(&size); // // char* text = new char[size + 1]; // coded_input->ReadRaw(buffer, size); // text[size] = '\0'; // // delete coded_input; // delete raw_input; // close(fd); // // cout << "Text is: " << text << endl; // delete [] text; // // For those who are interested, varint encoding is defined as follows: // // The encoding operates on unsigned integers of up to 64 bits in length. // Each byte of the encoded value has the format: // * bits 0-6: Seven bits of the number being encoded. // * bit 7: Zero if this is the last byte in the encoding (in which // case all remaining bits of the number are zero) or 1 if // more bytes follow. // The first byte contains the least-significant 7 bits of the number, the // second byte (if present) contains the next-least-significant 7 bits, // and so on. So, the binary number 1011000101011 would be encoded in two // bytes as "10101011 00101100". // // In theory, varint could be used to encode integers of any length. // However, for practicality we set a limit at 64 bits. The maximum encoded // length of a number is thus 10 bytes. #ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ #define GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ #include #include #include #include #ifdef _MSC_VER // Assuming windows is always little-endian. #if !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) #define PROTOBUF_LITTLE_ENDIAN 1 #endif #if _MSC_VER >= 1300 && !defined(__INTEL_COMPILER) // If MSVC has "/RTCc" set, it will complain about truncating casts at // runtime. This file contains some intentional truncating casts. #pragma runtime_checks("c", off) #endif #else #include // __BYTE_ORDER #if ((defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) || \ (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN)) && \ !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) #define PROTOBUF_LITTLE_ENDIAN 1 #endif #endif #include #include #include #include namespace google { namespace protobuf { class DescriptorPool; class MessageFactory; namespace internal { void MapTestForceDeterministic(); } namespace io { // Defined in this file. class CodedInputStream; class CodedOutputStream; // Defined in other files. class ZeroCopyInputStream; // zero_copy_stream.h class ZeroCopyOutputStream; // zero_copy_stream.h // Class which reads and decodes binary data which is composed of varint- // encoded integers and fixed-width pieces. Wraps a ZeroCopyInputStream. // Most users will not need to deal with CodedInputStream. // // Most methods of CodedInputStream that return a bool return false if an // underlying I/O error occurs or if the data is malformed. Once such a // failure occurs, the CodedInputStream is broken and is no longer useful. class LIBPROTOBUF_EXPORT CodedInputStream { public: // Create a CodedInputStream that reads from the given ZeroCopyInputStream. explicit CodedInputStream(ZeroCopyInputStream* input); // Create a CodedInputStream that reads from the given flat array. This is // faster than using an ArrayInputStream. PushLimit(size) is implied by // this constructor. explicit CodedInputStream(const uint8* buffer, int size); // Destroy the CodedInputStream and position the underlying // ZeroCopyInputStream at the first unread byte. If an error occurred while // reading (causing a method to return false), then the exact position of // the input stream may be anywhere between the last value that was read // successfully and the stream's byte limit. ~CodedInputStream(); // Return true if this CodedInputStream reads from a flat array instead of // a ZeroCopyInputStream. inline bool IsFlat() const; // Skips a number of bytes. Returns false if an underlying read error // occurs. inline bool Skip(int count); // Sets *data to point directly at the unread part of the CodedInputStream's // underlying buffer, and *size to the size of that buffer, but does not // advance the stream's current position. This will always either produce // a non-empty buffer or return false. If the caller consumes any of // this data, it should then call Skip() to skip over the consumed bytes. // This may be useful for implementing external fast parsing routines for // types of data not covered by the CodedInputStream interface. bool GetDirectBufferPointer(const void** data, int* size); // Like GetDirectBufferPointer, but this method is inlined, and does not // attempt to Refresh() if the buffer is currently empty. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void GetDirectBufferPointerInline(const void** data, int* size); // Read raw bytes, copying them into the given buffer. bool ReadRaw(void* buffer, int size); // Like the above, with inlined optimizations. This should only be used // by the protobuf implementation. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InternalReadRawInline(void* buffer, int size); // Like ReadRaw, but reads into a string. bool ReadString(string* buffer, int size); // Like the above, with inlined optimizations. This should only be used // by the protobuf implementation. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InternalReadStringInline(string* buffer, int size); // Read a 32-bit little-endian integer. bool ReadLittleEndian32(uint32* value); // Read a 64-bit little-endian integer. bool ReadLittleEndian64(uint64* value); // These methods read from an externally provided buffer. The caller is // responsible for ensuring that the buffer has sufficient space. // Read a 32-bit little-endian integer. static const uint8* ReadLittleEndian32FromArray(const uint8* buffer, uint32* value); // Read a 64-bit little-endian integer. static const uint8* ReadLittleEndian64FromArray(const uint8* buffer, uint64* value); // Read an unsigned integer with Varint encoding, truncating to 32 bits. // Reading a 32-bit value is equivalent to reading a 64-bit one and casting // it to uint32, but may be more efficient. bool ReadVarint32(uint32* value); // Read an unsigned integer with Varint encoding. bool ReadVarint64(uint64* value); // Reads a varint off the wire into an "int". This should be used for reading // sizes off the wire (sizes of strings, submessages, bytes fields, etc). // // The value from the wire is interpreted as unsigned. If its value exceeds // the representable value of an integer on this platform, instead of // truncating we return false. Truncating (as performed by ReadVarint32() // above) is an acceptable approach for fields representing an integer, but // when we are parsing a size from the wire, truncating the value would result // in us misparsing the payload. bool ReadVarintSizeAsInt(int* value); // Read a tag. This calls ReadVarint32() and returns the result, or returns // zero (which is not a valid tag) if ReadVarint32() fails. Also, ReadTag // (but not ReadTagNoLastTag) updates the last tag value, which can be checked // with LastTagWas(). // // Always inline because this is only called in one place per parse loop // but it is called for every iteration of said loop, so it should be fast. // GCC doesn't want to inline this by default. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE uint32 ReadTag() { return last_tag_ = ReadTagNoLastTag(); } GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE uint32 ReadTagNoLastTag(); // This usually a faster alternative to ReadTag() when cutoff is a manifest // constant. It does particularly well for cutoff >= 127. The first part // of the return value is the tag that was read, though it can also be 0 in // the cases where ReadTag() would return 0. If the second part is true // then the tag is known to be in [0, cutoff]. If not, the tag either is // above cutoff or is 0. (There's intentional wiggle room when tag is 0, // because that can arise in several ways, and for best performance we want // to avoid an extra "is tag == 0?" check here.) GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE std::pair ReadTagWithCutoff(uint32 cutoff) { std::pair result = ReadTagWithCutoffNoLastTag(cutoff); last_tag_ = result.first; return result; } GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE std::pair ReadTagWithCutoffNoLastTag(uint32 cutoff); // Usually returns true if calling ReadVarint32() now would produce the given // value. Will always return false if ReadVarint32() would not return the // given value. If ExpectTag() returns true, it also advances past // the varint. For best performance, use a compile-time constant as the // parameter. // Always inline because this collapses to a small number of instructions // when given a constant parameter, but GCC doesn't want to inline by default. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool ExpectTag(uint32 expected); // Like above, except this reads from the specified buffer. The caller is // responsible for ensuring that the buffer is large enough to read a varint // of the expected size. For best performance, use a compile-time constant as // the expected tag parameter. // // Returns a pointer beyond the expected tag if it was found, or NULL if it // was not. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static const uint8* ExpectTagFromArray(const uint8* buffer, uint32 expected); // Usually returns true if no more bytes can be read. Always returns false // if more bytes can be read. If ExpectAtEnd() returns true, a subsequent // call to LastTagWas() will act as if ReadTag() had been called and returned // zero, and ConsumedEntireMessage() will return true. bool ExpectAtEnd(); // If the last call to ReadTag() or ReadTagWithCutoff() returned the given // value, returns true. Otherwise, returns false. // ReadTagNoLastTag/ReadTagWithCutoffNoLastTag do not preserve the last // returned value. // // This is needed because parsers for some types of embedded messages // (with field type TYPE_GROUP) don't actually know that they've reached the // end of a message until they see an ENDGROUP tag, which was actually part // of the enclosing message. The enclosing message would like to check that // tag to make sure it had the right number, so it calls LastTagWas() on // return from the embedded parser to check. bool LastTagWas(uint32 expected); void SetLastTag(uint32 tag) { last_tag_ = tag; } // When parsing message (but NOT a group), this method must be called // immediately after MergeFromCodedStream() returns (if it returns true) // to further verify that the message ended in a legitimate way. For // example, this verifies that parsing did not end on an end-group tag. // It also checks for some cases where, due to optimizations, // MergeFromCodedStream() can incorrectly return true. bool ConsumedEntireMessage(); // Limits ---------------------------------------------------------- // Limits are used when parsing length-delimited embedded messages. // After the message's length is read, PushLimit() is used to prevent // the CodedInputStream from reading beyond that length. Once the // embedded message has been parsed, PopLimit() is called to undo the // limit. // Opaque type used with PushLimit() and PopLimit(). Do not modify // values of this type yourself. The only reason that this isn't a // struct with private internals is for efficiency. typedef int Limit; // Places a limit on the number of bytes that the stream may read, // starting from the current position. Once the stream hits this limit, // it will act like the end of the input has been reached until PopLimit() // is called. // // As the names imply, the stream conceptually has a stack of limits. The // shortest limit on the stack is always enforced, even if it is not the // top limit. // // The value returned by PushLimit() is opaque to the caller, and must // be passed unchanged to the corresponding call to PopLimit(). Limit PushLimit(int byte_limit); // Pops the last limit pushed by PushLimit(). The input must be the value // returned by that call to PushLimit(). void PopLimit(Limit limit); // Returns the number of bytes left until the nearest limit on the // stack is hit, or -1 if no limits are in place. int BytesUntilLimit() const; // Returns current position relative to the beginning of the input stream. int CurrentPosition() const; // Total Bytes Limit ----------------------------------------------- // To prevent malicious users from sending excessively large messages // and causing integer overflows or memory exhaustion, CodedInputStream // imposes a hard limit on the total number of bytes it will read. // Sets the maximum number of bytes that this CodedInputStream will read // before refusing to continue. To prevent integer overflows in the // protocol buffers implementation, as well as to prevent servers from // allocating enormous amounts of memory to hold parsed messages, the // maximum message length should be limited to the shortest length that // will not harm usability. The theoretical shortest message that could // cause integer overflows is 512MB. The default limit is 64MB. Apps // should set shorter limits if possible. For backwards compatibility all // negative values get squashed to -1, as other negative values might have // special internal meanings. An error will always be printed to stderr if // the limit is reached. // // This is unrelated to PushLimit()/PopLimit(). // // Hint: If you are reading this because your program is printing a // warning about dangerously large protocol messages, you may be // confused about what to do next. The best option is to change your // design such that excessively large messages are not necessary. // For example, try to design file formats to consist of many small // messages rather than a single large one. If this is infeasible, // you will need to increase the limit. Chances are, though, that // your code never constructs a CodedInputStream on which the limit // can be set. You probably parse messages by calling things like // Message::ParseFromString(). In this case, you will need to change // your code to instead construct some sort of ZeroCopyInputStream // (e.g. an ArrayInputStream), construct a CodedInputStream around // that, then you can adjust the limit. Then call // Message::ParseFromCodedStream() instead. Yes, it's more work, but // you're doing something unusual. void SetTotalBytesLimit(int total_bytes_limit, int warning_threshold); // The Total Bytes Limit minus the Current Position, or -1 if there // is no Total Bytes Limit. int BytesUntilTotalBytesLimit() const; // Recursion Limit ------------------------------------------------- // To prevent corrupt or malicious messages from causing stack overflows, // we must keep track of the depth of recursion when parsing embedded // messages and groups. CodedInputStream keeps track of this because it // is the only object that is passed down the stack during parsing. // Sets the maximum recursion depth. The default is 100. void SetRecursionLimit(int limit); // Increments the current recursion depth. Returns true if the depth is // under the limit, false if it has gone over. bool IncrementRecursionDepth(); // Decrements the recursion depth if possible. void DecrementRecursionDepth(); // Decrements the recursion depth blindly. This is faster than // DecrementRecursionDepth(). It should be used only if all previous // increments to recursion depth were successful. void UnsafeDecrementRecursionDepth(); // Shorthand for make_pair(PushLimit(byte_limit), --recursion_budget_). // Using this can reduce code size and complexity in some cases. The caller // is expected to check that the second part of the result is non-negative (to // bail out if the depth of recursion is too high) and, if all is well, to // later pass the first part of the result to PopLimit() or similar. std::pair IncrementRecursionDepthAndPushLimit( int byte_limit); // Shorthand for PushLimit(ReadVarint32(&length) ? length : 0). Limit ReadLengthAndPushLimit(); // Helper that is equivalent to: { // bool result = ConsumedEntireMessage(); // PopLimit(limit); // UnsafeDecrementRecursionDepth(); // return result; } // Using this can reduce code size and complexity in some cases. // Do not use unless the current recursion depth is greater than zero. bool DecrementRecursionDepthAndPopLimit(Limit limit); // Helper that is equivalent to: { // bool result = ConsumedEntireMessage(); // PopLimit(limit); // return result; } // Using this can reduce code size and complexity in some cases. bool CheckEntireMessageConsumedAndPopLimit(Limit limit); // Extension Registry ---------------------------------------------- // ADVANCED USAGE: 99.9% of people can ignore this section. // // By default, when parsing extensions, the parser looks for extension // definitions in the pool which owns the outer message's Descriptor. // However, you may call SetExtensionRegistry() to provide an alternative // pool instead. This makes it possible, for example, to parse a message // using a generated class, but represent some extensions using // DynamicMessage. // Set the pool used to look up extensions. Most users do not need to call // this as the correct pool will be chosen automatically. // // WARNING: It is very easy to misuse this. Carefully read the requirements // below. Do not use this unless you are sure you need it. Almost no one // does. // // Let's say you are parsing a message into message object m, and you want // to take advantage of SetExtensionRegistry(). You must follow these // requirements: // // The given DescriptorPool must contain m->GetDescriptor(). It is not // sufficient for it to simply contain a descriptor that has the same name // and content -- it must be the *exact object*. In other words: // assert(pool->FindMessageTypeByName(m->GetDescriptor()->full_name()) == // m->GetDescriptor()); // There are two ways to satisfy this requirement: // 1) Use m->GetDescriptor()->pool() as the pool. This is generally useless // because this is the pool that would be used anyway if you didn't call // SetExtensionRegistry() at all. // 2) Use a DescriptorPool which has m->GetDescriptor()->pool() as an // "underlay". Read the documentation for DescriptorPool for more // information about underlays. // // You must also provide a MessageFactory. This factory will be used to // construct Message objects representing extensions. The factory's // GetPrototype() MUST return non-NULL for any Descriptor which can be found // through the provided pool. // // If the provided factory might return instances of protocol-compiler- // generated (i.e. compiled-in) types, or if the outer message object m is // a generated type, then the given factory MUST have this property: If // GetPrototype() is given a Descriptor which resides in // DescriptorPool::generated_pool(), the factory MUST return the same // prototype which MessageFactory::generated_factory() would return. That // is, given a descriptor for a generated type, the factory must return an // instance of the generated class (NOT DynamicMessage). However, when // given a descriptor for a type that is NOT in generated_pool, the factory // is free to return any implementation. // // The reason for this requirement is that generated sub-objects may be // accessed via the standard (non-reflection) extension accessor methods, // and these methods will down-cast the object to the generated class type. // If the object is not actually of that type, the results would be undefined. // On the other hand, if an extension is not compiled in, then there is no // way the code could end up accessing it via the standard accessors -- the // only way to access the extension is via reflection. When using reflection, // DynamicMessage and generated messages are indistinguishable, so it's fine // if these objects are represented using DynamicMessage. // // Using DynamicMessageFactory on which you have called // SetDelegateToGeneratedFactory(true) should be sufficient to satisfy the // above requirement. // // If either pool or factory is NULL, both must be NULL. // // Note that this feature is ignored when parsing "lite" messages as they do // not have descriptors. void SetExtensionRegistry(const DescriptorPool* pool, MessageFactory* factory); // Get the DescriptorPool set via SetExtensionRegistry(), or NULL if no pool // has been provided. const DescriptorPool* GetExtensionPool(); // Get the MessageFactory set via SetExtensionRegistry(), or NULL if no // factory has been provided. MessageFactory* GetExtensionFactory(); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedInputStream); const uint8* buffer_; const uint8* buffer_end_; // pointer to the end of the buffer. ZeroCopyInputStream* input_; int total_bytes_read_; // total bytes read from input_, including // the current buffer // If total_bytes_read_ surpasses INT_MAX, we record the extra bytes here // so that we can BackUp() on destruction. int overflow_bytes_; // LastTagWas() stuff. uint32 last_tag_; // result of last ReadTag() or ReadTagWithCutoff(). // This is set true by ReadTag{Fallback/Slow}() if it is called when exactly // at EOF, or by ExpectAtEnd() when it returns true. This happens when we // reach the end of a message and attempt to read another tag. bool legitimate_message_end_; // See EnableAliasing(). bool aliasing_enabled_; // Limits Limit current_limit_; // if position = -1, no limit is applied // For simplicity, if the current buffer crosses a limit (either a normal // limit created by PushLimit() or the total bytes limit), buffer_size_ // only tracks the number of bytes before that limit. This field // contains the number of bytes after it. Note that this implies that if // buffer_size_ == 0 and buffer_size_after_limit_ > 0, we know we've // hit a limit. However, if both are zero, it doesn't necessarily mean // we aren't at a limit -- the buffer may have ended exactly at the limit. int buffer_size_after_limit_; // Maximum number of bytes to read, period. This is unrelated to // current_limit_. Set using SetTotalBytesLimit(). int total_bytes_limit_; // Current recursion budget, controlled by IncrementRecursionDepth() and // similar. Starts at recursion_limit_ and goes down: if this reaches // -1 we are over budget. int recursion_budget_; // Recursion depth limit, set by SetRecursionLimit(). int recursion_limit_; bool disable_strict_correctness_enforcement_; // See SetExtensionRegistry(). const DescriptorPool* extension_pool_; MessageFactory* extension_factory_; // Private member functions. // Fallback when Skip() goes past the end of the current buffer. bool SkipFallback(int count, int original_buffer_size); // Advance the buffer by a given number of bytes. void Advance(int amount); // Back up input_ to the current buffer position. void BackUpInputToCurrentPosition(); // Recomputes the value of buffer_size_after_limit_. Must be called after // current_limit_ or total_bytes_limit_ changes. void RecomputeBufferLimits(); // Writes an error message saying that we hit total_bytes_limit_. void PrintTotalBytesLimitError(); // Called when the buffer runs out to request more data. Implies an // Advance(BufferSize()). bool Refresh(); // When parsing varints, we optimize for the common case of small values, and // then optimize for the case when the varint fits within the current buffer // piece. The Fallback method is used when we can't use the one-byte // optimization. The Slow method is yet another fallback when the buffer is // not large enough. Making the slow path out-of-line speeds up the common // case by 10-15%. The slow path is fairly uncommon: it only triggers when a // message crosses multiple buffers. Note: ReadVarint32Fallback() and // ReadVarint64Fallback() are called frequently and generally not inlined, so // they have been optimized to avoid "out" parameters. The former returns -1 // if it fails and the uint32 it read otherwise. The latter has a bool // indicating success or failure as part of its return type. int64 ReadVarint32Fallback(uint32 first_byte_or_zero); int ReadVarintSizeAsIntFallback(); std::pair ReadVarint64Fallback(); bool ReadVarint32Slow(uint32* value); bool ReadVarint64Slow(uint64* value); int ReadVarintSizeAsIntSlow(); bool ReadLittleEndian32Fallback(uint32* value); bool ReadLittleEndian64Fallback(uint64* value); // Fallback/slow methods for reading tags. These do not update last_tag_, // but will set legitimate_message_end_ if we are at the end of the input // stream. uint32 ReadTagFallback(uint32 first_byte_or_zero); uint32 ReadTagSlow(); bool ReadStringFallback(string* buffer, int size); // Return the size of the buffer. int BufferSize() const; static const int kDefaultTotalBytesLimit = INT_MAX; static int default_recursion_limit_; // 100 by default. }; // Class which encodes and writes binary data which is composed of varint- // encoded integers and fixed-width pieces. Wraps a ZeroCopyOutputStream. // Most users will not need to deal with CodedOutputStream. // // Most methods of CodedOutputStream which return a bool return false if an // underlying I/O error occurs. Once such a failure occurs, the // CodedOutputStream is broken and is no longer useful. The Write* methods do // not return the stream status, but will invalidate the stream if an error // occurs. The client can probe HadError() to determine the status. // // Note that every method of CodedOutputStream which writes some data has // a corresponding static "ToArray" version. These versions write directly // to the provided buffer, returning a pointer past the last written byte. // They require that the buffer has sufficient capacity for the encoded data. // This allows an optimization where we check if an output stream has enough // space for an entire message before we start writing and, if there is, we // call only the ToArray methods to avoid doing bound checks for each // individual value. // i.e., in the example above: // // CodedOutputStream coded_output = new CodedOutputStream(raw_output); // int magic_number = 1234; // char text[] = "Hello world!"; // // int coded_size = sizeof(magic_number) + // CodedOutputStream::VarintSize32(strlen(text)) + // strlen(text); // // uint8* buffer = // coded_output->GetDirectBufferForNBytesAndAdvance(coded_size); // if (buffer != NULL) { // // The output stream has enough space in the buffer: write directly to // // the array. // buffer = CodedOutputStream::WriteLittleEndian32ToArray(magic_number, // buffer); // buffer = CodedOutputStream::WriteVarint32ToArray(strlen(text), buffer); // buffer = CodedOutputStream::WriteRawToArray(text, strlen(text), buffer); // } else { // // Make bound-checked writes, which will ask the underlying stream for // // more space as needed. // coded_output->WriteLittleEndian32(magic_number); // coded_output->WriteVarint32(strlen(text)); // coded_output->WriteRaw(text, strlen(text)); // } // // delete coded_output; class LIBPROTOBUF_EXPORT CodedOutputStream { public: // Create an CodedOutputStream that writes to the given ZeroCopyOutputStream. explicit CodedOutputStream(ZeroCopyOutputStream* output); CodedOutputStream(ZeroCopyOutputStream* output, bool do_eager_refresh); // Destroy the CodedOutputStream and position the underlying // ZeroCopyOutputStream immediately after the last byte written. ~CodedOutputStream(); // Trims any unused space in the underlying buffer so that its size matches // the number of bytes written by this stream. The underlying buffer will // automatically be trimmed when this stream is destroyed; this call is only // necessary if the underlying buffer is accessed *before* the stream is // destroyed. void Trim(); // Skips a number of bytes, leaving the bytes unmodified in the underlying // buffer. Returns false if an underlying write error occurs. This is // mainly useful with GetDirectBufferPointer(). bool Skip(int count); // Sets *data to point directly at the unwritten part of the // CodedOutputStream's underlying buffer, and *size to the size of that // buffer, but does not advance the stream's current position. This will // always either produce a non-empty buffer or return false. If the caller // writes any data to this buffer, it should then call Skip() to skip over // the consumed bytes. This may be useful for implementing external fast // serialization routines for types of data not covered by the // CodedOutputStream interface. bool GetDirectBufferPointer(void** data, int* size); // If there are at least "size" bytes available in the current buffer, // returns a pointer directly into the buffer and advances over these bytes. // The caller may then write directly into this buffer (e.g. using the // *ToArray static methods) rather than go through CodedOutputStream. If // there are not enough bytes available, returns NULL. The return pointer is // invalidated as soon as any other non-const method of CodedOutputStream // is called. inline uint8* GetDirectBufferForNBytesAndAdvance(int size); // Write raw bytes, copying them from the given buffer. void WriteRaw(const void* buffer, int size); // Like WriteRaw() but will try to write aliased data if aliasing is // turned on. void WriteRawMaybeAliased(const void* data, int size); // Like WriteRaw() but writing directly to the target array. // This is _not_ inlined, as the compiler often optimizes memcpy into inline // copy loops. Since this gets called by every field with string or bytes // type, inlining may lead to a significant amount of code bloat, with only a // minor performance gain. static uint8* WriteRawToArray(const void* buffer, int size, uint8* target); // Equivalent to WriteRaw(str.data(), str.size()). void WriteString(const string& str); // Like WriteString() but writing directly to the target array. static uint8* WriteStringToArray(const string& str, uint8* target); // Write the varint-encoded size of str followed by str. static uint8* WriteStringWithSizeToArray(const string& str, uint8* target); // Instructs the CodedOutputStream to allow the underlying // ZeroCopyOutputStream to hold pointers to the original structure instead of // copying, if it supports it (i.e. output->AllowsAliasing() is true). If the // underlying stream does not support aliasing, then enabling it has no // affect. For now, this only affects the behavior of // WriteRawMaybeAliased(). // // NOTE: It is caller's responsibility to ensure that the chunk of memory // remains live until all of the data has been consumed from the stream. void EnableAliasing(bool enabled); // Write a 32-bit little-endian integer. void WriteLittleEndian32(uint32 value); // Like WriteLittleEndian32() but writing directly to the target array. static uint8* WriteLittleEndian32ToArray(uint32 value, uint8* target); // Write a 64-bit little-endian integer. void WriteLittleEndian64(uint64 value); // Like WriteLittleEndian64() but writing directly to the target array. static uint8* WriteLittleEndian64ToArray(uint64 value, uint8* target); // Write an unsigned integer with Varint encoding. Writing a 32-bit value // is equivalent to casting it to uint64 and writing it as a 64-bit value, // but may be more efficient. void WriteVarint32(uint32 value); // Like WriteVarint32() but writing directly to the target array. static uint8* WriteVarint32ToArray(uint32 value, uint8* target); // Write an unsigned integer with Varint encoding. void WriteVarint64(uint64 value); // Like WriteVarint64() but writing directly to the target array. static uint8* WriteVarint64ToArray(uint64 value, uint8* target); // Equivalent to WriteVarint32() except when the value is negative, // in which case it must be sign-extended to a full 10 bytes. void WriteVarint32SignExtended(int32 value); // Like WriteVarint32SignExtended() but writing directly to the target array. static uint8* WriteVarint32SignExtendedToArray(int32 value, uint8* target); // This is identical to WriteVarint32(), but optimized for writing tags. // In particular, if the input is a compile-time constant, this method // compiles down to a couple instructions. // Always inline because otherwise the aformentioned optimization can't work, // but GCC by default doesn't want to inline this. void WriteTag(uint32 value); // Like WriteTag() but writing directly to the target array. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static uint8* WriteTagToArray(uint32 value, uint8* target); // Returns the number of bytes needed to encode the given value as a varint. static size_t VarintSize32(uint32 value); // Returns the number of bytes needed to encode the given value as a varint. static size_t VarintSize64(uint64 value); // If negative, 10 bytes. Otheriwse, same as VarintSize32(). static size_t VarintSize32SignExtended(int32 value); // Compile-time equivalent of VarintSize32(). template struct StaticVarintSize32 { static const size_t value = (Value < (1 << 7)) ? 1 : (Value < (1 << 14)) ? 2 : (Value < (1 << 21)) ? 3 : (Value < (1 << 28)) ? 4 : 5; }; // Returns the total number of bytes written since this object was created. inline int ByteCount() const; // Returns true if there was an underlying I/O error since this object was // created. bool HadError() const { return had_error_; } // Deterministic serialization, if requested, guarantees that for a given // binary, equal messages will always be serialized to the same bytes. This // implies: // . repeated serialization of a message will return the same bytes // . different processes of the same binary (which may be executing on // different machines) will serialize equal messages to the same bytes. // // Note the deterministic serialization is NOT canonical across languages; it // is also unstable across different builds with schema changes due to unknown // fields. Users who need canonical serialization, e.g., persistent storage in // a canonical form, fingerprinting, etc., should define their own // canonicalization specification and implement the serializer using // reflection APIs rather than relying on this API. // // If determinisitc serialization is requested, the serializer will // sort map entries by keys in lexicographical order or numerical order. // (This is an implementation detail and may subject to change.) // // There are two ways to determine whether serialization should be // deterministic for this CodedOutputStream. If SetSerializationDeterministic // has not yet been called, then the default comes from the global default, // which is false, until SetDefaultSerializationDeterministic has been called. // Otherwise, SetSerializationDeterministic has been called, and the last // value passed to it is all that matters. void SetSerializationDeterministic(bool value) { serialization_deterministic_is_overridden_ = true; serialization_deterministic_override_ = value; } // See above. Also, note that users of this CodedOutputStream may need to // call IsSerializationDeterministic() to serialize in the intended way. This // CodedOutputStream cannot enforce a desire for deterministic serialization // by itself. bool IsSerializationDeterministic() const { return serialization_deterministic_is_overridden_ ? serialization_deterministic_override_ : IsDefaultSerializationDeterministic(); } static bool IsDefaultSerializationDeterministic() { return google::protobuf::internal::NoBarrier_Load(&default_serialization_deterministic_); } private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedOutputStream); ZeroCopyOutputStream* output_; uint8* buffer_; int buffer_size_; int total_bytes_; // Sum of sizes of all buffers seen so far. bool had_error_; // Whether an error occurred during output. bool aliasing_enabled_; // See EnableAliasing(). // See SetSerializationDeterministic() regarding these three fields. bool serialization_deterministic_is_overridden_; bool serialization_deterministic_override_; // Conceptually, default_serialization_deterministic_ is an atomic bool. // TODO(haberman): replace with std::atomic when we move to C++11. static google::protobuf::internal::AtomicWord default_serialization_deterministic_; // Advance the buffer by a given number of bytes. void Advance(int amount); // Called when the buffer runs out to request more data. Implies an // Advance(buffer_size_). bool Refresh(); // Like WriteRaw() but may avoid copying if the underlying // ZeroCopyOutputStream supports it. void WriteAliasedRaw(const void* buffer, int size); // If this write might cross the end of the buffer, we compose the bytes first // then use WriteRaw(). void WriteVarint32SlowPath(uint32 value); void WriteVarint64SlowPath(uint64 value); // See above. Other projects may use "friend" to allow them to call this. // After SetDefaultSerializationDeterministic() completes, all protocol // buffer serializations will be deterministic by default. Thread safe. // However, the meaning of "after" is subtle here: to be safe, each thread // that wants deterministic serialization by default needs to call // SetDefaultSerializationDeterministic() or ensure on its own that another // thread has done so. friend void ::google::protobuf::internal::MapTestForceDeterministic(); static void SetDefaultSerializationDeterministic() { google::protobuf::internal::NoBarrier_Store(&default_serialization_deterministic_, 1); } }; // inline methods ==================================================== // The vast majority of varints are only one byte. These inline // methods optimize for that case. inline bool CodedInputStream::ReadVarint32(uint32* value) { uint32 v = 0; if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_)) { v = *buffer_; if (v < 0x80) { *value = v; Advance(1); return true; } } int64 result = ReadVarint32Fallback(v); *value = static_cast(result); return result >= 0; } inline bool CodedInputStream::ReadVarint64(uint64* value) { if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && *buffer_ < 0x80) { *value = *buffer_; Advance(1); return true; } std::pair p = ReadVarint64Fallback(); *value = p.first; return p.second; } inline bool CodedInputStream::ReadVarintSizeAsInt(int* value) { if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_)) { int v = *buffer_; if (v < 0x80) { *value = v; Advance(1); return true; } } *value = ReadVarintSizeAsIntFallback(); return *value >= 0; } // static inline const uint8* CodedInputStream::ReadLittleEndian32FromArray( const uint8* buffer, uint32* value) { #if defined(PROTOBUF_LITTLE_ENDIAN) memcpy(value, buffer, sizeof(*value)); return buffer + sizeof(*value); #else *value = (static_cast(buffer[0]) ) | (static_cast(buffer[1]) << 8) | (static_cast(buffer[2]) << 16) | (static_cast(buffer[3]) << 24); return buffer + sizeof(*value); #endif } // static inline const uint8* CodedInputStream::ReadLittleEndian64FromArray( const uint8* buffer, uint64* value) { #if defined(PROTOBUF_LITTLE_ENDIAN) memcpy(value, buffer, sizeof(*value)); return buffer + sizeof(*value); #else uint32 part0 = (static_cast(buffer[0]) ) | (static_cast(buffer[1]) << 8) | (static_cast(buffer[2]) << 16) | (static_cast(buffer[3]) << 24); uint32 part1 = (static_cast(buffer[4]) ) | (static_cast(buffer[5]) << 8) | (static_cast(buffer[6]) << 16) | (static_cast(buffer[7]) << 24); *value = static_cast(part0) | (static_cast(part1) << 32); return buffer + sizeof(*value); #endif } inline bool CodedInputStream::ReadLittleEndian32(uint32* value) { #if defined(PROTOBUF_LITTLE_ENDIAN) if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast(sizeof(*value)))) { buffer_ = ReadLittleEndian32FromArray(buffer_, value); return true; } else { return ReadLittleEndian32Fallback(value); } #else return ReadLittleEndian32Fallback(value); #endif } inline bool CodedInputStream::ReadLittleEndian64(uint64* value) { #if defined(PROTOBUF_LITTLE_ENDIAN) if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast(sizeof(*value)))) { buffer_ = ReadLittleEndian64FromArray(buffer_, value); return true; } else { return ReadLittleEndian64Fallback(value); } #else return ReadLittleEndian64Fallback(value); #endif } inline uint32 CodedInputStream::ReadTagNoLastTag() { uint32 v = 0; if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_)) { v = *buffer_; if (v < 0x80) { Advance(1); return v; } } v = ReadTagFallback(v); return v; } inline std::pair CodedInputStream::ReadTagWithCutoffNoLastTag( uint32 cutoff) { // In performance-sensitive code we can expect cutoff to be a compile-time // constant, and things like "cutoff >= kMax1ByteVarint" to be evaluated at // compile time. uint32 first_byte_or_zero = 0; if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_)) { // Hot case: buffer_ non_empty, buffer_[0] in [1, 128). // TODO(gpike): Is it worth rearranging this? E.g., if the number of fields // is large enough then is it better to check for the two-byte case first? first_byte_or_zero = buffer_[0]; if (static_cast(buffer_[0]) > 0) { const uint32 kMax1ByteVarint = 0x7f; uint32 tag = buffer_[0]; Advance(1); return std::make_pair(tag, cutoff >= kMax1ByteVarint || tag <= cutoff); } // Other hot case: cutoff >= 0x80, buffer_ has at least two bytes available, // and tag is two bytes. The latter is tested by bitwise-and-not of the // first byte and the second byte. if (cutoff >= 0x80 && GOOGLE_PREDICT_TRUE(buffer_ + 1 < buffer_end_) && GOOGLE_PREDICT_TRUE((buffer_[0] & ~buffer_[1]) >= 0x80)) { const uint32 kMax2ByteVarint = (0x7f << 7) + 0x7f; uint32 tag = (1u << 7) * buffer_[1] + (buffer_[0] - 0x80); Advance(2); // It might make sense to test for tag == 0 now, but it is so rare that // that we don't bother. A varint-encoded 0 should be one byte unless // the encoder lost its mind. The second part of the return value of // this function is allowed to be either true or false if the tag is 0, // so we don't have to check for tag == 0. We may need to check whether // it exceeds cutoff. bool at_or_below_cutoff = cutoff >= kMax2ByteVarint || tag <= cutoff; return std::make_pair(tag, at_or_below_cutoff); } } // Slow path const uint32 tag = ReadTagFallback(first_byte_or_zero); return std::make_pair(tag, static_cast(tag - 1) < cutoff); } inline bool CodedInputStream::LastTagWas(uint32 expected) { return last_tag_ == expected; } inline bool CodedInputStream::ConsumedEntireMessage() { return legitimate_message_end_; } inline bool CodedInputStream::ExpectTag(uint32 expected) { if (expected < (1 << 7)) { if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && buffer_[0] == expected) { Advance(1); return true; } else { return false; } } else if (expected < (1 << 14)) { if (GOOGLE_PREDICT_TRUE(BufferSize() >= 2) && buffer_[0] == static_cast(expected | 0x80) && buffer_[1] == static_cast(expected >> 7)) { Advance(2); return true; } else { return false; } } else { // Don't bother optimizing for larger values. return false; } } inline const uint8* CodedInputStream::ExpectTagFromArray( const uint8* buffer, uint32 expected) { if (expected < (1 << 7)) { if (buffer[0] == expected) { return buffer + 1; } } else if (expected < (1 << 14)) { if (buffer[0] == static_cast(expected | 0x80) && buffer[1] == static_cast(expected >> 7)) { return buffer + 2; } } return NULL; } inline void CodedInputStream::GetDirectBufferPointerInline(const void** data, int* size) { *data = buffer_; *size = static_cast(buffer_end_ - buffer_); } inline bool CodedInputStream::ExpectAtEnd() { // If we are at a limit we know no more bytes can be read. Otherwise, it's // hard to say without calling Refresh(), and we'd rather not do that. if (buffer_ == buffer_end_ && ((buffer_size_after_limit_ != 0) || (total_bytes_read_ == current_limit_))) { last_tag_ = 0; // Pretend we called ReadTag()... legitimate_message_end_ = true; // ... and it hit EOF. return true; } else { return false; } } inline int CodedInputStream::CurrentPosition() const { return total_bytes_read_ - (BufferSize() + buffer_size_after_limit_); } inline uint8* CodedOutputStream::GetDirectBufferForNBytesAndAdvance(int size) { if (buffer_size_ < size) { return NULL; } else { uint8* result = buffer_; Advance(size); return result; } } inline uint8* CodedOutputStream::WriteVarint32ToArray(uint32 value, uint8* target) { while (value >= 0x80) { *target = static_cast(value | 0x80); value >>= 7; ++target; } *target = static_cast(value); return target + 1; } inline uint8* CodedOutputStream::WriteVarint64ToArray(uint64 value, uint8* target) { while (value >= 0x80) { *target = static_cast(value | 0x80); value >>= 7; ++target; } *target = static_cast(value); return target + 1; } inline void CodedOutputStream::WriteVarint32SignExtended(int32 value) { WriteVarint64(static_cast(value)); } inline uint8* CodedOutputStream::WriteVarint32SignExtendedToArray( int32 value, uint8* target) { return WriteVarint64ToArray(static_cast(value), target); } inline uint8* CodedOutputStream::WriteLittleEndian32ToArray(uint32 value, uint8* target) { #if defined(PROTOBUF_LITTLE_ENDIAN) memcpy(target, &value, sizeof(value)); #else target[0] = static_cast(value); target[1] = static_cast(value >> 8); target[2] = static_cast(value >> 16); target[3] = static_cast(value >> 24); #endif return target + sizeof(value); } inline uint8* CodedOutputStream::WriteLittleEndian64ToArray(uint64 value, uint8* target) { #if defined(PROTOBUF_LITTLE_ENDIAN) memcpy(target, &value, sizeof(value)); #else uint32 part0 = static_cast(value); uint32 part1 = static_cast(value >> 32); target[0] = static_cast(part0); target[1] = static_cast(part0 >> 8); target[2] = static_cast(part0 >> 16); target[3] = static_cast(part0 >> 24); target[4] = static_cast(part1); target[5] = static_cast(part1 >> 8); target[6] = static_cast(part1 >> 16); target[7] = static_cast(part1 >> 24); #endif return target + sizeof(value); } inline void CodedOutputStream::WriteVarint32(uint32 value) { if (buffer_size_ >= 5) { // Fast path: We have enough bytes left in the buffer to guarantee that // this write won't cross the end, so we can skip the checks. uint8* target = buffer_; uint8* end = WriteVarint32ToArray(value, target); int size = static_cast(end - target); Advance(size); } else { WriteVarint32SlowPath(value); } } inline void CodedOutputStream::WriteVarint64(uint64 value) { if (buffer_size_ >= 10) { // Fast path: We have enough bytes left in the buffer to guarantee that // this write won't cross the end, so we can skip the checks. uint8* target = buffer_; uint8* end = WriteVarint64ToArray(value, target); int size = static_cast(end - target); Advance(size); } else { WriteVarint64SlowPath(value); } } inline void CodedOutputStream::WriteTag(uint32 value) { WriteVarint32(value); } inline uint8* CodedOutputStream::WriteTagToArray( uint32 value, uint8* target) { return WriteVarint32ToArray(value, target); } inline size_t CodedOutputStream::VarintSize32(uint32 value) { // 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 log2value = Bits::Log2FloorNonZero(value | 0x1); return static_cast((log2value * 9 + 73) / 64); } inline size_t CodedOutputStream::VarintSize64(uint64 value) { // 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 log2value = Bits::Log2FloorNonZero64(value | 0x1); return static_cast((log2value * 9 + 73) / 64); } inline size_t CodedOutputStream::VarintSize32SignExtended(int32 value) { if (value < 0) { return 10; // TODO(kenton): Make this a symbolic constant. } else { return VarintSize32(static_cast(value)); } } inline void CodedOutputStream::WriteString(const string& str) { WriteRaw(str.data(), static_cast(str.size())); } inline void CodedOutputStream::WriteRawMaybeAliased( const void* data, int size) { if (aliasing_enabled_) { WriteAliasedRaw(data, size); } else { WriteRaw(data, size); } } inline uint8* CodedOutputStream::WriteStringToArray( const string& str, uint8* target) { return WriteRawToArray(str.data(), static_cast(str.size()), target); } inline int CodedOutputStream::ByteCount() const { return total_bytes_ - buffer_size_; } inline void CodedInputStream::Advance(int amount) { buffer_ += amount; } inline void CodedOutputStream::Advance(int amount) { buffer_ += amount; buffer_size_ -= amount; } inline void CodedInputStream::SetRecursionLimit(int limit) { recursion_budget_ += limit - recursion_limit_; recursion_limit_ = limit; } inline bool CodedInputStream::IncrementRecursionDepth() { --recursion_budget_; return recursion_budget_ >= 0; } inline void CodedInputStream::DecrementRecursionDepth() { if (recursion_budget_ < recursion_limit_) ++recursion_budget_; } inline void CodedInputStream::UnsafeDecrementRecursionDepth() { assert(recursion_budget_ < recursion_limit_); ++recursion_budget_; } inline void CodedInputStream::SetExtensionRegistry(const DescriptorPool* pool, MessageFactory* factory) { extension_pool_ = pool; extension_factory_ = factory; } inline const DescriptorPool* CodedInputStream::GetExtensionPool() { return extension_pool_; } inline MessageFactory* CodedInputStream::GetExtensionFactory() { return extension_factory_; } inline int CodedInputStream::BufferSize() const { return static_cast(buffer_end_ - buffer_); } inline CodedInputStream::CodedInputStream(ZeroCopyInputStream* input) : buffer_(NULL), buffer_end_(NULL), input_(input), total_bytes_read_(0), overflow_bytes_(0), last_tag_(0), legitimate_message_end_(false), aliasing_enabled_(false), current_limit_(kint32max), buffer_size_after_limit_(0), total_bytes_limit_(kDefaultTotalBytesLimit), recursion_budget_(default_recursion_limit_), recursion_limit_(default_recursion_limit_), disable_strict_correctness_enforcement_(true), extension_pool_(NULL), extension_factory_(NULL) { // Eagerly Refresh() so buffer space is immediately available. Refresh(); } inline CodedInputStream::CodedInputStream(const uint8* buffer, int size) : buffer_(buffer), buffer_end_(buffer + size), input_(NULL), total_bytes_read_(size), overflow_bytes_(0), last_tag_(0), legitimate_message_end_(false), aliasing_enabled_(false), current_limit_(size), buffer_size_after_limit_(0), total_bytes_limit_(kDefaultTotalBytesLimit), recursion_budget_(default_recursion_limit_), recursion_limit_(default_recursion_limit_), disable_strict_correctness_enforcement_(true), extension_pool_(NULL), extension_factory_(NULL) { // Note that setting current_limit_ == size is important to prevent some // code paths from trying to access input_ and segfaulting. } inline bool CodedInputStream::IsFlat() const { return input_ == NULL; } inline bool CodedInputStream::Skip(int count) { if (count < 0) return false; // security: count is often user-supplied const int original_buffer_size = BufferSize(); if (count <= original_buffer_size) { // Just skipping within the current buffer. Easy. Advance(count); return true; } return SkipFallback(count, original_buffer_size); } } // namespace io } // namespace protobuf #if defined(_MSC_VER) && _MSC_VER >= 1300 && !defined(__INTEL_COMPILER) #pragma runtime_checks("c", restore) #endif // _MSC_VER && !defined(__INTEL_COMPILER) } // namespace google #endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/coded_stream_inl.h000066400000000000000000000070041334102242000313450ustar00rootroot00000000000000// 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: jasonh@google.com (Jason Hsueh) // // Implements methods of coded_stream.h that need to be inlined for performance // reasons, but should not be defined in a public header. #ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__ #define GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__ #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { inline bool CodedInputStream::InternalReadStringInline(string* buffer, int size) { if (size < 0) return false; // security: size is often user-supplied if (BufferSize() >= size) { STLStringResizeUninitialized(buffer, size); std::pair z = as_string_data(buffer); if (z.second) { // Oddly enough, memcpy() requires its first two args to be non-NULL even // if we copy 0 bytes. So, we have ensured that z.first is non-NULL here. GOOGLE_DCHECK(z.first != NULL); memcpy(z.first, buffer_, size); Advance(size); } return true; } return ReadStringFallback(buffer, size); } inline bool CodedInputStream::InternalReadRawInline(void* buffer, int size) { int current_buffer_size; while ((current_buffer_size = BufferSize()) < size) { // Reading past end of buffer. Copy what we have, then refresh. memcpy(buffer, buffer_, current_buffer_size); buffer = reinterpret_cast(buffer) + current_buffer_size; size -= current_buffer_size; Advance(current_buffer_size); if (!Refresh()) return false; } memcpy(buffer, buffer_, size); Advance(size); return true; } } // namespace io } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc000066400000000000000000001400431334102242000326010ustar00rootroot00000000000000// 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. // // This file contains tests and benchmarks. #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include // This declares an unsigned long long integer literal in a portable way. // (The original macro is way too big and ruins my formatting.) #undef ULL #define ULL(x) GOOGLE_ULONGLONG(x) namespace google { namespace protobuf { namespace io { namespace { // =================================================================== // Data-Driven Test Infrastructure // TEST_1D and TEST_2D are macros I'd eventually like to see added to // gTest. These macros can be used to declare tests which should be // 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: // // int kCases[] = {1, 2, 3, 4} // TEST_1D(MyFixture, MyTest, kCases) { // EXPECT_GT(kCases_case, 0); // } // // This test iterates through the numbers 1, 2, 3, and 4 and tests that // they are all grater than zero. In case of failure, the exact case // which failed will be printed. The case type must be printable using // ostream::operator<<. // TODO(kenton): gTest now supports "parameterized tests" which would be // a better way to accomplish this. Rewrite when time permits. #define TEST_1D(FIXTURE, NAME, CASES) \ class FIXTURE##_##NAME##_DD : public FIXTURE { \ protected: \ template \ void DoSingleCase(const CaseType& CASES##_case); \ }; \ \ TEST_F(FIXTURE##_##NAME##_DD, NAME) { \ for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) { \ SCOPED_TRACE(testing::Message() \ << #CASES " case #" << i << ": " << CASES[i]); \ DoSingleCase(CASES[i]); \ } \ } \ \ template \ void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType& CASES##_case) #define TEST_2D(FIXTURE, NAME, CASES1, CASES2) \ class FIXTURE##_##NAME##_DD : public FIXTURE { \ protected: \ template \ void DoSingleCase(const CaseType1& CASES1##_case, \ const CaseType2& CASES2##_case); \ }; \ \ TEST_F(FIXTURE##_##NAME##_DD, NAME) { \ for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) { \ for (int j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) { \ SCOPED_TRACE(testing::Message() \ << #CASES1 " case #" << i << ": " << CASES1[i] << ", " \ << #CASES2 " case #" << j << ": " << CASES2[j]); \ DoSingleCase(CASES1[i], CASES2[j]); \ } \ } \ } \ \ template \ void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType1& CASES1##_case, \ const CaseType2& CASES2##_case) // =================================================================== class CodedStreamTest : public testing::Test { protected: // Helper method used by tests for bytes warning. See implementation comment // for further information. static void SetupTotalBytesLimitWarningTest( int total_bytes_limit, int warning_threshold, std::vector* out_errors, std::vector* out_warnings); // Buffer used during most of the tests. This assumes tests run sequentially. static const int kBufferSize = 1024 * 64; static uint8 buffer_[kBufferSize]; }; uint8 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 // where they don't, and cases where there is so much buffer left that // we can use special optimized paths that don't worry about bounds // checks. const int kBlockSizes[] = {1, 2, 3, 5, 7, 13, 32, 1024}; // ------------------------------------------------------------------- // Varint tests. struct VarintCase { uint8 bytes[10]; // Encoded bytes. int size; // Encoded size, in bytes. uint64 value; // Parsed value. }; inline std::ostream& operator<<(std::ostream& os, const VarintCase& c) { return os << c.value; } VarintCase kVarintCases[] = { // 32-bit values {{0x00} , 1, 0}, {{0x01} , 1, 1}, {{0x7f} , 1, 127}, {{0xa2, 0x74}, 2, (0x22 << 0) | (0x74 << 7)}, // 14882 {{0xbe, 0xf7, 0x92, 0x84, 0x0b}, 5, // 2961488830 (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | (ULL(0x0b) << 28)}, // 64-bit {{0xbe, 0xf7, 0x92, 0x84, 0x1b}, 5, // 7256456126 (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | (ULL(0x1b) << 28)}, {{0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49}, 8, // 41256202580718336 (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) | (ULL(0x43) << 28) | (ULL(0x49) << 35) | (ULL(0x24) << 42) | (ULL(0x49) << 49)}, // 11964378330978735131 {{0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01}, 10, (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) | (ULL(0x3b) << 28) | (ULL(0x56) << 35) | (ULL(0x00) << 42) | (ULL(0x05) << 49) | (ULL(0x26) << 56) | (ULL(0x01) << 63)}, }; TEST_2D(CodedStreamTest, ReadVarint32, kVarintCases, kBlockSizes) { memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size); ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); uint32 value; EXPECT_TRUE(coded_input.ReadVarint32(&value)); EXPECT_EQ(static_cast(kVarintCases_case.value), value); } EXPECT_EQ(kVarintCases_case.size, input.ByteCount()); } TEST_2D(CodedStreamTest, ReadTag, kVarintCases, kBlockSizes) { memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size); ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); uint32 expected_value = static_cast(kVarintCases_case.value); EXPECT_EQ(expected_value, coded_input.ReadTag()); EXPECT_TRUE(coded_input.LastTagWas(expected_value)); EXPECT_FALSE(coded_input.LastTagWas(expected_value + 1)); } EXPECT_EQ(kVarintCases_case.size, input.ByteCount()); } // This is the regression test that verifies that there is no issues // with the empty input buffers handling. TEST_F(CodedStreamTest, EmptyInputBeforeEos) { class In : public ZeroCopyInputStream { public: In() : count_(0) {} private: virtual bool Next(const void** data, int* size) { *data = NULL; *size = 0; return count_++ < 2; } virtual void BackUp(int count) { GOOGLE_LOG(FATAL) << "Tests never call this."; } virtual bool Skip(int count) { GOOGLE_LOG(FATAL) << "Tests never call this."; return false; } virtual int64 ByteCount() const { return 0; } int count_; } in; CodedInputStream input(&in); input.ReadTagNoLastTag(); EXPECT_TRUE(input.ConsumedEntireMessage()); } TEST_1D(CodedStreamTest, ExpectTag, kVarintCases) { // Leave one byte at the beginning of the buffer so we can read it // to force the first buffer to be loaded. buffer_[0] = '\0'; memcpy(buffer_ + 1, kVarintCases_case.bytes, kVarintCases_case.size); ArrayInputStream input(buffer_, sizeof(buffer_)); { CodedInputStream coded_input(&input); // Read one byte to force coded_input.Refill() to be called. Otherwise, // ExpectTag() will return a false negative. uint8 dummy; coded_input.ReadRaw(&dummy, 1); EXPECT_EQ((uint)'\0', (uint)dummy); uint32 expected_value = static_cast(kVarintCases_case.value); // ExpectTag() produces false negatives for large values. if (kVarintCases_case.size <= 2) { EXPECT_FALSE(coded_input.ExpectTag(expected_value + 1)); EXPECT_TRUE(coded_input.ExpectTag(expected_value)); } else { EXPECT_FALSE(coded_input.ExpectTag(expected_value)); } } if (kVarintCases_case.size <= 2) { EXPECT_EQ(kVarintCases_case.size + 1, input.ByteCount()); } else { EXPECT_EQ(1, input.ByteCount()); } } TEST_1D(CodedStreamTest, ExpectTagFromArray, kVarintCases) { memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size); const uint32 expected_value = static_cast(kVarintCases_case.value); // If the expectation succeeds, it should return a pointer past the tag. if (kVarintCases_case.size <= 2) { EXPECT_TRUE(NULL == CodedInputStream::ExpectTagFromArray(buffer_, expected_value + 1)); EXPECT_TRUE(buffer_ + kVarintCases_case.size == CodedInputStream::ExpectTagFromArray(buffer_, expected_value)); } else { EXPECT_TRUE(NULL == CodedInputStream::ExpectTagFromArray(buffer_, expected_value)); } } TEST_2D(CodedStreamTest, ReadVarint64, kVarintCases, kBlockSizes) { memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size); ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); uint64 value; EXPECT_TRUE(coded_input.ReadVarint64(&value)); EXPECT_EQ(kVarintCases_case.value, value); } EXPECT_EQ(kVarintCases_case.size, input.ByteCount()); } TEST_2D(CodedStreamTest, WriteVarint32, kVarintCases, kBlockSizes) { if (kVarintCases_case.value > ULL(0x00000000FFFFFFFF)) { // Skip this test for the 64-bit values. return; } ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedOutputStream coded_output(&output); coded_output.WriteVarint32(static_cast(kVarintCases_case.value)); EXPECT_FALSE(coded_output.HadError()); EXPECT_EQ(kVarintCases_case.size, coded_output.ByteCount()); } EXPECT_EQ(kVarintCases_case.size, output.ByteCount()); EXPECT_EQ(0, memcmp(buffer_, kVarintCases_case.bytes, kVarintCases_case.size)); } TEST_2D(CodedStreamTest, WriteVarint64, kVarintCases, kBlockSizes) { ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedOutputStream coded_output(&output); coded_output.WriteVarint64(kVarintCases_case.value); EXPECT_FALSE(coded_output.HadError()); EXPECT_EQ(kVarintCases_case.size, coded_output.ByteCount()); } EXPECT_EQ(kVarintCases_case.size, output.ByteCount()); EXPECT_EQ(0, memcmp(buffer_, kVarintCases_case.bytes, kVarintCases_case.size)); } // This test causes gcc 3.3.5 (and earlier?) to give the cryptic error: // "sorry, unimplemented: `method_call_expr' not supported by dump_expr" #if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3) int32 kSignExtendedVarintCases[] = { 0, 1, -1, 1237894, -37895138 }; TEST_2D(CodedStreamTest, WriteVarint32SignExtended, kSignExtendedVarintCases, kBlockSizes) { ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedOutputStream coded_output(&output); coded_output.WriteVarint32SignExtended(kSignExtendedVarintCases_case); EXPECT_FALSE(coded_output.HadError()); if (kSignExtendedVarintCases_case < 0) { EXPECT_EQ(10, coded_output.ByteCount()); } else { EXPECT_LE(coded_output.ByteCount(), 5); } } if (kSignExtendedVarintCases_case < 0) { EXPECT_EQ(10, output.ByteCount()); } else { EXPECT_LE(output.ByteCount(), 5); } // Read value back in as a varint64 and insure it matches. ArrayInputStream input(buffer_, sizeof(buffer_)); { CodedInputStream coded_input(&input); uint64 value; EXPECT_TRUE(coded_input.ReadVarint64(&value)); EXPECT_EQ(kSignExtendedVarintCases_case, static_cast(value)); } EXPECT_EQ(output.ByteCount(), input.ByteCount()); } #endif // ------------------------------------------------------------------- // Varint failure test. struct VarintErrorCase { uint8 bytes[12]; int size; bool can_parse; }; inline std::ostream& operator<<(std::ostream& os, const VarintErrorCase& c) { return os << "size " << c.size; } const VarintErrorCase kVarintErrorCases[] = { // Control case. (Insures that there isn't something else wrong that // makes parsing always fail.) {{0x00}, 1, true}, // No input data. {{}, 0, false}, // Input ends unexpectedly. {{0xf0, 0xab}, 2, false}, // Input ends unexpectedly after 32 bits. {{0xf0, 0xab, 0xc9, 0x9a, 0xf8, 0xb2}, 6, false}, // Longer than 10 bytes. {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01}, 11, false}, }; TEST_2D(CodedStreamTest, ReadVarint32Error, kVarintErrorCases, kBlockSizes) { memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size); ArrayInputStream input(buffer_, kVarintErrorCases_case.size, kBlockSizes_case); CodedInputStream coded_input(&input); uint32 value; EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint32(&value)); } TEST_2D(CodedStreamTest, ReadVarint32Error_LeavesValueInInitializedState, kVarintErrorCases, kBlockSizes) { memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size); ArrayInputStream input(buffer_, kVarintErrorCases_case.size, kBlockSizes_case); CodedInputStream coded_input(&input); uint32 value = 0; EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint32(&value)); // While the specific value following a failure is not critical, we do want to // ensure that it doesn't get set to an uninitialized value. (This check fails // in MSAN mode if value has been set to an uninitialized value.) EXPECT_EQ(value, value); } TEST_2D(CodedStreamTest, ReadVarint64Error, kVarintErrorCases, kBlockSizes) { memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size); ArrayInputStream input(buffer_, kVarintErrorCases_case.size, kBlockSizes_case); CodedInputStream coded_input(&input); uint64 value; EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint64(&value)); } TEST_2D(CodedStreamTest, ReadVarint64Error_LeavesValueInInitializedState, kVarintErrorCases, kBlockSizes) { memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size); ArrayInputStream input(buffer_, kVarintErrorCases_case.size, kBlockSizes_case); CodedInputStream coded_input(&input); uint64 value = 0; EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint64(&value)); // While the specific value following a failure is not critical, we do want to // ensure that it doesn't get set to an uninitialized value. (This check fails // in MSAN mode if value has been set to an uninitialized value.) EXPECT_EQ(value, value); } // ------------------------------------------------------------------- // VarintSize struct VarintSizeCase { uint64 value; int size; }; inline std::ostream& operator<<(std::ostream& os, const VarintSizeCase& c) { return os << c.value; } VarintSizeCase kVarintSizeCases[] = { {0u, 1}, {1u, 1}, {127u, 1}, {128u, 2}, {758923u, 3}, {4000000000u, 5}, {ULL(41256202580718336), 8}, {ULL(11964378330978735131), 10}, }; TEST_1D(CodedStreamTest, VarintSize32, kVarintSizeCases) { if (kVarintSizeCases_case.value > 0xffffffffu) { // Skip 64-bit values. return; } EXPECT_EQ(kVarintSizeCases_case.size, CodedOutputStream::VarintSize32( static_cast(kVarintSizeCases_case.value))); } TEST_1D(CodedStreamTest, VarintSize64, kVarintSizeCases) { EXPECT_EQ(kVarintSizeCases_case.size, CodedOutputStream::VarintSize64(kVarintSizeCases_case.value)); } TEST_F(CodedStreamTest, VarintSize32PowersOfTwo) { int expected = 1; for (int i = 1; i < 32; i++) { if (i % 7 == 0) { expected += 1; } EXPECT_EQ(expected, CodedOutputStream::VarintSize32(static_cast(0x1u << i))); } } TEST_F(CodedStreamTest, VarintSize64PowersOfTwo) { int expected = 1; for (int i = 1; i < 64; i++) { if (i % 7 == 0) { expected += 1; } EXPECT_EQ(expected, CodedOutputStream::VarintSize64( static_cast(0x1ull << i))); } } // ------------------------------------------------------------------- // Fixed-size int tests struct Fixed32Case { uint8 bytes[sizeof(uint32)]; // Encoded bytes. uint32 value; // Parsed value. }; struct Fixed64Case { uint8 bytes[sizeof(uint64)]; // Encoded bytes. uint64 value; // Parsed value. }; inline std::ostream& operator<<(std::ostream& os, const Fixed32Case& c) { return os << "0x" << std::hex << c.value << std::dec; } inline std::ostream& operator<<(std::ostream& os, const Fixed64Case& c) { return os << "0x" << std::hex << c.value << std::dec; } Fixed32Case kFixed32Cases[] = { {{0xef, 0xcd, 0xab, 0x90}, 0x90abcdefu}, {{0x12, 0x34, 0x56, 0x78}, 0x78563412u}, }; Fixed64Case kFixed64Cases[] = { {{0xef, 0xcd, 0xab, 0x90, 0x12, 0x34, 0x56, 0x78}, ULL(0x7856341290abcdef)}, {{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}, ULL(0x8877665544332211)}, }; TEST_2D(CodedStreamTest, ReadLittleEndian32, kFixed32Cases, kBlockSizes) { memcpy(buffer_, kFixed32Cases_case.bytes, sizeof(kFixed32Cases_case.bytes)); ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); uint32 value; EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); EXPECT_EQ(kFixed32Cases_case.value, value); } EXPECT_EQ(sizeof(uint32), input.ByteCount()); } TEST_2D(CodedStreamTest, ReadLittleEndian64, kFixed64Cases, kBlockSizes) { memcpy(buffer_, kFixed64Cases_case.bytes, sizeof(kFixed64Cases_case.bytes)); ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); uint64 value; EXPECT_TRUE(coded_input.ReadLittleEndian64(&value)); EXPECT_EQ(kFixed64Cases_case.value, value); } EXPECT_EQ(sizeof(uint64), input.ByteCount()); } TEST_2D(CodedStreamTest, WriteLittleEndian32, kFixed32Cases, kBlockSizes) { ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedOutputStream coded_output(&output); coded_output.WriteLittleEndian32(kFixed32Cases_case.value); EXPECT_FALSE(coded_output.HadError()); EXPECT_EQ(sizeof(uint32), coded_output.ByteCount()); } EXPECT_EQ(sizeof(uint32), output.ByteCount()); EXPECT_EQ(0, memcmp(buffer_, kFixed32Cases_case.bytes, sizeof(uint32))); } TEST_2D(CodedStreamTest, WriteLittleEndian64, kFixed64Cases, kBlockSizes) { ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedOutputStream coded_output(&output); coded_output.WriteLittleEndian64(kFixed64Cases_case.value); EXPECT_FALSE(coded_output.HadError()); EXPECT_EQ(sizeof(uint64), coded_output.ByteCount()); } EXPECT_EQ(sizeof(uint64), output.ByteCount()); EXPECT_EQ(0, memcmp(buffer_, kFixed64Cases_case.bytes, sizeof(uint64))); } // Tests using the static methods to read fixed-size values from raw arrays. TEST_1D(CodedStreamTest, ReadLittleEndian32FromArray, kFixed32Cases) { memcpy(buffer_, kFixed32Cases_case.bytes, sizeof(kFixed32Cases_case.bytes)); uint32 value; const uint8* end = CodedInputStream::ReadLittleEndian32FromArray( buffer_, &value); EXPECT_EQ(kFixed32Cases_case.value, value); EXPECT_TRUE(end == buffer_ + sizeof(value)); } TEST_1D(CodedStreamTest, ReadLittleEndian64FromArray, kFixed64Cases) { memcpy(buffer_, kFixed64Cases_case.bytes, sizeof(kFixed64Cases_case.bytes)); uint64 value; const uint8* end = CodedInputStream::ReadLittleEndian64FromArray( buffer_, &value); EXPECT_EQ(kFixed64Cases_case.value, value); EXPECT_TRUE(end == buffer_ + sizeof(value)); } // ------------------------------------------------------------------- // Raw reads and writes const char kRawBytes[] = "Some bytes which will be written and read raw."; TEST_1D(CodedStreamTest, ReadRaw, kBlockSizes) { memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); char read_buffer[sizeof(kRawBytes)]; { CodedInputStream coded_input(&input); EXPECT_TRUE(coded_input.ReadRaw(read_buffer, sizeof(kRawBytes))); EXPECT_EQ(0, memcmp(kRawBytes, read_buffer, sizeof(kRawBytes))); } EXPECT_EQ(sizeof(kRawBytes), input.ByteCount()); } TEST_1D(CodedStreamTest, WriteRaw, kBlockSizes) { ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedOutputStream coded_output(&output); coded_output.WriteRaw(kRawBytes, sizeof(kRawBytes)); EXPECT_FALSE(coded_output.HadError()); EXPECT_EQ(sizeof(kRawBytes), coded_output.ByteCount()); } EXPECT_EQ(sizeof(kRawBytes), output.ByteCount()); EXPECT_EQ(0, memcmp(buffer_, kRawBytes, sizeof(kRawBytes))); } TEST_1D(CodedStreamTest, ReadString, kBlockSizes) { memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); string str; EXPECT_TRUE(coded_input.ReadString(&str, strlen(kRawBytes))); EXPECT_EQ(kRawBytes, str); } EXPECT_EQ(strlen(kRawBytes), input.ByteCount()); } // Check to make sure ReadString doesn't crash on impossibly large strings. TEST_1D(CodedStreamTest, ReadStringImpossiblyLarge, kBlockSizes) { ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); string str; // Try to read a gigabyte. EXPECT_FALSE(coded_input.ReadString(&str, 1 << 30)); } } TEST_F(CodedStreamTest, ReadStringImpossiblyLargeFromStringOnStack) { // Same test as above, except directly use a buffer. This used to cause // crashes while the above did not. uint8 buffer[8]; CodedInputStream coded_input(buffer, 8); string str; EXPECT_FALSE(coded_input.ReadString(&str, 1 << 30)); } TEST_F(CodedStreamTest, ReadStringImpossiblyLargeFromStringOnHeap) { google::protobuf::scoped_array buffer(new uint8[8]); CodedInputStream coded_input(buffer.get(), 8); string str; EXPECT_FALSE(coded_input.ReadString(&str, 1 << 30)); } TEST_1D(CodedStreamTest, ReadStringReservesMemoryOnTotalLimit, kBlockSizes) { memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); coded_input.SetTotalBytesLimit(sizeof(kRawBytes), sizeof(kRawBytes)); EXPECT_EQ(sizeof(kRawBytes), coded_input.BytesUntilTotalBytesLimit()); string str; EXPECT_TRUE(coded_input.ReadString(&str, strlen(kRawBytes))); EXPECT_EQ(sizeof(kRawBytes) - strlen(kRawBytes), coded_input.BytesUntilTotalBytesLimit()); EXPECT_EQ(kRawBytes, str); // TODO(liujisi): Replace with a more meaningful test (see cl/60966023). EXPECT_GE(str.capacity(), strlen(kRawBytes)); } EXPECT_EQ(strlen(kRawBytes), input.ByteCount()); } TEST_1D(CodedStreamTest, ReadStringReservesMemoryOnPushedLimit, kBlockSizes) { memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); coded_input.PushLimit(sizeof(buffer_)); string str; EXPECT_TRUE(coded_input.ReadString(&str, strlen(kRawBytes))); EXPECT_EQ(kRawBytes, str); // TODO(liujisi): Replace with a more meaningful test (see cl/60966023). EXPECT_GE(str.capacity(), strlen(kRawBytes)); } EXPECT_EQ(strlen(kRawBytes), input.ByteCount()); } TEST_F(CodedStreamTest, ReadStringNoReservationIfLimitsNotSet) { memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); // Buffer size in the input must be smaller than sizeof(kRawBytes), // otherwise check against capacity will fail as ReadStringInline() // will handle the reading and will reserve the memory as needed. ArrayInputStream input(buffer_, sizeof(buffer_), 32); { CodedInputStream coded_input(&input); string str; EXPECT_TRUE(coded_input.ReadString(&str, strlen(kRawBytes))); EXPECT_EQ(kRawBytes, str); // Note: this check depends on string class implementation. It // expects that string will allocate more than strlen(kRawBytes) // if the content of kRawBytes is appended to string in small // chunks. // TODO(liujisi): Replace with a more meaningful test (see cl/60966023). EXPECT_GE(str.capacity(), strlen(kRawBytes)); } EXPECT_EQ(strlen(kRawBytes), input.ByteCount()); } TEST_F(CodedStreamTest, ReadStringNoReservationSizeIsNegative) { memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); // Buffer size in the input must be smaller than sizeof(kRawBytes), // otherwise check against capacity will fail as ReadStringInline() // will handle the reading and will reserve the memory as needed. ArrayInputStream input(buffer_, sizeof(buffer_), 32); { CodedInputStream coded_input(&input); coded_input.PushLimit(sizeof(buffer_)); string str; EXPECT_FALSE(coded_input.ReadString(&str, -1)); // Note: this check depends on string class implementation. It // expects that string will always allocate the same amount of // memory for an empty string. EXPECT_EQ(string().capacity(), str.capacity()); } } TEST_F(CodedStreamTest, ReadStringNoReservationSizeIsLarge) { memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); // Buffer size in the input must be smaller than sizeof(kRawBytes), // otherwise check against capacity will fail as ReadStringInline() // will handle the reading and will reserve the memory as needed. ArrayInputStream input(buffer_, sizeof(buffer_), 32); { CodedInputStream coded_input(&input); coded_input.PushLimit(sizeof(buffer_)); string str; EXPECT_FALSE(coded_input.ReadString(&str, 1 << 30)); EXPECT_GT(1 << 30, str.capacity()); } } TEST_F(CodedStreamTest, ReadStringNoReservationSizeIsOverTheLimit) { memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); // Buffer size in the input must be smaller than sizeof(kRawBytes), // otherwise check against capacity will fail as ReadStringInline() // will handle the reading and will reserve the memory as needed. ArrayInputStream input(buffer_, sizeof(buffer_), 32); { CodedInputStream coded_input(&input); coded_input.PushLimit(16); string str; EXPECT_FALSE(coded_input.ReadString(&str, strlen(kRawBytes))); // Note: this check depends on string class implementation. It // expects that string will allocate less than strlen(kRawBytes) // for an empty string. EXPECT_GT(strlen(kRawBytes), str.capacity()); } } TEST_F(CodedStreamTest, ReadStringNoReservationSizeIsOverTheTotalBytesLimit) { memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); // Buffer size in the input must be smaller than sizeof(kRawBytes), // otherwise check against capacity will fail as ReadStringInline() // will handle the reading and will reserve the memory as needed. ArrayInputStream input(buffer_, sizeof(buffer_), 32); { CodedInputStream coded_input(&input); coded_input.SetTotalBytesLimit(16, 16); string str; EXPECT_FALSE(coded_input.ReadString(&str, strlen(kRawBytes))); // Note: this check depends on string class implementation. It // expects that string will allocate less than strlen(kRawBytes) // for an empty string. EXPECT_GT(strlen(kRawBytes), str.capacity()); } } TEST_F(CodedStreamTest, ReadStringNoReservationSizeIsOverTheClosestLimit_GlobalLimitIsCloser) { memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); // Buffer size in the input must be smaller than sizeof(kRawBytes), // otherwise check against capacity will fail as ReadStringInline() // will handle the reading and will reserve the memory as needed. ArrayInputStream input(buffer_, sizeof(buffer_), 32); { CodedInputStream coded_input(&input); coded_input.PushLimit(sizeof(buffer_)); coded_input.SetTotalBytesLimit(16, 16); string str; EXPECT_FALSE(coded_input.ReadString(&str, strlen(kRawBytes))); // Note: this check depends on string class implementation. It // expects that string will allocate less than strlen(kRawBytes) // for an empty string. EXPECT_GT(strlen(kRawBytes), str.capacity()); } } TEST_F(CodedStreamTest, ReadStringNoReservationSizeIsOverTheClosestLimit_LocalLimitIsCloser) { memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); // Buffer size in the input must be smaller than sizeof(kRawBytes), // otherwise check against capacity will fail as ReadStringInline() // will handle the reading and will reserve the memory as needed. ArrayInputStream input(buffer_, sizeof(buffer_), 32); { CodedInputStream coded_input(&input); coded_input.PushLimit(16); coded_input.SetTotalBytesLimit(sizeof(buffer_), sizeof(buffer_)); EXPECT_EQ(sizeof(buffer_), coded_input.BytesUntilTotalBytesLimit()); string str; EXPECT_FALSE(coded_input.ReadString(&str, strlen(kRawBytes))); // Note: this check depends on string class implementation. It // expects that string will allocate less than strlen(kRawBytes) // for an empty string. EXPECT_GT(strlen(kRawBytes), str.capacity()); } } // ------------------------------------------------------------------- // Skip const char kSkipTestBytes[] = ""; TEST_1D(CodedStreamTest, SkipInput, kBlockSizes) { memcpy(buffer_, kSkipTestBytes, sizeof(kSkipTestBytes)); ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); string str; EXPECT_TRUE(coded_input.ReadString(&str, strlen(""))); EXPECT_EQ("", str); EXPECT_TRUE(coded_input.Skip(strlen(""))); EXPECT_TRUE(coded_input.ReadString(&str, strlen(""))); EXPECT_EQ("", str); } EXPECT_EQ(strlen(kSkipTestBytes), input.ByteCount()); } // ------------------------------------------------------------------- // GetDirectBufferPointer TEST_F(CodedStreamTest, GetDirectBufferPointerInput) { ArrayInputStream input(buffer_, sizeof(buffer_), 8); CodedInputStream coded_input(&input); const void* ptr; int size; EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size)); EXPECT_EQ(buffer_, ptr); EXPECT_EQ(8, size); // Peeking again should return the same pointer. EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size)); EXPECT_EQ(buffer_, ptr); EXPECT_EQ(8, size); // Skip forward in the same buffer then peek again. EXPECT_TRUE(coded_input.Skip(3)); EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size)); EXPECT_EQ(buffer_ + 3, ptr); EXPECT_EQ(5, size); // Skip to end of buffer and peek -- should get next buffer. EXPECT_TRUE(coded_input.Skip(5)); EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size)); EXPECT_EQ(buffer_ + 8, ptr); EXPECT_EQ(8, size); } TEST_F(CodedStreamTest, GetDirectBufferPointerInlineInput) { ArrayInputStream input(buffer_, sizeof(buffer_), 8); CodedInputStream coded_input(&input); const void* ptr; int size; coded_input.GetDirectBufferPointerInline(&ptr, &size); EXPECT_EQ(buffer_, ptr); EXPECT_EQ(8, size); // Peeking again should return the same pointer. coded_input.GetDirectBufferPointerInline(&ptr, &size); EXPECT_EQ(buffer_, ptr); EXPECT_EQ(8, size); // Skip forward in the same buffer then peek again. EXPECT_TRUE(coded_input.Skip(3)); coded_input.GetDirectBufferPointerInline(&ptr, &size); EXPECT_EQ(buffer_ + 3, ptr); EXPECT_EQ(5, size); // Skip to end of buffer and peek -- should return false and provide an empty // buffer. It does not try to Refresh(). EXPECT_TRUE(coded_input.Skip(5)); coded_input.GetDirectBufferPointerInline(&ptr, &size); EXPECT_EQ(buffer_ + 8, ptr); EXPECT_EQ(0, size); } TEST_F(CodedStreamTest, GetDirectBufferPointerOutput) { ArrayOutputStream output(buffer_, sizeof(buffer_), 8); CodedOutputStream coded_output(&output); void* ptr; int size; EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size)); EXPECT_EQ(buffer_, ptr); EXPECT_EQ(8, size); // Peeking again should return the same pointer. EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size)); EXPECT_EQ(buffer_, ptr); EXPECT_EQ(8, size); // Skip forward in the same buffer then peek again. EXPECT_TRUE(coded_output.Skip(3)); EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size)); EXPECT_EQ(buffer_ + 3, ptr); EXPECT_EQ(5, size); // Skip to end of buffer and peek -- should get next buffer. EXPECT_TRUE(coded_output.Skip(5)); EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size)); EXPECT_EQ(buffer_ + 8, ptr); EXPECT_EQ(8, size); // Skip over multiple buffers. EXPECT_TRUE(coded_output.Skip(22)); EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size)); EXPECT_EQ(buffer_ + 30, ptr); EXPECT_EQ(2, size); } // ------------------------------------------------------------------- // Limits TEST_1D(CodedStreamTest, BasicLimit, kBlockSizes) { ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); EXPECT_EQ(-1, coded_input.BytesUntilLimit()); CodedInputStream::Limit limit = coded_input.PushLimit(8); // Read until we hit the limit. uint32 value; EXPECT_EQ(8, coded_input.BytesUntilLimit()); EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); EXPECT_EQ(4, coded_input.BytesUntilLimit()); EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); EXPECT_EQ(0, coded_input.BytesUntilLimit()); EXPECT_FALSE(coded_input.ReadLittleEndian32(&value)); EXPECT_EQ(0, coded_input.BytesUntilLimit()); coded_input.PopLimit(limit); EXPECT_EQ(-1, coded_input.BytesUntilLimit()); EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); } EXPECT_EQ(12, input.ByteCount()); } // Test what happens when we push two limits where the second (top) one is // shorter. TEST_1D(CodedStreamTest, SmallLimitOnTopOfBigLimit, kBlockSizes) { ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); EXPECT_EQ(-1, coded_input.BytesUntilLimit()); CodedInputStream::Limit limit1 = coded_input.PushLimit(8); EXPECT_EQ(8, coded_input.BytesUntilLimit()); CodedInputStream::Limit limit2 = coded_input.PushLimit(4); uint32 value; // Read until we hit limit2, the top and shortest limit. EXPECT_EQ(4, coded_input.BytesUntilLimit()); EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); EXPECT_EQ(0, coded_input.BytesUntilLimit()); EXPECT_FALSE(coded_input.ReadLittleEndian32(&value)); EXPECT_EQ(0, coded_input.BytesUntilLimit()); coded_input.PopLimit(limit2); // Read until we hit limit1. EXPECT_EQ(4, coded_input.BytesUntilLimit()); EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); EXPECT_EQ(0, coded_input.BytesUntilLimit()); EXPECT_FALSE(coded_input.ReadLittleEndian32(&value)); EXPECT_EQ(0, coded_input.BytesUntilLimit()); coded_input.PopLimit(limit1); // No more limits. EXPECT_EQ(-1, coded_input.BytesUntilLimit()); EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); } EXPECT_EQ(12, input.ByteCount()); } // Test what happens when we push two limits where the second (top) one is // longer. In this case, the top limit is shortened to match the previous // limit. TEST_1D(CodedStreamTest, BigLimitOnTopOfSmallLimit, kBlockSizes) { ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); { CodedInputStream coded_input(&input); EXPECT_EQ(-1, coded_input.BytesUntilLimit()); CodedInputStream::Limit limit1 = coded_input.PushLimit(4); EXPECT_EQ(4, coded_input.BytesUntilLimit()); CodedInputStream::Limit limit2 = coded_input.PushLimit(8); uint32 value; // Read until we hit limit2. Except, wait! limit1 is shorter, so // we end up hitting that first, despite having 4 bytes to go on // limit2. EXPECT_EQ(4, coded_input.BytesUntilLimit()); EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); EXPECT_EQ(0, coded_input.BytesUntilLimit()); EXPECT_FALSE(coded_input.ReadLittleEndian32(&value)); EXPECT_EQ(0, coded_input.BytesUntilLimit()); coded_input.PopLimit(limit2); // OK, popped limit2, now limit1 is on top, which we've already hit. EXPECT_EQ(0, coded_input.BytesUntilLimit()); EXPECT_FALSE(coded_input.ReadLittleEndian32(&value)); EXPECT_EQ(0, coded_input.BytesUntilLimit()); coded_input.PopLimit(limit1); // No more limits. EXPECT_EQ(-1, coded_input.BytesUntilLimit()); EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); } EXPECT_EQ(8, input.ByteCount()); } TEST_F(CodedStreamTest, ExpectAtEnd) { // Test ExpectAtEnd(), which is based on limits. ArrayInputStream input(buffer_, sizeof(buffer_)); CodedInputStream coded_input(&input); EXPECT_FALSE(coded_input.ExpectAtEnd()); CodedInputStream::Limit limit = coded_input.PushLimit(4); uint32 value; EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); EXPECT_TRUE(coded_input.ExpectAtEnd()); coded_input.PopLimit(limit); EXPECT_FALSE(coded_input.ExpectAtEnd()); } TEST_F(CodedStreamTest, NegativeLimit) { // Check what happens when we push a negative limit. ArrayInputStream input(buffer_, sizeof(buffer_)); CodedInputStream coded_input(&input); CodedInputStream::Limit limit = coded_input.PushLimit(-1234); // BytesUntilLimit() returns -1 to mean "no limit", which actually means // "the limit is INT_MAX relative to the beginning of the stream". EXPECT_EQ(-1, coded_input.BytesUntilLimit()); coded_input.PopLimit(limit); } TEST_F(CodedStreamTest, NegativeLimitAfterReading) { // Check what happens when we push a negative limit. ArrayInputStream input(buffer_, sizeof(buffer_)); CodedInputStream coded_input(&input); ASSERT_TRUE(coded_input.Skip(128)); CodedInputStream::Limit limit = coded_input.PushLimit(-64); // BytesUntilLimit() returns -1 to mean "no limit", which actually means // "the limit is INT_MAX relative to the beginning of the stream". EXPECT_EQ(-1, coded_input.BytesUntilLimit()); coded_input.PopLimit(limit); } TEST_F(CodedStreamTest, OverflowLimit) { // Check what happens when we push a limit large enough that its absolute // position is more than 2GB into the stream. ArrayInputStream input(buffer_, sizeof(buffer_)); CodedInputStream coded_input(&input); ASSERT_TRUE(coded_input.Skip(128)); CodedInputStream::Limit limit = coded_input.PushLimit(INT_MAX); // BytesUntilLimit() returns -1 to mean "no limit", which actually means // "the limit is INT_MAX relative to the beginning of the stream". EXPECT_EQ(-1, coded_input.BytesUntilLimit()); coded_input.PopLimit(limit); } TEST_F(CodedStreamTest, TotalBytesLimit) { ArrayInputStream input(buffer_, sizeof(buffer_)); CodedInputStream coded_input(&input); coded_input.SetTotalBytesLimit(16, -1); EXPECT_EQ(16, coded_input.BytesUntilTotalBytesLimit()); string str; EXPECT_TRUE(coded_input.ReadString(&str, 16)); EXPECT_EQ(0, coded_input.BytesUntilTotalBytesLimit()); std::vector errors; { ScopedMemoryLog error_log; EXPECT_FALSE(coded_input.ReadString(&str, 1)); errors = error_log.GetMessages(ERROR); } ASSERT_EQ(1, errors.size()); EXPECT_PRED_FORMAT2(testing::IsSubstring, "A protocol message was rejected because it was too big", errors[0]); coded_input.SetTotalBytesLimit(32, -1); EXPECT_EQ(16, coded_input.BytesUntilTotalBytesLimit()); EXPECT_TRUE(coded_input.ReadString(&str, 16)); EXPECT_EQ(0, coded_input.BytesUntilTotalBytesLimit()); } TEST_F(CodedStreamTest, TotalBytesLimitNotValidMessageEnd) { // total_bytes_limit_ is not a valid place for a message to end. ArrayInputStream input(buffer_, sizeof(buffer_)); CodedInputStream coded_input(&input); // Set both total_bytes_limit and a regular limit at 16 bytes. coded_input.SetTotalBytesLimit(16, -1); CodedInputStream::Limit limit = coded_input.PushLimit(16); // Read 16 bytes. string str; EXPECT_TRUE(coded_input.ReadString(&str, 16)); // Read a tag. Should fail, but report being a valid endpoint since it's // a regular limit. EXPECT_EQ(0, coded_input.ReadTagNoLastTag()); EXPECT_TRUE(coded_input.ConsumedEntireMessage()); // Pop the limit. coded_input.PopLimit(limit); // Read a tag. Should fail, and report *not* being a valid endpoint, since // this time we're hitting the total bytes limit. EXPECT_EQ(0, coded_input.ReadTagNoLastTag()); EXPECT_FALSE(coded_input.ConsumedEntireMessage()); } // This method is used by the tests below. // It constructs a CodedInputStream with the given limits and tries to read 2KiB // of data from it. Then it returns the logged errors and warnings in the given // vectors. void CodedStreamTest::SetupTotalBytesLimitWarningTest( int total_bytes_limit, int warning_threshold, std::vector* out_errors, std::vector* out_warnings) { ArrayInputStream raw_input(buffer_, sizeof(buffer_), 128); ScopedMemoryLog scoped_log; { CodedInputStream input(&raw_input); input.SetTotalBytesLimit(total_bytes_limit, warning_threshold); string str; EXPECT_TRUE(input.ReadString(&str, 2048)); } *out_errors = scoped_log.GetMessages(ERROR); *out_warnings = scoped_log.GetMessages(WARNING); } TEST_F(CodedStreamTest, RecursionLimit) { ArrayInputStream input(buffer_, sizeof(buffer_)); CodedInputStream coded_input(&input); coded_input.SetRecursionLimit(4); // This is way too much testing for a counter. EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 1 EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 2 EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 3 EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 4 EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 5 EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 6 coded_input.DecrementRecursionDepth(); // 5 EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 6 coded_input.DecrementRecursionDepth(); // 5 coded_input.DecrementRecursionDepth(); // 4 coded_input.DecrementRecursionDepth(); // 3 EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 4 EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 5 coded_input.DecrementRecursionDepth(); // 4 coded_input.DecrementRecursionDepth(); // 3 coded_input.DecrementRecursionDepth(); // 2 coded_input.DecrementRecursionDepth(); // 1 coded_input.DecrementRecursionDepth(); // 0 coded_input.DecrementRecursionDepth(); // 0 coded_input.DecrementRecursionDepth(); // 0 EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 1 EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 2 EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 3 EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 4 EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 5 coded_input.SetRecursionLimit(6); EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 6 EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 7 } class ReallyBigInputStream : public ZeroCopyInputStream { public: ReallyBigInputStream() : backup_amount_(0), buffer_count_(0) {} ~ReallyBigInputStream() {} // implements ZeroCopyInputStream ---------------------------------- bool Next(const void** data, int* size) { // We only expect BackUp() to be called at the end. EXPECT_EQ(0, backup_amount_); switch (buffer_count_++) { case 0: *data = buffer_; *size = sizeof(buffer_); return true; case 1: // Return an enormously large buffer that, when combined with the 1k // returned already, should overflow the total_bytes_read_ counter in // CodedInputStream. Note that we'll only read the first 1024 bytes // of this buffer so it's OK that we have it point at buffer_. *data = buffer_; *size = INT_MAX; return true; default: return false; } } void BackUp(int count) { backup_amount_ = count; } bool Skip(int count) { GOOGLE_LOG(FATAL) << "Not implemented."; return false; } int64 ByteCount() const { GOOGLE_LOG(FATAL) << "Not implemented."; return 0; } int backup_amount_; private: char buffer_[1024]; int64 buffer_count_; }; TEST_F(CodedStreamTest, InputOver2G) { // CodedInputStream should gracefully handle input over 2G and call // input.BackUp() with the correct number of bytes on destruction. ReallyBigInputStream input; std::vector errors; { ScopedMemoryLog error_log; CodedInputStream coded_input(&input); string str; EXPECT_TRUE(coded_input.ReadString(&str, 512)); EXPECT_TRUE(coded_input.ReadString(&str, 1024)); errors = error_log.GetMessages(ERROR); } EXPECT_EQ(INT_MAX - 512, input.backup_amount_); EXPECT_EQ(0, errors.size()); } } // namespace } // namespace io } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/gzip_stream.cc000066400000000000000000000241731334102242000305420ustar00rootroot00000000000000// 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: brianolson@google.com (Brian Olson) // // This file contains the implementation of classes GzipInputStream and // GzipOutputStream. #if HAVE_ZLIB #include #include #include namespace google { namespace protobuf { namespace io { static const int kDefaultBufferSize = 65536; GzipInputStream::GzipInputStream( ZeroCopyInputStream* sub_stream, Format format, int buffer_size) : format_(format), sub_stream_(sub_stream), zerror_(Z_OK), byte_count_(0) { zcontext_.state = Z_NULL; zcontext_.zalloc = Z_NULL; zcontext_.zfree = Z_NULL; zcontext_.opaque = Z_NULL; zcontext_.total_out = 0; zcontext_.next_in = NULL; zcontext_.avail_in = 0; zcontext_.total_in = 0; zcontext_.msg = NULL; if (buffer_size == -1) { output_buffer_length_ = kDefaultBufferSize; } else { output_buffer_length_ = buffer_size; } output_buffer_ = operator new(output_buffer_length_); GOOGLE_CHECK(output_buffer_ != NULL); zcontext_.next_out = static_cast(output_buffer_); zcontext_.avail_out = output_buffer_length_; output_position_ = output_buffer_; } GzipInputStream::~GzipInputStream() { operator delete(output_buffer_); zerror_ = inflateEnd(&zcontext_); } static inline int internalInflateInit2( z_stream* zcontext, GzipInputStream::Format format) { int windowBitsFormat = 0; switch (format) { case GzipInputStream::GZIP: windowBitsFormat = 16; break; case GzipInputStream::AUTO: windowBitsFormat = 32; break; case GzipInputStream::ZLIB: windowBitsFormat = 0; break; } return inflateInit2(zcontext, /* windowBits */15 | windowBitsFormat); } int GzipInputStream::Inflate(int flush) { if ((zerror_ == Z_OK) && (zcontext_.avail_out == 0)) { // previous inflate filled output buffer. don't change input params yet. } else if (zcontext_.avail_in == 0) { const void* in; int in_size; bool first = zcontext_.next_in == NULL; bool ok = sub_stream_->Next(&in, &in_size); if (!ok) { zcontext_.next_out = NULL; zcontext_.avail_out = 0; return Z_STREAM_END; } zcontext_.next_in = static_cast(const_cast(in)); zcontext_.avail_in = in_size; if (first) { int error = internalInflateInit2(&zcontext_, format_); if (error != Z_OK) { return error; } } } zcontext_.next_out = static_cast(output_buffer_); zcontext_.avail_out = output_buffer_length_; output_position_ = output_buffer_; int error = inflate(&zcontext_, flush); return error; } void GzipInputStream::DoNextOutput(const void** data, int* size) { *data = output_position_; *size = ((uintptr_t)zcontext_.next_out) - ((uintptr_t)output_position_); output_position_ = zcontext_.next_out; } // implements ZeroCopyInputStream ---------------------------------- bool GzipInputStream::Next(const void** data, int* size) { bool ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END) || (zerror_ == Z_BUF_ERROR); if ((!ok) || (zcontext_.next_out == NULL)) { return false; } if (zcontext_.next_out != output_position_) { DoNextOutput(data, size); return true; } if (zerror_ == Z_STREAM_END) { if (zcontext_.next_out != NULL) { // sub_stream_ may have concatenated streams to follow zerror_ = inflateEnd(&zcontext_); byte_count_ += zcontext_.total_out; if (zerror_ != Z_OK) { return false; } zerror_ = internalInflateInit2(&zcontext_, format_); if (zerror_ != Z_OK) { return false; } } else { *data = NULL; *size = 0; return false; } } zerror_ = Inflate(Z_NO_FLUSH); if ((zerror_ == Z_STREAM_END) && (zcontext_.next_out == NULL)) { // The underlying stream's Next returned false inside Inflate. return false; } ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END) || (zerror_ == Z_BUF_ERROR); if (!ok) { return false; } DoNextOutput(data, size); return true; } void GzipInputStream::BackUp(int count) { output_position_ = reinterpret_cast( reinterpret_cast(output_position_) - count); } bool GzipInputStream::Skip(int count) { const void* data; int size = 0; bool ok = Next(&data, &size); while (ok && (size < count)) { count -= size; ok = Next(&data, &size); } if (size > count) { BackUp(size - count); } return ok; } int64 GzipInputStream::ByteCount() const { int64 ret = byte_count_ + zcontext_.total_out; if (zcontext_.next_out != NULL && output_position_ != NULL) { ret += reinterpret_cast(zcontext_.next_out) - reinterpret_cast(output_position_); } return ret; } // ========================================================================= GzipOutputStream::Options::Options() : format(GZIP), buffer_size(kDefaultBufferSize), compression_level(Z_DEFAULT_COMPRESSION), compression_strategy(Z_DEFAULT_STRATEGY) {} GzipOutputStream::GzipOutputStream(ZeroCopyOutputStream* sub_stream) { Init(sub_stream, Options()); } GzipOutputStream::GzipOutputStream(ZeroCopyOutputStream* sub_stream, const Options& options) { Init(sub_stream, options); } void GzipOutputStream::Init(ZeroCopyOutputStream* sub_stream, const Options& options) { sub_stream_ = sub_stream; sub_data_ = NULL; sub_data_size_ = 0; input_buffer_length_ = options.buffer_size; input_buffer_ = operator new(input_buffer_length_); GOOGLE_CHECK(input_buffer_ != NULL); zcontext_.zalloc = Z_NULL; zcontext_.zfree = Z_NULL; zcontext_.opaque = Z_NULL; zcontext_.next_out = NULL; zcontext_.avail_out = 0; zcontext_.total_out = 0; zcontext_.next_in = NULL; zcontext_.avail_in = 0; zcontext_.total_in = 0; zcontext_.msg = NULL; // default to GZIP format int windowBitsFormat = 16; if (options.format == ZLIB) { windowBitsFormat = 0; } zerror_ = deflateInit2( &zcontext_, options.compression_level, Z_DEFLATED, /* windowBits */15 | windowBitsFormat, /* memLevel (default) */8, options.compression_strategy); } GzipOutputStream::~GzipOutputStream() { Close(); operator delete(input_buffer_); } // private int GzipOutputStream::Deflate(int flush) { int error = Z_OK; do { if ((sub_data_ == NULL) || (zcontext_.avail_out == 0)) { bool ok = sub_stream_->Next(&sub_data_, &sub_data_size_); if (!ok) { sub_data_ = NULL; sub_data_size_ = 0; return Z_BUF_ERROR; } GOOGLE_CHECK_GT(sub_data_size_, 0); zcontext_.next_out = static_cast(sub_data_); zcontext_.avail_out = sub_data_size_; } error = deflate(&zcontext_, flush); } while (error == Z_OK && zcontext_.avail_out == 0); if ((flush == Z_FULL_FLUSH) || (flush == Z_FINISH)) { // Notify lower layer of data. sub_stream_->BackUp(zcontext_.avail_out); // We don't own the buffer anymore. sub_data_ = NULL; sub_data_size_ = 0; } return error; } // implements ZeroCopyOutputStream --------------------------------- bool GzipOutputStream::Next(void** data, int* size) { if ((zerror_ != Z_OK) && (zerror_ != Z_BUF_ERROR)) { return false; } if (zcontext_.avail_in != 0) { zerror_ = Deflate(Z_NO_FLUSH); if (zerror_ != Z_OK) { return false; } } if (zcontext_.avail_in == 0) { // all input was consumed. reset the buffer. zcontext_.next_in = static_cast(input_buffer_); zcontext_.avail_in = input_buffer_length_; *data = input_buffer_; *size = input_buffer_length_; } else { // The loop in Deflate should consume all avail_in GOOGLE_LOG(DFATAL) << "Deflate left bytes unconsumed"; } return true; } void GzipOutputStream::BackUp(int count) { GOOGLE_CHECK_GE(zcontext_.avail_in, count); zcontext_.avail_in -= count; } int64 GzipOutputStream::ByteCount() const { return zcontext_.total_in + zcontext_.avail_in; } bool GzipOutputStream::Flush() { zerror_ = Deflate(Z_FULL_FLUSH); // Return true if the flush succeeded or if it was a no-op. return (zerror_ == Z_OK) || (zerror_ == Z_BUF_ERROR && zcontext_.avail_in == 0 && zcontext_.avail_out != 0); } bool GzipOutputStream::Close() { if ((zerror_ != Z_OK) && (zerror_ != Z_BUF_ERROR)) { return false; } do { zerror_ = Deflate(Z_FINISH); } while (zerror_ == Z_OK); zerror_ = deflateEnd(&zcontext_); bool ok = zerror_ == Z_OK; zerror_ = Z_STREAM_END; return ok; } } // namespace io } // namespace protobuf } // namespace google #endif // HAVE_ZLIB python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/gzip_stream.h000066400000000000000000000146631334102242000304070ustar00rootroot00000000000000// 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: brianolson@google.com (Brian Olson) // // This file contains the definition for classes GzipInputStream and // GzipOutputStream. // // GzipInputStream decompresses data from an underlying // ZeroCopyInputStream and provides the decompressed data as a // ZeroCopyInputStream. // // GzipOutputStream is an ZeroCopyOutputStream that compresses data to // an underlying ZeroCopyOutputStream. #ifndef GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__ #define GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__ #include #include #include namespace google { namespace protobuf { namespace io { // A ZeroCopyInputStream that reads compressed data through zlib class LIBPROTOBUF_EXPORT GzipInputStream : public ZeroCopyInputStream { public: // Format key for constructor enum Format { // zlib will autodetect gzip header or deflate stream AUTO = 0, // GZIP streams have some extra header data for file attributes. GZIP = 1, // Simpler zlib stream format. ZLIB = 2, }; // 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(); // Return last error message or NULL if no error. inline const char* ZlibErrorMessage() const { return zcontext_.msg; } inline int ZlibErrorCode() const { return zerror_; } // implements ZeroCopyInputStream ---------------------------------- bool Next(const void** data, int* size); void BackUp(int count); bool Skip(int count); int64 ByteCount() const; private: Format format_; ZeroCopyInputStream* sub_stream_; z_stream zcontext_; int zerror_; void* output_buffer_; void* output_position_; size_t output_buffer_length_; int64 byte_count_; int Inflate(int flush); void DoNextOutput(const void** data, int* size); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipInputStream); }; class LIBPROTOBUF_EXPORT GzipOutputStream : public ZeroCopyOutputStream { public: // Format key for constructor enum Format { // GZIP streams have some extra header data for file attributes. GZIP = 1, // Simpler zlib stream format. ZLIB = 2, }; struct Options { // Defaults to GZIP. Format format; // What size buffer to use internally. Defaults to 64kB. int buffer_size; // A number between 0 and 9, where 0 is no compression and 9 is best // compression. Defaults to Z_DEFAULT_COMPRESSION (see zlib.h). int compression_level; // Defaults to Z_DEFAULT_STRATEGY. Can also be set to Z_FILTERED, // Z_HUFFMAN_ONLY, or Z_RLE. See the documentation for deflateInit2 in // zlib.h for definitions of these constants. int compression_strategy; Options(); // Initializes with default values. }; // Create a GzipOutputStream with default options. explicit GzipOutputStream(ZeroCopyOutputStream* sub_stream); // Create a GzipOutputStream with the given options. GzipOutputStream( ZeroCopyOutputStream* sub_stream, const Options& options); virtual ~GzipOutputStream(); // Return last error message or NULL if no error. inline const char* ZlibErrorMessage() const { return zcontext_.msg; } inline int ZlibErrorCode() const { return zerror_; } // Flushes data written so far to zipped data in the underlying stream. // It is the caller's responsibility to flush the underlying stream if // necessary. // Compression may be less efficient stopping and starting around flushes. // Returns true if no error. // // Please ensure that block size is > 6. Here is an excerpt from the zlib // doc that explains why: // // In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out // is greater than six to avoid repeated flush markers due to // avail_out == 0 on return. bool Flush(); // Writes out all data and closes the gzip stream. // It is the caller's responsibility to close the underlying stream if // necessary. // Returns true if no error. bool Close(); // implements ZeroCopyOutputStream --------------------------------- bool Next(void** data, int* size); void BackUp(int count); int64 ByteCount() const; private: ZeroCopyOutputStream* sub_stream_; // Result from calling Next() on sub_stream_ void* sub_data_; int sub_data_size_; z_stream zcontext_; int zerror_; void* input_buffer_; size_t input_buffer_length_; // Shared constructor code. void Init(ZeroCopyOutputStream* sub_stream, const Options& options); // Do some compression. // Takes zlib flush mode. // Returns zlib error code. int Deflate(int flush); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipOutputStream); }; } // namespace io } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh000066400000000000000000000037361334102242000325300ustar00rootroot00000000000000#!/bin/sh -x # # Protocol Buffers - Google's data interchange format # Copyright 2009 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: brianolson@google.com (Brian Olson) # # Test compatibility between command line gzip/gunzip binaries and # ZeroCopyStream versions. TESTFILE=Makefile (./zcgzip < ${TESTFILE} | gunzip | cmp - ${TESTFILE}) && \ (gzip < ${TESTFILE} | ./zcgunzip | cmp - ${TESTFILE}) # Result of "(cmd) && (cmd)" implicitly becomes result of this script # and thus the test. python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/package_info.h000066400000000000000000000047561334102242000304730ustar00rootroot00000000000000// 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. // // This file exists solely to document the google::protobuf::io namespace. // It is not compiled into anything, but it may be read by an automated // documentation generator. namespace google { namespace protobuf { // Auxiliary classes used for I/O. // // The Protocol Buffer library uses the classes in this package to deal with // I/O and encoding/decoding raw bytes. Most users will not need to // deal with this package. However, users who want to adapt the system to // work with their own I/O abstractions -- e.g., to allow Protocol Buffers // to be read from a different kind of input stream without the need for a // temporary buffer -- should take a closer look. namespace io {} } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/printer.cc000066400000000000000000000311621334102242000276750ustar00rootroot00000000000000// 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 #include #include #include 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 have called Next() at least once and never failed. if (buffer_size_ > 0 && !failed_) { output_->BackUp(buffer_size_); } } bool Printer::GetSubstitutionRange(const char* varname, std::pair* range) { std::map >::const_iterator iter = substitutions_.find(varname); if (iter == substitutions_.end()) { GOOGLE_LOG(DFATAL) << " Undefined variable in annotation: " << varname; return false; } 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 string& file_path, const std::vector& path) { if (annotation_collector_ == NULL) { // Can't generate signatures with this Printer. return; } std::pair 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; } else { annotation_collector_->AddAnnotation(begin.first, end.second, file_path, path); } } void Printer::Print(const std::map& 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; 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::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 >::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; } } // Write the rest. WriteRaw(text + pos, size - pos); } void Printer::Print(const char* text) { static std::map empty; Print(empty, text); } void Printer::Print(const char* text, const char* variable, const string& value) { std::map vars; vars[variable] = value; Print(vars, text); } void Printer::Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2) { std::map vars; vars[variable1] = value1; vars[variable2] = value2; Print(vars, text); } void Printer::Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3) { std::map vars; vars[variable1] = value1; vars[variable2] = value2; vars[variable3] = value3; Print(vars, text); } void Printer::Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3, const char* variable4, const string& value4) { std::map vars; vars[variable1] = value1; vars[variable2] = value2; vars[variable3] = value3; vars[variable4] = value4; Print(vars, text); } void Printer::Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3, const char* variable4, const string& value4, const char* variable5, const string& value5) { std::map vars; vars[variable1] = value1; vars[variable2] = value2; vars[variable3] = value3; vars[variable4] = value4; vars[variable5] = value5; Print(vars, text); } void Printer::Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3, const char* variable4, const string& value4, const char* variable5, const string& value5, const char* variable6, const string& value6) { std::map vars; vars[variable1] = value1; vars[variable2] = value2; vars[variable3] = value3; vars[variable4] = value4; vars[variable5] = value5; vars[variable6] = value6; Print(vars, text); } void Printer::Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3, const char* variable4, const string& value4, const char* variable5, const string& value5, const char* variable6, const string& value6, const char* variable7, const string& value7) { std::map vars; vars[variable1] = value1; vars[variable2] = value2; vars[variable3] = value3; vars[variable4] = value4; vars[variable5] = value5; vars[variable6] = value6; vars[variable7] = value7; Print(vars, text); } void Printer::Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3, const char* variable4, const string& value4, const char* variable5, const string& value5, const char* variable6, const string& value6, const char* variable7, const string& value7, const char* variable8, const string& value8) { std::map vars; vars[variable1] = value1; vars[variable2] = value2; vars[variable3] = value3; vars[variable4] = value4; vars[variable5] = value5; vars[variable6] = value6; vars[variable7] = value7; vars[variable8] = value8; Print(vars, text); } void Printer::Indent() { indent_ += " "; } void Printer::Outdent() { if (indent_.empty()) { GOOGLE_LOG(DFATAL) << " Outdent() without matching Indent()."; return; } indent_.resize(indent_.size() - 2); } void Printer::PrintRaw(const string& data) { WriteRaw(data.data(), data.size()); } 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')) { // Insert an indent. at_start_of_line_ = false; CopyToBuffer(indent_.data(), indent_.size()); if (failed_) return; // Fix up empty variables (e.g., "{") that should be annotated as // coming after the indent. for (std::vector::iterator i = line_start_variables_.begin(); i != line_start_variables_.end(); ++i) { substitutions_[*i].first += indent_.size(); substitutions_[*i].second += indent_.size(); } } // If we're going to write any data, clear line_start_variables_, since // we've either updated them in the block above or they no longer refer to // the current line. line_start_variables_.clear(); CopyToBuffer(data, size); } 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. 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(void_buffer); } // Buffer is big enough to receive the data; copy it. memcpy(buffer_, data, size); buffer_ += size; buffer_size_ -= size; offset_ += size; } } // namespace io } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/printer.h000066400000000000000000000411311334102242000275340ustar00rootroot00000000000000// 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. // // Utility class for writing text to a ZeroCopyOutputStream. #ifndef GOOGLE_PROTOBUF_IO_PRINTER_H__ #define GOOGLE_PROTOBUF_IO_PRINTER_H__ #include #include #include #include namespace google { namespace protobuf { namespace io { class ZeroCopyOutputStream; // zero_copy_stream.h // Records annotations about a Printer's output. class LIBPROTOBUF_EXPORT AnnotationCollector { public: // Records that the bytes in file_path beginning with begin_offset and ending // before end_offset are associated with the SourceCodeInfo-style path. virtual void AddAnnotation(size_t begin_offset, size_t end_offset, const string& file_path, const std::vector& path) = 0; virtual ~AnnotationCollector() {} }; // 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. template 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. virtual void AddAnnotation(size_t begin_offset, size_t end_offset, const string& file_path, const std::vector& path) { typename AnnotationProto::Annotation* annotation = annotation_proto_->add_annotation(); for (int i = 0; i < path.size(); ++i) { annotation->add_path(path[i]); } annotation->set_source_file(file_path); annotation->set_begin(begin_offset); annotation->set_end(end_offset); } private: // The protocol buffer to which new annotations should be added. AnnotationProto* const annotation_proto_; }; // 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: // // Printer printer(output, '$'); // map vars; // vars["name"] = "Bob"; // printer.Print(vars, "My name is $name$."); // // The above writes "My name is Bob." to the output stream. // // Printer aggressively enforces correct usage, crashing (with assert failures) // in the case of undefined variables in debug builds. This helps greatly in // debugging code which uses it. // // If a Printer is constructed with an AnnotationCollector, it will provide it // with annotations that connect the Printer's output to paths that can identify // various descriptors. In the above example, if person_ is a descriptor that // identifies Bob, we can associate the output string "My name is Bob." with // a source path pointing to that descriptor with: // // printer.Annotate("name", person_); // // The AnnotationCollector will be sent an annotation linking the output range // covering "Bob" to the logical path provided by person_. Tools may use // this association to (for example) link "Bob" in the output back to the // source file that defined the person_ descriptor identifying Bob. // // Annotate can only examine variables substituted during the last call to // Print. It is invalid to refer to a variable that was used multiple times // in a single Print call. // // In full generality, one may specify a range of output text using a beginning // substitution variable and an ending variable. The resulting annotation will // span from the first character of the substituted value for the beginning // variable to the last character of the substituted value for the ending // variable. For example, the Annotate call above is equivalent to this one: // // printer.Annotate("name", "name", person_); // // This is useful if multiple variables combine to form a single span of output // that should be annotated with the same source path. For example: // // Printer printer(output, '$'); // map vars; // vars["first"] = "Alice"; // vars["last"] = "Smith"; // printer.Print(vars, "My name is $first$ $last$."); // printer.Annotate("first", "last", person_); // // This code would associate the span covering "Alice Smith" in the output with // the person_ descriptor. // // Note that the beginning variable must come before (or overlap with, in the // case of zero-sized substitution values) the ending variable. // // It is also sometimes useful to use variables with zero-sized values as // markers. This avoids issues with multiple references to the same variable // and also allows annotation ranges to span literal text from the Print // templates: // // Printer printer(output, '$'); // map vars; // vars["foo"] = "bar"; // vars["function"] = "call"; // vars["mark"] = ""; // printer.Print(vars, "$function$($foo$,$foo$)$mark$"); // printer.Annotate("function", "mark", call_); // // This code associates the span covering "call(bar,bar)" in the output with the // call_ descriptor. class LIBPROTOBUF_EXPORT Printer { 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); // 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. Printer(ZeroCopyOutputStream* output, char variable_delimiter, AnnotationCollector* annotation_collector); ~Printer(); // Link a subsitution variable emitted by the last call to Print to the object // described by descriptor. template void Annotate(const char* varname, const SomeDescriptor* descriptor) { Annotate(varname, varname, descriptor); } // Link the output range defined by the substitution variables as emitted by // the last call to Print to the object described by descriptor. The range // begins at begin_varname's value and ends after the last character of the // value substituted for end_varname. template void Annotate(const char* begin_varname, const char* 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. return; } std::vector path; descriptor->GetLocationPath(&path); Annotate(begin_varname, end_varname, descriptor->file()->name(), path); } // Link a subsitution variable emitted by the last call to Print to the file // with path file_name. void Annotate(const char* varname, const string& file_name) { Annotate(varname, varname, file_name); } // Link the output range defined by the substitution variables as emitted by // 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 string& file_name) { if (annotation_collector_ == NULL) { // Annotations aren't turned on for this Printer. return; } std::vector empty_path; Annotate(begin_varname, end_varname, file_name, empty_path); } // 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& variables, const char* text); // Like the first Print(), except the substitutions are given as parameters. void Print(const char* text); // Like the first Print(), except the substitutions are given as parameters. void Print(const char* text, const char* variable, const string& value); // Like the first Print(), except the substitutions are given as parameters. void Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2); // Like the first Print(), except the substitutions are given as parameters. void Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3); // Like the first Print(), except the substitutions are given as parameters. void Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3, const char* variable4, const string& value4); // Like the first Print(), except the substitutions are given as parameters. void Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3, const char* variable4, const string& value4, const char* variable5, const string& value5); // Like the first Print(), except the substitutions are given as parameters. void Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3, const char* variable4, const string& value4, const char* variable5, const string& value5, const char* variable6, const string& value6); // Like the first Print(), except the substitutions are given as parameters. void Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3, const char* variable4, const string& value4, const char* variable5, const string& value5, const char* variable6, const string& value6, const char* variable7, const string& value7); // Like the first Print(), except the substitutions are given as parameters. void Print(const char* text, const char* variable1, const string& value1, const char* variable2, const string& value2, const char* variable3, const string& value3, const char* variable4, const string& value4, const char* variable5, const string& value5, const char* variable6, const string& value6, const char* variable7, const string& value7, const char* variable8, const string& value8); // 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. void Outdent(); // Write a string to the output buffer. // This method does not look for newlines to add indentation. void PrintRaw(const 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); // 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_; } 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 string& file_path, const std::vector& path); // Copy size worth of bytes from data to buffer_. void CopyToBuffer(const char* data, int size); const char variable_delimiter_; 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_; string indent_; bool at_start_of_line_; bool failed_; // 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 > 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 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* range); // If non-null, annotation_collector_ is used to store annotations about // generated code. AnnotationCollector* const annotation_collector_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Printer); }; } // namespace io } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_IO_PRINTER_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/printer_unittest.cc000066400000000000000000000464541334102242000316460ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { namespace { // 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); } } TEST(Printer, WriteRaw) { char buffer[8192]; for (int block_size = 1; block_size < 512; block_size *= 2) { ArrayOutputStream output(buffer, sizeof(buffer), block_size); { 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); } } 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 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)); { 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); } // MockDescriptorFile defines only those members that Printer uses to write out // annotations. class MockDescriptorFile { public: explicit MockDescriptorFile(const string& file) : file_(file) {} // The mock filename for this file. const string& name() const { return file_; } private: string file_; }; // MockDescriptor defines only those members that Printer uses to write out // annotations. class MockDescriptor { public: MockDescriptor(const string& file, const std::vector& path) : file_(file), path_(path) {} // The mock file in which this descriptor was defined. const MockDescriptorFile* file() const { return &file_; } private: // Allows access to GetLocationPath. friend class ::google::protobuf::io::Printer; // Copies the pre-stored path to output. void GetLocationPath(std::vector* output) const { *output = path_; } MockDescriptorFile file_; std::vector path_; }; TEST(Printer, AnnotateMap) { char buffer[8192]; ArrayOutputStream output(buffer, sizeof(buffer)); GeneratedCodeInfo info; AnnotationProtoCollector info_collector(&info); { Printer printer(&output, '$', &info_collector); std::map vars; vars["foo"] = "3"; vars["bar"] = "5"; printer.Print(vars, "012$foo$4$bar$\n"); std::vector path_1; path_1.push_back(33); std::vector 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()); } TEST(Printer, AnnotateInline) { char buffer[8192]; ArrayOutputStream output(buffer, sizeof(buffer)); GeneratedCodeInfo info; AnnotationProtoCollector info_collector(&info); { Printer printer(&output, '$', &info_collector); printer.Print("012$foo$4$bar$\n", "foo", "3", "bar", "5"); std::vector path_1; path_1.push_back(33); std::vector 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()); } TEST(Printer, AnnotateRange) { char buffer[8192]; ArrayOutputStream output(buffer, sizeof(buffer)); GeneratedCodeInfo info; AnnotationProtoCollector info_collector(&info); { Printer printer(&output, '$', &info_collector); printer.Print("012$foo$4$bar$\n", "foo", "3", "bar", "5"); std::vector 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 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 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 info_collector(&info); { Printer printer(&output, '$', &info_collector); printer.Print("012$foo$4$foo$$bar$\n", "foo", "3", "bar", "5"); std::vector 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 info_collector(&info); { Printer printer(&output, '$', &info_collector); printer.Print("0\n"); printer.Indent(); printer.Print("$foo$", "foo", "4"); std::vector 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 info_collector(&info); { Printer printer(&output, '$', &info_collector); printer.Indent(); printer.Print("$A$$N$$B$C\n", "A", "", "N", "\nz", "B", ""); std::vector 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 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()); } 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); } } // 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 info_collector(&info); { Printer printer(&output, '$', &info_collector); printer.Print("012$foo$4$foo$\n", "foo", "3"); std::vector path; path.push_back(33); MockDescriptor descriptor("path", path); EXPECT_DEBUG_DEATH(printer.Annotate("foo", "foo", &descriptor), "multiple"); } } TEST(Printer, AnnotateNegativeLengthDeath) { char buffer[8192]; ArrayOutputStream output(buffer, sizeof(buffer)); GeneratedCodeInfo info; AnnotationProtoCollector info_collector(&info); { Printer printer(&output, '$', &info_collector); printer.Print("012$foo$4$bar$\n", "foo", "3", "bar", "5"); std::vector path; path.push_back(33); MockDescriptor descriptor("path", path); EXPECT_DEBUG_DEATH(printer.Annotate("bar", "foo", &descriptor), "negative"); } } TEST(Printer, AnnotateUndefinedDeath) { char buffer[8192]; ArrayOutputStream output(buffer, sizeof(buffer)); GeneratedCodeInfo info; AnnotationProtoCollector info_collector(&info); { Printer printer(&output, '$', &info_collector); printer.Print("012$foo$4$foo$\n", "foo", "3"); std::vector path; path.push_back(33); MockDescriptor descriptor("path", path); EXPECT_DEBUG_DEATH(printer.Annotate("bar", "bar", &descriptor), "Undefined"); } } #endif // PROTOBUF_HAS_DEATH_TEST TEST(Printer, WriteFailurePartial) { char buffer[17]; ArrayOutputStream output(buffer, sizeof(buffer)); Printer printer(&output, '$'); // Print 16 bytes to almost fill the buffer (should not fail). printer.Print("0123456789abcdef"); EXPECT_FALSE(printer.failed()); // Try to print 2 chars. Only one fits. printer.Print("<>"); EXPECT_TRUE(printer.failed()); // Anything else should fail too. printer.Print(" "); EXPECT_TRUE(printer.failed()); printer.Print("blah"); EXPECT_TRUE(printer.failed()); // Buffer should contain the first 17 bytes written. EXPECT_EQ("0123456789abcdef<", string(buffer, sizeof(buffer))); } TEST(Printer, WriteFailureExact) { char buffer[16]; ArrayOutputStream output(buffer, sizeof(buffer)); Printer printer(&output, '$'); // Print 16 bytes to fill the buffer exactly (should not fail). printer.Print("0123456789abcdef"); EXPECT_FALSE(printer.failed()); // Try to print one more byte (should fail). printer.Print(" "); EXPECT_TRUE(printer.failed()); // Should not crash printer.Print("blah"); EXPECT_TRUE(printer.failed()); // Buffer should contain the first 16 bytes written. EXPECT_EQ("0123456789abcdef", string(buffer, sizeof(buffer))); } } // namespace } // namespace io } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/strtod.cc000066400000000000000000000115441334102242000275330ustar00rootroot00000000000000// 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 #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { // ---------------------------------------------------------------------- // NoLocaleStrtod() // This code will make you cry. // ---------------------------------------------------------------------- namespace { // Returns a string identical to *input except that the character pointed to // by radix_pos (which should be '.') is replaced with the locale-specific // radix character. string LocalizeRadix(const char* input, const char* radix_pos) { // Determine the locale-specific radix character by calling sprintf() to // print the number 1.5, then stripping off the digits. As far as I can // tell, this is the only portable, thread-safe way to get the C library // to divuldge the locale's radix character. No, localeconv() is NOT // thread-safe. char temp[16]; int size = sprintf(temp, "%.1f", 1.5); GOOGLE_CHECK_EQ(temp[0], '1'); GOOGLE_CHECK_EQ(temp[size-1], '5'); GOOGLE_CHECK_LE(size, 6); // Now replace the '.' in the input with it. string result; result.reserve(strlen(input) + size - 3); result.append(input, radix_pos); result.append(temp + 1, size - 2); result.append(radix_pos + 1); return result; } } // namespace double NoLocaleStrtod(const char* text, char** original_endptr) { // We cannot simply set the locale to "C" temporarily with setlocale() // as this is not thread-safe. Instead, we try to parse in the current // locale first. If parsing stops at a '.' character, then this is a // pretty good hint that we're actually in some other locale in which // '.' is not the radix character. char* temp_endptr; double result = strtod(text, &temp_endptr); if (original_endptr != NULL) *original_endptr = temp_endptr; if (*temp_endptr != '.') return result; // Parsing halted on a '.'. Perhaps we're in a different locale? Let's // try to replace the '.' with a locale-specific radix character and // try again. string localized = LocalizeRadix(text, temp_endptr); const char* localized_cstr = localized.c_str(); char* localized_endptr; result = strtod(localized_cstr, &localized_endptr); if ((localized_endptr - localized_cstr) > (temp_endptr - text)) { // This attempt got further, so replacing the decimal must have helped. // Update original_endptr to point at the right location. if (original_endptr != NULL) { // size_diff is non-zero if the localized radix has multiple bytes. int size_diff = localized.size() - strlen(text); // const_cast is necessary to match the strtod() interface. *original_endptr = const_cast( text + (localized_endptr - localized_cstr - size_diff)); } } return result; } float SafeDoubleToFloat(double value) { if (value > std::numeric_limits::max()) { return std::numeric_limits::infinity(); } else if (value < -std::numeric_limits::max()) { return -std::numeric_limits::infinity(); } else { return static_cast(value); } } } // namespace io } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/strtod.h000066400000000000000000000045771334102242000274050ustar00rootroot00000000000000// 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 locale-independent version of strtod(), used to parse floating // point default values in .proto files, where the decimal separator // is always a dot. #ifndef GOOGLE_PROTOBUF_IO_STRTOD_H__ #define GOOGLE_PROTOBUF_IO_STRTOD_H__ namespace google { namespace protobuf { namespace io { // A locale-independent version of the standard strtod(), which always // uses a dot as the decimal separator. double NoLocaleStrtod(const char* str, char** endptr); // Casts a double value to a float value. If the value is outside of the // representable range of float, it will be converted to positive or negative // infinity. float SafeDoubleToFloat(double value); } // namespace io } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_IO_STRTOD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/tokenizer.cc000066400000000000000000001116071334102242000302270ustar00rootroot00000000000000// 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. // // Here we have a hand-written lexer. At first you might ask yourself, // "Hand-written text processing? Is Kenton crazy?!" Well, first of all, // yes I am crazy, but that's beside the point. There are actually reasons // why I ended up writing this this way. // // The traditional approach to lexing is to use lex to generate a lexer for // you. Unfortunately, lex's output is ridiculously ugly and difficult to // integrate cleanly with C++ code, especially abstract code or code meant // as a library. Better parser-generators exist but would add dependencies // which most users won't already have, which we'd like to avoid. (GNU flex // has a C++ output option, but it's still ridiculously ugly, non-abstract, // and not library-friendly.) // // The next approach that any good software engineer should look at is to // use regular expressions. And, indeed, I did. I have code which // implements this same class using regular expressions. It's about 200 // lines shorter. However: // - Rather than error messages telling you "This string has an invalid // escape sequence at line 5, column 45", you get error messages like // "Parse error on line 5". Giving more precise errors requires adding // a lot of code that ends up basically as complex as the hand-coded // version anyway. // - The regular expression to match a string literal looks like this: // kString = new RE("(\"([^\"\\\\]|" // non-escaped // "\\\\[abfnrtv?\"'\\\\0-7]|" // normal escape // "\\\\x[0-9a-fA-F])*\"|" // hex escape // "\'([^\'\\\\]|" // Also support single-quotes. // "\\\\[abfnrtv?\"'\\\\0-7]|" // "\\\\x[0-9a-fA-F])*\')"); // Verifying the correctness of this line noise is actually harder than // verifying the correctness of ConsumeString(), defined below. I'm not // even confident that the above is correct, after staring at it for some // time. // - PCRE is fast, but there's still more overhead involved than the code // below. // - Sadly, regular expressions are not part of the C standard library, so // using them would require depending on some other library. For the // open source release, this could be really annoying. Nobody likes // downloading one piece of software just to find that they need to // download something else to make it work, and in all likelihood // people downloading Protocol Buffers will already be doing so just // to make something else work. We could include a copy of PCRE with // our code, but that obligates us to keep it up-to-date and just seems // like a big waste just to save 200 lines of code. // // On a similar but unrelated note, I'm even scared to use ctype.h. // Apparently functions like isalpha() are locale-dependent. So, if we used // that, then if this code is being called from some program that doesn't // have its locale set to "C", it would behave strangely. We can't just set // the locale to "C" ourselves since we might break the calling program that // way, particularly if it is multi-threaded. WTF? Someone please let me // (Kenton) know if I'm missing something here... // // I'd love to hear about other alternatives, though, as this code isn't // exactly pretty. #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { namespace { // As mentioned above, I don't trust ctype.h due to the presence of "locales". // So, I have written replacement functions here. Someone please smack me if // this is a bad idea or if there is some way around this. // // These "character classes" are designed to be used in template methods. // For instance, Tokenizer::ConsumeZeroOrMore() will eat // whitespace. // Note: No class is allowed to contain '\0', since this is used to mark end- // of-input and is handled specially. #define CHARACTER_CLASS(NAME, EXPRESSION) \ class NAME { \ public: \ static inline bool InClass(char c) { \ return EXPRESSION; \ } \ } CHARACTER_CLASS(Whitespace, c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\v' || c == '\f'); CHARACTER_CLASS(WhitespaceNoNewline, c == ' ' || c == '\t' || c == '\r' || c == '\v' || c == '\f'); CHARACTER_CLASS(Unprintable, c < ' ' && c > '\0'); CHARACTER_CLASS(Digit, '0' <= c && c <= '9'); CHARACTER_CLASS(OctalDigit, '0' <= c && c <= '7'); CHARACTER_CLASS(HexDigit, ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')); CHARACTER_CLASS(Letter, ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || (c == '_')); CHARACTER_CLASS(Alphanumeric, ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || ('0' <= c && c <= '9') || (c == '_')); CHARACTER_CLASS(Escape, c == 'a' || c == 'b' || c == 'f' || c == 'n' || c == 'r' || c == 't' || c == 'v' || c == '\\' || c == '?' || c == '\'' || c == '\"'); #undef CHARACTER_CLASS // Given a char, interpret it as a numeric digit and return its value. // This supports any number base up to 36. inline int DigitValue(char digit) { if ('0' <= digit && digit <= '9') return digit - '0'; if ('a' <= digit && digit <= 'z') return digit - 'a' + 10; if ('A' <= digit && digit <= 'Z') return digit - 'A' + 10; return -1; } // Inline because it's only used in one place. inline char TranslateEscape(char c) { switch (c) { case 'a': return '\a'; case 'b': return '\b'; case 'f': return '\f'; case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; case 'v': return '\v'; case '\\': return '\\'; case '?': return '\?'; // Trigraphs = :( case '\'': return '\''; case '"': return '\"'; // We expect escape sequences to have been validated separately. default: return '?'; } } } // anonymous namespace ErrorCollector::~ErrorCollector() {} // =================================================================== Tokenizer::Tokenizer(ZeroCopyInputStream* input, ErrorCollector* error_collector) : input_(input), error_collector_(error_collector), buffer_(NULL), buffer_size_(0), buffer_pos_(0), read_error_(false), line_(0), column_(0), record_target_(NULL), record_start_(-1), allow_f_after_float_(false), comment_style_(CPP_COMMENT_STYLE), require_space_after_number_(true), allow_multiline_strings_(false) { current_.line = 0; current_.column = 0; current_.end_column = 0; current_.type = TYPE_START; Refresh(); } Tokenizer::~Tokenizer() { // If we had any buffer left unread, return it to the underlying stream // so that someone else can read it. if (buffer_size_ > buffer_pos_) { input_->BackUp(buffer_size_ - buffer_pos_); } } // ------------------------------------------------------------------- // Internal helpers. void Tokenizer::NextChar() { // Update our line and column counters based on the character being // consumed. if (current_char_ == '\n') { ++line_; column_ = 0; } else if (current_char_ == '\t') { column_ += kTabWidth - column_ % kTabWidth; } else { ++column_; } // Advance to the next character. ++buffer_pos_; if (buffer_pos_ < buffer_size_) { current_char_ = buffer_[buffer_pos_]; } else { Refresh(); } } void Tokenizer::Refresh() { if (read_error_) { current_char_ = '\0'; return; } // If we're in a token, append the rest of the buffer to it. if (record_target_ != NULL && record_start_ < buffer_size_) { record_target_->append(buffer_ + record_start_, buffer_size_ - record_start_); record_start_ = 0; } const void* data = NULL; buffer_ = NULL; buffer_pos_ = 0; do { if (!input_->Next(&data, &buffer_size_)) { // end of stream (or read error) buffer_size_ = 0; read_error_ = true; current_char_ = '\0'; return; } } while (buffer_size_ == 0); buffer_ = static_cast(data); current_char_ = buffer_[0]; } inline void Tokenizer::RecordTo(string* target) { record_target_ = target; record_start_ = buffer_pos_; } inline void Tokenizer::StopRecording() { // Note: The if() is necessary because some STL implementations crash when // you call string::append(NULL, 0), presumably because they are trying to // be helpful by detecting the NULL pointer, even though there's nothing // wrong with reading zero bytes from NULL. if (buffer_pos_ != record_start_) { record_target_->append(buffer_ + record_start_, buffer_pos_ - record_start_); } record_target_ = NULL; record_start_ = -1; } inline void Tokenizer::StartToken() { current_.type = TYPE_START; // Just for the sake of initializing it. current_.text.clear(); current_.line = line_; current_.column = column_; RecordTo(¤t_.text); } inline void Tokenizer::EndToken() { StopRecording(); current_.end_column = column_; } // ------------------------------------------------------------------- // Helper methods that consume characters. template inline bool Tokenizer::LookingAt() { return CharacterClass::InClass(current_char_); } template inline bool Tokenizer::TryConsumeOne() { if (CharacterClass::InClass(current_char_)) { NextChar(); return true; } else { return false; } } inline bool Tokenizer::TryConsume(char c) { if (current_char_ == c) { NextChar(); return true; } else { return false; } } template inline void Tokenizer::ConsumeZeroOrMore() { while (CharacterClass::InClass(current_char_)) { NextChar(); } } template inline void Tokenizer::ConsumeOneOrMore(const char* error) { if (!CharacterClass::InClass(current_char_)) { AddError(error); } else { do { NextChar(); } while (CharacterClass::InClass(current_char_)); } } // ------------------------------------------------------------------- // Methods that read whole patterns matching certain kinds of tokens // or comments. void Tokenizer::ConsumeString(char delimiter) { while (true) { switch (current_char_) { case '\0': AddError("Unexpected end of string."); return; case '\n': { if (!allow_multiline_strings_) { AddError("String literals cannot cross line boundaries."); return; } NextChar(); break; } case '\\': { // An escape sequence. NextChar(); if (TryConsumeOne()) { // Valid escape sequence. } else if (TryConsumeOne()) { // Possibly followed by two more octal digits, but these will // just be consumed by the main loop anyway so we don't need // to do so explicitly here. } else if (TryConsume('x')) { if (!TryConsumeOne()) { AddError("Expected hex digits for escape sequence."); } // Possibly followed by another hex digit, but again we don't care. } else if (TryConsume('u')) { if (!TryConsumeOne() || !TryConsumeOne() || !TryConsumeOne() || !TryConsumeOne()) { AddError("Expected four hex digits for \\u escape sequence."); } } else if (TryConsume('U')) { // We expect 8 hex digits; but only the range up to 0x10ffff is // legal. if (!TryConsume('0') || !TryConsume('0') || !(TryConsume('0') || TryConsume('1')) || !TryConsumeOne() || !TryConsumeOne() || !TryConsumeOne() || !TryConsumeOne() || !TryConsumeOne()) { AddError("Expected eight hex digits up to 10ffff for \\U escape " "sequence"); } } else { AddError("Invalid escape sequence in string literal."); } break; } default: { if (current_char_ == delimiter) { NextChar(); return; } NextChar(); break; } } } } Tokenizer::TokenType Tokenizer::ConsumeNumber(bool started_with_zero, bool started_with_dot) { bool is_float = false; if (started_with_zero && (TryConsume('x') || TryConsume('X'))) { // A hex number (started with "0x"). ConsumeOneOrMore("\"0x\" must be followed by hex digits."); } else if (started_with_zero && LookingAt()) { // An octal number (had a leading zero). ConsumeZeroOrMore(); if (LookingAt()) { AddError("Numbers starting with leading zero must be in octal."); ConsumeZeroOrMore(); } } else { // A decimal number. if (started_with_dot) { is_float = true; ConsumeZeroOrMore(); } else { ConsumeZeroOrMore(); if (TryConsume('.')) { is_float = true; ConsumeZeroOrMore(); } } if (TryConsume('e') || TryConsume('E')) { is_float = true; TryConsume('-') || TryConsume('+'); ConsumeOneOrMore("\"e\" must be followed by exponent."); } if (allow_f_after_float_ && (TryConsume('f') || TryConsume('F'))) { is_float = true; } } if (LookingAt() && require_space_after_number_) { AddError("Need space between number and identifier."); } else if (current_char_ == '.') { if (is_float) { AddError( "Already saw decimal point or exponent; can't have another one."); } else { AddError("Hex and octal numbers must be integers."); } } return is_float ? TYPE_FLOAT : TYPE_INTEGER; } void Tokenizer::ConsumeLineComment(string* content) { if (content != NULL) RecordTo(content); while (current_char_ != '\0' && current_char_ != '\n') { NextChar(); } TryConsume('\n'); if (content != NULL) StopRecording(); } void Tokenizer::ConsumeBlockComment(string* content) { int start_line = line_; int start_column = column_ - 2; if (content != NULL) RecordTo(content); while (true) { while (current_char_ != '\0' && current_char_ != '*' && current_char_ != '/' && current_char_ != '\n') { NextChar(); } if (TryConsume('\n')) { if (content != NULL) StopRecording(); // Consume leading whitespace and asterisk; ConsumeZeroOrMore(); if (TryConsume('*')) { if (TryConsume('/')) { // End of comment. break; } } if (content != NULL) RecordTo(content); } else if (TryConsume('*') && TryConsume('/')) { // End of comment. if (content != NULL) { StopRecording(); // Strip trailing "*/". content->erase(content->size() - 2); } break; } else if (TryConsume('/') && current_char_ == '*') { // Note: We didn't consume the '*' because if there is a '/' after it // we want to interpret that as the end of the comment. AddError( "\"/*\" inside block comment. Block comments cannot be nested."); } else if (current_char_ == '\0') { AddError("End-of-file inside block comment."); error_collector_->AddError( start_line, start_column, " Comment started here."); if (content != NULL) StopRecording(); break; } } } Tokenizer::NextCommentStatus Tokenizer::TryConsumeCommentStart() { if (comment_style_ == CPP_COMMENT_STYLE && TryConsume('/')) { if (TryConsume('/')) { return LINE_COMMENT; } else if (TryConsume('*')) { return BLOCK_COMMENT; } else { // Oops, it was just a slash. Return it. current_.type = TYPE_SYMBOL; current_.text = "/"; current_.line = line_; current_.column = column_ - 1; current_.end_column = column_; return SLASH_NOT_COMMENT; } } else if (comment_style_ == SH_COMMENT_STYLE && TryConsume('#')) { return LINE_COMMENT; } else { return NO_COMMENT; } } // ------------------------------------------------------------------- bool Tokenizer::Next() { previous_ = current_; while (!read_error_) { ConsumeZeroOrMore(); switch (TryConsumeCommentStart()) { case LINE_COMMENT: ConsumeLineComment(NULL); continue; case BLOCK_COMMENT: ConsumeBlockComment(NULL); continue; case SLASH_NOT_COMMENT: return true; case NO_COMMENT: break; } // Check for EOF before continuing. if (read_error_) break; if (LookingAt() || current_char_ == '\0') { AddError("Invalid control characters encountered in text."); NextChar(); // Skip more unprintable characters, too. But, remember that '\0' is // also what current_char_ is set to after EOF / read error. We have // to be careful not to go into an infinite loop of trying to consume // it, so make sure to check read_error_ explicitly before consuming // '\0'. while (TryConsumeOne() || (!read_error_ && TryConsume('\0'))) { // Ignore. } } else { // Reading some sort of token. StartToken(); if (TryConsumeOne()) { ConsumeZeroOrMore(); current_.type = TYPE_IDENTIFIER; } else if (TryConsume('0')) { current_.type = ConsumeNumber(true, false); } else if (TryConsume('.')) { // This could be the beginning of a floating-point number, or it could // just be a '.' symbol. if (TryConsumeOne()) { // It's a floating-point number. if (previous_.type == TYPE_IDENTIFIER && current_.line == previous_.line && current_.column == previous_.end_column) { // We don't accept syntax like "blah.123". error_collector_->AddError(line_, column_ - 2, "Need space between identifier and decimal point."); } current_.type = ConsumeNumber(false, true); } else { current_.type = TYPE_SYMBOL; } } else if (TryConsumeOne()) { current_.type = ConsumeNumber(false, false); } else if (TryConsume('\"')) { ConsumeString('\"'); current_.type = TYPE_STRING; } else if (TryConsume('\'')) { ConsumeString('\''); current_.type = TYPE_STRING; } else { // Check if the high order bit is set. if (current_char_ & 0x80) { error_collector_->AddError(line_, column_, StringPrintf("Interpreting non ascii codepoint %d.", static_cast(current_char_))); } NextChar(); current_.type = TYPE_SYMBOL; } EndToken(); return true; } } // EOF current_.type = TYPE_END; current_.text.clear(); current_.line = line_; current_.column = column_; current_.end_column = column_; return false; } namespace { // Helper class for collecting comments and putting them in the right places. // // This basically just buffers the most recent comment until it can be decided // exactly where that comment should be placed. When Flush() is called, the // current comment goes into either prev_trailing_comments or detached_comments. // When the CommentCollector is destroyed, the last buffered comment goes into // next_leading_comments. class CommentCollector { public: CommentCollector(string* prev_trailing_comments, std::vector* detached_comments, string* next_leading_comments) : prev_trailing_comments_(prev_trailing_comments), detached_comments_(detached_comments), next_leading_comments_(next_leading_comments), has_comment_(false), is_line_comment_(false), can_attach_to_prev_(true) { if (prev_trailing_comments != NULL) prev_trailing_comments->clear(); if (detached_comments != NULL) detached_comments->clear(); if (next_leading_comments != NULL) next_leading_comments->clear(); } ~CommentCollector() { // Whatever is in the buffer is a leading comment. if (next_leading_comments_ != NULL && has_comment_) { comment_buffer_.swap(*next_leading_comments_); } } // About to read a line comment. Get the comment buffer pointer in order to // read into it. string* GetBufferForLineComment() { // We want to combine with previous line comments, but not block comments. if (has_comment_ && !is_line_comment_) { Flush(); } has_comment_ = true; is_line_comment_ = true; return &comment_buffer_; } // About to read a block comment. Get the comment buffer pointer in order to // read into it. string* GetBufferForBlockComment() { if (has_comment_) { Flush(); } has_comment_ = true; is_line_comment_ = false; return &comment_buffer_; } void ClearBuffer() { comment_buffer_.clear(); has_comment_ = false; } // Called once we know that the comment buffer is complete and is *not* // connected to the next token. void Flush() { if (has_comment_) { if (can_attach_to_prev_) { if (prev_trailing_comments_ != NULL) { prev_trailing_comments_->append(comment_buffer_); } can_attach_to_prev_ = false; } else { if (detached_comments_ != NULL) { detached_comments_->push_back(comment_buffer_); } } ClearBuffer(); } } void DetachFromPrev() { can_attach_to_prev_ = false; } private: string* prev_trailing_comments_; std::vector* detached_comments_; string* next_leading_comments_; string comment_buffer_; // True if any comments were read into comment_buffer_. This can be true even // if comment_buffer_ is empty, namely if the comment was "/**/". bool has_comment_; // Is the comment in the comment buffer a line comment? bool is_line_comment_; // Is it still possible that we could be reading a comment attached to the // previous token? bool can_attach_to_prev_; }; } // namespace bool Tokenizer::NextWithComments(string* prev_trailing_comments, std::vector* detached_comments, string* next_leading_comments) { CommentCollector collector(prev_trailing_comments, detached_comments, next_leading_comments); 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. if (TryConsume((char)0xEF)) { if (!TryConsume((char)0xBB) || !TryConsume((char)0xBF)) { AddError("Proto file starts with 0xEF but not UTF-8 BOM. " "Only UTF-8 is accepted for proto file."); return false; } } collector.DetachFromPrev(); } else { // A comment appearing on the same line must be attached to the previous // declaration. ConsumeZeroOrMore(); switch (TryConsumeCommentStart()) { case LINE_COMMENT: ConsumeLineComment(collector.GetBufferForLineComment()); // Don't allow comments on subsequent lines to be attached to a trailing // comment. collector.Flush(); break; case BLOCK_COMMENT: ConsumeBlockComment(collector.GetBufferForBlockComment()); ConsumeZeroOrMore(); 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. collector.Flush(); break; case SLASH_NOT_COMMENT: return true; case NO_COMMENT: if (!TryConsume('\n')) { // The next token is on the same line. There are no comments. return Next(); } break; } } // OK, we are now on the line *after* the previous token. while (true) { ConsumeZeroOrMore(); switch (TryConsumeCommentStart()) { case LINE_COMMENT: ConsumeLineComment(collector.GetBufferForLineComment()); break; case BLOCK_COMMENT: ConsumeBlockComment(collector.GetBufferForBlockComment()); // Consume the rest of the line so that we don't interpret it as a // blank line the next time around the loop. ConsumeZeroOrMore(); TryConsume('\n'); break; case SLASH_NOT_COMMENT: return true; case NO_COMMENT: if (TryConsume('\n')) { // Completely blank line. collector.Flush(); collector.DetachFromPrev(); } else { bool result = Next(); if (!result || current_.text == "}" || current_.text == "]" || current_.text == ")") { // It looks like we're at the end of a scope. In this case it // makes no sense to attach a comment to the following token. collector.Flush(); } return result; } break; } } } // ------------------------------------------------------------------- // Token-parsing helpers. Remember that these don't need to report // errors since any errors should already have been reported while // tokenizing. Also, these can assume that whatever text they // are given is text that the tokenizer actually parsed as a token // of the given type. bool Tokenizer::ParseInteger(const string& text, uint64 max_value, uint64* output) { // Sadly, we can't just use strtoul() since it is only 32-bit and strtoull() // is non-standard. I hate the C standard library. :( // return strtoull(text.c_str(), NULL, 0); const char* ptr = text.c_str(); int base = 10; if (ptr[0] == '0') { if (ptr[1] == 'x' || ptr[1] == 'X') { // This is hex. base = 16; ptr += 2; } else { // This is octal. base = 8; } } uint64 result = 0; for (; *ptr != '\0'; ptr++) { int digit = DigitValue(*ptr); if (digit < 0 || digit >= base) { // The token provided by Tokenizer is invalid. i.e., 099 is an invalid // token, but Tokenizer still think it's integer. return false; } if (digit > max_value || result > (max_value - digit) / base) { // Overflow. return false; } result = result * base + digit; } *output = result; return true; } double Tokenizer::ParseFloat(const string& text) { const char* start = text.c_str(); char* end; double 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 // accept anything the tokenizer could possibly return, error or not. if (*end == 'e' || *end == 'E') { ++end; if (*end == '-' || *end == '+') ++end; } // If the Tokenizer had allow_f_after_float_ enabled, the float may be // suffixed with the letter 'f'. if (*end == 'f' || *end == 'F') { ++end; } GOOGLE_LOG_IF(DFATAL, end - start != text.size() || *start == '-') << " Tokenizer::ParseFloat() passed text that could not have been" " tokenized as a float: " << CEscape(text); return result; } // Helper to append a Unicode code point to a string as UTF8, without bringing // in any external dependencies. static void AppendUTF8(uint32 code_point, string* output) { uint32 tmp = 0; int len = 0; if (code_point <= 0x7f) { tmp = code_point; len = 1; } else if (code_point <= 0x07ff) { tmp = 0x0000c080 | ((code_point & 0x07c0) << 2) | (code_point & 0x003f); len = 2; } else if (code_point <= 0xffff) { tmp = 0x00e08080 | ((code_point & 0xf000) << 4) | ((code_point & 0x0fc0) << 2) | (code_point & 0x003f); len = 3; } else if (code_point <= 0x1fffff) { tmp = 0xf0808080 | ((code_point & 0x1c0000) << 6) | ((code_point & 0x03f000) << 4) | ((code_point & 0x000fc0) << 2) | (code_point & 0x003f); len = 4; } else { // UTF-16 is only defined for code points up to 0x10FFFF, and UTF-8 is // normally only defined up to there as well. StringAppendF(output, "\\U%08x", code_point); return; } tmp = ghtonl(tmp); output->append(reinterpret_cast(&tmp) + sizeof(tmp) - len, len); } // Try to read hex digits from ptr, and stuff the numeric result into // *result. Returns true if that many digits were successfully consumed. static bool ReadHexDigits(const char* ptr, int len, uint32* result) { *result = 0; if (len == 0) return false; for (const char* end = ptr + len; ptr < end; ++ptr) { if (*ptr == '\0') return false; *result = (*result << 4) + DigitValue(*ptr); } return true; } // Handling UTF-16 surrogate pairs. UTF-16 encodes code points in the range // 0x10000...0x10ffff as a pair of numbers, a head surrogate followed by a trail // surrogate. These numbers are in a reserved range of Unicode code points, so // if we encounter such a pair we know how to parse it and convert it into a // single code point. static const uint32 kMinHeadSurrogate = 0xd800; static const uint32 kMaxHeadSurrogate = 0xdc00; static const uint32 kMinTrailSurrogate = 0xdc00; static const uint32 kMaxTrailSurrogate = 0xe000; static inline bool IsHeadSurrogate(uint32 code_point) { return (code_point >= kMinHeadSurrogate) && (code_point < kMaxHeadSurrogate); } static inline bool IsTrailSurrogate(uint32 code_point) { return (code_point >= kMinTrailSurrogate) && (code_point < kMaxTrailSurrogate); } // Combine a head and trail surrogate into a single Unicode code point. static uint32 AssembleUTF16(uint32 head_surrogate, uint32 trail_surrogate) { GOOGLE_DCHECK(IsHeadSurrogate(head_surrogate)); GOOGLE_DCHECK(IsTrailSurrogate(trail_surrogate)); return 0x10000 + (((head_surrogate - kMinHeadSurrogate) << 10) | (trail_surrogate - kMinTrailSurrogate)); } // Convert the escape sequence parameter to a number of expected hex digits. static inline int UnicodeLength(char key) { if (key == 'u') return 4; if (key == 'U') return 8; return 0; } // Given a pointer to the 'u' or 'U' starting a Unicode escape sequence, attempt // to parse that sequence. On success, returns a pointer to the first char // beyond that sequence, and fills in *code_point. On failure, returns ptr // itself. static const char* FetchUnicodePoint(const char* ptr, uint32* code_point) { const char* p = ptr; // Fetch the code point. const int len = UnicodeLength(*p++); if (!ReadHexDigits(p, len, code_point)) return ptr; p += len; // Check if the code point we read is a "head surrogate." If so, then we // expect it to be immediately followed by another code point which is a valid // "trail surrogate," and together they form a UTF-16 pair which decodes into // a single Unicode point. Trail surrogates may only use \u, not \U. if (IsHeadSurrogate(*code_point) && *p == '\\' && *(p + 1) == 'u') { uint32 trail_surrogate; if (ReadHexDigits(p + 2, 4, &trail_surrogate) && IsTrailSurrogate(trail_surrogate)) { *code_point = AssembleUTF16(*code_point, trail_surrogate); p += 6; } // If this failed, then we just emit the head surrogate as a code point. // It's bogus, but so is the string. } return p; } // The text string must begin and end with single or double quote // characters. void Tokenizer::ParseStringAppend(const string& text, string* output) { // Reminder: text[0] is always a quote character. (If text is // empty, it's invalid, so we'll just return). const size_t text_size = text.size(); if (text_size == 0) { GOOGLE_LOG(DFATAL) << " Tokenizer::ParseStringAppend() passed text that could not" " have been tokenized as a string: " << CEscape(text); return; } // Reserve room for new string. The branch is necessary because if // there is already space available the reserve() call might // downsize the output. const size_t new_len = text_size + output->size(); if (new_len > output->capacity()) { output->reserve(new_len); } // Loop through the string copying characters to "output" and // interpreting escape sequences. Note that any invalid escape // sequences or other errors were already reported while tokenizing. // In this case we do not need to produce valid results. for (const char* ptr = text.c_str() + 1; *ptr != '\0'; ptr++) { if (*ptr == '\\' && ptr[1] != '\0') { // An escape sequence. ++ptr; if (OctalDigit::InClass(*ptr)) { // An octal escape. May one, two, or three digits. int code = DigitValue(*ptr); if (OctalDigit::InClass(ptr[1])) { ++ptr; code = code * 8 + DigitValue(*ptr); } if (OctalDigit::InClass(ptr[1])) { ++ptr; code = code * 8 + DigitValue(*ptr); } output->push_back(static_cast(code)); } else if (*ptr == 'x') { // A hex escape. May zero, one, or two digits. (The zero case // will have been caught as an error earlier.) int code = 0; if (HexDigit::InClass(ptr[1])) { ++ptr; code = DigitValue(*ptr); } if (HexDigit::InClass(ptr[1])) { ++ptr; code = code * 16 + DigitValue(*ptr); } output->push_back(static_cast(code)); } else if (*ptr == 'u' || *ptr == 'U') { uint32 unicode; const char* end = FetchUnicodePoint(ptr, &unicode); if (end == ptr) { // Failure: Just dump out what we saw, don't try to parse it. output->push_back(*ptr); } else { AppendUTF8(unicode, output); ptr = end - 1; // Because we're about to ++ptr. } } else { // Some other escape code. output->push_back(TranslateEscape(*ptr)); } } else if (*ptr == text[0] && ptr[1] == '\0') { // Ignore final quote matching the starting quote. } else { output->push_back(*ptr); } } } template static bool AllInClass(const string& s) { for (int i = 0; i < s.size(); ++i) { if (!CharacterClass::InClass(s[i])) return false; } return true; } bool Tokenizer::IsIdentifier(const string& text) { // Mirrors IDENTIFIER definition in Tokenizer::Next() above. if (text.size() == 0) return false; if (!Letter::InClass(text.at(0))) return false; if (!AllInClass(text.substr(1))) return false; return true; } } // namespace io } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/tokenizer.h000066400000000000000000000403261334102242000300700ustar00rootroot00000000000000// 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. // // Class for parsing tokenized text from a ZeroCopyInputStream. #ifndef GOOGLE_PROTOBUF_IO_TOKENIZER_H__ #define GOOGLE_PROTOBUF_IO_TOKENIZER_H__ #include #include #include #include namespace google { namespace protobuf { namespace io { class ZeroCopyInputStream; // zero_copy_stream.h // Defined in this file. class ErrorCollector; class Tokenizer; // By "column number", the proto compiler refers to a count of the number // of bytes before a given byte, except that a tab character advances to // the next multiple of 8 bytes. Note in particular that column numbers // are zero-based, while many user interfaces use one-based column numbers. typedef int ColumnNumber; // Abstract interface for an object which collects the errors that occur // during parsing. A typical implementation might simply print the errors // to stdout. class LIBPROTOBUF_EXPORT ErrorCollector { public: inline ErrorCollector() {} virtual ~ErrorCollector(); // Indicates that there was an error in the input at the given line and // column numbers. The numbers are zero-based, so you may want to add // 1 to each before printing them. virtual void AddError(int line, ColumnNumber column, const string& message) = 0; // Indicates that there was a warning in the input at the given line and // column numbers. The numbers are zero-based, so you may want to add // 1 to each before printing them. virtual void AddWarning(int line, ColumnNumber column, const string& message) { } private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector); }; // This class converts a stream of raw text into a stream of tokens for // the protocol definition parser to parse. The tokens recognized are // similar to those that make up the C language; see the TokenType enum for // precise descriptions. Whitespace and comments are skipped. By default, // C- and C++-style comments are recognized, but other styles can be used by // calling set_comment_style(). class LIBPROTOBUF_EXPORT Tokenizer { public: // Construct a Tokenizer that reads and tokenizes text from the given // 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(); enum TokenType { TYPE_START, // Next() has not yet been called. TYPE_END, // End of input reached. "text" is empty. TYPE_IDENTIFIER, // A sequence of letters, digits, and underscores, not // starting with a digit. It is an error for a number // to be followed by an identifier with no space in // between. TYPE_INTEGER, // A sequence of digits representing an integer. Normally // the digits are decimal, but a prefix of "0x" indicates // a hex number and a leading zero indicates octal, just // like with C numeric literals. A leading negative sign // is NOT included in the token; it's up to the parser to // interpret the unary minus operator on its own. TYPE_FLOAT, // A floating point literal, with a fractional part and/or // an exponent. Always in decimal. Again, never // negative. TYPE_STRING, // A quoted sequence of escaped characters. Either single // or double quotes can be used, but they must match. // A string literal cannot cross a line break. TYPE_SYMBOL, // Any other printable character, like '!' or '+'. // Symbols are always a single character, so "!+$%" is // four tokens. }; // Structure representing a token read from the token stream. struct Token { TokenType type; string text; // The exact text of the token as it appeared in // the input. e.g. tokens of TYPE_STRING will still // be escaped and in quotes. // "line" and "column" specify the position of the first character of // the token within the input stream. They are zero-based. int line; ColumnNumber column; ColumnNumber end_column; }; // 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(); // Return the previous token -- i.e. what current() returned before the // previous call to Next(). const Token& previous(); // Advance to the next token. Returns false if the end of the input is // reached. bool Next(); // Like Next(), but also collects comments which appear between the previous // and next tokens. // // Comments which appear to be attached to the previous token are stored // in *prev_tailing_comments. Comments which appear to be attached to the // next token are stored in *next_leading_comments. Comments appearing in // between which do not appear to be attached to either will be added to // detached_comments. Any of these parameters can be NULL to simply discard // the comments. // // A series of line comments appearing on consecutive lines, with no other // tokens appearing on those lines, will be treated as a single comment. // // Only the comment content is returned; comment markers (e.g. //) are // stripped out. For block comments, leading whitespace and an asterisk will // be stripped from the beginning of each line other than the first. Newlines // are included in the output. // // Examples: // // optional int32 foo = 1; // Comment attached to foo. // // Comment attached to bar. // optional int32 bar = 2; // // optional string baz = 3; // // Comment attached to baz. // // Another line attached to baz. // // // Comment attached to qux. // // // // Another line attached to qux. // optional double qux = 4; // // // Detached comment. This is not attached to qux or corge // // because there are blank lines separating it from both. // // optional string corge = 5; // /* Block comment attached // * to corge. Leading asterisks // * will be removed. */ // /* Block comment attached to // * grault. */ // optional int32 grault = 6; bool NextWithComments(string* prev_trailing_comments, std::vector* detached_comments, string* next_leading_comments); // Parse helpers --------------------------------------------------- // Parses a TYPE_FLOAT token. This never fails, so long as the text actually // comes from a TYPE_FLOAT token parsed by Tokenizer. If it doesn't, the // result is undefined (possibly an assert failure). static double ParseFloat(const string& text); // 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). static void ParseString(const string& text, string* output); // Identical to ParseString, but appends to output. static void ParseStringAppend(const string& text, string* output); // Parses a TYPE_INTEGER token. Returns false if the result would be // greater than max_value. Otherwise, returns true and sets *output to the // result. If the text is not from a Token of type TYPE_INTEGER originally // parsed by a Tokenizer, the result is undefined (possibly an assert // failure). static bool ParseInteger(const string& text, uint64 max_value, uint64* output); // Options --------------------------------------------------------- // Set true to allow floats to be suffixed with the letter 'f'. Tokens // which would otherwise be integers but which have the 'f' suffix will be // forced to be interpreted as floats. For all other purposes, the 'f' is // ignored. void set_allow_f_after_float(bool value) { allow_f_after_float_ = value; } // Valid values for set_comment_style(). enum CommentStyle { // Line comments begin with "//", block comments are delimited by "/*" and // "*/". CPP_COMMENT_STYLE, // Line comments begin with "#". No way to write block comments. SH_COMMENT_STYLE }; // Sets the comment style. void set_comment_style(CommentStyle style) { comment_style_ = style; } // Whether to require whitespace between a number and a field name. // Default is true. Do not use this; for Google-internal cleanup only. void set_require_space_after_number(bool require) { require_space_after_number_ = require; } // Whether to allow string literals to span multiple lines. Default is false. // Do not use this; for Google-internal cleanup only. void set_allow_multiline_strings(bool allow) { allow_multiline_strings_ = allow; } // External helper: validate an identifier. static bool IsIdentifier(const string& text); // ----------------------------------------------------------------- private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Tokenizer); Token current_; // Returned by current(). Token previous_; // Returned by previous(). ZeroCopyInputStream* input_; ErrorCollector* error_collector_; char current_char_; // == buffer_[buffer_pos_], updated by NextChar(). const char* buffer_; // Current buffer returned from input_. int buffer_size_; // Size of buffer_. int buffer_pos_; // Current position within the buffer. bool read_error_; // Did we previously encounter a read error? // Line and column number of current_char_ within the whole input stream. int line_; ColumnNumber column_; // String to which text should be appended as we advance through it. // Call RecordTo(&str) to start recording and StopRecording() to stop. // E.g. StartToken() calls RecordTo(¤t_.text). record_start_ is the // position within the current buffer where recording started. string* record_target_; int record_start_; // Options. bool allow_f_after_float_; CommentStyle comment_style_; bool require_space_after_number_; bool allow_multiline_strings_; // Since we count columns we need to interpret tabs somehow. We'll take // the standard 8-character definition for lack of any way to do better. // This must match the documentation of ColumnNumber. static const int kTabWidth = 8; // ----------------------------------------------------------------- // Helper methods. // Consume this character and advance to the next one. void NextChar(); // Read a new buffer from the input. void Refresh(); inline void RecordTo(string* target); inline void StopRecording(); // Called when the current character is the first character of a new // token (not including whitespace or comments). inline void StartToken(); // Called when the current character is the first character after the // end of the last token. After this returns, current_.text will // contain all text consumed since StartToken() was called. inline void EndToken(); // Convenience method to add an error at the current line and column. void AddError(const string& message) { error_collector_->AddError(line_, column_, message); } // ----------------------------------------------------------------- // The following four methods are used to consume tokens of specific // types. They are actually used to consume all characters *after* // the first, since the calling function consumes the first character // in order to decide what kind of token is being read. // Read and consume a string, ending when the given delimiter is // consumed. void ConsumeString(char delimiter); // Read and consume a number, returning TYPE_FLOAT or TYPE_INTEGER // depending on what was read. This needs to know if the first // character was a zero in order to correctly recognize hex and octal // numbers. // It also needs to know if the first character was a . to parse floating // point correctly. TokenType ConsumeNumber(bool started_with_zero, bool started_with_dot); // Consume the rest of a line. void ConsumeLineComment(string* content); // Consume until "*/". void ConsumeBlockComment(string* content); enum NextCommentStatus { // Started a line comment. LINE_COMMENT, // Started a block comment. BLOCK_COMMENT, // Consumed a slash, then realized it wasn't a comment. current_ has // been filled in with a slash token. The caller should return it. SLASH_NOT_COMMENT, // We do not appear to be starting a comment here. NO_COMMENT }; // If we're at the start of a new comment, consume it and return what kind // of comment it is. NextCommentStatus TryConsumeCommentStart(); // ----------------------------------------------------------------- // These helper methods make the parsing code more readable. The // "character classes" referred to are defined at the top of the .cc file. // Basically it is a C++ class with one method: // static bool InClass(char c); // The method returns true if c is a member of this "class", like "Letter" // or "Digit". // Returns true if the current character is of the given character // class, but does not consume anything. template inline bool LookingAt(); // If the current character is in the given class, consume it and return // true. Otherwise return false. // e.g. TryConsumeOne() template inline bool TryConsumeOne(); // Like above, but try to consume the specific character indicated. inline bool TryConsume(char c); // Consume zero or more of the given character class. template inline void ConsumeZeroOrMore(); // Consume one or more of the given character class or log the given // error message. // e.g. ConsumeOneOrMore("Expected digits."); template inline void ConsumeOneOrMore(const char* error); }; // inline methods ==================================================== inline const Tokenizer::Token& Tokenizer::current() { return current_; } inline const Tokenizer::Token& Tokenizer::previous() { return previous_; } inline void Tokenizer::ParseString(const string& text, string* output) { output->clear(); ParseStringAppend(text, output); } } // namespace io } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_IO_TOKENIZER_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/tokenizer_unittest.cc000066400000000000000000001113431334102242000321630ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { namespace { // =================================================================== // Data-Driven Test Infrastructure // TODO(kenton): This is copied from coded_stream_unittest. This is // temporary until these fetaures are integrated into gTest itself. // TEST_1D and TEST_2D are macros I'd eventually like to see added to // gTest. These macros can be used to declare tests which should be // 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: // // int kCases[] = {1, 2, 3, 4} // TEST_1D(MyFixture, MyTest, kCases) { // EXPECT_GT(kCases_case, 0); // } // // This test iterates through the numbers 1, 2, 3, and 4 and tests that // they are all grater than zero. In case of failure, the exact case // which failed will be printed. The case type must be printable using // ostream::operator<<. #define TEST_1D(FIXTURE, NAME, CASES) \ class FIXTURE##_##NAME##_DD : public FIXTURE { \ protected: \ template \ void DoSingleCase(const CaseType& CASES##_case); \ }; \ \ TEST_F(FIXTURE##_##NAME##_DD, NAME) { \ for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) { \ SCOPED_TRACE(testing::Message() \ << #CASES " case #" << i << ": " << CASES[i]); \ DoSingleCase(CASES[i]); \ } \ } \ \ template \ void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType& CASES##_case) #define TEST_2D(FIXTURE, NAME, CASES1, CASES2) \ class FIXTURE##_##NAME##_DD : public FIXTURE { \ protected: \ template \ void DoSingleCase(const CaseType1& CASES1##_case, \ const CaseType2& CASES2##_case); \ }; \ \ TEST_F(FIXTURE##_##NAME##_DD, NAME) { \ for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) { \ for (int j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) { \ SCOPED_TRACE(testing::Message() \ << #CASES1 " case #" << i << ": " << CASES1[i] << ", " \ << #CASES2 " case #" << j << ": " << CASES2[j]); \ DoSingleCase(CASES1[i], CASES2[j]); \ } \ } \ } \ \ template \ void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType1& CASES1##_case, \ const CaseType2& CASES2##_case) // ------------------------------------------------------------------- // An input stream that is basically like an ArrayInputStream but sometimes // returns empty buffers, just to throw us off. class TestInputStream : public ZeroCopyInputStream { public: TestInputStream(const void* data, int size, int block_size) : array_stream_(data, size, block_size), counter_(0) {} ~TestInputStream() {} // implements ZeroCopyInputStream ---------------------------------- bool Next(const void** data, int* size) { // We'll return empty buffers starting with the first buffer, and every // 3 and 5 buffers after that. if (counter_ % 3 == 0 || counter_ % 5 == 0) { *data = NULL; *size = 0; ++counter_; return true; } else { ++counter_; return array_stream_.Next(data, size); } } void BackUp(int count) { return array_stream_.BackUp(count); } bool Skip(int count) { return array_stream_.Skip(count); } int64 ByteCount() const { return array_stream_.ByteCount(); } private: ArrayInputStream array_stream_; int counter_; }; // ------------------------------------------------------------------- // An error collector which simply concatenates all its errors into a big // block of text which can be checked. class TestErrorCollector : public ErrorCollector { public: TestErrorCollector() {} ~TestErrorCollector() {} string text_; // implements ErrorCollector --------------------------------------- void AddError(int line, int column, const string& message) { strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", line, column, message); } }; // ------------------------------------------------------------------- // We test each operation over a variety of block sizes to insure that // we test cases where reads cross buffer boundaries as well as cases // where they don't. This is sort of a brute-force approach to this, // but it's easy to write and easy to understand. const int kBlockSizes[] = {1, 2, 3, 5, 7, 13, 32, 1024}; class TokenizerTest : public testing::Test { protected: // For easy testing. uint64 ParseInteger(const string& text) { uint64 result; EXPECT_TRUE(Tokenizer::ParseInteger(text, kuint64max, &result)); return result; } }; // =================================================================== // These tests causes gcc 3.3.5 (and earlier?) to give the cryptic error: // "sorry, unimplemented: `method_call_expr' not supported by dump_expr" #if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3) // In each test case, the entire input text should parse as a single token // of the given type. struct SimpleTokenCase { string input; Tokenizer::TokenType type; }; inline std::ostream& operator<<(std::ostream& out, const SimpleTokenCase& test_case) { return out << CEscape(test_case.input); } SimpleTokenCase kSimpleTokenCases[] = { // Test identifiers. { "hello", Tokenizer::TYPE_IDENTIFIER }, // Test integers. { "123", Tokenizer::TYPE_INTEGER }, { "0xab6", Tokenizer::TYPE_INTEGER }, { "0XAB6", Tokenizer::TYPE_INTEGER }, { "0X1234567", Tokenizer::TYPE_INTEGER }, { "0x89abcdef", Tokenizer::TYPE_INTEGER }, { "0x89ABCDEF", Tokenizer::TYPE_INTEGER }, { "01234567", Tokenizer::TYPE_INTEGER }, // Test floats. { "123.45", Tokenizer::TYPE_FLOAT }, { "1.", Tokenizer::TYPE_FLOAT }, { "1e3", Tokenizer::TYPE_FLOAT }, { "1E3", Tokenizer::TYPE_FLOAT }, { "1e-3", Tokenizer::TYPE_FLOAT }, { "1e+3", Tokenizer::TYPE_FLOAT }, { "1.e3", Tokenizer::TYPE_FLOAT }, { "1.2e3", Tokenizer::TYPE_FLOAT }, { ".1", Tokenizer::TYPE_FLOAT }, { ".1e3", Tokenizer::TYPE_FLOAT }, { ".1e-3", Tokenizer::TYPE_FLOAT }, { ".1e+3", Tokenizer::TYPE_FLOAT }, // Test strings. { "'hello'", Tokenizer::TYPE_STRING }, { "\"foo\"", Tokenizer::TYPE_STRING }, { "'a\"b'", Tokenizer::TYPE_STRING }, { "\"a'b\"", Tokenizer::TYPE_STRING }, { "'a\\'b'", Tokenizer::TYPE_STRING }, { "\"a\\\"b\"", Tokenizer::TYPE_STRING }, { "'\\xf'", Tokenizer::TYPE_STRING }, { "'\\0'", Tokenizer::TYPE_STRING }, // Test symbols. { "+", Tokenizer::TYPE_SYMBOL }, { ".", Tokenizer::TYPE_SYMBOL }, }; TEST_2D(TokenizerTest, SimpleTokens, kSimpleTokenCases, kBlockSizes) { // Set up the tokenizer. TestInputStream input(kSimpleTokenCases_case.input.data(), kSimpleTokenCases_case.input.size(), kBlockSizes_case); TestErrorCollector error_collector; Tokenizer tokenizer(&input, &error_collector); // Before Next() is called, the initial token should always be TYPE_START. EXPECT_EQ(Tokenizer::TYPE_START, tokenizer.current().type); EXPECT_EQ("", tokenizer.current().text); EXPECT_EQ(0, tokenizer.current().line); EXPECT_EQ(0, tokenizer.current().column); EXPECT_EQ(0, tokenizer.current().end_column); // Parse the token. ASSERT_TRUE(tokenizer.Next()); // Check that it has the right type. EXPECT_EQ(kSimpleTokenCases_case.type, tokenizer.current().type); // Check that it contains the complete input text. EXPECT_EQ(kSimpleTokenCases_case.input, tokenizer.current().text); // Check that it is located at the beginning of the input EXPECT_EQ(0, tokenizer.current().line); EXPECT_EQ(0, tokenizer.current().column); EXPECT_EQ(kSimpleTokenCases_case.input.size(), tokenizer.current().end_column); // There should be no more input. EXPECT_FALSE(tokenizer.Next()); // After Next() returns false, the token should have type TYPE_END. EXPECT_EQ(Tokenizer::TYPE_END, tokenizer.current().type); EXPECT_EQ("", tokenizer.current().text); EXPECT_EQ(0, tokenizer.current().line); EXPECT_EQ(kSimpleTokenCases_case.input.size(), tokenizer.current().column); EXPECT_EQ(kSimpleTokenCases_case.input.size(), tokenizer.current().end_column); // There should be no errors. EXPECT_TRUE(error_collector.text_.empty()); } TEST_1D(TokenizerTest, FloatSuffix, kBlockSizes) { // Test the "allow_f_after_float" option. // Set up the tokenizer. const char* text = "1f 2.5f 6e3f 7F"; TestInputStream input(text, strlen(text), kBlockSizes_case); TestErrorCollector error_collector; Tokenizer tokenizer(&input, &error_collector); tokenizer.set_allow_f_after_float(true); // Advance through tokens and check that they are parsed as expected. ASSERT_TRUE(tokenizer.Next()); EXPECT_EQ(tokenizer.current().text, "1f"); EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT); ASSERT_TRUE(tokenizer.Next()); EXPECT_EQ(tokenizer.current().text, "2.5f"); EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT); ASSERT_TRUE(tokenizer.Next()); EXPECT_EQ(tokenizer.current().text, "6e3f"); EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT); ASSERT_TRUE(tokenizer.Next()); EXPECT_EQ(tokenizer.current().text, "7F"); EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT); // There should be no more input. EXPECT_FALSE(tokenizer.Next()); // There should be no errors. EXPECT_TRUE(error_collector.text_.empty()); } #endif // ------------------------------------------------------------------- // In each case, the input is parsed to produce a list of tokens. The // last token in "output" must have type TYPE_END. struct MultiTokenCase { string input; Tokenizer::Token output[10]; // The compiler wants a constant array // size for initialization to work. There // is no reason this can't be increased if // needed. }; inline std::ostream& operator<<(std::ostream& out, const MultiTokenCase& test_case) { return out << CEscape(test_case.input); } MultiTokenCase kMultiTokenCases[] = { // Test empty input. { "", { { Tokenizer::TYPE_END , "" , 0, 0, 0 }, }}, // Test all token types at the same time. { "foo 1 1.2 + 'bar'", { { Tokenizer::TYPE_IDENTIFIER, "foo" , 0, 0, 3 }, { Tokenizer::TYPE_INTEGER , "1" , 0, 4, 5 }, { Tokenizer::TYPE_FLOAT , "1.2" , 0, 6, 9 }, { Tokenizer::TYPE_SYMBOL , "+" , 0, 10, 11 }, { Tokenizer::TYPE_STRING , "'bar'", 0, 12, 17 }, { Tokenizer::TYPE_END , "" , 0, 17, 17 }, }}, // Test that consecutive symbols are parsed as separate tokens. { "!@+%", { { Tokenizer::TYPE_SYMBOL , "!" , 0, 0, 1 }, { Tokenizer::TYPE_SYMBOL , "@" , 0, 1, 2 }, { Tokenizer::TYPE_SYMBOL , "+" , 0, 2, 3 }, { Tokenizer::TYPE_SYMBOL , "%" , 0, 3, 4 }, { Tokenizer::TYPE_END , "" , 0, 4, 4 }, }}, // Test that newlines affect line numbers correctly. { "foo bar\nrab oof", { { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, { Tokenizer::TYPE_IDENTIFIER, "bar", 0, 4, 7 }, { Tokenizer::TYPE_IDENTIFIER, "rab", 1, 0, 3 }, { Tokenizer::TYPE_IDENTIFIER, "oof", 1, 4, 7 }, { Tokenizer::TYPE_END , "" , 1, 7, 7 }, }}, // Test that tabs affect column numbers correctly. { "foo\tbar \tbaz", { { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, { Tokenizer::TYPE_IDENTIFIER, "bar", 0, 8, 11 }, { Tokenizer::TYPE_IDENTIFIER, "baz", 0, 16, 19 }, { Tokenizer::TYPE_END , "" , 0, 19, 19 }, }}, // Test that tabs in string literals affect column numbers correctly. { "\"foo\tbar\" baz", { { Tokenizer::TYPE_STRING , "\"foo\tbar\"", 0, 0, 12 }, { Tokenizer::TYPE_IDENTIFIER, "baz" , 0, 13, 16 }, { Tokenizer::TYPE_END , "" , 0, 16, 16 }, }}, // Test that line comments are ignored. { "foo // This is a comment\n" "bar // This is another comment", { { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, { Tokenizer::TYPE_IDENTIFIER, "bar", 1, 0, 3 }, { Tokenizer::TYPE_END , "" , 1, 30, 30 }, }}, // Test that block comments are ignored. { "foo /* This is a block comment */ bar", { { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, { Tokenizer::TYPE_IDENTIFIER, "bar", 0, 34, 37 }, { Tokenizer::TYPE_END , "" , 0, 37, 37 }, }}, // Test that sh-style comments are not ignored by default. { "foo # bar\n" "baz", { { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, { Tokenizer::TYPE_SYMBOL , "#" , 0, 4, 5 }, { Tokenizer::TYPE_IDENTIFIER, "bar", 0, 6, 9 }, { Tokenizer::TYPE_IDENTIFIER, "baz", 1, 0, 3 }, { Tokenizer::TYPE_END , "" , 1, 3, 3 }, }}, // Test all whitespace chars { "foo\n\t\r\v\fbar", { { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, { Tokenizer::TYPE_IDENTIFIER, "bar", 1, 11, 14 }, { Tokenizer::TYPE_END , "" , 1, 14, 14 }, }}, }; TEST_2D(TokenizerTest, MultipleTokens, kMultiTokenCases, kBlockSizes) { // Set up the tokenizer. TestInputStream input(kMultiTokenCases_case.input.data(), kMultiTokenCases_case.input.size(), kBlockSizes_case); TestErrorCollector error_collector; Tokenizer tokenizer(&input, &error_collector); // Before Next() is called, the initial token should always be TYPE_START. EXPECT_EQ(Tokenizer::TYPE_START, tokenizer.current().type); EXPECT_EQ("", tokenizer.current().text); EXPECT_EQ(0, tokenizer.current().line); EXPECT_EQ(0, tokenizer.current().column); EXPECT_EQ(0, tokenizer.current().end_column); // Loop through all expected tokens. int i = 0; Tokenizer::Token token; do { token = kMultiTokenCases_case.output[i++]; SCOPED_TRACE(testing::Message() << "Token #" << i << ": " << token.text); Tokenizer::Token previous = tokenizer.current(); // Next() should only return false when it hits the end token. if (token.type != Tokenizer::TYPE_END) { ASSERT_TRUE(tokenizer.Next()); } else { ASSERT_FALSE(tokenizer.Next()); } // Check that the previous token is set correctly. EXPECT_EQ(previous.type, tokenizer.previous().type); EXPECT_EQ(previous.text, tokenizer.previous().text); EXPECT_EQ(previous.line, tokenizer.previous().line); EXPECT_EQ(previous.column, tokenizer.previous().column); EXPECT_EQ(previous.end_column, tokenizer.previous().end_column); // Check that the token matches the expected one. EXPECT_EQ(token.type, tokenizer.current().type); EXPECT_EQ(token.text, tokenizer.current().text); EXPECT_EQ(token.line, tokenizer.current().line); EXPECT_EQ(token.column, tokenizer.current().column); EXPECT_EQ(token.end_column, tokenizer.current().end_column); } while (token.type != Tokenizer::TYPE_END); // There should be no errors. EXPECT_TRUE(error_collector.text_.empty()); } // This test causes gcc 3.3.5 (and earlier?) to give the cryptic error: // "sorry, unimplemented: `method_call_expr' not supported by dump_expr" #if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3) TEST_1D(TokenizerTest, ShCommentStyle, kBlockSizes) { // Test the "comment_style" option. const char* text = "foo # bar\n" "baz // qux\n" "corge /* grault */\n" "garply"; const char* const kTokens[] = {"foo", // "# bar" is ignored "baz", "/", "/", "qux", "corge", "/", "*", "grault", "*", "/", "garply"}; // Set up the tokenizer. TestInputStream input(text, strlen(text), kBlockSizes_case); TestErrorCollector error_collector; Tokenizer tokenizer(&input, &error_collector); 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++) { EXPECT_TRUE(tokenizer.Next()); EXPECT_EQ(tokenizer.current().text, kTokens[i]); } // There should be no more input. EXPECT_FALSE(tokenizer.Next()); // There should be no errors. EXPECT_TRUE(error_collector.text_.empty()); } #endif // ------------------------------------------------------------------- // In each case, the input is expected to have two tokens named "prev" and // "next" with comments in between. struct DocCommentCase { string input; const char* prev_trailing_comments; const char* detached_comments[10]; const char* next_leading_comments; }; inline std::ostream& operator<<(std::ostream& out, const DocCommentCase& test_case) { return out << CEscape(test_case.input); } DocCommentCase kDocCommentCases[] = { { "prev next", "", {}, "" }, { "prev /* ignored */ next", "", {}, "" }, { "prev // trailing comment\n" "next", " trailing comment\n", {}, "" }, { "prev\n" "// leading comment\n" "// line 2\n" "next", "", {}, " leading comment\n" " line 2\n" }, { "prev\n" "// trailing comment\n" "// line 2\n" "\n" "next", " trailing comment\n" " line 2\n", {}, "" }, { "prev // trailing comment\n" "// leading comment\n" "// line 2\n" "next", " trailing comment\n", {}, " leading comment\n" " line 2\n" }, { "prev /* trailing block comment */\n" "/* leading block comment\n" " * line 2\n" " * line 3 */" "next", " trailing block comment ", {}, " leading block comment\n" " line 2\n" " line 3 " }, { "prev\n" "/* trailing block comment\n" " * line 2\n" " * line 3\n" " */\n" "/* leading block comment\n" " * line 2\n" " * line 3 */" "next", " trailing block comment\n" " line 2\n" " line 3\n", {}, " leading block comment\n" " line 2\n" " line 3 " }, { "prev\n" "// trailing comment\n" "\n" "// detached comment\n" "// line 2\n" "\n" "// second detached comment\n" "/* third detached comment\n" " * line 2 */\n" "// leading comment\n" "next", " trailing comment\n", { " detached comment\n" " line 2\n", " second detached comment\n", " third detached comment\n" " line 2 " }, " leading comment\n" }, { "prev /**/\n" "\n" "// detached comment\n" "\n" "// leading comment\n" "next", "", { " detached comment\n" }, " leading comment\n" }, { "prev /**/\n" "// leading comment\n" "next", "", {}, " leading comment\n" }, }; TEST_2D(TokenizerTest, DocComments, kDocCommentCases, kBlockSizes) { // Set up the tokenizer. TestInputStream input(kDocCommentCases_case.input.data(), kDocCommentCases_case.input.size(), kBlockSizes_case); TestErrorCollector error_collector; Tokenizer tokenizer(&input, &error_collector); // Set up a second tokenizer where we'll pass all NULLs to NextWithComments(). TestInputStream input2(kDocCommentCases_case.input.data(), kDocCommentCases_case.input.size(), kBlockSizes_case); Tokenizer tokenizer2(&input2, &error_collector); tokenizer.Next(); tokenizer2.Next(); EXPECT_EQ("prev", tokenizer.current().text); EXPECT_EQ("prev", tokenizer2.current().text); string prev_trailing_comments; std::vector detached_comments; string next_leading_comments; tokenizer.NextWithComments(&prev_trailing_comments, &detached_comments, &next_leading_comments); tokenizer2.NextWithComments(NULL, NULL, NULL); EXPECT_EQ("next", tokenizer.current().text); EXPECT_EQ("next", tokenizer2.current().text); EXPECT_EQ(kDocCommentCases_case.prev_trailing_comments, prev_trailing_comments); for (int i = 0; i < detached_comments.size(); i++) { ASSERT_LT(i, GOOGLE_ARRAYSIZE(kDocCommentCases)); ASSERT_TRUE(kDocCommentCases_case.detached_comments[i] != NULL); EXPECT_EQ(kDocCommentCases_case.detached_comments[i], detached_comments[i]); } // Verify that we matched all the detached comments. EXPECT_EQ(NULL, kDocCommentCases_case.detached_comments[detached_comments.size()]); EXPECT_EQ(kDocCommentCases_case.next_leading_comments, next_leading_comments); } // ------------------------------------------------------------------- // Test parse helpers. It's not really worth setting up a full data-driven // test here. TEST_F(TokenizerTest, ParseInteger) { EXPECT_EQ(0, ParseInteger("0")); EXPECT_EQ(123, ParseInteger("123")); EXPECT_EQ(0xabcdef12u, ParseInteger("0xabcdef12")); EXPECT_EQ(0xabcdef12u, ParseInteger("0xABCDEF12")); EXPECT_EQ(kuint64max, ParseInteger("0xFFFFFFFFFFFFFFFF")); EXPECT_EQ(01234567, ParseInteger("01234567")); EXPECT_EQ(0X123, ParseInteger("0X123")); // Test invalid integers that may still be tokenized as integers. EXPECT_EQ(0, ParseInteger("0x")); uint64 i; // Test invalid integers that will never be tokenized as integers. EXPECT_FALSE(Tokenizer::ParseInteger("zxy", kuint64max, &i)); EXPECT_FALSE(Tokenizer::ParseInteger("1.2", kuint64max, &i)); EXPECT_FALSE(Tokenizer::ParseInteger("08", kuint64max, &i)); EXPECT_FALSE(Tokenizer::ParseInteger("0xg", kuint64max, &i)); EXPECT_FALSE(Tokenizer::ParseInteger("-1", kuint64max, &i)); // Test overflows. EXPECT_TRUE (Tokenizer::ParseInteger("0", 0, &i)); EXPECT_FALSE(Tokenizer::ParseInteger("1", 0, &i)); EXPECT_TRUE (Tokenizer::ParseInteger("1", 1, &i)); EXPECT_TRUE (Tokenizer::ParseInteger("12345", 12345, &i)); EXPECT_FALSE(Tokenizer::ParseInteger("12346", 12345, &i)); EXPECT_TRUE (Tokenizer::ParseInteger("0xFFFFFFFFFFFFFFFF" , kuint64max, &i)); EXPECT_FALSE(Tokenizer::ParseInteger("0x10000000000000000", kuint64max, &i)); } TEST_F(TokenizerTest, ParseFloat) { EXPECT_DOUBLE_EQ(1 , Tokenizer::ParseFloat("1.")); EXPECT_DOUBLE_EQ(1e3 , Tokenizer::ParseFloat("1e3")); EXPECT_DOUBLE_EQ(1e3 , Tokenizer::ParseFloat("1E3")); EXPECT_DOUBLE_EQ(1.5e3, Tokenizer::ParseFloat("1.5e3")); EXPECT_DOUBLE_EQ(.1 , Tokenizer::ParseFloat(".1")); EXPECT_DOUBLE_EQ(.25 , Tokenizer::ParseFloat(".25")); EXPECT_DOUBLE_EQ(.1e3 , Tokenizer::ParseFloat(".1e3")); EXPECT_DOUBLE_EQ(.25e3, Tokenizer::ParseFloat(".25e3")); EXPECT_DOUBLE_EQ(.1e+3, Tokenizer::ParseFloat(".1e+3")); EXPECT_DOUBLE_EQ(.1e-3, Tokenizer::ParseFloat(".1e-3")); EXPECT_DOUBLE_EQ(5 , Tokenizer::ParseFloat("5")); EXPECT_DOUBLE_EQ(6e-12, Tokenizer::ParseFloat("6e-12")); EXPECT_DOUBLE_EQ(1.2 , Tokenizer::ParseFloat("1.2")); EXPECT_DOUBLE_EQ(1.e2 , Tokenizer::ParseFloat("1.e2")); // Test invalid integers that may still be tokenized as integers. EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1e")); EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1e-")); EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1.e")); // Test 'f' suffix. EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1f")); EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1.0f")); EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1F")); // These should parse successfully even though they are out of range. // Overflows become infinity and underflows become zero. EXPECT_EQ( 0.0, Tokenizer::ParseFloat("1e-9999999999999999999999999999")); EXPECT_EQ(HUGE_VAL, Tokenizer::ParseFloat("1e+9999999999999999999999999999")); #ifdef PROTOBUF_HAS_DEATH_TEST // death tests do not work on Windows yet // Test invalid integers that will never be tokenized as integers. EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat("zxy"), "passed text that could not have been tokenized as a float"); EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat("1-e0"), "passed text that could not have been tokenized as a float"); EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat("-1.0"), "passed text that could not have been tokenized as a float"); #endif // PROTOBUF_HAS_DEATH_TEST } TEST_F(TokenizerTest, ParseString) { string output; Tokenizer::ParseString("'hello'", &output); EXPECT_EQ("hello", output); Tokenizer::ParseString("\"blah\\nblah2\"", &output); EXPECT_EQ("blah\nblah2", output); Tokenizer::ParseString("'\\1x\\1\\123\\739\\52\\334n\\3'", &output); EXPECT_EQ("\1x\1\123\739\52\334n\3", output); Tokenizer::ParseString("'\\x20\\x4'", &output); EXPECT_EQ("\x20\x4", output); // Test invalid strings that may still be tokenized as strings. Tokenizer::ParseString("\"\\a\\l\\v\\t", &output); // \l is invalid EXPECT_EQ("\a?\v\t", output); Tokenizer::ParseString("'", &output); EXPECT_EQ("", output); Tokenizer::ParseString("'\\", &output); EXPECT_EQ("\\", output); // Experiment with Unicode escapes. Here are one-, two- and three-byte Unicode // characters. Tokenizer::ParseString("'\\u0024\\u00a2\\u20ac\\U00024b62XX'", &output); EXPECT_EQ("$¢€𤭢XX", output); // Same thing encoded using UTF16. Tokenizer::ParseString("'\\u0024\\u00a2\\u20ac\\ud852\\udf62XX'", &output); EXPECT_EQ("$¢€𤭢XX", output); // Here's some broken UTF16; there's a head surrogate with no tail surrogate. // We just output this as if it were UTF8; it's not a defined code point, but // it has a defined encoding. Tokenizer::ParseString("'\\ud852XX'", &output); EXPECT_EQ("\xed\xa1\x92XX", output); // Malformed escape: Demons may fly out of the nose. Tokenizer::ParseString("\\u0", &output); EXPECT_EQ("u0", output); // Test invalid strings that will never be tokenized as strings. #ifdef PROTOBUF_HAS_DEATH_TEST // death tests do not work on Windows yet EXPECT_DEBUG_DEATH(Tokenizer::ParseString("", &output), "passed text that could not have been tokenized as a string"); #endif // PROTOBUF_HAS_DEATH_TEST } TEST_F(TokenizerTest, ParseStringAppend) { // Check that ParseString and ParseStringAppend differ. string output("stuff+"); Tokenizer::ParseStringAppend("'hello'", &output); EXPECT_EQ("stuff+hello", output); Tokenizer::ParseString("'hello'", &output); EXPECT_EQ("hello", output); } // ------------------------------------------------------------------- // Each case parses some input text, ignoring the tokens produced, and // checks that the error output matches what is expected. struct ErrorCase { string input; bool recoverable; // True if the tokenizer should be able to recover and // parse more tokens after seeing this error. Cases // for which this is true must end with "foo" as // the last token, which the test will check for. const char* errors; }; inline std::ostream& operator<<(std::ostream& out, const ErrorCase& test_case) { return out << CEscape(test_case.input); } ErrorCase kErrorCases[] = { // String errors. { "'\\l' foo", true, "0:2: Invalid escape sequence in string literal.\n" }, { "'\\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" }, { "'\\u01' foo", true, "0:5: Expected four hex digits for \\u escape sequence.\n" }, { "'\\u01' foo", true, "0:5: Expected four hex digits for \\u escape sequence.\n" }, { "'\\uXYZ' foo", true, "0:3: Expected four hex digits for \\u escape sequence.\n" }, // Integer errors. { "123foo", true, "0:3: Need space between number and identifier.\n" }, // Hex/octal errors. { "0x foo", true, "0:2: \"0x\" must be followed by hex digits.\n" }, { "0541823 foo", true, "0:4: Numbers starting with leading zero must be in octal.\n" }, { "0x123z foo", true, "0:5: Need space between number and identifier.\n" }, { "0x123.4 foo", true, "0:5: Hex and octal numbers must be integers.\n" }, { "0123.4 foo", true, "0:4: Hex and octal numbers must be integers.\n" }, // Float errors. { "1e foo", true, "0:2: \"e\" must be followed by exponent.\n" }, { "1e- foo", true, "0:3: \"e\" must be followed by exponent.\n" }, { "1.2.3 foo", true, "0:3: Already saw decimal point or exponent; can't have another one.\n" }, { "1e2.3 foo", true, "0:3: Already saw decimal point or exponent; can't have another one.\n" }, { "a.1 foo", true, "0:1: Need space between identifier and decimal point.\n" }, // allow_f_after_float not enabled, so this should be an error. { "1.0f foo", true, "0:3: Need space between number and identifier.\n" }, // Block comment errors. { "/*", false, "0:2: End-of-file inside block comment.\n" "0:0: Comment started here.\n"}, { "/*/*/ foo", true, "0:3: \"/*\" inside block comment. Block comments cannot be nested.\n"}, // Control characters. Multiple consecutive control characters should only // produce one error. { "\b foo", true, "0:0: Invalid control characters encountered in text.\n" }, { "\b\b foo", true, "0:0: Invalid control characters encountered in text.\n" }, // Check that control characters at end of input don't result in an // infinite loop. { "\b", false, "0:0: Invalid control characters encountered in text.\n" }, // Check recovery from '\0'. We have to explicitly specify the length of // these strings because otherwise the string constructor will just call // strlen() which will see the first '\0' and think that is the end of the // string. { string("\0foo", 4), true, "0:0: Invalid control characters encountered in text.\n" }, { string("\0\0foo", 5), true, "0:0: Invalid control characters encountered in text.\n" }, // Check error from high order bits set { "\300foo", true, "0:0: Interpreting non ascii codepoint 192.\n" }, }; TEST_2D(TokenizerTest, Errors, kErrorCases, kBlockSizes) { // Set up the tokenizer. TestInputStream input(kErrorCases_case.input.data(), kErrorCases_case.input.size(), kBlockSizes_case); TestErrorCollector error_collector; Tokenizer tokenizer(&input, &error_collector); // Ignore all input, except remember if the last token was "foo". bool last_was_foo = false; while (tokenizer.Next()) { last_was_foo = tokenizer.current().text == "foo"; } // Check that the errors match what was expected. EXPECT_EQ(kErrorCases_case.errors, error_collector.text_); // If the error was recoverable, make sure we saw "foo" after it. if (kErrorCases_case.recoverable) { EXPECT_TRUE(last_was_foo); } } // ------------------------------------------------------------------- TEST_1D(TokenizerTest, BackUpOnDestruction, kBlockSizes) { string text = "foo bar"; TestInputStream input(text.data(), text.size(), kBlockSizes_case); // Create a tokenizer, read one token, then destroy it. { TestErrorCollector error_collector; Tokenizer tokenizer(&input, &error_collector); tokenizer.Next(); } // Only "foo" should have been read. EXPECT_EQ(strlen("foo"), input.ByteCount()); } } // namespace } // namespace io } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/zero_copy_stream.cc000066400000000000000000000045301334102242000315750ustar00rootroot00000000000000// 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 #include #include namespace google { namespace protobuf { namespace io { bool ZeroCopyOutputStream::WriteAliasedRaw(const void* /* data */, int /* size */) { GOOGLE_LOG(FATAL) << "This ZeroCopyOutputStream doesn't support aliasing. " "Reaching here usually means a ZeroCopyOutputStream " "implementation bug."; return false; } } // namespace io } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/zero_copy_stream.h000066400000000000000000000236771334102242000314540ustar00rootroot00000000000000// 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. // // This file contains the ZeroCopyInputStream and ZeroCopyOutputStream // interfaces, which represent abstract I/O streams to and from which // protocol buffers can be read and written. For a few simple // implementations of these interfaces, see zero_copy_stream_impl.h. // // These interfaces are different from classic I/O streams in that they // try to minimize the amount of data copying that needs to be done. // To accomplish this, responsibility for allocating buffers is moved to // the stream object, rather than being the responsibility of the caller. // So, the stream can return a buffer which actually points directly into // the final data structure where the bytes are to be stored, and the caller // can interact directly with that buffer, eliminating an intermediate copy // operation. // // As an example, consider the common case in which you are reading bytes // from an array that is already in memory (or perhaps an mmap()ed file). // With classic I/O streams, you would do something like: // char buffer[BUFFER_SIZE]; // input->Read(buffer, BUFFER_SIZE); // DoSomething(buffer, BUFFER_SIZE); // Then, the stream basically just calls memcpy() to copy the data from // the array into your buffer. With a ZeroCopyInputStream, you would do // this instead: // const void* buffer; // int size; // input->Next(&buffer, &size); // DoSomething(buffer, size); // Here, no copy is performed. The input stream returns a pointer directly // into the backing array, and the caller ends up reading directly from it. // // If you want to be able to read the old-fashion way, you can create // a CodedInputStream or CodedOutputStream wrapping these objects and use // their ReadRaw()/WriteRaw() methods. These will, of course, add a copy // step, but Coded*Stream will handle buffering so at least it will be // reasonably efficient. // // ZeroCopyInputStream example: // // Read in a file and print its contents to stdout. // int fd = open("myfile", O_RDONLY); // ZeroCopyInputStream* input = new FileInputStream(fd); // // const void* buffer; // int size; // while (input->Next(&buffer, &size)) { // cout.write(buffer, size); // } // // delete input; // close(fd); // // ZeroCopyOutputStream example: // // Copy the contents of "infile" to "outfile", using plain read() for // // "infile" but a ZeroCopyOutputStream for "outfile". // int infd = open("infile", O_RDONLY); // int outfd = open("outfile", O_WRONLY); // ZeroCopyOutputStream* output = new FileOutputStream(outfd); // // void* buffer; // int size; // while (output->Next(&buffer, &size)) { // int bytes = read(infd, buffer, size); // if (bytes < size) { // // Reached EOF. // output->BackUp(size - bytes); // break; // } // } // // delete output; // close(infd); // close(outfd); #ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__ #define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__ #include #include namespace google { namespace protobuf { namespace io { // Defined in this file. class ZeroCopyInputStream; class ZeroCopyOutputStream; // Abstract interface similar to an input stream but designed to minimize // copying. class LIBPROTOBUF_EXPORT ZeroCopyInputStream { public: ZeroCopyInputStream() {} virtual ~ZeroCopyInputStream() {} // Obtains a chunk of data from the stream. // // Preconditions: // * "size" and "data" are not NULL. // // Postconditions: // * If the returned value is false, there is no more data to return or // an error occurred. All errors are permanent. // * Otherwise, "size" points to the actual number of bytes read and "data" // points to a pointer to a buffer containing these bytes. // * Ownership of this buffer remains with the stream, and the buffer // remains valid only until some other method of the stream is called // or the stream is destroyed. // * It is legal for the returned buffer to have zero size, as long // as repeatedly calling Next() eventually yields a buffer with non-zero // size. virtual bool Next(const void** data, int* size) = 0; // Backs up a number of bytes, so that the next call to Next() returns // data again that was already returned by the last call to Next(). This // is useful when writing procedures that are only supposed to read up // to a certain point in the input, then return. If Next() returns a // buffer that goes beyond what you wanted to read, you can use BackUp() // to return to the point where you intended to finish. // // Preconditions: // * The last method called must have been Next(). // * count must be less than or equal to the size of the last buffer // returned by Next(). // // Postconditions: // * The last "count" bytes of the last buffer returned by Next() will be // pushed back into the stream. Subsequent calls to Next() will return // the same data again before producing new data. virtual void BackUp(int count) = 0; // Skips a number of bytes. Returns false if the end of the stream is // reached or some input error occurred. In the end-of-stream case, the // stream is advanced to the end of the stream (so ByteCount() will return // the total size of the stream). virtual bool Skip(int count) = 0; // Returns the total number of bytes read since this object was created. virtual int64 ByteCount() const = 0; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyInputStream); }; // Abstract interface similar to an output stream but designed to minimize // copying. class LIBPROTOBUF_EXPORT ZeroCopyOutputStream { public: ZeroCopyOutputStream() {} virtual ~ZeroCopyOutputStream() {} // Obtains a buffer into which data can be written. Any data written // into this buffer will eventually (maybe instantly, maybe later on) // be written to the output. // // Preconditions: // * "size" and "data" are not NULL. // // Postconditions: // * If the returned value is false, an error occurred. All errors are // permanent. // * Otherwise, "size" points to the actual number of bytes in the buffer // and "data" points to the buffer. // * Ownership of this buffer remains with the stream, and the buffer // remains valid only until some other method of the stream is called // or the stream is destroyed. // * Any data which the caller stores in this buffer will eventually be // written to the output (unless BackUp() is called). // * It is legal for the returned buffer to have zero size, as long // as repeatedly calling Next() eventually yields a buffer with non-zero // size. virtual bool Next(void** data, int* size) = 0; // Backs up a number of bytes, so that the end of the last buffer returned // by Next() is not actually written. This is needed when you finish // writing all the data you want to write, but the last buffer was bigger // than you needed. You don't want to write a bunch of garbage after the // end of your data, so you use BackUp() to back up. // // Preconditions: // * The last method called must have been Next(). // * count must be less than or equal to the size of the last buffer // returned by Next(). // * The caller must not have written anything to the last "count" bytes // of that buffer. // // Postconditions: // * The last "count" bytes of the last buffer returned by Next() will be // ignored. virtual void BackUp(int count) = 0; // Returns the total number of bytes written since this object was created. virtual int64 ByteCount() const = 0; // Write a given chunk of data to the output. Some output streams may // implement this in a way that avoids copying. Check AllowsAliasing() before // calling WriteAliasedRaw(). It will GOOGLE_CHECK fail if WriteAliasedRaw() is // called on a stream that does not allow aliasing. // // NOTE: It is caller's responsibility to ensure that the chunk of memory // remains live until all of the data has been consumed from the stream. 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 #endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc000066400000000000000000000311201334102242000326110ustar00rootroot00000000000000// 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. #ifndef _MSC_VER #include #include #include #include #endif #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { #ifdef _WIN32 // Win32 lseek is broken: If invoked on a non-seekable file descriptor, its // return value is undefined. We re-define it to always produce an error. #define lseek(fd, offset, origin) ((off_t)-1) // DO NOT include , instead create functions in io_win32.{h,cc} and import // them like we do below. using google::protobuf::internal::win32::access; using google::protobuf::internal::win32::close; using google::protobuf::internal::win32::open; using google::protobuf::internal::win32::read; using google::protobuf::internal::win32::write; #endif namespace { // EINTR sucks. int close_no_eintr(int fd) { int result; do { result = close(fd); } while (result < 0 && errno == EINTR); return result; } } // namespace // =================================================================== FileInputStream::FileInputStream(int file_descriptor, int block_size) : copying_input_(file_descriptor), impl_(©ing_input_, block_size) { } bool FileInputStream::Close() { return copying_input_.Close(); } bool FileInputStream::Next(const void** data, int* size) { return impl_.Next(data, size); } void FileInputStream::BackUp(int count) { impl_.BackUp(count); } bool FileInputStream::Skip(int count) { return impl_.Skip(count); } int64 FileInputStream::ByteCount() const { return impl_.ByteCount(); } FileInputStream::CopyingFileInputStream::CopyingFileInputStream( int file_descriptor) : file_(file_descriptor), close_on_delete_(false), is_closed_(false), errno_(0), previous_seek_failed_(false) { } FileInputStream::CopyingFileInputStream::~CopyingFileInputStream() { if (close_on_delete_) { if (!Close()) { GOOGLE_LOG(ERROR) << "close() failed: " << strerror(errno_); } } } bool FileInputStream::CopyingFileInputStream::Close() { GOOGLE_CHECK(!is_closed_); is_closed_ = true; if (close_no_eintr(file_) != 0) { // The docs on close() do not specify whether a file descriptor is still // open after close() fails with EIO. However, the glibc source code // seems to indicate that it is not. errno_ = errno; return false; } return true; } int FileInputStream::CopyingFileInputStream::Read(void* buffer, int size) { GOOGLE_CHECK(!is_closed_); int result; do { result = read(file_, buffer, size); } while (result < 0 && errno == EINTR); if (result < 0) { // Read error (not EOF). errno_ = errno; } return result; } int FileInputStream::CopyingFileInputStream::Skip(int count) { GOOGLE_CHECK(!is_closed_); if (!previous_seek_failed_ && lseek(file_, count, SEEK_CUR) != (off_t)-1) { // Seek succeeded. return count; } else { // Failed to seek. // Note to self: Don't seek again. This file descriptor doesn't // support it. previous_seek_failed_ = true; // Use the default implementation. return CopyingInputStream::Skip(count); } } // =================================================================== FileOutputStream::FileOutputStream(int file_descriptor, int block_size) : copying_output_(file_descriptor), impl_(©ing_output_, block_size) { } FileOutputStream::~FileOutputStream() { impl_.Flush(); } bool FileOutputStream::Close() { bool flush_succeeded = impl_.Flush(); return copying_output_.Close() && flush_succeeded; } bool FileOutputStream::Flush() { return impl_.Flush(); } bool FileOutputStream::Next(void** data, int* size) { return impl_.Next(data, size); } void FileOutputStream::BackUp(int count) { impl_.BackUp(count); } int64 FileOutputStream::ByteCount() const { return impl_.ByteCount(); } FileOutputStream::CopyingFileOutputStream::CopyingFileOutputStream( int file_descriptor) : file_(file_descriptor), close_on_delete_(false), is_closed_(false), errno_(0) { } FileOutputStream::CopyingFileOutputStream::~CopyingFileOutputStream() { if (close_on_delete_) { if (!Close()) { GOOGLE_LOG(ERROR) << "close() failed: " << strerror(errno_); } } } bool FileOutputStream::CopyingFileOutputStream::Close() { GOOGLE_CHECK(!is_closed_); is_closed_ = true; if (close_no_eintr(file_) != 0) { // The docs on close() do not specify whether a file descriptor is still // open after close() fails with EIO. However, the glibc source code // seems to indicate that it is not. errno_ = errno; return false; } return true; } bool FileOutputStream::CopyingFileOutputStream::Write( const void* buffer, int size) { GOOGLE_CHECK(!is_closed_); int total_written = 0; const uint8* buffer_base = reinterpret_cast(buffer); while (total_written < size) { int bytes; do { bytes = write(file_, buffer_base + total_written, size - total_written); } while (bytes < 0 && errno == EINTR); if (bytes <= 0) { // Write error. // FIXME(kenton): According to the man page, if write() returns zero, // there was no error; write() simply did not write anything. It's // unclear under what circumstances this might happen, but presumably // errno won't be set in this case. I am confused as to how such an // event should be handled. For now I'm treating it as an error, since // retrying seems like it could lead to an infinite loop. I suspect // this never actually happens anyway. if (bytes < 0) { errno_ = errno; } return false; } total_written += bytes; } return true; } // =================================================================== IstreamInputStream::IstreamInputStream(std::istream* input, int block_size) : copying_input_(input), impl_(©ing_input_, block_size) {} bool IstreamInputStream::Next(const void** data, int* size) { return impl_.Next(data, size); } void IstreamInputStream::BackUp(int count) { impl_.BackUp(count); } bool IstreamInputStream::Skip(int count) { return impl_.Skip(count); } int64 IstreamInputStream::ByteCount() const { return impl_.ByteCount(); } IstreamInputStream::CopyingIstreamInputStream::CopyingIstreamInputStream( std::istream* input) : input_(input) {} IstreamInputStream::CopyingIstreamInputStream::~CopyingIstreamInputStream() {} int IstreamInputStream::CopyingIstreamInputStream::Read( void* buffer, int size) { input_->read(reinterpret_cast(buffer), size); int result = input_->gcount(); if (result == 0 && input_->fail() && !input_->eof()) { return -1; } return result; } // =================================================================== OstreamOutputStream::OstreamOutputStream(std::ostream* output, int block_size) : copying_output_(output), impl_(©ing_output_, block_size) {} OstreamOutputStream::~OstreamOutputStream() { impl_.Flush(); } bool OstreamOutputStream::Next(void** data, int* size) { return impl_.Next(data, size); } void OstreamOutputStream::BackUp(int count) { impl_.BackUp(count); } int64 OstreamOutputStream::ByteCount() const { return impl_.ByteCount(); } OstreamOutputStream::CopyingOstreamOutputStream::CopyingOstreamOutputStream( std::ostream* output) : output_(output) {} OstreamOutputStream::CopyingOstreamOutputStream::~CopyingOstreamOutputStream() { } bool OstreamOutputStream::CopyingOstreamOutputStream::Write( const void* buffer, int size) { output_->write(reinterpret_cast(buffer), size); return output_->good(); } // =================================================================== ConcatenatingInputStream::ConcatenatingInputStream( ZeroCopyInputStream* const streams[], int count) : streams_(streams), stream_count_(count), bytes_retired_(0) { } bool ConcatenatingInputStream::Next(const void** data, int* size) { while (stream_count_ > 0) { if (streams_[0]->Next(data, size)) return true; // That stream is done. Advance to the next one. bytes_retired_ += streams_[0]->ByteCount(); ++streams_; --stream_count_; } // No more streams. return false; } void ConcatenatingInputStream::BackUp(int count) { if (stream_count_ > 0) { streams_[0]->BackUp(count); } else { GOOGLE_LOG(DFATAL) << "Can't BackUp() after failed Next()."; } } bool ConcatenatingInputStream::Skip(int count) { while (stream_count_ > 0) { // Assume that ByteCount() can be used to find out how much we actually // skipped when Skip() fails. int64 target_byte_count = streams_[0]->ByteCount() + count; if (streams_[0]->Skip(count)) return true; // Hit the end of the stream. Figure out how many more bytes we still have // to skip. int64 final_byte_count = streams_[0]->ByteCount(); GOOGLE_DCHECK_LT(final_byte_count, target_byte_count); count = target_byte_count - final_byte_count; // That stream is done. Advance to the next one. bytes_retired_ += final_byte_count; ++streams_; --stream_count_; } return false; } int64 ConcatenatingInputStream::ByteCount() const { if (stream_count_ == 0) { return bytes_retired_; } else { return bytes_retired_ + streams_[0]->ByteCount(); } } // =================================================================== LimitingInputStream::LimitingInputStream(ZeroCopyInputStream* input, int64 limit) : input_(input), limit_(limit) { prior_bytes_read_ = input_->ByteCount(); } LimitingInputStream::~LimitingInputStream() { // If we overshot the limit, back up. if (limit_ < 0) input_->BackUp(-limit_); } bool LimitingInputStream::Next(const void** data, int* size) { if (limit_ <= 0) return false; if (!input_->Next(data, size)) return false; limit_ -= *size; if (limit_ < 0) { // We overshot the limit. Reduce *size to hide the rest of the buffer. *size += limit_; } return true; } void LimitingInputStream::BackUp(int count) { if (limit_ < 0) { input_->BackUp(count - limit_); limit_ = count; } else { input_->BackUp(count); limit_ += count; } } bool LimitingInputStream::Skip(int count) { if (count > limit_) { if (limit_ < 0) return false; input_->Skip(limit_); limit_ = 0; return false; } else { if (!input_->Skip(count)) return false; limit_ -= count; return true; } } int64 LimitingInputStream::ByteCount() const { if (limit_ < 0) { return input_->ByteCount() + limit_ - prior_bytes_read_; } else { return input_->ByteCount() - prior_bytes_read_; } } // =================================================================== } // namespace io } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h000066400000000000000000000324111334102242000324570ustar00rootroot00000000000000// 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. // // This file contains common implementations of the interfaces defined in // zero_copy_stream.h which are only included in the full (non-lite) // protobuf library. These implementations include Unix file descriptors // and C++ iostreams. See also: zero_copy_stream_impl_lite.h #ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__ #define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__ #include #include #include #include #include namespace google { namespace protobuf { namespace io { // =================================================================== // A ZeroCopyInputStream which reads from a file descriptor. // // FileInputStream is preferred over using an ifstream with IstreamInputStream. // The latter will introduce an extra layer of buffering, harming performance. // Also, it's conceivable that FileInputStream could someday be enhanced // to use zero-copy file descriptors on OSs which support them. class LIBPROTOBUF_EXPORT FileInputStream : public ZeroCopyInputStream { public: // Creates a stream that reads from the given Unix file descriptor. // If a block_size is given, it specifies the number of bytes that // 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); // Flushes any buffers and closes the underlying file. Returns false if // an error occurs during the process; use GetErrno() to examine the error. // Even if an error occurs, the file descriptor is closed when this returns. bool Close(); // By default, the file descriptor is not closed when the stream is // destroyed. Call SetCloseOnDelete(true) to change that. WARNING: // This leaves no way for the caller to detect if close() fails. If // detecting close() errors is important to you, you should arrange // to close the descriptor yourself. void SetCloseOnDelete(bool value) { copying_input_.SetCloseOnDelete(value); } // If an I/O error has occurred on this file descriptor, this is the // errno from that error. Otherwise, this is zero. Once an error // occurs, the stream is broken and all subsequent operations will // fail. int GetErrno() { return copying_input_.GetErrno(); } // implements ZeroCopyInputStream ---------------------------------- bool Next(const void** data, int* size); void BackUp(int count); bool Skip(int count); int64 ByteCount() const; private: class LIBPROTOBUF_EXPORT CopyingFileInputStream : public CopyingInputStream { public: CopyingFileInputStream(int file_descriptor); ~CopyingFileInputStream(); bool Close(); void SetCloseOnDelete(bool value) { close_on_delete_ = value; } int GetErrno() { return errno_; } // implements CopyingInputStream --------------------------------- int Read(void* buffer, int size); int Skip(int count); private: // The file descriptor. const int file_; bool close_on_delete_; bool is_closed_; // The errno of the I/O error, if one has occurred. Otherwise, zero. int errno_; // 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); }; // =================================================================== // A ZeroCopyOutputStream which writes to a file descriptor. // // FileOutputStream is preferred over using an ofstream with // OstreamOutputStream. The latter will introduce an extra layer of buffering, // harming performance. Also, it's conceivable that FileOutputStream could // someday be enhanced to use zero-copy file descriptors on OSs which // support them. class LIBPROTOBUF_EXPORT FileOutputStream : public ZeroCopyOutputStream { public: // Creates a stream that writes to the given Unix file descriptor. // If a block_size is given, it specifies the size of the buffers // that should be returned by Next(). Otherwise, a reasonable default // is used. explicit FileOutputStream(int file_descriptor, int block_size = -1); ~FileOutputStream(); // Flushes any buffers and closes the underlying file. Returns false if // an error occurs during the process; use GetErrno() to examine the error. // Even if an error occurs, the file descriptor is closed when this returns. bool Close(); // Flushes FileOutputStream's buffers but does not close the // underlying file. No special measures are taken to ensure that // underlying operating system file object is synchronized to disk. bool Flush(); // By default, the file descriptor is not closed when the stream is // destroyed. Call SetCloseOnDelete(true) to change that. WARNING: // This leaves no way for the caller to detect if close() fails. If // detecting close() errors is important to you, you should arrange // to close the descriptor yourself. void SetCloseOnDelete(bool value) { copying_output_.SetCloseOnDelete(value); } // If an I/O error has occurred on this file descriptor, this is the // errno from that error. Otherwise, this is zero. Once an error // occurs, the stream is broken and all subsequent operations will // fail. int GetErrno() { return copying_output_.GetErrno(); } // implements ZeroCopyOutputStream --------------------------------- bool Next(void** data, int* size); void BackUp(int count); int64 ByteCount() const; private: class LIBPROTOBUF_EXPORT CopyingFileOutputStream : public CopyingOutputStream { public: CopyingFileOutputStream(int file_descriptor); ~CopyingFileOutputStream(); bool Close(); void SetCloseOnDelete(bool value) { close_on_delete_ = value; } int GetErrno() { return errno_; } // implements CopyingOutputStream -------------------------------- bool Write(const void* buffer, int size); private: // The file descriptor. const int file_; bool close_on_delete_; bool is_closed_; // The errno of the I/O error, if one has occurred. Otherwise, zero. int errno_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingFileOutputStream); }; CopyingFileOutputStream copying_output_; CopyingOutputStreamAdaptor impl_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileOutputStream); }; // =================================================================== // A ZeroCopyInputStream which reads from a C++ istream. // // Note that for reading files (or anything represented by a file descriptor), // FileInputStream is more efficient. class LIBPROTOBUF_EXPORT IstreamInputStream : public ZeroCopyInputStream { public: // Creates a stream that reads from the given C++ istream. // If a block_size is given, it specifies the number of bytes that // 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); // implements ZeroCopyInputStream ---------------------------------- bool Next(const void** data, int* size); void BackUp(int count); bool Skip(int count); int64 ByteCount() const; private: class LIBPROTOBUF_EXPORT CopyingIstreamInputStream : public CopyingInputStream { public: CopyingIstreamInputStream(std::istream* input); ~CopyingIstreamInputStream(); // implements CopyingInputStream --------------------------------- int Read(void* buffer, int size); // (We use the default implementation of Skip().) private: // The stream. std::istream* input_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingIstreamInputStream); }; CopyingIstreamInputStream copying_input_; CopyingInputStreamAdaptor impl_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(IstreamInputStream); }; // =================================================================== // A ZeroCopyOutputStream which writes to a C++ ostream. // // Note that for writing files (or anything represented by a file descriptor), // FileOutputStream is more efficient. class LIBPROTOBUF_EXPORT OstreamOutputStream : public ZeroCopyOutputStream { public: // Creates a stream that writes to the given C++ ostream. // If a block_size is given, it specifies the size of the buffers // that should be returned by Next(). Otherwise, a reasonable default // is used. explicit OstreamOutputStream(std::ostream* stream, int block_size = -1); ~OstreamOutputStream(); // implements ZeroCopyOutputStream --------------------------------- bool Next(void** data, int* size); void BackUp(int count); int64 ByteCount() const; private: class LIBPROTOBUF_EXPORT CopyingOstreamOutputStream : public CopyingOutputStream { public: CopyingOstreamOutputStream(std::ostream* output); ~CopyingOstreamOutputStream(); // implements CopyingOutputStream -------------------------------- bool Write(const void* buffer, int size); private: // The stream. std::ostream* output_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOstreamOutputStream); }; CopyingOstreamOutputStream copying_output_; CopyingOutputStreamAdaptor impl_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OstreamOutputStream); }; // =================================================================== // A ZeroCopyInputStream which reads from several other streams in sequence. // ConcatenatingInputStream is unable to distinguish between end-of-stream // and read errors in the underlying streams, so it assumes any errors mean // end-of-stream. So, if the underlying streams fail for any other reason, // ConcatenatingInputStream may do odd things. It is suggested that you do // not use ConcatenatingInputStream on streams that might produce read errors // other than end-of-stream. class LIBPROTOBUF_EXPORT ConcatenatingInputStream : public ZeroCopyInputStream { public: // All streams passed in as well as the array itself must remain valid // until the ConcatenatingInputStream is destroyed. ConcatenatingInputStream(ZeroCopyInputStream* const streams[], int count); // implements ZeroCopyInputStream ---------------------------------- bool Next(const void** data, int* size); void BackUp(int count); bool Skip(int count); int64 ByteCount() const; private: // As streams are retired, streams_ is incremented and count_ is // decremented. ZeroCopyInputStream* const* streams_; int stream_count_; int64 bytes_retired_; // Bytes read from previous streams. GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ConcatenatingInputStream); }; // =================================================================== // A ZeroCopyInputStream which wraps some other stream and limits it to // a particular byte count. class LIBPROTOBUF_EXPORT LimitingInputStream : public ZeroCopyInputStream { public: LimitingInputStream(ZeroCopyInputStream* input, int64 limit); ~LimitingInputStream(); // implements ZeroCopyInputStream ---------------------------------- bool Next(const void** data, int* size); void BackUp(int count); bool Skip(int count); int64 ByteCount() const; private: ZeroCopyInputStream* input_; int64 limit_; // Decreases as we go, becomes negative if we overshoot. int64 prior_bytes_read_; // Bytes read on underlying stream at construction GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LimitingInputStream); }; // =================================================================== } // namespace io } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc000066400000000000000000000263561334102242000336450ustar00rootroot00000000000000// 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 #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { namespace { // Default block size for Copying{In,Out}putStreamAdaptor. static const int kDefaultBlockSize = 8192; } // namespace // =================================================================== ArrayInputStream::ArrayInputStream(const void* data, int size, int block_size) : data_(reinterpret_cast(data)), size_(size), block_size_(block_size > 0 ? block_size : size), position_(0), last_returned_size_(0) { } bool ArrayInputStream::Next(const void** data, int* size) { if (position_ < size_) { last_returned_size_ = std::min(block_size_, size_ - position_); *data = data_ + position_; *size = last_returned_size_; position_ += last_returned_size_; return true; } else { // We're at the end of the array. last_returned_size_ = 0; // Don't let caller back up. return false; } } void ArrayInputStream::BackUp(int count) { GOOGLE_CHECK_GT(last_returned_size_, 0) << "BackUp() can only be called after a successful Next()."; GOOGLE_CHECK_LE(count, last_returned_size_); GOOGLE_CHECK_GE(count, 0); position_ -= count; last_returned_size_ = 0; // Don't let caller back up further. } bool ArrayInputStream::Skip(int count) { GOOGLE_CHECK_GE(count, 0); last_returned_size_ = 0; // Don't let caller back up. if (count > size_ - position_) { position_ = size_; return false; } else { position_ += count; return true; } } int64 ArrayInputStream::ByteCount() const { return position_; } // =================================================================== ArrayOutputStream::ArrayOutputStream(void* data, int size, int block_size) : data_(reinterpret_cast(data)), size_(size), block_size_(block_size > 0 ? block_size : size), position_(0), last_returned_size_(0) { } bool ArrayOutputStream::Next(void** data, int* size) { if (position_ < size_) { last_returned_size_ = std::min(block_size_, size_ - position_); *data = data_ + position_; *size = last_returned_size_; position_ += last_returned_size_; return true; } else { // We're at the end of the array. last_returned_size_ = 0; // Don't let caller back up. return false; } } void ArrayOutputStream::BackUp(int count) { GOOGLE_CHECK_GT(last_returned_size_, 0) << "BackUp() can only be called after a successful Next()."; GOOGLE_CHECK_LE(count, last_returned_size_); GOOGLE_CHECK_GE(count, 0); position_ -= count; last_returned_size_ = 0; // Don't let caller back up further. } int64 ArrayOutputStream::ByteCount() const { return position_; } // =================================================================== StringOutputStream::StringOutputStream(string* target) : target_(target) { } bool StringOutputStream::Next(void** data, int* size) { GOOGLE_CHECK(target_ != NULL); int old_size = target_->size(); // Grow the string. if (old_size < target_->capacity()) { // Resize the string to match its capacity, since we can get away // without a memory allocation this way. STLStringResizeUninitialized(target_, target_->capacity()); } else { // Size has reached capacity, try to double the size. if (old_size > std::numeric_limits::max() / 2) { // Can not double the size otherwise it is going to cause integer // overflow in the expression below: old_size * 2 "; GOOGLE_LOG(ERROR) << "Cannot allocate buffer larger than kint32max for " << "StringOutputStream."; return false; } // Double the size, also make sure that the new size is at least // kMinimumSize. STLStringResizeUninitialized( target_, std::max(old_size * 2, kMinimumSize + 0)); // "+ 0" works around GCC4 weirdness. } *data = mutable_string_data(target_) + old_size; *size = target_->size() - old_size; return true; } void StringOutputStream::BackUp(int count) { GOOGLE_CHECK_GE(count, 0); GOOGLE_CHECK(target_ != NULL); GOOGLE_CHECK_LE(count, target_->size()); target_->resize(target_->size() - count); } int64 StringOutputStream::ByteCount() const { GOOGLE_CHECK(target_ != NULL); return target_->size(); } void StringOutputStream::SetString(string* target) { target_ = target; } // =================================================================== int CopyingInputStream::Skip(int count) { char junk[4096]; int skipped = 0; while (skipped < count) { int bytes = Read(junk, std::min(count - skipped, implicit_cast(sizeof(junk)))); if (bytes <= 0) { // EOF or read error. return skipped; } skipped += bytes; } return skipped; } CopyingInputStreamAdaptor::CopyingInputStreamAdaptor( CopyingInputStream* copying_stream, int block_size) : copying_stream_(copying_stream), owns_copying_stream_(false), failed_(false), position_(0), buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize), buffer_used_(0), backup_bytes_(0) { } CopyingInputStreamAdaptor::~CopyingInputStreamAdaptor() { if (owns_copying_stream_) { delete copying_stream_; } } bool CopyingInputStreamAdaptor::Next(const void** data, int* size) { if (failed_) { // Already failed on a previous read. return false; } AllocateBufferIfNeeded(); if (backup_bytes_ > 0) { // We have data left over from a previous BackUp(), so just return that. *data = buffer_.get() + buffer_used_ - backup_bytes_; *size = backup_bytes_; backup_bytes_ = 0; return true; } // Read new data into the buffer. buffer_used_ = copying_stream_->Read(buffer_.get(), buffer_size_); if (buffer_used_ <= 0) { // EOF or read error. We don't need the buffer anymore. if (buffer_used_ < 0) { // Read error (not EOF). failed_ = true; } FreeBuffer(); return false; } position_ += buffer_used_; *size = buffer_used_; *data = buffer_.get(); return true; } void CopyingInputStreamAdaptor::BackUp(int count) { GOOGLE_CHECK(backup_bytes_ == 0 && buffer_.get() != NULL) << " BackUp() can only be called after Next()."; GOOGLE_CHECK_LE(count, buffer_used_) << " Can't back up over more bytes than were returned by the last call" " to Next()."; GOOGLE_CHECK_GE(count, 0) << " Parameter to BackUp() can't be negative."; backup_bytes_ = count; } bool CopyingInputStreamAdaptor::Skip(int count) { GOOGLE_CHECK_GE(count, 0); if (failed_) { // Already failed on a previous read. return false; } // First skip any bytes left over from a previous BackUp(). if (backup_bytes_ >= count) { // We have more data left over than we're trying to skip. Just chop it. backup_bytes_ -= count; return true; } count -= backup_bytes_; backup_bytes_ = 0; int skipped = copying_stream_->Skip(count); position_ += skipped; return skipped == count; } int64 CopyingInputStreamAdaptor::ByteCount() const { return position_ - backup_bytes_; } void CopyingInputStreamAdaptor::AllocateBufferIfNeeded() { if (buffer_.get() == NULL) { buffer_.reset(new uint8[buffer_size_]); } } void CopyingInputStreamAdaptor::FreeBuffer() { GOOGLE_CHECK_EQ(backup_bytes_, 0); buffer_used_ = 0; buffer_.reset(); } // =================================================================== CopyingOutputStreamAdaptor::CopyingOutputStreamAdaptor( CopyingOutputStream* copying_stream, int block_size) : copying_stream_(copying_stream), owns_copying_stream_(false), failed_(false), position_(0), buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize), buffer_used_(0) { } CopyingOutputStreamAdaptor::~CopyingOutputStreamAdaptor() { WriteBuffer(); if (owns_copying_stream_) { delete copying_stream_; } } bool CopyingOutputStreamAdaptor::Flush() { return WriteBuffer(); } bool CopyingOutputStreamAdaptor::Next(void** data, int* size) { if (buffer_used_ == buffer_size_) { if (!WriteBuffer()) return false; } AllocateBufferIfNeeded(); *data = buffer_.get() + buffer_used_; *size = buffer_size_ - buffer_used_; buffer_used_ = buffer_size_; return true; } void CopyingOutputStreamAdaptor::BackUp(int count) { GOOGLE_CHECK_GE(count, 0); GOOGLE_CHECK_EQ(buffer_used_, buffer_size_) << " BackUp() can only be called after Next()."; GOOGLE_CHECK_LE(count, buffer_used_) << " Can't back up over more bytes than were returned by the last call" " to Next()."; buffer_used_ -= count; } int64 CopyingOutputStreamAdaptor::ByteCount() const { return position_ + buffer_used_; } bool CopyingOutputStreamAdaptor::WriteBuffer() { if (failed_) { // Already failed on a previous write. return false; } if (buffer_used_ == 0) return true; if (copying_stream_->Write(buffer_.get(), buffer_used_)) { position_ += buffer_used_; buffer_used_ = 0; return true; } else { failed_ = true; FreeBuffer(); return false; } } void CopyingOutputStreamAdaptor::AllocateBufferIfNeeded() { if (buffer_ == NULL) { buffer_.reset(new uint8[buffer_size_]); } } void CopyingOutputStreamAdaptor::FreeBuffer() { buffer_used_ = 0; buffer_.reset(); } // =================================================================== } // namespace io } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h000066400000000000000000000370071334102242000335020ustar00rootroot00000000000000// 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. // // This file contains common implementations of the interfaces defined in // zero_copy_stream.h which are included in the "lite" protobuf library. // These implementations cover I/O on raw arrays and strings, as well as // adaptors which make it easy to implement streams based on traditional // streams. Of course, many users will probably want to write their own // implementations of these interfaces specific to the particular I/O // abstractions they prefer to use, but these should cover the most common // cases. #ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__ #define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__ #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { // =================================================================== // A ZeroCopyInputStream backed by an in-memory array of bytes. class LIBPROTOBUF_EXPORT ArrayInputStream : public ZeroCopyInputStream { public: // Create an InputStream that returns the bytes pointed to by "data". // "data" remains the property of the caller but must remain valid until // the stream is destroyed. If a block_size is given, calls to Next() // will return data blocks no larger than the given size. Otherwise, the // first call to Next() returns the entire array. block_size is mainly // useful for testing; in production you would probably never want to set // it. ArrayInputStream(const void* data, int size, int block_size = -1); // implements ZeroCopyInputStream ---------------------------------- bool Next(const void** data, int* size); void BackUp(int count); bool Skip(int count); int64 ByteCount() const; private: const uint8* const data_; // The byte array. const int size_; // Total size of the array. const int block_size_; // How many bytes to return at a time. 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); }; // =================================================================== // A ZeroCopyOutputStream backed by an in-memory array of bytes. class LIBPROTOBUF_EXPORT ArrayOutputStream : public ZeroCopyOutputStream { public: // Create an OutputStream that writes to the bytes pointed to by "data". // "data" remains the property of the caller but must remain valid until // the stream is destroyed. If a block_size is given, calls to Next() // will return data blocks no larger than the given size. Otherwise, the // first call to Next() returns the entire array. block_size is mainly // useful for testing; in production you would probably never want to set // it. ArrayOutputStream(void* data, int size, int block_size = -1); // implements ZeroCopyOutputStream --------------------------------- bool Next(void** data, int* size); void BackUp(int count); int64 ByteCount() const; private: uint8* const data_; // The byte array. const int size_; // Total size of the array. const int block_size_; // How many bytes to return at a time. 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); }; // =================================================================== // A ZeroCopyOutputStream which appends bytes to a string. class LIBPROTOBUF_EXPORT StringOutputStream : public ZeroCopyOutputStream { public: // Create a StringOutputStream which appends bytes to the given string. // The string remains property of the caller, but it is mutated in arbitrary // ways and MUST NOT be accessed in any way until you're done with the // stream. Either be sure there's no further usage, or (safest) destroy the // stream before using the contents. // // Hint: If you call target->reserve(n) before creating the stream, // the first call to Next() will return at least n bytes of buffer // space. explicit StringOutputStream(string* target); // implements ZeroCopyOutputStream --------------------------------- bool Next(void** data, int* size); void BackUp(int count); int64 ByteCount() const; protected: void SetString(string* target); private: static const int kMinimumSize = 16; string* target_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringOutputStream); }; // Note: There is no StringInputStream. Instead, just create an // ArrayInputStream as follows: // ArrayInputStream input(str.data(), str.size()); // =================================================================== // A generic traditional input stream interface. // // Lots of traditional input streams (e.g. file descriptors, C stdio // streams, and C++ iostreams) expose an interface where every read // involves copying bytes into a buffer. If you want to take such an // interface and make a ZeroCopyInputStream based on it, simply implement // CopyingInputStream and then use CopyingInputStreamAdaptor. // // CopyingInputStream implementations should avoid buffering if possible. // CopyingInputStreamAdaptor does its own buffering and will read data // in large blocks. class LIBPROTOBUF_EXPORT CopyingInputStream { public: virtual ~CopyingInputStream() {} // Reads up to "size" bytes into the given buffer. Returns the number of // bytes read. Read() waits until at least one byte is available, or // returns zero if no bytes will ever become available (EOF), or -1 if a // permanent read error occurred. virtual int Read(void* buffer, int size) = 0; // Skips the next "count" bytes of input. Returns the number of bytes // actually skipped. This will always be exactly equal to "count" unless // EOF was reached or a permanent read error occurred. // // The default implementation just repeatedly calls Read() into a scratch // buffer. virtual int Skip(int count); }; // A ZeroCopyInputStream which reads from a CopyingInputStream. This is // useful for implementing ZeroCopyInputStreams that read from traditional // streams. Note that this class is not really zero-copy. // // If you want to read from file descriptors or C++ istreams, this is // already implemented for you: use FileInputStream or IstreamInputStream // respectively. class LIBPROTOBUF_EXPORT CopyingInputStreamAdaptor : public ZeroCopyInputStream { public: // Creates a stream that reads from the given CopyingInputStream. // If a block_size is given, it specifies the number of bytes that // should be read and returned with each call to Next(). Otherwise, // a reasonable default is used. The caller retains ownership of // copying_stream unless SetOwnsCopyingStream(true) is called. explicit CopyingInputStreamAdaptor(CopyingInputStream* copying_stream, int block_size = -1); ~CopyingInputStreamAdaptor(); // Call SetOwnsCopyingStream(true) to tell the CopyingInputStreamAdaptor to // delete the underlying CopyingInputStream when it is destroyed. void SetOwnsCopyingStream(bool value) { owns_copying_stream_ = value; } // implements ZeroCopyInputStream ---------------------------------- bool Next(const void** data, int* size); void BackUp(int count); bool Skip(int count); int64 ByteCount() const; private: // Insures that buffer_ is not NULL. void AllocateBufferIfNeeded(); // Frees the buffer and resets buffer_used_. void FreeBuffer(); // The underlying copying stream. CopyingInputStream* copying_stream_; bool owns_copying_stream_; // True if we have seen a permenant error from the underlying stream. bool failed_; // The current position of copying_stream_, relative to the point where // we started reading. int64 position_; // Data is read into this buffer. It may be NULL if no buffer is currently // in use. Otherwise, it points to an array of size buffer_size_. google::protobuf::scoped_array buffer_; const int buffer_size_; // Number of valid bytes currently in the buffer (i.e. the size last // returned by Next()). 0 <= buffer_used_ <= buffer_size_. int buffer_used_; // Number of bytes in the buffer which were backed up over by a call to // BackUp(). These need to be returned again. // 0 <= backup_bytes_ <= buffer_used_ int backup_bytes_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingInputStreamAdaptor); }; // =================================================================== // A generic traditional output stream interface. // // Lots of traditional output streams (e.g. file descriptors, C stdio // streams, and C++ iostreams) expose an interface where every write // involves copying bytes from a buffer. If you want to take such an // interface and make a ZeroCopyOutputStream based on it, simply implement // CopyingOutputStream and then use CopyingOutputStreamAdaptor. // // CopyingOutputStream implementations should avoid buffering if possible. // CopyingOutputStreamAdaptor does its own buffering and will write data // in large blocks. class LIBPROTOBUF_EXPORT CopyingOutputStream { public: virtual ~CopyingOutputStream() {} // Writes "size" bytes from the given buffer to the output. Returns true // if successful, false on a write error. virtual bool Write(const void* buffer, int size) = 0; }; // A ZeroCopyOutputStream which writes to a CopyingOutputStream. This is // useful for implementing ZeroCopyOutputStreams that write to traditional // streams. Note that this class is not really zero-copy. // // If you want to write to file descriptors or C++ ostreams, this is // already implemented for you: use FileOutputStream or OstreamOutputStream // respectively. class LIBPROTOBUF_EXPORT CopyingOutputStreamAdaptor : public ZeroCopyOutputStream { public: // Creates a stream that writes to the given Unix file descriptor. // If a block_size is given, it specifies the size of the buffers // that should be returned by Next(). Otherwise, a reasonable default // is used. explicit CopyingOutputStreamAdaptor(CopyingOutputStream* copying_stream, int block_size = -1); ~CopyingOutputStreamAdaptor(); // 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.) bool Flush(); // Call SetOwnsCopyingStream(true) to tell the CopyingOutputStreamAdaptor to // delete the underlying CopyingOutputStream when it is destroyed. void SetOwnsCopyingStream(bool value) { owns_copying_stream_ = value; } // implements ZeroCopyOutputStream --------------------------------- bool Next(void** data, int* size); void BackUp(int count); int64 ByteCount() const; private: // Write the current buffer, if it is present. bool WriteBuffer(); // Insures that buffer_ is not NULL. void AllocateBufferIfNeeded(); // Frees the buffer. void FreeBuffer(); // The underlying copying stream. CopyingOutputStream* copying_stream_; bool owns_copying_stream_; // True if we have seen a permenant error from the underlying stream. bool failed_; // The current position of copying_stream_, relative to the point where // we started writing. int64 position_; // Data is written from this buffer. It may be NULL if no buffer is // currently in use. Otherwise, it points to an array of size buffer_size_. google::protobuf::scoped_array buffer_; const int buffer_size_; // Number of valid bytes currently in the buffer (i.e. the size last // returned by Next()). When BackUp() is called, we just reduce this. // 0 <= buffer_used_ <= buffer_size_. int buffer_used_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOutputStreamAdaptor); }; // =================================================================== // mutable_string_data() and as_string_data() are workarounds to improve // the performance of writing new data to an existing string. Unfortunately // the methods provided by the string class are suboptimal, and using memcpy() // is mildly annoying because it requires its pointer args to be non-NULL even // if we ask it to copy 0 bytes. Furthermore, string_as_array() has the // property that it always returns NULL if its arg is the empty string, exactly // what we want to avoid if we're using it in conjunction with memcpy()! // With C++11, the desired memcpy() boils down to memcpy(..., &(*s)[0], size), // where s is a string*. Without C++11, &(*s)[0] is not guaranteed to be safe, // so we use string_as_array(), and live with the extra logic that tests whether // *s is empty. // Return a pointer to mutable characters underlying the given string. The // return value is valid until the next time the string is resized. We // trust the caller to treat the return value as an array of length s->size(). inline char* mutable_string_data(string* s) { #ifdef LANG_CXX11 // This should be simpler & faster than string_as_array() because the latter // is guaranteed to return NULL when *s is empty, so it has to check for that. return &(*s)[0]; #else return string_as_array(s); #endif } // as_string_data(s) is equivalent to // ({ char* p = mutable_string_data(s); make_pair(p, p != NULL); }) // Sometimes it's faster: in some scenarios p cannot be NULL, and then the // code can avoid that check. inline std::pair as_string_data(string* s) { char *p = mutable_string_data(s); #ifdef LANG_CXX11 return std::make_pair(p, true); #else return std::make_pair(p, p != NULL); #endif } } // namespace io } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc000066400000000000000000000753121334102242000335420ustar00rootroot00000000000000// 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. // // Testing strategy: For each type of I/O (array, string, file, etc.) we // create an output stream and write some data to it, then create a // corresponding input stream to read the same data back and expect it to // match. When the data is written, it is written in several small chunks // of varying sizes, with a BackUp() after each chunk. It is read back // similarly, but with chunks separated at different points. The whole // process is run with a variety of block sizes for both the input and // the output. // // TODO(kenton): Rewrite this test to bring it up to the standards of all // the other proto2 tests. May want to wait for gTest to implement // "parametized tests" so that one set of tests can be used on all the // implementations. #ifndef _MSC_VER #include #endif #include #include #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #if HAVE_ZLIB #include #endif #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { namespace { #ifdef _WIN32 #define pipe(fds) _pipe(fds, 4096, O_BINARY) // DO NOT include , instead create functions in io_win32.{h,cc} and import // them like we do below. using google::protobuf::internal::win32::access; using google::protobuf::internal::win32::mkdir; using google::protobuf::internal::win32::open; using google::protobuf::internal::win32::close; #endif #ifndef O_BINARY #ifdef _O_BINARY #define O_BINARY _O_BINARY #else #define O_BINARY 0 // If this isn't defined, the platform doesn't need it. #endif #endif class IoTest : public testing::Test { protected: // Test helpers. // Helper to write an array of data to an output stream. bool WriteToOutput(ZeroCopyOutputStream* output, const void* data, int size); // Helper to read a fixed-length array of data from an input stream. int ReadFromInput(ZeroCopyInputStream* input, void* data, int size); // Write a string to the output stream. void WriteString(ZeroCopyOutputStream* output, const string& str); // Read a number of bytes equal to the size of the given string and checks // that it matches the string. void ReadString(ZeroCopyInputStream* input, const string& str); // Writes some text to the output stream in a particular order. Returns // the number of bytes written, incase the caller needs that to set up an // input stream. int WriteStuff(ZeroCopyOutputStream* output); // Reads text from an input stream and expects it to match what // WriteStuff() writes. void ReadStuff(ZeroCopyInputStream* input); // Similar to WriteStuff, but performs more sophisticated testing. int WriteStuffLarge(ZeroCopyOutputStream* output); // Reads and tests a stream that should have been written to // via WriteStuffLarge(). void ReadStuffLarge(ZeroCopyInputStream* input); #if HAVE_ZLIB string Compress(const string& data, const GzipOutputStream::Options& options); string Uncompress(const string& data); #endif static const int kBlockSizes[]; static const int kBlockSizeCount; }; const int IoTest::kBlockSizes[] = {-1, 1, 2, 5, 7, 10, 23, 64}; const int IoTest::kBlockSizeCount = GOOGLE_ARRAYSIZE(IoTest::kBlockSizes); bool IoTest::WriteToOutput(ZeroCopyOutputStream* output, const void* data, int size) { const uint8* in = reinterpret_cast(data); int in_size = size; void* out; int out_size; while (true) { if (!output->Next(&out, &out_size)) { return false; } EXPECT_GT(out_size, 0); if (in_size <= out_size) { memcpy(out, in, in_size); output->BackUp(out_size - in_size); return true; } memcpy(out, in, out_size); in += out_size; in_size -= out_size; } } #define MAX_REPEATED_ZEROS 100 int IoTest::ReadFromInput(ZeroCopyInputStream* input, void* data, int size) { uint8* out = reinterpret_cast(data); int out_size = size; const void* in; int in_size = 0; int repeated_zeros = 0; while (true) { if (!input->Next(&in, &in_size)) { return size - out_size; } EXPECT_GT(in_size, -1); if (in_size == 0) { repeated_zeros++; } else { repeated_zeros = 0; } EXPECT_LT(repeated_zeros, MAX_REPEATED_ZEROS); if (out_size <= in_size) { memcpy(out, in, out_size); if (in_size > out_size) { input->BackUp(in_size - out_size); } return size; // Copied all of it. } memcpy(out, in, in_size); out += in_size; out_size -= in_size; } } void IoTest::WriteString(ZeroCopyOutputStream* output, const string& str) { EXPECT_TRUE(WriteToOutput(output, str.c_str(), str.size())); } void IoTest::ReadString(ZeroCopyInputStream* input, const string& str) { google::protobuf::scoped_array buffer(new char[str.size() + 1]); buffer[str.size()] = '\0'; EXPECT_EQ(ReadFromInput(input, buffer.get(), str.size()), str.size()); EXPECT_STREQ(str.c_str(), buffer.get()); } int IoTest::WriteStuff(ZeroCopyOutputStream* output) { WriteString(output, "Hello world!\n"); WriteString(output, "Some te"); WriteString(output, "xt. Blah blah."); WriteString(output, "abcdefg"); WriteString(output, "01234567890123456789"); WriteString(output, "foobar"); EXPECT_EQ(output->ByteCount(), 68); int result = output->ByteCount(); return result; } // Reads text from an input stream and expects it to match what WriteStuff() // writes. void IoTest::ReadStuff(ZeroCopyInputStream* input) { ReadString(input, "Hello world!\n"); ReadString(input, "Some text. "); ReadString(input, "Blah "); ReadString(input, "blah."); ReadString(input, "abcdefg"); EXPECT_TRUE(input->Skip(20)); ReadString(input, "foo"); ReadString(input, "bar"); EXPECT_EQ(input->ByteCount(), 68); uint8 byte; EXPECT_EQ(ReadFromInput(input, &byte, 1), 0); } int IoTest::WriteStuffLarge(ZeroCopyOutputStream* output) { WriteString(output, "Hello world!\n"); WriteString(output, "Some te"); WriteString(output, "xt. Blah blah."); WriteString(output, string(100000, 'x')); // A very long string WriteString(output, string(100000, 'y')); // A very long string WriteString(output, "01234567890123456789"); EXPECT_EQ(output->ByteCount(), 200055); int result = output->ByteCount(); return result; } // Reads text from an input stream and expects it to match what WriteStuff() // writes. void IoTest::ReadStuffLarge(ZeroCopyInputStream* input) { ReadString(input, "Hello world!\nSome text. "); EXPECT_TRUE(input->Skip(5)); ReadString(input, "blah."); EXPECT_TRUE(input->Skip(100000 - 10)); ReadString(input, string(10, 'x') + string(100000 - 20000, 'y')); EXPECT_TRUE(input->Skip(20000 - 10)); ReadString(input, "yyyyyyyyyy01234567890123456789"); EXPECT_EQ(input->ByteCount(), 200055); uint8 byte; EXPECT_EQ(ReadFromInput(input, &byte, 1), 0); } // =================================================================== TEST_F(IoTest, ArrayIo) { const int kBufferSize = 256; uint8 buffer[kBufferSize]; for (int i = 0; i < kBlockSizeCount; i++) { for (int j = 0; j < kBlockSizeCount; j++) { int size; { ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]); size = WriteStuff(&output); } { ArrayInputStream input(buffer, size, kBlockSizes[j]); ReadStuff(&input); } } } } TEST_F(IoTest, TwoSessionWrite) { // Test that two concatenated write sessions read correctly static const char* strA = "0123456789"; static const char* strB = "WhirledPeas"; const int kBufferSize = 2*1024; uint8* buffer = new uint8[kBufferSize]; char* temp_buffer = new char[40]; for (int i = 0; i < kBlockSizeCount; i++) { for (int j = 0; j < kBlockSizeCount; j++) { ArrayOutputStream* output = new ArrayOutputStream(buffer, kBufferSize, kBlockSizes[i]); CodedOutputStream* coded_output = new CodedOutputStream(output); coded_output->WriteVarint32(strlen(strA)); coded_output->WriteRaw(strA, strlen(strA)); delete coded_output; // flush int64 pos = output->ByteCount(); delete output; output = new ArrayOutputStream( buffer + pos, kBufferSize - pos, kBlockSizes[i]); coded_output = new CodedOutputStream(output); coded_output->WriteVarint32(strlen(strB)); coded_output->WriteRaw(strB, strlen(strB)); delete coded_output; // flush int64 size = pos + output->ByteCount(); delete output; ArrayInputStream* input = new ArrayInputStream(buffer, size, kBlockSizes[j]); CodedInputStream* coded_input = new CodedInputStream(input); uint32 insize; EXPECT_TRUE(coded_input->ReadVarint32(&insize)); EXPECT_EQ(strlen(strA), insize); EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize)); EXPECT_EQ(0, memcmp(temp_buffer, strA, insize)); EXPECT_TRUE(coded_input->ReadVarint32(&insize)); EXPECT_EQ(strlen(strB), insize); EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize)); EXPECT_EQ(0, memcmp(temp_buffer, strB, insize)); delete coded_input; delete input; } } delete [] temp_buffer; delete [] buffer; } #if HAVE_ZLIB TEST_F(IoTest, GzipIo) { const int kBufferSize = 2*1024; uint8* buffer = new uint8[kBufferSize]; for (int i = 0; i < kBlockSizeCount; i++) { for (int j = 0; j < kBlockSizeCount; j++) { for (int z = 0; z < kBlockSizeCount; z++) { int gzip_buffer_size = kBlockSizes[z]; int size; { ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]); GzipOutputStream::Options options; options.format = GzipOutputStream::GZIP; if (gzip_buffer_size != -1) { options.buffer_size = gzip_buffer_size; } GzipOutputStream gzout(&output, options); WriteStuff(&gzout); gzout.Close(); size = output.ByteCount(); } { ArrayInputStream input(buffer, size, kBlockSizes[j]); GzipInputStream gzin( &input, GzipInputStream::GZIP, gzip_buffer_size); ReadStuff(&gzin); } } } } delete [] buffer; } TEST_F(IoTest, GzipIoWithFlush) { const int kBufferSize = 2*1024; uint8* buffer = new uint8[kBufferSize]; // We start with i = 4 as we want a block size > 6. With block size <= 6 // Flush() fills up the entire 2K buffer with flush markers and the test // fails. See documentation for Flush() for more detail. for (int i = 4; i < kBlockSizeCount; i++) { for (int j = 0; j < kBlockSizeCount; j++) { for (int z = 0; z < kBlockSizeCount; z++) { int gzip_buffer_size = kBlockSizes[z]; int size; { ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]); GzipOutputStream::Options options; options.format = GzipOutputStream::GZIP; if (gzip_buffer_size != -1) { options.buffer_size = gzip_buffer_size; } GzipOutputStream gzout(&output, options); WriteStuff(&gzout); EXPECT_TRUE(gzout.Flush()); gzout.Close(); size = output.ByteCount(); } { ArrayInputStream input(buffer, size, kBlockSizes[j]); GzipInputStream gzin( &input, GzipInputStream::GZIP, gzip_buffer_size); ReadStuff(&gzin); } } } } delete [] buffer; } TEST_F(IoTest, GzipIoContiguousFlushes) { const int kBufferSize = 2*1024; uint8* buffer = new uint8[kBufferSize]; int block_size = kBlockSizes[4]; int gzip_buffer_size = block_size; int size; ArrayOutputStream output(buffer, kBufferSize, block_size); GzipOutputStream::Options options; options.format = GzipOutputStream::GZIP; if (gzip_buffer_size != -1) { options.buffer_size = gzip_buffer_size; } GzipOutputStream gzout(&output, options); WriteStuff(&gzout); EXPECT_TRUE(gzout.Flush()); EXPECT_TRUE(gzout.Flush()); gzout.Close(); size = output.ByteCount(); ArrayInputStream input(buffer, size, block_size); GzipInputStream gzin( &input, GzipInputStream::GZIP, gzip_buffer_size); ReadStuff(&gzin); delete [] buffer; } TEST_F(IoTest, GzipIoReadAfterFlush) { const int kBufferSize = 2*1024; uint8* buffer = new uint8[kBufferSize]; int block_size = kBlockSizes[4]; int gzip_buffer_size = block_size; int size; ArrayOutputStream output(buffer, kBufferSize, block_size); GzipOutputStream::Options options; options.format = GzipOutputStream::GZIP; if (gzip_buffer_size != -1) { options.buffer_size = gzip_buffer_size; } GzipOutputStream gzout(&output, options); WriteStuff(&gzout); EXPECT_TRUE(gzout.Flush()); size = output.ByteCount(); ArrayInputStream input(buffer, size, block_size); GzipInputStream gzin( &input, GzipInputStream::GZIP, gzip_buffer_size); ReadStuff(&gzin); gzout.Close(); delete [] buffer; } TEST_F(IoTest, ZlibIo) { const int kBufferSize = 2*1024; uint8* buffer = new uint8[kBufferSize]; for (int i = 0; i < kBlockSizeCount; i++) { for (int j = 0; j < kBlockSizeCount; j++) { for (int z = 0; z < kBlockSizeCount; z++) { int gzip_buffer_size = kBlockSizes[z]; int size; { ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]); GzipOutputStream::Options options; options.format = GzipOutputStream::ZLIB; if (gzip_buffer_size != -1) { options.buffer_size = gzip_buffer_size; } GzipOutputStream gzout(&output, options); WriteStuff(&gzout); gzout.Close(); size = output.ByteCount(); } { ArrayInputStream input(buffer, size, kBlockSizes[j]); GzipInputStream gzin( &input, GzipInputStream::ZLIB, gzip_buffer_size); ReadStuff(&gzin); } } } } delete [] buffer; } TEST_F(IoTest, ZlibIoInputAutodetect) { const int kBufferSize = 2*1024; uint8* buffer = new uint8[kBufferSize]; int size; { ArrayOutputStream output(buffer, kBufferSize); GzipOutputStream::Options options; options.format = GzipOutputStream::ZLIB; GzipOutputStream gzout(&output, options); WriteStuff(&gzout); gzout.Close(); size = output.ByteCount(); } { ArrayInputStream input(buffer, size); GzipInputStream gzin(&input, GzipInputStream::AUTO); ReadStuff(&gzin); } { ArrayOutputStream output(buffer, kBufferSize); GzipOutputStream::Options options; options.format = GzipOutputStream::GZIP; GzipOutputStream gzout(&output, options); WriteStuff(&gzout); gzout.Close(); size = output.ByteCount(); } { ArrayInputStream input(buffer, size); GzipInputStream gzin(&input, GzipInputStream::AUTO); ReadStuff(&gzin); } delete [] buffer; } string IoTest::Compress(const string& data, const GzipOutputStream::Options& options) { string result; { StringOutputStream output(&result); GzipOutputStream gzout(&output, options); WriteToOutput(&gzout, data.data(), data.size()); } return result; } string IoTest::Uncompress(const string& data) { string result; { ArrayInputStream input(data.data(), data.size()); GzipInputStream gzin(&input); const void* buffer; int size; while (gzin.Next(&buffer, &size)) { result.append(reinterpret_cast(buffer), size); } } return result; } TEST_F(IoTest, CompressionOptions) { // Some ad-hoc testing of compression options. string golden; GOOGLE_CHECK_OK(File::GetContents( TestSourceDir() + "/google/protobuf/testdata/golden_message", &golden, true)); GzipOutputStream::Options options; string gzip_compressed = Compress(golden, options); options.compression_level = 0; string not_compressed = Compress(golden, options); // Try zlib compression for fun. options = GzipOutputStream::Options(); options.format = GzipOutputStream::ZLIB; string zlib_compressed = Compress(golden, options); // Uncompressed should be bigger than the original since it should have some // sort of header. EXPECT_GT(not_compressed.size(), golden.size()); // Higher compression levels should result in smaller sizes. EXPECT_LT(zlib_compressed.size(), not_compressed.size()); // ZLIB format should differ from GZIP format. EXPECT_TRUE(zlib_compressed != gzip_compressed); // Everything should decompress correctly. EXPECT_TRUE(Uncompress(not_compressed) == golden); EXPECT_TRUE(Uncompress(gzip_compressed) == golden); EXPECT_TRUE(Uncompress(zlib_compressed) == golden); } TEST_F(IoTest, TwoSessionWriteGzip) { // Test that two concatenated gzip streams can be read correctly static const char* strA = "0123456789"; static const char* strB = "QuickBrownFox"; const int kBufferSize = 2*1024; uint8* buffer = new uint8[kBufferSize]; char* temp_buffer = new char[40]; for (int i = 0; i < kBlockSizeCount; i++) { for (int j = 0; j < kBlockSizeCount; j++) { ArrayOutputStream* output = new ArrayOutputStream(buffer, kBufferSize, kBlockSizes[i]); GzipOutputStream* gzout = new GzipOutputStream(output); CodedOutputStream* coded_output = new CodedOutputStream(gzout); int32 outlen = strlen(strA) + 1; coded_output->WriteVarint32(outlen); coded_output->WriteRaw(strA, outlen); delete coded_output; // flush delete gzout; // flush int64 pos = output->ByteCount(); delete output; output = new ArrayOutputStream( buffer + pos, kBufferSize - pos, kBlockSizes[i]); gzout = new GzipOutputStream(output); coded_output = new CodedOutputStream(gzout); outlen = strlen(strB) + 1; coded_output->WriteVarint32(outlen); coded_output->WriteRaw(strB, outlen); delete coded_output; // flush delete gzout; // flush int64 size = pos + output->ByteCount(); delete output; ArrayInputStream* input = new ArrayInputStream(buffer, size, kBlockSizes[j]); GzipInputStream* gzin = new GzipInputStream(input); CodedInputStream* coded_input = new CodedInputStream(gzin); uint32 insize; EXPECT_TRUE(coded_input->ReadVarint32(&insize)); EXPECT_EQ(strlen(strA) + 1, insize); EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize)); EXPECT_EQ(0, memcmp(temp_buffer, strA, insize)) << "strA=" << strA << " in=" << temp_buffer; EXPECT_TRUE(coded_input->ReadVarint32(&insize)); EXPECT_EQ(strlen(strB) + 1, insize); EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize)); EXPECT_EQ(0, memcmp(temp_buffer, strB, insize)) << " out_block_size=" << kBlockSizes[i] << " in_block_size=" << kBlockSizes[j] << " pos=" << pos << " size=" << size << " strB=" << strB << " in=" << temp_buffer; delete coded_input; delete gzin; delete input; } } delete [] temp_buffer; delete [] buffer; } TEST_F(IoTest, GzipInputByteCountAfterClosed) { string golden = "abcdefghijklmnopqrstuvwxyz"; string compressed = Compress(golden, GzipOutputStream::Options()); for (int i = 0; i < kBlockSizeCount; i++) { ArrayInputStream arr_input(compressed.data(), compressed.size(), kBlockSizes[i]); GzipInputStream gz_input(&arr_input); const void* buffer; int size; while (gz_input.Next(&buffer, &size)) { EXPECT_LE(gz_input.ByteCount(), golden.size()); } EXPECT_EQ(golden.size(), gz_input.ByteCount()); } } TEST_F(IoTest, GzipInputByteCountAfterClosedConcatenatedStreams) { string golden1 = "abcdefghijklmnopqrstuvwxyz"; string golden2 = "the quick brown fox jumps over the lazy dog"; const size_t total_size = golden1.size() + golden2.size(); string compressed = Compress(golden1, GzipOutputStream::Options()) + Compress(golden2, GzipOutputStream::Options()); for (int i = 0; i < kBlockSizeCount; i++) { ArrayInputStream arr_input(compressed.data(), compressed.size(), kBlockSizes[i]); GzipInputStream gz_input(&arr_input); const void* buffer; int size; while (gz_input.Next(&buffer, &size)) { EXPECT_LE(gz_input.ByteCount(), total_size); } EXPECT_EQ(total_size, gz_input.ByteCount()); } } #endif // There is no string input, only string output. Also, it doesn't support // explicit block sizes. So, we'll only run one test and we'll use // ArrayInput to read back the results. TEST_F(IoTest, StringIo) { string str; { StringOutputStream output(&str); WriteStuff(&output); } { ArrayInputStream input(str.data(), str.size()); ReadStuff(&input); } } // To test files, we create a temporary file, write, read, truncate, repeat. TEST_F(IoTest, FileIo) { string filename = TestTempDir() + "/zero_copy_stream_test_file"; for (int i = 0; i < kBlockSizeCount; i++) { for (int j = 0; j < kBlockSizeCount; j++) { // Make a temporary file. int file = open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777); ASSERT_GE(file, 0); { FileOutputStream output(file, kBlockSizes[i]); WriteStuff(&output); EXPECT_EQ(0, output.GetErrno()); } // Rewind. ASSERT_NE(lseek(file, 0, SEEK_SET), (off_t)-1); { FileInputStream input(file, kBlockSizes[j]); ReadStuff(&input); EXPECT_EQ(0, input.GetErrno()); } close(file); } } } #if HAVE_ZLIB TEST_F(IoTest, GzipFileIo) { string filename = TestTempDir() + "/zero_copy_stream_test_file"; for (int i = 0; i < kBlockSizeCount; i++) { for (int j = 0; j < kBlockSizeCount; j++) { // Make a temporary file. int file = open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777); ASSERT_GE(file, 0); { FileOutputStream output(file, kBlockSizes[i]); GzipOutputStream gzout(&output); WriteStuffLarge(&gzout); gzout.Close(); output.Flush(); EXPECT_EQ(0, output.GetErrno()); } // Rewind. ASSERT_NE(lseek(file, 0, SEEK_SET), (off_t)-1); { FileInputStream input(file, kBlockSizes[j]); GzipInputStream gzin(&input); ReadStuffLarge(&gzin); EXPECT_EQ(0, input.GetErrno()); } close(file); } } } #endif // MSVC raises various debugging exceptions if we try to use a file // descriptor of -1, defeating our tests below. This class will disable // these debug assertions while in scope. class MsvcDebugDisabler { public: #if defined(_MSC_VER) && _MSC_VER >= 1400 MsvcDebugDisabler() { old_handler_ = _set_invalid_parameter_handler(MyHandler); old_mode_ = _CrtSetReportMode(_CRT_ASSERT, 0); } ~MsvcDebugDisabler() { old_handler_ = _set_invalid_parameter_handler(old_handler_); old_mode_ = _CrtSetReportMode(_CRT_ASSERT, old_mode_); } static void MyHandler(const wchar_t *expr, const wchar_t *func, const wchar_t *file, unsigned int line, uintptr_t pReserved) { // do nothing } _invalid_parameter_handler old_handler_; int old_mode_; #else // Dummy constructor and destructor to ensure that GCC doesn't complain // that debug_disabler is an unused variable. MsvcDebugDisabler() {} ~MsvcDebugDisabler() {} #endif }; // Test that FileInputStreams report errors correctly. TEST_F(IoTest, FileReadError) { MsvcDebugDisabler debug_disabler; // -1 = invalid file descriptor. FileInputStream input(-1); const void* buffer; int size; EXPECT_FALSE(input.Next(&buffer, &size)); EXPECT_EQ(EBADF, input.GetErrno()); } // Test that FileOutputStreams report errors correctly. TEST_F(IoTest, FileWriteError) { MsvcDebugDisabler debug_disabler; // -1 = invalid file descriptor. FileOutputStream input(-1); void* buffer; int size; // The first call to Next() succeeds because it doesn't have anything to // write yet. EXPECT_TRUE(input.Next(&buffer, &size)); // Second call fails. EXPECT_FALSE(input.Next(&buffer, &size)); EXPECT_EQ(EBADF, input.GetErrno()); } // Pipes are not seekable, so File{Input,Output}Stream ends up doing some // different things to handle them. We'll test by writing to a pipe and // reading back from it. TEST_F(IoTest, PipeIo) { int files[2]; for (int i = 0; i < kBlockSizeCount; i++) { for (int j = 0; j < kBlockSizeCount; j++) { // Need to create a new pipe each time because ReadStuff() expects // to see EOF at the end. ASSERT_EQ(pipe(files), 0); { FileOutputStream output(files[1], kBlockSizes[i]); WriteStuff(&output); EXPECT_EQ(0, output.GetErrno()); } close(files[1]); // Send EOF. { FileInputStream input(files[0], kBlockSizes[j]); ReadStuff(&input); EXPECT_EQ(0, input.GetErrno()); } close(files[0]); } } } // Test using C++ iostreams. TEST_F(IoTest, IostreamIo) { for (int i = 0; i < kBlockSizeCount; i++) { for (int j = 0; j < kBlockSizeCount; j++) { { std::stringstream stream; { OstreamOutputStream output(&stream, kBlockSizes[i]); WriteStuff(&output); EXPECT_FALSE(stream.fail()); } { IstreamInputStream input(&stream, kBlockSizes[j]); ReadStuff(&input); EXPECT_TRUE(stream.eof()); } } { std::stringstream stream; { OstreamOutputStream output(&stream, kBlockSizes[i]); WriteStuffLarge(&output); EXPECT_FALSE(stream.fail()); } { IstreamInputStream input(&stream, kBlockSizes[j]); ReadStuffLarge(&input); EXPECT_TRUE(stream.eof()); } } } } } // To test ConcatenatingInputStream, we create several ArrayInputStreams // covering a buffer and then concatenate them. TEST_F(IoTest, ConcatenatingInputStream) { const int kBufferSize = 256; uint8 buffer[kBufferSize]; // Fill the buffer. ArrayOutputStream output(buffer, kBufferSize); WriteStuff(&output); // Now split it up into multiple streams of varying sizes. ASSERT_EQ(68, output.ByteCount()); // Test depends on this. ArrayInputStream input1(buffer , 12); ArrayInputStream input2(buffer + 12, 7); ArrayInputStream input3(buffer + 19, 6); ArrayInputStream input4(buffer + 25, 15); ArrayInputStream input5(buffer + 40, 0); // Note: We want to make sure we have a stream boundary somewhere between // bytes 42 and 62, which is the range that it Skip()ed by ReadStuff(). This // tests that a bug that existed in the original code for Skip() is fixed. ArrayInputStream input6(buffer + 40, 10); ArrayInputStream input7(buffer + 50, 18); // Total = 68 bytes. ZeroCopyInputStream* streams[] = {&input1, &input2, &input3, &input4, &input5, &input6, &input7}; // Create the concatenating stream and read. ConcatenatingInputStream input(streams, GOOGLE_ARRAYSIZE(streams)); ReadStuff(&input); } // To test LimitingInputStream, we write our golden text to a buffer, then // create an ArrayInputStream that contains the whole buffer (not just the // bytes written), then use a LimitingInputStream to limit it just to the // bytes written. TEST_F(IoTest, LimitingInputStream) { const int kBufferSize = 256; uint8 buffer[kBufferSize]; // Fill the buffer. ArrayOutputStream output(buffer, kBufferSize); WriteStuff(&output); // Set up input. ArrayInputStream array_input(buffer, kBufferSize); LimitingInputStream input(&array_input, output.ByteCount()); ReadStuff(&input); } // Checks that ByteCount works correctly for LimitingInputStreams where the // underlying stream has already been read. TEST_F(IoTest, LimitingInputStreamByteCount) { const int kHalfBufferSize = 128; const int kBufferSize = kHalfBufferSize * 2; uint8 buffer[kBufferSize]; // Set up input. Only allow half to be read at once. ArrayInputStream array_input(buffer, kBufferSize, kHalfBufferSize); const void* data; int size; EXPECT_TRUE(array_input.Next(&data, &size)); EXPECT_EQ(kHalfBufferSize, array_input.ByteCount()); // kHalfBufferSize - 1 to test limiting logic as well. LimitingInputStream input(&array_input, kHalfBufferSize - 1); EXPECT_EQ(0, input.ByteCount()); EXPECT_TRUE(input.Next(&data, &size)); EXPECT_EQ(kHalfBufferSize - 1 , input.ByteCount()); } // Check that a zero-size array doesn't confuse the code. TEST(ZeroSizeArray, Input) { ArrayInputStream input(NULL, 0); const void* data; int size; EXPECT_FALSE(input.Next(&data, &size)); } TEST(ZeroSizeArray, Output) { ArrayOutputStream output(NULL, 0); void* data; int size; EXPECT_FALSE(output.Next(&data, &size)); } } // namespace } // namespace io } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/lite_arena_unittest.cc000066400000000000000000000067431334102242000316540ustar00rootroot00000000000000// 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 #include #include #include namespace google { namespace protobuf { namespace { class LiteArenaTest : public testing::Test { protected: LiteArenaTest() { ArenaOptions options; options.start_block_size = 128 * 1024; options.max_block_size = 128 * 1024; arena_.reset(new Arena(options)); // Trigger the allocation of the first arena block, so that further use of // the arena will not require any heap allocations. google::protobuf::Arena::CreateArray(arena_.get(), 1); } google::protobuf::scoped_ptr arena_; }; TEST_F(LiteArenaTest, MapNoHeapAllocation) { string data; data.reserve(128 * 1024); { // TODO(teboring): Enable no heap check when ArenaStringPtr is used in // Map. // google::protobuf::internal::NoHeapChecker no_heap; protobuf_unittest::TestArenaMapLite* from = Arena::CreateMessage(arena_.get()); google::protobuf::MapLiteTestUtil::SetArenaMapFields(from); from->SerializeToString(&data); protobuf_unittest::TestArenaMapLite* to = Arena::CreateMessage(arena_.get()); to->ParseFromString(data); google::protobuf::MapLiteTestUtil::ExpectArenaMapFieldsSet(*to); } } TEST_F(LiteArenaTest, UnknownFieldMemLeak) { protobuf_unittest::ForeignMessageArenaLite* message = google::protobuf::Arena::CreateMessage( arena_.get()); string data = "\012\000"; int original_capacity = data.capacity(); while (data.capacity() <= original_capacity) { data.append("a"); } data[1] = data.size() - 2; message->ParseFromString(data); } } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/lite_unittest.cc000066400000000000000000001004341334102242000304760ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::string; namespace { // Helper methods to test parsing merge behavior. void ExpectMessageMerged(const google::protobuf::unittest::TestAllTypesLite& message) { EXPECT_EQ(message.optional_int32(), 3); EXPECT_EQ(message.optional_int64(), 2); EXPECT_EQ(message.optional_string(), "hello"); } void AssignParsingMergeMessages( google::protobuf::unittest::TestAllTypesLite* msg1, google::protobuf::unittest::TestAllTypesLite* msg2, google::protobuf::unittest::TestAllTypesLite* msg3) { msg1->set_optional_int32(1); msg2->set_optional_int64(2); msg3->set_optional_int32(3); msg3->set_optional_string("hello"); } void SetAllTypesInEmptyMessageUnknownFields( google::protobuf::unittest::TestEmptyMessageLite* empty_message) { protobuf_unittest::TestAllTypesLite message; google::protobuf::TestUtilLite::ExpectClear(message); google::protobuf::TestUtilLite::SetAllFields(&message); string data = message.SerializeAsString(); empty_message->ParseFromString(data); } void SetSomeTypesInEmptyMessageUnknownFields( google::protobuf::unittest::TestEmptyMessageLite* empty_message) { protobuf_unittest::TestAllTypesLite message; google::protobuf::TestUtilLite::ExpectClear(message); message.set_optional_int32(101); message.set_optional_int64(102); message.set_optional_uint32(103); message.set_optional_uint64(104); string data = message.SerializeAsString(); empty_message->ParseFromString(data); } } // namespace TEST(Lite, AllLite1) { string data; { protobuf_unittest::TestAllTypesLite message, message2, message3; google::protobuf::TestUtilLite::ExpectClear(message); google::protobuf::TestUtilLite::SetAllFields(&message); message2.CopyFrom(message); data = message.SerializeAsString(); message3.ParseFromString(data); google::protobuf::TestUtilLite::ExpectAllFieldsSet(message); google::protobuf::TestUtilLite::ExpectAllFieldsSet(message2); google::protobuf::TestUtilLite::ExpectAllFieldsSet(message3); google::protobuf::TestUtilLite::ModifyRepeatedFields(&message); google::protobuf::TestUtilLite::ExpectRepeatedFieldsModified(message); message.Clear(); google::protobuf::TestUtilLite::ExpectClear(message); } } TEST(Lite, AllLite2) { string data; { protobuf_unittest::TestAllExtensionsLite message, message2, message3; google::protobuf::TestUtilLite::ExpectExtensionsClear(message); google::protobuf::TestUtilLite::SetAllExtensions(&message); message2.CopyFrom(message); string extensions_data = message.SerializeAsString(); message3.ParseFromString(extensions_data); google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message); google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message2); google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message3); google::protobuf::TestUtilLite::ModifyRepeatedExtensions(&message); google::protobuf::TestUtilLite::ExpectRepeatedExtensionsModified(message); message.Clear(); google::protobuf::TestUtilLite::ExpectExtensionsClear(message); } } TEST(Lite, AllLite3) { string data, packed_data; { protobuf_unittest::TestPackedTypesLite message, message2, message3; google::protobuf::TestUtilLite::ExpectPackedClear(message); google::protobuf::TestUtilLite::SetPackedFields(&message); message2.CopyFrom(message); packed_data = message.SerializeAsString(); message3.ParseFromString(packed_data); google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message); google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message2); google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message3); google::protobuf::TestUtilLite::ModifyPackedFields(&message); google::protobuf::TestUtilLite::ExpectPackedFieldsModified(message); message.Clear(); google::protobuf::TestUtilLite::ExpectPackedClear(message); } { protobuf_unittest::TestPackedExtensionsLite message, message2, message3; google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message); google::protobuf::TestUtilLite::SetPackedExtensions(&message); message2.CopyFrom(message); string packed_extensions_data = message.SerializeAsString(); EXPECT_EQ(packed_extensions_data, packed_data); message3.ParseFromString(packed_extensions_data); google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message); google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message2); google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message3); google::protobuf::TestUtilLite::ModifyPackedExtensions(&message); google::protobuf::TestUtilLite::ExpectPackedExtensionsModified(message); message.Clear(); google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message); } } TEST(Lite, AllLite5) { string data; { // Test that if an optional or required message/group field appears multiple // times in the input, they need to be merged. google::protobuf::unittest::TestParsingMergeLite::RepeatedFieldsGenerator generator; google::protobuf::unittest::TestAllTypesLite* msg1; google::protobuf::unittest::TestAllTypesLite* msg2; google::protobuf::unittest::TestAllTypesLite* msg3; #define ASSIGN_REPEATED_FIELD(FIELD) \ msg1 = generator.add_##FIELD(); \ msg2 = generator.add_##FIELD(); \ msg3 = generator.add_##FIELD(); \ AssignParsingMergeMessages(msg1, msg2, msg3) ASSIGN_REPEATED_FIELD(field1); ASSIGN_REPEATED_FIELD(field2); ASSIGN_REPEATED_FIELD(field3); ASSIGN_REPEATED_FIELD(ext1); ASSIGN_REPEATED_FIELD(ext2); #undef ASSIGN_REPEATED_FIELD #define ASSIGN_REPEATED_GROUP(FIELD) \ msg1 = generator.add_##FIELD()->mutable_field1(); \ msg2 = generator.add_##FIELD()->mutable_field1(); \ msg3 = generator.add_##FIELD()->mutable_field1(); \ AssignParsingMergeMessages(msg1, msg2, msg3) ASSIGN_REPEATED_GROUP(group1); ASSIGN_REPEATED_GROUP(group2); #undef ASSIGN_REPEATED_GROUP string buffer; generator.SerializeToString(&buffer); google::protobuf::unittest::TestParsingMergeLite parsing_merge; parsing_merge.ParseFromString(buffer); // Required and optional fields should be merged. ExpectMessageMerged(parsing_merge.required_all_types()); ExpectMessageMerged(parsing_merge.optional_all_types()); ExpectMessageMerged( parsing_merge.optionalgroup().optional_group_all_types()); ExpectMessageMerged(parsing_merge.GetExtension( google::protobuf::unittest::TestParsingMergeLite::optional_ext)); // Repeated fields should not be merged. EXPECT_EQ(parsing_merge.repeated_all_types_size(), 3); EXPECT_EQ(parsing_merge.repeatedgroup_size(), 3); EXPECT_EQ(parsing_merge.ExtensionSize( google::protobuf::unittest::TestParsingMergeLite::repeated_ext), 3); } } TEST(Lite, AllLite6) { string data; // Test unknown fields support for lite messages. { protobuf_unittest::TestAllTypesLite message, message2; protobuf_unittest::TestEmptyMessageLite empty_message; google::protobuf::TestUtilLite::ExpectClear(message); google::protobuf::TestUtilLite::SetAllFields(&message); data = message.SerializeAsString(); empty_message.ParseFromString(data); data.clear(); data = empty_message.SerializeAsString(); message2.ParseFromString(data); data = message2.SerializeAsString(); google::protobuf::TestUtilLite::ExpectAllFieldsSet(message2); message.Clear(); google::protobuf::TestUtilLite::ExpectClear(message); } } TEST(Lite, AllLite7) { string data; { protobuf_unittest::TestAllExtensionsLite message, message2; protobuf_unittest::TestEmptyMessageLite empty_message; google::protobuf::TestUtilLite::ExpectExtensionsClear(message); google::protobuf::TestUtilLite::SetAllExtensions(&message); data = message.SerializeAsString(); empty_message.ParseFromString(data); data.clear(); data = empty_message.SerializeAsString(); message2.ParseFromString(data); data = message2.SerializeAsString(); google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message2); message.Clear(); google::protobuf::TestUtilLite::ExpectExtensionsClear(message); } } TEST(Lite, AllLite8) { string data; { protobuf_unittest::TestPackedTypesLite message, message2; protobuf_unittest::TestEmptyMessageLite empty_message; google::protobuf::TestUtilLite::ExpectPackedClear(message); google::protobuf::TestUtilLite::SetPackedFields(&message); data = message.SerializeAsString(); empty_message.ParseFromString(data); data.clear(); data = empty_message.SerializeAsString(); message2.ParseFromString(data); data = message2.SerializeAsString(); google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message2); message.Clear(); google::protobuf::TestUtilLite::ExpectPackedClear(message); } } TEST(Lite, AllLite9) { string data; { protobuf_unittest::TestPackedExtensionsLite message, message2; protobuf_unittest::TestEmptyMessageLite empty_message; google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message); google::protobuf::TestUtilLite::SetPackedExtensions(&message); data = message.SerializeAsString(); empty_message.ParseFromString(data); data.clear(); data = empty_message.SerializeAsString(); message2.ParseFromString(data); data = message2.SerializeAsString(); google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message2); message.Clear(); google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message); } } TEST(Lite, AllLite10) { string data; { // Test Unknown fields swap protobuf_unittest::TestEmptyMessageLite empty_message, empty_message2; SetAllTypesInEmptyMessageUnknownFields(&empty_message); SetSomeTypesInEmptyMessageUnknownFields(&empty_message2); data = empty_message.SerializeAsString(); string data2 = empty_message2.SerializeAsString(); empty_message.Swap(&empty_message2); EXPECT_EQ(data, empty_message2.SerializeAsString()); EXPECT_EQ(data2, empty_message.SerializeAsString()); } } TEST(Lite, AllLite11) { string data; { // Test unknown fields swap with self protobuf_unittest::TestEmptyMessageLite empty_message; SetAllTypesInEmptyMessageUnknownFields(&empty_message); data = empty_message.SerializeAsString(); empty_message.Swap(&empty_message); EXPECT_EQ(data, empty_message.SerializeAsString()); } } TEST(Lite, AllLite12) { string data; { // Test MergeFrom with unknown fields protobuf_unittest::TestAllTypesLite message, message2; protobuf_unittest::TestEmptyMessageLite empty_message, empty_message2; message.set_optional_int32(101); message.add_repeated_int32(201); message.set_optional_nested_enum(google::protobuf::unittest::TestAllTypesLite::BAZ); message2.set_optional_int64(102); message2.add_repeated_int64(202); message2.set_optional_foreign_enum(google::protobuf::unittest::FOREIGN_LITE_BAZ); data = message.SerializeAsString(); empty_message.ParseFromString(data); data = message2.SerializeAsString(); empty_message2.ParseFromString(data); message.MergeFrom(message2); empty_message.MergeFrom(empty_message2); data = empty_message.SerializeAsString(); message2.ParseFromString(data); // We do not compare the serialized output of a normal message and a lite // message because the order of fields do not match. We convert lite message // back into normal message, then compare. EXPECT_EQ(message.SerializeAsString(), message2.SerializeAsString()); } } TEST(Lite, AllLite13) { string data; { // Test unknown enum value protobuf_unittest::TestAllTypesLite message; string buffer; { google::protobuf::io::StringOutputStream output_stream(&buffer); google::protobuf::io::CodedOutputStream coded_output(&output_stream); google::protobuf::internal::WireFormatLite::WriteTag( protobuf_unittest::TestAllTypesLite::kOptionalNestedEnumFieldNumber, google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT, &coded_output); coded_output.WriteVarint32(10); google::protobuf::internal::WireFormatLite::WriteTag( protobuf_unittest::TestAllTypesLite::kRepeatedNestedEnumFieldNumber, google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT, &coded_output); coded_output.WriteVarint32(20); } message.ParseFromString(buffer); data = message.SerializeAsString(); EXPECT_EQ(data, buffer); } } TEST(Lite, AllLite14) { string data; { // Test Clear with unknown fields protobuf_unittest::TestEmptyMessageLite empty_message; SetAllTypesInEmptyMessageUnknownFields(&empty_message); empty_message.Clear(); EXPECT_EQ(0, empty_message.unknown_fields().size()); } } // Tests for map lite ============================================= TEST(Lite, AllLite15) { string data; { // Accessors protobuf_unittest::TestMapLite message; google::protobuf::MapLiteTestUtil::SetMapFields(&message); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message); google::protobuf::MapLiteTestUtil::ModifyMapFields(&message); google::protobuf::MapLiteTestUtil::ExpectMapFieldsModified(message); } } TEST(Lite, AllLite16) { string data; { // SetMapFieldsInitialized protobuf_unittest::TestMapLite message; google::protobuf::MapLiteTestUtil::SetMapFieldsInitialized(&message); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSetInitialized(message); } } TEST(Lite, AllLite17) { string data; { // Clear protobuf_unittest::TestMapLite message; google::protobuf::MapLiteTestUtil::SetMapFields(&message); message.Clear(); google::protobuf::MapLiteTestUtil::ExpectClear(message); } } TEST(Lite, AllLite18) { string data; { // ClearMessageMap protobuf_unittest::TestMessageMapLite message; // Creates a TestAllTypes with default value google::protobuf::TestUtilLite::ExpectClear( (*message.mutable_map_int32_message())[0]); } } TEST(Lite, AllLite19) { string data; { // CopyFrom protobuf_unittest::TestMapLite message1, message2; google::protobuf::MapLiteTestUtil::SetMapFields(&message1); message2.CopyFrom(message1); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2); // Copying from self should be a no-op. message2.CopyFrom(message2); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2); } } TEST(Lite, AllLite20) { string data; { // CopyFromMessageMap protobuf_unittest::TestMessageMapLite message1, message2; (*message1.mutable_map_int32_message())[0].add_repeated_int32(100); (*message2.mutable_map_int32_message())[0].add_repeated_int32(101); message1.CopyFrom(message2); // Checks repeated field is overwritten. EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size()); EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0)); } } TEST(Lite, AllLite21) { string data; { // SwapWithEmpty protobuf_unittest::TestMapLite message1, message2; google::protobuf::MapLiteTestUtil::SetMapFields(&message1); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message1); google::protobuf::MapLiteTestUtil::ExpectClear(message2); message1.Swap(&message2); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2); google::protobuf::MapLiteTestUtil::ExpectClear(message1); } } TEST(Lite, AllLite22) { string data; { // SwapWithSelf protobuf_unittest::TestMapLite message; google::protobuf::MapLiteTestUtil::SetMapFields(&message); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message); message.Swap(&message); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message); } } TEST(Lite, AllLite23) { string data; { // SwapWithOther protobuf_unittest::TestMapLite message1, message2; google::protobuf::MapLiteTestUtil::SetMapFields(&message1); google::protobuf::MapLiteTestUtil::SetMapFields(&message2); google::protobuf::MapLiteTestUtil::ModifyMapFields(&message2); message1.Swap(&message2); google::protobuf::MapLiteTestUtil::ExpectMapFieldsModified(message1); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2); } } TEST(Lite, AllLite24) { string data; { // CopyConstructor protobuf_unittest::TestMapLite message1; google::protobuf::MapLiteTestUtil::SetMapFields(&message1); protobuf_unittest::TestMapLite message2(message1); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2); } } TEST(Lite, AllLite25) { string data; { // CopyAssignmentOperator protobuf_unittest::TestMapLite message1; google::protobuf::MapLiteTestUtil::SetMapFields(&message1); protobuf_unittest::TestMapLite message2; message2 = message1; google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2); // Make sure that self-assignment does something sane. message2.operator=(message2); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2); } } TEST(Lite, AllLite26) { string data; { // NonEmptyMergeFrom protobuf_unittest::TestMapLite message1, message2; google::protobuf::MapLiteTestUtil::SetMapFields(&message1); // This field will test merging into an empty spot. (*message2.mutable_map_int32_int32())[1] = 1; message1.mutable_map_int32_int32()->erase(1); // This tests overwriting. (*message2.mutable_map_int32_double())[1] = 1; (*message1.mutable_map_int32_double())[1] = 2; message1.MergeFrom(message2); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message1); } } TEST(Lite, AllLite27) { string data; { // MergeFromMessageMap protobuf_unittest::TestMessageMapLite message1, message2; (*message1.mutable_map_int32_message())[0].add_repeated_int32(100); (*message2.mutable_map_int32_message())[0].add_repeated_int32(101); message1.MergeFrom(message2); // Checks repeated field is overwritten. EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size()); EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0)); } } TEST(Lite, AllLite28) { string data; { // Test the generated SerializeWithCachedSizesToArray() protobuf_unittest::TestMapLite message1, message2; string data; google::protobuf::MapLiteTestUtil::SetMapFields(&message1); int size = message1.ByteSize(); data.resize(size); ::google::protobuf::uint8* start = reinterpret_cast< ::google::protobuf::uint8*>(::google::protobuf::string_as_array(&data)); ::google::protobuf::uint8* end = message1.SerializeWithCachedSizesToArray(start); EXPECT_EQ(size, end - start); EXPECT_TRUE(message2.ParseFromString(data)); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2); } } TEST(Lite, AllLite29) { string data; { // Test the generated SerializeWithCachedSizes() protobuf_unittest::TestMapLite message1, message2; google::protobuf::MapLiteTestUtil::SetMapFields(&message1); int size = message1.ByteSize(); string data; data.resize(size); { // Allow the output stream to buffer only one byte at a time. google::protobuf::io::ArrayOutputStream array_stream( ::google::protobuf::string_as_array(&data), size, 1); google::protobuf::io::CodedOutputStream output_stream(&array_stream); message1.SerializeWithCachedSizes(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); } EXPECT_TRUE(message2.ParseFromString(data)); google::protobuf::MapLiteTestUtil::ExpectMapFieldsSet(message2); } } TEST(Lite, AllLite32) { string data; { // Proto2UnknownEnum protobuf_unittest::TestEnumMapPlusExtraLite from; (*from.mutable_known_map_field())[0] = protobuf_unittest::E_PROTO2_MAP_ENUM_FOO_LITE; (*from.mutable_unknown_map_field())[0] = protobuf_unittest::E_PROTO2_MAP_ENUM_EXTRA_LITE; string data; from.SerializeToString(&data); protobuf_unittest::TestEnumMapLite to; EXPECT_TRUE(to.ParseFromString(data)); EXPECT_EQ(0, to.unknown_map_field().size()); EXPECT_FALSE(to.mutable_unknown_fields()->empty()); EXPECT_EQ(1, to.known_map_field().size()); EXPECT_EQ(protobuf_unittest::PROTO2_MAP_ENUM_FOO_LITE, to.known_map_field().at(0)); data.clear(); from.Clear(); to.SerializeToString(&data); EXPECT_TRUE(from.ParseFromString(data)); EXPECT_EQ(1, from.known_map_field().size()); EXPECT_EQ(protobuf_unittest::E_PROTO2_MAP_ENUM_FOO_LITE, from.known_map_field().at(0)); EXPECT_EQ(1, from.unknown_map_field().size()); EXPECT_EQ(protobuf_unittest::E_PROTO2_MAP_ENUM_EXTRA_LITE, from.unknown_map_field().at(0)); } } TEST(Lite, AllLite33) { string data; { // StandardWireFormat protobuf_unittest::TestMapLite message; string data = "\x0A\x04\x08\x01\x10\x01"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(1, message.map_int32_int32().at(1)); } } TEST(Lite, AllLite34) { string data; { // UnorderedWireFormat protobuf_unittest::TestMapLite message; // put value before key in wire format string data = "\x0A\x04\x10\x01\x08\x02"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(1, message.map_int32_int32().at(2)); } } TEST(Lite, AllLite35) { string data; { // DuplicatedKeyWireFormat protobuf_unittest::TestMapLite message; // Two key fields in wire format string data = "\x0A\x06\x08\x01\x08\x02\x10\x01"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(1, message.map_int32_int32().at(2)); } } TEST(Lite, AllLite36) { string data; { // DuplicatedValueWireFormat protobuf_unittest::TestMapLite message; // Two value fields in wire format string data = "\x0A\x06\x08\x01\x10\x01\x10\x02"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(2, message.map_int32_int32().at(1)); } } TEST(Lite, AllLite37) { string data; { // MissedKeyWireFormat protobuf_unittest::TestMapLite message; // No key field in wire format string data = "\x0A\x02\x10\x01"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(1, message.map_int32_int32().at(0)); } } TEST(Lite, AllLite38) { string data; { // MissedValueWireFormat protobuf_unittest::TestMapLite message; // No value field in wire format string data = "\x0A\x02\x08\x01"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(0, message.map_int32_int32().at(1)); } } TEST(Lite, AllLite39) { string data; { // UnknownFieldWireFormat protobuf_unittest::TestMapLite message; // Unknown field in wire format string data = "\x0A\x06\x08\x02\x10\x03\x18\x01"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(3, message.map_int32_int32().at(2)); } } TEST(Lite, AllLite40) { string data; { // CorruptedWireFormat protobuf_unittest::TestMapLite message; // corrupted data in wire format string data = "\x0A\x06\x08\x02\x11\x03"; EXPECT_FALSE(message.ParseFromString(data)); } } TEST(Lite, AllLite41) { string data; { // IsInitialized protobuf_unittest::TestRequiredMessageMapLite map_message; // Add an uninitialized message. (*map_message.mutable_map_field())[0]; EXPECT_FALSE(map_message.IsInitialized()); // Initialize uninitialized message (*map_message.mutable_map_field())[0].set_a(0); (*map_message.mutable_map_field())[0].set_b(0); (*map_message.mutable_map_field())[0].set_c(0); EXPECT_TRUE(map_message.IsInitialized()); } } TEST(Lite, AllLite42) { string data; { // Check that adding more values to enum does not corrupt message // when passed through an old client. protobuf_unittest::V2MessageLite v2_message; v2_message.set_int_field(800); // Set enum field to the value not understood by the old client. v2_message.set_enum_field(protobuf_unittest::V2_SECOND); string v2_bytes = v2_message.SerializeAsString(); protobuf_unittest::V1MessageLite v1_message; v1_message.ParseFromString(v2_bytes); EXPECT_TRUE(v1_message.IsInitialized()); EXPECT_EQ(v1_message.int_field(), v2_message.int_field()); // V1 client does not understand V2_SECOND value, so it discards it and // uses default value instead. EXPECT_EQ(v1_message.enum_field(), protobuf_unittest::V1_FIRST); // However, when re-serialized, it should preserve enum value. string v1_bytes = v1_message.SerializeAsString(); protobuf_unittest::V2MessageLite same_v2_message; same_v2_message.ParseFromString(v1_bytes); EXPECT_EQ(v2_message.int_field(), same_v2_message.int_field()); EXPECT_EQ(v2_message.enum_field(), same_v2_message.enum_field()); } } // Test that when parsing a oneof, we can successfully clear whatever already // happened to be stored in the oneof. TEST(Lite, AllLite43) { protobuf_unittest::TestOneofParsingLite message1; message1.set_oneof_int32(17); string serialized; EXPECT_TRUE(message1.SerializeToString(&serialized)); // Submessage { protobuf_unittest::TestOneofParsingLite message2; message2.mutable_oneof_submessage(); google::protobuf::io::CodedInputStream input_stream( reinterpret_cast(serialized.data()), serialized.size()); EXPECT_TRUE(message2.MergeFromCodedStream(&input_stream)); EXPECT_EQ(17, message2.oneof_int32()); } // String { protobuf_unittest::TestOneofParsingLite message2; message2.set_oneof_string("string"); google::protobuf::io::CodedInputStream input_stream( reinterpret_cast(serialized.data()), serialized.size()); EXPECT_TRUE(message2.MergeFromCodedStream(&input_stream)); EXPECT_EQ(17, message2.oneof_int32()); } // Bytes { protobuf_unittest::TestOneofParsingLite message2; message2.set_oneof_bytes("bytes"); google::protobuf::io::CodedInputStream input_stream( reinterpret_cast(serialized.data()), serialized.size()); EXPECT_TRUE(message2.MergeFromCodedStream(&input_stream)); EXPECT_EQ(17, message2.oneof_int32()); } } // Verify that we can successfully parse fields of various types within oneof // fields. We also verify that we can parse the same data twice into the same // message. TEST(Lite, AllLite44) { // Int32 { protobuf_unittest::TestOneofParsingLite original; original.set_oneof_int32(17); string serialized; EXPECT_TRUE(original.SerializeToString(&serialized)); protobuf_unittest::TestOneofParsingLite parsed; for (int i = 0; i < 2; ++i) { google::protobuf::io::CodedInputStream input_stream( reinterpret_cast(serialized.data()), serialized.size()); EXPECT_TRUE(parsed.MergeFromCodedStream(&input_stream)); EXPECT_EQ(17, parsed.oneof_int32()); } } // Submessage { protobuf_unittest::TestOneofParsingLite original; original.mutable_oneof_submessage()->set_optional_int32(5); string serialized; EXPECT_TRUE(original.SerializeToString(&serialized)); protobuf_unittest::TestOneofParsingLite parsed; for (int i = 0; i < 2; ++i) { google::protobuf::io::CodedInputStream input_stream( reinterpret_cast(serialized.data()), serialized.size()); EXPECT_TRUE(parsed.MergeFromCodedStream(&input_stream)); EXPECT_EQ(5, parsed.oneof_submessage().optional_int32()); } } // String { protobuf_unittest::TestOneofParsingLite original; original.set_oneof_string("string"); string serialized; EXPECT_TRUE(original.SerializeToString(&serialized)); protobuf_unittest::TestOneofParsingLite parsed; for (int i = 0; i < 2; ++i) { google::protobuf::io::CodedInputStream input_stream( reinterpret_cast(serialized.data()), serialized.size()); EXPECT_TRUE(parsed.MergeFromCodedStream(&input_stream)); EXPECT_EQ("string", parsed.oneof_string()); } } // Bytes { protobuf_unittest::TestOneofParsingLite original; original.set_oneof_bytes("bytes"); string serialized; EXPECT_TRUE(original.SerializeToString(&serialized)); protobuf_unittest::TestOneofParsingLite parsed; for (int i = 0; i < 2; ++i) { google::protobuf::io::CodedInputStream input_stream( reinterpret_cast(serialized.data()), serialized.size()); EXPECT_TRUE(parsed.MergeFromCodedStream(&input_stream)); EXPECT_EQ("bytes", parsed.oneof_bytes()); } } // Enum { protobuf_unittest::TestOneofParsingLite original; original.set_oneof_enum(protobuf_unittest::V2_SECOND); string serialized; EXPECT_TRUE(original.SerializeToString(&serialized)); protobuf_unittest::TestOneofParsingLite parsed; for (int i = 0; i < 2; ++i) { google::protobuf::io::CodedInputStream input_stream( reinterpret_cast(serialized.data()), serialized.size()); EXPECT_TRUE(parsed.MergeFromCodedStream(&input_stream)); EXPECT_EQ(protobuf_unittest::V2_SECOND, parsed.oneof_enum()); } } std::cout << "PASS" << std::endl; } TEST(Lite, AllLite45) { // Test unknown fields are not discarded upon parsing. string data = "\20\1"; // varint 1 with field number 2 protobuf_unittest::ForeignMessageLite a; EXPECT_TRUE(a.ParseFromString(data)); google::protobuf::io::CodedInputStream input_stream( reinterpret_cast(data.data()), data.size()); EXPECT_TRUE(a.MergePartialFromCodedStream(&input_stream)); string serialized = a.SerializeAsString(); EXPECT_EQ(serialized.substr(0, 2), data); EXPECT_EQ(serialized.substr(2), data); } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map.h000066400000000000000000001245471334102242000262340ustar00rootroot00000000000000// 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 defines the map container and its helpers to support protobuf maps. // // The Map and MapIterator types are provided by this header file. // Please avoid using other types defined here, unless they are public // types within Map or MapIterator, such as Map::value_type. #ifndef GOOGLE_PROTOBUF_MAP_H__ #define GOOGLE_PROTOBUF_MAP_H__ #include #include // To support Visual Studio 2008 #include #include #include #include #include #include #include namespace google { namespace protobuf { template class Map; class MapIterator; template struct is_proto_enum; namespace internal { template class MapFieldLite; template class MapField; template class TypeDefinedMapFieldBase; class DynamicMapField; class GeneratedMessageReflection; } // namespace internal // This is the class for google::protobuf::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. template class MapPair { public: typedef const Key first_type; typedef T second_type; MapPair(const Key& other_first, const T& other_second) : first(other_first), second(other_second) {} explicit MapPair(const Key& other_first) : first(other_first), second() {} MapPair(const MapPair& other) : first(other.first), second(other.second) {} ~MapPair() {} // Implicitly convertible to std::pair of compatible types. template operator std::pair() const { return std::pair(first, second); } const Key first; T second; private: friend class ::google::protobuf::Arena; friend class Map; }; // google::protobuf::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 // different iteration order, and so on. E.g., please don't examine // implementation details to decide if the following would work: // Map m0, m1; // m0[0] = m1[0] = m0[1] = m1[1] = 0; // assert(m0.begin()->first == m1.begin()->first); // Bug! // // Map's interface is similar to std::unordered_map, except that Map is not // designed to play well with exceptions. template class Map { public: typedef Key key_type; typedef T mapped_type; typedef MapPair value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef size_t size_type; typedef hash hasher; Map() : arena_(NULL), default_enum_value_(0) { Init(); } explicit Map(Arena* arena) : arena_(arena), default_enum_value_(0) { Init(); } Map(const Map& other) : arena_(NULL), default_enum_value_(other.default_enum_value_) { Init(); insert(other.begin(), other.end()); } #if LANG_CXX11 Map(Map&& other) noexcept : Map() { if (other.arena_) { *this = other; } else { swap(other); } } Map& operator=(Map&& other) noexcept { if (this != &other) { if (arena_ != other.arena_) { *this = other; } else { swap(other); } } return *this; } #endif template Map(const InputIt& first, const InputIt& last) : arena_(NULL), default_enum_value_(0) { Init(); insert(first, last); } ~Map() { clear(); if (arena_ == NULL) { delete elements_; } } private: void Init() { elements_ = Arena::Create(arena_, 0u, hasher(), Allocator(arena_)); } // re-implement std::allocator to use arena allocator for memory allocation. // Used for google::protobuf::Map implementation. Users should not use this class // directly. template class MapAllocator { public: typedef U value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; MapAllocator() : arena_(NULL) {} explicit MapAllocator(Arena* arena) : arena_(arena) {} template MapAllocator(const MapAllocator& allocator) : arena_(allocator.arena()) {} pointer allocate(size_type n, const void* /* hint */ = 0) { // If arena is not given, malloc needs to be called which doesn't // construct element object. if (arena_ == NULL) { return static_cast(::operator new(n * sizeof(value_type))); } else { return reinterpret_cast( Arena::CreateArray(arena_, n * sizeof(value_type))); } } void deallocate(pointer p, size_type n) { if (arena_ == NULL) { #if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation) ::operator delete(p, n * sizeof(value_type)); #else (void)n; ::operator delete(p); #endif } } #if __cplusplus >= 201103L && !defined(GOOGLE_PROTOBUF_OS_APPLE) && \ !defined(GOOGLE_PROTOBUF_OS_NACL) && \ !defined(GOOGLE_PROTOBUF_OS_EMSCRIPTEN) template void construct(NodeType* p, Args&&... args) { // Clang 3.6 doesn't compile static casting to void* directly. (Issue // #1266) According C++ standard 5.2.9/1: "The static_cast operator shall // not cast away constness". So first the maybe const pointer is casted to // const void* and after the const void* is const casted. new (const_cast(static_cast(p))) NodeType(std::forward(args)...); } template void destroy(NodeType* p) { p->~NodeType(); } #else void construct(pointer p, const_reference t) { new (p) value_type(t); } void destroy(pointer p) { p->~value_type(); } #endif template struct rebind { typedef MapAllocator other; }; template bool operator==(const MapAllocator& other) const { return arena_ == other.arena_; } template bool operator!=(const MapAllocator& other) const { return arena_ != other.arena_; } // To support Visual Studio 2008 size_type max_size() const { // parentheses around (std::...:max) prevents macro warning of max() return (std::numeric_limits::max)(); } // To support gcc-4.4, which does not properly // support templated friend classes Arena* arena() const { return arena_; } private: typedef void DestructorSkippable_; Arena* const arena_; }; // InnerMap's key type is Key and its value type is value_type*. We use a // custom class here and for Node, below, to ensure that k_ is at offset 0, // allowing safe conversion from pointer to Node to pointer to Key, and vice // versa when appropriate. class KeyValuePair { public: KeyValuePair(const Key& k, value_type* v) : k_(k), v_(v) {} const Key& key() const { return k_; } Key& key() { return k_; } value_type* value() const { return v_; } value_type*& value() { return v_; } private: Key k_; value_type* v_; }; typedef MapAllocator Allocator; // InnerMap is a generic hash-based map. It doesn't contain any // protocol-buffer-specific logic. It is a chaining hash map with the // additional feature that some buckets can be converted to use an ordered // container. This ensures O(lg n) bounds on find, insert, and erase, while // avoiding the overheads of ordered containers most of the time. // // The implementation doesn't need the full generality of unordered_map, // and it doesn't have it. More bells and whistles can be added as needed. // Some implementation details: // 1. The hash function has type hasher and the equality function // equal_to. We inherit from hasher to save space // (empty-base-class optimization). // 2. The number of buckets is a power of two. // 3. Buckets are converted to trees in pairs: if we convert bucket b then // buckets b and b^1 will share a tree. Invariant: buckets b and b^1 have // the same non-NULL value iff they are sharing a tree. (An alternative // implementation strategy would be to have a tag bit per bucket.) // 4. As is typical for hash_map and such, the Keys and Values are always // stored in linked list nodes. Pointers to elements are never invalidated // until the element is deleted. // 5. The trees' payload type is pointer to linked-list node. Tree-converting // a bucket doesn't copy Key-Value pairs. // 6. Once we've tree-converted a bucket, it is never converted back. However, // the items a tree contains may wind up assigned to trees or lists upon a // rehash. // 7. The code requires no C++ features from C++11 or later. // 8. Mutations to a map do not invalidate the map's iterators, pointers to // elements, or references to elements. // 9. Except for erase(iterator), any non-const method can reorder iterators. class InnerMap : private hasher { public: typedef value_type* Value; InnerMap(size_type n, hasher h, Allocator alloc) : hasher(h), num_elements_(0), seed_(Seed()), table_(NULL), alloc_(alloc) { n = TableSize(n); table_ = CreateEmptyTable(n); num_buckets_ = index_of_first_non_null_ = n; } ~InnerMap() { if (table_ != NULL) { clear(); Dealloc(table_, num_buckets_); } } private: enum { kMinTableSize = 8 }; // Linked-list nodes, as one would expect for a chaining hash table. struct Node { KeyValuePair kv; Node* next; }; // This is safe only if the given pointer is known to point to a Key that is // part of a Node. static Node* NodePtrFromKeyPtr(Key* k) { return reinterpret_cast(k); } static Key* KeyPtrFromNodePtr(Node* node) { return &node->kv.key(); } // Trees. The payload type is pointer to Key, so that we can query the tree // with Keys that are not in any particular data structure. When we insert, // though, the pointer is always pointing to a Key that is inside a Node. struct KeyCompare { bool operator()(const Key* n0, const Key* n1) const { return *n0 < *n1; } }; typedef typename Allocator::template rebind::other KeyPtrAllocator; typedef std::set Tree; typedef typename Tree::iterator TreeIterator; // iterator and const_iterator are instantiations of iterator_base. template struct iterator_base { typedef KeyValueType& reference; typedef KeyValueType* pointer; // Invariants: // node_ is always correct. This is handy because the most common // operations are operator* and operator-> and they only use node_. // When node_ is set to a non-NULL value, all the other non-const fields // are updated to be correct also, but those fields can become stale // if the underlying map is modified. When those fields are needed they // are rechecked, and updated if necessary. iterator_base() : node_(NULL), m_(NULL), bucket_index_(0) {} explicit iterator_base(const InnerMap* m) : m_(m) { SearchFrom(m->index_of_first_non_null_); } // Any iterator_base can convert to any other. This is overkill, and we // rely on the enclosing class to use it wisely. The standard "iterator // can convert to const_iterator" is OK but the reverse direction is not. template explicit iterator_base(const iterator_base& it) : node_(it.node_), m_(it.m_), bucket_index_(it.bucket_index_) {} iterator_base(Node* n, const InnerMap* m, size_type index) : node_(n), m_(m), bucket_index_(index) {} iterator_base(TreeIterator tree_it, const InnerMap* m, size_type index) : node_(NodePtrFromKeyPtr(*tree_it)), m_(m), bucket_index_(index) { // Invariant: iterators that use buckets with trees have an even // bucket_index_. GOOGLE_DCHECK_EQ(bucket_index_ % 2, 0); } // Advance through buckets, looking for the first that isn't empty. // If nothing non-empty is found then leave node_ == NULL. void SearchFrom(size_type start_bucket) { GOOGLE_DCHECK(m_->index_of_first_non_null_ == m_->num_buckets_ || m_->table_[m_->index_of_first_non_null_] != NULL); node_ = NULL; for (bucket_index_ = start_bucket; bucket_index_ < m_->num_buckets_; bucket_index_++) { if (m_->TableEntryIsNonEmptyList(bucket_index_)) { node_ = static_cast(m_->table_[bucket_index_]); break; } else if (m_->TableEntryIsTree(bucket_index_)) { Tree* tree = static_cast(m_->table_[bucket_index_]); GOOGLE_DCHECK(!tree->empty()); node_ = NodePtrFromKeyPtr(*tree->begin()); break; } } } reference operator*() const { return node_->kv; } pointer operator->() const { return &(operator*()); } friend bool operator==(const iterator_base& a, const iterator_base& b) { return a.node_ == b.node_; } friend bool operator!=(const iterator_base& a, const iterator_base& b) { return a.node_ != b.node_; } iterator_base& operator++() { if (node_->next == NULL) { TreeIterator tree_it; const bool is_list = revalidate_if_necessary(&tree_it); if (is_list) { SearchFrom(bucket_index_ + 1); } else { GOOGLE_DCHECK_EQ(bucket_index_ & 1, 0); Tree* tree = static_cast(m_->table_[bucket_index_]); if (++tree_it == tree->end()) { SearchFrom(bucket_index_ + 2); } else { node_ = NodePtrFromKeyPtr(*tree_it); } } } else { node_ = node_->next; } return *this; } iterator_base operator++(int /* unused */) { iterator_base tmp = *this; ++*this; return tmp; } // Assumes node_ and m_ are correct and non-NULL, but other fields may be // stale. Fix them as needed. Then return true iff node_ points to a // Node in a list. If false is returned then *it is modified to be // a valid iterator for node_. bool revalidate_if_necessary(TreeIterator* it) { GOOGLE_DCHECK(node_ != NULL && m_ != NULL); // Force bucket_index_ to be in range. bucket_index_ &= (m_->num_buckets_ - 1); // Common case: the bucket we think is relevant points to node_. if (m_->table_[bucket_index_] == static_cast(node_)) return true; // Less common: the bucket is a linked list with node_ somewhere in it, // but not at the head. if (m_->TableEntryIsNonEmptyList(bucket_index_)) { Node* l = static_cast(m_->table_[bucket_index_]); while ((l = l->next) != NULL) { if (l == node_) { return true; } } } // Well, bucket_index_ still might be correct, but probably // not. Revalidate just to be sure. This case is rare enough that we // don't worry about potential optimizations, such as having a custom // find-like method that compares Node* instead of const Key&. iterator_base i(m_->find(*KeyPtrFromNodePtr(node_), it)); bucket_index_ = i.bucket_index_; return m_->TableEntryIsList(bucket_index_); } Node* node_; const InnerMap* m_; size_type bucket_index_; }; public: typedef iterator_base iterator; typedef iterator_base const_iterator; iterator begin() { return iterator(this); } iterator end() { return iterator(); } const_iterator begin() const { return const_iterator(this); } const_iterator end() const { return const_iterator(); } void clear() { for (size_type b = 0; b < num_buckets_; b++) { if (TableEntryIsNonEmptyList(b)) { Node* node = static_cast(table_[b]); table_[b] = NULL; do { Node* next = node->next; DestroyNode(node); node = next; } while (node != NULL); } else if (TableEntryIsTree(b)) { Tree* tree = static_cast(table_[b]); GOOGLE_DCHECK(table_[b] == table_[b + 1] && (b & 1) == 0); table_[b] = table_[b + 1] = NULL; typename Tree::iterator tree_it = tree->begin(); do { Node* node = NodePtrFromKeyPtr(*tree_it); typename Tree::iterator next = tree_it; ++next; tree->erase(tree_it); DestroyNode(node); tree_it = next; } while (tree_it != tree->end()); DestroyTree(tree); b++; } } num_elements_ = 0; index_of_first_non_null_ = num_buckets_; } const hasher& hash_function() const { return *this; } static size_type max_size() { return static_cast(1) << (sizeof(void**) >= 8 ? 60 : 28); } size_type size() const { return num_elements_; } bool empty() const { return size() == 0; } iterator find(const Key& k) { return iterator(FindHelper(k).first); } const_iterator find(const Key& k) const { return find(k, NULL); } // In traditional C++ style, this performs "insert if not present." std::pair insert(const KeyValuePair& kv) { std::pair p = FindHelper(kv.key()); // Case 1: key was already present. if (p.first.node_ != NULL) return std::make_pair(iterator(p.first), false); // Case 2: insert. if (ResizeIfLoadIsOutOfRange(num_elements_ + 1)) { p = FindHelper(kv.key()); } const size_type b = p.second; // bucket number Node* node = Alloc(1); alloc_.construct(&node->kv, kv); iterator result = InsertUnique(b, node); ++num_elements_; return std::make_pair(result, true); } // The same, but if an insertion is necessary then the value portion of the // inserted key-value pair is left uninitialized. std::pair insert(const Key& k) { std::pair p = FindHelper(k); // Case 1: key was already present. if (p.first.node_ != NULL) return std::make_pair(iterator(p.first), false); // Case 2: insert. if (ResizeIfLoadIsOutOfRange(num_elements_ + 1)) { p = FindHelper(k); } const size_type b = p.second; // bucket number Node* node = Alloc(1); typedef typename Allocator::template rebind::other KeyAllocator; KeyAllocator(alloc_).construct(&node->kv.key(), k); iterator result = InsertUnique(b, node); ++num_elements_; return std::make_pair(result, true); } Value& operator[](const Key& k) { KeyValuePair kv(k, Value()); return insert(kv).first->value(); } void erase(iterator it) { GOOGLE_DCHECK_EQ(it.m_, this); typename Tree::iterator tree_it; const bool is_list = it.revalidate_if_necessary(&tree_it); size_type b = it.bucket_index_; Node* const item = it.node_; if (is_list) { GOOGLE_DCHECK(TableEntryIsNonEmptyList(b)); Node* head = static_cast(table_[b]); head = EraseFromLinkedList(item, head); table_[b] = static_cast(head); } else { GOOGLE_DCHECK(TableEntryIsTree(b)); Tree* tree = static_cast(table_[b]); tree->erase(*tree_it); if (tree->empty()) { // Force b to be the minimum of b and b ^ 1. This is important // only because we want index_of_first_non_null_ to be correct. b &= ~static_cast(1); DestroyTree(tree); table_[b] = table_[b + 1] = NULL; } } DestroyNode(item); --num_elements_; if (GOOGLE_PREDICT_FALSE(b == index_of_first_non_null_)) { while (index_of_first_non_null_ < num_buckets_ && table_[index_of_first_non_null_] == NULL) { ++index_of_first_non_null_; } } } private: const_iterator find(const Key& k, TreeIterator* it) const { return FindHelper(k, it).first; } std::pair FindHelper(const Key& k) const { return FindHelper(k, NULL); } std::pair FindHelper(const Key& k, TreeIterator* it) const { size_type b = BucketNumber(k); if (TableEntryIsNonEmptyList(b)) { Node* node = static_cast(table_[b]); do { if (IsMatch(*KeyPtrFromNodePtr(node), k)) { return std::make_pair(const_iterator(node, this, b), b); } else { node = node->next; } } while (node != NULL); } else if (TableEntryIsTree(b)) { GOOGLE_DCHECK_EQ(table_[b], table_[b ^ 1]); b &= ~static_cast(1); Tree* tree = static_cast(table_[b]); Key* key = const_cast(&k); typename Tree::iterator tree_it = tree->find(key); if (tree_it != tree->end()) { if (it != NULL) *it = tree_it; return std::make_pair(const_iterator(tree_it, this, b), b); } } return std::make_pair(end(), b); } // Insert the given Node in bucket b. If that would make bucket b too big, // and bucket b is not a tree, create a tree for buckets b and b^1 to share. // Requires count(*KeyPtrFromNodePtr(node)) == 0 and that b is the correct // bucket. num_elements_ is not modified. iterator InsertUnique(size_type b, Node* node) { GOOGLE_DCHECK(index_of_first_non_null_ == num_buckets_ || table_[index_of_first_non_null_] != NULL); // In practice, the code that led to this point may have already // determined whether we are inserting into an empty list, a short list, // or whatever. But it's probably cheap enough to recompute that here; // it's likely that we're inserting into an empty or short list. iterator result; GOOGLE_DCHECK(find(*KeyPtrFromNodePtr(node)) == end()); if (TableEntryIsEmpty(b)) { result = InsertUniqueInList(b, node); } else if (TableEntryIsNonEmptyList(b)) { if (GOOGLE_PREDICT_FALSE(TableEntryIsTooLong(b))) { TreeConvert(b); result = InsertUniqueInTree(b, node); GOOGLE_DCHECK_EQ(result.bucket_index_, b & ~static_cast(1)); } else { // Insert into a pre-existing list. This case cannot modify // index_of_first_non_null_, so we skip the code to update it. return InsertUniqueInList(b, node); } } else { // Insert into a pre-existing tree. This case cannot modify // index_of_first_non_null_, so we skip the code to update it. return InsertUniqueInTree(b, node); } // parentheses around (std::min) prevents macro expansion of min(...) index_of_first_non_null_ = (std::min)(index_of_first_non_null_, result.bucket_index_); return result; } // Helper for InsertUnique. Handles the case where bucket b is a // not-too-long linked list. iterator InsertUniqueInList(size_type b, Node* node) { node->next = static_cast(table_[b]); table_[b] = static_cast(node); return iterator(node, this, b); } // Helper for InsertUnique. Handles the case where bucket b points to a // Tree. iterator InsertUniqueInTree(size_type b, Node* node) { GOOGLE_DCHECK_EQ(table_[b], table_[b ^ 1]); // Maintain the invariant that node->next is NULL for all Nodes in Trees. node->next = NULL; return iterator(static_cast(table_[b]) ->insert(KeyPtrFromNodePtr(node)) .first, this, b & ~static_cast(1)); } // Returns whether it did resize. Currently this is only used when // num_elements_ increases, though it could be used in other situations. // It checks for load too low as well as load too high: because any number // of erases can occur between inserts, the load could be as low as 0 here. // Resizing to a lower size is not always helpful, but failing to do so can // destroy the expected big-O bounds for some operations. By having the // policy that sometimes we resize down as well as up, clients can easily // keep O(size()) = O(number of buckets) if they want that. bool ResizeIfLoadIsOutOfRange(size_type new_size) { const size_type kMaxMapLoadTimes16 = 12; // controls RAM vs CPU tradeoff const size_type hi_cutoff = num_buckets_ * kMaxMapLoadTimes16 / 16; const size_type lo_cutoff = hi_cutoff / 4; // We don't care how many elements are in trees. If a lot are, // we may resize even though there are many empty buckets. In // practice, this seems fine. if (GOOGLE_PREDICT_FALSE(new_size >= hi_cutoff)) { if (num_buckets_ <= max_size() / 2) { Resize(num_buckets_ * 2); return true; } } else if (GOOGLE_PREDICT_FALSE(new_size <= lo_cutoff && num_buckets_ > kMinTableSize)) { size_type lg2_of_size_reduction_factor = 1; // It's possible we want to shrink a lot here... size() could even be 0. // So, estimate how much to shrink by making sure we don't shrink so // much that we would need to grow the table after a few inserts. const size_type hypothetical_size = new_size * 5 / 4 + 1; while ((hypothetical_size << lg2_of_size_reduction_factor) < hi_cutoff) { ++lg2_of_size_reduction_factor; } size_type new_num_buckets = std::max( kMinTableSize, num_buckets_ >> lg2_of_size_reduction_factor); if (new_num_buckets != num_buckets_) { Resize(new_num_buckets); return true; } } return false; } // Resize to the given number of buckets. void Resize(size_t new_num_buckets) { GOOGLE_DCHECK_GE(new_num_buckets, kMinTableSize); void** const old_table = table_; const size_type old_table_size = num_buckets_; num_buckets_ = new_num_buckets; table_ = CreateEmptyTable(num_buckets_); const size_type start = index_of_first_non_null_; index_of_first_non_null_ = num_buckets_; for (size_type i = start; i < old_table_size; i++) { if (TableEntryIsNonEmptyList(old_table, i)) { TransferList(old_table, i); } else if (TableEntryIsTree(old_table, i)) { TransferTree(old_table, i++); } } Dealloc(old_table, old_table_size); } void TransferList(void* const* table, size_type index) { Node* node = static_cast(table[index]); do { Node* next = node->next; InsertUnique(BucketNumber(*KeyPtrFromNodePtr(node)), node); node = next; } while (node != NULL); } void TransferTree(void* const* table, size_type index) { Tree* tree = static_cast(table[index]); typename Tree::iterator tree_it = tree->begin(); do { Node* node = NodePtrFromKeyPtr(*tree_it); InsertUnique(BucketNumber(**tree_it), node); } while (++tree_it != tree->end()); DestroyTree(tree); } Node* EraseFromLinkedList(Node* item, Node* head) { if (head == item) { return head->next; } else { head->next = EraseFromLinkedList(item, head->next); return head; } } bool TableEntryIsEmpty(size_type b) const { return TableEntryIsEmpty(table_, b); } bool TableEntryIsNonEmptyList(size_type b) const { return TableEntryIsNonEmptyList(table_, b); } bool TableEntryIsTree(size_type b) const { return TableEntryIsTree(table_, b); } bool TableEntryIsList(size_type b) const { return TableEntryIsList(table_, b); } static bool TableEntryIsEmpty(void* const* table, size_type b) { return table[b] == NULL; } static bool TableEntryIsNonEmptyList(void* const* table, size_type b) { return table[b] != NULL && table[b] != table[b ^ 1]; } static bool TableEntryIsTree(void* const* table, size_type b) { return !TableEntryIsEmpty(table, b) && !TableEntryIsNonEmptyList(table, b); } static bool TableEntryIsList(void* const* table, size_type b) { return !TableEntryIsTree(table, b); } void TreeConvert(size_type b) { GOOGLE_DCHECK(!TableEntryIsTree(b) && !TableEntryIsTree(b ^ 1)); typename Allocator::template rebind::other tree_allocator(alloc_); Tree* tree = tree_allocator.allocate(1); // We want to use the three-arg form of construct, if it exists, but we // create a temporary and use the two-arg construct that's known to exist. // It's clunky, but the compiler should be able to generate more-or-less // the same code. tree_allocator.construct(tree, Tree(KeyCompare(), KeyPtrAllocator(alloc_))); // Now the tree is ready to use. size_type count = CopyListToTree(b, tree) + CopyListToTree(b ^ 1, tree); GOOGLE_DCHECK_EQ(count, tree->size()); table_[b] = table_[b ^ 1] = static_cast(tree); } // Copy a linked list in the given bucket to a tree. // Returns the number of things it copied. size_type CopyListToTree(size_type b, Tree* tree) { size_type count = 0; Node* node = static_cast(table_[b]); while (node != NULL) { tree->insert(KeyPtrFromNodePtr(node)); ++count; Node* next = node->next; node->next = NULL; node = next; } return count; } // Return whether table_[b] is a linked list that seems awfully long. // Requires table_[b] to point to a non-empty linked list. bool TableEntryIsTooLong(size_type b) { const size_type kMaxLength = 8; size_type count = 0; Node* node = static_cast(table_[b]); do { ++count; node = node->next; } while (node != NULL); // Invariant: no linked list ever is more than kMaxLength in length. GOOGLE_DCHECK_LE(count, kMaxLength); return count >= kMaxLength; } size_type BucketNumber(const Key& k) const { // We inherit from hasher, so one-arg operator() provides a hash function. size_type h = (*const_cast(this))(k); return (h + seed_) & (num_buckets_ - 1); } bool IsMatch(const Key& k0, const Key& k1) const { return std::equal_to()(k0, k1); } // Return a power of two no less than max(kMinTableSize, n). // Assumes either n < kMinTableSize or n is a power of two. size_type TableSize(size_type n) { return n < static_cast(kMinTableSize) ? static_cast(kMinTableSize) : n; } // Use alloc_ to allocate an array of n objects of type U. template U* Alloc(size_type n) { typedef typename Allocator::template rebind::other alloc_type; return alloc_type(alloc_).allocate(n); } // Use alloc_ to deallocate an array of n objects of type U. template void Dealloc(U* t, size_type n) { typedef typename Allocator::template rebind::other alloc_type; alloc_type(alloc_).deallocate(t, n); } void DestroyNode(Node* node) { alloc_.destroy(&node->kv); Dealloc(node, 1); } void DestroyTree(Tree* tree) { typename Allocator::template rebind::other tree_allocator(alloc_); tree_allocator.destroy(tree); tree_allocator.deallocate(tree, 1); } void** CreateEmptyTable(size_type n) { GOOGLE_DCHECK(n >= kMinTableSize); GOOGLE_DCHECK_EQ(n & (n - 1), 0); void** result = Alloc(n); memset(result, 0, n * sizeof(result[0])); return result; } // Return a randomish value. size_type Seed() const { size_type s = static_cast(reinterpret_cast(this)); #if defined(__x86_64__) && defined(__GNUC__) uint32 hi, lo; asm("rdtsc" : "=a" (lo), "=d" (hi)); s += ((static_cast(hi) << 32) | lo); #endif return s; } size_type num_elements_; size_type num_buckets_; size_type seed_; 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 public: // Iterators class const_iterator { typedef typename InnerMap::const_iterator InnerIt; public: typedef std::forward_iterator_tag iterator_category; typedef typename Map::value_type value_type; typedef ptrdiff_t difference_type; typedef const value_type* pointer; typedef const value_type& reference; const_iterator() {} explicit const_iterator(const InnerIt& it) : it_(it) {} const_reference operator*() const { return *it_->value(); } const_pointer operator->() const { return &(operator*()); } const_iterator& operator++() { ++it_; return *this; } const_iterator operator++(int) { return const_iterator(it_++); } friend bool operator==(const const_iterator& a, const const_iterator& b) { return a.it_ == b.it_; } friend bool operator!=(const const_iterator& a, const const_iterator& b) { return !(a == b); } private: InnerIt it_; }; class iterator { typedef typename InnerMap::iterator InnerIt; public: typedef std::forward_iterator_tag iterator_category; typedef typename Map::value_type value_type; typedef ptrdiff_t difference_type; typedef value_type* pointer; typedef value_type& reference; iterator() {} explicit iterator(const InnerIt& it) : it_(it) {} reference operator*() const { return *it_->value(); } pointer operator->() const { return &(operator*()); } iterator& operator++() { ++it_; return *this; } iterator operator++(int) { return iterator(it_++); } // Allow implicit conversion to const_iterator. operator const_iterator() const { return const_iterator(typename InnerMap::const_iterator(it_)); } friend bool operator==(const iterator& a, const iterator& b) { return a.it_ == b.it_; } friend bool operator!=(const iterator& a, const iterator& b) { return !(a == b); } private: friend class Map; InnerIt it_; }; iterator begin() { return iterator(elements_->begin()); } iterator end() { return iterator(elements_->end()); } const_iterator begin() const { return const_iterator(iterator(elements_->begin())); } const_iterator end() const { return const_iterator(iterator(elements_->end())); } 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; } // Element access T& operator[](const key_type& key) { value_type** value = &(*elements_)[key]; if (*value == NULL) { *value = CreateValueTypeInternal(key); internal::MapValueInitializer::value, T>::Initialize((*value)->second, default_enum_value_); } return (*value)->second; } const T& at(const key_type& key) const { const_iterator it = find(key); GOOGLE_CHECK(it != end()) << "key not found: " << key; return it->second; } T& at(const key_type& key) { iterator it = find(key); GOOGLE_CHECK(it != end()) << "key not found: " << key; return it->second; } // Lookup size_type count(const key_type& key) const { const_iterator it = find(key); GOOGLE_DCHECK(it == end() || key == it->first); return it == end() ? 0 : 1; } const_iterator find(const key_type& key) const { return const_iterator(iterator(elements_->find(key))); } iterator find(const key_type& key) { return iterator(elements_->find(key)); } std::pair equal_range( const key_type& key) const { const_iterator it = find(key); if (it == end()) { return std::pair(it, it); } else { const_iterator begin = it++; return std::pair(begin, it); } } std::pair equal_range(const key_type& key) { iterator it = find(key); if (it == end()) { return std::pair(it, it); } else { iterator begin = it++; return std::pair(begin, it); } } // insert std::pair insert(const value_type& value) { std::pair p = elements_->insert(value.first); if (p.second) { p.first->value() = CreateValueTypeInternal(value); } return std::pair(iterator(p.first), p.second); } template void insert(InputIt first, InputIt last) { for (InputIt it = first; it != last; ++it) { iterator exist_it = find(it->first); if (exist_it == end()) { operator[](it->first) = it->second; } } } // Erase and clear size_type erase(const key_type& key) { iterator it = find(key); if (it == end()) { return 0; } else { erase(it); return 1; } } iterator erase(iterator pos) { if (arena_ == NULL) delete pos.operator->(); iterator i = pos++; elements_->erase(i.it_); return pos; } void erase(iterator first, iterator last) { while (first != last) { first = erase(first); } } void clear() { erase(begin(), end()); } // Assign Map& operator=(const Map& other) { if (this != &other) { clear(); insert(other.begin(), other.end()); } return *this; } void swap(Map& other) { if (arena_ == other.arena_) { std::swap(default_enum_value_, other.default_enum_value_); std::swap(elements_, other.elements_); } else { // TODO(zuguang): optimize this. The temporary copy can be allocated // in the same arena as the other message, and the "other = copy" can // be replaced with the fast-path swap above. Map copy = *this; *this = other; other = copy; } } // Access to hasher. Currently this returns a copy, but it may // be modified to return a const reference in the future. hasher hash_function() const { return elements_->hash_function(); } private: // Set default enum value only for proto2 map field whose value is enum type. void SetDefaultEnumValue(int default_enum_value) { default_enum_value_ = default_enum_value; } value_type* CreateValueTypeInternal(const Key& key) { if (arena_ == NULL) { return new value_type(key); } else { value_type* value = reinterpret_cast( Arena::CreateArray(arena_, sizeof(value_type))); Arena::CreateInArenaStorage(const_cast(&value->first), arena_); Arena::CreateInArenaStorage(&value->second, arena_); const_cast(value->first) = key; return value; } } value_type* CreateValueTypeInternal(const value_type& value) { if (arena_ == NULL) { return new value_type(value); } else { value_type* p = reinterpret_cast( Arena::CreateArray(arena_, sizeof(value_type))); Arena::CreateInArenaStorage(const_cast(&p->first), arena_); Arena::CreateInArenaStorage(&p->second, arena_); const_cast(p->first) = value.first; p->second = value.second; return p; } } Arena* arena_; int default_enum_value_; InnerMap* elements_; friend class ::google::protobuf::Arena; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; template friend class internal::MapFieldLite; }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_MAP_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_entry.h000066400000000000000000000144041334102242000274430ustar00rootroot00000000000000// 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_MAP_ENTRY_H__ #define GOOGLE_PROTOBUF_MAP_ENTRY_H__ #include #include #include #include #include #include #include namespace google { namespace protobuf { class Arena; namespace internal { template class MapField; } } namespace protobuf { namespace internal { // MapEntry is the returned google::protobuf::Message when calling AddMessage of // google::protobuf::Reflection. In order to let it work with generated message // reflection, its in-memory type is the same as generated message with the same // fields. However, in order to decide the in-memory type of key/value, we need // to know both their cpp type in generated api and proto type. In // implementation, all in-memory types have related wire format functions to // support except ArenaStringPtr. Therefore, we need to define another type with // supporting wire format functions. Since this type is only used as return type // of MapEntry accessors, it's named MapEntry accessor type. // // cpp type: the type visible to users in public API. // proto type: WireFormatLite::FieldType of the field. // in-memory type: type of the data member used to stored this field. // MapEntry accessor type: type used in MapEntry getters/mutators to access the // field. // // cpp type | proto type | in-memory type | MapEntry accessor type // int32 TYPE_INT32 int32 int32 // int32 TYPE_FIXED32 int32 int32 // string TYPE_STRING ArenaStringPtr string // FooEnum TYPE_ENUM int int // FooMessage TYPE_MESSAGE FooMessage* FooMessage // // The in-memory types of primitive types can be inferred from its proto type, // while we need to explicitly specify the cpp type if proto type is // TYPE_MESSAGE to infer the in-memory type. Moreover, default_enum_value is // used to initialize enum field in proto2. template class MapEntry : public MapEntryImpl { public: MapEntry() : _internal_metadata_(NULL) {} explicit MapEntry(Arena* arena) : MapEntryImpl(arena), _internal_metadata_(arena) {} typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; InternalMetadataWithArena _internal_metadata_; private: friend class ::google::protobuf::Arena; template friend class internal::MapField; friend class internal::GeneratedMessageReflection; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapEntry); }; // Specialization for the full runtime template struct MapEntryHelper > : MapEntryHelper > { explicit MapEntryHelper(const MapPair& map_pair) : MapEntryHelper >( map_pair) {} }; template struct DeconstructMapEntry > { typedef K Key; typedef V Value; static const WireFormatLite::FieldType kKeyFieldType = key; static const WireFormatLite::FieldType kValueFieldType = value; static const int default_enum_value = default_enum; }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_MAP_ENTRY_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_entry_lite.h000066400000000000000000000630001334102242000304540ustar00rootroot00000000000000// 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_MAP_ENTRY_LITE_H__ #define GOOGLE_PROTOBUF_MAP_ENTRY_LITE_H__ #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { template class MapEntry; template class MapFieldLite; } // namespace internal } // namespace protobuf namespace protobuf { namespace internal { // MoveHelper::Move is used to set *dest. It copies *src, or moves it (in // the C++11 sense), or swaps it. *src is left in a sane state for // subsequent destruction, but shouldn't be used for anything. template struct MoveHelper { // primitives static void Move(T* src, T* dest) { *dest = *src; } }; template struct MoveHelper { // enums static void Move(T* src, T* dest) { *dest = *src; } // T is an enum here, so allow conversions to and from int. static void Move(T* src, int* dest) { *dest = static_cast(*src); } static void Move(int* src, T* dest) { *dest = static_cast(*src); } }; template struct MoveHelper { // messages static void Move(T* src, T* dest) { dest->Swap(src); } }; template struct MoveHelper { // strings and similar static void Move(T* src, T* dest) { #if __cplusplus >= 201103L *dest = std::move(*src); #else dest->swap(*src); #endif } }; // MapEntryImpl is used to implement parsing and serialization of map entries. // It uses Curious Recursive Template Pattern (CRTP) to provide the type of // the eventual code to the template code. template class MapEntryImpl : public Base { protected: // Provide utilities to parse/serialize key/value. Provide utilities to // manipulate internal stored type. typedef MapTypeHandler KeyTypeHandler; typedef MapTypeHandler ValueTypeHandler; // Define internal memory layout. Strings and messages are stored as // pointers, while other types are stored as values. typedef typename KeyTypeHandler::TypeOnMemory KeyOnMemory; typedef typename ValueTypeHandler::TypeOnMemory ValueOnMemory; // Enum type cannot be used for MapTypeHandler::Read. Define a type // which will replace Enum with int. typedef typename KeyTypeHandler::MapEntryAccessorType KeyMapEntryAccessorType; typedef typename ValueTypeHandler::MapEntryAccessorType ValueMapEntryAccessorType; // Constants for field number. static const int kKeyFieldNumber = 1; static const int kValueFieldNumber = 2; // Constants for field tag. static const uint8 kKeyTag = GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG( kKeyFieldNumber, KeyTypeHandler::kWireType); static const uint8 kValueTag = GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG( kValueFieldNumber, ValueTypeHandler::kWireType); static const size_t kTagSize = 1; public: // Work-around for a compiler bug (see repeated_field.h). typedef void MapEntryHasMergeTypeTrait; typedef Derived EntryType; typedef Key EntryKeyType; typedef Value EntryValueType; static const WireFormatLite::FieldType kEntryKeyFieldType = kKeyFieldType; static const WireFormatLite::FieldType kEntryValueFieldType = kValueFieldType; static const int kEntryDefaultEnumValue = default_enum_value; MapEntryImpl() : arena_(NULL) { KeyTypeHandler::Initialize(&key_, NULL); ValueTypeHandler::InitializeMaybeByDefaultEnum(&value_, default_enum_value, NULL); _has_bits_[0] = 0; } explicit MapEntryImpl(Arena* arena) : arena_(arena) { KeyTypeHandler::Initialize(&key_, arena); ValueTypeHandler::InitializeMaybeByDefaultEnum(&value_, default_enum_value, arena); _has_bits_[0] = 0; } ~MapEntryImpl() { if (GetArenaNoVirtual() != NULL) return; KeyTypeHandler::DeleteNoArena(key_); ValueTypeHandler::DeleteNoArena(value_); } // accessors ====================================================== virtual inline const KeyMapEntryAccessorType& key() const { return KeyTypeHandler::GetExternalReference(key_); } virtual inline const ValueMapEntryAccessorType& value() const { return ValueTypeHandler::DefaultIfNotInitialized( value_, Derived::internal_default_instance()->value_); } inline KeyMapEntryAccessorType* mutable_key() { set_has_key(); return KeyTypeHandler::EnsureMutable(&key_, GetArenaNoVirtual()); } inline ValueMapEntryAccessorType* mutable_value() { set_has_value(); return ValueTypeHandler::EnsureMutable(&value_, GetArenaNoVirtual()); } // implements MessageLite ========================================= // MapEntryImpl is for implementation only and this function isn't called // anywhere. Just provide a fake implementation here for MessageLite. string GetTypeName() const { return ""; } void CheckTypeAndMergeFrom(const MessageLite& other) { MergeFromInternal(*::google::protobuf::down_cast(&other)); } bool MergePartialFromCodedStream(::google::protobuf::io::CodedInputStream* input) { uint32 tag; for (;;) { // 1) corrupted data: return false; // 2) unknown field: skip without putting into unknown field set; // 3) unknown enum value: keep it in parsing. In proto2, caller should // check the value and put this entry into containing message's unknown // field set if the value is an unknown enum. In proto3, caller doesn't // need to care whether the value is unknown enum; // 4) missing key/value: missed key/value will have default value. caller // should take this entry as if key/value is set to default value. tag = input->ReadTagNoLastTag(); switch (tag) { case kKeyTag: if (!KeyTypeHandler::Read(input, mutable_key())) { return false; } set_has_key(); if (!input->ExpectTag(kValueTag)) break; GOOGLE_FALLTHROUGH_INTENDED; case kValueTag: if (!ValueTypeHandler::Read(input, mutable_value())) { return false; } set_has_value(); if (input->ExpectAtEnd()) return true; break; default: if (tag == 0 || WireFormatLite::GetTagWireType(tag) == WireFormatLite::WIRETYPE_END_GROUP) { return true; } if (!WireFormatLite::SkipField(input, tag)) return false; break; } } } size_t ByteSizeLong() const { size_t size = 0; size += has_key() ? kTagSize + static_cast(KeyTypeHandler::ByteSize(key())) : 0; size += has_value() ? kTagSize + static_cast(ValueTypeHandler::ByteSize(value())) : 0; return size; } void SerializeWithCachedSizes(::google::protobuf::io::CodedOutputStream* output) const { KeyTypeHandler::Write(kKeyFieldNumber, key(), output); ValueTypeHandler::Write(kValueFieldNumber, value(), output); } ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(bool deterministic, ::google::protobuf::uint8* output) const { output = KeyTypeHandler::InternalWriteToArray(kKeyFieldNumber, key(), deterministic, output); output = ValueTypeHandler::InternalWriteToArray(kValueFieldNumber, value(), deterministic, output); return output; } // Don't override SerializeWithCachedSizesToArray. Use MessageLite's. int GetCachedSize() const { int size = 0; size += has_key() ? static_cast(kTagSize) + KeyTypeHandler::GetCachedSize(key()) : 0; size += has_value() ? static_cast(kTagSize) + ValueTypeHandler::GetCachedSize(value()) : 0; return size; } bool IsInitialized() const { return ValueTypeHandler::IsInitialized(value_); } Base* New() const { Derived* entry = new Derived; return entry; } Base* New(Arena* arena) const { Derived* entry = Arena::CreateMessage(arena); return entry; } size_t SpaceUsedLong() const { size_t size = sizeof(Derived); size += KeyTypeHandler::SpaceUsedInMapEntryLong(key_); size += ValueTypeHandler::SpaceUsedInMapEntryLong(value_); return size; } protected: // We can't declare this function directly here as it would hide the other // overload (const Message&). void MergeFromInternal(const MapEntryImpl& from) { if (from._has_bits_[0]) { if (from.has_key()) { KeyTypeHandler::EnsureMutable(&key_, GetArenaNoVirtual()); KeyTypeHandler::Merge(from.key(), &key_, GetArenaNoVirtual()); set_has_key(); } if (from.has_value()) { ValueTypeHandler::EnsureMutable(&value_, GetArenaNoVirtual()); ValueTypeHandler::Merge(from.value(), &value_, GetArenaNoVirtual()); set_has_value(); } } } public: void Clear() { KeyTypeHandler::Clear(&key_, GetArenaNoVirtual()); ValueTypeHandler::ClearMaybeByDefaultEnum( &value_, GetArenaNoVirtual(), default_enum_value); clear_has_key(); clear_has_value(); } static void InitAsDefaultInstance() { Derived* d = const_cast(Derived::internal_default_instance()); KeyTypeHandler::AssignDefaultValue(&d->key_); ValueTypeHandler::AssignDefaultValue(&d->value_); } Arena* GetArena() const { return GetArenaNoVirtual(); } // Create a MapEntryImpl for given key and value from google::protobuf::Map in // serialization. This function is only called when value is enum. Enum is // treated differently because its type in MapEntry is int and its type in // google::protobuf::Map is enum. We cannot create a reference to int from an enum. static Derived* EnumWrap(const Key& key, const Value value, Arena* arena) { return Arena::CreateMessage(arena, key, value); } // Like above, but for all the other types. This avoids value copy to create // MapEntryImpl from google::protobuf::Map in serialization. static Derived* Wrap(const Key& key, const Value& value, Arena* arena) { return Arena::CreateMessage(arena, key, value); } // Parsing using MergePartialFromCodedStream, above, is not as // efficient as it could be. This helper class provides a speedier way. template class Parser { public: explicit Parser(MapField* mf) : mf_(mf), map_(mf->MutableMap()) {} // This does what the typical MergePartialFromCodedStream() is expected to // do, with the additional side-effect that if successful (i.e., if true is // going to be its return value) it inserts the key-value pair into map_. bool MergePartialFromCodedStream(::google::protobuf::io::CodedInputStream* input) { // Look for the expected thing: a key and then a value. If it fails, // invoke the enclosing class's MergePartialFromCodedStream, or return // false if that would be pointless. if (input->ExpectTag(kKeyTag)) { if (!KeyTypeHandler::Read(input, &key_)) { return false; } // Peek at the next byte to see if it is kValueTag. If not, bail out. const void* data; int size; input->GetDirectBufferPointerInline(&data, &size); // We could use memcmp here, but we don't bother. The tag is one byte. GOOGLE_COMPILE_ASSERT(kTagSize == 1, tag_size_error); if (size > 0 && *reinterpret_cast(data) == kValueTag) { typename Map::size_type size = map_->size(); value_ptr_ = &(*map_)[key_]; if (GOOGLE_PREDICT_TRUE(size != map_->size())) { // We created a new key-value pair. Fill in the value. typedef typename MapIf::type T; input->Skip(kTagSize); // Skip kValueTag. if (!ValueTypeHandler::Read(input, reinterpret_cast(value_ptr_))) { map_->erase(key_); // Failure! Undo insertion. return false; } if (input->ExpectAtEnd()) return true; return ReadBeyondKeyValuePair(input); } } } else { key_ = Key(); } entry_.reset(mf_->NewEntry()); *entry_->mutable_key() = key_; const bool result = entry_->MergePartialFromCodedStream(input); if (result) UseKeyAndValueFromEntry(); if (entry_->GetArena() != NULL) entry_.release(); return result; } const Key& key() const { return key_; } const Value& value() const { return *value_ptr_; } private: void UseKeyAndValueFromEntry() GOOGLE_PROTOBUF_ATTRIBUTE_COLD { // Update key_ in case we need it later (because key() is called). // This is potentially inefficient, especially if the key is // expensive to copy (e.g., a long string), but this is a cold // path, so it's not a big deal. key_ = entry_->key(); value_ptr_ = &(*map_)[key_]; MoveHelper::Move(entry_->mutable_value(), value_ptr_); } // After reading a key and value successfully, and inserting that data // into map_, we are not at the end of the input. This is unusual, but // allowed by the spec. bool ReadBeyondKeyValuePair(::google::protobuf::io::CodedInputStream* input) GOOGLE_PROTOBUF_ATTRIBUTE_COLD { typedef MoveHelper KeyMover; typedef MoveHelper ValueMover; entry_.reset(mf_->NewEntry()); ValueMover::Move(value_ptr_, entry_->mutable_value()); map_->erase(key_); KeyMover::Move(&key_, entry_->mutable_key()); const bool result = entry_->MergePartialFromCodedStream(input); if (result) UseKeyAndValueFromEntry(); if (entry_->GetArena() != NULL) entry_.release(); return result; } MapField* const mf_; Map* const map_; Key key_; Value* value_ptr_; // On the fast path entry_ is not used. And, when entry_ is used, it's set // to mf_->NewEntry(), so in the arena case we must call entry_.release. google::protobuf::scoped_ptr entry_; }; protected: void set_has_key() { _has_bits_[0] |= 0x00000001u; } bool has_key() const { return (_has_bits_[0] & 0x00000001u) != 0; } void clear_has_key() { _has_bits_[0] &= ~0x00000001u; } void set_has_value() { _has_bits_[0] |= 0x00000002u; } bool has_value() const { return (_has_bits_[0] & 0x00000002u) != 0; } void clear_has_value() { _has_bits_[0] &= ~0x00000002u; } private: // Serializing a generated message containing map field involves serializing // key-value pairs from google::protobuf::Map. The wire format of each key-value pair // after serialization should be the same as that of a MapEntry message // containing the same key and value inside it. However, google::protobuf::Map doesn't // store key and value as MapEntry message, which disables us to use existing // code to serialize message. In order to use existing code to serialize // message, we need to construct a MapEntry from key-value pair. But it // involves copy of key and value to construct a MapEntry. In order to avoid // this copy in constructing a MapEntry, we need the following class which // only takes references of given key and value. class MapEntryWrapper : public Derived { typedef Derived BaseClass; typedef typename BaseClass::KeyMapEntryAccessorType KeyMapEntryAccessorType; typedef typename BaseClass::ValueMapEntryAccessorType ValueMapEntryAccessorType; public: MapEntryWrapper(Arena* arena, const Key& key, const Value& value) : Derived(arena), key_(key), value_(value) { BaseClass::set_has_key(); BaseClass::set_has_value(); } inline const KeyMapEntryAccessorType& key() const { return key_; } inline const ValueMapEntryAccessorType& value() const { return value_; } private: const Key& key_; const Value& value_; friend class ::google::protobuf::Arena; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; }; // Like above, but for enum value only, which stores value instead of // reference of value field inside. This is needed because the type of value // field in constructor is an enum, while we need to store it as an int. If we // initialize a reference to int with a reference to enum, compiler will // generate a temporary int from enum and initialize the reference to int with // the temporary. class MapEnumEntryWrapper : public Derived { typedef Derived BaseClass; typedef typename BaseClass::KeyMapEntryAccessorType KeyMapEntryAccessorType; typedef typename BaseClass::ValueMapEntryAccessorType ValueMapEntryAccessorType; public: MapEnumEntryWrapper(Arena* arena, const Key& key, const Value& value) : Derived(arena), key_(key), value_(value) { BaseClass::set_has_key(); BaseClass::set_has_value(); } inline const KeyMapEntryAccessorType& key() const { return key_; } inline const ValueMapEntryAccessorType& value() const { return value_; } private: const KeyMapEntryAccessorType& key_; const ValueMapEntryAccessorType value_; friend class google::protobuf::Arena; typedef void DestructorSkippable_; }; inline Arena* GetArenaNoVirtual() const { return arena_; } public: // Needed for constructing tables KeyOnMemory key_; ValueOnMemory value_; Arena* arena_; uint32 _has_bits_[1]; private: friend class ::google::protobuf::Arena; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; template friend class internal::MapEntry; template friend class internal::MapFieldLite; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapEntryImpl); }; template class MapEntryLite : public MapEntryImpl { public: typedef MapEntryImpl SuperType; MapEntryLite() {} explicit MapEntryLite(Arena* arena) : SuperType(arena) {} void MergeFrom(const MapEntryLite& other) { MergeFromInternal(other); } private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapEntryLite); }; // The completely unprincipled and unwieldy use of template parameters in // the map code necessitates wrappers to make the code a little bit more // manageable. template struct DeconstructMapEntry; template struct DeconstructMapEntry > { typedef K Key; typedef V Value; static const WireFormatLite::FieldType kKeyFieldType = key; static const WireFormatLite::FieldType kValueFieldType = value; static const int default_enum_value = default_enum; }; // Helpers for deterministic serialization ============================= // This struct can be used with any generic sorting algorithm. If the Key // type is relatively small and easy to copy then copying Keys into an // array of SortItems can be beneficial. Then all the data the sorting // algorithm needs to touch is in that one array. template struct SortItem { SortItem() {} explicit SortItem(PtrToKeyValuePair p) : first(p->first), second(p) {} Key first; PtrToKeyValuePair second; }; template struct CompareByFirstField { bool operator()(const T& a, const T& b) const { return a.first < b.first; } }; template struct CompareByDerefFirst { bool operator()(const T& a, const T& b) const { return a->first < b->first; } }; // Helper for table driven serialization template struct FromHelper { template static const T& From(const T& x) { return x; } }; template <> struct FromHelper { static ArenaStringPtr From(const string& x) { ArenaStringPtr res; *res.UnsafeRawStringPointer() = const_cast(&x); return res; } }; template <> struct FromHelper { static ArenaStringPtr From(const string& x) { ArenaStringPtr res; *res.UnsafeRawStringPointer() = const_cast(&x); return res; } }; template <> struct FromHelper { template static T* From(const T& x) { return const_cast(&x); } }; template struct MapEntryHelper; template struct MapEntryHelper > { // Provide utilities to parse/serialize key/value. Provide utilities to // manipulate internal stored type. typedef MapTypeHandler KeyTypeHandler; typedef MapTypeHandler ValueTypeHandler; // Define internal memory layout. Strings and messages are stored as // pointers, while other types are stored as values. typedef typename KeyTypeHandler::TypeOnMemory KeyOnMemory; typedef typename ValueTypeHandler::TypeOnMemory ValueOnMemory; explicit MapEntryHelper(const MapPair& map_pair) : _has_bits_(3), _cached_size_(2 + KeyTypeHandler::GetCachedSize(map_pair.first) + ValueTypeHandler::GetCachedSize(map_pair.second)), key_(FromHelper::From(map_pair.first)), value_(FromHelper::From(map_pair.second)) {} // Purposely not folowing the style guide naming. These are the names // the proto compiler would generate given the map entry descriptor. // The proto compiler generates the offsets in this struct as if this was // a regular message. This way the table driven code barely notices it's // dealing with a map field. uint32 _has_bits_; // NOLINT uint32 _cached_size_; // NOLINT KeyOnMemory key_; // NOLINT ValueOnMemory value_; // NOLINT }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_MAP_ENTRY_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_field.cc000066400000000000000000000420311334102242000275200ustar00rootroot00000000000000// 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 #include #include namespace google { namespace protobuf { namespace internal { MapFieldBase::~MapFieldBase() { if (repeated_field_ != NULL && arena_ == NULL) delete repeated_field_; } const RepeatedPtrFieldBase& MapFieldBase::GetRepeatedField() const { SyncRepeatedFieldWithMap(); return *repeated_field_; } RepeatedPtrFieldBase* MapFieldBase::MutableRepeatedField() { SyncRepeatedFieldWithMap(); SetRepeatedDirty(); return repeated_field_; } size_t MapFieldBase::SpaceUsedExcludingSelfLong() const { mutex_.Lock(); size_t size = SpaceUsedExcludingSelfNoLock(); mutex_.Unlock(); return size; } size_t MapFieldBase::SpaceUsedExcludingSelfNoLock() const { if (repeated_field_ != NULL) { return repeated_field_->SpaceUsedExcludingSelfLong(); } else { return 0; } } bool MapFieldBase::IsMapValid() const { // "Acquire" insures the operation after SyncRepeatedFieldWithMap won't get // executed before state_ is checked. Atomic32 state = google::protobuf::internal::Acquire_Load(&state_); return state != STATE_MODIFIED_REPEATED; } void MapFieldBase::SetMapDirty() { state_ = STATE_MODIFIED_MAP; } void MapFieldBase::SetRepeatedDirty() { state_ = STATE_MODIFIED_REPEATED; } void* MapFieldBase::MutableRepeatedPtrField() const { return repeated_field_; } void MapFieldBase::SyncRepeatedFieldWithMap() const { // "Acquire" insures the operation after SyncRepeatedFieldWithMap won't get // executed before state_ is checked. Atomic32 state = google::protobuf::internal::Acquire_Load(&state_); if (state == STATE_MODIFIED_MAP) { mutex_.Lock(); // Double check state, because another thread may have seen the same state // and done the synchronization before the current thread. if (state_ == STATE_MODIFIED_MAP) { SyncRepeatedFieldWithMapNoLock(); // "Release" insures state_ can only be changed "after" // SyncRepeatedFieldWithMapNoLock is finished. google::protobuf::internal::Release_Store(&state_, CLEAN); } mutex_.Unlock(); } } void MapFieldBase::SyncRepeatedFieldWithMapNoLock() const { if (repeated_field_ == NULL) { repeated_field_ = Arena::CreateMessage >(arena_); } } void MapFieldBase::SyncMapWithRepeatedField() const { // "Acquire" insures the operation after SyncMapWithRepeatedField won't get // executed before state_ is checked. Atomic32 state = google::protobuf::internal::Acquire_Load(&state_); if (state == STATE_MODIFIED_REPEATED) { mutex_.Lock(); // Double check state, because another thread may have seen the same state // and done the synchronization before the current thread. if (state_ == STATE_MODIFIED_REPEATED) { SyncMapWithRepeatedFieldNoLock(); // "Release" insures state_ can only be changed "after" // SyncRepeatedFieldWithMapNoLock is finished. google::protobuf::internal::Release_Store(&state_, CLEAN); } mutex_.Unlock(); } } // ------------------DynamicMapField------------------ DynamicMapField::DynamicMapField(const Message* default_entry) : default_entry_(default_entry) { } DynamicMapField::DynamicMapField(const Message* default_entry, Arena* arena) : TypeDefinedMapFieldBase(arena), default_entry_(default_entry) { } DynamicMapField::~DynamicMapField() { // DynamicMapField owns map values. Need to delete them before clearing // the map. for (Map::iterator iter = map_.begin(); iter != map_.end(); ++iter) { iter->second.DeleteData(); } map_.clear(); } int DynamicMapField::size() const { return GetMap().size(); } bool DynamicMapField::ContainsMapKey( const MapKey& map_key) const { const Map& map = GetMap(); Map::const_iterator iter = map.find(map_key); return iter != map.end(); } bool DynamicMapField::InsertOrLookupMapValue( const MapKey& map_key, MapValueRef* val) { // Always use mutable map because users may change the map value by // MapValueRef. Map* map = MutableMap(); Map::iterator iter = map->find(map_key); if (iter == map->end()) { // Insert MapValueRef& map_val = (*map)[map_key]; const FieldDescriptor* val_des = default_entry_->GetDescriptor()->FindFieldByName("value"); map_val.SetType(val_des->cpp_type()); // Allocate memory for the inserted MapValueRef, and initialize to // default value. switch (val_des->cpp_type()) { #define HANDLE_TYPE(CPPTYPE, TYPE) \ case google::protobuf::FieldDescriptor::CPPTYPE_##CPPTYPE: { \ TYPE * value = new TYPE(); \ map_val.SetValue(value); \ break; \ } HANDLE_TYPE(INT32, int32); HANDLE_TYPE(INT64, int64); HANDLE_TYPE(UINT32, uint32); HANDLE_TYPE(UINT64, uint64); HANDLE_TYPE(DOUBLE, double); HANDLE_TYPE(FLOAT, float); HANDLE_TYPE(BOOL, bool); HANDLE_TYPE(STRING, string); HANDLE_TYPE(ENUM, int32); #undef HANDLE_TYPE case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: { const Message& message = default_entry_->GetReflection()->GetMessage( *default_entry_, val_des); Message* value = message.New(); map_val.SetValue(value); break; } } val->CopyFrom(map_val); return true; } // map_key is already in the map. Make sure (*map)[map_key] is not called. // [] may reorder the map and iterators. val->CopyFrom(iter->second); return false; } bool DynamicMapField::DeleteMapValue(const MapKey& map_key) { MapFieldBase::SyncMapWithRepeatedField(); Map::iterator iter = map_.find(map_key); if (iter == map_.end()) { return false; } // Set map dirty only if the delete is successful. MapFieldBase::SetMapDirty(); iter->second.DeleteData(); map_.erase(iter); return true; } const Map& DynamicMapField::GetMap() const { MapFieldBase::SyncMapWithRepeatedField(); return map_; } Map* DynamicMapField::MutableMap() { MapFieldBase::SyncMapWithRepeatedField(); MapFieldBase::SetMapDirty(); return &map_; } void DynamicMapField::SetMapIteratorValue(MapIterator* map_iter) const { Map::const_iterator iter = TypeDefinedMapFieldBase::InternalGetIterator( map_iter); if (iter == map_.end()) return; map_iter->key_.CopyFrom(iter->first); map_iter->value_.CopyFrom(iter->second); } void DynamicMapField::SyncRepeatedFieldWithMapNoLock() const { const Reflection* reflection = default_entry_->GetReflection(); const FieldDescriptor* key_des = default_entry_->GetDescriptor()->FindFieldByName("key"); const FieldDescriptor* val_des = default_entry_->GetDescriptor()->FindFieldByName("value"); if (MapFieldBase::repeated_field_ == NULL) { if (MapFieldBase::arena_ == NULL) { MapFieldBase::repeated_field_ = new RepeatedPtrField(); } else { MapFieldBase::repeated_field_ = Arena::CreateMessage >( MapFieldBase::arena_); } } MapFieldBase::repeated_field_->Clear(); for (Map::const_iterator it = map_.begin(); it != map_.end(); ++it) { Message* new_entry = default_entry_->New(); MapFieldBase::repeated_field_->AddAllocated(new_entry); const MapKey& map_key = it->first; switch (key_des->cpp_type()) { case google::protobuf::FieldDescriptor::CPPTYPE_STRING: reflection->SetString(new_entry, key_des, map_key.GetStringValue()); break; case google::protobuf::FieldDescriptor::CPPTYPE_INT64: reflection->SetInt64(new_entry, key_des, map_key.GetInt64Value()); break; case google::protobuf::FieldDescriptor::CPPTYPE_INT32: reflection->SetInt32(new_entry, key_des, map_key.GetInt32Value()); break; case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: reflection->SetUInt64(new_entry, key_des, map_key.GetUInt64Value()); break; case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: reflection->SetUInt32(new_entry, key_des, map_key.GetUInt32Value()); break; case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: reflection->SetBool(new_entry, key_des, map_key.GetBoolValue()); break; case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: GOOGLE_LOG(FATAL) << "Can't get here."; break; } const MapValueRef& map_val = it->second; switch (val_des->cpp_type()) { case google::protobuf::FieldDescriptor::CPPTYPE_STRING: reflection->SetString(new_entry, val_des, map_val.GetStringValue()); break; case google::protobuf::FieldDescriptor::CPPTYPE_INT64: reflection->SetInt64(new_entry, val_des, map_val.GetInt64Value()); break; case google::protobuf::FieldDescriptor::CPPTYPE_INT32: reflection->SetInt32(new_entry, val_des, map_val.GetInt32Value()); break; case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: reflection->SetUInt64(new_entry, val_des, map_val.GetUInt64Value()); break; case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: reflection->SetUInt32(new_entry, val_des, map_val.GetUInt32Value()); break; case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: reflection->SetBool(new_entry, val_des, map_val.GetBoolValue()); break; case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: reflection->SetDouble(new_entry, val_des, map_val.GetDoubleValue()); break; case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: reflection->SetFloat(new_entry, val_des, map_val.GetFloatValue()); break; case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: reflection->SetEnumValue(new_entry, val_des, map_val.GetEnumValue()); break; case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: { const Message& message = map_val.GetMessageValue(); reflection->MutableMessage(new_entry, val_des)->CopyFrom(message); break; } } } } void DynamicMapField::SyncMapWithRepeatedFieldNoLock() const { Map* map = &const_cast(this)->map_; const Reflection* reflection = default_entry_->GetReflection(); const FieldDescriptor* key_des = default_entry_->GetDescriptor()->FindFieldByName("key"); const FieldDescriptor* val_des = default_entry_->GetDescriptor()->FindFieldByName("value"); // DynamicMapField owns map values. Need to delete them before clearing // the map. for (Map::iterator iter = map->begin(); iter != map->end(); ++iter) { iter->second.DeleteData(); } map->clear(); for (RepeatedPtrField::iterator it = MapFieldBase::repeated_field_->begin(); it != MapFieldBase::repeated_field_->end(); ++it) { MapKey map_key; switch (key_des->cpp_type()) { case google::protobuf::FieldDescriptor::CPPTYPE_STRING: map_key.SetStringValue(reflection->GetString(*it, key_des)); break; case google::protobuf::FieldDescriptor::CPPTYPE_INT64: map_key.SetInt64Value(reflection->GetInt64(*it, key_des)); break; case google::protobuf::FieldDescriptor::CPPTYPE_INT32: map_key.SetInt32Value(reflection->GetInt32(*it, key_des)); break; case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: map_key.SetUInt64Value(reflection->GetUInt64(*it, key_des)); break; case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: map_key.SetUInt32Value(reflection->GetUInt32(*it, key_des)); break; case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: map_key.SetBoolValue(reflection->GetBool(*it, key_des)); break; case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: GOOGLE_LOG(FATAL) << "Can't get here."; break; } // Remove existing map value with same key. Map::iterator iter = map->find(map_key); if (iter != map->end()) { iter->second.DeleteData(); } MapValueRef& map_val = (*map)[map_key]; map_val.SetType(val_des->cpp_type()); switch (val_des->cpp_type()) { #define HANDLE_TYPE(CPPTYPE, TYPE, METHOD) \ case google::protobuf::FieldDescriptor::CPPTYPE_##CPPTYPE: { \ TYPE * value = new TYPE; \ *value = reflection->Get##METHOD(*it, val_des); \ map_val.SetValue(value); \ break; \ } HANDLE_TYPE(INT32, int32, Int32); HANDLE_TYPE(INT64, int64, Int64); HANDLE_TYPE(UINT32, uint32, UInt32); HANDLE_TYPE(UINT64, uint64, UInt64); HANDLE_TYPE(DOUBLE, double, Double); HANDLE_TYPE(FLOAT, float, Float); HANDLE_TYPE(BOOL, bool, Bool); HANDLE_TYPE(STRING, string, String); HANDLE_TYPE(ENUM, int32, EnumValue); #undef HANDLE_TYPE case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: { const Message& message = reflection->GetMessage(*it, val_des); Message* value = message.New(); value->CopyFrom(message); map_val.SetValue(value); break; } } } } size_t DynamicMapField::SpaceUsedExcludingSelfNoLock() const { size_t size = 0; if (MapFieldBase::repeated_field_ != NULL) { size += MapFieldBase::repeated_field_->SpaceUsedExcludingSelfLong(); } size += sizeof(map_); size_t map_size = map_.size(); if (map_size) { Map::const_iterator it = map_.begin(); size += sizeof(it->first) * map_size; size += sizeof(it->second) * map_size; // If key is string, add the allocated space. if (it->first.type() == google::protobuf::FieldDescriptor::CPPTYPE_STRING) { size += sizeof(string) * map_size; } // Add the allocated space in MapValueRef. switch (it->second.type()) { #define HANDLE_TYPE(CPPTYPE, TYPE) \ case google::protobuf::FieldDescriptor::CPPTYPE_##CPPTYPE: { \ size += sizeof(TYPE) * map_size; \ break; \ } HANDLE_TYPE(INT32, int32); HANDLE_TYPE(INT64, int64); HANDLE_TYPE(UINT32, uint32); HANDLE_TYPE(UINT64, uint64); HANDLE_TYPE(DOUBLE, double); HANDLE_TYPE(FLOAT, float); HANDLE_TYPE(BOOL, bool); HANDLE_TYPE(STRING, string); HANDLE_TYPE(ENUM, int32); #undef HANDLE_TYPE case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: { while (it != map_.end()) { const Message& message = it->second.GetMessageValue(); size += message.GetReflection()->SpaceUsedLong(message); ++it; } break; } } } return size; } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_field.h000066400000000000000000000725111334102242000273700ustar00rootroot00000000000000// 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_MAP_FIELD_H__ #define GOOGLE_PROTOBUF_MAP_FIELD_H__ #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { class DynamicMessage; class MapKey; namespace internal { class ContendedMapCleanTest; class GeneratedMessageReflection; class MapFieldAccessor; // This class provides access to map field using reflection, which is the same // as those provided for RepeatedPtrField. It is used for internal // reflection implentation only. Users should never use this directly. class LIBPROTOBUF_EXPORT MapFieldBase { public: MapFieldBase() : arena_(NULL), repeated_field_(NULL), state_(STATE_MODIFIED_MAP) {} explicit MapFieldBase(Arena* arena) : arena_(arena), repeated_field_(NULL), state_(STATE_MODIFIED_MAP) { // Mutex's destructor needs to be called explicitly to release resources // acquired in its constructor. arena->OwnDestructor(&mutex_); } virtual ~MapFieldBase(); // Returns reference to internal repeated field. Data written using // google::protobuf::Map's api prior to calling this function is guarantted to be // included in repeated field. const RepeatedPtrFieldBase& GetRepeatedField() const; // Like above. Returns mutable pointer to the internal repeated field. RepeatedPtrFieldBase* MutableRepeatedField(); // Pure virtual map APIs for Map Reflection. virtual bool ContainsMapKey(const MapKey& map_key) const = 0; virtual bool InsertOrLookupMapValue( const MapKey& map_key, MapValueRef* val) = 0; // Insures operations after won't get executed before calling this. bool IsMapValid() const; virtual bool DeleteMapValue(const MapKey& map_key) = 0; virtual bool EqualIterator(const MapIterator& a, const MapIterator& b) const = 0; virtual void MapBegin(MapIterator* map_iter) const = 0; virtual void MapEnd(MapIterator* map_iter) const = 0; // Sync Map with repeated field and returns the size of map. virtual int size() const = 0; // Returns the number of bytes used by the repeated field, excluding // sizeof(*this) size_t SpaceUsedExcludingSelfLong() const; int SpaceUsedExcludingSelf() const { return internal::ToIntSize(SpaceUsedExcludingSelfLong()); } protected: // Gets the size of space used by map field. virtual size_t SpaceUsedExcludingSelfNoLock() const; // Synchronizes the content in Map to RepeatedPtrField if there is any change // to Map after last synchronization. void SyncRepeatedFieldWithMap() const; virtual void SyncRepeatedFieldWithMapNoLock() const; // Synchronizes the content in RepeatedPtrField to Map if there is any change // to RepeatedPtrField after last synchronization. void SyncMapWithRepeatedField() const; virtual void SyncMapWithRepeatedFieldNoLock() const {} // Tells MapFieldBase that there is new change to Map. void SetMapDirty(); // Tells MapFieldBase that there is new change to RepeatedPTrField. void SetRepeatedDirty(); // Provides derived class the access to repeated field. void* MutableRepeatedPtrField() const; enum State { STATE_MODIFIED_MAP = 0, // map has newly added data that has not been // synchronized to repeated field STATE_MODIFIED_REPEATED = 1, // repeated field has newly added data that // has not been synchronized to map CLEAN = 2, // data in map and repeated field are same }; Arena* arena_; mutable RepeatedPtrField* repeated_field_; mutable Mutex mutex_; // The thread to synchronize map and repeated field // needs to get lock first; mutable volatile Atomic32 state_; // 0: STATE_MODIFIED_MAP // 1: STATE_MODIFIED_REPEATED // 2: CLEAN private: friend class ContendedMapCleanTest; friend class GeneratedMessageReflection; friend class MapFieldAccessor; friend class ::google::protobuf::DynamicMessage; // Virtual helper methods for MapIterator. MapIterator doesn't have the // type helper for key and value. Call these help methods to deal with // different types. Real helper methods are implemented in // TypeDefinedMapFieldBase. friend class ::google::protobuf::MapIterator; // Allocate map<...>::iterator for MapIterator. virtual void InitializeIterator(MapIterator* map_iter) const = 0; // DeleteIterator() is called by the destructor of MapIterator only. // It deletes map<...>::iterator for MapIterator. virtual void DeleteIterator(MapIterator* map_iter) const = 0; // Copy the map<...>::iterator from other_iterator to // this_iterator. virtual void CopyIterator(MapIterator* this_iterator, const MapIterator& other_iterator) const = 0; // IncreaseIterator() is called by operator++() of MapIterator only. // It implements the ++ operator of MapIterator. virtual void IncreaseIterator(MapIterator* map_iter) const = 0; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapFieldBase); }; // This class provides common Map Reflection implementations for generated // message and dynamic message. template class TypeDefinedMapFieldBase : public MapFieldBase { public: TypeDefinedMapFieldBase() {} explicit TypeDefinedMapFieldBase(Arena* arena) : MapFieldBase(arena) {} ~TypeDefinedMapFieldBase() {} void MapBegin(MapIterator* map_iter) const; void MapEnd(MapIterator* map_iter) const; bool EqualIterator(const MapIterator& a, const MapIterator& b) const; virtual const Map& GetMap() const = 0; virtual Map* MutableMap() = 0; protected: typename Map::const_iterator& InternalGetIterator( const MapIterator* map_iter) const; private: void InitializeIterator(MapIterator* map_iter) const; void DeleteIterator(MapIterator* map_iter) const; void CopyIterator(MapIterator* this_iteratorm, const MapIterator& that_iterator) const; void IncreaseIterator(MapIterator* map_iter) const; 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 // internal generated message implentation only. Users should never use this // directly. template class MapField : public TypeDefinedMapFieldBase { // Provide utilities to parse/serialize key/value. Provide utilities to // manipulate internal stored type. typedef MapTypeHandler KeyTypeHandler; typedef MapTypeHandler ValueTypeHandler; // Define message type for internal repeated field. typedef Derived EntryType; typedef MapEntryLite EntryLiteType; // Define abbreviation for parent MapFieldLite typedef MapFieldLite MapFieldLiteType; // Enum needs to be handled differently from other types because it has // different exposed type in google::protobuf::Map's api and repeated field's api. For // details see the comment in the implementation of // SyncMapWithRepeatedFieldNoLock. static const bool kIsValueEnum = ValueTypeHandler::kIsEnum; typedef typename MapIf::type CastValueType; public: typedef typename Derived::SuperType EntryTypeTrait; typedef Map MapType; MapField() {} explicit MapField(Arena* arena) : TypeDefinedMapFieldBase(arena), impl_(arena) {} // Implement MapFieldBase bool ContainsMapKey(const MapKey& map_key) const; bool InsertOrLookupMapValue(const MapKey& map_key, MapValueRef* val); bool DeleteMapValue(const MapKey& map_key); const Map& GetMap() const { MapFieldBase::SyncMapWithRepeatedField(); return impl_.GetMap(); } Map* MutableMap() { MapFieldBase::SyncMapWithRepeatedField(); Map* result = impl_.MutableMap(); MapFieldBase::SetMapDirty(); return result; } // Convenient methods for generated message implementation. int size() const; void Clear(); void MergeFrom(const MapField& other); void Swap(MapField* other); // Used in the implementation of parsing. Caller should take the ownership iff // arena_ is NULL. EntryType* NewEntry() const { return impl_.NewEntry(); } // Used in the implementation of serializing enum value type. Caller should // take the ownership iff arena_ is NULL. EntryType* NewEnumEntryWrapper(const Key& key, const T t) const { return impl_.NewEnumEntryWrapper(key, t); } // Used in the implementation of serializing other value types. Caller should // take the ownership iff arena_ is NULL. EntryType* NewEntryWrapper(const Key& key, const T& t) const { return impl_.NewEntryWrapper(key, t); } private: MapFieldLiteType impl_; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; // Implements MapFieldBase void SyncRepeatedFieldWithMapNoLock() const; void SyncMapWithRepeatedFieldNoLock() const; size_t SpaceUsedExcludingSelfNoLock() const; void SetMapIteratorValue(MapIterator* map_iter) const; friend class ::google::protobuf::Arena; friend class MapFieldStateTest; // For testing, it needs raw access to impl_ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapField); }; template struct MapEntryToMapField > { typedef MapField MapFieldType; }; class LIBPROTOBUF_EXPORT DynamicMapField: public TypeDefinedMapFieldBase { public: explicit DynamicMapField(const Message* default_entry); DynamicMapField(const Message* default_entry, Arena* arena); ~DynamicMapField(); // Implement MapFieldBase bool ContainsMapKey(const MapKey& map_key) const; bool InsertOrLookupMapValue(const MapKey& map_key, MapValueRef* val); bool DeleteMapValue(const MapKey& map_key); const Map& GetMap() const; Map* MutableMap(); int size() const; private: Map map_; const Message* default_entry_; // Implements MapFieldBase void SyncRepeatedFieldWithMapNoLock() const; void SyncMapWithRepeatedFieldNoLock() const; size_t SpaceUsedExcludingSelfNoLock() const; void SetMapIteratorValue(MapIterator* map_iter) const; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMapField); }; } // namespace internal #define TYPE_CHECK(EXPECTEDTYPE, METHOD) \ if (type() != EXPECTEDTYPE) { \ GOOGLE_LOG(FATAL) \ << "Protocol Buffer map usage error:\n" \ << METHOD << " type does not match\n" \ << " Expected : " \ << FieldDescriptor::CppTypeName(EXPECTEDTYPE) << "\n" \ << " Actual : " \ << FieldDescriptor::CppTypeName(type()); \ } // MapKey is an union type for representing any possible // map key. class LIBPROTOBUF_EXPORT MapKey { public: MapKey() : type_(0) { } MapKey(const MapKey& other) : type_(0) { CopyFrom(other); } MapKey& operator=(const MapKey& other) { CopyFrom(other); return *this; } ~MapKey() { if (type_ == FieldDescriptor::CPPTYPE_STRING) { delete val_.string_value_; } } FieldDescriptor::CppType type() const { if (type_ == 0) { GOOGLE_LOG(FATAL) << "Protocol Buffer map usage error:\n" << "MapKey::type MapKey is not initialized. " << "Call set methods to initialize MapKey."; } return (FieldDescriptor::CppType)type_; } void SetInt64Value(int64 value) { SetType(FieldDescriptor::CPPTYPE_INT64); val_.int64_value_ = value; } void SetUInt64Value(uint64 value) { SetType(FieldDescriptor::CPPTYPE_UINT64); val_.uint64_value_ = value; } void SetInt32Value(int32 value) { SetType(FieldDescriptor::CPPTYPE_INT32); val_.int32_value_ = value; } void SetUInt32Value(uint32 value) { SetType(FieldDescriptor::CPPTYPE_UINT32); val_.uint32_value_ = value; } void SetBoolValue(bool value) { SetType(FieldDescriptor::CPPTYPE_BOOL); val_.bool_value_ = value; } void SetStringValue(const string& val) { SetType(FieldDescriptor::CPPTYPE_STRING); *val_.string_value_ = val; } int64 GetInt64Value() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64, "MapKey::GetInt64Value"); return val_.int64_value_; } uint64 GetUInt64Value() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64, "MapKey::GetUInt64Value"); return val_.uint64_value_; } int32 GetInt32Value() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32, "MapKey::GetInt32Value"); return val_.int32_value_; } uint32 GetUInt32Value() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32, "MapKey::GetUInt32Value"); return val_.uint32_value_; } bool GetBoolValue() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL, "MapKey::GetBoolValue"); return val_.bool_value_; } const string& GetStringValue() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING, "MapKey::GetStringValue"); return *val_.string_value_; } bool operator<(const MapKey& other) const { if (type_ != other.type_) { // We could define a total order that handles this case, but // there currently no need. So, for now, fail. GOOGLE_LOG(FATAL) << "Unsupported: type mismatch"; } switch (type()) { case FieldDescriptor::CPPTYPE_DOUBLE: case FieldDescriptor::CPPTYPE_FLOAT: case FieldDescriptor::CPPTYPE_ENUM: case FieldDescriptor::CPPTYPE_MESSAGE: GOOGLE_LOG(FATAL) << "Unsupported"; return false; case FieldDescriptor::CPPTYPE_STRING: return *val_.string_value_ < *other.val_.string_value_; case FieldDescriptor::CPPTYPE_INT64: return val_.int64_value_ < other.val_.int64_value_; case FieldDescriptor::CPPTYPE_INT32: return val_.int32_value_ < other.val_.int32_value_; case FieldDescriptor::CPPTYPE_UINT64: return val_.uint64_value_ < other.val_.uint64_value_; case FieldDescriptor::CPPTYPE_UINT32: return val_.uint32_value_ < other.val_.uint32_value_; case FieldDescriptor::CPPTYPE_BOOL: return val_.bool_value_ < other.val_.bool_value_; } return false; } bool operator==(const MapKey& other) const { if (type_ != other.type_) { // To be consistent with operator<, we don't allow this either. GOOGLE_LOG(FATAL) << "Unsupported: type mismatch"; } switch (type()) { case FieldDescriptor::CPPTYPE_DOUBLE: case FieldDescriptor::CPPTYPE_FLOAT: case FieldDescriptor::CPPTYPE_ENUM: case FieldDescriptor::CPPTYPE_MESSAGE: GOOGLE_LOG(FATAL) << "Unsupported"; break; case FieldDescriptor::CPPTYPE_STRING: return *val_.string_value_ == *other.val_.string_value_; case FieldDescriptor::CPPTYPE_INT64: return val_.int64_value_ == other.val_.int64_value_; case FieldDescriptor::CPPTYPE_INT32: return val_.int32_value_ == other.val_.int32_value_; case FieldDescriptor::CPPTYPE_UINT64: return val_.uint64_value_ == other.val_.uint64_value_; case FieldDescriptor::CPPTYPE_UINT32: return val_.uint32_value_ == other.val_.uint32_value_; case FieldDescriptor::CPPTYPE_BOOL: return val_.bool_value_ == other.val_.bool_value_; } GOOGLE_LOG(FATAL) << "Can't get here."; return false; } void CopyFrom(const MapKey& other) { SetType(other.type()); switch (type_) { case FieldDescriptor::CPPTYPE_DOUBLE: case FieldDescriptor::CPPTYPE_FLOAT: case FieldDescriptor::CPPTYPE_ENUM: case FieldDescriptor::CPPTYPE_MESSAGE: GOOGLE_LOG(FATAL) << "Unsupported"; break; case FieldDescriptor::CPPTYPE_STRING: *val_.string_value_ = *other.val_.string_value_; break; case FieldDescriptor::CPPTYPE_INT64: val_.int64_value_ = other.val_.int64_value_; break; case FieldDescriptor::CPPTYPE_INT32: val_.int32_value_ = other.val_.int32_value_; break; case FieldDescriptor::CPPTYPE_UINT64: val_.uint64_value_ = other.val_.uint64_value_; break; case FieldDescriptor::CPPTYPE_UINT32: val_.uint32_value_ = other.val_.uint32_value_; break; case FieldDescriptor::CPPTYPE_BOOL: val_.bool_value_ = other.val_.bool_value_; break; } } private: template friend class internal::TypeDefinedMapFieldBase; friend class MapIterator; friend class internal::DynamicMapField; union KeyValue { KeyValue() {} string* string_value_; int64 int64_value_; int32 int32_value_; uint64 uint64_value_; uint32 uint32_value_; bool bool_value_; } val_; void SetType(FieldDescriptor::CppType type) { if (type_ == type) return; if (type_ == FieldDescriptor::CPPTYPE_STRING) { delete val_.string_value_; } type_ = type; if (type_ == FieldDescriptor::CPPTYPE_STRING) { val_.string_value_ = new string; } } // type_ is 0 or a valid FieldDescriptor::CppType. int type_; }; // MapValueRef points to a map value. class LIBPROTOBUF_EXPORT MapValueRef { public: MapValueRef() : data_(NULL), type_(0) {} void SetInt64Value(int64 value) { TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64, "MapValueRef::SetInt64Value"); *reinterpret_cast(data_) = value; } void SetUInt64Value(uint64 value) { TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64, "MapValueRef::SetUInt64Value"); *reinterpret_cast(data_) = value; } void SetInt32Value(int32 value) { TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32, "MapValueRef::SetInt32Value"); *reinterpret_cast(data_) = value; } void SetUInt32Value(uint32 value) { TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32, "MapValueRef::SetUInt32Value"); *reinterpret_cast(data_) = value; } void SetBoolValue(bool value) { TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL, "MapValueRef::SetBoolValue"); *reinterpret_cast(data_) = value; } // TODO(jieluo) - Checks that enum is member. void SetEnumValue(int value) { TYPE_CHECK(FieldDescriptor::CPPTYPE_ENUM, "MapValueRef::SetEnumValue"); *reinterpret_cast(data_) = value; } void SetStringValue(const string& value) { TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING, "MapValueRef::SetStringValue"); *reinterpret_cast(data_) = value; } void SetFloatValue(float value) { TYPE_CHECK(FieldDescriptor::CPPTYPE_FLOAT, "MapValueRef::SetFloatValue"); *reinterpret_cast(data_) = value; } void SetDoubleValue(double value) { TYPE_CHECK(FieldDescriptor::CPPTYPE_DOUBLE, "MapValueRef::SetDoubleValue"); *reinterpret_cast(data_) = value; } int64 GetInt64Value() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64, "MapValueRef::GetInt64Value"); return *reinterpret_cast(data_); } uint64 GetUInt64Value() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64, "MapValueRef::GetUInt64Value"); return *reinterpret_cast(data_); } int32 GetInt32Value() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32, "MapValueRef::GetInt32Value"); return *reinterpret_cast(data_); } uint32 GetUInt32Value() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32, "MapValueRef::GetUInt32Value"); return *reinterpret_cast(data_); } bool GetBoolValue() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL, "MapValueRef::GetBoolValue"); return *reinterpret_cast(data_); } int GetEnumValue() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_ENUM, "MapValueRef::GetEnumValue"); return *reinterpret_cast(data_); } const string& GetStringValue() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING, "MapValueRef::GetStringValue"); return *reinterpret_cast(data_); } float GetFloatValue() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_FLOAT, "MapValueRef::GetFloatValue"); return *reinterpret_cast(data_); } double GetDoubleValue() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_DOUBLE, "MapValueRef::GetDoubleValue"); return *reinterpret_cast(data_); } const Message& GetMessageValue() const { TYPE_CHECK(FieldDescriptor::CPPTYPE_MESSAGE, "MapValueRef::GetMessageValue"); return *reinterpret_cast(data_); } Message* MutableMessageValue() { TYPE_CHECK(FieldDescriptor::CPPTYPE_MESSAGE, "MapValueRef::MutableMessageValue"); return reinterpret_cast(data_); } private: template friend class internal::MapField; template friend class internal::TypeDefinedMapFieldBase; friend class MapIterator; friend class internal::GeneratedMessageReflection; friend class internal::DynamicMapField; void SetType(FieldDescriptor::CppType type) { type_ = type; } FieldDescriptor::CppType type() const { if (type_ == 0 || data_ == NULL) { GOOGLE_LOG(FATAL) << "Protocol Buffer map usage error:\n" << "MapValueRef::type MapValueRef is not initialized."; } return (FieldDescriptor::CppType)type_; } void SetValue(const void* val) { data_ = const_cast(val); } void CopyFrom(const MapValueRef& other) { type_ = other.type_; data_ = other.data_; } // Only used in DynamicMapField void DeleteData() { switch (type_) { #define HANDLE_TYPE(CPPTYPE, TYPE) \ case google::protobuf::FieldDescriptor::CPPTYPE_##CPPTYPE: { \ delete reinterpret_cast(data_); \ break; \ } HANDLE_TYPE(INT32, int32); HANDLE_TYPE(INT64, int64); HANDLE_TYPE(UINT32, uint32); HANDLE_TYPE(UINT64, uint64); HANDLE_TYPE(DOUBLE, double); HANDLE_TYPE(FLOAT, float); HANDLE_TYPE(BOOL, bool); HANDLE_TYPE(STRING, string); HANDLE_TYPE(ENUM, int32); HANDLE_TYPE(MESSAGE, Message); #undef HANDLE_TYPE } } // data_ point to a map value. MapValueRef does not // own this value. void* data_; // type_ is 0 or a valid FieldDescriptor::CppType. int type_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapValueRef); }; #undef TYPE_CHECK class LIBPROTOBUF_EXPORT MapIterator { public: MapIterator(Message* message, const FieldDescriptor* field) { const Reflection* reflection = message->GetReflection(); map_ = reflection->MapData(message, field); key_.SetType(field->message_type()->FindFieldByName("key")->cpp_type()); value_.SetType(field->message_type()->FindFieldByName("value")->cpp_type()); map_->InitializeIterator(this); } MapIterator(const MapIterator& other) { map_ = other.map_; map_->InitializeIterator(this); map_->CopyIterator(this, other); } ~MapIterator() { map_->DeleteIterator(this); } MapIterator& operator=(const MapIterator& other) { map_ = other.map_; map_->CopyIterator(this, other); return *this; } friend bool operator==(const MapIterator& a, const MapIterator& b) { return a.map_->EqualIterator(a, b); } friend bool operator!=(const MapIterator& a, const MapIterator& b) { return !a.map_->EqualIterator(a, b); } MapIterator& operator++() { map_->IncreaseIterator(this); return *this; } MapIterator operator++(int) { // iter_ is copied from Map<...>::iterator, no need to // copy from its self again. Use the same implementation // with operator++() map_->IncreaseIterator(this); return *this; } const MapKey& GetKey() { return key_; } const MapValueRef& GetValueRef() { return value_; } MapValueRef* MutableValueRef() { map_->SetMapDirty(); return &value_; } private: template friend class internal::TypeDefinedMapFieldBase; friend class internal::DynamicMapField; template friend class internal::MapField; // reinterpret_cast from heap-allocated Map<...>::iterator*. MapIterator owns // the iterator. It is allocated by MapField<...>::InitializeIterator() called // in constructor and deleted by MapField<...>::DeleteIterator() called in // destructor. void* iter_; // Point to a MapField to call helper methods implemented in MapField. // MapIterator does not own this object. internal::MapFieldBase* map_; MapKey key_; MapValueRef value_; }; } // namespace protobuf } // namespace google GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_START template<> struct hash { size_t operator()(const google::protobuf::MapKey& map_key) const { switch (map_key.type()) { case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: GOOGLE_LOG(FATAL) << "Unsupported"; break; case google::protobuf::FieldDescriptor::CPPTYPE_STRING: return hash()(map_key.GetStringValue()); case google::protobuf::FieldDescriptor::CPPTYPE_INT64: return hash< ::google::protobuf::int64>()(map_key.GetInt64Value()); case google::protobuf::FieldDescriptor::CPPTYPE_INT32: return hash< ::google::protobuf::int32>()(map_key.GetInt32Value()); case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: return hash< ::google::protobuf::uint64>()(map_key.GetUInt64Value()); case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: return hash< ::google::protobuf::uint32>()(map_key.GetUInt32Value()); case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: return hash()(map_key.GetBoolValue()); } GOOGLE_LOG(FATAL) << "Can't get here."; return 0; } bool operator()(const google::protobuf::MapKey& map_key1, const google::protobuf::MapKey& map_key2) const { return map_key1 < map_key2; } }; GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_END #endif // GOOGLE_PROTOBUF_MAP_FIELD_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_field_inl.h000066400000000000000000000325741334102242000302370ustar00rootroot00000000000000// 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_MAP_FIELD_INL_H__ #define GOOGLE_PROTOBUF_MAP_FIELD_INL_H__ #include #ifndef _SHARED_PTR_H #include #endif #include #include #include namespace google { namespace protobuf { namespace internal { // UnwrapMapKey template template T UnwrapMapKey(const MapKey& map_key); template<> inline int32 UnwrapMapKey(const MapKey& map_key) { return map_key.GetInt32Value(); } template<> inline uint32 UnwrapMapKey(const MapKey& map_key) { return map_key.GetUInt32Value(); } template<> inline int64 UnwrapMapKey(const MapKey& map_key) { return map_key.GetInt64Value(); } template<> inline uint64 UnwrapMapKey(const MapKey& map_key) { return map_key.GetUInt64Value(); } template<> inline bool UnwrapMapKey(const MapKey& map_key) { return map_key.GetBoolValue(); } template<> inline string UnwrapMapKey(const MapKey& map_key) { return map_key.GetStringValue(); } // SetMapKey template template inline void SetMapKey(MapKey* map_key, const T& value); template<> inline void SetMapKey(MapKey* map_key, const int32& value) { map_key->SetInt32Value(value); } template<> inline void SetMapKey(MapKey* map_key, const uint32& value) { map_key->SetUInt32Value(value); } template<> inline void SetMapKey(MapKey* map_key, const int64& value) { map_key->SetInt64Value(value); } template<> inline void SetMapKey(MapKey* map_key, const uint64& value) { map_key->SetUInt64Value(value); } template<> inline void SetMapKey(MapKey* map_key, const bool& value) { map_key->SetBoolValue(value); } template<> inline void SetMapKey(MapKey* map_key, const string& value) { map_key->SetStringValue(value); } // ------------------------TypeDefinedMapFieldBase--------------- template typename Map::const_iterator& TypeDefinedMapFieldBase::InternalGetIterator( const MapIterator* map_iter) const { return *reinterpret_cast::const_iterator *>( map_iter->iter_); } template void TypeDefinedMapFieldBase::MapBegin(MapIterator* map_iter) const { InternalGetIterator(map_iter) = GetMap().begin(); SetMapIteratorValue(map_iter); } template void TypeDefinedMapFieldBase::MapEnd(MapIterator* map_iter) const { InternalGetIterator(map_iter) = GetMap().end(); } template bool TypeDefinedMapFieldBase::EqualIterator(const MapIterator& a, const MapIterator& b) const { return InternalGetIterator(&a) == InternalGetIterator(&b); } template void TypeDefinedMapFieldBase::IncreaseIterator(MapIterator* map_iter) const { ++InternalGetIterator(map_iter); SetMapIteratorValue(map_iter); } template void TypeDefinedMapFieldBase::InitializeIterator( MapIterator* map_iter) const { map_iter->iter_ = new typename Map::const_iterator; GOOGLE_CHECK(map_iter->iter_ != NULL); } template void TypeDefinedMapFieldBase::DeleteIterator(MapIterator* map_iter) const { delete reinterpret_cast::const_iterator *>( map_iter->iter_); } template void TypeDefinedMapFieldBase::CopyIterator( MapIterator* this_iter, const MapIterator& that_iter) const { InternalGetIterator(this_iter) = InternalGetIterator(&that_iter); this_iter->key_.SetType(that_iter.key_.type()); // MapValueRef::type() fails when containing data is null. However, if // this_iter points to MapEnd, data can be null. this_iter->value_.SetType( static_cast(that_iter.value_.type_)); SetMapIteratorValue(this_iter); } // ---------------------------------------------------------------------- template int MapField::size() const { MapFieldBase::SyncMapWithRepeatedField(); return static_cast(impl_.GetMap().size()); } template void MapField::Clear() { MapFieldBase::SyncMapWithRepeatedField(); impl_.MutableMap()->clear(); MapFieldBase::SetMapDirty(); } template void MapField::SetMapIteratorValue(MapIterator* map_iter) const { const Map& map = impl_.GetMap(); typename Map::const_iterator iter = TypeDefinedMapFieldBase::InternalGetIterator(map_iter); if (iter == map.end()) return; SetMapKey(&map_iter->key_, iter->first); map_iter->value_.SetValue(&iter->second); } template bool MapField::ContainsMapKey(const MapKey& map_key) const { const Map& map = impl_.GetMap(); const Key& key = UnwrapMapKey(map_key); typename Map::const_iterator iter = map.find(key); return iter != map.end(); } template bool MapField::InsertOrLookupMapValue(const MapKey& map_key, MapValueRef* val) { // Always use mutable map because users may change the map value by // MapValueRef. Map* map = MutableMap(); const Key& key = UnwrapMapKey(map_key); typename Map::iterator iter = map->find(key); if (map->end() == iter) { val->SetValue(&((*map)[key])); return true; } // Key is already in the map. Make sure (*map)[key] is not called. // [] may reorder the map and iterators. val->SetValue(&(iter->second)); return false; } template bool MapField::DeleteMapValue(const MapKey& map_key) { const Key& key = UnwrapMapKey(map_key); return MutableMap()->erase(key); } template void MapField::MergeFrom(const MapField& other) { MapFieldBase::SyncMapWithRepeatedField(); other.SyncMapWithRepeatedField(); impl_.MergeFrom(other.impl_); MapFieldBase::SetMapDirty(); } template void MapField::Swap(MapField* other) { std::swap(this->MapFieldBase::repeated_field_, other->repeated_field_); impl_.Swap(&other->impl_); std::swap(this->MapFieldBase::state_, other->state_); } template void MapField::SyncRepeatedFieldWithMapNoLock() const { if (this->MapFieldBase::repeated_field_ == NULL) { if (this->MapFieldBase::arena_ == NULL) { this->MapFieldBase::repeated_field_ = new RepeatedPtrField(); } else { this->MapFieldBase::repeated_field_ = Arena::CreateMessage >( this->MapFieldBase::arena_); } } const Map& map = impl_.GetMap(); RepeatedPtrField* repeated_field = reinterpret_cast*>( this->MapFieldBase::repeated_field_); repeated_field->Clear(); // The only way we can get at this point is through reflection and the // only way we can get the reflection object is by having called GetReflection // on the encompassing field. So that type must have existed and hence we // know that this MapEntry default_type has also already been constructed. // So it's safe to just call internal_default_instance(). const Message* default_entry = Derived::internal_default_instance(); for (typename Map::const_iterator it = map.begin(); it != map.end(); ++it) { EntryType* new_entry = down_cast(default_entry->New(this->MapFieldBase::arena_)); repeated_field->AddAllocated(new_entry); (*new_entry->mutable_key()) = it->first; (*new_entry->mutable_value()) = it->second; } } template void MapField::SyncMapWithRepeatedFieldNoLock() const { Map* map = const_cast(this)->impl_.MutableMap(); RepeatedPtrField* repeated_field = reinterpret_cast*>( this->MapFieldBase::repeated_field_); GOOGLE_CHECK(this->MapFieldBase::repeated_field_ != NULL); map->clear(); for (typename RepeatedPtrField::iterator it = repeated_field->begin(); it != repeated_field->end(); ++it) { // Cast is needed because Map's api and internal storage is different when // value is enum. For enum, we cannot cast an int to enum. Thus, we have to // copy value. For other types, they have same exposed api type and internal // stored type. We should not introduce value copy for them. We achieve this // by casting to value for enum while casting to reference for other types. (*map)[it->key()] = static_cast(it->value()); } } template size_t MapField::SpaceUsedExcludingSelfNoLock() const { size_t size = 0; if (this->MapFieldBase::repeated_field_ != NULL) { size += this->MapFieldBase::repeated_field_->SpaceUsedExcludingSelfLong(); } Map* map = const_cast(this)->impl_.MutableMap(); size += sizeof(*map); for (typename Map::iterator it = map->begin(); it != map->end(); ++it) { size += KeyTypeHandler::SpaceUsedInMapLong(it->first); size += ValueTypeHandler::SpaceUsedInMapLong(it->second); } return size; } } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_MAP_FIELD_INL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_field_lite.h000066400000000000000000000127461334102242000304110ustar00rootroot00000000000000// 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_MAP_FIELD_LITE_H__ #define GOOGLE_PROTOBUF_MAP_FIELD_LITE_H__ #include #include #include namespace google { namespace protobuf { namespace internal { // This class provides access to map field using generated api. It is used for // internal generated message implentation only. Users should never use this // directly. template class MapFieldLite { // Define message type for internal repeated field. typedef Derived EntryType; public: typedef Map MapType; typedef EntryType EntryTypeTrait; MapFieldLite() : arena_(NULL) { SetDefaultEnumValue(); } explicit MapFieldLite(Arena* arena) : arena_(arena), map_(arena) { SetDefaultEnumValue(); } // Accessors const Map& GetMap() const { return map_; } Map* MutableMap() { return &map_; } // Convenient methods for generated message implementation. int size() const { return static_cast(map_.size()); } void Clear() { return map_.clear(); } void MergeFrom(const MapFieldLite& other) { for (typename Map::const_iterator it = other.map_.begin(); it != other.map_.end(); ++it) { map_[it->first] = it->second; } } void Swap(MapFieldLite* other) { map_.swap(other->map_); } // Set default enum value only for proto2 map field whose value is enum type. void SetDefaultEnumValue() { MutableMap()->SetDefaultEnumValue(default_enum_value); } // Used in the implementation of parsing. Caller should take the ownership iff // arena_ is NULL. EntryType* NewEntry() const { if (arena_ == NULL) { return new EntryType(); } else { return Arena::CreateMessage(arena_); } } // Used in the implementation of serializing enum value type. Caller should // take the ownership iff arena_ is NULL. EntryType* NewEnumEntryWrapper(const Key& key, const T t) const { return EntryType::EnumWrap(key, t, arena_); } // Used in the implementation of serializing other value types. Caller should // take the ownership iff arena_ is NULL. EntryType* NewEntryWrapper(const Key& key, const T& t) const { return EntryType::Wrap(key, t, arena_); } private: typedef void DestructorSkippable_; Arena* arena_; Map map_; friend class ::google::protobuf::Arena; }; // True if IsInitialized() is true for value field in all elements of t. T is // expected to be message. It's useful to have this helper here to keep the // protobuf compiler from ever having to emit loops in IsInitialized() methods. // We want the C++ compiler to inline this or not as it sees fit. template bool AllAreInitialized(const Map& t) { for (typename Map::const_iterator it = t.begin(); it != t.end(); ++it) { if (!it->second.IsInitialized()) return false; } return true; } template struct MapEntryToMapField : MapEntryToMapField {}; template struct MapEntryToMapField > { typedef MapFieldLite, Key, Value, kKeyFieldType, kValueFieldType, default_enum_value> MapFieldType; }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_MAP_FIELD_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_field_test.cc000066400000000000000000000344261334102242000305700ustar00rootroot00000000000000// 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 #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { using unittest::TestAllTypes; class MapFieldBaseStub : public MapFieldBase { public: typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; MapFieldBaseStub() {} explicit MapFieldBaseStub(Arena* arena) : MapFieldBase(arena) {} void SyncRepeatedFieldWithMap() const { MapFieldBase::SyncRepeatedFieldWithMap(); } void SyncMapWithRepeatedField() const { MapFieldBase::SyncMapWithRepeatedField(); } // Get underlined repeated field without synchronizing map. RepeatedPtrField* InternalRepeatedField() { return repeated_field_; } bool IsMapClean() { return state_ != 0; } bool IsRepeatedClean() { return state_ != 1; } void SetMapDirty() { state_ = 0; } void SetRepeatedDirty() { state_ = 1; } bool ContainsMapKey(const MapKey& map_key) const { return false; } bool InsertOrLookupMapValue(const MapKey& map_key, MapValueRef* val) { return false; } bool DeleteMapValue(const MapKey& map_key) { return false; } bool EqualIterator(const MapIterator& a, const MapIterator& b) const { return false; } int size() const { return 0; } void MapBegin(MapIterator* map_iter) const {} void MapEnd(MapIterator* map_iter) const {} void InitializeIterator(MapIterator* map_iter) const {} void DeleteIterator(MapIterator* map_iter) const {} void CopyIterator(MapIterator* this_iterator, const MapIterator& other_iterator) const {} void IncreaseIterator(MapIterator* map_iter) const {} void SetDefaultMessageEntry(const Message* message) const {} const Message* GetDefaultMessageEntry() const { return NULL; } }; class MapFieldBasePrimitiveTest : public ::testing::Test { protected: typedef unittest::TestMap_MapInt32Int32Entry_DoNotUse EntryType; typedef MapField MapFieldType; MapFieldBasePrimitiveTest() { // Get descriptors map_descriptor_ = unittest::TestMap::descriptor() ->FindFieldByName("map_int32_int32") ->message_type(); key_descriptor_ = map_descriptor_->FindFieldByName("key"); value_descriptor_ = map_descriptor_->FindFieldByName("value"); // Build map field map_field_.reset(new MapFieldType); map_field_base_ = map_field_.get(); map_ = map_field_->MutableMap(); initial_value_map_[0] = 100; initial_value_map_[1] = 101; map_->insert(initial_value_map_.begin(), initial_value_map_.end()); EXPECT_EQ(2, map_->size()); } google::protobuf::scoped_ptr map_field_; MapFieldBase* map_field_base_; Map* map_; const Descriptor* map_descriptor_; const FieldDescriptor* key_descriptor_; const FieldDescriptor* value_descriptor_; std::map initial_value_map_; // copy of initial values inserted }; TEST_F(MapFieldBasePrimitiveTest, SpaceUsedExcludingSelf) { EXPECT_LT(0, map_field_base_->SpaceUsedExcludingSelf()); } TEST_F(MapFieldBasePrimitiveTest, GetRepeatedField) { const RepeatedPtrField& repeated = reinterpret_cast&>( map_field_base_->GetRepeatedField()); EXPECT_EQ(2, repeated.size()); for (int i = 0; i < repeated.size(); i++) { const Message& message = repeated.Get(i); int key = message.GetReflection()->GetInt32(message, key_descriptor_); int value = message.GetReflection()->GetInt32(message, value_descriptor_); EXPECT_EQ(value, initial_value_map_[key]); } } TEST_F(MapFieldBasePrimitiveTest, MutableRepeatedField) { RepeatedPtrField* repeated = reinterpret_cast*>( map_field_base_->MutableRepeatedField()); EXPECT_EQ(2, repeated->size()); for (int i = 0; i < repeated->size(); i++) { const Message& message = repeated->Get(i); int key = message.GetReflection()->GetInt32(message, key_descriptor_); int value = message.GetReflection()->GetInt32(message, value_descriptor_); EXPECT_EQ(value, initial_value_map_[key]); } } TEST_F(MapFieldBasePrimitiveTest, Arena) { // Allocate a large initial block to avoid mallocs during hooked test. std::vector arena_block(128 * 1024); ArenaOptions options; options.initial_block = &arena_block[0]; options.initial_block_size = arena_block.size(); Arena arena(options); { // TODO(liujisi): Re-write the test to ensure the memory for the map and // repeated fields are allocated from arenas. // NoHeapChecker no_heap; MapFieldType* map_field = Arena::CreateMessage(&arena); // Set content in map (*map_field->MutableMap())[100] = 101; // Trigger conversion to repeated field. map_field->GetRepeatedField(); } { // TODO(liujisi): Re-write the test to ensure the memory for the map and // repeated fields are allocated from arenas. // NoHeapChecker no_heap; MapFieldBaseStub* map_field = Arena::CreateMessage(&arena); // Trigger conversion to repeated field. EXPECT_TRUE(map_field->MutableRepeatedField() != NULL); } } namespace { enum State { CLEAN, MAP_DIRTY, REPEATED_DIRTY }; } // anonymous namespace class MapFieldStateTest : public testing::TestWithParam { public: protected: typedef unittest::TestMap_MapInt32Int32Entry_DoNotUse EntryType; typedef MapField MapFieldType; MapFieldStateTest() : state_(GetParam()) { // Build map field map_field_.reset(new MapFieldType()); map_field_base_ = map_field_.get(); Expect(map_field_.get(), MAP_DIRTY, 0, 0, true); switch (state_) { case CLEAN: AddOneStillClean(map_field_.get()); break; case MAP_DIRTY: MakeMapDirty(map_field_.get()); break; case REPEATED_DIRTY: MakeRepeatedDirty(map_field_.get()); break; default: break; } } void AddOneStillClean(MapFieldType* map_field) { MapFieldBase* map_field_base = map_field; Map* map = map_field->MutableMap(); (*map)[0] = 0; map_field_base->GetRepeatedField(); Expect(map_field, CLEAN, 1, 1, false); } void MakeMapDirty(MapFieldType* map_field) { Map* map = map_field->MutableMap(); (*map)[0] = 0; Expect(map_field, MAP_DIRTY, 1, 0, true); } void MakeRepeatedDirty(MapFieldType* map_field) { MakeMapDirty(map_field); MapFieldBase* map_field_base = map_field; map_field_base->MutableRepeatedField(); // We use MutableMap on impl_ because we don't want to disturb the syncing Map* map = map_field->impl_.MutableMap(); map->clear(); Expect(map_field, REPEATED_DIRTY, 0, 1, false); } void Expect(MapFieldType* map_field, State state, int map_size, int repeated_size, bool is_repeated_null) { MapFieldBase* map_field_base = map_field; MapFieldBaseStub* stub = reinterpret_cast(map_field_base); // We use MutableMap on impl_ because we don't want to disturb the syncing Map* map = map_field->impl_.MutableMap(); RepeatedPtrField* repeated_field = stub->InternalRepeatedField(); switch (state) { case MAP_DIRTY: EXPECT_FALSE(stub->IsMapClean()); EXPECT_TRUE(stub->IsRepeatedClean()); break; case REPEATED_DIRTY: EXPECT_TRUE(stub->IsMapClean()); EXPECT_FALSE(stub->IsRepeatedClean()); break; case CLEAN: EXPECT_TRUE(stub->IsMapClean()); EXPECT_TRUE(stub->IsRepeatedClean()); break; default: FAIL(); } EXPECT_EQ(map_size, map->size()); if (is_repeated_null) { EXPECT_TRUE(repeated_field == NULL); } else { EXPECT_EQ(repeated_size, repeated_field->size()); } } google::protobuf::scoped_ptr map_field_; MapFieldBase* map_field_base_; State state_; }; INSTANTIATE_TEST_CASE_P(MapFieldStateTestInstance, MapFieldStateTest, ::testing::Values(CLEAN, MAP_DIRTY, REPEATED_DIRTY)); TEST_P(MapFieldStateTest, GetMap) { map_field_->GetMap(); if (state_ != MAP_DIRTY) { Expect(map_field_.get(), CLEAN, 1, 1, false); } else { Expect(map_field_.get(), MAP_DIRTY, 1, 0, true); } } TEST_P(MapFieldStateTest, MutableMap) { map_field_->MutableMap(); if (state_ != MAP_DIRTY) { Expect(map_field_.get(), MAP_DIRTY, 1, 1, false); } else { Expect(map_field_.get(), MAP_DIRTY, 1, 0, true); } } TEST_P(MapFieldStateTest, MergeFromClean) { MapFieldType other; AddOneStillClean(&other); map_field_->MergeFrom(other); if (state_ != MAP_DIRTY) { Expect(map_field_.get(), MAP_DIRTY, 1, 1, false); } else { Expect(map_field_.get(), MAP_DIRTY, 1, 0, true); } Expect(&other, CLEAN, 1, 1, false); } TEST_P(MapFieldStateTest, MergeFromMapDirty) { MapFieldType other; MakeMapDirty(&other); map_field_->MergeFrom(other); if (state_ != MAP_DIRTY) { Expect(map_field_.get(), MAP_DIRTY, 1, 1, false); } else { Expect(map_field_.get(), MAP_DIRTY, 1, 0, true); } Expect(&other, MAP_DIRTY, 1, 0, true); } TEST_P(MapFieldStateTest, MergeFromRepeatedDirty) { MapFieldType other; MakeRepeatedDirty(&other); map_field_->MergeFrom(other); if (state_ != MAP_DIRTY) { Expect(map_field_.get(), MAP_DIRTY, 1, 1, false); } else { Expect(map_field_.get(), MAP_DIRTY, 1, 0, true); } Expect(&other, CLEAN, 1, 1, false); } TEST_P(MapFieldStateTest, SwapClean) { MapFieldType other; AddOneStillClean(&other); map_field_->Swap(&other); Expect(map_field_.get(), CLEAN, 1, 1, false); switch (state_) { case CLEAN: Expect(&other, CLEAN, 1, 1, false); break; case MAP_DIRTY: Expect(&other, MAP_DIRTY, 1, 0, true); break; case REPEATED_DIRTY: Expect(&other, REPEATED_DIRTY, 0, 1, false); break; default: break; } } TEST_P(MapFieldStateTest, SwapMapDirty) { MapFieldType other; MakeMapDirty(&other); map_field_->Swap(&other); Expect(map_field_.get(), MAP_DIRTY, 1, 0, true); switch (state_) { case CLEAN: Expect(&other, CLEAN, 1, 1, false); break; case MAP_DIRTY: Expect(&other, MAP_DIRTY, 1, 0, true); break; case REPEATED_DIRTY: Expect(&other, REPEATED_DIRTY, 0, 1, false); break; default: break; } } TEST_P(MapFieldStateTest, SwapRepeatedDirty) { MapFieldType other; MakeRepeatedDirty(&other); map_field_->Swap(&other); Expect(map_field_.get(), REPEATED_DIRTY, 0, 1, false); switch (state_) { case CLEAN: Expect(&other, CLEAN, 1, 1, false); break; case MAP_DIRTY: Expect(&other, MAP_DIRTY, 1, 0, true); break; case REPEATED_DIRTY: Expect(&other, REPEATED_DIRTY, 0, 1, false); break; default: break; } } TEST_P(MapFieldStateTest, Clear) { map_field_->Clear(); if (state_ != MAP_DIRTY) { Expect(map_field_.get(), MAP_DIRTY, 0, 1, false); } else { Expect(map_field_.get(), MAP_DIRTY, 0, 0, true); } } TEST_P(MapFieldStateTest, SpaceUsedExcludingSelf) { map_field_base_->SpaceUsedExcludingSelf(); switch (state_) { case CLEAN: Expect(map_field_.get(), CLEAN, 1, 1, false); break; case MAP_DIRTY: Expect(map_field_.get(), MAP_DIRTY, 1, 0, true); break; case REPEATED_DIRTY: Expect(map_field_.get(), REPEATED_DIRTY, 0, 1, false); break; default: break; } } TEST_P(MapFieldStateTest, GetMapField) { map_field_base_->GetRepeatedField(); if (state_ != REPEATED_DIRTY) { Expect(map_field_.get(), CLEAN, 1, 1, false); } else { Expect(map_field_.get(), REPEATED_DIRTY, 0, 1, false); } } TEST_P(MapFieldStateTest, MutableMapField) { map_field_base_->MutableRepeatedField(); if (state_ != REPEATED_DIRTY) { Expect(map_field_.get(), REPEATED_DIRTY, 1, 1, false); } else { Expect(map_field_.get(), REPEATED_DIRTY, 0, 1, false); } } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_lite_test_util.cc000066400000000000000000000100071334102242000314640ustar00rootroot00000000000000// 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 #include #include namespace google { namespace protobuf { void MapLiteTestUtil::SetMapFields(unittest::TestMapLite* message) { MapTestUtilImpl::SetMapFields(message); } void MapLiteTestUtil::SetArenaMapFields(unittest::TestArenaMapLite* message) { MapTestUtilImpl::SetArenaMapFields(message); } void MapLiteTestUtil::SetMapFieldsInitialized(unittest::TestMapLite* message) { MapTestUtilImpl::SetMapFieldsInitialized(message); } void MapLiteTestUtil::ModifyMapFields(unittest::TestMapLite* message) { MapTestUtilImpl::ModifyMapFields(message); } void MapLiteTestUtil::ExpectClear(const unittest::TestMapLite& message) { MapTestUtilImpl::ExpectClear(message); } void MapLiteTestUtil::ExpectMapFieldsSet(const unittest::TestMapLite& message) { MapTestUtilImpl::ExpectMapFieldsSet(message); } void MapLiteTestUtil::ExpectArenaMapFieldsSet( const unittest::TestArenaMapLite& message) { MapTestUtilImpl::ExpectArenaMapFieldsSet( message); } void MapLiteTestUtil::ExpectMapFieldsSetInitialized( const unittest::TestMapLite& message) { MapTestUtilImpl::ExpectMapFieldsSetInitialized( message); } void MapLiteTestUtil::ExpectMapFieldsModified( const unittest::TestMapLite& message) { MapTestUtilImpl::ExpectMapFieldsModified( message); } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_lite_test_util.h000066400000000000000000000066731334102242000313440ustar00rootroot00000000000000// 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_MAP_LITE_TEST_UTIL_H__ #define GOOGLE_PROTOBUF_MAP_LITE_TEST_UTIL_H__ #include namespace google { namespace protobuf { class MapLiteTestUtil { public: // Set every field in the TestMapLite message to a unique value. static void SetMapFields(protobuf_unittest::TestMapLite* message); // Set every field in the TestArenaMapLite message to a unique value. static void SetArenaMapFields(protobuf_unittest::TestArenaMapLite* message); // Set every field in the message to a default value. static void SetMapFieldsInitialized(protobuf_unittest::TestMapLite* message); // Modify all the map fields of the message (which should already have been // initialized with SetMapFields()). static void ModifyMapFields(protobuf_unittest::TestMapLite* message); // Check that all fields have the values that they should have after // SetMapFields() is called. static void ExpectMapFieldsSet(const protobuf_unittest::TestMapLite& message); // Check that all fields have the values that they should have after // SetMapFields() is called for TestArenaMapLite. static void ExpectArenaMapFieldsSet( const protobuf_unittest::TestArenaMapLite& message); // Check that all fields have the values that they should have after // SetMapFieldsInitialized() is called. static void ExpectMapFieldsSetInitialized( const protobuf_unittest::TestMapLite& message); // Expect that the message is modified as would be expected from // ModifyMapFields(). static void ExpectMapFieldsModified( const protobuf_unittest::TestMapLite& message); // Check that all fields are empty. static void ExpectClear(const protobuf_unittest::TestMapLite& message); }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_MAP_LITE_TEST_UTIL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_lite_unittest.proto000066400000000000000000000116331334102242000321130ustar00rootroot00000000000000// 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"; option cc_enable_arenas = true; option optimize_for = LITE_RUNTIME; import "google/protobuf/unittest_lite.proto"; import "google/protobuf/unittest_no_arena_lite.proto"; package protobuf_unittest; message TestMapLite { map map_int32_int32 = 1; map map_int64_int64 = 2; map map_uint32_uint32 = 3; map map_uint64_uint64 = 4; map map_sint32_sint32 = 5; map map_sint64_sint64 = 6; map map_fixed32_fixed32 = 7; map map_fixed64_fixed64 = 8; map map_sfixed32_sfixed32 = 9; map map_sfixed64_sfixed64 = 10; map map_int32_float = 11; map map_int32_double = 12; map map_bool_bool = 13; map map_string_string = 14; map map_int32_bytes = 15; map map_int32_enum = 16; map map_int32_foreign_message = 17; map teboring = 18; } message TestArenaMapLite { map map_int32_int32 = 1; map map_int64_int64 = 2; map map_uint32_uint32 = 3; map map_uint64_uint64 = 4; map map_sint32_sint32 = 5; map map_sint64_sint64 = 6; map map_fixed32_fixed32 = 7; map map_fixed64_fixed64 = 8; map map_sfixed32_sfixed32 = 9; map map_sfixed64_sfixed64 = 10; map map_int32_float = 11; map map_int32_double = 12; map map_bool_bool = 13; map map_string_string = 14; map map_int32_bytes = 15; map map_int32_enum = 16; map map_int32_foreign_message = 17; map map_int32_foreign_message_no_arena = 18; } // Test embedded message with required fields message TestRequiredMessageMapLite { map map_field = 1; } message TestEnumMapLite { map known_map_field = 101; map unknown_map_field = 102; } message TestEnumMapPlusExtraLite { map known_map_field = 101; map unknown_map_field = 102; } message TestMessageMapLite { map map_int32_message = 1; } enum Proto2MapEnumLite { PROTO2_MAP_ENUM_FOO_LITE = 0; PROTO2_MAP_ENUM_BAR_LITE = 1; PROTO2_MAP_ENUM_BAZ_LITE = 2; } enum Proto2MapEnumPlusExtraLite { E_PROTO2_MAP_ENUM_FOO_LITE = 0; E_PROTO2_MAP_ENUM_BAR_LITE = 1; E_PROTO2_MAP_ENUM_BAZ_LITE = 2; E_PROTO2_MAP_ENUM_EXTRA_LITE = 3; } enum MapEnumLite { MAP_ENUM_FOO_LITE = 0; MAP_ENUM_BAR_LITE = 1; MAP_ENUM_BAZ_LITE = 2; } message TestRequiredLite { required int32 a = 1; required int32 b = 2; required int32 c = 3; } message ForeignMessageArenaLite { optional int32 c = 1; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_proto2_unittest.proto000066400000000000000000000065511334102242000324060ustar00rootroot00000000000000// 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"; option cc_enable_arenas = true; import "google/protobuf/unittest_import.proto"; // We don't put this in a package within proto2 because we need to make sure // that the generated code doesn't depend on being in the proto2 namespace. // In map_test_util.h we do "using namespace unittest = protobuf_unittest". package protobuf_unittest; 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 known_map_field = 101; map unknown_map_field = 102; } message TestEnumMapPlusExtra { map known_map_field = 101; map unknown_map_field = 102; } message TestImportEnumMap { map import_enum_amp = 1; } message TestIntIntMap { map m = 1; } // Test all key types: string, plus the non-floating-point scalars. message TestMaps { map m_int32 = 1; map m_int64 = 2; map m_uint32 = 3; map m_uint64 = 4; map m_sint32 = 5; map m_sint64 = 6; map m_fixed32 = 7; map m_fixed64 = 8; map m_sfixed32 = 9; map m_sfixed64 = 10; map m_bool = 11; map m_string = 12; } // Test maps in submessages. message TestSubmessageMaps { optional TestMaps m = 1; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_test.cc000066400000000000000000003522661334102242000274320ustar00rootroot00000000000000// 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 hack to include windows.h first, which ensures the GetMessage macro can // be undefined when we include #if defined(_WIN32) #define _WINSOCKAPI_ // to avoid re-definition in WinSock2.h #define NOMINMAX // to avoid defining min/max macros #include #endif // _WIN32 #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { using google::protobuf::unittest::ForeignMessage; using google::protobuf::unittest::TestAllTypes; using google::protobuf::unittest::TestMap; using google::protobuf::unittest::TestRecursiveMapMessage; namespace protobuf { namespace internal { void MapTestForceDeterministic() { ::google::protobuf::io::CodedOutputStream::SetDefaultSerializationDeterministic(); } // Map API Test ===================================================== class MapImplTest : public ::testing::Test { protected: MapImplTest() : map_ptr_(new Map()), map_(*map_ptr_), const_map_(*map_ptr_) { EXPECT_TRUE(map_.empty()); EXPECT_EQ(0, map_.size()); } void ExpectSingleElement(int32 key, int32 value) { EXPECT_FALSE(map_.empty()); EXPECT_EQ(1, map_.size()); ExpectElement(key, value); } void ExpectElements(const std::map& map) { EXPECT_FALSE(map_.empty()); EXPECT_EQ(map.size(), map_.size()); for (std::map::const_iterator it = map.begin(); it != map.end(); ++it) { ExpectElement(it->first, it->second); } } void ExpectElement(int32 key, int32 value) { // Test map size is correct. EXPECT_EQ(value, map_[key]); EXPECT_EQ(1, map_.count(key)); // Check mutable at and find work correctly. EXPECT_EQ(value, map_.at(key)); Map::iterator it = map_.find(key); // iterator dereferenceable EXPECT_EQ(key, (*it).first); EXPECT_EQ(value, (*it).second); EXPECT_EQ(key, it->first); EXPECT_EQ(value, it->second); // iterator mutable ((*it).second) = value + 1; EXPECT_EQ(value + 1, map_[key]); ((*it).second) = value; EXPECT_EQ(value, map_[key]); it->second = value + 1; EXPECT_EQ(value + 1, map_[key]); it->second = value; EXPECT_EQ(value, map_[key]); // copy constructor Map::iterator it_copy = it; EXPECT_EQ(key, it_copy->first); EXPECT_EQ(value, it_copy->second); // Immutable API ================================================ // Check immutable at and find work correctly. EXPECT_EQ(value, const_map_.at(key)); Map::const_iterator const_it = const_map_.find(key); // iterator dereferenceable EXPECT_EQ(key, (*const_it).first); EXPECT_EQ(value, (*const_it).second); EXPECT_EQ(key, const_it->first); EXPECT_EQ(value, const_it->second); // copy constructor Map::const_iterator const_it_copy = const_it; EXPECT_EQ(key, const_it_copy->first); EXPECT_EQ(value, const_it_copy->second); } google::protobuf::scoped_ptr > map_ptr_; Map& map_; const Map& const_map_; }; TEST_F(MapImplTest, OperatorBracket) { int32 key = 0; int32 value1 = 100; int32 value2 = 101; EXPECT_EQ(0, map_[key]); map_[key] = value1; ExpectSingleElement(key, value1); map_[key] = value2; ExpectSingleElement(key, value2); } TEST_F(MapImplTest, OperatorBracketNonExist) { int32 key = 0; int32 default_value = 0; EXPECT_EQ(default_value, map_[key]); ExpectSingleElement(key, default_value); } TEST_F(MapImplTest, MutableAt) { int32 key = 0; int32 value1 = 100; int32 value2 = 101; map_[key] = value1; ExpectSingleElement(key, value1); map_.at(key) = value2; ExpectSingleElement(key, value2); } #ifdef PROTOBUF_HAS_DEATH_TEST TEST_F(MapImplTest, MutableAtNonExistDeathTest) { EXPECT_DEATH(map_.at(0), ""); } TEST_F(MapImplTest, ImmutableAtNonExistDeathTest) { EXPECT_DEATH(const_map_.at(0), ""); } TEST_F(MapImplTest, UsageErrors) { MapKey key; key.SetInt64Value(1); EXPECT_DEATH(key.GetUInt64Value(), "Protocol Buffer map usage error:\n" "MapKey::GetUInt64Value type does not match\n" " Expected : uint64\n" " Actual : int64"); MapValueRef value; EXPECT_DEATH(value.SetFloatValue(0.1), "Protocol Buffer map usage error:\n" "MapValueRef::type MapValueRef is not initialized."); } #endif // PROTOBUF_HAS_DEATH_TEST TEST_F(MapImplTest, MapKeyAssignment) { MapKey from, to; from.SetStringValue("abc"); to = from; EXPECT_EQ("abc", to.GetStringValue()); } TEST_F(MapImplTest, CountNonExist) { EXPECT_EQ(0, map_.count(0)); } TEST_F(MapImplTest, MutableFindNonExist) { EXPECT_TRUE(map_.end() == map_.find(0)); } TEST_F(MapImplTest, ImmutableFindNonExist) { EXPECT_TRUE(const_map_.end() == const_map_.find(0)); } TEST_F(MapImplTest, ConstEnd) { EXPECT_TRUE(const_map_.end() == const_map_.cend()); } TEST_F(MapImplTest, GetReferenceFromIterator) { for (int i = 0; i < 10; i++) { map_[i] = i; } for (Map::const_iterator it = map_.cbegin(); it != map_.cend();) { Map::const_reference entry = *it++; EXPECT_EQ(entry.first, entry.second); } for (Map::const_iterator it = const_map_.begin(); it != const_map_.end();) { Map::const_reference entry = *it++; EXPECT_EQ(entry.first, entry.second); } for (Map::iterator it = map_.begin(); it != map_.end();) { Map::reference entry = *it++; EXPECT_EQ(entry.first + 1, ++entry.second); } } TEST_F(MapImplTest, IteratorBasic) { map_[0] = 0; // Default constructible (per forward iterator requirements). Map::const_iterator cit; Map::iterator it; it = map_.begin(); cit = it; // Converts to const_iterator // Can compare between them. EXPECT_TRUE(it == cit); EXPECT_FALSE(cit != it); // Pre increment. EXPECT_FALSE(it == ++cit); // Post increment. EXPECT_FALSE(it++ == cit); EXPECT_TRUE(it == cit); } template static int64 median(Iterator i0, Iterator i1) { std::vector v(i0, i1); std::nth_element(v.begin(), v.begin() + v.size() / 2, v.end()); return v[v.size() / 2]; } static int64 Now() { return google::protobuf::util::TimeUtil::TimestampToNanoseconds( google::protobuf::util::TimeUtil::GetCurrentTime()); } // Arbitrary odd integers for creating test data. static int k0 = 812398771; static int k1 = 1312938717; static int k2 = 1321555333; // A naive begin() implementation will cause begin() to get slower and slower // if one erases elements at the "front" of the hash map, and we'd like to // avoid that, as std::unordered_map does. TEST_F(MapImplTest, BeginIsFast) { if (true) return; // TODO(gpike): make this less flaky and re-enable it. Map map; const int kTestSize = 250000; // Create a random-looking map of size n. Use non-negative integer keys. uint32 frog = 123983; int last_key = 0; int counter = 0; while (map.size() < kTestSize) { frog *= static_cast(k0); frog ^= frog >> 17; frog += counter++; last_key = static_cast(frog) >= 0 ? static_cast(frog) : last_key ^ 1; GOOGLE_DCHECK_GE(last_key, 0); map[last_key] = last_key ^ 1; } std::vector times; // We're going to do map.erase(map.begin()) over and over again. But, // just in case one iteration is fast compared to the granularity of // our time keeping, we measure kChunkSize iterations per outer-loop iter. const int kChunkSize = 1000; GOOGLE_CHECK_EQ(kTestSize % kChunkSize, 0); do { const int64 start = Now(); for (int i = 0; i < kChunkSize; i++) { map.erase(map.begin()); } const int64 end = Now(); if (end > start) { times.push_back(end - start); } } while (!map.empty()); if (times.size() < .99 * kTestSize / kChunkSize) { GOOGLE_LOG(WARNING) << "Now() isn't helping us measure time"; return; } int64 x0 = median(times.begin(), times.begin() + 9); int64 x1 = median(times.begin() + times.size() - 9, times.end()); GOOGLE_LOG(INFO) << "x0=" << x0 << ", x1=" << x1; // x1 will greatly exceed x0 if the code we just executed took O(n^2) time. // And we'll probably time out and never get here. So, this test is // intentionally loose: we check that x0 and x1 are within a factor of 8. EXPECT_GE(x1, x0 / 8); EXPECT_GE(x0, x1 / 8); } // Try to create kTestSize keys that will land in just a few buckets, and // time the insertions, to get a rough estimate of whether an O(n^2) worst case // was triggered. This test is a hacky, but probably better than nothing. TEST_F(MapImplTest, HashFlood) { const int kTestSize = 1024; // must be a power of 2 std::set s; for (int i = 0; s.size() < kTestSize; i++) { if ((map_.hash_function()(i) & (kTestSize - 1)) < 3) { s.insert(i); } } // Create hash table with kTestSize entries that hash flood a table with // 1024 (or 512 or 2048 or ...) entries. This assumes that map_ uses powers // of 2 for table sizes, and that it's sufficient to "flood" with respect to // the low bits of the output of map_.hash_function(). std::vector times; std::set::iterator it = s.begin(); int count = 0; do { const int64 start = Now(); map_[*it] = 0; const int64 end = Now(); if (end > start) { times.push_back(end - start); } ++count; ++it; } while (it != s.end()); if (times.size() < .99 * count) return; int64 x0 = median(times.begin(), times.begin() + 9); int64 x1 = median(times.begin() + times.size() - 9, times.end()); // x1 will greatly exceed x0 if the code we just executed took O(n^2) time. // But we want to allow O(n log n). A factor of 20 should be generous enough. EXPECT_LE(x1, x0 * 20); } TEST_F(MapImplTest, CopyIteratorStressTest) { std::vector::iterator> v; const int kIters = 1e5; for (uint32 i = 0; i < kIters; i++) { int32 key = (3 + i * (5 + i * (-8 + i * (62 + i)))) & 0x77777777; map_[key] = i; v.push_back(map_.find(key)); } for (std::vector::iterator>::const_iterator it = v.begin(); it != v.end(); it++) { Map::iterator i = *it; ASSERT_EQ(i->first, (*it)->first); ASSERT_EQ(i->second, (*it)->second); } } template static void TestValidityForAllKeysExcept(int key_to_avoid, const T& check_map, const U& map) { typedef typename U::value_type value_type; // a key-value pair for (typename U::const_iterator it = map.begin(); it != map.end(); ++it) { const int key = it->first; if (key == key_to_avoid) continue; // All iterators relevant to this key, whether old (from check_map) or new, // must point to the same memory. So, test pointer equality here. const value_type* check_val = &*check_map.find(key)->second; EXPECT_EQ(check_val, &*it); EXPECT_EQ(check_val, &*map.find(key)); } } // EXPECT i0 and i1 to be the same. Advancing them should have the same effect, // too. template static void TestEqualIterators(Iter i0, Iter i1, Iter end) { const int kMaxAdvance = 10; for (int i = 0; i < kMaxAdvance; i++) { EXPECT_EQ(i0 == end, i1 == end); if (i0 == end) return; EXPECT_EQ(&*i0, &*i1) << "iter " << i; ++i0; ++i1; } } template static void TestOldVersusNewIterator(int skip, Map* m) { const int initial_size = m->size(); IteratorType it = m->begin(); for (int i = 0; i < skip && it != m->end(); it++, i++) {} if (it == m->end()) return; const IteratorType old = it; GOOGLE_LOG(INFO) << "skip=" << skip << ", old->first=" << old->first; const int target_size = initial_size < 100 ? initial_size * 5 : initial_size * 5 / 4; for (int i = 0; m->size() <= target_size; i++) { (*m)[i] = 0; } // Iterator 'old' should still work just fine despite the growth of *m. const IteratorType after_growth = m->find(old->first); TestEqualIterators(old, after_growth, m->end()); // Now shrink the number of elements. Do this with a mix of erases and // inserts to increase the chance that the hashtable will resize to a lower // number of buckets. (But, in any case, the test is still useful.) for (int i = 0; i < 2 * (target_size - initial_size); i++) { if (i != old->first) { m->erase(i); } if (((i ^ m->begin()->first) & 15) == 0) { (*m)[i * 342] = i; } } // Now, the table has grown and shrunk; test again. TestEqualIterators(old, m->find(old->first), m->end()); TestEqualIterators(old, after_growth, m->end()); } // Create and test an n-element Map, with emphasis on iterator correctness. static void StressTestIterators(int n) { GOOGLE_LOG(INFO) << "StressTestIterators " << n; GOOGLE_CHECK_GT(n, 0); // Create a random-looking map of size n. Use non-negative integer keys. Map m; uint32 frog = 123987 + n; int last_key = 0; int counter = 0; while (m.size() < n) { frog *= static_cast(k0); frog ^= frog >> 17; frog += counter++; last_key = static_cast(frog) >= 0 ? static_cast(frog) : last_key ^ 1; GOOGLE_DCHECK_GE(last_key, 0); m[last_key] = last_key ^ 1; } // Test it. ASSERT_EQ(n, m.size()); // Create maps of pointers and iterators. // These should remain valid even if we modify m. hash_map::value_type*> mp(n); hash_map::iterator> mi(n); for (Map::iterator it = m.begin(); it != m.end(); ++it) { mp[it->first] = &*it; mi[it->first] = it; } ASSERT_EQ(m.size(), mi.size()); ASSERT_EQ(m.size(), mp.size()); m.erase(last_key); ASSERT_EQ(n - 1, m.size()); TestValidityForAllKeysExcept(last_key, mp, m); TestValidityForAllKeysExcept(last_key, mi, m); m[last_key] = 0; ASSERT_EQ(n, m.size()); // Test old iterator vs new iterator, with table modification in between. TestOldVersusNewIterator::const_iterator>(n % 3, &m); TestOldVersusNewIterator::iterator>(n % (1 + (n / 40)), &m); // Finally, ensure erase(iterator) doesn't reorder anything, because that is // what its documentation says. m[last_key] = m[last_key ^ 999] = 0; std::vector::iterator> v; v.reserve(m.size()); int position_of_last_key = 0; for (Map::iterator it = m.begin(); it != m.end(); ++it) { if (it->first == last_key) { position_of_last_key = v.size(); } v.push_back(it); } ASSERT_EQ(m.size(), v.size()); const Map::iterator erase_result = m.erase(m.find(last_key)); int index = 0; for (Map::iterator it = m.begin(); it != m.end(); ++it, ++index) { if (index == position_of_last_key) { EXPECT_EQ(&*erase_result, &*v[++index]); } ASSERT_EQ(&*it, &*v[index]); } } TEST_F(MapImplTest, IteratorInvalidation) { // Create a set of pseudo-random sizes to test. #ifndef NDEBUG const int kMaxSizeToTest = 100 * 1000; #else const int kMaxSizeToTest = 1000 * 1000; #endif std::set s; int n = kMaxSizeToTest; unsigned int frog = k1 + n; while (n > 1 && s.size() < 25) { s.insert(n); n = static_cast(n * 100 / (101.0 + (frog & 63))); frog *= k2; frog ^= frog >> 17; } // Ensure we test a few small sizes. s.insert(1); s.insert(2); s.insert(3); // Now, the real work. for (std::set::iterator i = s.begin(); i != s.end(); ++i) { StressTestIterators(*i); } } // Test that erase() revalidates iterators. TEST_F(MapImplTest, EraseRevalidates) { map_[3] = map_[13] = map_[20] = 0; const int initial_size = map_.size(); EXPECT_EQ(3, initial_size); std::vector::iterator> v; for (Map::iterator it = map_.begin(); it != map_.end(); ++it) { v.push_back(it); } EXPECT_EQ(initial_size, v.size()); for (int i = 0; map_.size() <= initial_size * 20; i++) { map_[i] = 0; } const int larger_size = map_.size(); // We've greatly increased the size of the map, so it is highly likely that // the following will corrupt m if erase() doesn't properly revalidate // iterators passed to it. Finishing this routine without crashing indicates // success. for (int i = 0; i < v.size(); i++) { map_.erase(v[i]); } EXPECT_EQ(larger_size - v.size(), map_.size()); } template bool IsConstHelper(T& /*t*/) { // NOLINT. We want to catch non-const refs here. return false; } template bool IsConstHelper(const T& /*t*/) { return true; } TEST_F(MapImplTest, IteratorConstness) { map_[0] = 0; EXPECT_TRUE(IsConstHelper(*map_.cbegin())); EXPECT_TRUE(IsConstHelper(*const_map_.begin())); EXPECT_FALSE(IsConstHelper(*map_.begin())); } bool IsForwardIteratorHelper(std::forward_iterator_tag /*tag*/) { return true; } template bool IsForwardIteratorHelper(T /*t*/) { return false; } TEST_F(MapImplTest, IteratorCategory) { EXPECT_TRUE(IsForwardIteratorHelper( std::iterator_traits::iterator>::iterator_category())); EXPECT_TRUE(IsForwardIteratorHelper(std::iterator_traits< Map::const_iterator>::iterator_category())); } TEST_F(MapImplTest, InsertSingle) { int32 key = 0; int32 value1 = 100; int32 value2 = 101; // Insert a non-existed key. std::pair::iterator, bool> result1 = map_.insert(Map::value_type(key, value1)); ExpectSingleElement(key, value1); Map::iterator it1 = result1.first; EXPECT_EQ(key, it1->first); EXPECT_EQ(value1, it1->second); EXPECT_TRUE(result1.second); // Insert an existed key. std::pair::iterator, bool> result2 = map_.insert(Map::value_type(key, value2)); ExpectSingleElement(key, value1); Map::iterator it2 = result2.first; EXPECT_TRUE(it1 == it2); EXPECT_FALSE(result2.second); } TEST_F(MapImplTest, InsertByIterator) { int32 key1 = 0; int32 key2 = 1; int32 value1a = 100; int32 value1b = 101; int32 value2a = 200; int32 value2b = 201; std::map map1; map1[key1] = value1a; map1[key2] = value2a; map_.insert(map1.begin(), map1.end()); ExpectElements(map1); std::map map2; map2[key1] = value1b; map2[key2] = value2b; map_.insert(map2.begin(), map2.end()); ExpectElements(map1); } TEST_F(MapImplTest, EraseSingleByKey) { int32 key = 0; int32 value = 100; map_[key] = value; ExpectSingleElement(key, value); // Erase an existing key. EXPECT_EQ(1, map_.erase(key)); EXPECT_TRUE(map_.empty()); EXPECT_EQ(0, map_.size()); EXPECT_TRUE(map_.end() == map_.find(key)); EXPECT_TRUE(map_.begin() == map_.end()); // Erase a non-existing key. EXPECT_EQ(0, map_.erase(key)); } TEST_F(MapImplTest, EraseMutipleByKey) { // erase in one specific order to trigger corner cases for (int i = 0; i < 5; i++) { map_[i] = i; } map_.erase(0); EXPECT_EQ(4, map_.size()); EXPECT_TRUE(map_.end() == map_.find(0)); map_.erase(1); EXPECT_EQ(3, map_.size()); EXPECT_TRUE(map_.end() == map_.find(1)); map_.erase(3); EXPECT_EQ(2, map_.size()); EXPECT_TRUE(map_.end() == map_.find(3)); map_.erase(4); EXPECT_EQ(1, map_.size()); EXPECT_TRUE(map_.end() == map_.find(4)); map_.erase(2); EXPECT_EQ(0, map_.size()); EXPECT_TRUE(map_.end() == map_.find(2)); } TEST_F(MapImplTest, EraseSingleByIterator) { int32 key = 0; int32 value = 100; map_[key] = value; ExpectSingleElement(key, value); Map::iterator it = map_.find(key); map_.erase(it); EXPECT_TRUE(map_.empty()); EXPECT_EQ(0, map_.size()); EXPECT_TRUE(map_.end() == map_.find(key)); EXPECT_TRUE(map_.begin() == map_.end()); } TEST_F(MapImplTest, ValidIteratorAfterErase) { for (int i = 0; i < 10; i++) { map_[i] = i; } int count = 0; for (Map::iterator it = map_.begin(); it != map_.end();) { count++; if (it->first % 2 == 1) { map_.erase(it++); } else { ++it; } } EXPECT_EQ(10, count); EXPECT_EQ(5, map_.size()); } TEST_F(MapImplTest, EraseByIterator) { int32 key1 = 0; int32 key2 = 1; int32 value1 = 100; int32 value2 = 101; std::map map; map[key1] = value1; map[key2] = value2; map_.insert(map.begin(), map.end()); ExpectElements(map); map_.erase(map_.begin(), map_.end()); EXPECT_TRUE(map_.empty()); EXPECT_EQ(0, map_.size()); EXPECT_TRUE(map_.end() == map_.find(key1)); EXPECT_TRUE(map_.end() == map_.find(key2)); EXPECT_TRUE(map_.begin() == map_.end()); } TEST_F(MapImplTest, Clear) { int32 key = 0; int32 value = 100; map_[key] = value; ExpectSingleElement(key, value); map_.clear(); EXPECT_TRUE(map_.empty()); EXPECT_EQ(0, map_.size()); EXPECT_TRUE(map_.end() == map_.find(key)); EXPECT_TRUE(map_.begin() == map_.end()); } static void CopyConstructorHelper(Arena* arena, Map* m) { int32 key1 = 0; int32 key2 = 1; int32 value1 = 100; int32 value2 = 101; std::map map; map[key1] = value1; map[key2] = value2; m->insert(map.begin(), map.end()); Map other(*m); EXPECT_EQ(2, other.size()); EXPECT_EQ(value1, other.at(key1)); EXPECT_EQ(value2, other.at(key2)); } TEST_F(MapImplTest, CopyConstructorWithArena) { Arena a; CopyConstructorHelper(&a, &map_); } TEST_F(MapImplTest, CopyConstructorWithoutArena) { CopyConstructorHelper(NULL, &map_); } TEST_F(MapImplTest, IterConstructor) { int32 key1 = 0; int32 key2 = 1; int32 value1 = 100; int32 value2 = 101; std::map map; map[key1] = value1; map[key2] = value2; Map new_map(map.begin(), map.end()); EXPECT_EQ(2, new_map.size()); EXPECT_EQ(value1, new_map.at(key1)); EXPECT_EQ(value2, new_map.at(key2)); } TEST_F(MapImplTest, Assigner) { int32 key1 = 0; int32 key2 = 1; int32 value1 = 100; int32 value2 = 101; std::map map; map[key1] = value1; map[key2] = value2; map_.insert(map.begin(), map.end()); Map other; int32 key_other = 123; int32 value_other = 321; other[key_other] = value_other; EXPECT_EQ(1, other.size()); other = map_; EXPECT_EQ(2, other.size()); EXPECT_EQ(value1, other.at(key1)); EXPECT_EQ(value2, other.at(key2)); EXPECT_TRUE(other.find(key_other) == other.end()); // Self assign other = other; EXPECT_EQ(2, other.size()); EXPECT_EQ(value1, other.at(key1)); EXPECT_EQ(value2, other.at(key2)); } TEST_F(MapImplTest, Rehash) { const int test_size = 50; std::map reference_map; for (int i = 0; i < test_size; i++) { reference_map[i] = i; } for (int i = 0; i < test_size; i++) { map_[i] = reference_map[i]; EXPECT_EQ(reference_map[i], map_[i]); } for (int i = 0; i < test_size; i++) { map_.erase(i); EXPECT_TRUE(map_.end() == map_.find(i)); } EXPECT_TRUE(map_.empty()); } TEST_F(MapImplTest, EqualRange) { int key = 100, key_missing = 101; map_[key] = 100; std::pair::iterator, google::protobuf::Map::iterator> range = map_.equal_range(key); EXPECT_TRUE(map_.find(key) == range.first); EXPECT_TRUE(++map_.find(key) == range.second); range = map_.equal_range(key_missing); EXPECT_TRUE(map_.end() == range.first); EXPECT_TRUE(map_.end() == range.second); std::pair::const_iterator, google::protobuf::Map::const_iterator> const_range = const_map_.equal_range(key); EXPECT_TRUE(const_map_.find(key) == const_range.first); EXPECT_TRUE(++const_map_.find(key) == const_range.second); const_range = const_map_.equal_range(key_missing); EXPECT_TRUE(const_map_.end() == const_range.first); EXPECT_TRUE(const_map_.end() == const_range.second); } TEST_F(MapImplTest, ConvertToStdMap) { map_[100] = 101; std::map std_map(map_.begin(), map_.end()); EXPECT_EQ(1, std_map.size()); EXPECT_EQ(101, std_map[100]); } TEST_F(MapImplTest, ConvertToStdVectorOfPairs) { map_[100] = 101; std::vector > std_vec(map_.begin(), map_.end()); EXPECT_EQ(1, std_vec.size()); EXPECT_EQ(100, std_vec[0].first); EXPECT_EQ(101, std_vec[0].second); } TEST_F(MapImplTest, SwapBasic) { Map another; map_[9398] = 41999; another[9398] = 41999; another[8070] = 42056; another.swap(map_); EXPECT_THAT(another, testing::UnorderedElementsAre( testing::Pair(9398, 41999))); EXPECT_THAT(map_, testing::UnorderedElementsAre( testing::Pair(8070, 42056), testing::Pair(9398, 41999))); } TEST_F(MapImplTest, SwapArena) { Arena arena1, arena2; Map m1(&arena1); Map m2(&arena2); map_[9398] = 41999; m1[9398] = 41999; m1[8070] = 42056; m2[10244] = 10247; m2[8070] = 42056; m1.swap(map_); EXPECT_THAT(m1, testing::UnorderedElementsAre( testing::Pair(9398, 41999))); EXPECT_THAT(map_, testing::UnorderedElementsAre( testing::Pair(8070, 42056), testing::Pair(9398, 41999))); m2.swap(m1); EXPECT_THAT(m1, testing::UnorderedElementsAre( testing::Pair(8070, 42056), testing::Pair(10244, 10247))); EXPECT_THAT(m2, testing::UnorderedElementsAre( testing::Pair(9398, 41999))); } TEST_F(MapImplTest, CopyAssignMapIterator) { TestMap message; MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); reflection_tester.SetMapFieldsViaMapReflection(&message); MapIterator it1 = reflection_tester.MapBegin(&message, "map_int32_int32"); MapIterator it2 = reflection_tester.MapEnd(&message, "map_int32_int32"); it2 = it1; EXPECT_EQ(it1.GetKey().GetInt32Value(), it2.GetKey().GetInt32Value()); } // Map Field Reflection Test ======================================== static int Func(int i, int j) { return i * j; } static string StrFunc(int i, int j) { string str; SStringPrintf(&str, "%d", Func(i, j)); return str; } static int Int(const string& value) { int result = 0; std::istringstream(value) >> result; return result; } class MapFieldReflectionTest : public testing::Test { protected: typedef FieldDescriptor FD; int MapSize(const Reflection* reflection, const FieldDescriptor* field, const Message& message) { return reflection->MapSize(message, field); } }; TEST_F(MapFieldReflectionTest, RegularFields) { TestMap message; const Reflection* refl = message.GetReflection(); const Descriptor* desc = message.GetDescriptor(); Map* map_int32_int32 = message.mutable_map_int32_int32(); Map* map_int32_double = message.mutable_map_int32_double(); Map* map_string_string = message.mutable_map_string_string(); Map* map_int32_foreign_message = message.mutable_map_int32_foreign_message(); for (int i = 0; i < 10; ++i) { (*map_int32_int32)[i] = Func(i, 1); (*map_int32_double)[i] = Func(i, 2); (*map_string_string)[StrFunc(i, 1)] = StrFunc(i, 5); (*map_int32_foreign_message)[i].set_c(Func(i, 6)); } // Get FieldDescriptors for all the fields of interest. const FieldDescriptor* fd_map_int32_int32 = desc->FindFieldByName("map_int32_int32"); const FieldDescriptor* fd_map_int32_double = desc->FindFieldByName("map_int32_double"); const FieldDescriptor* fd_map_string_string = desc->FindFieldByName("map_string_string"); const FieldDescriptor* fd_map_int32_foreign_message = desc->FindFieldByName("map_int32_foreign_message"); const FieldDescriptor* fd_map_int32_in32_key = fd_map_int32_int32->message_type()->FindFieldByName("key"); const FieldDescriptor* fd_map_int32_in32_value = fd_map_int32_int32->message_type()->FindFieldByName("value"); const FieldDescriptor* fd_map_int32_double_key = fd_map_int32_double->message_type()->FindFieldByName("key"); const FieldDescriptor* fd_map_int32_double_value = fd_map_int32_double->message_type()->FindFieldByName("value"); const FieldDescriptor* fd_map_string_string_key = fd_map_string_string->message_type()->FindFieldByName("key"); const FieldDescriptor* fd_map_string_string_value = fd_map_string_string->message_type()->FindFieldByName("value"); const FieldDescriptor* fd_map_int32_foreign_message_key = fd_map_int32_foreign_message->message_type()->FindFieldByName("key"); const FieldDescriptor* fd_map_int32_foreign_message_value = fd_map_int32_foreign_message->message_type()->FindFieldByName("value"); // Get RepeatedPtrField objects for all fields of interest. const RepeatedPtrField& mf_int32_int32 = refl->GetRepeatedPtrField(message, fd_map_int32_int32); const RepeatedPtrField& mf_int32_double = refl->GetRepeatedPtrField(message, fd_map_int32_double); const RepeatedPtrField& mf_string_string = refl->GetRepeatedPtrField(message, fd_map_string_string); const RepeatedPtrField& mf_int32_foreign_message = refl->GetRepeatedPtrField( message, fd_map_int32_foreign_message); // Get mutable RepeatedPtrField objects for all fields of interest. RepeatedPtrField* mmf_int32_int32 = refl->MutableRepeatedPtrField(&message, fd_map_int32_int32); RepeatedPtrField* mmf_int32_double = refl->MutableRepeatedPtrField(&message, fd_map_int32_double); RepeatedPtrField* mmf_string_string = refl->MutableRepeatedPtrField(&message, fd_map_string_string); RepeatedPtrField* mmf_int32_foreign_message = refl->MutableRepeatedPtrField( &message, fd_map_int32_foreign_message); // Make sure we can do gets through the RepeatedPtrField objects. for (int i = 0; i < 10; ++i) { { // Check gets through const objects. const Message& message_int32_int32 = mf_int32_int32.Get(i); int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32( message_int32_int32, fd_map_int32_in32_key); int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32( message_int32_int32, fd_map_int32_in32_value); EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1)); const Message& message_int32_double = mf_int32_double.Get(i); int32 key_int32_double = message_int32_double.GetReflection()->GetInt32( message_int32_double, fd_map_int32_double_key); double value_int32_double = message_int32_double.GetReflection()->GetDouble( message_int32_double, fd_map_int32_double_value); EXPECT_EQ(value_int32_double, Func(key_int32_double, 2)); const Message& message_string_string = mf_string_string.Get(i); string key_string_string = message_string_string.GetReflection()->GetString( message_string_string, fd_map_string_string_key); string value_string_string = message_string_string.GetReflection()->GetString( message_string_string, fd_map_string_string_value); EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5)); const Message& message_int32_message = mf_int32_foreign_message.Get(i); int32 key_int32_message = message_int32_message.GetReflection()->GetInt32( message_int32_message, fd_map_int32_foreign_message_key); const ForeignMessage& value_int32_message = down_cast( 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)); } { // Check gets through mutable objects. const Message& message_int32_int32 = mmf_int32_int32->Get(i); int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32( message_int32_int32, fd_map_int32_in32_key); int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32( message_int32_int32, fd_map_int32_in32_value); EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1)); const Message& message_int32_double = mmf_int32_double->Get(i); int32 key_int32_double = message_int32_double.GetReflection()->GetInt32( message_int32_double, fd_map_int32_double_key); double value_int32_double = message_int32_double.GetReflection()->GetDouble( message_int32_double, fd_map_int32_double_value); EXPECT_EQ(value_int32_double, Func(key_int32_double, 2)); const Message& message_string_string = mmf_string_string->Get(i); string key_string_string = message_string_string.GetReflection()->GetString( message_string_string, fd_map_string_string_key); string value_string_string = message_string_string.GetReflection()->GetString( message_string_string, fd_map_string_string_value); EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5)); const Message& message_int32_message = mmf_int32_foreign_message->Get(i); int32 key_int32_message = message_int32_message.GetReflection()->GetInt32( message_int32_message, fd_map_int32_foreign_message_key); const ForeignMessage& value_int32_message = down_cast( 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)); } } // Do sets through the RepeatedPtrField objects. for (int i = 0; i < 10; i++) { { Message* message_int32_int32 = mmf_int32_int32->Mutable(i); int32 key_int32_int32 = message_int32_int32->GetReflection()->GetInt32( *message_int32_int32, fd_map_int32_in32_key); message_int32_int32->GetReflection()->SetInt32(message_int32_int32, fd_map_int32_in32_value, Func(key_int32_int32, -1)); Message* message_int32_double = mmf_int32_double->Mutable(i); int32 key_int32_double = message_int32_double->GetReflection()->GetInt32( *message_int32_double, fd_map_int32_double_key); message_int32_double->GetReflection()->SetDouble( message_int32_double, fd_map_int32_double_value, Func(key_int32_double, -2)); Message* message_string_string = mmf_string_string->Mutable(i); string key_string_string = message_string_string->GetReflection()->GetString( *message_string_string, fd_map_string_string_key); message_string_string->GetReflection()->SetString( message_string_string, fd_map_string_string_value, StrFunc(Int(key_string_string), -5)); Message* message_int32_message = mmf_int32_foreign_message->Mutable(i); int32 key_int32_message = message_int32_message->GetReflection()->GetInt32( *message_int32_message, fd_map_int32_foreign_message_key); ForeignMessage* value_int32_message = down_cast( message_int32_message->GetReflection() ->MutableMessage(message_int32_message, fd_map_int32_foreign_message_value)); value_int32_message->set_c(Func(key_int32_message, -6)); } } // Check gets through mutable objects. for (int i = 0; i < 10; i++) { EXPECT_EQ(Func(i, -1), message.map_int32_int32().at(i)); EXPECT_EQ(Func(i, -2), message.map_int32_double().at(i)); EXPECT_EQ(StrFunc(i, -5), message.map_string_string().at(StrFunc(i, 1))); EXPECT_EQ(Func(i, -6), message.map_int32_foreign_message().at(i).c()); } } TEST_F(MapFieldReflectionTest, RepeatedFieldRefForRegularFields) { TestMap message; const Reflection* refl = message.GetReflection(); const Descriptor* desc = message.GetDescriptor(); Map* map_int32_int32 = message.mutable_map_int32_int32(); Map* map_int32_double = message.mutable_map_int32_double(); Map* map_string_string = message.mutable_map_string_string(); Map* map_int32_foreign_message = message.mutable_map_int32_foreign_message(); for (int i = 0; i < 10; ++i) { (*map_int32_int32)[i] = Func(i, 1); (*map_int32_double)[i] = Func(i, 2); (*map_string_string)[StrFunc(i, 1)] = StrFunc(i, 5); (*map_int32_foreign_message)[i].set_c(Func(i, 6)); } // Get FieldDescriptors for all the fields of interest. const FieldDescriptor* fd_map_int32_int32 = desc->FindFieldByName("map_int32_int32"); const FieldDescriptor* fd_map_int32_double = desc->FindFieldByName("map_int32_double"); const FieldDescriptor* fd_map_string_string = desc->FindFieldByName("map_string_string"); const FieldDescriptor* fd_map_int32_foreign_message = desc->FindFieldByName("map_int32_foreign_message"); const FieldDescriptor* fd_map_int32_in32_key = fd_map_int32_int32->message_type()->FindFieldByName("key"); const FieldDescriptor* fd_map_int32_in32_value = fd_map_int32_int32->message_type()->FindFieldByName("value"); const FieldDescriptor* fd_map_int32_double_key = fd_map_int32_double->message_type()->FindFieldByName("key"); const FieldDescriptor* fd_map_int32_double_value = fd_map_int32_double->message_type()->FindFieldByName("value"); const FieldDescriptor* fd_map_string_string_key = fd_map_string_string->message_type()->FindFieldByName("key"); const FieldDescriptor* fd_map_string_string_value = fd_map_string_string->message_type()->FindFieldByName("value"); const FieldDescriptor* fd_map_int32_foreign_message_key = fd_map_int32_foreign_message->message_type()->FindFieldByName("key"); const FieldDescriptor* fd_map_int32_foreign_message_value = fd_map_int32_foreign_message->message_type()->FindFieldByName("value"); // Get RepeatedFieldRef objects for all fields of interest. const RepeatedFieldRef mf_int32_int32 = refl->GetRepeatedFieldRef(message, fd_map_int32_int32); const RepeatedFieldRef mf_int32_double = refl->GetRepeatedFieldRef(message, fd_map_int32_double); const RepeatedFieldRef mf_string_string = refl->GetRepeatedFieldRef(message, fd_map_string_string); const RepeatedFieldRef mf_int32_foreign_message = refl->GetRepeatedFieldRef(message, fd_map_int32_foreign_message); // Get mutable RepeatedFieldRef objects for all fields of interest. const MutableRepeatedFieldRef mmf_int32_int32 = refl->GetMutableRepeatedFieldRef(&message, fd_map_int32_int32); const MutableRepeatedFieldRef mmf_int32_double = refl->GetMutableRepeatedFieldRef(&message, fd_map_int32_double); const MutableRepeatedFieldRef mmf_string_string = refl->GetMutableRepeatedFieldRef(&message, fd_map_string_string); const MutableRepeatedFieldRef mmf_int32_foreign_message = refl->GetMutableRepeatedFieldRef( &message, fd_map_int32_foreign_message); // Get entry default instances google::protobuf::scoped_ptr entry_int32_int32( MessageFactory::generated_factory() ->GetPrototype(fd_map_int32_int32->message_type()) ->New()); google::protobuf::scoped_ptr entry_int32_double( MessageFactory::generated_factory() ->GetPrototype(fd_map_int32_double->message_type()) ->New()); google::protobuf::scoped_ptr entry_string_string( MessageFactory::generated_factory() ->GetPrototype(fd_map_string_string->message_type()) ->New()); google::protobuf::scoped_ptr entry_int32_foreign_message( MessageFactory::generated_factory() ->GetPrototype(fd_map_int32_foreign_message->message_type()) ->New()); EXPECT_EQ(10, mf_int32_int32.size()); EXPECT_EQ(10, mmf_int32_int32.size()); EXPECT_EQ(10, mf_int32_double.size()); EXPECT_EQ(10, mmf_int32_double.size()); EXPECT_EQ(10, mf_string_string.size()); EXPECT_EQ(10, mmf_string_string.size()); EXPECT_EQ(10, mf_int32_foreign_message.size()); EXPECT_EQ(10, mmf_int32_foreign_message.size()); EXPECT_FALSE(mf_int32_int32.empty()); EXPECT_FALSE(mmf_int32_int32.empty()); EXPECT_FALSE(mf_int32_double.empty()); EXPECT_FALSE(mmf_int32_double.empty()); EXPECT_FALSE(mf_string_string.empty()); EXPECT_FALSE(mmf_string_string.empty()); EXPECT_FALSE(mf_int32_foreign_message.empty()); EXPECT_FALSE(mmf_int32_foreign_message.empty()); // Make sure we can do gets through the RepeatedFieldRef objects. for (int i = 0; i < 10; ++i) { { // Check gets through const objects. const Message& message_int32_int32 = mf_int32_int32.Get(i, entry_int32_int32.get()); int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32( message_int32_int32, fd_map_int32_in32_key); int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32( message_int32_int32, fd_map_int32_in32_value); EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1)); const Message& message_int32_double = mf_int32_double.Get(i, entry_int32_double.get()); int32 key_int32_double = message_int32_double.GetReflection()->GetInt32( message_int32_double, fd_map_int32_double_key); double value_int32_double = message_int32_double.GetReflection()->GetDouble( message_int32_double, fd_map_int32_double_value); EXPECT_EQ(value_int32_double, Func(key_int32_double, 2)); const Message& message_string_string = mf_string_string.Get(i, entry_string_string.get()); string key_string_string = message_string_string.GetReflection()->GetString( message_string_string, fd_map_string_string_key); string value_string_string = message_string_string.GetReflection()->GetString( message_string_string, fd_map_string_string_value); EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5)); const Message& message_int32_message = mf_int32_foreign_message.Get(i, entry_int32_foreign_message.get()); int32 key_int32_message = message_int32_message.GetReflection()->GetInt32( message_int32_message, fd_map_int32_foreign_message_key); const ForeignMessage& value_int32_message = down_cast( 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)); } { // Check gets through mutable objects. const Message& message_int32_int32 = mmf_int32_int32.Get(i, entry_int32_int32.get()); int32 key_int32_int32 = message_int32_int32.GetReflection()->GetInt32( message_int32_int32, fd_map_int32_in32_key); int32 value_int32_int32 = message_int32_int32.GetReflection()->GetInt32( message_int32_int32, fd_map_int32_in32_value); EXPECT_EQ(value_int32_int32, Func(key_int32_int32, 1)); const Message& message_int32_double = mmf_int32_double.Get(i, entry_int32_double.get()); int32 key_int32_double = message_int32_double.GetReflection()->GetInt32( message_int32_double, fd_map_int32_double_key); double value_int32_double = message_int32_double.GetReflection()->GetDouble( message_int32_double, fd_map_int32_double_value); EXPECT_EQ(value_int32_double, Func(key_int32_double, 2)); const Message& message_string_string = mmf_string_string.Get(i, entry_string_string.get()); string key_string_string = message_string_string.GetReflection()->GetString( message_string_string, fd_map_string_string_key); string value_string_string = message_string_string.GetReflection()->GetString( message_string_string, fd_map_string_string_value); EXPECT_EQ(value_string_string, StrFunc(Int(key_string_string), 5)); const Message& message_int32_message = mmf_int32_foreign_message.Get(i, entry_int32_foreign_message.get()); int32 key_int32_message = message_int32_message.GetReflection()->GetInt32( message_int32_message, fd_map_int32_foreign_message_key); const ForeignMessage& value_int32_message = down_cast( 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)); } } // Make sure we can do sets through the RepeatedFieldRef objects. for (int i = 0; i < 10; i++) { const Message& message_int32_int32 = mmf_int32_int32.Get(i, entry_int32_int32.get()); int key = message_int32_int32.GetReflection()->GetInt32( message_int32_int32, fd_map_int32_in32_key); entry_int32_int32->GetReflection()->SetInt32( entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(0), key); entry_int32_int32->GetReflection()->SetInt32( entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(1), Func(key, -1)); entry_int32_double->GetReflection()->SetInt32( entry_int32_double.get(), fd_map_int32_double->message_type()->field(0), key); entry_int32_double->GetReflection()->SetDouble( entry_int32_double.get(), fd_map_int32_double->message_type()->field(1), Func(key, -2)); entry_string_string->GetReflection()->SetString( entry_string_string.get(), fd_map_string_string->message_type()->field(0), StrFunc(key, 1)); entry_string_string->GetReflection()->SetString( entry_string_string.get(), fd_map_string_string->message_type()->field(1), StrFunc(key, -5)); entry_int32_foreign_message->GetReflection()->SetInt32( entry_int32_foreign_message.get(), fd_map_int32_foreign_message->message_type()->field(0), key); Message* value_message = entry_int32_foreign_message->GetReflection()->MutableMessage( entry_int32_foreign_message.get(), fd_map_int32_foreign_message->message_type()->field(1)); value_message->GetReflection()->SetInt32( value_message, value_message->GetDescriptor()->FindFieldByName("c"), Func(key, -6)); mmf_int32_int32.Set(i, *entry_int32_int32); mmf_int32_double.Set(i, *entry_int32_double); mmf_string_string.Set(i, *entry_string_string); mmf_int32_foreign_message.Set(i, *entry_int32_foreign_message); } for (int i = 0; i < 10; i++) { EXPECT_EQ(Func(i, -1), message.map_int32_int32().at(i)); EXPECT_EQ(Func(i, -2), message.map_int32_double().at(i)); EXPECT_EQ(StrFunc(i, -5), message.map_string_string().at(StrFunc(i, 1))); EXPECT_EQ(Func(i, -6), message.map_int32_foreign_message().at(i).c()); } // Test iterators. { int index = 0; hash_map result; for (RepeatedFieldRef::iterator it = mf_int32_int32.begin(); it != mf_int32_int32.end(); ++it) { const Message& message = *it; int32 key = message.GetReflection()->GetInt32(message, fd_map_int32_in32_key); int32 value = message.GetReflection()->GetInt32(message, fd_map_int32_in32_value); result[key] = value; ++index; } EXPECT_EQ(10, index); for (hash_map::const_iterator it = result.begin(); it != result.end(); ++it) { EXPECT_EQ(message.map_int32_int32().at(it->first), it->second); } } { int index = 0; hash_map result; for (RepeatedFieldRef::iterator it = mf_int32_double.begin(); it != mf_int32_double.end(); ++it) { const Message& message = *it; int32 key = message.GetReflection()->GetInt32(message, fd_map_int32_double_key); double value = message.GetReflection()->GetDouble( message, fd_map_int32_double_value); result[key] = value; ++index; } EXPECT_EQ(10, index); for (hash_map::const_iterator it = result.begin(); it != result.end(); ++it) { EXPECT_EQ(message.map_int32_double().at(it->first), it->second); } } { int index = 0; hash_map result; for (RepeatedFieldRef::iterator it = mf_string_string.begin(); it != mf_string_string.end(); ++it) { const Message& message = *it; string key = message.GetReflection()->GetString(message, fd_map_string_string_key); string value = message.GetReflection()->GetString( message, fd_map_string_string_value); result[key] = value; ++index; } EXPECT_EQ(10, index); for (hash_map::const_iterator it = result.begin(); it != result.end(); ++it) { EXPECT_EQ(message.map_string_string().at(it->first), it->second); } } { int index = 0; std::map result; for (RepeatedFieldRef::iterator it = mf_int32_foreign_message.begin(); it != mf_int32_foreign_message.end(); ++it) { const Message& message = *it; int32 key = message.GetReflection()->GetInt32( message, fd_map_int32_foreign_message_key); const ForeignMessage& sub_message = down_cast( message.GetReflection() ->GetMessage(message, fd_map_int32_foreign_message_value)); result[key].MergeFrom(sub_message); ++index; } EXPECT_EQ(10, index); for (std::map::const_iterator it = result.begin(); it != result.end(); ++it) { EXPECT_EQ(message.map_int32_foreign_message().at(it->first).c(), it->second.c()); } } // Test MutableRepeatedFieldRef::Add() entry_int32_int32->GetReflection()->SetInt32( entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(0), 4321); entry_int32_int32->GetReflection()->SetInt32( entry_int32_int32.get(), fd_map_int32_int32->message_type()->field(1), 1234); mmf_int32_int32.Add(*entry_int32_int32); EXPECT_EQ(1234, message.map_int32_int32().at(4321)); entry_int32_double->GetReflection()->SetInt32( entry_int32_double.get(), fd_map_int32_double->message_type()->field(0), 4321); entry_int32_double->GetReflection()->SetDouble( entry_int32_double.get(), fd_map_int32_double->message_type()->field(1), 1234.0); mmf_int32_double.Add(*entry_int32_double); EXPECT_EQ(1234.0, message.map_int32_double().at(4321)); entry_string_string->GetReflection()->SetString( entry_string_string.get(), fd_map_string_string->message_type()->field(0), "4321"); entry_string_string->GetReflection()->SetString( entry_string_string.get(), fd_map_string_string->message_type()->field(1), "1234"); mmf_string_string.Add(*entry_string_string); EXPECT_EQ("1234", message.map_string_string().at("4321")); entry_int32_foreign_message->GetReflection()->SetInt32( entry_int32_foreign_message.get(), fd_map_int32_foreign_message->message_type()->field(0), 4321); Message* value_message = entry_int32_foreign_message->GetReflection()->MutableMessage( entry_int32_foreign_message.get(), fd_map_int32_foreign_message->message_type()->field(1)); ForeignMessage foreign_message; foreign_message.set_c(1234); value_message->CopyFrom(foreign_message); mmf_int32_foreign_message.Add(*entry_int32_foreign_message); EXPECT_EQ(1234, message.map_int32_foreign_message().at(4321).c()); // Test Reflection::AddAllocatedMessage Message* free_entry_string_string = MessageFactory::generated_factory() ->GetPrototype(fd_map_string_string->message_type()) ->New(); entry_string_string->GetReflection()->SetString( free_entry_string_string, fd_map_string_string->message_type()->field(0), "4321"); entry_string_string->GetReflection()->SetString( free_entry_string_string, fd_map_string_string->message_type()->field(1), "1234"); refl->AddAllocatedMessage(&message, fd_map_string_string, free_entry_string_string); // Test MutableRepeatedFieldRef::RemoveLast() mmf_int32_int32.RemoveLast(); mmf_int32_double.RemoveLast(); mmf_string_string.RemoveLast(); mmf_int32_foreign_message.RemoveLast(); EXPECT_EQ(10, message.map_int32_int32().size()); EXPECT_EQ(10, message.map_int32_double().size()); EXPECT_EQ(11, message.map_string_string().size()); EXPECT_EQ(10, message.map_int32_foreign_message().size()); // Test MutableRepeatedFieldRef::SwapElements() { const Message& message0a = mmf_int32_int32.Get(0, entry_int32_int32.get()); int32 int32_value0a = message0a.GetReflection()->GetInt32(message0a, fd_map_int32_in32_value); const Message& message9a = mmf_int32_int32.Get(9, entry_int32_int32.get()); int32 int32_value9a = message9a.GetReflection()->GetInt32(message9a, fd_map_int32_in32_value); mmf_int32_int32.SwapElements(0, 9); const Message& message0b = mmf_int32_int32.Get(0, entry_int32_int32.get()); int32 int32_value0b = message0b.GetReflection()->GetInt32(message0b, fd_map_int32_in32_value); const Message& message9b = mmf_int32_int32.Get(9, entry_int32_int32.get()); int32 int32_value9b = message9b.GetReflection()->GetInt32(message9b, fd_map_int32_in32_value); EXPECT_EQ(int32_value9a, int32_value0b); EXPECT_EQ(int32_value0a, int32_value9b); } { const Message& message0a = mmf_int32_double.Get(0, entry_int32_double.get()); double double_value0a = message0a.GetReflection()->GetDouble( message0a, fd_map_int32_double_value); const Message& message9a = mmf_int32_double.Get(9, entry_int32_double.get()); double double_value9a = message9a.GetReflection()->GetDouble( message9a, fd_map_int32_double_value); mmf_int32_double.SwapElements(0, 9); const Message& message0b = mmf_int32_double.Get(0, entry_int32_double.get()); double double_value0b = message0b.GetReflection()->GetDouble( message0b, fd_map_int32_double_value); const Message& message9b = mmf_int32_double.Get(9, entry_int32_double.get()); double double_value9b = message9b.GetReflection()->GetDouble( message9b, fd_map_int32_double_value); EXPECT_EQ(double_value9a, double_value0b); EXPECT_EQ(double_value0a, double_value9b); } { const Message& message0a = mmf_string_string.Get(0, entry_string_string.get()); string string_value0a = message0a.GetReflection()->GetString( message0a, fd_map_string_string_value); const Message& message9a = mmf_string_string.Get(9, entry_string_string.get()); string string_value9a = message9a.GetReflection()->GetString( message9a, fd_map_string_string_value); mmf_string_string.SwapElements(0, 9); const Message& message0b = mmf_string_string.Get(0, entry_string_string.get()); string string_value0b = message0b.GetReflection()->GetString( message0b, fd_map_string_string_value); const Message& message9b = mmf_string_string.Get(9, entry_string_string.get()); string string_value9b = message9b.GetReflection()->GetString( message9b, fd_map_string_string_value); EXPECT_EQ(string_value9a, string_value0b); EXPECT_EQ(string_value0a, string_value9b); } { const Message& message0a = mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get()); const ForeignMessage& sub_message0a = down_cast( message0a.GetReflection() ->GetMessage(message0a, fd_map_int32_foreign_message_value)); int32 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( message9a.GetReflection() ->GetMessage(message9a, fd_map_int32_foreign_message_value)); int32 int32_value9a = sub_message9a.c(); mmf_int32_foreign_message.SwapElements(0, 9); const Message& message0b = mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get()); const ForeignMessage& sub_message0b = down_cast( message0b.GetReflection() ->GetMessage(message0b, fd_map_int32_foreign_message_value)); int32 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( message9b.GetReflection() ->GetMessage(message9b, fd_map_int32_foreign_message_value)); int32 int32_value9b = sub_message9b.c(); EXPECT_EQ(int32_value9a, int32_value0b); EXPECT_EQ(int32_value0a, int32_value9b); } } TEST_F(MapFieldReflectionTest, RepeatedFieldRefMergeFromAndSwap) { // Set-up message content. TestMap m0, m1, m2; for (int i = 0; i < 10; ++i) { (*m0.mutable_map_int32_int32())[i] = Func(i, 1); (*m0.mutable_map_int32_double())[i] = Func(i, 2); (*m0.mutable_map_string_string())[StrFunc(i, 1)] = StrFunc(i, 5); (*m0.mutable_map_int32_foreign_message())[i].set_c(Func(i, 6)); (*m1.mutable_map_int32_int32())[i + 10] = Func(i, 11); (*m1.mutable_map_int32_double())[i + 10] = Func(i, 12); (*m1.mutable_map_string_string())[StrFunc(i + 10, 1)] = StrFunc(i, 15); (*m1.mutable_map_int32_foreign_message())[i + 10].set_c(Func(i, 16)); (*m2.mutable_map_int32_int32())[i + 20] = Func(i, 21); (*m2.mutable_map_int32_double())[i + 20] = Func(i, 22); (*m2.mutable_map_string_string())[StrFunc(i + 20, 1)] = StrFunc(i, 25); (*m2.mutable_map_int32_foreign_message())[i + 20].set_c(Func(i, 26)); } const Reflection* refl = m0.GetReflection(); const Descriptor* desc = m0.GetDescriptor(); // Get FieldDescriptors for all the fields of interest. const FieldDescriptor* fd_map_int32_int32 = desc->FindFieldByName("map_int32_int32"); const FieldDescriptor* fd_map_int32_double = desc->FindFieldByName("map_int32_double"); const FieldDescriptor* fd_map_string_string = desc->FindFieldByName("map_string_string"); const FieldDescriptor* fd_map_int32_foreign_message = desc->FindFieldByName("map_int32_foreign_message"); // Get MutableRepeatedFieldRef objects for all fields of interest. const MutableRepeatedFieldRef mmf_int32_int32 = refl->GetMutableRepeatedFieldRef( &m0, fd_map_int32_int32); const MutableRepeatedFieldRef mmf_int32_double = refl->GetMutableRepeatedFieldRef( &m0, fd_map_int32_double); const MutableRepeatedFieldRef mmf_string_string = refl->GetMutableRepeatedFieldRef( &m0, fd_map_string_string); const MutableRepeatedFieldRef mmf_int32_foreign_message = refl->GetMutableRepeatedFieldRef( &m0, fd_map_int32_foreign_message); // Test MutableRepeatedRef::CopyFrom mmf_int32_int32.CopyFrom( refl->GetRepeatedFieldRef( m1, fd_map_int32_int32)); mmf_int32_double.CopyFrom( refl->GetRepeatedFieldRef( m1, fd_map_int32_double)); mmf_string_string.CopyFrom( refl->GetRepeatedFieldRef( m1, fd_map_string_string)); mmf_int32_foreign_message.CopyFrom( refl->GetRepeatedFieldRef( m1, fd_map_int32_foreign_message)); for (int i = 0; i < 10; ++i) { EXPECT_EQ(Func(i, 11), m0.map_int32_int32().at(i + 10)); EXPECT_EQ(Func(i, 12), m0.map_int32_double().at(i + 10)); EXPECT_EQ(StrFunc(i, 15), m0.map_string_string().at(StrFunc(i + 10, 1))); EXPECT_EQ(Func(i, 16), m0.map_int32_foreign_message().at(i + 10).c()); } // Test MutableRepeatedRef::MergeFrom mmf_int32_int32.MergeFrom( refl->GetRepeatedFieldRef( m2, fd_map_int32_int32)); mmf_int32_double.MergeFrom( refl->GetRepeatedFieldRef( m2, fd_map_int32_double)); mmf_string_string.MergeFrom( refl->GetRepeatedFieldRef( m2, fd_map_string_string)); mmf_int32_foreign_message.MergeFrom( refl->GetRepeatedFieldRef( m2, fd_map_int32_foreign_message)); for (int i = 0; i < 10; ++i) { EXPECT_EQ(Func(i, 21), m0.map_int32_int32().at(i + 20)); EXPECT_EQ(Func(i, 22), m0.map_int32_double().at(i + 20)); EXPECT_EQ(StrFunc(i, 25), m0.map_string_string().at(StrFunc(i + 20, 1))); EXPECT_EQ(Func(i, 26), m0.map_int32_foreign_message().at(i + 20).c()); } // Test MutableRepeatedRef::Swap // Swap between m0 and m2. mmf_int32_int32.Swap( refl->GetMutableRepeatedFieldRef( &m2, fd_map_int32_int32)); mmf_int32_double.Swap( refl->GetMutableRepeatedFieldRef( &m2, fd_map_int32_double)); mmf_string_string.Swap( refl->GetMutableRepeatedFieldRef( &m2, fd_map_string_string)); mmf_int32_foreign_message.Swap( refl->GetMutableRepeatedFieldRef( &m2, fd_map_int32_foreign_message)); for (int i = 0; i < 10; ++i) { // Check the content of m0. EXPECT_EQ(Func(i, 21), m0.map_int32_int32().at(i + 20)); EXPECT_EQ(Func(i, 22), m0.map_int32_double().at(i + 20)); EXPECT_EQ(StrFunc(i, 25), m0.map_string_string().at(StrFunc(i + 20, 1))); EXPECT_EQ(Func(i, 26), m0.map_int32_foreign_message().at(i + 20).c()); // Check the content of m2. EXPECT_EQ(Func(i, 11), m2.map_int32_int32().at(i + 10)); EXPECT_EQ(Func(i, 12), m2.map_int32_double().at(i + 10)); EXPECT_EQ(StrFunc(i, 15), m2.map_string_string().at(StrFunc(i + 10, 1))); EXPECT_EQ(Func(i, 16), m2.map_int32_foreign_message().at(i + 10).c()); EXPECT_EQ(Func(i, 21), m2.map_int32_int32().at(i + 20)); EXPECT_EQ(Func(i, 22), m2.map_int32_double().at(i + 20)); EXPECT_EQ(StrFunc(i, 25), m2.map_string_string().at(StrFunc(i + 20, 1))); EXPECT_EQ(Func(i, 26), m2.map_int32_foreign_message().at(i + 20).c()); } // TODO(teboring): add test for duplicated key } TEST_F(MapFieldReflectionTest, MapSizeWithDuplicatedKey) { // Dynamic Message { DynamicMessageFactory factory; google::protobuf::scoped_ptr message( factory.GetPrototype(unittest::TestMap::descriptor())->New()); const Reflection* reflection = message->GetReflection(); const FieldDescriptor* field = unittest::TestMap::descriptor()->FindFieldByName("map_int32_int32"); Message* entry1 = reflection->AddMessage(message.get(), field); Message* entry2 = reflection->AddMessage(message.get(), field); const Reflection* entry_reflection = entry1->GetReflection(); const FieldDescriptor* key_field = entry1->GetDescriptor()->FindFieldByName("key"); entry_reflection->SetInt32(entry1, key_field, 1); entry_reflection->SetInt32(entry2, key_field, 1); EXPECT_EQ(2, reflection->FieldSize(*message, field)); EXPECT_EQ(1, MapSize(reflection, field, *message)); } // Generated Message { unittest::TestMap message; const Reflection* reflection = message.GetReflection(); const FieldDescriptor* field = message.GetDescriptor()->FindFieldByName("map_int32_int32"); Message* entry1 = reflection->AddMessage(&message, field); Message* entry2 = reflection->AddMessage(&message, field); const Reflection* entry_reflection = entry1->GetReflection(); const FieldDescriptor* key_field = entry1->GetDescriptor()->FindFieldByName("key"); entry_reflection->SetInt32(entry1, key_field, 1); entry_reflection->SetInt32(entry2, key_field, 1); EXPECT_EQ(2, reflection->FieldSize(message, field)); EXPECT_EQ(1, MapSize(reflection, field, message)); } } // Generated Message Test =========================================== TEST(GeneratedMapFieldTest, Accessors) { unittest::TestMap message; MapTestUtil::SetMapFields(&message); MapTestUtil::ExpectMapFieldsSet(message); MapTestUtil::ModifyMapFields(&message); MapTestUtil::ExpectMapFieldsModified(message); } TEST(GeneratedMapFieldTest, SetMapFieldsInitialized) { unittest::TestMap message; MapTestUtil::SetMapFieldsInitialized(&message); MapTestUtil::ExpectMapFieldsSetInitialized(message); } TEST(GeneratedMapFieldTest, Proto2SetMapFieldsInitialized) { unittest::TestEnumMap message; EXPECT_EQ(unittest::PROTO2_MAP_ENUM_FOO, (*message.mutable_known_map_field())[0]); } TEST(GeneratedMapFieldTest, Clear) { unittest::TestMap message; MapTestUtil::SetMapFields(&message); message.Clear(); MapTestUtil::ExpectClear(message); } TEST(GeneratedMapFieldTest, ClearMessageMap) { unittest::TestMessageMap message; // Creates a TestAllTypes with default value TestUtil::ExpectClear((*message.mutable_map_int32_message())[0]); } TEST(GeneratedMapFieldTest, CopyFrom) { unittest::TestMap message1, message2; MapTestUtil::SetMapFields(&message1); message2.CopyFrom(message1); MapTestUtil::ExpectMapFieldsSet(message2); // Copying from self should be a no-op. message2.CopyFrom(message2); MapTestUtil::ExpectMapFieldsSet(message2); } TEST(GeneratedMapFieldTest, CopyFromMessageMap) { unittest::TestMessageMap message1, message2; (*message1.mutable_map_int32_message())[0].add_repeated_int32(100); (*message2.mutable_map_int32_message())[0].add_repeated_int32(101); message1.CopyFrom(message2); // Checks repeated field is overwritten. EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size()); EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0)); } TEST(GeneratedMapFieldTest, SwapWithEmpty) { unittest::TestMap message1, message2; MapTestUtil::SetMapFields(&message1); MapTestUtil::ExpectMapFieldsSet(message1); MapTestUtil::ExpectClear(message2); message1.Swap(&message2); MapTestUtil::ExpectMapFieldsSet(message2); MapTestUtil::ExpectClear(message1); } TEST(GeneratedMapFieldTest, SwapWithSelf) { unittest::TestMap message; MapTestUtil::SetMapFields(&message); MapTestUtil::ExpectMapFieldsSet(message); message.Swap(&message); MapTestUtil::ExpectMapFieldsSet(message); } TEST(GeneratedMapFieldTest, SwapWithOther) { unittest::TestMap message1, message2; MapTestUtil::SetMapFields(&message1); MapTestUtil::SetMapFields(&message2); MapTestUtil::ModifyMapFields(&message2); message1.Swap(&message2); MapTestUtil::ExpectMapFieldsModified(message1); MapTestUtil::ExpectMapFieldsSet(message2); } TEST(GeneratedMapFieldTest, CopyConstructor) { unittest::TestMap message1; MapTestUtil::SetMapFields(&message1); unittest::TestMap message2(message1); MapTestUtil::ExpectMapFieldsSet(message2); } TEST(GeneratedMapFieldTest, CopyAssignmentOperator) { unittest::TestMap message1; MapTestUtil::SetMapFields(&message1); unittest::TestMap message2; message2 = message1; MapTestUtil::ExpectMapFieldsSet(message2); // Make sure that self-assignment does something sane. message2.operator=(message2); MapTestUtil::ExpectMapFieldsSet(message2); } #if !defined(PROTOBUF_TEST_NO_DESCRIPTORS) || \ !defined(GOOGLE_PROTOBUF_NO_RTTI) TEST(GeneratedMapFieldTest, UpcastCopyFrom) { // Test the CopyFrom method that takes in the generic const Message& // parameter. unittest::TestMap message1, message2; MapTestUtil::SetMapFields(&message1); const Message* source = implicit_cast(&message1); message2.CopyFrom(*source); MapTestUtil::ExpectMapFieldsSet(message2); } #endif #ifndef PROTOBUF_TEST_NO_DESCRIPTORS TEST(GeneratedMapFieldTest, CopyFromDynamicMessage) { // Test copying from a DynamicMessage, which must fall back to using // reflection. unittest::TestMap message2; // Construct a new version of the dynamic message via the factory. DynamicMessageFactory factory; google::protobuf::scoped_ptr message1; message1.reset( factory.GetPrototype(unittest::TestMap::descriptor())->New()); MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); reflection_tester.SetMapFieldsViaReflection(message1.get()); reflection_tester.ExpectMapFieldsSetViaReflection(*message1); reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get()); message2.CopyFrom(*message1); MapTestUtil::ExpectMapFieldsSet(message2); } TEST(GeneratedMapFieldTest, CopyFromDynamicMessageMapReflection) { unittest::TestMap message2; // Construct a new version of the dynamic message via the factory. DynamicMessageFactory factory; google::protobuf::scoped_ptr message1; message1.reset( factory.GetPrototype(unittest::TestMap::descriptor())->New()); MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); reflection_tester.SetMapFieldsViaMapReflection(message1.get()); reflection_tester.ExpectMapFieldsSetViaReflection(*message1); reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get()); message2.CopyFrom(*message1); MapTestUtil::ExpectMapFieldsSet(message2); } TEST(GeneratedMapFieldTest, DynamicMessageCopyFrom) { // Test copying to a DynamicMessage, which must fall back to using reflection. unittest::TestMap message2; MapTestUtil::SetMapFields(&message2); // Construct a new version of the dynamic message via the factory. DynamicMessageFactory factory; google::protobuf::scoped_ptr message1; message1.reset( factory.GetPrototype(unittest::TestMap::descriptor())->New()); MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); message1->MergeFrom(message2); reflection_tester.ExpectMapFieldsSetViaReflection(*message1); reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get()); } TEST(GeneratedMapFieldTest, DynamicMessageCopyFromMapReflection) { MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); unittest::TestMap message2; reflection_tester.SetMapFieldsViaMapReflection(&message2); // Construct a dynamic message via the factory. DynamicMessageFactory factory; google::protobuf::scoped_ptr message1; message1.reset( factory.GetPrototype(unittest::TestMap::descriptor())->New()); message1->MergeFrom(message2); reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get()); reflection_tester.ExpectMapFieldsSetViaReflection(*message1); } TEST(GeneratedMapFieldTest, SyncDynamicMapWithRepeatedField) { // Construct a dynamic message via the factory. MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); DynamicMessageFactory factory; google::protobuf::scoped_ptr message; message.reset( factory.GetPrototype(unittest::TestMap::descriptor())->New()); reflection_tester.SetMapFieldsViaReflection(message.get()); reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message.get()); reflection_tester.ExpectMapFieldsSetViaReflection(*message); } #endif // !PROTOBUF_TEST_NO_DESCRIPTORS TEST(GeneratedMapFieldTest, NonEmptyMergeFrom) { unittest::TestMap message1, message2; MapTestUtil::SetMapFields(&message1); // This field will test merging into an empty spot. (*message2.mutable_map_int32_int32())[1] = 1; message1.mutable_map_int32_int32()->erase(1); // This tests overwriting. (*message2.mutable_map_int32_double())[1] = 1; (*message1.mutable_map_int32_double())[1] = 2; message1.MergeFrom(message2); MapTestUtil::ExpectMapFieldsSet(message1); } TEST(GeneratedMapFieldTest, MergeFromMessageMap) { unittest::TestMessageMap message1, message2; (*message1.mutable_map_int32_message())[0].add_repeated_int32(100); (*message2.mutable_map_int32_message())[0].add_repeated_int32(101); message1.MergeFrom(message2); // Checks repeated field is overwritten. EXPECT_EQ(1, message1.map_int32_message().at(0).repeated_int32_size()); EXPECT_EQ(101, message1.map_int32_message().at(0).repeated_int32(0)); } // Test the generated SerializeWithCachedSizesToArray() TEST(GeneratedMapFieldTest, SerializationToArray) { unittest::TestMap message1, message2; string data; MapTestUtil::SetMapFields(&message1); int size = message1.ByteSize(); data.resize(size); uint8* start = reinterpret_cast(string_as_array(&data)); uint8* end = message1.SerializeWithCachedSizesToArray(start); EXPECT_EQ(size, end - start); EXPECT_TRUE(message2.ParseFromString(data)); MapTestUtil::ExpectMapFieldsSet(message2); } // Test the generated SerializeWithCachedSizes() TEST(GeneratedMapFieldTest, SerializationToStream) { unittest::TestMap message1, message2; MapTestUtil::SetMapFields(&message1); int size = message1.ByteSize(); string data; data.resize(size); { // Allow the output stream to buffer only one byte at a time. io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); io::CodedOutputStream output_stream(&array_stream); message1.SerializeWithCachedSizes(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); } EXPECT_TRUE(message2.ParseFromString(data)); MapTestUtil::ExpectMapFieldsSet(message2); } TEST(GeneratedMapFieldTest, SameTypeMaps) { const Descriptor* map1 = unittest::TestSameTypeMap::descriptor() ->FindFieldByName("map1") ->message_type(); const Descriptor* map2 = unittest::TestSameTypeMap::descriptor() ->FindFieldByName("map2") ->message_type(); const Message* map1_entry = MessageFactory::generated_factory()->GetPrototype(map1); const Message* map2_entry = MessageFactory::generated_factory()->GetPrototype(map2); EXPECT_EQ(map1, map1_entry->GetDescriptor()); EXPECT_EQ(map2, map2_entry->GetDescriptor()); } TEST(GeneratedMapFieldTest, Proto2UnknownEnum) { unittest::TestEnumMapPlusExtra from; (*from.mutable_known_map_field())[0] = unittest::E_PROTO2_MAP_ENUM_FOO; (*from.mutable_unknown_map_field())[0] = unittest::E_PROTO2_MAP_ENUM_EXTRA; string data; from.SerializeToString(&data); unittest::TestEnumMap to; EXPECT_TRUE(to.ParseFromString(data)); EXPECT_EQ(0, to.unknown_map_field().size()); const UnknownFieldSet& unknown_field_set = to.GetReflection()->GetUnknownFields(to); EXPECT_EQ(1, unknown_field_set.field_count()); EXPECT_EQ(1, to.known_map_field().size()); EXPECT_EQ(unittest::PROTO2_MAP_ENUM_FOO, to.known_map_field().at(0)); data.clear(); from.Clear(); to.SerializeToString(&data); EXPECT_TRUE(from.ParseFromString(data)); EXPECT_EQ(0, from.GetReflection()->GetUnknownFields(from).field_count()); EXPECT_EQ(1, from.known_map_field().size()); EXPECT_EQ(unittest::E_PROTO2_MAP_ENUM_FOO, from.known_map_field().at(0)); EXPECT_EQ(1, from.unknown_map_field().size()); EXPECT_EQ(unittest::E_PROTO2_MAP_ENUM_EXTRA, from.unknown_map_field().at(0)); } TEST(GeneratedMapFieldTest, StandardWireFormat) { unittest::TestMap message; string data = "\x0A\x04\x08\x01\x10\x01"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(1, message.map_int32_int32().at(1)); } TEST(GeneratedMapFieldTest, UnorderedWireFormat) { unittest::TestMap message; // put value before key in wire format string data = "\x0A\x04\x10\x01\x08\x02"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(1, message.map_int32_int32().at(2)); } TEST(GeneratedMapFieldTest, DuplicatedKeyWireFormat) { unittest::TestMap message; // Two key fields in wire format string data = "\x0A\x06\x08\x01\x08\x02\x10\x01"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(1, message.map_int32_int32().at(2)); // A similar test, but with a map from int to a message type. // Again, we want to be sure that the "second one wins" when // there are two separate entries with the same key. const int key = 99; unittest::TestRequiredMessageMap map_message; unittest::TestRequired with_dummy4; with_dummy4.set_a(0); with_dummy4.set_b(0); with_dummy4.set_c(0); with_dummy4.set_dummy4(11); (*map_message.mutable_map_field())[key] = with_dummy4; string s = map_message.SerializeAsString(); unittest::TestRequired with_dummy5; with_dummy5.set_a(0); with_dummy5.set_b(0); with_dummy5.set_c(0); with_dummy5.set_dummy5(12); (*map_message.mutable_map_field())[key] = with_dummy5; string both = s + map_message.SerializeAsString(); // We don't expect a merge now. The "second one wins." ASSERT_TRUE(map_message.ParseFromString(both)); ASSERT_EQ(1, map_message.map_field().size()); ASSERT_EQ(1, map_message.map_field().count(key)); EXPECT_EQ(0, map_message.map_field().find(key)->second.a()); EXPECT_EQ(0, map_message.map_field().find(key)->second.b()); EXPECT_EQ(0, map_message.map_field().find(key)->second.c()); EXPECT_FALSE(map_message.map_field().find(key)->second.has_dummy4()); ASSERT_TRUE(map_message.map_field().find(key)->second.has_dummy5()); EXPECT_EQ(12, map_message.map_field().find(key)->second.dummy5()); } // Exhaustive combinations of keys, values, and junk in any order. // This re-tests some of the things tested above, but if it fails // it's more work to determine what went wrong, so it isn't necessarily // bad that we have the simpler tests too. TEST(GeneratedMapFieldTest, KeysValuesUnknownsWireFormat) { unittest::TestMap message; const int kMaxNumKeysAndValuesAndJunk = 4; const char kKeyTag = 0x08; const char kValueTag = 0x10; const char kJunkTag = 0x20; for (int items = 0; items <= kMaxNumKeysAndValuesAndJunk; items++) { string data = "\x0A"; // Encode length of what will follow. data.push_back(items * 2); static const int kBitsOfIPerItem = 4; static const int mask = (1 << kBitsOfIPerItem) - 1; // Each iteration of the following is a test. It uses i as bit vector // encoding the keys and values to put in the wire format. for (int i = 0; i < (1 << (items * kBitsOfIPerItem)); i++) { string wire_format = data; int expected_key = 0; int expected_value = 0; for (int k = i, j = 0; j < items; j++, k >>= kBitsOfIPerItem) { bool is_key = k & 0x1; bool is_value = !is_key && (k & 0x2); wire_format.push_back(is_key ? kKeyTag : is_value ? kValueTag : kJunkTag); char c = static_cast(k & mask) >> 2; // One char after the tag. wire_format.push_back(c); if (is_key) expected_key = static_cast(c); if (is_value) expected_value = static_cast(c); ASSERT_TRUE(message.ParseFromString(wire_format)); ASSERT_EQ(1, message.map_int32_int32().size()); ASSERT_EQ(expected_key, message.map_int32_int32().begin()->first); ASSERT_EQ(expected_value, message.map_int32_int32().begin()->second); } } } } TEST(GeneratedMapFieldTest, DuplicatedValueWireFormat) { unittest::TestMap message; // Two value fields in wire format string data = "\x0A\x06\x08\x01\x10\x01\x10\x02"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(2, message.map_int32_int32().at(1)); } TEST(GeneratedMapFieldTest, MissedKeyWireFormat) { unittest::TestMap message; // No key field in wire format string data = "\x0A\x02\x10\x01"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(1, message.map_int32_int32().at(0)); } TEST(GeneratedMapFieldTest, MissedValueWireFormat) { unittest::TestMap message; // No value field in wire format string data = "\x0A\x02\x08\x01"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(0, message.map_int32_int32().at(1)); } TEST(GeneratedMapFieldTest, MissedValueTextFormat) { unittest::TestMap message; // No value field in text format string text = "map_int32_foreign_message {\n" " key: 1234567890\n" "}"; EXPECT_TRUE(google::protobuf::TextFormat::ParseFromString(text, &message)); EXPECT_EQ(1, message.map_int32_foreign_message().size()); EXPECT_EQ(11, message.ByteSize()); } TEST(GeneratedMapFieldTest, UnknownFieldWireFormat) { unittest::TestMap message; // Unknown field in wire format string data = "\x0A\x06\x08\x02\x10\x03\x18\x01"; EXPECT_TRUE(message.ParseFromString(data)); EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(3, message.map_int32_int32().at(2)); } TEST(GeneratedMapFieldTest, CorruptedWireFormat) { unittest::TestMap message; // corrupted data in wire format string data = "\x0A\x06\x08\x02\x11\x03"; EXPECT_FALSE(message.ParseFromString(data)); } TEST(GeneratedMapFieldTest, IsInitialized) { unittest::TestRequiredMessageMap map_message; // Add an uninitialized message. (*map_message.mutable_map_field())[0]; EXPECT_FALSE(map_message.IsInitialized()); // Initialize uninitialized message (*map_message.mutable_map_field())[0].set_a(0); (*map_message.mutable_map_field())[0].set_b(0); (*map_message.mutable_map_field())[0].set_c(0); EXPECT_TRUE(map_message.IsInitialized()); } TEST(GeneratedMapFieldTest, MessagesMustMerge) { unittest::TestRequiredMessageMap map_message; unittest::TestRequired with_dummy4; with_dummy4.set_a(97); with_dummy4.set_b(0); with_dummy4.set_c(0); with_dummy4.set_dummy4(98); EXPECT_TRUE(with_dummy4.IsInitialized()); (*map_message.mutable_map_field())[0] = with_dummy4; EXPECT_TRUE(map_message.IsInitialized()); string s = map_message.SerializeAsString(); // Modify s so that there are two values in the entry for key 0. // The first will have no value for c. The second will have no value for a. // Those are required fields. Also, make some other little changes, to // ensure we are merging the two values (because they're messages). ASSERT_EQ(s.size() - 2, s[1]); // encoding of the length of what follows string encoded_val(s.data() + 4, s.data() + s.size()); // In s, change the encoding of c to an encoding of dummy32. s[s.size() - 3] -= 8; // Make encoded_val slightly different from what's in s. encoded_val[encoded_val.size() - 1] += 33; // Encode c = 33. for (int i = 0; i < encoded_val.size(); i++) { if (encoded_val[i] == 97) { // Encode b = 91 instead of a = 97. But this won't matter, because // we also encode b = 0 right after this. The point is to leave out // a required field, and make sure the parser doesn't complain, because // every required field is set after the merge of the two values. encoded_val[i - 1] += 16; encoded_val[i] = 91; } else if (encoded_val[i] == 98) { // Encode dummy5 = 99 instead of dummy4 = 98. encoded_val[i - 1] += 8; // The tag for dummy5 is 8 more. encoded_val[i]++; break; } } s += encoded_val; // Add the second message. s[1] += encoded_val.size(); // Adjust encoded size. // Test key then value then value. int key = 0; ASSERT_TRUE(map_message.ParseFromString(s)); ASSERT_EQ(1, map_message.map_field().size()); ASSERT_EQ(1, map_message.map_field().count(key)); EXPECT_EQ(97, map_message.map_field().find(key)->second.a()); EXPECT_EQ(0, map_message.map_field().find(key)->second.b()); EXPECT_EQ(33, map_message.map_field().find(key)->second.c()); EXPECT_EQ(98, map_message.map_field().find(key)->second.dummy4()); EXPECT_EQ(99, map_message.map_field().find(key)->second.dummy5()); // Test key then value then value then key. s.push_back(s[2]); // Copy the key's tag. key = 19; s.push_back(key); // Second key is 19 instead of 0. s[1] += 2; // Adjust encoded size. ASSERT_TRUE(map_message.ParseFromString(s)); ASSERT_EQ(1, map_message.map_field().size()); ASSERT_EQ(1, map_message.map_field().count(key)); EXPECT_EQ(97, map_message.map_field().find(key)->second.a()); EXPECT_EQ(0, map_message.map_field().find(key)->second.b()); EXPECT_EQ(33, map_message.map_field().find(key)->second.c()); EXPECT_EQ(98, map_message.map_field().find(key)->second.dummy4()); EXPECT_EQ(99, map_message.map_field().find(key)->second.dummy5()); } // Generated Message Reflection Test ================================ TEST(GeneratedMapFieldReflectionTest, SpaceUsed) { unittest::TestMap message; MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); reflection_tester.SetMapFieldsViaReflection(&message); EXPECT_LT(0, message.GetReflection()->SpaceUsed(message)); } TEST(GeneratedMapFieldReflectionTest, Accessors) { // Set every field to a unique value then go back and check all those // values. unittest::TestMap message; MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); reflection_tester.SetMapFieldsViaReflection(&message); MapTestUtil::ExpectMapFieldsSet(message); reflection_tester.ExpectMapFieldsSetViaReflection(message); reflection_tester.ExpectMapFieldsSetViaReflectionIterator(&message); reflection_tester.ModifyMapFieldsViaReflection(&message); MapTestUtil::ExpectMapFieldsModified(message); } TEST(GeneratedMapFieldReflectionTest, Swap) { unittest::TestMap message1; unittest::TestMap message2; MapTestUtil::SetMapFields(&message1); const Reflection* reflection = message1.GetReflection(); reflection->Swap(&message1, &message2); MapTestUtil::ExpectClear(message1); MapTestUtil::ExpectMapFieldsSet(message2); } TEST(GeneratedMapFieldReflectionTest, SwapWithBothSet) { unittest::TestMap message1; unittest::TestMap message2; MapTestUtil::SetMapFields(&message1); MapTestUtil::SetMapFields(&message2); MapTestUtil::ModifyMapFields(&message2); const Reflection* reflection = message1.GetReflection(); reflection->Swap(&message1, &message2); MapTestUtil::ExpectMapFieldsModified(message1); MapTestUtil::ExpectMapFieldsSet(message2); } TEST(GeneratedMapFieldReflectionTest, SwapFields) { unittest::TestMap message1; unittest::TestMap message2; MapTestUtil::SetMapFields(&message2); std::vector fields; const Reflection* reflection = message1.GetReflection(); reflection->ListFields(message2, &fields); reflection->SwapFields(&message1, &message2, fields); MapTestUtil::ExpectMapFieldsSet(message1); MapTestUtil::ExpectClear(message2); } TEST(GeneratedMapFieldReflectionTest, ClearField) { unittest::TestMap message; MapTestUtil::SetMapFields(&message); MapTestUtil::ExpectMapFieldsSet(message); MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); reflection_tester.ClearMapFieldsViaReflection(&message); reflection_tester.ExpectClearViaReflection(message); reflection_tester.ExpectClearViaReflectionIterator(&message); } TEST(GeneratedMapFieldReflectionTest, RemoveLast) { unittest::TestMap message; MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); MapTestUtil::SetMapFields(&message); MapTestUtil::ExpectMapsSize(message, 2); std::vector expected_entries = MapTestUtil::GetMapEntries(message, 0); reflection_tester.RemoveLastMapsViaReflection(&message); MapTestUtil::ExpectMapsSize(message, 1); std::vector remained_entries = MapTestUtil::GetMapEntries(message, 0); EXPECT_TRUE(expected_entries == remained_entries); } TEST(GeneratedMapFieldReflectionTest, ReleaseLast) { unittest::TestMap message; const Descriptor* descriptor = message.GetDescriptor(); MapReflectionTester reflection_tester(descriptor); MapTestUtil::SetMapFields(&message); MapTestUtil::ExpectMapsSize(message, 2); reflection_tester.ReleaseLastMapsViaReflection(&message); MapTestUtil::ExpectMapsSize(message, 1); // Now test that we actually release the right message. message.Clear(); MapTestUtil::SetMapFields(&message); MapTestUtil::ExpectMapsSize(message, 2); std::vector expect_last = MapTestUtil::GetMapEntries(message, 1); std::vector release_last = MapTestUtil::GetMapEntriesFromRelease(&message); MapTestUtil::ExpectMapsSize(message, 1); EXPECT_TRUE(expect_last == release_last); for (std::vector::iterator it = release_last.begin(); it != release_last.end(); ++it) { delete *it; } } TEST(GeneratedMapFieldReflectionTest, SwapElements) { unittest::TestMap message; MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); MapTestUtil::SetMapFields(&message); // Get pointers of map entries at their original position std::vector entries0 = MapTestUtil::GetMapEntries(message, 0); std::vector entries1 = MapTestUtil::GetMapEntries(message, 1); // Swap the first time. reflection_tester.SwapMapsViaReflection(&message); // Get pointer of map entry after swap once. std::vector entries0_once = MapTestUtil::GetMapEntries(message, 0); std::vector entries1_once = MapTestUtil::GetMapEntries(message, 1); // Test map entries are swapped. MapTestUtil::ExpectMapsSize(message, 2); EXPECT_TRUE(entries0 == entries1_once); EXPECT_TRUE(entries1 == entries0_once); // Swap the second time. reflection_tester.SwapMapsViaReflection(&message); // Get pointer of map entry after swap once. std::vector entries0_twice = MapTestUtil::GetMapEntries(message, 0); std::vector entries1_twice = MapTestUtil::GetMapEntries(message, 1); // Test map entries are swapped back. MapTestUtil::ExpectMapsSize(message, 2); EXPECT_TRUE(entries0 == entries0_twice); EXPECT_TRUE(entries1 == entries1_twice); } TEST(GeneratedMapFieldReflectionTest, MutableUnknownFields) { unittest::TestMap message; MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); reflection_tester.MutableUnknownFieldsOfMapFieldsViaReflection(&message); } TEST(GeneratedMapFieldReflectionTest, EmbedProto2Message) { unittest::TestMessageMap message; const FieldDescriptor* map_field = unittest::TestMessageMap::descriptor()->FindFieldByName( "map_int32_message"); const FieldDescriptor* value = map_field->message_type()->FindFieldByName("value"); Message* entry_message = message.GetReflection()->AddMessage(&message, map_field); EXPECT_EQ( &entry_message->GetReflection()->GetMessage(*entry_message, value), reinterpret_cast(&TestAllTypes::default_instance())); Message* proto2_message = entry_message->GetReflection()->MutableMessage(entry_message, value); EXPECT_EQ(unittest::TestAllTypes::descriptor(), proto2_message->GetDescriptor()); ASSERT_EQ(1, message.map_int32_message().size()); } TEST(GeneratedMapFieldReflectionTest, MergeFromClearMapEntry) { unittest::TestMap message; const FieldDescriptor* map_field = unittest::TestMap::descriptor()->FindFieldByName("map_int32_int32"); const FieldDescriptor* key = map_field->message_type()->FindFieldByName("key"); const FieldDescriptor* value = map_field->message_type()->FindFieldByName("value"); Message* entry_message1 = message.GetReflection()->AddMessage(&message, map_field); EXPECT_FALSE(entry_message1->GetReflection()->HasField(*entry_message1, key)); EXPECT_FALSE( entry_message1->GetReflection()->HasField(*entry_message1, value)); Message* entry_message2 = message.GetReflection()->AddMessage(&message, map_field); EXPECT_FALSE(entry_message2->GetReflection()->HasField(*entry_message2, key)); EXPECT_FALSE( entry_message2->GetReflection()->HasField(*entry_message2, value)); entry_message1->MergeFrom(*entry_message2); EXPECT_FALSE(entry_message1->GetReflection()->HasField(*entry_message1, key)); EXPECT_FALSE( entry_message1->GetReflection()->HasField(*entry_message1, value)); } TEST(GeneratedMapFieldReflectionTest, MapEntryClear) { unittest::TestMap message; MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); reflection_tester.MutableUnknownFieldsOfMapFieldsViaReflection(&message); } TEST(GeneratedMapFieldReflectionTest, Proto2MapEntryClear) { unittest::TestEnumMap message; const Descriptor* descriptor = message.GetDescriptor(); const FieldDescriptor* field_descriptor = descriptor->FindFieldByName("known_map_field"); const FieldDescriptor* value_descriptor = field_descriptor->message_type()->FindFieldByName("value"); Message* sub_message = message.GetReflection()->AddMessage(&message, field_descriptor); EXPECT_EQ(0, sub_message->GetReflection()->GetEnumValue(*sub_message, value_descriptor)); } // Map Reflection API Test ========================================= TEST(GeneratedMapFieldReflectionTest, SetViaMapReflection) { unittest::TestMap message; MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); reflection_tester.SetMapFieldsViaMapReflection(&message); reflection_tester.ExpectMapFieldsSetViaReflection(message); reflection_tester.ExpectMapFieldsSetViaReflectionIterator(&message); } // Dynamic Message Test ============================================= class MapFieldInDynamicMessageTest : public testing::Test { protected: const DescriptorPool* pool_; DynamicMessageFactory factory_; const Descriptor* map_descriptor_; const Descriptor* recursive_map_descriptor_; const Message* map_prototype_; MapFieldInDynamicMessageTest() : pool_(DescriptorPool::generated_pool()), factory_(pool_) {} virtual void SetUp() { map_descriptor_ = pool_->FindMessageTypeByName("protobuf_unittest.TestMap"); recursive_map_descriptor_ = pool_->FindMessageTypeByName("protobuf_unittest.TestRecursiveMapMessage"); ASSERT_TRUE(map_descriptor_ != NULL); ASSERT_TRUE(recursive_map_descriptor_ != NULL); map_prototype_ = factory_.GetPrototype(map_descriptor_); } }; TEST_F(MapFieldInDynamicMessageTest, MapIndependentOffsets) { // Check that all fields have independent offsets by setting each // one to a unique value then checking that they all still have those // unique values (i.e. they don't stomp each other). google::protobuf::scoped_ptr message(map_prototype_->New()); MapReflectionTester reflection_tester(map_descriptor_); reflection_tester.SetMapFieldsViaReflection(message.get()); reflection_tester.ExpectMapFieldsSetViaReflection(*message); } TEST_F(MapFieldInDynamicMessageTest, DynamicMapReflection) { // Check that map fields work properly. google::protobuf::scoped_ptr message(map_prototype_->New()); // Check set functions. MapReflectionTester reflection_tester(map_descriptor_); reflection_tester.SetMapFieldsViaMapReflection(message.get()); reflection_tester.ExpectMapFieldsSetViaReflection(*message); } TEST_F(MapFieldInDynamicMessageTest, MapSpaceUsed) { // Test that SpaceUsed() works properly // Since we share the implementation with generated messages, we don't need // to test very much here. Just make sure it appears to be working. google::protobuf::scoped_ptr message(map_prototype_->New()); MapReflectionTester reflection_tester(map_descriptor_); int initial_space_used = message->SpaceUsed(); reflection_tester.SetMapFieldsViaReflection(message.get()); EXPECT_LT(initial_space_used, message->SpaceUsed()); } TEST_F(MapFieldInDynamicMessageTest, RecursiveMap) { TestRecursiveMapMessage from; (*from.mutable_a())[""]; string data = from.SerializeAsString(); google::protobuf::scoped_ptr to( factory_.GetPrototype(recursive_map_descriptor_)->New()); ASSERT_TRUE(to->ParseFromString(data)); } TEST_F(MapFieldInDynamicMessageTest, MapValueReferernceValidAfterSerialize) { google::protobuf::scoped_ptr message(map_prototype_->New()); MapReflectionTester reflection_tester(map_descriptor_); reflection_tester.SetMapFieldsViaMapReflection(message.get()); // Get value reference before serialization, so that we know the value is from // map. MapKey map_key; MapValueRef map_val; map_key.SetInt32Value(0); reflection_tester.GetMapValueViaMapReflection( message.get(), "map_int32_foreign_message", map_key, &map_val); Message* submsg = map_val.MutableMessageValue(); // In previous implementation, calling SerializeToString will cause syncing // from map to repeated field, which will invalidate the submsg we previously // got. string data; message->SerializeToString(&data); const Reflection* submsg_reflection = submsg->GetReflection(); const Descriptor* submsg_desc = submsg->GetDescriptor(); const FieldDescriptor* submsg_field = submsg_desc->FindFieldByName("c"); submsg_reflection->SetInt32(submsg, submsg_field, 128); message->SerializeToString(&data); TestMap to; to.ParseFromString(data); EXPECT_EQ(128, to.map_int32_foreign_message().at(0).c()); } TEST_F(MapFieldInDynamicMessageTest, MapEntryReferernceValidAfterSerialize) { google::protobuf::scoped_ptr message(map_prototype_->New()); MapReflectionTester reflection_tester(map_descriptor_); reflection_tester.SetMapFieldsViaReflection(message.get()); // Get map entry before serialization, so that we know the it is from // repeated field. Message* map_entry = reflection_tester.GetMapEntryViaReflection( message.get(), "map_int32_foreign_message", 0); const Reflection* map_entry_reflection = map_entry->GetReflection(); const Descriptor* map_entry_desc = map_entry->GetDescriptor(); const FieldDescriptor* value_field = map_entry_desc->FindFieldByName("value"); Message* submsg = map_entry_reflection->MutableMessage(map_entry, value_field); // In previous implementation, calling SerializeToString will cause syncing // from repeated field to map, which will invalidate the map_entry we // previously got. string data; message->SerializeToString(&data); const Reflection* submsg_reflection = submsg->GetReflection(); const Descriptor* submsg_desc = submsg->GetDescriptor(); const FieldDescriptor* submsg_field = submsg_desc->FindFieldByName("c"); submsg_reflection->SetInt32(submsg, submsg_field, 128); message->SerializeToString(&data); TestMap to; to.ParseFromString(data); EXPECT_EQ(128, to.map_int32_foreign_message().at(0).c()); } // ReflectionOps Test =============================================== TEST(ReflectionOpsForMapFieldTest, MapSanityCheck) { unittest::TestMap message; MapTestUtil::SetMapFields(&message); MapTestUtil::ExpectMapFieldsSet(message); } TEST(ReflectionOpsForMapFieldTest, MapCopy) { unittest::TestMap message, message2; MapTestUtil::SetMapFields(&message); ReflectionOps::Copy(message, &message2); MapTestUtil::ExpectMapFieldsSet(message2); // Copying from self should be a no-op. ReflectionOps::Copy(message2, &message2); MapTestUtil::ExpectMapFieldsSet(message2); } TEST(ReflectionOpsForMapFieldTest, MergeMap) { // Note: Copy is implemented in terms of Merge() so technically the Copy // test already tested most of this. unittest::TestMap message, message2; MapTestUtil::SetMapFields(&message); ReflectionOps::Merge(message2, &message); MapTestUtil::ExpectMapFieldsSet(message); } TEST(ReflectionOpsForMapFieldTest, ClearMap) { unittest::TestMap message; MapTestUtil::SetMapFields(&message); ReflectionOps::Clear(&message); MapTestUtil::ExpectClear(message); } TEST(ReflectionOpsForMapFieldTest, MapDiscardUnknownFields) { unittest::TestMap message; MapTestUtil::SetMapFields(&message); // Set some unknown fields in message. message.GetReflection()->MutableUnknownFields(&message)-> AddVarint(123456, 654321); // Discard them. ReflectionOps::DiscardUnknownFields(&message); MapTestUtil::ExpectMapFieldsSet(message); EXPECT_EQ(0, message.GetReflection()-> GetUnknownFields(message).field_count()); } TEST(ReflectionOpsForMapFieldTest, IsInitialized) { unittest::TestRequiredMessageMap map_message; // Add an uninitialized message. (*map_message.mutable_map_field())[0]; EXPECT_FALSE(ReflectionOps::IsInitialized(map_message)); // Initialize uninitialized message (*map_message.mutable_map_field())[0].set_a(0); (*map_message.mutable_map_field())[0].set_b(0); (*map_message.mutable_map_field())[0].set_c(0); EXPECT_TRUE(ReflectionOps::IsInitialized(map_message)); } // Wire Format Test ================================================= TEST(WireFormatForMapFieldTest, ParseMap) { unittest::TestMap source, dest; string data; // Serialize using the generated code. MapTestUtil::SetMapFields(&source); source.SerializeToString(&data); // Parse using WireFormat. io::ArrayInputStream raw_input(data.data(), data.size()); io::CodedInputStream input(&raw_input); WireFormat::ParseAndMergePartial(&input, &dest); // Check. MapTestUtil::ExpectMapFieldsSet(dest); } TEST(WireFormatForMapFieldTest, MapByteSize) { unittest::TestMap message; MapTestUtil::SetMapFields(&message); EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message)); message.Clear(); EXPECT_EQ(0, message.ByteSize()); EXPECT_EQ(0, WireFormat::ByteSize(message)); } TEST(WireFormatForMapFieldTest, SerializeMap) { unittest::TestMap message; string generated_data; string dynamic_data; MapTestUtil::SetMapFields(&message); // Serialize using the generated code. { message.ByteSize(); io::StringOutputStream raw_output(&generated_data); io::CodedOutputStream output(&raw_output); message.SerializeWithCachedSizes(&output); ASSERT_FALSE(output.HadError()); } // Serialize using WireFormat. { io::StringOutputStream raw_output(&dynamic_data); io::CodedOutputStream output(&raw_output); int size = WireFormat::ByteSize(message); WireFormat::SerializeWithCachedSizes(message, size, &output); ASSERT_FALSE(output.HadError()); } // Should be the same. // Don't use EXPECT_EQ here because we're comparing raw binary data and // we really don't want it dumped to stdout on failure. EXPECT_TRUE(dynamic_data == generated_data); } TEST(WireFormatForMapFieldTest, SerializeMapDynamicMessage) { DynamicMessageFactory factory; google::protobuf::scoped_ptr dynamic_message; dynamic_message.reset( factory.GetPrototype(unittest::TestMap::descriptor())->New()); MapReflectionTester reflection_tester( unittest::TestMap::descriptor()); reflection_tester.SetMapFieldsViaReflection(dynamic_message.get()); reflection_tester.ExpectMapFieldsSetViaReflection(*dynamic_message); unittest::TestMap generated_message; MapTestUtil::SetMapFields(&generated_message); MapTestUtil::ExpectMapFieldsSet(generated_message); string generated_data; string dynamic_data; // Serialize. generated_message.SerializeToString(&generated_data); dynamic_message->SerializeToString(&dynamic_data); // Because map serialization doesn't guarantee order, we just compare // serialized size here. This is enough to tell dynamic message doesn't miss // anything in serialization. EXPECT_TRUE(dynamic_data.size() == generated_data.size()); } TEST(WireFormatForMapFieldTest, MapParseHelpers) { string data; { // Set up. protobuf_unittest::TestMap message; MapTestUtil::SetMapFields(&message); message.SerializeToString(&data); } { // Test ParseFromString. protobuf_unittest::TestMap message; EXPECT_TRUE(message.ParseFromString(data)); MapTestUtil::ExpectMapFieldsSet(message); } { // Test ParseFromIstream. protobuf_unittest::TestMap message; std::stringstream stream(data); EXPECT_TRUE(message.ParseFromIstream(&stream)); EXPECT_TRUE(stream.eof()); MapTestUtil::ExpectMapFieldsSet(message); } { // Test ParseFromBoundedZeroCopyStream. string data_with_junk(data); data_with_junk.append("some junk on the end"); io::ArrayInputStream stream(data_with_junk.data(), data_with_junk.size()); protobuf_unittest::TestMap message; EXPECT_TRUE(message.ParseFromBoundedZeroCopyStream(&stream, data.size())); MapTestUtil::ExpectMapFieldsSet(message); } { // Test that ParseFromBoundedZeroCopyStream fails (but doesn't crash) if // EOF is reached before the expected number of bytes. io::ArrayInputStream stream(data.data(), data.size()); protobuf_unittest::TestAllTypes message; EXPECT_FALSE( message.ParseFromBoundedZeroCopyStream(&stream, data.size() + 1)); } } // Deterministic Serialization Test ========================================== template static string DeterministicSerializationWithSerializePartialToCodedStream( const T& t) { const int size = t.ByteSize(); string result(size, '\0'); io::ArrayOutputStream array_stream(string_as_array(&result), size); io::CodedOutputStream output_stream(&array_stream); output_stream.SetSerializationDeterministic(true); t.SerializePartialToCodedStream(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); return result; } template static string DeterministicSerializationWithSerializeToCodedStream(const T& t) { const int size = t.ByteSize(); string result(size, '\0'); io::ArrayOutputStream array_stream(string_as_array(&result), size); io::CodedOutputStream output_stream(&array_stream); output_stream.SetSerializationDeterministic(true); t.SerializeToCodedStream(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); return result; } template static string DeterministicSerialization(const T& t) { const int size = t.ByteSize(); string result(size, '\0'); io::ArrayOutputStream array_stream(string_as_array(&result), size); io::CodedOutputStream output_stream(&array_stream); output_stream.SetSerializationDeterministic(true); t.SerializeWithCachedSizes(&output_stream); EXPECT_FALSE(output_stream.HadError()); EXPECT_EQ(size, output_stream.ByteCount()); EXPECT_EQ(result, DeterministicSerializationWithSerializeToCodedStream(t)); EXPECT_EQ(result, DeterministicSerializationWithSerializePartialToCodedStream(t)); return result; } // Helper to test the serialization of the first arg against a golden file. static void TestDeterministicSerialization(const protobuf_unittest::TestMaps& t, const string& filename) { string expected; GOOGLE_CHECK_OK(File::GetContents( TestSourceDir() + "/google/protobuf/testdata/" + filename, &expected, true)); const string actual = DeterministicSerialization(t); EXPECT_EQ(expected, actual); protobuf_unittest::TestMaps u; EXPECT_TRUE(u.ParseFromString(actual)); EXPECT_TRUE(google::protobuf::util::MessageDifferencer::Equals(u, t)); } // Helper for MapSerializationTest. Return a 7-bit ASCII string. static string ConstructKey(uint64 n) { string s(n % static_cast(9), '\0'); if (s.empty()) { return StrCat(n); } else { while (n != 0) { s[n % s.size()] = (n >> 10) & 0x7f; n /= 888; } return s; } } TEST(MapSerializationTest, Deterministic) { const int kIters = 25; protobuf_unittest::TestMaps t; protobuf_unittest::TestIntIntMap inner; (*inner.mutable_m())[0] = (*inner.mutable_m())[10] = (*inner.mutable_m())[-200] = 0; uint64 frog = 9; const uint64 multiplier = 0xa29cd16f; for (int i = 0; i < kIters; i++) { const int32 i32 = static_cast(frog & 0xffffffff); const uint32 u32 = static_cast(i32) * 91919; const int64 i64 = static_cast(frog); const uint64 u64 = frog * static_cast(187321); const bool b = i32 > 0; const string s = ConstructKey(frog); (*inner.mutable_m())[i] = i32; (*t.mutable_m_int32())[i32] = (*t.mutable_m_sint32())[i32] = (*t.mutable_m_sfixed32())[i32] = inner; (*t.mutable_m_uint32())[u32] = (*t.mutable_m_fixed32())[u32] = inner; (*t.mutable_m_int64())[i64] = (*t.mutable_m_sint64())[i64] = (*t.mutable_m_sfixed64())[i64] = inner; (*t.mutable_m_uint64())[u64] = (*t.mutable_m_fixed64())[u64] = inner; (*t.mutable_m_bool())[b] = inner; (*t.mutable_m_string())[s] = inner; (*t.mutable_m_string())[s + string(1 << (u32 % static_cast(9)), b)] = inner; inner.mutable_m()->erase(i); frog = frog * multiplier + i; frog ^= (frog >> 41); } TestDeterministicSerialization(t, "golden_message_maps"); } TEST(MapSerializationTest, DeterministicSubmessage) { protobuf_unittest::TestSubmessageMaps p; protobuf_unittest::TestMaps t; const string filename = "golden_message_maps"; string golden; GOOGLE_CHECK_OK(File::GetContents( TestSourceDir() + "/google/protobuf/testdata/" + filename, &golden, true)); t.ParseFromString(golden); *(p.mutable_m()) = t; std::vector v; // Use multiple attempts to increase the chance of a failure if something is // buggy. For example, each separate copy of a map might use a different // randomly-chosen hash function. const int kAttempts = 10; for (int i = 0; i < kAttempts; i++) { protobuf_unittest::TestSubmessageMaps q(p); ASSERT_EQ(DeterministicSerialization(q), DeterministicSerialization(p)); } } // Text Format Test ================================================= TEST(TextFormatMapTest, SerializeAndParse) { unittest::TestMap source; unittest::TestMap dest; MapTestUtil::SetMapFields(&source); string output; // Test compact ASCII TextFormat::Printer printer; printer.PrintToString(source, &output); TextFormat::Parser parser; EXPECT_TRUE(parser.ParseFromString(output, &dest)); MapTestUtil::ExpectMapFieldsSet(dest); } TEST(TextFormatMapTest, Sorted) { unittest::TestMap message; MapReflectionTester tester(message.GetDescriptor()); tester.SetMapFieldsViaReflection(&message); string expected_text; GOOGLE_CHECK_OK(File::GetContents( TestSourceDir() + "/google/protobuf/" "testdata/map_test_data.txt", &expected_text, true)); EXPECT_EQ(message.DebugString(), expected_text); // Test again on the reverse order. unittest::TestMap message2; tester.SetMapFieldsViaReflection(&message2); tester.SwapMapsViaReflection(&message2); EXPECT_EQ(message2.DebugString(), expected_text); } TEST(TextFormatMapTest, ParseCorruptedString) { string serialized_message; GOOGLE_CHECK_OK(File::GetContents( TestSourceDir() + "/google/protobuf/testdata/golden_message_maps", &serialized_message, true)); protobuf_unittest::TestMaps message; GOOGLE_CHECK(message.ParseFromString(serialized_message)); TestParseCorruptedString(message); TestParseCorruptedString(message); } // arena support ================================================= TEST(ArenaTest, ParsingAndSerializingNoHeapAllocation) { // Allocate a large initial block to avoid mallocs during hooked test. std::vector arena_block(128 * 1024); ArenaOptions options; options.initial_block = &arena_block[0]; options.initial_block_size = arena_block.size(); Arena arena(options); string data; data.reserve(128 * 1024); { // TODO(teboring): Enable no heap check when ArenaStringPtr is used in map. // NoHeapChecker no_heap; unittest::TestArenaMap* from = Arena::CreateMessage(&arena); MapTestUtil::SetArenaMapFields(from); from->SerializeToString(&data); unittest::TestArenaMap* to = Arena::CreateMessage(&arena); to->ParseFromString(data); MapTestUtil::ExpectArenaMapFieldsSet(*to); } } // Use text format parsing and serializing to test reflection api. TEST(ArenaTest, ReflectionInTextFormat) { Arena arena; string data; TextFormat::Printer printer; TextFormat::Parser parser; unittest::TestArenaMap* from = Arena::CreateMessage(&arena); unittest::TestArenaMap* to = Arena::CreateMessage(&arena); MapTestUtil::SetArenaMapFields(from); printer.PrintToString(*from, &data); EXPECT_TRUE(parser.ParseFromString(data, to)); MapTestUtil::ExpectArenaMapFieldsSet(*to); } // Make sure the memory allocated for string in map is deallocated. TEST(ArenaTest, StringMapNoLeak) { Arena arena; unittest::TestArenaMap* message = Arena::CreateMessage(&arena); string data; // String with length less than 16 will not be allocated from heap. int original_capacity = data.capacity(); while (data.capacity() <= original_capacity) { data.append("a"); } (*message->mutable_map_string_string())[data] = data; // We rely on heap checkers to detect memory leak for us. ASSERT_FALSE(message == NULL); } TEST(ArenaTest, IsInitialized) { // Allocate a large initial polluted block. std::vector arena_block(128 * 1024); std::fill(arena_block.begin(), arena_block.end(), '\xff'); ArenaOptions options; options.initial_block = &arena_block[0]; options.initial_block_size = arena_block.size(); Arena arena(options); unittest::TestArenaMap* message = Arena::CreateMessage(&arena); EXPECT_EQ(0, (*message->mutable_map_int32_int32())[0]); } #if LANG_CXX11 TEST(MoveTest, MoveConstructorWorks) { Map original_map; original_map[42].mutable_optional_nested_message()->set_bb(42); original_map[43].mutable_optional_nested_message()->set_bb(43); const auto* nested_msg42_ptr = &original_map[42].optional_nested_message(); const auto* nested_msg43_ptr = &original_map[43].optional_nested_message(); Map moved_to_map(std::move(original_map)); EXPECT_TRUE(original_map.empty()); EXPECT_EQ(2, moved_to_map.size()); EXPECT_EQ(42, moved_to_map[42].optional_nested_message().bb()); EXPECT_EQ(43, moved_to_map[43].optional_nested_message().bb()); // This test takes advantage of the fact that pointers are swapped, so there // should be pointer stability. EXPECT_EQ(nested_msg42_ptr, &moved_to_map[42].optional_nested_message()); EXPECT_EQ(nested_msg43_ptr, &moved_to_map[43].optional_nested_message()); } TEST(MoveTest, MoveAssignmentWorks) { Map original_map; original_map[42].mutable_optional_nested_message()->set_bb(42); original_map[43].mutable_optional_nested_message()->set_bb(43); const auto* nested_msg42_ptr = &original_map[42].optional_nested_message(); const auto* nested_msg43_ptr = &original_map[43].optional_nested_message(); Map moved_to_map = std::move(original_map); EXPECT_TRUE(original_map.empty()); EXPECT_EQ(2, moved_to_map.size()); EXPECT_EQ(42, moved_to_map[42].optional_nested_message().bb()); EXPECT_EQ(43, moved_to_map[43].optional_nested_message().bb()); // This test takes advantage of the fact that pointers are swapped, so there // should be pointer stability. EXPECT_EQ(nested_msg42_ptr, &moved_to_map[42].optional_nested_message()); EXPECT_EQ(nested_msg43_ptr, &moved_to_map[43].optional_nested_message()); } #endif } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_test_util.cc000066400000000000000000002305431334102242000304600ustar00rootroot00000000000000// 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 #include #include #include namespace google { namespace protobuf { void MapTestUtil::SetMapFields(unittest::TestMap* message) { MapTestUtilImpl::SetMapFields(message); } void MapTestUtil::SetArenaMapFields(unittest::TestArenaMap* message) { MapTestUtilImpl::SetArenaMapFields(message); } void MapTestUtil::SetMapFieldsInitialized(unittest::TestMap* message) { MapTestUtilImpl::SetMapFieldsInitialized(message); } void MapTestUtil::ModifyMapFields(unittest::TestMap* message) { MapTestUtilImpl::ModifyMapFields( message); } void MapTestUtil::ExpectClear(const unittest::TestMap& message) { MapTestUtilImpl::ExpectClear(message); } void MapTestUtil::ExpectMapFieldsSet(const unittest::TestMap& message) { MapTestUtilImpl::ExpectMapFieldsSet(message); } void MapTestUtil::ExpectArenaMapFieldsSet( const unittest::TestArenaMap& message) { MapTestUtilImpl::ExpectArenaMapFieldsSet< unittest::MapEnum, unittest::MAP_ENUM_BAR, unittest::MAP_ENUM_BAZ>( message); } void MapTestUtil::ExpectMapFieldsSetInitialized( const unittest::TestMap& message) { MapTestUtilImpl::ExpectMapFieldsSetInitialized( message); } void MapTestUtil::ExpectMapFieldsModified( const unittest::TestMap& message) { MapTestUtilImpl::ExpectMapFieldsModified< unittest::MapEnum, unittest::MAP_ENUM_BAR, unittest::MAP_ENUM_FOO>( message); } void MapTestUtil::ExpectMapsSize( const unittest::TestMap& message, int size) { const Descriptor* descriptor = message.GetDescriptor(); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_int32_int32"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_int64_int64"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_uint32_uint32"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_uint64_uint64"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_sint32_sint32"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_sint64_sint64"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_fixed32_fixed32"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_fixed64_fixed64"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_sfixed32_sfixed32"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_sfixed64_sfixed64"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_int32_float"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_int32_double"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_bool_bool"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_string_string"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_int32_bytes"))); EXPECT_EQ(size, message.GetReflection()->FieldSize( message, descriptor->FindFieldByName("map_int32_foreign_message"))); } std::vector MapTestUtil::GetMapEntries( const unittest::TestMap& message, int index) { const Descriptor* descriptor = message.GetDescriptor(); std::vector result; result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_int32_int32"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_int64_int64"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_uint32_uint32"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_uint64_uint64"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_sint32_sint32"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_sint64_sint64"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_fixed32_fixed32"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_fixed64_fixed64"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_sfixed32_sfixed32"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_sfixed64_sfixed64"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_int32_float"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_int32_double"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_bool_bool"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_string_string"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_int32_bytes"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_int32_enum"), index)); result.push_back(&message.GetReflection()->GetRepeatedMessage( message, descriptor->FindFieldByName("map_int32_foreign_message"), index)); return result; } std::vector MapTestUtil::GetMapEntriesFromRelease( unittest::TestMap* message) { const Descriptor* descriptor = message->GetDescriptor(); std::vector result; result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_int32_int32"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_int64_int64"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_uint32_uint32"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_uint64_uint64"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_sint32_sint32"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_sint64_sint64"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_fixed32_fixed32"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_fixed64_fixed64"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_sfixed32_sfixed32"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_sfixed64_sfixed64"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_int32_float"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_int32_double"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_bool_bool"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_string_string"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_int32_bytes"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_int32_enum"))); result.push_back(message->GetReflection()->ReleaseLast( message, descriptor->FindFieldByName("map_int32_foreign_message"))); return result; } MapReflectionTester::MapReflectionTester( const Descriptor* base_descriptor) : base_descriptor_(base_descriptor) { const DescriptorPool* pool = base_descriptor->file()->pool(); map_enum_foo_ = pool->FindEnumValueByName("protobuf_unittest.MAP_ENUM_FOO"); map_enum_bar_ = pool->FindEnumValueByName("protobuf_unittest.MAP_ENUM_BAR"); map_enum_baz_ = pool->FindEnumValueByName("protobuf_unittest.MAP_ENUM_BAZ"); foreign_c_ = pool->FindFieldByName( "protobuf_unittest.ForeignMessage.c"); map_int32_int32_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32Int32Entry.key"); map_int32_int32_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32Int32Entry.value"); map_int64_int64_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt64Int64Entry.key"); map_int64_int64_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt64Int64Entry.value"); map_uint32_uint32_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapUint32Uint32Entry.key"); map_uint32_uint32_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapUint32Uint32Entry.value"); map_uint64_uint64_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapUint64Uint64Entry.key"); map_uint64_uint64_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapUint64Uint64Entry.value"); map_sint32_sint32_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapSint32Sint32Entry.key"); map_sint32_sint32_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapSint32Sint32Entry.value"); map_sint64_sint64_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapSint64Sint64Entry.key"); map_sint64_sint64_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapSint64Sint64Entry.value"); map_fixed32_fixed32_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapFixed32Fixed32Entry.key"); map_fixed32_fixed32_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapFixed32Fixed32Entry.value"); map_fixed64_fixed64_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapFixed64Fixed64Entry.key"); map_fixed64_fixed64_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapFixed64Fixed64Entry.value"); map_sfixed32_sfixed32_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapSfixed32Sfixed32Entry.key"); map_sfixed32_sfixed32_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapSfixed32Sfixed32Entry.value"); map_sfixed64_sfixed64_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapSfixed64Sfixed64Entry.key"); map_sfixed64_sfixed64_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapSfixed64Sfixed64Entry.value"); map_int32_float_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32FloatEntry.key"); map_int32_float_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32FloatEntry.value"); map_int32_double_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32DoubleEntry.key"); map_int32_double_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32DoubleEntry.value"); map_bool_bool_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapBoolBoolEntry.key"); map_bool_bool_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapBoolBoolEntry.value"); map_string_string_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapStringStringEntry.key"); map_string_string_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapStringStringEntry.value"); map_int32_bytes_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32BytesEntry.key"); map_int32_bytes_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32BytesEntry.value"); map_int32_enum_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32EnumEntry.key"); map_int32_enum_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32EnumEntry.value"); map_int32_foreign_message_key_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32ForeignMessageEntry.key"); map_int32_foreign_message_val_ = pool->FindFieldByName( "protobuf_unittest.TestMap.MapInt32ForeignMessageEntry.value"); EXPECT_FALSE(map_enum_foo_ == NULL); EXPECT_FALSE(map_enum_bar_ == NULL); EXPECT_FALSE(map_enum_baz_ == NULL); EXPECT_FALSE(map_int32_int32_key_ == NULL); EXPECT_FALSE(map_int32_int32_val_ == NULL); EXPECT_FALSE(map_int64_int64_key_ == NULL); EXPECT_FALSE(map_int64_int64_val_ == NULL); EXPECT_FALSE(map_uint32_uint32_key_ == NULL); EXPECT_FALSE(map_uint32_uint32_val_ == NULL); EXPECT_FALSE(map_uint64_uint64_key_ == NULL); EXPECT_FALSE(map_uint64_uint64_val_ == NULL); EXPECT_FALSE(map_sint32_sint32_key_ == NULL); EXPECT_FALSE(map_sint32_sint32_val_ == NULL); EXPECT_FALSE(map_sint64_sint64_key_ == NULL); EXPECT_FALSE(map_sint64_sint64_val_ == NULL); EXPECT_FALSE(map_fixed32_fixed32_key_ == NULL); EXPECT_FALSE(map_fixed32_fixed32_val_ == NULL); EXPECT_FALSE(map_fixed64_fixed64_key_ == NULL); EXPECT_FALSE(map_fixed64_fixed64_val_ == NULL); EXPECT_FALSE(map_sfixed32_sfixed32_key_ == NULL); EXPECT_FALSE(map_sfixed32_sfixed32_val_ == NULL); EXPECT_FALSE(map_sfixed64_sfixed64_key_ == NULL); EXPECT_FALSE(map_sfixed64_sfixed64_val_ == NULL); EXPECT_FALSE(map_int32_float_key_ == NULL); EXPECT_FALSE(map_int32_float_val_ == NULL); EXPECT_FALSE(map_int32_double_key_ == NULL); EXPECT_FALSE(map_int32_double_val_ == NULL); EXPECT_FALSE(map_bool_bool_key_ == NULL); EXPECT_FALSE(map_bool_bool_val_ == NULL); EXPECT_FALSE(map_string_string_key_ == NULL); EXPECT_FALSE(map_string_string_val_ == NULL); EXPECT_FALSE(map_int32_bytes_key_ == NULL); EXPECT_FALSE(map_int32_bytes_val_ == NULL); EXPECT_FALSE(map_int32_enum_key_ == NULL); EXPECT_FALSE(map_int32_enum_val_ == NULL); EXPECT_FALSE(map_int32_foreign_message_key_ == NULL); EXPECT_FALSE(map_int32_foreign_message_val_ == NULL); } // Shorthand to get a FieldDescriptor for a field of unittest::TestMap. const FieldDescriptor* MapReflectionTester::F(const string& name) { const FieldDescriptor* result = NULL; result = base_descriptor_->FindFieldByName(name); GOOGLE_CHECK(result != NULL); return result; } void MapReflectionTester::SetMapFieldsViaReflection( Message* message) { const Reflection* reflection = message->GetReflection(); Message* sub_message = NULL; Message* sub_foreign_message = NULL; // Add first element. sub_message = reflection->AddMessage(message, F("map_int32_int32")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_int32_key_, 0); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_int32_val_, 0); sub_message = reflection->AddMessage(message, F("map_int64_int64")); sub_message->GetReflection() ->SetInt64(sub_message, map_int64_int64_key_, 0); sub_message->GetReflection() ->SetInt64(sub_message, map_int64_int64_val_, 0); sub_message = reflection->AddMessage(message, F("map_uint32_uint32")); sub_message->GetReflection() ->SetUInt32(sub_message, map_uint32_uint32_key_, 0); sub_message->GetReflection() ->SetUInt32(sub_message, map_uint32_uint32_val_, 0); sub_message = reflection->AddMessage(message, F("map_uint64_uint64")); sub_message->GetReflection() ->SetUInt64(sub_message, map_uint64_uint64_key_, 0); sub_message->GetReflection() ->SetUInt64(sub_message, map_uint64_uint64_val_, 0); sub_message = reflection->AddMessage(message, F("map_sint32_sint32")); sub_message->GetReflection() ->SetInt32(sub_message, map_sint32_sint32_key_, 0); sub_message->GetReflection() ->SetInt32(sub_message, map_sint32_sint32_val_, 0); sub_message = reflection->AddMessage(message, F("map_sint64_sint64")); sub_message->GetReflection() ->SetInt64(sub_message, map_sint64_sint64_key_, 0); sub_message->GetReflection() ->SetInt64(sub_message, map_sint64_sint64_val_, 0); sub_message = reflection->AddMessage(message, F("map_fixed32_fixed32")); sub_message->GetReflection() ->SetUInt32(sub_message, map_fixed32_fixed32_key_, 0); sub_message->GetReflection() ->SetUInt32(sub_message, map_fixed32_fixed32_val_, 0); sub_message = reflection->AddMessage(message, F("map_fixed64_fixed64")); sub_message->GetReflection() ->SetUInt64(sub_message, map_fixed64_fixed64_key_, 0); sub_message->GetReflection() ->SetUInt64(sub_message, map_fixed64_fixed64_val_, 0); sub_message = reflection->AddMessage(message, F("map_sfixed32_sfixed32")); sub_message->GetReflection() ->SetInt32(sub_message, map_sfixed32_sfixed32_key_, 0); sub_message->GetReflection() ->SetInt32(sub_message, map_sfixed32_sfixed32_val_, 0); sub_message = reflection->AddMessage(message, F("map_sfixed64_sfixed64")); sub_message->GetReflection() ->SetInt64(sub_message, map_sfixed64_sfixed64_key_, 0); sub_message->GetReflection() ->SetInt64(sub_message, map_sfixed64_sfixed64_val_, 0); sub_message = reflection->AddMessage(message, F("map_int32_float")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_float_key_, 0); sub_message->GetReflection() ->SetFloat(sub_message, map_int32_float_val_, 0.0); sub_message = reflection->AddMessage(message, F("map_int32_double")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_double_key_, 0); sub_message->GetReflection() ->SetDouble(sub_message, map_int32_double_val_, 0.0); sub_message = reflection->AddMessage(message, F("map_bool_bool")); sub_message->GetReflection() ->SetBool(sub_message, map_bool_bool_key_, false); sub_message->GetReflection() ->SetBool(sub_message, map_bool_bool_val_, false); sub_message = reflection->AddMessage(message, F("map_string_string")); sub_message->GetReflection() ->SetString(sub_message, map_string_string_key_, "0"); sub_message->GetReflection() ->SetString(sub_message, map_string_string_val_, "0"); sub_message = reflection->AddMessage(message, F("map_int32_bytes")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_bytes_key_, 0); sub_message->GetReflection() ->SetString(sub_message, map_int32_bytes_val_, "0"); sub_message = reflection->AddMessage(message, F("map_int32_enum")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_enum_key_, 0); sub_message->GetReflection() ->SetEnum(sub_message, map_int32_enum_val_, map_enum_bar_); sub_message = reflection ->AddMessage(message, F("map_int32_foreign_message")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_foreign_message_key_, 0); sub_foreign_message = sub_message->GetReflection()-> MutableMessage(sub_message, map_int32_foreign_message_val_, NULL); sub_foreign_message->GetReflection()-> SetInt32(sub_foreign_message, foreign_c_, 0); // Add second element sub_message = reflection->AddMessage(message, F("map_int32_int32")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_int32_key_, 1); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_int32_val_, 1); sub_message = reflection->AddMessage(message, F("map_int64_int64")); sub_message->GetReflection() ->SetInt64(sub_message, map_int64_int64_key_, 1); sub_message->GetReflection() ->SetInt64(sub_message, map_int64_int64_val_, 1); sub_message = reflection->AddMessage(message, F("map_uint32_uint32")); sub_message->GetReflection() ->SetUInt32(sub_message, map_uint32_uint32_key_, 1); sub_message->GetReflection() ->SetUInt32(sub_message, map_uint32_uint32_val_, 1); sub_message = reflection->AddMessage(message, F("map_uint64_uint64")); sub_message->GetReflection() ->SetUInt64(sub_message, map_uint64_uint64_key_, 1); sub_message->GetReflection() ->SetUInt64(sub_message, map_uint64_uint64_val_, 1); sub_message = reflection->AddMessage(message, F("map_sint32_sint32")); sub_message->GetReflection() ->SetInt32(sub_message, map_sint32_sint32_key_, 1); sub_message->GetReflection() ->SetInt32(sub_message, map_sint32_sint32_val_, 1); sub_message = reflection->AddMessage(message, F("map_sint64_sint64")); sub_message->GetReflection() ->SetInt64(sub_message, map_sint64_sint64_key_, 1); sub_message->GetReflection() ->SetInt64(sub_message, map_sint64_sint64_val_, 1); sub_message = reflection->AddMessage(message, F("map_fixed32_fixed32")); sub_message->GetReflection() ->SetUInt32(sub_message, map_fixed32_fixed32_key_, 1); sub_message->GetReflection() ->SetUInt32(sub_message, map_fixed32_fixed32_val_, 1); sub_message = reflection->AddMessage(message, F("map_fixed64_fixed64")); sub_message->GetReflection() ->SetUInt64(sub_message, map_fixed64_fixed64_key_, 1); sub_message->GetReflection() ->SetUInt64(sub_message, map_fixed64_fixed64_val_, 1); sub_message = reflection->AddMessage(message, F("map_sfixed32_sfixed32")); sub_message->GetReflection() ->SetInt32(sub_message, map_sfixed32_sfixed32_key_, 1); sub_message->GetReflection() ->SetInt32(sub_message, map_sfixed32_sfixed32_val_, 1); sub_message = reflection->AddMessage(message, F("map_sfixed64_sfixed64")); sub_message->GetReflection() ->SetInt64(sub_message, map_sfixed64_sfixed64_key_, 1); sub_message->GetReflection() ->SetInt64(sub_message, map_sfixed64_sfixed64_val_, 1); sub_message = reflection->AddMessage(message, F("map_int32_float")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_float_key_, 1); sub_message->GetReflection() ->SetFloat(sub_message, map_int32_float_val_, 1.0); sub_message = reflection->AddMessage(message, F("map_int32_double")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_double_key_, 1); sub_message->GetReflection() ->SetDouble(sub_message, map_int32_double_val_, 1.0); sub_message = reflection->AddMessage(message, F("map_bool_bool")); sub_message->GetReflection() ->SetBool(sub_message, map_bool_bool_key_, true); sub_message->GetReflection() ->SetBool(sub_message, map_bool_bool_val_, true); sub_message = reflection->AddMessage(message, F("map_string_string")); sub_message->GetReflection() ->SetString(sub_message, map_string_string_key_, "1"); sub_message->GetReflection() ->SetString(sub_message, map_string_string_val_, "1"); sub_message = reflection->AddMessage(message, F("map_int32_bytes")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_bytes_key_, 1); sub_message->GetReflection() ->SetString(sub_message, map_int32_bytes_val_, "1"); sub_message = reflection->AddMessage(message, F("map_int32_enum")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_enum_key_, 1); sub_message->GetReflection() ->SetEnum(sub_message, map_int32_enum_val_, map_enum_baz_); sub_message = reflection ->AddMessage(message, F("map_int32_foreign_message")); sub_message->GetReflection() ->SetInt32(sub_message, map_int32_foreign_message_key_, 1); sub_foreign_message = sub_message->GetReflection()-> MutableMessage(sub_message, map_int32_foreign_message_val_, NULL); sub_foreign_message->GetReflection()-> SetInt32(sub_foreign_message, foreign_c_, 1); } void MapReflectionTester::SetMapFieldsViaMapReflection( Message* message) { const Reflection* reflection = message->GetReflection(); Message* sub_foreign_message = NULL; MapValueRef map_val; // Add first element. MapKey map_key; map_key.SetInt32Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_int32_int32"), map_key, &map_val)); map_val.SetInt32Value(0); map_key.SetInt64Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_int64_int64"), map_key, &map_val)); map_val.SetInt64Value(0); map_key.SetUInt32Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_uint32_uint32"), map_key, &map_val)); map_val.SetUInt32Value(0); map_key.SetUInt64Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_uint64_uint64"), map_key, &map_val)); map_val.SetUInt64Value(0); map_key.SetInt32Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_sint32_sint32"), map_key, &map_val)); map_val.SetInt32Value(0); map_key.SetInt64Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_sint64_sint64"), map_key, &map_val)); map_val.SetInt64Value(0); map_key.SetUInt32Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_fixed32_fixed32"), map_key, &map_val)); map_val.SetUInt32Value(0); map_key.SetUInt64Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_fixed64_fixed64"), map_key, &map_val)); map_val.SetUInt64Value(0); map_key.SetInt32Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_sfixed32_sfixed32"), map_key, &map_val)); map_val.SetInt32Value(0); map_key.SetInt64Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_sfixed64_sfixed64"), map_key, &map_val)); map_val.SetInt64Value(0); map_key.SetInt32Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_int32_float"), map_key, &map_val)); map_val.SetFloatValue(0.0); map_key.SetInt32Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_int32_double"), map_key, &map_val)); map_val.SetDoubleValue(0.0); map_key.SetBoolValue(false); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_bool_bool"), map_key, &map_val)); map_val.SetBoolValue(false); map_key.SetStringValue("0"); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_string_string"), map_key, &map_val)); map_val.SetStringValue("0"); map_key.SetInt32Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_int32_bytes"), map_key, &map_val)); map_val.SetStringValue("0"); map_key.SetInt32Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_int32_enum"), map_key, &map_val)); map_val.SetEnumValue(map_enum_bar_->number()); map_key.SetInt32Value(0); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_int32_foreign_message"), map_key, &map_val)); sub_foreign_message = map_val.MutableMessageValue(); sub_foreign_message->GetReflection()->SetInt32( sub_foreign_message, foreign_c_, 0); // Add second element map_key.SetInt32Value(1); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_int32_int32"), map_key, &map_val)); map_val.SetInt32Value(1); EXPECT_FALSE(reflection->InsertOrLookupMapValue( message, F("map_int32_int32"), map_key, &map_val)); map_key.SetInt64Value(1); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_int64_int64"), map_key, &map_val)); map_val.SetInt64Value(1); EXPECT_FALSE(reflection->InsertOrLookupMapValue( message, F("map_int64_int64"), map_key, &map_val)); map_key.SetUInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_uint32_uint32"), map_key, &map_val); map_val.SetUInt32Value(1); map_key.SetUInt64Value(1); reflection->InsertOrLookupMapValue( message, F("map_uint64_uint64"), map_key, &map_val); map_val.SetUInt64Value(1); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_sint32_sint32"), map_key, &map_val); map_val.SetInt32Value(1); map_key.SetInt64Value(1); reflection->InsertOrLookupMapValue( message, F("map_sint64_sint64"), map_key, &map_val); map_val.SetInt64Value(1); map_key.SetUInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_fixed32_fixed32"), map_key, &map_val); map_val.SetUInt32Value(1); map_key.SetUInt64Value(1); reflection->InsertOrLookupMapValue( message, F("map_fixed64_fixed64"), map_key, &map_val); map_val.SetUInt64Value(1); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_sfixed32_sfixed32"), map_key, &map_val); map_val.SetInt32Value(1); map_key.SetInt64Value(1); reflection->InsertOrLookupMapValue( message, F("map_sfixed64_sfixed64"), map_key, &map_val); map_val.SetInt64Value(1); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_int32_float"), map_key, &map_val); map_val.SetFloatValue(1.0); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_int32_double"), map_key, &map_val); map_val.SetDoubleValue(1.0); map_key.SetBoolValue(true); reflection->InsertOrLookupMapValue( message, F("map_bool_bool"), map_key, &map_val); map_val.SetBoolValue(true); map_key.SetStringValue("1"); reflection->InsertOrLookupMapValue( message, F("map_string_string"), map_key, &map_val); map_val.SetStringValue("1"); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_int32_bytes"), map_key, &map_val); map_val.SetStringValue("1"); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_int32_enum"), map_key, &map_val); map_val.SetEnumValue(map_enum_baz_->number()); map_key.SetInt32Value(1); EXPECT_TRUE(reflection->InsertOrLookupMapValue( message, F("map_int32_foreign_message"), map_key, &map_val)); sub_foreign_message = map_val.MutableMessageValue(); sub_foreign_message->GetReflection()->SetInt32( sub_foreign_message, foreign_c_, 1); } void MapReflectionTester::GetMapValueViaMapReflection(Message* message, const string& field_name, const MapKey& map_key, MapValueRef* map_val) { const Reflection* reflection = message->GetReflection(); EXPECT_FALSE(reflection->InsertOrLookupMapValue(message, F(field_name), map_key, map_val)); } Message* MapReflectionTester::GetMapEntryViaReflection(Message* message, const string& field_name, int index) { const Reflection* reflection = message->GetReflection(); return reflection->MutableRepeatedMessage(message, F(field_name), index); } MapIterator MapReflectionTester::MapBegin(Message* message, const string& field_name) { const Reflection* reflection = message->GetReflection(); return reflection->MapBegin(message, F(field_name)); } MapIterator MapReflectionTester::MapEnd(Message* message, const string& field_name) { const Reflection* reflection = message->GetReflection(); return reflection->MapEnd(message, F(field_name)); } void MapReflectionTester::ClearMapFieldsViaReflection( Message* message) { const Reflection* reflection = message->GetReflection(); reflection->ClearField(message, F("map_int32_int32")); reflection->ClearField(message, F("map_int64_int64")); reflection->ClearField(message, F("map_uint32_uint32")); reflection->ClearField(message, F("map_uint64_uint64")); reflection->ClearField(message, F("map_sint32_sint32")); reflection->ClearField(message, F("map_sint64_sint64")); reflection->ClearField(message, F("map_fixed32_fixed32")); reflection->ClearField(message, F("map_fixed64_fixed64")); reflection->ClearField(message, F("map_sfixed32_sfixed32")); reflection->ClearField(message, F("map_sfixed64_sfixed64")); reflection->ClearField(message, F("map_int32_float")); reflection->ClearField(message, F("map_int32_double")); reflection->ClearField(message, F("map_bool_bool")); reflection->ClearField(message, F("map_string_string")); reflection->ClearField(message, F("map_int32_bytes")); reflection->ClearField(message, F("map_int32_enum")); reflection->ClearField(message, F("map_int32_foreign_message")); } void MapReflectionTester::ModifyMapFieldsViaReflection( Message* message) { const Reflection* reflection = message->GetReflection(); MapValueRef map_val; Message* sub_foreign_message; // Modify the second element MapKey map_key; map_key.SetInt32Value(1); EXPECT_FALSE(reflection->InsertOrLookupMapValue( message, F("map_int32_int32"), map_key, &map_val)); map_val.SetInt32Value(2); map_key.SetInt64Value(1); EXPECT_FALSE(reflection->InsertOrLookupMapValue( message, F("map_int64_int64"), map_key, &map_val)); map_val.SetInt64Value(2); map_key.SetUInt32Value(1); EXPECT_FALSE(reflection->InsertOrLookupMapValue( message, F("map_uint32_uint32"), map_key, &map_val)); map_val.SetUInt32Value(2); map_key.SetUInt64Value(1); reflection->InsertOrLookupMapValue( message, F("map_uint64_uint64"), map_key, &map_val); map_val.SetUInt64Value(2); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_sint32_sint32"), map_key, &map_val); map_val.SetInt32Value(2); map_key.SetInt64Value(1); reflection->InsertOrLookupMapValue( message, F("map_sint64_sint64"), map_key, &map_val); map_val.SetInt64Value(2); map_key.SetUInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_fixed32_fixed32"), map_key, &map_val); map_val.SetUInt32Value(2); map_key.SetUInt64Value(1); reflection->InsertOrLookupMapValue( message, F("map_fixed64_fixed64"), map_key, &map_val); map_val.SetUInt64Value(2); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_sfixed32_sfixed32"), map_key, &map_val); map_val.SetInt32Value(2); map_key.SetInt64Value(1); reflection->InsertOrLookupMapValue( message, F("map_sfixed64_sfixed64"), map_key, &map_val); map_val.SetInt64Value(2); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_int32_float"), map_key, &map_val); map_val.SetFloatValue(2.0); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_int32_double"), map_key, &map_val); map_val.SetDoubleValue(2.0); map_key.SetBoolValue(true); reflection->InsertOrLookupMapValue( message, F("map_bool_bool"), map_key, &map_val); map_val.SetBoolValue(false); map_key.SetStringValue("1"); reflection->InsertOrLookupMapValue( message, F("map_string_string"), map_key, &map_val); map_val.SetStringValue("2"); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_int32_bytes"), map_key, &map_val); map_val.SetStringValue("2"); map_key.SetInt32Value(1); reflection->InsertOrLookupMapValue( message, F("map_int32_enum"), map_key, &map_val); map_val.SetEnumValue(map_enum_foo_->number()); map_key.SetInt32Value(1); EXPECT_FALSE(reflection->InsertOrLookupMapValue( message, F("map_int32_foreign_message"), map_key, &map_val)); sub_foreign_message = map_val.MutableMessageValue(); sub_foreign_message->GetReflection()->SetInt32( sub_foreign_message, foreign_c_, 2); } void MapReflectionTester::RemoveLastMapsViaReflection( Message* message) { const Reflection* reflection = message->GetReflection(); std::vector output; reflection->ListFields(*message, &output); for (int i = 0; i < output.size(); ++i) { const FieldDescriptor* field = output[i]; if (!field->is_repeated()) continue; reflection->RemoveLast(message, field); } } void MapReflectionTester::ReleaseLastMapsViaReflection( Message* message) { const Reflection* reflection = message->GetReflection(); std::vector output; reflection->ListFields(*message, &output); for (int i = 0; i < output.size(); ++i) { const FieldDescriptor* field = output[i]; if (!field->is_repeated()) continue; if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) continue; Message* released = reflection->ReleaseLast(message, field); ASSERT_TRUE(released != NULL) << "ReleaseLast returned NULL for: " << field->name(); delete released; } } void MapReflectionTester::SwapMapsViaReflection(Message* message) { const Reflection* reflection = message->GetReflection(); std::vector output; reflection->ListFields(*message, &output); for (int i = 0; i < output.size(); ++i) { const FieldDescriptor* field = output[i]; if (!field->is_repeated()) continue; reflection->SwapElements(message, field, 0, 1); } } void MapReflectionTester:: MutableUnknownFieldsOfMapFieldsViaReflection(Message* message) { const Reflection* reflection = message->GetReflection(); Message* sub_message = NULL; sub_message = reflection->AddMessage(message, F("map_int32_int32")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_int64_int64")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_uint32_uint32")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_uint64_uint64")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_sint32_sint32")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_sint64_sint64")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_fixed32_fixed32")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_fixed64_fixed64")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_sfixed32_sfixed32")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_sfixed64_sfixed64")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_int32_float")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_int32_double")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_bool_bool")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_string_string")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_int32_bytes")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_int32_enum")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); sub_message = reflection->AddMessage(message, F("map_int32_foreign_message")); EXPECT_TRUE(sub_message->GetReflection()->MutableUnknownFields(sub_message) != NULL); } void MapReflectionTester::ExpectMapFieldsSetViaReflection( const Message& message) { string scratch; const Reflection* reflection = message.GetReflection(); const Message* sub_message; MapKey map_key; // ----------------------------------------------------------------- ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_int32"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_int64_int64"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_uint32_uint32"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_uint64_uint64"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_sint32_sint32"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_sint64_sint64"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_fixed32_fixed32"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_fixed64_fixed64"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_sfixed32_sfixed32"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_sfixed64_sfixed64"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_float"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_double"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_bool_bool"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_string_string"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_bytes"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_enum"))); ASSERT_EQ(2, reflection->FieldSize(message, F("map_int32_foreign_message"))); { std::map map; map[0] = 0; map[1] = 1; for (int i = 0; i < 2; i++) { // Check with RepeatedField Reflection sub_message = &reflection->GetRepeatedMessage(message, F("map_int32_int32"), i); int32 key = sub_message->GetReflection()->GetInt32( *sub_message, map_int32_int32_key_); int32 val = sub_message->GetReflection()->GetInt32( *sub_message, map_int32_int32_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetInt32Value(key); EXPECT_TRUE(reflection->ContainsMapKey( message, F("map_int32_int32"), map_key)); } } { std::map map; map[0] = 0; map[1] = 1; for (int i = 0; i < 2; i++) { // Check with RepeatedField Reflection sub_message = &reflection->GetRepeatedMessage(message, F("map_int64_int64"), i); int64 key = sub_message->GetReflection()->GetInt64( *sub_message, map_int64_int64_key_); int64 val = sub_message->GetReflection()->GetInt64( *sub_message, map_int64_int64_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetInt64Value(key); EXPECT_TRUE(reflection->ContainsMapKey( message, F("map_int64_int64"), map_key)); } } { std::map map; map[0] = 0; map[1] = 1; for (int i = 0; i < 2; i++) { // Check with RepeatedField Reflection sub_message = &reflection->GetRepeatedMessage(message, F("map_uint32_uint32"), i); uint32 key = sub_message->GetReflection()->GetUInt32( *sub_message, map_uint32_uint32_key_); uint32 val = sub_message->GetReflection()->GetUInt32( *sub_message, map_uint32_uint32_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetUInt32Value(key); EXPECT_TRUE(reflection->ContainsMapKey( message, F("map_uint32_uint32"), map_key)); } } { std::map map; map[0] = 0; map[1] = 1; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage(message, F("map_uint64_uint64"), i); uint64 key = sub_message->GetReflection()->GetUInt64( *sub_message, map_uint64_uint64_key_); uint64 val = sub_message->GetReflection()->GetUInt64( *sub_message, map_uint64_uint64_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetUInt64Value(key); EXPECT_TRUE(reflection->ContainsMapKey( message, F("map_uint64_uint64"), map_key)); } } { std::map map; map[0] = 0; map[1] = 1; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage(message, F("map_sint32_sint32"), i); int32 key = sub_message->GetReflection()->GetInt32( *sub_message, map_sint32_sint32_key_); int32 val = sub_message->GetReflection()->GetInt32( *sub_message, map_sint32_sint32_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetInt32Value(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_sint32_sint32"), map_key)); } } { std::map map; map[0] = 0; map[1] = 1; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage(message, F("map_sint64_sint64"), i); int64 key = sub_message->GetReflection()->GetInt64( *sub_message, map_sint64_sint64_key_); int64 val = sub_message->GetReflection()->GetInt64( *sub_message, map_sint64_sint64_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetInt64Value(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_sint64_sint64"), map_key)); } } { std::map map; map[0] = 0; map[1] = 1; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage(message, F("map_fixed32_fixed32"), i); uint32 key = sub_message->GetReflection()->GetUInt32( *sub_message, map_fixed32_fixed32_key_); uint32 val = sub_message->GetReflection()->GetUInt32( *sub_message, map_fixed32_fixed32_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetUInt32Value(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_fixed32_fixed32"), map_key)); } } { std::map map; map[0] = 0; map[1] = 1; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage(message, F("map_fixed64_fixed64"), i); uint64 key = sub_message->GetReflection()->GetUInt64( *sub_message, map_fixed64_fixed64_key_); uint64 val = sub_message->GetReflection()->GetUInt64( *sub_message, map_fixed64_fixed64_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetUInt64Value(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_fixed64_fixed64"), map_key)); } } { std::map map; map[0] = 0; map[1] = 1; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage( message, F("map_sfixed32_sfixed32"), i); int32 key = sub_message->GetReflection()->GetInt32( *sub_message, map_sfixed32_sfixed32_key_); int32 val = sub_message->GetReflection()->GetInt32( *sub_message, map_sfixed32_sfixed32_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetInt32Value(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_sfixed32_sfixed32"), map_key)); } } { std::map map; map[0] = 0; map[1] = 1; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage( message, F("map_sfixed64_sfixed64"), i); int64 key = sub_message->GetReflection()->GetInt64( *sub_message, map_sfixed64_sfixed64_key_); int64 val = sub_message->GetReflection()->GetInt64( *sub_message, map_sfixed64_sfixed64_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetInt64Value(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_sfixed64_sfixed64"), map_key)); } } { std::map map; map[0] = 0.0; map[1] = 1.0; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage(message, F("map_int32_float"), i); int32 key = sub_message->GetReflection()->GetInt32( *sub_message, map_int32_float_key_); float val = sub_message->GetReflection()->GetFloat( *sub_message, map_int32_float_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetInt32Value(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_int32_float"), map_key)); } } { std::map map; map[0] = 0.0; map[1] = 1.0; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage(message, F("map_int32_double"), i); int32 key = sub_message->GetReflection()->GetInt32( *sub_message, map_int32_double_key_); double val = sub_message->GetReflection()->GetDouble( *sub_message, map_int32_double_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetInt32Value(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_int32_double"), map_key)); } } { std::map map; map[false] = false; map[true] = true; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage(message, F("map_bool_bool"), i); bool key = sub_message->GetReflection()->GetBool( *sub_message, map_bool_bool_key_); bool val = sub_message->GetReflection()->GetBool( *sub_message, map_bool_bool_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetBoolValue(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_bool_bool"), map_key)); } } { std::map map; map["0"] = "0"; map["1"] = "1"; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage(message, F("map_string_string"), i); string key = sub_message->GetReflection()->GetString( *sub_message, map_string_string_key_); string val = sub_message->GetReflection()->GetString( *sub_message, map_string_string_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetStringValue(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_string_string"), map_key)); } } { std::map map; map[0] = "0"; map[1] = "1"; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage(message, F("map_int32_bytes"), i); int32 key = sub_message->GetReflection()->GetInt32( *sub_message, map_int32_bytes_key_); string val = sub_message->GetReflection()->GetString( *sub_message, map_int32_bytes_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetInt32Value(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_int32_bytes"), map_key)); } } { std::map map; map[0] = map_enum_bar_; map[1] = map_enum_baz_; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage( message, F("map_int32_enum"), i); int32 key = sub_message->GetReflection()->GetInt32( *sub_message, map_int32_enum_key_); const EnumValueDescriptor* val = sub_message->GetReflection()->GetEnum( *sub_message, map_int32_enum_val_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetInt32Value(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_int32_enum"), map_key)); } } { std::map map; map[0] = 0; map[1] = 1; for (int i = 0; i < 2; i++) { sub_message = &reflection->GetRepeatedMessage( message, F("map_int32_foreign_message"), i); int32 key = sub_message->GetReflection()->GetInt32( *sub_message, map_int32_foreign_message_key_); const Message& foreign_message = sub_message->GetReflection()->GetMessage( *sub_message, map_int32_foreign_message_val_); int32 val = foreign_message.GetReflection()->GetInt32( foreign_message, foreign_c_); EXPECT_EQ(map[key], val); // Check with Map Reflection map_key.SetInt32Value(key); EXPECT_EQ(true, reflection->ContainsMapKey( message, F("map_int32_foreign_message"), map_key)); } } } void MapReflectionTester::ExpectMapFieldsSetViaReflectionIterator( Message* message) { string scratch; string serialized; const Reflection* reflection = message->GetReflection(); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_int32"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int64_int64"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_uint32_uint32"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_uint64_uint64"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_sint32_sint32"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_sint64_sint64"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_fixed32_fixed32"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_fixed64_fixed64"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_sfixed32_sfixed32"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_sfixed64_sfixed64"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_float"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_double"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_bool_bool"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_string_string"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_bytes"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_enum"))); ASSERT_EQ(2, reflection->FieldSize(*message, F("map_int32_foreign_message"))); { std::map map; map[0] = 0; map[1] = 1; int size = 0; for (MapIterator iter = reflection->MapBegin(message, F("map_int32_int32")); iter != reflection->MapEnd(message, F("map_int32_int32")); ++iter, ++size) { // Check const methods do not invalidate map. message->DebugString(); message->ShortDebugString(); message->SerializeToString(&serialized); message->SpaceUsed(); message->ByteSize(); EXPECT_EQ(map[iter.GetKey().GetInt32Value()], iter.GetValueRef().GetInt32Value()); } EXPECT_EQ(size, 2); } { std::map map; map[0] = 0; map[1] = 1; for (MapIterator iter = reflection->MapBegin(message, F("map_int64_int64")); iter != reflection->MapEnd(message, F("map_int64_int64")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetInt64Value()], iter.GetValueRef().GetInt64Value()); } } { std::map map; map[0] = 0; map[1] = 1; for (MapIterator iter = reflection->MapBegin( message, F("map_uint32_uint32")); iter != reflection->MapEnd(message, F("map_uint32_uint32")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetUInt32Value()], iter.GetValueRef().GetUInt32Value()); } } { std::map map; map[0] = 0; map[1] = 1; for (MapIterator iter = reflection->MapBegin( message, F("map_uint64_uint64")); iter != reflection->MapEnd(message, F("map_uint64_uint64")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetUInt64Value()], iter.GetValueRef().GetUInt64Value()); } } { std::map map; map[0] = 0; map[1] = 1; for (MapIterator iter = reflection->MapBegin( message, F("map_sint32_sint32")); iter != reflection->MapEnd(message, F("map_sint32_sint32")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetInt32Value()], iter.GetValueRef().GetInt32Value()); } } { std::map map; map[0] = 0; map[1] = 1; for (MapIterator iter = reflection->MapBegin( message, F("map_sint64_sint64")); iter != reflection->MapEnd(message, F("map_sint64_sint64")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetInt64Value()], iter.GetValueRef().GetInt64Value()); } } { std::map map; map[0] = 0; map[1] = 1; for (MapIterator iter = reflection->MapBegin( message, F("map_fixed32_fixed32")); iter != reflection->MapEnd(message, F("map_fixed32_fixed32")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetUInt32Value()], iter.GetValueRef().GetUInt32Value()); } } { std::map map; map[0] = 0; map[1] = 1; for (MapIterator iter = reflection->MapBegin( message, F("map_fixed64_fixed64")); iter != reflection->MapEnd(message, F("map_fixed64_fixed64")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetUInt64Value()], iter.GetValueRef().GetUInt64Value()); } } { std::map map; map[0] = 0; map[1] = 1; for (MapIterator iter = reflection->MapBegin( message, F("map_sfixed32_sfixed32")); iter != reflection->MapEnd(message, F("map_sfixed32_sfixed32")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetInt32Value()], iter.GetValueRef().GetInt32Value()); } } { std::map map; map[0] = 0.0; map[1] = 1.0; for (MapIterator iter = reflection->MapBegin(message, F("map_int32_float")); iter != reflection->MapEnd(message, F("map_int32_float")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetInt32Value()], iter.GetValueRef().GetFloatValue()); } } { std::map map; map[0] = 0.0; map[1] = 1.0; for (MapIterator iter = reflection->MapBegin( message, F("map_int32_double")); iter != reflection->MapEnd(message, F("map_int32_double")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetInt32Value()], iter.GetValueRef().GetDoubleValue()); } } { std::map map; map[false] = false; map[true] = true; for (MapIterator iter = reflection->MapBegin(message, F("map_bool_bool")); iter != reflection->MapEnd(message, F("map_bool_bool")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetBoolValue()], iter.GetValueRef().GetBoolValue()); } } { std::map map; map["0"] = "0"; map["1"] = "1"; int size = 0; for (MapIterator iter = reflection->MapBegin( message, F("map_string_string")); iter != reflection->MapEnd(message, F("map_string_string")); ++iter, ++size) { // Check const methods do not invalidate map. message->DebugString(); message->ShortDebugString(); message->SerializeToString(&serialized); message->SpaceUsed(); message->ByteSize(); EXPECT_EQ(map[iter.GetKey().GetStringValue()], iter.GetValueRef().GetStringValue()); } EXPECT_EQ(size, 2); } { std::map map; map[0] = "0"; map[1] = "1"; for (MapIterator iter = reflection->MapBegin(message, F("map_int32_bytes")); iter != reflection->MapEnd(message, F("map_int32_bytes")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetInt32Value()], iter.GetValueRef().GetStringValue()); } } { std::map map; map[0] = map_enum_bar_; map[1] = map_enum_baz_; for (MapIterator iter = reflection->MapBegin(message, F("map_int32_enum")); iter != reflection->MapEnd(message, F("map_int32_enum")); ++iter) { EXPECT_EQ(map[iter.GetKey().GetInt32Value()]->number(), iter.GetValueRef().GetEnumValue()); } } { std::map map; map[0] = 0; map[1] = 1; int size = 0; for (MapIterator iter = reflection->MapBegin( message, F("map_int32_foreign_message")); iter != reflection->MapEnd(message, F("map_int32_foreign_message")); ++iter, ++size) { // Check const methods do not invalidate map. message->DebugString(); message->ShortDebugString(); message->SerializeToString(&serialized); message->SpaceUsed(); message->ByteSize(); const Message& sub_message = iter.GetValueRef().GetMessageValue(); EXPECT_EQ(map[iter.GetKey().GetInt32Value()], sub_message.GetReflection()->GetInt32(sub_message, foreign_c_)); } EXPECT_EQ(size, 2); } } void MapReflectionTester::ExpectClearViaReflection( const Message& message) { const Reflection* reflection = message.GetReflection(); // Map fields are empty. EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_int32"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_int64_int64"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_uint32_uint32"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_uint64_uint64"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_sint32_sint32"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_sint64_sint64"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_fixed32_fixed32"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_fixed64_fixed64"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_sfixed32_sfixed32"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_sfixed64_sfixed64"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_float"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_double"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_bool_bool"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_string_string"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_bytes"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_enum"))); EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_foreign_message"))); } void MapReflectionTester::ExpectClearViaReflectionIterator( Message* message) { const Reflection* reflection = message->GetReflection(); EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_int32")) == reflection->MapEnd(message, F("map_int32_int32"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_int64_int64")) == reflection->MapEnd(message, F("map_int64_int64"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_uint32_uint32")) == reflection->MapEnd(message, F("map_uint32_uint32"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_uint64_uint64")) == reflection->MapEnd(message, F("map_uint64_uint64"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_sint32_sint32")) == reflection->MapEnd(message, F("map_sint32_sint32"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_sint64_sint64")) == reflection->MapEnd(message, F("map_sint64_sint64"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_fixed32_fixed32")) == reflection->MapEnd(message, F("map_fixed32_fixed32"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_fixed64_fixed64")) == reflection->MapEnd(message, F("map_fixed64_fixed64"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_sfixed32_sfixed32")) == reflection->MapEnd(message, F("map_sfixed32_sfixed32"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_sfixed64_sfixed64")) == reflection->MapEnd(message, F("map_sfixed64_sfixed64"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_float")) == reflection->MapEnd(message, F("map_int32_float"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_double")) == reflection->MapEnd(message, F("map_int32_double"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_bool_bool")) == reflection->MapEnd(message, F("map_bool_bool"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_string_string")) == reflection->MapEnd(message, F("map_string_string"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_bytes")) == reflection->MapEnd(message, F("map_int32_bytes"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_enum")) == reflection->MapEnd(message, F("map_int32_enum"))); EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_foreign_message")) == reflection->MapEnd(message, F("map_int32_foreign_message"))); } void MapReflectionTester::ExpectMapEntryClearViaReflection( Message* message) { const Reflection* reflection = message->GetReflection(); const Message* sub_message; { const FieldDescriptor* descriptor = F("map_int32_int32"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_int32_int32")); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_int64_int64"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_int64_int64")); EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_uint32_uint32"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_uint32_uint32")); EXPECT_EQ(0, sub_message->GetReflection()->GetUInt32(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetUInt32(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_uint64_uint64"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_uint64_uint64")); EXPECT_EQ(0, sub_message->GetReflection()->GetUInt64(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetUInt64(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_sint32_sint32"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_sint32_sint32")); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_sint64_sint64"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_sint64_sint64")); EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_fixed32_fixed32"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_fixed32_fixed32")); EXPECT_EQ(0, sub_message->GetReflection()->GetUInt32(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetUInt32(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_fixed64_fixed64"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_fixed64_fixed64")); EXPECT_EQ(0, sub_message->GetReflection()->GetUInt64(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetUInt64(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_sfixed32_sfixed32"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_sfixed32_sfixed32")); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_sfixed64_sfixed64"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_sfixed64_sfixed64")); EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt64(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_int32_float"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_int32_float")); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetFloat(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_int32_double"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_int32_double")); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection()->GetDouble(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_bool_bool"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_bool_bool")); EXPECT_EQ(false, sub_message->GetReflection()->GetBool(*sub_message, key_descriptor)); EXPECT_EQ(false, sub_message->GetReflection()->GetBool(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_string_string"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_string_string")); EXPECT_EQ("", sub_message->GetReflection()->GetString(*sub_message, key_descriptor)); EXPECT_EQ("", sub_message->GetReflection()->GetString(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_int32_bytes"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_int32_bytes")); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, key_descriptor)); EXPECT_EQ("", sub_message->GetReflection()->GetString(*sub_message, value_descriptor)); } { const FieldDescriptor* descriptor = F("map_int32_enum"); const FieldDescriptor* key_descriptor = descriptor->message_type()->FindFieldByName("key"); const FieldDescriptor* value_descriptor = descriptor->message_type()->FindFieldByName("value"); sub_message = reflection->AddMessage(message, F("map_int32_enum")); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, key_descriptor)); EXPECT_EQ(0, sub_message->GetReflection() ->GetEnum(*sub_message, value_descriptor) ->number()); } // Map using message as value has been tested in other place. Thus, we don't // test it here. } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_test_util.h000066400000000000000000000162021334102242000303140ustar00rootroot00000000000000// 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_MAP_TEST_UTIL_H__ #define GOOGLE_PROTOBUF_MAP_TEST_UTIL_H__ #include namespace google { namespace protobuf { namespace unittest = ::protobuf_unittest; class MapTestUtil { public: // Set every field in the TestMap message to a unique value. static void SetMapFields(unittest::TestMap* message); // Set every field in the TestArenaMap message to a unique value. static void SetArenaMapFields(unittest::TestArenaMap* message); // Set every field in the message to a default value. static void SetMapFieldsInitialized(unittest::TestMap* message); // Modify all the map fields of the message (which should already have been // initialized with SetMapFields()). static void ModifyMapFields(unittest::TestMap* message); // Check that all fields have the values that they should have after // SetMapFields() is called. static void ExpectMapFieldsSet(const unittest::TestMap& message); // Check that all fields have the values that they should have after // SetMapFields() is called for TestArenaMap. static void ExpectArenaMapFieldsSet(const unittest::TestArenaMap& message); // Check that all fields have the values that they should have after // SetMapFieldsInitialized() is called. static void ExpectMapFieldsSetInitialized( const unittest::TestMap& message); // Expect that the message is modified as would be expected from // ModifyMapFields(). static void ExpectMapFieldsModified(const unittest::TestMap& message); // Check that all fields are empty. static void ExpectClear(const unittest::TestMap& message); // Check that all map fields have the given size. static void ExpectMapsSize(const unittest::TestMap& message, int size); // Get pointers of map entries at given index. static std::vector GetMapEntries( const unittest::TestMap& message, int index); // Get pointers of map entries from release. static std::vector GetMapEntriesFromRelease( unittest::TestMap* message); }; // Like above, but use the reflection interface. class MapReflectionTester { public: // base_descriptor must be a descriptor for TestMap, which is used for // MapReflectionTester to fetch the FieldDescriptors needed to use the // reflection interface. explicit MapReflectionTester(const Descriptor* base_descriptor); void SetMapFieldsViaReflection(Message* message); void SetMapFieldsViaMapReflection(Message* message); void ClearMapFieldsViaReflection(Message* message); void ModifyMapFieldsViaReflection(Message* message); void RemoveLastMapsViaReflection(Message* message); void ReleaseLastMapsViaReflection(Message* message); void SwapMapsViaReflection(Message* message); void MutableUnknownFieldsOfMapFieldsViaReflection(Message* message); void ExpectMapFieldsSetViaReflection(const Message& message); void ExpectMapFieldsSetViaReflectionIterator(Message* message); void ExpectClearViaReflection(const Message& message); void ExpectClearViaReflectionIterator(Message* message); void ExpectMapEntryClearViaReflection(Message* message); void GetMapValueViaMapReflection(Message* message, const string& field_name, const MapKey& map_key, MapValueRef* map_val); Message* GetMapEntryViaReflection(Message* message, const string& field_name, int index); MapIterator MapBegin(Message* message, const string& field_name); MapIterator MapEnd(Message* message, const string& field_name); private: const FieldDescriptor* F(const string& name); const Descriptor* base_descriptor_; const EnumValueDescriptor* map_enum_bar_; const EnumValueDescriptor* map_enum_baz_; const EnumValueDescriptor* map_enum_foo_; const FieldDescriptor* foreign_c_; const FieldDescriptor* map_int32_int32_key_; const FieldDescriptor* map_int32_int32_val_; const FieldDescriptor* map_int64_int64_key_; const FieldDescriptor* map_int64_int64_val_; const FieldDescriptor* map_uint32_uint32_key_; const FieldDescriptor* map_uint32_uint32_val_; const FieldDescriptor* map_uint64_uint64_key_; const FieldDescriptor* map_uint64_uint64_val_; const FieldDescriptor* map_sint32_sint32_key_; const FieldDescriptor* map_sint32_sint32_val_; const FieldDescriptor* map_sint64_sint64_key_; const FieldDescriptor* map_sint64_sint64_val_; const FieldDescriptor* map_fixed32_fixed32_key_; const FieldDescriptor* map_fixed32_fixed32_val_; const FieldDescriptor* map_fixed64_fixed64_key_; const FieldDescriptor* map_fixed64_fixed64_val_; const FieldDescriptor* map_sfixed32_sfixed32_key_; const FieldDescriptor* map_sfixed32_sfixed32_val_; const FieldDescriptor* map_sfixed64_sfixed64_key_; const FieldDescriptor* map_sfixed64_sfixed64_val_; const FieldDescriptor* map_int32_float_key_; const FieldDescriptor* map_int32_float_val_; const FieldDescriptor* map_int32_double_key_; const FieldDescriptor* map_int32_double_val_; const FieldDescriptor* map_bool_bool_key_; const FieldDescriptor* map_bool_bool_val_; const FieldDescriptor* map_string_string_key_; const FieldDescriptor* map_string_string_val_; const FieldDescriptor* map_int32_bytes_key_; const FieldDescriptor* map_int32_bytes_val_; const FieldDescriptor* map_int32_enum_key_; const FieldDescriptor* map_int32_enum_val_; const FieldDescriptor* map_int32_foreign_message_key_; const FieldDescriptor* map_int32_foreign_message_val_; }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_MAP_TEST_UTIL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_test_util_impl.h000066400000000000000000000543401334102242000313420ustar00rootroot00000000000000// 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_MAP_TEST_UTIL_IMPL_H__ #define GOOGLE_PROTOBUF_MAP_TEST_UTIL_IMPL_H__ #include #include #include namespace google { namespace protobuf_unittest {} // forward declaration namespace protobuf { namespace unittest = ::protobuf_unittest; class MapTestUtilImpl { public: // Set every field in the TestMap message to a unique value. template static void SetMapFields(MapMessage* message); // Set every field in the TestArenaMap message to a unique value. template static void SetArenaMapFields(MapMessage* message); // Set every field in the message to a default value. template static void SetMapFieldsInitialized(MapMessage* message); // Modify all the map fields of the message (which should already have been // initialized with SetMapFields()). template static void ModifyMapFields(MapMessage* message); // Check that all fields have the values that they should have after // SetMapFields() is called. template static void ExpectMapFieldsSet(const MapMessage& message); // Check that all fields have the values that they should have after // SetMapFields() is called for TestArenaMap. template static void ExpectArenaMapFieldsSet(const MapMessage& message); // Check that all fields have the values that they should have after // SetMapFieldsInitialized() is called. template static void ExpectMapFieldsSetInitialized(const MapMessage& message); // Expect that the message is modified as would be expected from // ModifyMapFields(). template static void ExpectMapFieldsModified(const MapMessage& message); // Check that all fields are empty. template static void ExpectClear(const MapMessage& message); // // Check that all map fields have the given size. // template // static void ExpectMapsSize(const MapMessage& message, int size); // // Get pointers of map entries at given index. // static std::vector GetMapEntries( // const MapMessage& message, int index); // // Get pointers of map entries from release. // static std::vector GetMapEntriesFromRelease( // MapMessage* message); }; template void MapTestUtilImpl::SetMapFields(MapMessage* message) { // Add first element. (*message->mutable_map_int32_int32())[0] = 0; (*message->mutable_map_int64_int64())[0] = 0; (*message->mutable_map_uint32_uint32())[0] = 0; (*message->mutable_map_uint64_uint64())[0] = 0; (*message->mutable_map_sint32_sint32())[0] = 0; (*message->mutable_map_sint64_sint64())[0] = 0; (*message->mutable_map_fixed32_fixed32())[0] = 0; (*message->mutable_map_fixed64_fixed64())[0] = 0; (*message->mutable_map_sfixed32_sfixed32())[0] = 0; (*message->mutable_map_sfixed64_sfixed64())[0] = 0; (*message->mutable_map_int32_float())[0] = 0.0; (*message->mutable_map_int32_double())[0] = 0.0; (*message->mutable_map_bool_bool())[0] = false; (*message->mutable_map_string_string())["0"] = "0"; (*message->mutable_map_int32_bytes())[0] = "0"; (*message->mutable_map_int32_enum())[0] = enum_value0; (*message->mutable_map_int32_foreign_message())[0].set_c(0); // Add second element (*message->mutable_map_int32_int32())[1] = 1; (*message->mutable_map_int64_int64())[1] = 1; (*message->mutable_map_uint32_uint32())[1] = 1; (*message->mutable_map_uint64_uint64())[1] = 1; (*message->mutable_map_sint32_sint32())[1] = 1; (*message->mutable_map_sint64_sint64())[1] = 1; (*message->mutable_map_fixed32_fixed32())[1] = 1; (*message->mutable_map_fixed64_fixed64())[1] = 1; (*message->mutable_map_sfixed32_sfixed32())[1] = 1; (*message->mutable_map_sfixed64_sfixed64())[1] = 1; (*message->mutable_map_int32_float())[1] = 1.0; (*message->mutable_map_int32_double())[1] = 1.0; (*message->mutable_map_bool_bool())[1] = true; (*message->mutable_map_string_string())["1"] = "1"; (*message->mutable_map_int32_bytes())[1] = "1"; (*message->mutable_map_int32_enum())[1] = enum_value1; (*message->mutable_map_int32_foreign_message())[1].set_c(1); } template void MapTestUtilImpl::SetArenaMapFields(MapMessage* message) { // Add first element. (*message->mutable_map_int32_int32())[0] = 0; (*message->mutable_map_int64_int64())[0] = 0; (*message->mutable_map_uint32_uint32())[0] = 0; (*message->mutable_map_uint64_uint64())[0] = 0; (*message->mutable_map_sint32_sint32())[0] = 0; (*message->mutable_map_sint64_sint64())[0] = 0; (*message->mutable_map_fixed32_fixed32())[0] = 0; (*message->mutable_map_fixed64_fixed64())[0] = 0; (*message->mutable_map_sfixed32_sfixed32())[0] = 0; (*message->mutable_map_sfixed64_sfixed64())[0] = 0; (*message->mutable_map_int32_float())[0] = 0.0; (*message->mutable_map_int32_double())[0] = 0.0; (*message->mutable_map_bool_bool())[0] = false; (*message->mutable_map_string_string())["0"] = "0"; (*message->mutable_map_int32_bytes())[0] = "0"; (*message->mutable_map_int32_enum())[0] = enum_value0; (*message->mutable_map_int32_foreign_message())[0].set_c(0); (*message->mutable_map_int32_foreign_message_no_arena())[0].set_c(0); // Add second element (*message->mutable_map_int32_int32())[1] = 1; (*message->mutable_map_int64_int64())[1] = 1; (*message->mutable_map_uint32_uint32())[1] = 1; (*message->mutable_map_uint64_uint64())[1] = 1; (*message->mutable_map_sint32_sint32())[1] = 1; (*message->mutable_map_sint64_sint64())[1] = 1; (*message->mutable_map_fixed32_fixed32())[1] = 1; (*message->mutable_map_fixed64_fixed64())[1] = 1; (*message->mutable_map_sfixed32_sfixed32())[1] = 1; (*message->mutable_map_sfixed64_sfixed64())[1] = 1; (*message->mutable_map_int32_float())[1] = 1.0; (*message->mutable_map_int32_double())[1] = 1.0; (*message->mutable_map_bool_bool())[1] = true; (*message->mutable_map_string_string())["1"] = "1"; (*message->mutable_map_int32_bytes())[1] = "1"; (*message->mutable_map_int32_enum())[1] = enum_value1; (*message->mutable_map_int32_foreign_message())[1].set_c(1); (*message->mutable_map_int32_foreign_message_no_arena())[1].set_c(1); } template void MapTestUtilImpl::SetMapFieldsInitialized(MapMessage* message) { // Add first element using bracket operator, which should assign default // value automatically. (*message->mutable_map_int32_int32())[0]; (*message->mutable_map_int64_int64())[0]; (*message->mutable_map_uint32_uint32())[0]; (*message->mutable_map_uint64_uint64())[0]; (*message->mutable_map_sint32_sint32())[0]; (*message->mutable_map_sint64_sint64())[0]; (*message->mutable_map_fixed32_fixed32())[0]; (*message->mutable_map_fixed64_fixed64())[0]; (*message->mutable_map_sfixed32_sfixed32())[0]; (*message->mutable_map_sfixed64_sfixed64())[0]; (*message->mutable_map_int32_float())[0]; (*message->mutable_map_int32_double())[0]; (*message->mutable_map_bool_bool())[0]; (*message->mutable_map_string_string())["0"]; (*message->mutable_map_int32_bytes())[0]; (*message->mutable_map_int32_enum())[0]; (*message->mutable_map_int32_foreign_message())[0]; } template void MapTestUtilImpl::ModifyMapFields(MapMessage* message) { (*message->mutable_map_int32_int32())[1] = 2; (*message->mutable_map_int64_int64())[1] = 2; (*message->mutable_map_uint32_uint32())[1] = 2; (*message->mutable_map_uint64_uint64())[1] = 2; (*message->mutable_map_sint32_sint32())[1] = 2; (*message->mutable_map_sint64_sint64())[1] = 2; (*message->mutable_map_fixed32_fixed32())[1] = 2; (*message->mutable_map_fixed64_fixed64())[1] = 2; (*message->mutable_map_sfixed32_sfixed32())[1] = 2; (*message->mutable_map_sfixed64_sfixed64())[1] = 2; (*message->mutable_map_int32_float())[1] = 2.0; (*message->mutable_map_int32_double())[1] = 2.0; (*message->mutable_map_bool_bool())[1] = false; (*message->mutable_map_string_string())["1"] = "2"; (*message->mutable_map_int32_bytes())[1] = "2"; (*message->mutable_map_int32_enum())[1] = enum_value; (*message->mutable_map_int32_foreign_message())[1].set_c(2); } template void MapTestUtilImpl::ExpectClear(const MapMessage& message) { EXPECT_EQ(0, message.map_int32_int32().size()); EXPECT_EQ(0, message.map_int64_int64().size()); EXPECT_EQ(0, message.map_uint32_uint32().size()); EXPECT_EQ(0, message.map_uint64_uint64().size()); EXPECT_EQ(0, message.map_sint32_sint32().size()); EXPECT_EQ(0, message.map_sint64_sint64().size()); EXPECT_EQ(0, message.map_fixed32_fixed32().size()); EXPECT_EQ(0, message.map_fixed64_fixed64().size()); EXPECT_EQ(0, message.map_sfixed32_sfixed32().size()); EXPECT_EQ(0, message.map_sfixed64_sfixed64().size()); EXPECT_EQ(0, message.map_int32_float().size()); EXPECT_EQ(0, message.map_int32_double().size()); EXPECT_EQ(0, message.map_bool_bool().size()); EXPECT_EQ(0, message.map_string_string().size()); EXPECT_EQ(0, message.map_int32_bytes().size()); EXPECT_EQ(0, message.map_int32_enum().size()); EXPECT_EQ(0, message.map_int32_foreign_message().size()); } template void MapTestUtilImpl::ExpectMapFieldsSet(const MapMessage& message) { ASSERT_EQ(2, message.map_int32_int32().size()); ASSERT_EQ(2, message.map_int64_int64().size()); ASSERT_EQ(2, message.map_uint32_uint32().size()); ASSERT_EQ(2, message.map_uint64_uint64().size()); ASSERT_EQ(2, message.map_sint32_sint32().size()); ASSERT_EQ(2, message.map_sint64_sint64().size()); ASSERT_EQ(2, message.map_fixed32_fixed32().size()); ASSERT_EQ(2, message.map_fixed64_fixed64().size()); ASSERT_EQ(2, message.map_sfixed32_sfixed32().size()); ASSERT_EQ(2, message.map_sfixed64_sfixed64().size()); ASSERT_EQ(2, message.map_int32_float().size()); ASSERT_EQ(2, message.map_int32_double().size()); ASSERT_EQ(2, message.map_bool_bool().size()); ASSERT_EQ(2, message.map_string_string().size()); ASSERT_EQ(2, message.map_int32_bytes().size()); ASSERT_EQ(2, message.map_int32_enum().size()); ASSERT_EQ(2, message.map_int32_foreign_message().size()); EXPECT_EQ(0, message.map_int32_int32().at(0)); EXPECT_EQ(0, message.map_int64_int64().at(0)); EXPECT_EQ(0, message.map_uint32_uint32().at(0)); EXPECT_EQ(0, message.map_uint64_uint64().at(0)); EXPECT_EQ(0, message.map_sint32_sint32().at(0)); EXPECT_EQ(0, message.map_sint64_sint64().at(0)); EXPECT_EQ(0, message.map_fixed32_fixed32().at(0)); EXPECT_EQ(0, message.map_fixed64_fixed64().at(0)); EXPECT_EQ(0, message.map_sfixed32_sfixed32().at(0)); EXPECT_EQ(0, message.map_sfixed64_sfixed64().at(0)); EXPECT_EQ(0, message.map_int32_float().at(0)); EXPECT_EQ(0, message.map_int32_double().at(0)); EXPECT_EQ(false, message.map_bool_bool().at(0)); EXPECT_EQ("0", message.map_string_string().at("0")); EXPECT_EQ("0", message.map_int32_bytes().at(0)); EXPECT_EQ(enum_value0, message.map_int32_enum().at(0)); EXPECT_EQ(0, message.map_int32_foreign_message().at(0).c()); EXPECT_EQ(1, message.map_int32_int32().at(1)); EXPECT_EQ(1, message.map_int64_int64().at(1)); EXPECT_EQ(1, message.map_uint32_uint32().at(1)); EXPECT_EQ(1, message.map_uint64_uint64().at(1)); EXPECT_EQ(1, message.map_sint32_sint32().at(1)); EXPECT_EQ(1, message.map_sint64_sint64().at(1)); EXPECT_EQ(1, message.map_fixed32_fixed32().at(1)); EXPECT_EQ(1, message.map_fixed64_fixed64().at(1)); EXPECT_EQ(1, message.map_sfixed32_sfixed32().at(1)); EXPECT_EQ(1, message.map_sfixed64_sfixed64().at(1)); EXPECT_EQ(1, message.map_int32_float().at(1)); EXPECT_EQ(1, message.map_int32_double().at(1)); EXPECT_EQ(true, message.map_bool_bool().at(1)); EXPECT_EQ("1", message.map_string_string().at("1")); EXPECT_EQ("1", message.map_int32_bytes().at(1)); EXPECT_EQ(enum_value1, message.map_int32_enum().at(1)); EXPECT_EQ(1, message.map_int32_foreign_message().at(1).c()); } template void MapTestUtilImpl::ExpectArenaMapFieldsSet(const MapMessage& message) { EXPECT_EQ(2, message.map_int32_int32().size()); EXPECT_EQ(2, message.map_int64_int64().size()); EXPECT_EQ(2, message.map_uint32_uint32().size()); EXPECT_EQ(2, message.map_uint64_uint64().size()); EXPECT_EQ(2, message.map_sint32_sint32().size()); EXPECT_EQ(2, message.map_sint64_sint64().size()); EXPECT_EQ(2, message.map_fixed32_fixed32().size()); EXPECT_EQ(2, message.map_fixed64_fixed64().size()); EXPECT_EQ(2, message.map_sfixed32_sfixed32().size()); EXPECT_EQ(2, message.map_sfixed64_sfixed64().size()); EXPECT_EQ(2, message.map_int32_float().size()); EXPECT_EQ(2, message.map_int32_double().size()); EXPECT_EQ(2, message.map_bool_bool().size()); EXPECT_EQ(2, message.map_string_string().size()); EXPECT_EQ(2, message.map_int32_bytes().size()); EXPECT_EQ(2, message.map_int32_enum().size()); EXPECT_EQ(2, message.map_int32_foreign_message().size()); EXPECT_EQ(2, message.map_int32_foreign_message_no_arena().size()); EXPECT_EQ(0, message.map_int32_int32().at(0)); EXPECT_EQ(0, message.map_int64_int64().at(0)); EXPECT_EQ(0, message.map_uint32_uint32().at(0)); EXPECT_EQ(0, message.map_uint64_uint64().at(0)); EXPECT_EQ(0, message.map_sint32_sint32().at(0)); EXPECT_EQ(0, message.map_sint64_sint64().at(0)); EXPECT_EQ(0, message.map_fixed32_fixed32().at(0)); EXPECT_EQ(0, message.map_fixed64_fixed64().at(0)); EXPECT_EQ(0, message.map_sfixed32_sfixed32().at(0)); EXPECT_EQ(0, message.map_sfixed64_sfixed64().at(0)); EXPECT_EQ(0, message.map_int32_float().at(0)); EXPECT_EQ(0, message.map_int32_double().at(0)); EXPECT_EQ(false, message.map_bool_bool().at(0)); EXPECT_EQ("0", message.map_string_string().at("0")); EXPECT_EQ("0", message.map_int32_bytes().at(0)); EXPECT_EQ(enum_value0, message.map_int32_enum().at(0)); EXPECT_EQ(0, message.map_int32_foreign_message().at(0).c()); EXPECT_EQ(0, message.map_int32_foreign_message_no_arena().at(0).c()); EXPECT_EQ(1, message.map_int32_int32().at(1)); EXPECT_EQ(1, message.map_int64_int64().at(1)); EXPECT_EQ(1, message.map_uint32_uint32().at(1)); EXPECT_EQ(1, message.map_uint64_uint64().at(1)); EXPECT_EQ(1, message.map_sint32_sint32().at(1)); EXPECT_EQ(1, message.map_sint64_sint64().at(1)); EXPECT_EQ(1, message.map_fixed32_fixed32().at(1)); EXPECT_EQ(1, message.map_fixed64_fixed64().at(1)); EXPECT_EQ(1, message.map_sfixed32_sfixed32().at(1)); EXPECT_EQ(1, message.map_sfixed64_sfixed64().at(1)); EXPECT_EQ(1, message.map_int32_float().at(1)); EXPECT_EQ(1, message.map_int32_double().at(1)); EXPECT_EQ(true, message.map_bool_bool().at(1)); EXPECT_EQ("1", message.map_string_string().at("1")); EXPECT_EQ("1", message.map_int32_bytes().at(1)); EXPECT_EQ(enum_value1, message.map_int32_enum().at(1)); EXPECT_EQ(1, message.map_int32_foreign_message().at(1).c()); EXPECT_EQ(1, message.map_int32_foreign_message_no_arena().at(1).c()); } template void MapTestUtilImpl::ExpectMapFieldsSetInitialized( const MapMessage& message) { EXPECT_EQ(1, message.map_int32_int32().size()); EXPECT_EQ(1, message.map_int64_int64().size()); EXPECT_EQ(1, message.map_uint32_uint32().size()); EXPECT_EQ(1, message.map_uint64_uint64().size()); EXPECT_EQ(1, message.map_sint32_sint32().size()); EXPECT_EQ(1, message.map_sint64_sint64().size()); EXPECT_EQ(1, message.map_fixed32_fixed32().size()); EXPECT_EQ(1, message.map_fixed64_fixed64().size()); EXPECT_EQ(1, message.map_sfixed32_sfixed32().size()); EXPECT_EQ(1, message.map_sfixed64_sfixed64().size()); EXPECT_EQ(1, message.map_int32_float().size()); EXPECT_EQ(1, message.map_int32_double().size()); EXPECT_EQ(1, message.map_bool_bool().size()); EXPECT_EQ(1, message.map_string_string().size()); EXPECT_EQ(1, message.map_int32_bytes().size()); EXPECT_EQ(1, message.map_int32_enum().size()); EXPECT_EQ(1, message.map_int32_foreign_message().size()); EXPECT_EQ(0, message.map_int32_int32().at(0)); EXPECT_EQ(0, message.map_int64_int64().at(0)); EXPECT_EQ(0, message.map_uint32_uint32().at(0)); EXPECT_EQ(0, message.map_uint64_uint64().at(0)); EXPECT_EQ(0, message.map_sint32_sint32().at(0)); EXPECT_EQ(0, message.map_sint64_sint64().at(0)); EXPECT_EQ(0, message.map_fixed32_fixed32().at(0)); EXPECT_EQ(0, message.map_fixed64_fixed64().at(0)); EXPECT_EQ(0, message.map_sfixed32_sfixed32().at(0)); EXPECT_EQ(0, message.map_sfixed64_sfixed64().at(0)); EXPECT_EQ(0, message.map_int32_float().at(0)); EXPECT_EQ(0, message.map_int32_double().at(0)); EXPECT_EQ(false, message.map_bool_bool().at(0)); EXPECT_EQ("", message.map_string_string().at("0")); EXPECT_EQ("", message.map_int32_bytes().at(0)); EXPECT_EQ(enum_value, message.map_int32_enum().at(0)); EXPECT_EQ(0, message.map_int32_foreign_message().at(0).ByteSize()); } template void MapTestUtilImpl::ExpectMapFieldsModified( const MapMessage& message) { // ModifyMapFields only sets the second element of each field. In addition to // verifying this, we also verify that the first element and size were *not* // modified. EXPECT_EQ(2, message.map_int32_int32().size()); EXPECT_EQ(2, message.map_int64_int64().size()); EXPECT_EQ(2, message.map_uint32_uint32().size()); EXPECT_EQ(2, message.map_uint64_uint64().size()); EXPECT_EQ(2, message.map_sint32_sint32().size()); EXPECT_EQ(2, message.map_sint64_sint64().size()); EXPECT_EQ(2, message.map_fixed32_fixed32().size()); EXPECT_EQ(2, message.map_fixed64_fixed64().size()); EXPECT_EQ(2, message.map_sfixed32_sfixed32().size()); EXPECT_EQ(2, message.map_sfixed64_sfixed64().size()); EXPECT_EQ(2, message.map_int32_float().size()); EXPECT_EQ(2, message.map_int32_double().size()); EXPECT_EQ(2, message.map_bool_bool().size()); EXPECT_EQ(2, message.map_string_string().size()); EXPECT_EQ(2, message.map_int32_bytes().size()); EXPECT_EQ(2, message.map_int32_enum().size()); EXPECT_EQ(2, message.map_int32_foreign_message().size()); EXPECT_EQ(0, message.map_int32_int32().at(0)); EXPECT_EQ(0, message.map_int64_int64().at(0)); EXPECT_EQ(0, message.map_uint32_uint32().at(0)); EXPECT_EQ(0, message.map_uint64_uint64().at(0)); EXPECT_EQ(0, message.map_sint32_sint32().at(0)); EXPECT_EQ(0, message.map_sint64_sint64().at(0)); EXPECT_EQ(0, message.map_fixed32_fixed32().at(0)); EXPECT_EQ(0, message.map_fixed64_fixed64().at(0)); EXPECT_EQ(0, message.map_sfixed32_sfixed32().at(0)); EXPECT_EQ(0, message.map_sfixed64_sfixed64().at(0)); EXPECT_EQ(0, message.map_int32_float().at(0)); EXPECT_EQ(0, message.map_int32_double().at(0)); EXPECT_EQ(false, message.map_bool_bool().at(0)); EXPECT_EQ("0", message.map_string_string().at("0")); EXPECT_EQ("0", message.map_int32_bytes().at(0)); EXPECT_EQ(enum_value0, message.map_int32_enum().at(0)); EXPECT_EQ(0, message.map_int32_foreign_message().at(0).c()); // Actually verify the second (modified) elements now. EXPECT_EQ(2, message.map_int32_int32().at(1)); EXPECT_EQ(2, message.map_int64_int64().at(1)); EXPECT_EQ(2, message.map_uint32_uint32().at(1)); EXPECT_EQ(2, message.map_uint64_uint64().at(1)); EXPECT_EQ(2, message.map_sint32_sint32().at(1)); EXPECT_EQ(2, message.map_sint64_sint64().at(1)); EXPECT_EQ(2, message.map_fixed32_fixed32().at(1)); EXPECT_EQ(2, message.map_fixed64_fixed64().at(1)); EXPECT_EQ(2, message.map_sfixed32_sfixed32().at(1)); EXPECT_EQ(2, message.map_sfixed64_sfixed64().at(1)); EXPECT_EQ(2, message.map_int32_float().at(1)); EXPECT_EQ(2, message.map_int32_double().at(1)); EXPECT_EQ(false, message.map_bool_bool().at(1)); EXPECT_EQ("2", message.map_string_string().at("1")); EXPECT_EQ("2", message.map_int32_bytes().at(1)); EXPECT_EQ(enum_value1, message.map_int32_enum().at(1)); EXPECT_EQ(2, message.map_int32_foreign_message().at(1).c()); } } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_MAP_TEST_UTIL_IMPL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_type_handler.h000066400000000000000000001117471334102242000307700ustar00rootroot00000000000000// 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_TYPE_HANDLER_H__ #define GOOGLE_PROTOBUF_TYPE_HANDLER_H__ #include #include namespace google { namespace protobuf { namespace internal { // Used for compile time type selection. MapIf::type will be TrueType if Flag is // true and FalseType otherwise. template struct MapIf; template struct MapIf { typedef TrueType type; }; template struct MapIf { typedef FalseType type; }; // In proto2 Map, enum needs to be initialized to given default value, while // other types' default value can be inferred from the type. template class MapValueInitializer { public: static inline void Initialize(Type& type, int default_enum_value); }; template class MapValueInitializer { public: static inline void Initialize(Type& value, int default_enum_value) { value = static_cast(default_enum_value); } }; template class MapValueInitializer { public: static inline void Initialize(Type& /* value */, int /* default_enum_value */) {} }; template class MapArenaMessageCreator { public: // Use arena to create message if Type is arena constructable. Otherwise, // create the message on heap. static inline Type* CreateMessage(Arena* arena); }; template class MapArenaMessageCreator { public: static inline Type* CreateMessage(Arena* arena) { return Arena::CreateMessage(arena); } }; template class MapArenaMessageCreator { public: static inline Type* CreateMessage(Arena* arena) { return Arena::Create(arena); } }; // Define constants for given wire field type template class MapWireFieldTypeTraits {}; #define TYPE_TRAITS(FieldType, CType, WireFormatType, IsMessage, IsEnum) \ template \ class MapWireFieldTypeTraits { \ public: \ static const bool kIsMessage = IsMessage; \ static const bool kIsEnum = IsEnum; \ typedef typename MapIf::type TypeOnMemory; \ typedef typename MapIf::type MapEntryAccessorType; \ static const WireFormatLite::WireType kWireType = \ WireFormatLite::WIRETYPE_##WireFormatType; \ }; TYPE_TRAITS(MESSAGE , Type, LENGTH_DELIMITED, true, false) TYPE_TRAITS(STRING , ArenaStringPtr, LENGTH_DELIMITED, false, false) TYPE_TRAITS(BYTES , ArenaStringPtr , LENGTH_DELIMITED, false, false) TYPE_TRAITS(INT64 , int64 , VARINT , false, false) TYPE_TRAITS(UINT64 , uint64 , VARINT , false, false) TYPE_TRAITS(INT32 , int32 , VARINT , false, false) TYPE_TRAITS(UINT32 , uint32 , VARINT , false, false) TYPE_TRAITS(SINT64 , int64 , VARINT , false, false) TYPE_TRAITS(SINT32 , int32 , VARINT , false, false) TYPE_TRAITS(ENUM , int , VARINT , false, true ) TYPE_TRAITS(DOUBLE , double , FIXED64, false, false) TYPE_TRAITS(FLOAT , float , FIXED32, false, false) TYPE_TRAITS(FIXED64 , uint64 , FIXED64, false, false) TYPE_TRAITS(FIXED32 , uint32 , FIXED32, false, false) TYPE_TRAITS(SFIXED64, int64 , FIXED64, false, false) TYPE_TRAITS(SFIXED32, int32 , FIXED32, false, false) TYPE_TRAITS(BOOL , bool , VARINT , false, false) #undef TYPE_TRAITS template class MapTypeHandler {}; template class MapTypeHandler { public: // Enum type cannot be used for MapTypeHandler::Read. Define a type which will // replace Enum with int. typedef typename MapWireFieldTypeTraits::MapEntryAccessorType MapEntryAccessorType; // Internal stored type in MapEntryLite for given wire field type. typedef typename MapWireFieldTypeTraits::TypeOnMemory TypeOnMemory; // Corresponding wire type for field type. static const WireFormatLite::WireType kWireType = MapWireFieldTypeTraits::kWireType; // Whether wire type is for message. static const bool kIsMessage = MapWireFieldTypeTraits::kIsMessage; // Whether wire type is for enum. static const bool kIsEnum = MapWireFieldTypeTraits::kIsEnum; // Functions used in parsing and serialization. =================== static inline size_t ByteSize(const MapEntryAccessorType& value); static inline int GetCachedSize(const MapEntryAccessorType& value); static inline bool Read(io::CodedInputStream* input, MapEntryAccessorType* value); static inline void Write(int field, const MapEntryAccessorType& value, io::CodedOutputStream* output); static inline uint8* InternalWriteToArray(int field, const MapEntryAccessorType& value, bool deterministic, uint8* target); static inline uint8* WriteToArray(int field, const MapEntryAccessorType& value, uint8* target); // Functions to manipulate data on memory. ======================== static inline const Type& GetExternalReference(const Type* value); static inline void DeleteNoArena(const Type* x); static inline void Merge(const Type& from, Type** to, Arena* arena); static inline void Clear(Type** value, Arena* arena); static inline void ClearMaybeByDefaultEnum(Type** value, Arena* arena, int default_enum_value); static inline void Initialize(Type** x, Arena* arena); static inline void InitializeMaybeByDefaultEnum(Type** x, int default_enum_value, Arena* arena); static inline Type* EnsureMutable(Type** value, Arena* arena); // SpaceUsedInMapEntry: Return bytes used by value in MapEntry, excluding // those already calculate in sizeof(MapField). static inline size_t SpaceUsedInMapEntryLong(const Type* value); // Return bytes used by value in Map. static inline size_t SpaceUsedInMapLong(const Type& value); // Assign default value to given instance. static inline void AssignDefaultValue(Type** value); // Return default instance if value is not initialized when calling const // reference accessor. static inline const Type& DefaultIfNotInitialized( const Type* value, const Type* default_value); // Check if all required fields have values set. static inline bool IsInitialized(Type* value); }; #define MAP_HANDLER(FieldType) \ template \ class MapTypeHandler { \ public: \ typedef typename MapWireFieldTypeTraits::MapEntryAccessorType \ MapEntryAccessorType; \ typedef typename MapWireFieldTypeTraits::TypeOnMemory TypeOnMemory; \ static const WireFormatLite::WireType kWireType = \ MapWireFieldTypeTraits::kWireType; \ static const bool kIsMessage = \ MapWireFieldTypeTraits::kIsMessage; \ static const bool kIsEnum = \ MapWireFieldTypeTraits::kIsEnum; \ static inline int ByteSize(const MapEntryAccessorType& value); \ static inline int GetCachedSize(const MapEntryAccessorType& value); \ static inline bool Read(io::CodedInputStream* input, \ MapEntryAccessorType* value); \ static inline void Write(int field, const MapEntryAccessorType& value, \ io::CodedOutputStream* output); \ static inline uint8* InternalWriteToArray( \ int field, const MapEntryAccessorType& value, bool deterministic, \ uint8* target); \ static inline uint8* WriteToArray(int field, \ const MapEntryAccessorType& value, \ uint8* target) { \ return InternalWriteToArray(field, value, false, target); \ } \ static inline const MapEntryAccessorType& GetExternalReference( \ const TypeOnMemory& value); \ static inline void DeleteNoArena(const TypeOnMemory& x); \ static inline void Merge(const MapEntryAccessorType& from, \ TypeOnMemory* to, Arena* arena); \ static inline void Clear(TypeOnMemory* value, Arena* arena); \ static inline void ClearMaybeByDefaultEnum(TypeOnMemory* value, \ Arena* arena, \ int default_enum); \ static inline size_t SpaceUsedInMapEntryLong(const TypeOnMemory& value); \ static inline size_t SpaceUsedInMapLong(const TypeOnMemory& value); \ static inline size_t SpaceUsedInMapLong(const string& value); \ static inline void AssignDefaultValue(TypeOnMemory* value); \ static inline const MapEntryAccessorType& DefaultIfNotInitialized( \ const TypeOnMemory& value, const TypeOnMemory& default_value); \ static inline bool IsInitialized(const TypeOnMemory& value); \ static void DeleteNoArena(TypeOnMemory& value); \ static inline void Initialize(TypeOnMemory* value, Arena* arena); \ static inline void InitializeMaybeByDefaultEnum(TypeOnMemory* value, \ int default_enum_value, \ Arena* arena); \ static inline MapEntryAccessorType* EnsureMutable(TypeOnMemory* value, \ Arena* arena); \ }; MAP_HANDLER(STRING) MAP_HANDLER(BYTES) MAP_HANDLER(INT64) MAP_HANDLER(UINT64) MAP_HANDLER(INT32) MAP_HANDLER(UINT32) MAP_HANDLER(SINT64) MAP_HANDLER(SINT32) MAP_HANDLER(ENUM) MAP_HANDLER(DOUBLE) MAP_HANDLER(FLOAT) MAP_HANDLER(FIXED64) MAP_HANDLER(FIXED32) MAP_HANDLER(SFIXED64) MAP_HANDLER(SFIXED32) MAP_HANDLER(BOOL) #undef MAP_HANDLER template inline size_t MapTypeHandler::ByteSize( const MapEntryAccessorType& value) { return WireFormatLite::MessageSizeNoVirtual(value); } #define GOOGLE_PROTOBUF_BYTE_SIZE(FieldType, DeclaredType) \ template \ inline int MapTypeHandler::ByteSize( \ const MapEntryAccessorType& value) { \ return static_cast(WireFormatLite::DeclaredType##Size(value)); \ } GOOGLE_PROTOBUF_BYTE_SIZE(STRING, String) GOOGLE_PROTOBUF_BYTE_SIZE(BYTES , Bytes) GOOGLE_PROTOBUF_BYTE_SIZE(INT64 , Int64) GOOGLE_PROTOBUF_BYTE_SIZE(UINT64, UInt64) GOOGLE_PROTOBUF_BYTE_SIZE(INT32 , Int32) GOOGLE_PROTOBUF_BYTE_SIZE(UINT32, UInt32) GOOGLE_PROTOBUF_BYTE_SIZE(SINT64, SInt64) GOOGLE_PROTOBUF_BYTE_SIZE(SINT32, SInt32) GOOGLE_PROTOBUF_BYTE_SIZE(ENUM , Enum) #undef GOOGLE_PROTOBUF_BYTE_SIZE #define FIXED_BYTE_SIZE(FieldType, DeclaredType) \ template \ inline int MapTypeHandler::ByteSize( \ const MapEntryAccessorType& /* value */) { \ return WireFormatLite::k##DeclaredType##Size; \ } FIXED_BYTE_SIZE(DOUBLE , Double) FIXED_BYTE_SIZE(FLOAT , Float) FIXED_BYTE_SIZE(FIXED64 , Fixed64) FIXED_BYTE_SIZE(FIXED32 , Fixed32) FIXED_BYTE_SIZE(SFIXED64, SFixed64) FIXED_BYTE_SIZE(SFIXED32, SFixed32) FIXED_BYTE_SIZE(BOOL , Bool) #undef FIXED_BYTE_SIZE template inline int MapTypeHandler::GetCachedSize( const MapEntryAccessorType& value) { return static_cast( WireFormatLite::LengthDelimitedSize( static_cast(value.GetCachedSize()))); } #define GET_CACHED_SIZE(FieldType, DeclaredType) \ template \ inline int \ MapTypeHandler::GetCachedSize( \ const MapEntryAccessorType& value) { \ return static_cast(WireFormatLite::DeclaredType##Size(value)); \ } GET_CACHED_SIZE(STRING, String) GET_CACHED_SIZE(BYTES , Bytes) GET_CACHED_SIZE(INT64 , Int64) GET_CACHED_SIZE(UINT64, UInt64) GET_CACHED_SIZE(INT32 , Int32) GET_CACHED_SIZE(UINT32, UInt32) GET_CACHED_SIZE(SINT64, SInt64) GET_CACHED_SIZE(SINT32, SInt32) GET_CACHED_SIZE(ENUM , Enum) #undef GET_CACHED_SIZE #define GET_FIXED_CACHED_SIZE(FieldType, DeclaredType) \ template \ inline int \ MapTypeHandler::GetCachedSize( \ const MapEntryAccessorType& /* value */) { \ return WireFormatLite::k##DeclaredType##Size; \ } GET_FIXED_CACHED_SIZE(DOUBLE , Double) GET_FIXED_CACHED_SIZE(FLOAT , Float) GET_FIXED_CACHED_SIZE(FIXED64 , Fixed64) GET_FIXED_CACHED_SIZE(FIXED32 , Fixed32) GET_FIXED_CACHED_SIZE(SFIXED64, SFixed64) GET_FIXED_CACHED_SIZE(SFIXED32, SFixed32) GET_FIXED_CACHED_SIZE(BOOL , Bool) #undef GET_FIXED_CACHED_SIZE template inline void MapTypeHandler::Write( int field, const MapEntryAccessorType& value, io::CodedOutputStream* output) { WireFormatLite::WriteMessageMaybeToArray(field, value, output); } template inline uint8* MapTypeHandler::InternalWriteToArray( int field, const MapEntryAccessorType& value, bool deterministic, uint8* target) { return WireFormatLite::InternalWriteMessageToArray(field, value, deterministic, target); } #define WRITE_METHOD(FieldType, DeclaredType) \ template \ inline void MapTypeHandler::Write( \ int field, const MapEntryAccessorType& value, \ io::CodedOutputStream* output) { \ return WireFormatLite::Write##DeclaredType(field, value, output); \ } \ template \ inline uint8* \ MapTypeHandler::InternalWriteToArray( \ int field, const MapEntryAccessorType& value, bool, uint8* target) { \ return WireFormatLite::Write##DeclaredType##ToArray(field, value, target); \ } WRITE_METHOD(STRING , String) WRITE_METHOD(BYTES , Bytes) WRITE_METHOD(INT64 , Int64) WRITE_METHOD(UINT64 , UInt64) WRITE_METHOD(INT32 , Int32) WRITE_METHOD(UINT32 , UInt32) WRITE_METHOD(SINT64 , SInt64) WRITE_METHOD(SINT32 , SInt32) WRITE_METHOD(ENUM , Enum) WRITE_METHOD(DOUBLE , Double) WRITE_METHOD(FLOAT , Float) WRITE_METHOD(FIXED64 , Fixed64) WRITE_METHOD(FIXED32 , Fixed32) WRITE_METHOD(SFIXED64, SFixed64) WRITE_METHOD(SFIXED32, SFixed32) WRITE_METHOD(BOOL , Bool) #undef WRITE_METHOD template inline bool MapTypeHandler::Read( io::CodedInputStream* input, MapEntryAccessorType* value) { return WireFormatLite::ReadMessageNoVirtual(input, value); } template inline bool MapTypeHandler::Read( io::CodedInputStream* input, MapEntryAccessorType* value) { return WireFormatLite::ReadString(input, value); } template inline bool MapTypeHandler::Read( io::CodedInputStream* input, MapEntryAccessorType* value) { return WireFormatLite::ReadBytes(input, value); } #define READ_METHOD(FieldType) \ template \ inline bool MapTypeHandler::Read( \ io::CodedInputStream* input, MapEntryAccessorType* value) { \ return WireFormatLite::ReadPrimitive( \ input, value); \ } READ_METHOD(INT64) READ_METHOD(UINT64) READ_METHOD(INT32) READ_METHOD(UINT32) READ_METHOD(SINT64) READ_METHOD(SINT32) READ_METHOD(ENUM) READ_METHOD(DOUBLE) READ_METHOD(FLOAT) READ_METHOD(FIXED64) READ_METHOD(FIXED32) READ_METHOD(SFIXED64) READ_METHOD(SFIXED32) READ_METHOD(BOOL) #undef READ_METHOD // Definition for message handler template inline const Type& MapTypeHandler::GetExternalReference(const Type* value) { return *value; } template inline size_t MapTypeHandler::SpaceUsedInMapEntryLong(const Type* value) { return value->SpaceUsedLong(); } template size_t MapTypeHandler::SpaceUsedInMapLong( const Type& value) { return value.SpaceUsedLong(); } template inline void MapTypeHandler::Clear( Type** value, Arena* /* arena */) { if (*value != NULL) (*value)->Clear(); } template inline void MapTypeHandler::ClearMaybeByDefaultEnum(Type** value, Arena* /* arena */, int /* default_enum_value */) { if (*value != NULL) (*value)->Clear(); } template inline void MapTypeHandler::Merge( const Type& from, Type** to, Arena* /* arena */) { (*to)->MergeFrom(from); } template void MapTypeHandler::DeleteNoArena( const Type* ptr) { delete ptr; } template inline void MapTypeHandler::AssignDefaultValue(Type** value) { *value = const_cast(Type::internal_default_instance()); } template inline void MapTypeHandler::Initialize(Type** x, Arena* /* arena */) { *x = NULL; } template inline void MapTypeHandler:: InitializeMaybeByDefaultEnum(Type** x, int /* default_enum_value */, Arena* /* arena */) { *x = NULL; } template inline Type* MapTypeHandler::EnsureMutable(Type** value, Arena* arena) { if (*value == NULL) { *value = MapArenaMessageCreator:: type::value>::CreateMessage(arena); } return *value; } template inline const Type& MapTypeHandler:: DefaultIfNotInitialized(const Type* value, const Type* default_value) { return value != NULL ? *value : *default_value; } template inline bool MapTypeHandler::IsInitialized(Type* value) { return value->IsInitialized(); } // Definition for string/bytes handler #define STRING_OR_BYTES_HANDLER_FUNCTIONS(FieldType) \ template \ inline const typename MapTypeHandler::MapEntryAccessorType& \ MapTypeHandler::GetExternalReference(const TypeOnMemory& value) { \ return value.Get(); \ } \ template \ inline size_t \ MapTypeHandler::SpaceUsedInMapEntryLong(const TypeOnMemory& value) { \ return sizeof(value); \ } \ template \ inline size_t \ MapTypeHandler::SpaceUsedInMapLong( \ const TypeOnMemory& value) { \ return sizeof(value); \ } \ template \ inline size_t \ MapTypeHandler::SpaceUsedInMapLong( \ const string& value) { \ return sizeof(value); \ } \ template \ inline void MapTypeHandler::Clear( \ TypeOnMemory* value, Arena* arena) { \ value->ClearToEmpty(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), \ arena); \ } \ template \ inline void MapTypeHandler:: \ ClearMaybeByDefaultEnum(TypeOnMemory* value, Arena* arena, \ int /* default_enum */) { \ Clear(value, arena); \ } \ template \ inline void MapTypeHandler::Merge( \ const MapEntryAccessorType& from, TypeOnMemory* to, Arena* arena) { \ to->Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from, arena); \ } \ template \ void MapTypeHandler::DeleteNoArena( \ TypeOnMemory& value) { \ value.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); \ } \ template \ inline void MapTypeHandler::AssignDefaultValue(TypeOnMemory* /* value */) {} \ template \ inline void \ MapTypeHandler::Initialize( \ TypeOnMemory* value, Arena* /* arena */) { \ value->UnsafeSetDefault( \ &::google::protobuf::internal::GetEmptyStringAlreadyInited()); \ } \ template \ inline void MapTypeHandler:: \ InitializeMaybeByDefaultEnum(TypeOnMemory* value, \ int /* default_enum_value */, \ Arena* arena) { \ Initialize(value, arena); \ } \ template \ inline typename MapTypeHandler::MapEntryAccessorType* \ MapTypeHandler::EnsureMutable( \ TypeOnMemory* value, Arena* arena) { \ return value->Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), \ arena); \ } \ template \ inline const typename MapTypeHandler::MapEntryAccessorType& \ MapTypeHandler::DefaultIfNotInitialized(const TypeOnMemory& value, \ const TypeOnMemory& \ /* default_value */) { \ return value.Get(); \ } \ template \ inline bool MapTypeHandler::IsInitialized(const TypeOnMemory& /* value */) { \ return true; \ } STRING_OR_BYTES_HANDLER_FUNCTIONS(STRING) STRING_OR_BYTES_HANDLER_FUNCTIONS(BYTES) #undef STRING_OR_BYTES_HANDLER_FUNCTIONS #define PRIMITIVE_HANDLER_FUNCTIONS(FieldType) \ template \ inline const typename MapTypeHandler::MapEntryAccessorType& \ MapTypeHandler::GetExternalReference(const TypeOnMemory& value) { \ return value; \ } \ template \ inline size_t \ MapTypeHandler::SpaceUsedInMapEntryLong(const TypeOnMemory& /* value */) { \ return 0; \ } \ template \ inline size_t \ MapTypeHandler::SpaceUsedInMapLong( \ const TypeOnMemory& /* value */) { \ return sizeof(Type); \ } \ template \ inline void MapTypeHandler::Clear( \ TypeOnMemory* value, Arena* /* arena */) { \ *value = 0; \ } \ template \ inline void MapTypeHandler:: \ ClearMaybeByDefaultEnum(TypeOnMemory* value, Arena* /* arena */, \ int default_enum_value) { \ *value = static_cast(default_enum_value); \ } \ template \ inline void MapTypeHandler::Merge( \ const MapEntryAccessorType& from, TypeOnMemory* to, \ Arena* /* arena */) { \ *to = from; \ } \ template \ inline void MapTypeHandler::DeleteNoArena(TypeOnMemory& /* x */) {} \ template \ inline void MapTypeHandler::AssignDefaultValue(TypeOnMemory* /* value */) {} \ template \ inline void \ MapTypeHandler::Initialize( \ TypeOnMemory* value, Arena* /* arena */) { \ *value = 0; \ } \ template \ inline void MapTypeHandler:: \ InitializeMaybeByDefaultEnum(TypeOnMemory* value, \ int default_enum_value, \ Arena* /* arena */) { \ *value = static_cast(default_enum_value); \ } \ template \ inline typename MapTypeHandler::MapEntryAccessorType* \ MapTypeHandler::EnsureMutable( \ TypeOnMemory* value, Arena* /* arena */) { \ return value; \ } \ template \ inline const typename MapTypeHandler::MapEntryAccessorType& \ MapTypeHandler::DefaultIfNotInitialized(const TypeOnMemory& value, \ const TypeOnMemory& \ /* default_value */) { \ return value; \ } \ template \ inline bool MapTypeHandler::IsInitialized(const TypeOnMemory& /* value */) { \ return true; \ } PRIMITIVE_HANDLER_FUNCTIONS(INT64) PRIMITIVE_HANDLER_FUNCTIONS(UINT64) PRIMITIVE_HANDLER_FUNCTIONS(INT32) PRIMITIVE_HANDLER_FUNCTIONS(UINT32) PRIMITIVE_HANDLER_FUNCTIONS(SINT64) PRIMITIVE_HANDLER_FUNCTIONS(SINT32) PRIMITIVE_HANDLER_FUNCTIONS(ENUM) PRIMITIVE_HANDLER_FUNCTIONS(DOUBLE) PRIMITIVE_HANDLER_FUNCTIONS(FLOAT) PRIMITIVE_HANDLER_FUNCTIONS(FIXED64) PRIMITIVE_HANDLER_FUNCTIONS(FIXED32) PRIMITIVE_HANDLER_FUNCTIONS(SFIXED64) PRIMITIVE_HANDLER_FUNCTIONS(SFIXED32) PRIMITIVE_HANDLER_FUNCTIONS(BOOL) #undef PRIMITIVE_HANDLER_FUNCTIONS } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_TYPE_HANDLER_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_unittest.proto000066400000000000000000000120011334102242000310640ustar00rootroot00000000000000// 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"; option cc_enable_arenas = true; import "google/protobuf/unittest.proto"; import "google/protobuf/unittest_no_arena.proto"; // We don't put this in a package within proto2 because we need to make sure // that the generated code doesn't depend on being in the proto2 namespace. // In map_test_util.h we do "using namespace unittest = protobuf_unittest". package protobuf_unittest; // Tests maps. message TestMap { map map_int32_int32 = 1; map map_int64_int64 = 2; map map_uint32_uint32 = 3; map map_uint64_uint64 = 4; map map_sint32_sint32 = 5; map map_sint64_sint64 = 6; map map_fixed32_fixed32 = 7; map map_fixed64_fixed64 = 8; map map_sfixed32_sfixed32 = 9; map map_sfixed64_sfixed64 = 10; map map_int32_float = 11; map map_int32_double = 12; map map_bool_bool = 13; map map_string_string = 14; map map_int32_bytes = 15; map map_int32_enum = 16; map map_int32_foreign_message = 17; map map_string_foreign_message = 18; map map_int32_all_types = 19; } message TestMapSubmessage { TestMap test_map = 1; } message TestMessageMap { map map_int32_message = 1; } // Two map fields share the same entry default instance. message TestSameTypeMap { map map1 = 1; map 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 map_field = 1; } message TestArenaMap { map map_int32_int32 = 1; map map_int64_int64 = 2; map map_uint32_uint32 = 3; map map_uint64_uint64 = 4; map map_sint32_sint32 = 5; map map_sint64_sint64 = 6; map map_fixed32_fixed32 = 7; map map_fixed64_fixed64 = 8; map map_sfixed32_sfixed32 = 9; map map_sfixed64_sfixed64 = 10; map map_int32_float = 11; map map_int32_double = 12; map map_bool_bool = 13; map map_string_string = 14; map map_int32_bytes = 15; map map_int32_enum = 16; map map_int32_foreign_message = 17; map map_int32_foreign_message_no_arena = 18; } // Previously, message containing enum called Type cannot be used as value of // map field. message MessageContainingEnumCalledType { enum Type { TYPE_FOO = 0; } map type = 1; } // Previously, message cannot contain map field called "entry". message MessageContainingMapCalledEntry { map entry = 1; } message TestRecursiveMapMessage { map a = 1; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/map_unittest_proto3.proto000066400000000000000000000115101334102242000323760ustar00rootroot00000000000000// 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 is mostly equivalent to map_unittest.proto, but imports // unittest_proto3.proto instead of unittest.proto, so that it only // uses proto3 messages. This makes it suitable for testing // implementations which only support proto3. // The TestRequiredMessageMap message has been removed as there are no // required fields in proto3. syntax = "proto3"; option cc_enable_arenas = true; option csharp_namespace = "Google.Protobuf.TestProtos"; import "google/protobuf/unittest_proto3.proto"; // We don't put this in a package within proto2 because we need to make sure // that the generated code doesn't depend on being in the proto2 namespace. // In map_test_util.h we do "using namespace unittest = protobuf_unittest". package protobuf_unittest; // Tests maps. message TestMap { map map_int32_int32 = 1; map map_int64_int64 = 2; map map_uint32_uint32 = 3; map map_uint64_uint64 = 4; map map_sint32_sint32 = 5; map map_sint64_sint64 = 6; map map_fixed32_fixed32 = 7; map map_fixed64_fixed64 = 8; map map_sfixed32_sfixed32 = 9; map map_sfixed64_sfixed64 = 10; map map_int32_float = 11; map map_int32_double = 12; map map_bool_bool = 13; map map_string_string = 14; map map_int32_bytes = 15; map map_int32_enum = 16; map map_int32_foreign_message = 17; } message TestMapSubmessage { TestMap test_map = 1; } message TestMessageMap { map map_int32_message = 1; } // Two map fields share the same entry default instance. message TestSameTypeMap { map map1 = 1; map map2 = 2; } enum MapEnum { MAP_ENUM_FOO = 0; MAP_ENUM_BAR = 1; MAP_ENUM_BAZ = 2; } message TestArenaMap { map map_int32_int32 = 1; map map_int64_int64 = 2; map map_uint32_uint32 = 3; map map_uint64_uint64 = 4; map map_sint32_sint32 = 5; map map_sint64_sint64 = 6; map map_fixed32_fixed32 = 7; map map_fixed64_fixed64 = 8; map map_sfixed32_sfixed32 = 9; map map_sfixed64_sfixed64 = 10; map map_int32_float = 11; map map_int32_double = 12; map map_bool_bool = 13; map map_int32_enum = 14; map map_int32_foreign_message = 15; } // Previously, message containing enum called Type cannot be used as value of // map field. message MessageContainingEnumCalledType { enum Type { TYPE_FOO = 0; } map type = 1; } // Previously, message cannot contain map field called "entry". message MessageContainingMapCalledEntry { map entry = 1; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/message.cc000066400000000000000000000423461334102242000272350ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { using internal::WireFormat; using internal::ReflectionOps; void Message::MergeFrom(const Message& from) { const Descriptor* descriptor = GetDescriptor(); GOOGLE_CHECK_EQ(from.GetDescriptor(), descriptor) << ": Tried to merge from a message with a different type. " "to: " << descriptor->full_name() << ", " "from: " << from.GetDescriptor()->full_name(); ReflectionOps::Merge(from, this); } void Message::CheckTypeAndMergeFrom(const MessageLite& other) { MergeFrom(*down_cast(&other)); } void Message::CopyFrom(const Message& from) { const Descriptor* descriptor = GetDescriptor(); GOOGLE_CHECK_EQ(from.GetDescriptor(), descriptor) << ": Tried to copy from a message with a different type. " "to: " << descriptor->full_name() << ", " "from: " << from.GetDescriptor()->full_name(); ReflectionOps::Copy(from, this); } string Message::GetTypeName() const { return GetDescriptor()->full_name(); } void Message::Clear() { ReflectionOps::Clear(this); } bool Message::IsInitialized() const { return ReflectionOps::IsInitialized(*this); } void Message::FindInitializationErrors(std::vector* errors) const { return ReflectionOps::FindInitializationErrors(*this, "", errors); } string Message::InitializationErrorString() const { std::vector errors; FindInitializationErrors(&errors); return Join(errors, ", "); } void Message::CheckInitialized() const { GOOGLE_CHECK(IsInitialized()) << "Message of type \"" << GetDescriptor()->full_name() << "\" is missing required fields: " << InitializationErrorString(); } void Message::DiscardUnknownFields() { return ReflectionOps::DiscardUnknownFields(this); } bool Message::MergePartialFromCodedStream(io::CodedInputStream* input) { return WireFormat::ParseAndMergePartial(input, this); } bool Message::ParseFromFileDescriptor(int file_descriptor) { io::FileInputStream input(file_descriptor); return ParseFromZeroCopyStream(&input) && input.GetErrno() == 0; } bool Message::ParsePartialFromFileDescriptor(int file_descriptor) { io::FileInputStream input(file_descriptor); return ParsePartialFromZeroCopyStream(&input) && input.GetErrno() == 0; } bool Message::ParseFromIstream(std::istream* input) { io::IstreamInputStream zero_copy_input(input); return ParseFromZeroCopyStream(&zero_copy_input) && input->eof(); } bool Message::ParsePartialFromIstream(std::istream* input) { io::IstreamInputStream zero_copy_input(input); return ParsePartialFromZeroCopyStream(&zero_copy_input) && input->eof(); } void Message::SerializeWithCachedSizes( io::CodedOutputStream* output) const { const internal::SerializationTable* table = static_cast(InternalGetTable()); if (table == 0) { WireFormat::SerializeWithCachedSizes(*this, GetCachedSize(), output); } else { internal::TableSerialize(*this, table, output); } } size_t Message::ByteSizeLong() const { size_t size = WireFormat::ByteSize(*this); SetCachedSize(internal::ToCachedSize(size)); return size; } void Message::SetCachedSize(int /* size */) const { GOOGLE_LOG(FATAL) << "Message class \"" << GetDescriptor()->full_name() << "\" implements neither SetCachedSize() nor ByteSize(). " "Must implement one or the other."; } size_t Message::SpaceUsedLong() const { return GetReflection()->SpaceUsedLong(*this); } bool Message::SerializeToFileDescriptor(int file_descriptor) const { io::FileOutputStream output(file_descriptor); return SerializeToZeroCopyStream(&output) && output.Flush(); } bool Message::SerializePartialToFileDescriptor(int file_descriptor) const { io::FileOutputStream output(file_descriptor); return SerializePartialToZeroCopyStream(&output) && output.Flush(); } bool Message::SerializeToOstream(std::ostream* output) const { { io::OstreamOutputStream zero_copy_output(output); if (!SerializeToZeroCopyStream(&zero_copy_output)) return false; } return output->good(); } bool Message::SerializePartialToOstream(std::ostream* output) const { io::OstreamOutputStream zero_copy_output(output); return SerializePartialToZeroCopyStream(&zero_copy_output); } // ============================================================================= // Reflection and associated Template Specializations Reflection::~Reflection() {} void Reflection::AddAllocatedMessage(Message* /* message */, const FieldDescriptor* /*field */, Message* /* new_entry */) const {} #define HANDLE_TYPE(TYPE, CPPTYPE, CTYPE) \ template<> \ const RepeatedField& Reflection::GetRepeatedField( \ const Message& message, const FieldDescriptor* field) const { \ return *static_cast* >( \ MutableRawRepeatedField(const_cast(&message), \ field, CPPTYPE, CTYPE, NULL)); \ } \ \ template<> \ RepeatedField* Reflection::MutableRepeatedField( \ Message* message, const FieldDescriptor* field) const { \ return static_cast* >( \ MutableRawRepeatedField(message, field, CPPTYPE, CTYPE, NULL)); \ } HANDLE_TYPE(int32, FieldDescriptor::CPPTYPE_INT32, -1); HANDLE_TYPE(int64, FieldDescriptor::CPPTYPE_INT64, -1); HANDLE_TYPE(uint32, FieldDescriptor::CPPTYPE_UINT32, -1); HANDLE_TYPE(uint64, FieldDescriptor::CPPTYPE_UINT64, -1); HANDLE_TYPE(float, FieldDescriptor::CPPTYPE_FLOAT, -1); HANDLE_TYPE(double, FieldDescriptor::CPPTYPE_DOUBLE, -1); HANDLE_TYPE(bool, FieldDescriptor::CPPTYPE_BOOL, -1); #undef HANDLE_TYPE void* Reflection::MutableRawRepeatedString( Message* message, const FieldDescriptor* field, bool is_string) const { return MutableRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_STRING, FieldOptions::STRING, NULL); } MapIterator Reflection::MapBegin( Message* message, const FieldDescriptor* field) const { GOOGLE_LOG(FATAL) << "Unimplemented Map Reflection API."; MapIterator iter(message, field); return iter; } MapIterator Reflection::MapEnd( Message* message, const FieldDescriptor* field) const { GOOGLE_LOG(FATAL) << "Unimplemented Map Reflection API."; MapIterator iter(message, field); return iter; } // ============================================================================= // MessageFactory MessageFactory::~MessageFactory() {} namespace { class GeneratedMessageFactory : public MessageFactory { public: GeneratedMessageFactory(); ~GeneratedMessageFactory(); static GeneratedMessageFactory* singleton(); typedef void RegistrationFunc(const string&); void RegisterFile(const char* file, RegistrationFunc* registration_func); void RegisterType(const Descriptor* descriptor, const Message* prototype); // implements MessageFactory --------------------------------------- const Message* GetPrototype(const Descriptor* type); private: // Only written at static init time, so does not require locking. hash_map, streq> file_map_; Mutex mutex_; // Initialized lazily, so requires locking. hash_map type_map_; }; GeneratedMessageFactory* generated_message_factory_ = NULL; GOOGLE_PROTOBUF_DECLARE_ONCE(generated_message_factory_once_init_); void ShutdownGeneratedMessageFactory() { delete generated_message_factory_; } void InitGeneratedMessageFactory() { generated_message_factory_ = new GeneratedMessageFactory; internal::OnShutdown(&ShutdownGeneratedMessageFactory); } GeneratedMessageFactory::GeneratedMessageFactory() {} GeneratedMessageFactory::~GeneratedMessageFactory() {} GeneratedMessageFactory* GeneratedMessageFactory::singleton() { ::google::protobuf::GoogleOnceInit(&generated_message_factory_once_init_, &InitGeneratedMessageFactory); return generated_message_factory_; } void GeneratedMessageFactory::RegisterFile( const char* file, RegistrationFunc* registration_func) { if (!InsertIfNotPresent(&file_map_, file, registration_func)) { GOOGLE_LOG(FATAL) << "File is already registered: " << file; } } void GeneratedMessageFactory::RegisterType(const Descriptor* descriptor, const Message* prototype) { GOOGLE_DCHECK_EQ(descriptor->file()->pool(), DescriptorPool::generated_pool()) << "Tried to register a non-generated type with the generated " "type registry."; // This should only be called as a result of calling a file registration // function during GetPrototype(), in which case we already have locked // the mutex. mutex_.AssertHeld(); if (!InsertIfNotPresent(&type_map_, descriptor, prototype)) { GOOGLE_LOG(DFATAL) << "Type is already registered: " << descriptor->full_name(); } } const Message* GeneratedMessageFactory::GetPrototype(const Descriptor* type) { { ReaderMutexLock lock(&mutex_); const Message* result = FindPtrOrNull(type_map_, type); if (result != NULL) return result; } // If the type is not in the generated pool, then we can't possibly handle // it. if (type->file()->pool() != DescriptorPool::generated_pool()) return NULL; // Apparently the file hasn't been registered yet. Let's do that now. RegistrationFunc* registration_func = FindPtrOrNull(file_map_, type->file()->name().c_str()); if (registration_func == NULL) { GOOGLE_LOG(DFATAL) << "File appears to be in generated pool but wasn't " "registered: " << type->file()->name(); return NULL; } WriterMutexLock lock(&mutex_); // Check if another thread preempted us. const Message* result = FindPtrOrNull(type_map_, type); if (result == NULL) { // Nope. OK, register everything. registration_func(type->file()->name()); // Should be here now. result = FindPtrOrNull(type_map_, type); } if (result == NULL) { GOOGLE_LOG(DFATAL) << "Type appears to be in generated pool but wasn't " << "registered: " << type->full_name(); } return result; } } // namespace MessageFactory* MessageFactory::generated_factory() { return GeneratedMessageFactory::singleton(); } void MessageFactory::InternalRegisterGeneratedFile( const char* filename, void (*register_messages)(const string&)) { GeneratedMessageFactory::singleton()->RegisterFile(filename, register_messages); } void MessageFactory::InternalRegisterGeneratedMessage( const Descriptor* descriptor, const Message* prototype) { GeneratedMessageFactory::singleton()->RegisterType(descriptor, prototype); } MessageFactory* Reflection::GetMessageFactory() const { GOOGLE_LOG(FATAL) << "Not implemented."; return NULL; } void* Reflection::RepeatedFieldData( Message* message, const FieldDescriptor* field, FieldDescriptor::CppType cpp_type, const Descriptor* message_type) const { GOOGLE_LOG(FATAL) << "Not implemented."; return NULL; } namespace internal { RepeatedFieldAccessor::~RepeatedFieldAccessor() { } } // namespace internal const internal::RepeatedFieldAccessor* Reflection::RepeatedFieldAccessor( const FieldDescriptor* field) const { GOOGLE_CHECK(field->is_repeated()); switch (field->cpp_type()) { #define HANDLE_PRIMITIVE_TYPE(TYPE, type) \ case FieldDescriptor::CPPTYPE_ ## TYPE: \ return internal::Singleton >::get(); HANDLE_PRIMITIVE_TYPE(INT32, int32) HANDLE_PRIMITIVE_TYPE(UINT32, uint32) HANDLE_PRIMITIVE_TYPE(INT64, int64) HANDLE_PRIMITIVE_TYPE(UINT64, uint64) HANDLE_PRIMITIVE_TYPE(FLOAT, float) HANDLE_PRIMITIVE_TYPE(DOUBLE, double) HANDLE_PRIMITIVE_TYPE(BOOL, bool) HANDLE_PRIMITIVE_TYPE(ENUM, int32) #undef HANDLE_PRIMITIVE_TYPE case FieldDescriptor::CPPTYPE_STRING: switch (field->options().ctype()) { default: case FieldOptions::STRING: return internal::Singleton::get(); } break; case FieldDescriptor::CPPTYPE_MESSAGE: if (field->is_map()) { return internal::Singleton::get(); } else { return internal::Singleton::get(); } } GOOGLE_LOG(FATAL) << "Should not reach here."; return NULL; } namespace internal { namespace { void ShutdownRepeatedFieldAccessor() { internal::Singleton >::ShutDown(); internal::Singleton >::ShutDown(); internal::Singleton >::ShutDown(); internal::Singleton >::ShutDown(); internal::Singleton >::ShutDown(); internal::Singleton >::ShutDown(); internal::Singleton >::ShutDown(); internal::Singleton::ShutDown(); internal::Singleton::ShutDown(); internal::Singleton::ShutDown(); } struct ShutdownRepeatedFieldRegister { ShutdownRepeatedFieldRegister() { OnShutdown(&ShutdownRepeatedFieldAccessor); } } shutdown_; } // namespace } // namespace internal namespace internal { template<> #if defined(_MSC_VER) && (_MSC_VER >= 1800) // Note: force noinline to workaround MSVC compiler bug with /Zc:inline, issue #240 GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE #endif Message* GenericTypeHandler::NewFromPrototype( const Message* prototype, google::protobuf::Arena* arena) { return prototype->New(arena); } template<> #if defined(_MSC_VER) && (_MSC_VER >= 1800) // Note: force noinline to workaround MSVC compiler bug with /Zc:inline, issue #240 GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE #endif google::protobuf::Arena* GenericTypeHandler::GetArena( Message* value) { return value->GetArena(); } template<> #if defined(_MSC_VER) && (_MSC_VER >= 1800) // Note: force noinline to workaround MSVC compiler bug with /Zc:inline, issue #240 GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE #endif void* GenericTypeHandler::GetMaybeArenaPointer( Message* value) { return value->GetMaybeArenaPointer(); } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/message.h000066400000000000000000001512741334102242000271000ustar00rootroot00000000000000// 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. // // Defines Message, the abstract interface implemented by non-lite // protocol message objects. Although it's possible to implement this // interface manually, most users will use the protocol compiler to // generate implementations. // // Example usage: // // Say you have a message defined as: // // message Foo { // optional string text = 1; // repeated int32 numbers = 2; // } // // Then, if you used the protocol compiler to generate a class from the above // definition, you could use it like so: // // string data; // Will store a serialized version of the message. // // { // // Create a message and serialize it. // Foo foo; // foo.set_text("Hello World!"); // foo.add_numbers(1); // foo.add_numbers(5); // foo.add_numbers(42); // // foo.SerializeToString(&data); // } // // { // // Parse the serialized message and check that it contains the // // correct data. // Foo foo; // foo.ParseFromString(data); // // assert(foo.text() == "Hello World!"); // assert(foo.numbers_size() == 3); // assert(foo.numbers(0) == 1); // assert(foo.numbers(1) == 5); // assert(foo.numbers(2) == 42); // } // // { // // Same as the last block, but do it dynamically via the Message // // reflection interface. // Message* foo = new Foo; // const Descriptor* descriptor = foo->GetDescriptor(); // // // Get the descriptors for the fields we're interested in and verify // // their types. // const FieldDescriptor* text_field = descriptor->FindFieldByName("text"); // assert(text_field != NULL); // assert(text_field->type() == FieldDescriptor::TYPE_STRING); // assert(text_field->label() == FieldDescriptor::LABEL_OPTIONAL); // const FieldDescriptor* numbers_field = descriptor-> // FindFieldByName("numbers"); // assert(numbers_field != NULL); // assert(numbers_field->type() == FieldDescriptor::TYPE_INT32); // assert(numbers_field->label() == FieldDescriptor::LABEL_REPEATED); // // // Parse the message. // foo->ParseFromString(data); // // // Use the reflection interface to examine the contents. // const Reflection* reflection = foo->GetReflection(); // assert(reflection->GetString(*foo, text_field) == "Hello World!"); // assert(reflection->FieldSize(*foo, numbers_field) == 3); // assert(reflection->GetRepeatedInt32(*foo, numbers_field, 0) == 1); // assert(reflection->GetRepeatedInt32(*foo, numbers_field, 1) == 5); // assert(reflection->GetRepeatedInt32(*foo, numbers_field, 2) == 42); // // delete foo; // } #ifndef GOOGLE_PROTOBUF_MESSAGE_H__ #define GOOGLE_PROTOBUF_MESSAGE_H__ #include #include #include #include #include #include #include #include #define GOOGLE_PROTOBUF_HAS_ONEOF #define GOOGLE_PROTOBUF_HAS_ARENAS namespace google { namespace protobuf { // Defined in this file. class Message; class Reflection; class MessageFactory; // Defined in other files. class MapKey; class MapValueRef; class MapIterator; class MapReflectionTester; namespace internal { class MapFieldBase; } class UnknownFieldSet; // unknown_field_set.h namespace io { class ZeroCopyInputStream; // zero_copy_stream.h class ZeroCopyOutputStream; // zero_copy_stream.h class CodedInputStream; // coded_stream.h class CodedOutputStream; // coded_stream.h } namespace python { class MapReflectionFriend; // scalar_map_container.h } namespace internal { class ReflectionOps; // reflection_ops.h class MapKeySorter; // wire_format.cc class WireFormat; // wire_format.h class MapFieldReflectionTest; // map_test.cc } template class RepeatedField; // repeated_field.h template class RepeatedPtrField; // repeated_field.h // A container to hold message metadata. struct Metadata { const Descriptor* descriptor; const Reflection* reflection; }; // Abstract interface for protocol messages. // // See also MessageLite, which contains most every-day operations. Message // adds descriptors and reflection on top of that. // // The methods of this class that are virtual but not pure-virtual have // default implementations based on reflection. Message classes which are // optimized for speed will want to override these with faster implementations, // but classes optimized for code size may be happy with keeping them. See // the optimize_for option in descriptor.proto. class LIBPROTOBUF_EXPORT Message : public MessageLite { public: inline Message() {} virtual ~Message() {} // Basic Operations ------------------------------------------------ // Construct a new instance of the same type. Ownership is passed to the // caller. (This is also defined in MessageLite, but is defined again here // for return-type covariance.) virtual Message* New() const = 0; // Construct a new instance on the arena. Ownership is passed to the caller // if arena is a NULL. Default implementation allows for API compatibility // during the Arena transition. virtual Message* New(::google::protobuf::Arena* arena) const { Message* message = New(); if (arena != NULL) { arena->Own(message); } return message; } // Make this message into a copy of the given message. The given message // must have the same descriptor, but need not necessarily be the same class. // By default this is just implemented as "Clear(); MergeFrom(from);". virtual void CopyFrom(const Message& from); // Merge the fields from the given message into this message. Singular // fields will be overwritten, if specified in from, except for embedded // messages which will be merged. Repeated fields will be concatenated. // The given message must be of the same type as this message (i.e. the // exact same class). virtual void MergeFrom(const Message& from); // Verifies that IsInitialized() returns true. GOOGLE_CHECK-fails otherwise, with // a nice error message. void CheckInitialized() const; // Slowly build a list of all required fields that are not set. // This is much, much slower than IsInitialized() as it is implemented // purely via reflection. Generally, you should not call this unless you // have already determined that an error exists by calling IsInitialized(). void FindInitializationErrors(std::vector* errors) const; // Like FindInitializationErrors, but joins all the strings, delimited by // commas, and returns them. string InitializationErrorString() const; // Clears all unknown fields from this message and all embedded messages. // Normally, if unknown tag numbers are encountered when parsing a message, // the tag and value are stored in the message's UnknownFieldSet and // then written back out when the message is serialized. This allows servers // which simply route messages to other servers to pass through messages // that have new field definitions which they don't yet know about. However, // this behavior can have security implications. To avoid it, call this // method after parsing. // // See Reflection::GetUnknownFields() for more on unknown fields. virtual void DiscardUnknownFields(); // Computes (an estimate of) the total number of bytes currently used for // storing the message in memory. The default implementation calls the // Reflection object's SpaceUsed() method. // // SpaceUsed() is noticeably slower than ByteSize(), as it is implemented // 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. virtual size_t SpaceUsedLong() const; PROTOBUF_RUNTIME_DEPRECATED("Please use SpaceUsedLong() instead") int SpaceUsed() const { return internal::ToIntSize(SpaceUsedLong()); } // Debugging & Testing---------------------------------------------- // Generates a human readable form of this message, useful for debugging // and other purposes. string DebugString() const; // Like DebugString(), but with less whitespace. string ShortDebugString() const; // Like DebugString(), but do not escape UTF-8 byte sequences. string Utf8DebugString() const; // Convenience function useful in GDB. Prints DebugString() to stdout. void PrintDebugString() const; // Heavy I/O ------------------------------------------------------- // Additional parsing and serialization methods not implemented by // MessageLite because they are not supported by the lite library. // Parse a protocol buffer from a file descriptor. If successful, the entire // input will be consumed. bool ParseFromFileDescriptor(int file_descriptor); // Like ParseFromFileDescriptor(), but accepts messages that are missing // required fields. bool ParsePartialFromFileDescriptor(int file_descriptor); // Parse a protocol buffer from a C++ istream. If successful, the entire // input will be consumed. bool ParseFromIstream(std::istream* input); // Like ParseFromIstream(), but accepts messages that are missing // required fields. bool ParsePartialFromIstream(std::istream* input); // Serialize the message and write it to the given file descriptor. All // required fields must be set. bool SerializeToFileDescriptor(int file_descriptor) const; // Like SerializeToFileDescriptor(), but allows missing required fields. bool SerializePartialToFileDescriptor(int file_descriptor) const; // Serialize the message and write it to the given C++ ostream. All // required fields must be set. bool SerializeToOstream(std::ostream* output) const; // Like SerializeToOstream(), but allows missing required fields. bool SerializePartialToOstream(std::ostream* output) const; // Reflection-based methods ---------------------------------------- // These methods are pure-virtual in MessageLite, but Message provides // reflection-based default implementations. virtual string GetTypeName() const; virtual void Clear(); virtual bool IsInitialized() const; virtual void CheckTypeAndMergeFrom(const MessageLite& other); virtual bool MergePartialFromCodedStream(io::CodedInputStream* input); virtual size_t ByteSizeLong() const; virtual void SerializeWithCachedSizes(io::CodedOutputStream* output) const; private: // This is called only by the default implementation of ByteSize(), to // update the cached size. If you override ByteSize(), you do not need // to override this. If you do not override ByteSize(), you MUST override // this; the default implementation will crash. // // The method is private because subclasses should never call it; only // override it. Yes, C++ lets you do that. Crazy, huh? virtual void SetCachedSize(int size) const; public: // Introspection --------------------------------------------------- // Typedef for backwards-compatibility. typedef google::protobuf::Reflection Reflection; // Get a non-owning pointer to a Descriptor for this message's type. This // describes what fields the message contains, the types of those fields, etc. // This object remains property of the Message. const Descriptor* GetDescriptor() const { return GetMetadata().descriptor; } // Get a non-owning pointer to the Reflection interface for this Message, // which can be used to read and modify the fields of the Message dynamically // (in other words, without knowing the message type at compile time). This // object remains property of the Message. // // This method remains virtual in case a subclass does not implement // reflection and wants to override the default behavior. virtual const Reflection* GetReflection() const PROTOBUF_FINAL { return GetMetadata().reflection; } protected: // Get a struct containing the metadata for the Message. Most subclasses only // need to implement this method, rather than the GetDescriptor() and // GetReflection() wrappers. virtual Metadata GetMetadata() const = 0; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Message); }; namespace internal { // Forward-declare interfaces used to implement RepeatedFieldRef. // These are protobuf internals that users shouldn't care about. class RepeatedFieldAccessor; } // namespace internal // Forward-declare RepeatedFieldRef templates. The second type parameter is // used for SFINAE tricks. Users should ignore it. template class RepeatedFieldRef; template class MutableRepeatedFieldRef; // This interface contains methods that can be used to dynamically access // and modify the fields of a protocol message. Their semantics are // similar to the accessors the protocol compiler generates. // // To get the Reflection for a given Message, call Message::GetReflection(). // // This interface is separate from Message only for efficiency reasons; // the vast majority of implementations of Message will share the same // implementation of Reflection (GeneratedMessageReflection, // defined in generated_message.h), and all Messages of a particular class // should share the same Reflection object (though you should not rely on // the latter fact). // // There are several ways that these methods can be used incorrectly. For // example, any of the following conditions will lead to undefined // results (probably assertion failures): // - The FieldDescriptor is not a field of this message type. // - The method called is not appropriate for the field's type. For // each field type in FieldDescriptor::TYPE_*, there is only one // Get*() method, one Set*() method, and one Add*() method that is // valid for that type. It should be obvious which (except maybe // for TYPE_BYTES, which are represented using strings in C++). // - A Get*() or Set*() method for singular fields is called on a repeated // field. // - GetRepeated*(), SetRepeated*(), or Add*() is called on a non-repeated // field. // - The Message object passed to any method is not of the right type for // this Reflection object (i.e. message.GetReflection() != reflection). // // You might wonder why there is not any abstract representation for a field // of arbitrary type. E.g., why isn't there just a "GetField()" method that // returns "const Field&", where "Field" is some class with accessors like // "GetInt32Value()". The problem is that someone would have to deal with // allocating these Field objects. For generated message classes, having to // allocate space for an additional object to wrap every field would at least // double the message's memory footprint, probably worse. Allocating the // objects on-demand, on the other hand, would be expensive and prone to // memory leaks. So, instead we ended up with this flat interface. // // TODO(kenton): Create a utility class which callers can use to read and // write fields from a Reflection without paying attention to the type. class LIBPROTOBUF_EXPORT Reflection { public: inline Reflection() {} virtual ~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. For proto3 protos, this method will always // return an empty UnknownFieldSet. virtual const UnknownFieldSet& GetUnknownFields( const Message& message) const = 0; // Get a mutable pointer to 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. For proto3 protos, this // method will return a valid mutable UnknownFieldSet pointer but modifying // it won't affect the serialized bytes of the message. virtual UnknownFieldSet* MutableUnknownFields(Message* message) const = 0; // Estimate the amount of memory used by the message object. virtual size_t SpaceUsedLong(const Message& message) const = 0; PROTOBUF_RUNTIME_DEPRECATED("Please use SpaceUsedLong() instead") int SpaceUsed(const Message& message) const { return internal::ToIntSize(SpaceUsedLong(message)); } // Check if the given non-repeated field is set. virtual bool HasField(const Message& message, const FieldDescriptor* field) const = 0; // Get the number of elements of a repeated field. virtual int FieldSize(const Message& message, const FieldDescriptor* field) const = 0; // Clear the value of a field, so that HasField() returns false or // FieldSize() returns zero. virtual void ClearField(Message* message, const FieldDescriptor* field) const = 0; // Check if the oneof is set. Returns true if any field in oneof // is set, false otherwise. // TODO(jieluo) - make it pure virtual after updating all // the subclasses. virtual bool HasOneof(const Message& /*message*/, const OneofDescriptor* /*oneof_descriptor*/) const { return false; } virtual void ClearOneof(Message* /*message*/, const OneofDescriptor* /*oneof_descriptor*/) const {} // Returns the field descriptor if the oneof is set. NULL otherwise. // TODO(jieluo) - make it pure virtual. virtual const FieldDescriptor* GetOneofFieldDescriptor( const Message& /*message*/, const OneofDescriptor* /*oneof_descriptor*/) const { return NULL; } // Removes the last element of a repeated field. // We don't provide a way to remove any element other than the last // because it invites inefficient use, such as O(n^2) filtering loops // that should have been O(n). If you want to remove an element other // than the last, the best way to do it is to re-arrange the elements // (using Swap()) so that the one you want removed is at the end, then // call RemoveLast(). virtual void RemoveLast(Message* message, const FieldDescriptor* field) const = 0; // Removes the last element of a repeated message field, and returns the // pointer to the caller. Caller takes ownership of the returned pointer. virtual Message* ReleaseLast(Message* message, const FieldDescriptor* field) const = 0; // Swap the complete contents of two messages. virtual void Swap(Message* message1, Message* message2) const = 0; // Swap fields listed in fields vector of two messages. virtual void SwapFields(Message* message1, Message* message2, const std::vector& fields) const = 0; // Swap two elements of a repeated field. virtual void SwapElements(Message* message, const FieldDescriptor* field, int index1, int index2) const = 0; // List all fields of the message which are currently set, except for unknown // fields, but including extension known to the parser (i.e. compiled in). // Singular fields will only be listed if HasField(field) would return true // and repeated fields will only be listed if FieldSize(field) would return // non-zero. Fields (both normal fields and extension fields) will be listed // ordered by field number. // Use Reflection::GetUnknownFields() or message.unknown_fields() to also get // access to fields/extensions unknown to the parser. virtual void ListFields( const Message& message, std::vector* output) const = 0; // Singular field getters ------------------------------------------ // These get the value of a non-repeated field. They return the default // value for fields that aren't set. virtual int32 GetInt32 (const Message& message, const FieldDescriptor* field) const = 0; virtual int64 GetInt64 (const Message& message, const FieldDescriptor* field) const = 0; virtual uint32 GetUInt32(const Message& message, const FieldDescriptor* field) const = 0; virtual uint64 GetUInt64(const Message& message, const FieldDescriptor* field) const = 0; virtual float GetFloat (const Message& message, const FieldDescriptor* field) const = 0; virtual double GetDouble(const Message& message, const FieldDescriptor* field) const = 0; virtual bool GetBool (const Message& message, const FieldDescriptor* field) const = 0; virtual string GetString(const Message& message, const FieldDescriptor* field) const = 0; virtual const EnumValueDescriptor* GetEnum( const Message& message, const FieldDescriptor* field) const = 0; // GetEnumValue() returns an enum field's value as an integer rather than // an EnumValueDescriptor*. If the integer value does not correspond to a // known value descriptor, a new value descriptor is created. (Such a value // will only be present when the new unknown-enum-value semantics are enabled // for a message.) virtual int GetEnumValue( const Message& message, const FieldDescriptor* field) const = 0; // See MutableMessage() for the meaning of the "factory" parameter. virtual const Message& GetMessage(const Message& message, const FieldDescriptor* field, MessageFactory* factory = NULL) const = 0; // Get a string value without copying, if possible. // // GetString() necessarily returns a copy of the string. This can be // inefficient when the string is already stored in a string object in the // underlying message. GetStringReference() will return a reference to the // underlying string in this case. Otherwise, it will copy the string into // *scratch and return that. // // Note: It is perfectly reasonable and useful to write code like: // str = reflection->GetStringReference(field, &str); // This line would ensure that only one copy of the string is made // regardless of the field's underlying representation. When initializing // a newly-constructed string, though, it's just as fast and more readable // to use code like: // string str = reflection->GetString(message, field); virtual const string& GetStringReference(const Message& message, const FieldDescriptor* field, string* scratch) const = 0; // Singular field mutators ----------------------------------------- // These mutate the value of a non-repeated field. virtual void SetInt32 (Message* message, const FieldDescriptor* field, int32 value) const = 0; virtual void SetInt64 (Message* message, const FieldDescriptor* field, int64 value) const = 0; virtual void SetUInt32(Message* message, const FieldDescriptor* field, uint32 value) const = 0; virtual void SetUInt64(Message* message, const FieldDescriptor* field, uint64 value) const = 0; virtual void SetFloat (Message* message, const FieldDescriptor* field, float value) const = 0; virtual void SetDouble(Message* message, const FieldDescriptor* field, double value) const = 0; virtual void SetBool (Message* message, const FieldDescriptor* field, bool value) const = 0; virtual void SetString(Message* message, const FieldDescriptor* field, const string& value) const = 0; virtual void SetEnum (Message* message, const FieldDescriptor* field, const EnumValueDescriptor* value) const = 0; // Set an enum field's value with an integer rather than EnumValueDescriptor. // If the value does not correspond to a known enum value, either behavior is // undefined (for proto2 messages), or the value is accepted silently for // messages with new unknown-enum-value semantics. virtual void SetEnumValue(Message* message, const FieldDescriptor* field, int value) const = 0; // Get a mutable pointer to a field with a message type. If a MessageFactory // is provided, it will be used to construct instances of the sub-message; // otherwise, the default factory is used. If the field is an extension that // does not live in the same pool as the containing message's descriptor (e.g. // it lives in an overlay pool), then a MessageFactory must be provided. // If you have no idea what that meant, then you probably don't need to worry // about it (don't provide a MessageFactory). WARNING: If the // FieldDescriptor is for a compiled-in extension, then // factory->GetPrototype(field->message_type()) MUST return an instance of // the compiled-in class for this type, NOT DynamicMessage. virtual Message* MutableMessage(Message* message, const FieldDescriptor* field, MessageFactory* factory = NULL) const = 0; // Replaces the message specified by 'field' with the already-allocated object // sub_message, passing ownership to the message. If the field contained a // message, that message is deleted. If sub_message is NULL, the field is // cleared. virtual void SetAllocatedMessage(Message* message, Message* sub_message, const FieldDescriptor* field) const = 0; // Releases the message specified by 'field' and returns the pointer, // ReleaseMessage() will return the message the message object if it exists. // Otherwise, it may or may not return NULL. In any case, if the return value // is non-NULL, the caller takes ownership of the pointer. // If the field existed (HasField() is true), then the returned pointer will // be the same as the pointer returned by MutableMessage(). // This function has the same effect as ClearField(). virtual Message* ReleaseMessage(Message* message, const FieldDescriptor* field, MessageFactory* factory = NULL) const = 0; // Repeated field getters ------------------------------------------ // These get the value of one element of a repeated field. virtual int32 GetRepeatedInt32 (const Message& message, const FieldDescriptor* field, int index) const = 0; virtual int64 GetRepeatedInt64 (const Message& message, const FieldDescriptor* field, int index) const = 0; virtual uint32 GetRepeatedUInt32(const Message& message, const FieldDescriptor* field, int index) const = 0; virtual uint64 GetRepeatedUInt64(const Message& message, const FieldDescriptor* field, int index) const = 0; virtual float GetRepeatedFloat (const Message& message, const FieldDescriptor* field, int index) const = 0; virtual double GetRepeatedDouble(const Message& message, const FieldDescriptor* field, int index) const = 0; virtual bool GetRepeatedBool (const Message& message, const FieldDescriptor* field, int index) const = 0; virtual string GetRepeatedString(const Message& message, const FieldDescriptor* field, int index) const = 0; virtual const EnumValueDescriptor* GetRepeatedEnum( const Message& message, const FieldDescriptor* field, int index) const = 0; // GetRepeatedEnumValue() returns an enum field's value as an integer rather // than an EnumValueDescriptor*. If the integer value does not correspond to a // known value descriptor, a new value descriptor is created. (Such a value // will only be present when the new unknown-enum-value semantics are enabled // for a message.) virtual int GetRepeatedEnumValue( const Message& message, const FieldDescriptor* field, int index) const = 0; virtual const Message& GetRepeatedMessage( const Message& message, const FieldDescriptor* field, int index) const = 0; // See GetStringReference(), above. virtual const string& GetRepeatedStringReference( const Message& message, const FieldDescriptor* field, int index, string* scratch) const = 0; // Repeated field mutators ----------------------------------------- // These mutate the value of one element of a repeated field. virtual void SetRepeatedInt32 (Message* message, const FieldDescriptor* field, int index, int32 value) const = 0; virtual void SetRepeatedInt64 (Message* message, const FieldDescriptor* field, int index, int64 value) const = 0; virtual void SetRepeatedUInt32(Message* message, const FieldDescriptor* field, int index, uint32 value) const = 0; virtual void SetRepeatedUInt64(Message* message, const FieldDescriptor* field, int index, uint64 value) const = 0; virtual void SetRepeatedFloat (Message* message, const FieldDescriptor* field, int index, float value) const = 0; virtual void SetRepeatedDouble(Message* message, const FieldDescriptor* field, int index, double value) const = 0; virtual void SetRepeatedBool (Message* message, const FieldDescriptor* field, int index, bool value) const = 0; virtual void SetRepeatedString(Message* message, const FieldDescriptor* field, int index, const string& value) const = 0; virtual void SetRepeatedEnum(Message* message, const FieldDescriptor* field, int index, const EnumValueDescriptor* value) const = 0; // Set an enum field's value with an integer rather than EnumValueDescriptor. // If the value does not correspond to a known enum value, either behavior is // undefined (for proto2 messages), or the value is accepted silently for // messages with new unknown-enum-value semantics. virtual void SetRepeatedEnumValue(Message* message, const FieldDescriptor* field, int index, int value) const = 0; // Get a mutable pointer to an element of a repeated field with a message // type. virtual Message* MutableRepeatedMessage( Message* message, const FieldDescriptor* field, int index) const = 0; // Repeated field adders ------------------------------------------- // These add an element to a repeated field. virtual void AddInt32 (Message* message, const FieldDescriptor* field, int32 value) const = 0; virtual void AddInt64 (Message* message, const FieldDescriptor* field, int64 value) const = 0; virtual void AddUInt32(Message* message, const FieldDescriptor* field, uint32 value) const = 0; virtual void AddUInt64(Message* message, const FieldDescriptor* field, uint64 value) const = 0; virtual void AddFloat (Message* message, const FieldDescriptor* field, float value) const = 0; virtual void AddDouble(Message* message, const FieldDescriptor* field, double value) const = 0; virtual void AddBool (Message* message, const FieldDescriptor* field, bool value) const = 0; virtual void AddString(Message* message, const FieldDescriptor* field, const string& value) const = 0; virtual void AddEnum (Message* message, const FieldDescriptor* field, const EnumValueDescriptor* value) const = 0; // Set an enum field's value with an integer rather than EnumValueDescriptor. // If the value does not correspond to a known enum value, either behavior is // undefined (for proto2 messages), or the value is accepted silently for // messages with new unknown-enum-value semantics. virtual void AddEnumValue(Message* message, const FieldDescriptor* field, int value) const = 0; // See MutableMessage() for comments on the "factory" parameter. virtual Message* AddMessage(Message* message, const FieldDescriptor* field, MessageFactory* factory = NULL) const = 0; // Appends an already-allocated object 'new_entry' to the repeated field // specifyed by 'field' passing ownership to the message. // TODO(tmarek): Make virtual after all subclasses have been // updated. virtual void AddAllocatedMessage(Message* message, const FieldDescriptor* field, Message* new_entry) const; // Get a RepeatedFieldRef object that can be used to read the underlying // repeated field. The type parameter T must be set according to the // field's cpp type. The following table shows the mapping from cpp type // to acceptable T. // // field->cpp_type() T // CPPTYPE_INT32 int32 // CPPTYPE_UINT32 uint32 // CPPTYPE_INT64 int64 // CPPTYPE_UINT64 uint64 // CPPTYPE_DOUBLE double // CPPTYPE_FLOAT float // CPPTYPE_BOOL bool // CPPTYPE_ENUM generated enum type or int32 // CPPTYPE_STRING string // CPPTYPE_MESSAGE generated message type or google::protobuf::Message // // A RepeatedFieldRef object can be copied and the resulted object will point // to the same repeated field in the same message. The object can be used as // long as the message is not destroyed. // // Note that to use this method users need to include the header file // "google/protobuf/reflection.h" (which defines the RepeatedFieldRef // class templates). template RepeatedFieldRef GetRepeatedFieldRef( const Message& message, const FieldDescriptor* field) const; // Like GetRepeatedFieldRef() but return an object that can also be used // manipulate the underlying repeated field. template MutableRepeatedFieldRef GetMutableRepeatedFieldRef( Message* message, const FieldDescriptor* field) const; // DEPRECATED. Please use Get(Mutable)RepeatedFieldRef() for repeated field // access. The following repeated field accesors will be removed in the // future. // // Repeated field accessors ------------------------------------------------- // The methods above, e.g. GetRepeatedInt32(msg, fd, index), provide singular // access to the data in a RepeatedField. The methods below provide aggregate // access by exposing the RepeatedField object itself with the Message. // Applying these templates to inappropriate types will lead to an undefined // reference at link time (e.g. GetRepeatedField<***double>), or possibly a // template matching error at compile time (e.g. GetRepeatedPtrField). // // Usage example: my_doubs = refl->GetRepeatedField(msg, fd); // DEPRECATED. Please use GetRepeatedFieldRef(). // // for T = Cord and all protobuf scalar types except enums. template const RepeatedField& GetRepeatedField( const Message&, const FieldDescriptor*) const; // DEPRECATED. Please use GetMutableRepeatedFieldRef(). // // for T = Cord and all protobuf scalar types except enums. template RepeatedField* MutableRepeatedField( Message*, const FieldDescriptor*) const; // DEPRECATED. Please use GetRepeatedFieldRef(). // // for T = string, google::protobuf::internal::StringPieceField // google::protobuf::Message & descendants. template const RepeatedPtrField& GetRepeatedPtrField( const Message&, const FieldDescriptor*) const; // DEPRECATED. Please use GetMutableRepeatedFieldRef(). // // for T = string, google::protobuf::internal::StringPieceField // google::protobuf::Message & descendants. template RepeatedPtrField* MutableRepeatedPtrField( Message*, const FieldDescriptor*) const; // Extensions ---------------------------------------------------------------- // Try to find an extension of this message type by fully-qualified field // name. Returns NULL if no extension is known for this name or number. virtual const FieldDescriptor* FindKnownExtensionByName( const string& name) const = 0; // Try to find an extension of this message type by field number. // Returns NULL if no extension is known for this name or number. virtual const FieldDescriptor* FindKnownExtensionByNumber( int number) const = 0; // Feature Flags ------------------------------------------------------------- // Does this message support storing arbitrary integer values in enum fields? // If |true|, GetEnumValue/SetEnumValue and associated repeated-field versions // take arbitrary integer values, and the legacy GetEnum() getter will // dynamically create an EnumValueDescriptor for any integer value without // one. If |false|, setting an unknown enum value via the integer-based // setters results in undefined behavior (in practice, GOOGLE_DCHECK-fails). // // Generic code that uses reflection to handle messages with enum fields // should check this flag before using the integer-based setter, and either // downgrade to a compatible value or use the UnknownFieldSet if not. For // example: // // int new_value = GetValueFromApplicationLogic(); // if (reflection->SupportsUnknownEnumValues()) { // reflection->SetEnumValue(message, field, new_value); // } else { // if (field_descriptor->enum_type()-> // FindValueByNumber(new_value) != NULL) { // reflection->SetEnumValue(message, field, new_value); // } else if (emit_unknown_enum_values) { // reflection->MutableUnknownFields(message)->AddVarint( // field->number(), new_value); // } else { // // convert value to a compatible/default value. // new_value = CompatibleDowngrade(new_value); // reflection->SetEnumValue(message, field, new_value); // } // } virtual bool SupportsUnknownEnumValues() const { return false; } // Returns the MessageFactory associated with this message. This can be // useful for determining if a message is a generated message or not, for // example: // if (message->GetReflection()->GetMessageFactory() == // google::protobuf::MessageFactory::generated_factory()) { // // This is a generated message. // } // It can also be used to create more messages of this type, though // Message::New() is an easier way to accomplish this. virtual MessageFactory* GetMessageFactory() const; // --------------------------------------------------------------------------- protected: // Obtain a pointer to a Repeated Field Structure and do some type checking: // on field->cpp_type(), // on field->field_option().ctype() (if ctype >= 0) // of field->message_type() (if message_type != NULL). // We use 2 routine rather than 4 (const vs mutable) x (scalar vs pointer). virtual void* MutableRawRepeatedField( Message* message, const FieldDescriptor* field, FieldDescriptor::CppType, int ctype, const Descriptor* message_type) const = 0; // TODO(jieluo) - make it pure virtual after updating all the subclasses. virtual const void* GetRawRepeatedField( const Message& message, const FieldDescriptor* field, FieldDescriptor::CppType cpptype, int ctype, const Descriptor* message_type) const { return MutableRawRepeatedField( const_cast(&message), field, cpptype, ctype, message_type); } // The following methods are used to implement (Mutable)RepeatedFieldRef. // A Ref object will store a raw pointer to the repeated field data (obtained // from RepeatedFieldData()) and a pointer to a Accessor (obtained from // RepeatedFieldAccessor) which will be used to access the raw data. // // TODO(xiaofeng): Make these methods pure-virtual. // Returns a raw pointer to the repeated field // // "cpp_type" and "message_type" are deduced from the type parameter T passed // to Get(Mutable)RepeatedFieldRef. If T is a generated message type, // "message_type" should be set to its descriptor. Otherwise "message_type" // should be set to NULL. Implementations of this method should check whether // "cpp_type"/"message_type" is consistent with the actual type of the field. // We use 1 routine rather than 2 (const vs mutable) because it is protected // and it doesn't change the message. virtual void* RepeatedFieldData( Message* message, const FieldDescriptor* field, FieldDescriptor::CppType cpp_type, const Descriptor* message_type) const; // The returned pointer should point to a singleton instance which implements // the RepeatedFieldAccessor interface. virtual const internal::RepeatedFieldAccessor* RepeatedFieldAccessor( const FieldDescriptor* field) const; private: template friend class RepeatedFieldRef; template friend class MutableRepeatedFieldRef; friend class ::google::protobuf::python::MapReflectionFriend; friend class internal::MapFieldReflectionTest; friend class internal::MapKeySorter; friend class internal::WireFormat; friend class internal::ReflectionOps; // Special version for specialized implementations of string. We can't call // MutableRawRepeatedField directly here because we don't have access to // FieldOptions::* which are defined in descriptor.pb.h. Including that // file here is not possible because it would cause a circular include cycle. // We use 1 routine rather than 2 (const vs mutable) because it is private // and mutable a repeated string field doesn't change the message. void* MutableRawRepeatedString( Message* message, const FieldDescriptor* field, bool is_string) const; friend class MapReflectionTester; // TODO(jieluo) - make the map APIs pure virtual after updating // all the subclasses. // Returns true if key is in map. Returns false if key is not in map field. virtual bool ContainsMapKey(const Message& /* message */, const FieldDescriptor* /* field */, const MapKey& /* key */) const { return false; } // If key is in map field: Saves the value pointer to val and returns // false. If key in not in map field: Insert the key into map, saves // value pointer to val and retuns true. virtual bool InsertOrLookupMapValue(Message* /* message */, const FieldDescriptor* /* field */, const MapKey& /* key */, MapValueRef* /* val */) const { return false; } // Delete and returns true if key is in the map field. Returns false // otherwise. virtual bool DeleteMapValue(Message* /* message */, const FieldDescriptor* /* field */, const MapKey& /* key */) const { return false; } // Returns a MapIterator referring to the first element in the map field. // If the map field is empty, this function returns the same as // reflection::MapEnd. Mutation to the field may invalidate the iterator. virtual MapIterator MapBegin( Message* message, const FieldDescriptor* field) const; // Returns a MapIterator referring to the theoretical element that would // follow the last element in the map field. It does not point to any // real element. Mutation to the field may invalidate the iterator. virtual MapIterator MapEnd( Message* message, const FieldDescriptor* field) const; // Get the number of pair of a map field. The result may be // different from FieldSize which can have duplicate keys. virtual int MapSize(const Message& /* message */, const FieldDescriptor* /* field */) const { return 0; } // Help method for MapIterator. friend class MapIterator; virtual internal::MapFieldBase* MapData( Message* /* message */, const FieldDescriptor* /* field */) const { return NULL; } GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reflection); }; // Abstract interface for a factory for message objects. class LIBPROTOBUF_EXPORT MessageFactory { public: inline MessageFactory() {} virtual ~MessageFactory(); // Given a Descriptor, gets or constructs the default (prototype) Message // of that type. You can then call that message's New() method to construct // a mutable message of that type. // // Calling this method twice with the same Descriptor returns the same // object. The returned object remains property of the factory. Also, any // objects created by calling the prototype's New() method share some data // with the prototype, so these must be destroyed before the MessageFactory // is destroyed. // // The given descriptor must outlive the returned message, and hence must // outlive the MessageFactory. // // Some implementations do not support all types. GetPrototype() will // return NULL if the descriptor passed in is not supported. // // This method may or may not be thread-safe depending on the implementation. // Each implementation should document its own degree thread-safety. virtual const Message* GetPrototype(const Descriptor* type) = 0; // Gets a MessageFactory which supports all generated, compiled-in messages. // In other words, for any compiled-in type FooMessage, the following is true: // MessageFactory::generated_factory()->GetPrototype( // FooMessage::descriptor()) == FooMessage::default_instance() // This factory supports all types which are found in // DescriptorPool::generated_pool(). If given a descriptor from any other // pool, GetPrototype() will return NULL. (You can also check if a // descriptor is for a generated message by checking if // descriptor->file()->pool() == DescriptorPool::generated_pool().) // // This factory is 100% thread-safe; calling GetPrototype() does not modify // any shared data. // // This factory is a singleton. The caller must not delete the object. static MessageFactory* generated_factory(); // For internal use only: Registers a .proto file at static initialization // time, to be placed in generated_factory. The first time GetPrototype() // is called with a descriptor from this file, |register_messages| will be // called, with the file name as the parameter. It must call // InternalRegisterGeneratedMessage() (below) to register each message type // in the file. This strange mechanism is necessary because descriptors are // built lazily, so we can't register types by their descriptor until we // know that the descriptor exists. |filename| must be a permanent string. static void InternalRegisterGeneratedFile( const char* filename, void (*register_messages)(const string&)); // For internal use only: Registers a message type. Called only by the // functions which are registered with InternalRegisterGeneratedFile(), // above. static void InternalRegisterGeneratedMessage(const Descriptor* descriptor, const Message* prototype); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFactory); }; #define DECLARE_GET_REPEATED_FIELD(TYPE) \ template<> \ LIBPROTOBUF_EXPORT \ const RepeatedField& Reflection::GetRepeatedField( \ const Message& message, const FieldDescriptor* field) const; \ \ template<> \ LIBPROTOBUF_EXPORT \ RepeatedField* Reflection::MutableRepeatedField( \ Message* message, const FieldDescriptor* field) const; DECLARE_GET_REPEATED_FIELD(int32) DECLARE_GET_REPEATED_FIELD(int64) DECLARE_GET_REPEATED_FIELD(uint32) DECLARE_GET_REPEATED_FIELD(uint64) DECLARE_GET_REPEATED_FIELD(float) DECLARE_GET_REPEATED_FIELD(double) DECLARE_GET_REPEATED_FIELD(bool) #undef DECLARE_GET_REPEATED_FIELD // ============================================================================= // Implementation details for {Get,Mutable}RawRepeatedPtrField. We provide // specializations for , and and handle // everything else with the default template which will match any type having // a method with signature "static const google::protobuf::Descriptor* descriptor()". // Such a type presumably is a descendant of google::protobuf::Message. template<> inline const RepeatedPtrField& Reflection::GetRepeatedPtrField( const Message& message, const FieldDescriptor* field) const { return *static_cast* >( MutableRawRepeatedString(const_cast(&message), field, true)); } template<> inline RepeatedPtrField* Reflection::MutableRepeatedPtrField( Message* message, const FieldDescriptor* field) const { return static_cast* >( MutableRawRepeatedString(message, field, true)); } // ----- template<> inline const RepeatedPtrField& Reflection::GetRepeatedPtrField( const Message& message, const FieldDescriptor* field) const { return *static_cast* >( GetRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, NULL)); } template<> inline RepeatedPtrField* Reflection::MutableRepeatedPtrField( Message* message, const FieldDescriptor* field) const { return static_cast* >( MutableRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, NULL)); } template inline const RepeatedPtrField& Reflection::GetRepeatedPtrField( const Message& message, const FieldDescriptor* field) const { return *static_cast* >( GetRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, PB::default_instance().GetDescriptor())); } template inline RepeatedPtrField* Reflection::MutableRepeatedPtrField( Message* message, const FieldDescriptor* field) const { return static_cast* >( MutableRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, PB::default_instance().GetDescriptor())); } } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_MESSAGE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/message_lite.cc000066400000000000000000000355421334102242000302520ustar00rootroot00000000000000// 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. // Authors: wink@google.com (Wink Saville), // kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { string MessageLite::InitializationErrorString() const { return "(cannot determine missing fields for lite message)"; } namespace { // When serializing, we first compute the byte size, then serialize the message. // If serialization produces a different number of bytes than expected, we // call this function, which crashes. The problem could be due to a bug in the // protobuf implementation but is more likely caused by concurrent modification // of the message. This function attempts to distinguish between the two and // provide a useful error message. void ByteSizeConsistencyError(size_t byte_size_before_serialization, size_t byte_size_after_serialization, size_t bytes_produced_by_serialization, const MessageLite& message) { GOOGLE_CHECK_EQ(byte_size_before_serialization, byte_size_after_serialization) << message.GetTypeName() << " was modified concurrently during serialization."; GOOGLE_CHECK_EQ(bytes_produced_by_serialization, byte_size_before_serialization) << "Byte size calculation and serialization were inconsistent. This " "may indicate a bug in protocol buffers or it may be caused by " "concurrent modification of " << message.GetTypeName() << "."; GOOGLE_LOG(FATAL) << "This shouldn't be called if all the sizes are equal."; } string InitializationErrorMessage(const char* action, const MessageLite& message) { // Note: We want to avoid depending on strutil in the lite library, otherwise // we'd use: // // return strings::Substitute( // "Can't $0 message of type \"$1\" because it is missing required " // "fields: $2", // action, message.GetTypeName(), // message.InitializationErrorString()); string result; result += "Can't "; result += action; result += " message of type \""; result += message.GetTypeName(); result += "\" because it is missing required fields: "; result += message.InitializationErrorString(); return result; } // Several of the Parse methods below just do one thing and then call another // method. In a naive implementation, we might have ParseFromString() call // ParseFromArray() which would call ParseFromZeroCopyStream() which would call // ParseFromCodedStream() which would call MergeFromCodedStream() which would // call MergePartialFromCodedStream(). However, when parsing very small // messages, every function call introduces significant overhead. To avoid // this without reproducing code, we use these forced-inline helpers. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InlineMergeFromCodedStream( io::CodedInputStream* input, MessageLite* message); GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InlineParseFromCodedStream( io::CodedInputStream* input, MessageLite* message); GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InlineParsePartialFromCodedStream( io::CodedInputStream* input, MessageLite* message); GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InlineParseFromArray( const void* data, int size, MessageLite* message); GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool InlineParsePartialFromArray( const void* data, int size, MessageLite* message); inline bool InlineMergeFromCodedStream(io::CodedInputStream* input, MessageLite* message) { if (!message->MergePartialFromCodedStream(input)) return false; if (!message->IsInitialized()) { GOOGLE_LOG(ERROR) << InitializationErrorMessage("parse", *message); return false; } return true; } inline bool InlineParseFromCodedStream(io::CodedInputStream* input, MessageLite* message) { message->Clear(); return InlineMergeFromCodedStream(input, message); } inline bool InlineParsePartialFromCodedStream(io::CodedInputStream* input, MessageLite* message) { message->Clear(); return message->MergePartialFromCodedStream(input); } inline bool InlineParseFromArray( const void* data, int size, MessageLite* message) { io::CodedInputStream input(reinterpret_cast(data), size); return InlineParseFromCodedStream(&input, message) && input.ConsumedEntireMessage(); } inline bool InlineParsePartialFromArray( const void* data, int size, MessageLite* message) { io::CodedInputStream input(reinterpret_cast(data), size); return InlineParsePartialFromCodedStream(&input, message) && input.ConsumedEntireMessage(); } } // namespace MessageLite* MessageLite::New(::google::protobuf::Arena* arena) const { MessageLite* message = New(); if (arena != NULL) { arena->Own(message); } return message; } bool MessageLite::MergeFromCodedStream(io::CodedInputStream* input) { return InlineMergeFromCodedStream(input, this); } bool MessageLite::ParseFromCodedStream(io::CodedInputStream* input) { return InlineParseFromCodedStream(input, this); } bool MessageLite::ParsePartialFromCodedStream(io::CodedInputStream* input) { return InlineParsePartialFromCodedStream(input, this); } bool MessageLite::ParseFromZeroCopyStream(io::ZeroCopyInputStream* input) { io::CodedInputStream decoder(input); return ParseFromCodedStream(&decoder) && decoder.ConsumedEntireMessage(); } bool MessageLite::ParsePartialFromZeroCopyStream( io::ZeroCopyInputStream* input) { io::CodedInputStream decoder(input); return ParsePartialFromCodedStream(&decoder) && decoder.ConsumedEntireMessage(); } bool MessageLite::ParseFromBoundedZeroCopyStream( io::ZeroCopyInputStream* input, int size) { io::CodedInputStream decoder(input); decoder.PushLimit(size); return ParseFromCodedStream(&decoder) && decoder.ConsumedEntireMessage() && decoder.BytesUntilLimit() == 0; } bool MessageLite::ParsePartialFromBoundedZeroCopyStream( io::ZeroCopyInputStream* input, int size) { io::CodedInputStream decoder(input); decoder.PushLimit(size); return ParsePartialFromCodedStream(&decoder) && decoder.ConsumedEntireMessage() && decoder.BytesUntilLimit() == 0; } bool MessageLite::ParseFromString(const string& data) { return InlineParseFromArray(data.data(), data.size(), this); } bool MessageLite::ParsePartialFromString(const string& data) { return InlineParsePartialFromArray(data.data(), data.size(), this); } bool MessageLite::ParseFromArray(const void* data, int size) { return InlineParseFromArray(data, size, this); } bool MessageLite::ParsePartialFromArray(const void* data, int size) { return InlineParsePartialFromArray(data, size, this); } // =================================================================== uint8* MessageLite::SerializeWithCachedSizesToArray(uint8* target) const { return InternalSerializeWithCachedSizesToArray( io::CodedOutputStream::IsDefaultSerializationDeterministic(), target); } bool MessageLite::SerializeToCodedStream(io::CodedOutputStream* output) const { GOOGLE_DCHECK(IsInitialized()) << InitializationErrorMessage("serialize", *this); return SerializePartialToCodedStream(output); } bool MessageLite::SerializePartialToCodedStream( io::CodedOutputStream* output) const { const size_t size = ByteSizeLong(); // Force size to be cached. if (size > INT_MAX) { GOOGLE_LOG(ERROR) << "Exceeded maximum protobuf size of 2GB: " << size; return false; } uint8* buffer = output->GetDirectBufferForNBytesAndAdvance(size); if (buffer != NULL) { uint8* end = InternalSerializeWithCachedSizesToArray( output->IsSerializationDeterministic(), buffer); if (end - buffer != size) { ByteSizeConsistencyError(size, ByteSizeLong(), end - buffer, *this); } return true; } else { int original_byte_count = output->ByteCount(); SerializeWithCachedSizes(output); if (output->HadError()) { return false; } int final_byte_count = output->ByteCount(); if (final_byte_count - original_byte_count != size) { ByteSizeConsistencyError(size, ByteSizeLong(), final_byte_count - original_byte_count, *this); } return true; } } bool MessageLite::SerializeToZeroCopyStream( io::ZeroCopyOutputStream* output) const { io::CodedOutputStream encoder(output); return SerializeToCodedStream(&encoder); } bool MessageLite::SerializePartialToZeroCopyStream( io::ZeroCopyOutputStream* output) const { io::CodedOutputStream encoder(output); return SerializePartialToCodedStream(&encoder); } bool MessageLite::AppendToString(string* output) const { GOOGLE_DCHECK(IsInitialized()) << InitializationErrorMessage("serialize", *this); return AppendPartialToString(output); } bool MessageLite::AppendPartialToString(string* output) const { size_t old_size = output->size(); size_t byte_size = ByteSizeLong(); if (byte_size > INT_MAX) { GOOGLE_LOG(ERROR) << "Exceeded maximum protobuf size of 2GB: " << byte_size; return false; } STLStringResizeUninitialized(output, old_size + byte_size); uint8* start = reinterpret_cast(io::mutable_string_data(output) + old_size); uint8* end = SerializeWithCachedSizesToArray(start); if (end - start != byte_size) { ByteSizeConsistencyError(byte_size, ByteSizeLong(), end - start, *this); } return true; } bool MessageLite::SerializeToString(string* output) const { output->clear(); return AppendToString(output); } bool MessageLite::SerializePartialToString(string* output) const { output->clear(); return AppendPartialToString(output); } bool MessageLite::SerializeToArray(void* data, int size) const { GOOGLE_DCHECK(IsInitialized()) << InitializationErrorMessage("serialize", *this); return SerializePartialToArray(data, size); } bool MessageLite::SerializePartialToArray(void* data, int size) const { int byte_size = ByteSizeLong(); if (size < byte_size) return false; uint8* start = reinterpret_cast(data); uint8* end = SerializeWithCachedSizesToArray(start); if (end - start != byte_size) { ByteSizeConsistencyError(byte_size, ByteSizeLong(), end - start, *this); } return true; } string MessageLite::SerializeAsString() const { // If the compiler implements the (Named) Return Value Optimization, // the local variable 'output' will not actually reside on the stack // of this function, but will be overlaid with the object that the // caller supplied for the return value to be constructed in. string output; if (!AppendToString(&output)) output.clear(); return output; } string MessageLite::SerializePartialAsString() const { string output; if (!AppendPartialToString(&output)) output.clear(); return output; } void MessageLite::SerializeWithCachedSizes( io::CodedOutputStream* output) const { GOOGLE_DCHECK(InternalGetTable()); internal::TableSerialize( *this, static_cast(InternalGetTable()), output); } // The table driven code optimizes the case that the CodedOutputStream buffer // is large enough to serialize into it directly. // If the proto is optimized for speed, this method will be overridden by // generated code for maximum speed. If the proto is optimized for size or // is lite, then we need to specialize this to avoid infinite recursion. uint8* MessageLite::InternalSerializeWithCachedSizesToArray( bool deterministic, uint8* target) const { const internal::SerializationTable* table = static_cast(InternalGetTable()); if (table == NULL) { // We only optimize this when using optimize_for = SPEED. In other cases // we just use the CodedOutputStream path. int size = GetCachedSize(); io::ArrayOutputStream out(target, size); io::CodedOutputStream coded_out(&out); coded_out.SetSerializationDeterministic(deterministic); SerializeWithCachedSizes(&coded_out); GOOGLE_CHECK(!coded_out.HadError()); return target + size; } else { return internal::TableSerializeToArray(*this, table, deterministic, target); } } namespace internal { template<> MessageLite* GenericTypeHandler::NewFromPrototype( const MessageLite* prototype, google::protobuf::Arena* arena) { return prototype->New(arena); } template <> void GenericTypeHandler::Merge(const MessageLite& from, MessageLite* to) { to->CheckTypeAndMergeFrom(from); } template<> void GenericTypeHandler::Merge(const string& from, string* to) { *to = from; } bool proto3_preserve_unknown_ = true; void SetProto3PreserveUnknownsDefault(bool preserve) { proto3_preserve_unknown_ = preserve; } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/message_lite.h000066400000000000000000000444521334102242000301140ustar00rootroot00000000000000// 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. // Authors: wink@google.com (Wink Saville), // kenton@google.com (Kenton Varda) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. // // Defines MessageLite, the abstract interface implemented by all (lite // and non-lite) protocol message objects. #ifndef GOOGLE_PROTOBUF_MESSAGE_LITE_H__ #define GOOGLE_PROTOBUF_MESSAGE_LITE_H__ #include #include #include #include #include namespace google { namespace protobuf { class Arena; namespace io { class CodedInputStream; class CodedOutputStream; class ZeroCopyInputStream; class ZeroCopyOutputStream; } namespace internal { class WireFormatLite; #ifndef SWIG // We compute sizes as size_t but cache them as int. This function converts a // computed size to a cached size. Since we don't proceed with serialization // if the total size was > INT_MAX, it is not important what this function // returns for inputs > INT_MAX. However this case should not error or // GOOGLE_CHECK-fail, because the full size_t resolution is still returned from // ByteSizeLong() and checked against INT_MAX; we can catch the overflow // there. inline int ToCachedSize(size_t size) { return static_cast(size); } // We mainly calculate sizes in terms of size_t, but some functions that // compute sizes return "int". These int sizes are expected to always be // positive. This function is more efficient than casting an int to size_t // directly on 64-bit platforms because it avoids making the compiler emit a // sign extending instruction, which we don't want and don't want to pay for. inline size_t FromIntSize(int size) { // Convert to unsigned before widening so sign extension is not necessary. return static_cast(size); } // For cases where a legacy function returns an integer size. We GOOGLE_DCHECK() // that the conversion will fit within an integer; if this is false then we // are losing information. inline int ToIntSize(size_t size) { GOOGLE_DCHECK_LE(size, static_cast(INT_MAX)); return static_cast(size); } // This type wraps a variable whose constructor and destructor are explicitly // called. It is particularly useful for a global variable, without its // constructor and destructor run on start and end of the program lifetime. // This circumvents the initial construction order fiasco, while keeping // the address of the empty string a compile time constant. // // Pay special attention to the initialization state of the object. // 1. The object is "uninitialized" to begin with. // 2. Call DefaultConstruct() only if the object is uninitialized. // After the call, the object becomes "initialized". // 3. Call get() and get_mutable() only if the object is initialized. // 4. Call Destruct() only if the object is initialized. // After the call, the object becomes uninitialized. template class ExplicitlyConstructed { public: void DefaultConstruct() { new (&union_) T(); } void Destruct() { get_mutable()->~T(); } #if LANG_CXX11 constexpr #endif const T& get() const { return reinterpret_cast(union_); } T* get_mutable() { return reinterpret_cast(&union_); } private: // Prefer c++14 aligned_storage, but for compatibility this will do. union AlignedUnion { char space[sizeof(T)]; int64 align_to_int64; void* align_to_ptr; } union_; }; // Default empty string object. Don't use this directly. Instead, call // GetEmptyString() to get the reference. extern ExplicitlyConstructed< ::std::string> fixed_address_empty_string; LIBPROTOBUF_EXPORT extern ProtobufOnceType empty_string_once_init_; LIBPROTOBUF_EXPORT void InitEmptyString(); LIBPROTOBUF_EXPORT inline const ::std::string& GetEmptyStringAlreadyInited() { return fixed_address_empty_string.get(); } LIBPROTOBUF_EXPORT inline const ::std::string& GetEmptyString() { ::google::protobuf::GoogleOnceInit(&empty_string_once_init_, &InitEmptyString); return GetEmptyStringAlreadyInited(); } LIBPROTOBUF_EXPORT size_t StringSpaceUsedExcludingSelfLong(const string& str); #endif // SWIG } // namespace internal // Interface to light weight protocol messages. // // This interface is implemented by all protocol message objects. Non-lite // messages additionally implement the Message interface, which is a // subclass of MessageLite. Use MessageLite instead when you only need // the subset of features which it supports -- namely, nothing that uses // descriptors or reflection. You can instruct the protocol compiler // to generate classes which implement only MessageLite, not the full // Message interface, by adding the following line to the .proto file: // // option optimize_for = LITE_RUNTIME; // // This is particularly useful on resource-constrained systems where // the full protocol buffers runtime library is too big. // // Note that on non-constrained systems (e.g. servers) when you need // to link in lots of protocol definitions, a better way to reduce // total code footprint is to use optimize_for = CODE_SIZE. This // will make the generated code smaller while still supporting all the // same features (at the expense of speed). optimize_for = LITE_RUNTIME // is best when you only have a small number of message types linked // into your binary, in which case the size of the protocol buffers // runtime itself is the biggest problem. class LIBPROTOBUF_EXPORT MessageLite { public: inline MessageLite() {} virtual ~MessageLite() {} // Basic Operations ------------------------------------------------ // Get the name of this message type, e.g. "foo.bar.BazProto". virtual string GetTypeName() const = 0; // Construct a new instance of the same type. Ownership is passed to the // caller. virtual MessageLite* New() const = 0; // Construct a new instance on the arena. Ownership is passed to the caller // if arena is a NULL. Default implementation for backwards compatibility. virtual MessageLite* New(::google::protobuf::Arena* arena) const; // Get the arena, if any, associated with this message. Virtual method // required for generic operations but most arena-related operations should // use the GetArenaNoVirtual() generated-code method. Default implementation // to reduce code size by avoiding the need for per-type implementations // when types do not implement arena support. virtual ::google::protobuf::Arena* GetArena() const { return NULL; } // Get a pointer that may be equal to this message's arena, or may not be. // If the value returned by this method is equal to some arena pointer, then // this message is on that arena; however, if this message is on some arena, // this method may or may not return that arena's pointer. As a tradeoff, // this method may be more efficient than GetArena(). The intent is to allow // underlying representations that use e.g. tagged pointers to sometimes // store the arena pointer directly, and sometimes in a more indirect way, // and allow a fastpath comparison against the arena pointer when it's easy // to obtain. virtual void* GetMaybeArenaPointer() const { return GetArena(); } // Clear all fields of the message and set them to their default values. // Clear() avoids freeing memory, assuming that any memory allocated // to hold parts of the message will be needed again to hold the next // message. If you actually want to free the memory used by a Message, // you must delete it. virtual void Clear() = 0; // Quickly check if all required fields have values set. virtual bool IsInitialized() const = 0; // This is not implemented for Lite messages -- it just returns "(cannot // determine missing fields for lite message)". However, it is implemented // for full messages. See message.h. virtual string InitializationErrorString() const; // If |other| is the exact same class as this, calls MergeFrom(). Otherwise, // results are undefined (probably crash). virtual void CheckTypeAndMergeFrom(const MessageLite& other) = 0; // Parsing --------------------------------------------------------- // Methods for parsing in protocol buffer format. Most of these are // just simple wrappers around MergeFromCodedStream(). Clear() will be // called before merging the input. // Fill the message with a protocol buffer parsed from the given input // stream. Returns false on a read error or if the input is in the wrong // format. A successful return does not indicate the entire input is // consumed, ensure you call ConsumedEntireMessage() to check that if // applicable. bool ParseFromCodedStream(io::CodedInputStream* input); // Like ParseFromCodedStream(), but accepts messages that are missing // required fields. bool ParsePartialFromCodedStream(io::CodedInputStream* input); // Read a protocol buffer from the given zero-copy input stream. If // successful, the entire input will be consumed. bool ParseFromZeroCopyStream(io::ZeroCopyInputStream* input); // Like ParseFromZeroCopyStream(), but accepts messages that are missing // required fields. bool ParsePartialFromZeroCopyStream(io::ZeroCopyInputStream* input); // Read a protocol buffer from the given zero-copy input stream, expecting // the message to be exactly "size" bytes long. If successful, exactly // this many bytes will have been consumed from the input. bool ParseFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input, int size); // Like ParseFromBoundedZeroCopyStream(), but accepts messages that are // missing required fields. bool ParsePartialFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input, int size); // Parses a protocol buffer contained in a string. Returns true on success. // This function takes a string in the (non-human-readable) binary wire // 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(). bool ParseFromString(const string& data); // Like ParseFromString(), but accepts messages that are missing // required fields. bool ParsePartialFromString(const string& data); // Parse a protocol buffer contained in an array of bytes. bool ParseFromArray(const void* data, int size); // Like ParseFromArray(), but accepts messages that are missing // required fields. bool ParsePartialFromArray(const void* data, int size); // Reads a protocol buffer from the stream and merges it into this // Message. Singular fields read from the input overwrite what is // already in the Message and repeated fields are appended to those // already present. // // It is the responsibility of the caller to call input->LastTagWas() // (for groups) or input->ConsumedEntireMessage() (for non-groups) after // this returns to verify that the message's end was delimited correctly. // // ParsefromCodedStream() is implemented as Clear() followed by // MergeFromCodedStream(). bool MergeFromCodedStream(io::CodedInputStream* input); // Like MergeFromCodedStream(), but succeeds even if required fields are // missing in the input. // // MergeFromCodedStream() is just implemented as MergePartialFromCodedStream() // followed by IsInitialized(). virtual bool MergePartialFromCodedStream(io::CodedInputStream* input) = 0; // Serialization --------------------------------------------------- // Methods for serializing in protocol buffer format. Most of these // are just simple wrappers around ByteSize() and SerializeWithCachedSizes(). // Write a protocol buffer of this message to the given output. Returns // false on a write error. If the message is missing required fields, // this may GOOGLE_CHECK-fail. bool SerializeToCodedStream(io::CodedOutputStream* output) const; // Like SerializeToCodedStream(), but allows missing required fields. bool SerializePartialToCodedStream(io::CodedOutputStream* output) const; // Write the message to the given zero-copy output stream. All required // fields must be set. bool SerializeToZeroCopyStream(io::ZeroCopyOutputStream* output) const; // Like SerializeToZeroCopyStream(), but allows missing required fields. bool SerializePartialToZeroCopyStream(io::ZeroCopyOutputStream* output) const; // Serialize the message and store it in the given string. All required // fields must be set. bool SerializeToString(string* output) const; // Like SerializeToString(), but allows missing required fields. bool SerializePartialToString(string* output) const; // Serialize the message and store it in the given byte array. All required // fields must be set. bool SerializeToArray(void* data, int size) const; // Like SerializeToArray(), but allows missing required fields. bool SerializePartialToArray(void* data, int size) const; // Make a string encoding the message. Is equivalent to calling // SerializeToString() on a string and using that. Returns the empty // string if SerializeToString() would have returned an error. // Note: If you intend to generate many such strings, you may // reduce heap fragmentation by instead re-using the same string // object with calls to SerializeToString(). string SerializeAsString() const; // Like SerializeAsString(), but allows missing required fields. string SerializePartialAsString() const; // Like SerializeToString(), but appends to the data to the string's existing // contents. All required fields must be set. bool AppendToString(string* output) const; // Like AppendToString(), but allows missing required fields. bool AppendPartialToString(string* output) const; // Computes the serialized size of the message. This recursively calls // ByteSizeLong() on all embedded messages. // // ByteSizeLong() is generally linear in the number of fields defined for the // proto. virtual size_t ByteSizeLong() const = 0; // Legacy ByteSize() API. PROTOBUF_RUNTIME_DEPRECATED("Please use ByteSizeLong() instead") int ByteSize() const { return internal::ToIntSize(ByteSizeLong()); } // Serializes the message without recomputing the size. The message must not // have changed since the last call to ByteSize(), and the value returned by // ByteSize must be non-negative. Otherwise the results are undefined. virtual void SerializeWithCachedSizes( io::CodedOutputStream* output) const; // Functions below here are not part of the public interface. It isn't // enforced, but they should be treated as private, and will be private // at some future time. Unfortunately the implementation of the "friend" // keyword in GCC is broken at the moment, but we expect it will be fixed. // Like SerializeWithCachedSizes, but writes directly to *target, returning // a pointer to the byte immediately after the last byte written. "target" // must point at a byte array of at least ByteSize() bytes. Whether to use // deterministic serialization, e.g., maps in sorted order, is determined by // CodedOutputStream::IsDefaultSerializationDeterministic(). virtual uint8* SerializeWithCachedSizesToArray(uint8* target) const; // Returns the result of the last call to ByteSize(). An embedded message's // size is needed both to serialize it (because embedded messages are // length-delimited) and to compute the outer message's size. Caching // the size avoids computing it multiple times. // // ByteSize() does not automatically use the cached size when available // because this would require invalidating it every time the message was // modified, which would be too hard and expensive. (E.g. if a deeply-nested // sub-message is changed, all of its parents' cached sizes would need to be // invalidated, which is too much work for an otherwise inlined setter // method.) virtual int GetCachedSize() const = 0; virtual uint8* InternalSerializeWithCachedSizesToArray(bool deterministic, uint8* target) const; private: // TODO(gerbens) make this a pure abstract function virtual const void* InternalGetTable() const { return NULL; } friend class internal::WireFormatLite; friend class Message; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageLite); }; namespace internal { extern bool LIBPROTOBUF_EXPORT proto3_preserve_unknown_; // DO NOT USE: For migration only. Will be removed when Proto3 defaults to // preserve unknowns. inline bool GetProto3PreserveUnknownsDefault() { return proto3_preserve_unknown_; } // DO NOT USE: For migration only. Will be removed when Proto3 defaults to // preserve unknowns. void LIBPROTOBUF_EXPORT SetProto3PreserveUnknownsDefault(bool preserve); } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_MESSAGE_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/message_unittest.cc000066400000000000000000000450271334102242000311730ustar00rootroot00000000000000// 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 #include #include #include #ifndef _MSC_VER #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { #if defined(_WIN32) // DO NOT include , instead create functions in io_win32.{h,cc} and import // them like we do below. using google::protobuf::internal::win32::close; using google::protobuf::internal::win32::open; #endif #ifndef O_BINARY #ifdef _O_BINARY #define O_BINARY _O_BINARY #else #define O_BINARY 0 // If this isn't defined, the platform doesn't need it. #endif #endif TEST(MessageTest, SerializeHelpers) { // TODO(kenton): Test more helpers? They're all two-liners so it seems // like a waste of time. protobuf_unittest::TestAllTypes message; TestUtil::SetAllFields(&message); std::stringstream stream; string str1("foo"); string str2("bar"); EXPECT_TRUE(message.SerializeToString(&str1)); EXPECT_TRUE(message.AppendToString(&str2)); EXPECT_TRUE(message.SerializeToOstream(&stream)); EXPECT_EQ(str1.size() + 3, str2.size()); EXPECT_EQ("bar", str2.substr(0, 3)); // Don't use EXPECT_EQ because we don't want to dump raw binary data to // stdout. EXPECT_TRUE(str2.substr(3) == str1); // GCC gives some sort of error if we try to just do stream.str() == str1. string temp = stream.str(); EXPECT_TRUE(temp == str1); EXPECT_TRUE(message.SerializeAsString() == str1); } TEST(MessageTest, SerializeToBrokenOstream) { std::ofstream out; protobuf_unittest::TestAllTypes message; message.set_optional_int32(123); EXPECT_FALSE(message.SerializeToOstream(&out)); } TEST(MessageTest, ParseFromFileDescriptor) { string filename = TestSourceDir() + "/google/protobuf/testdata/golden_message"; int file = open(filename.c_str(), O_RDONLY | O_BINARY); ASSERT_GE(file, 0); protobuf_unittest::TestAllTypes message; EXPECT_TRUE(message.ParseFromFileDescriptor(file)); TestUtil::ExpectAllFieldsSet(message); EXPECT_GE(close(file), 0); } TEST(MessageTest, ParsePackedFromFileDescriptor) { string filename = TestSourceDir() + "/google/protobuf/testdata/golden_packed_fields_message"; int file = open(filename.c_str(), O_RDONLY | O_BINARY); ASSERT_GE(file, 0); protobuf_unittest::TestPackedTypes message; EXPECT_TRUE(message.ParseFromFileDescriptor(file)); TestUtil::ExpectPackedFieldsSet(message); EXPECT_GE(close(file), 0); } TEST(MessageTest, ParseHelpers) { // TODO(kenton): Test more helpers? They're all two-liners so it seems // like a waste of time. string data; { // Set up. protobuf_unittest::TestAllTypes message; TestUtil::SetAllFields(&message); message.SerializeToString(&data); } { // Test ParseFromString. protobuf_unittest::TestAllTypes message; EXPECT_TRUE(message.ParseFromString(data)); TestUtil::ExpectAllFieldsSet(message); } { // Test ParseFromIstream. protobuf_unittest::TestAllTypes message; std::stringstream stream(data); EXPECT_TRUE(message.ParseFromIstream(&stream)); EXPECT_TRUE(stream.eof()); TestUtil::ExpectAllFieldsSet(message); } { // Test ParseFromBoundedZeroCopyStream. string data_with_junk(data); data_with_junk.append("some junk on the end"); io::ArrayInputStream stream(data_with_junk.data(), data_with_junk.size()); protobuf_unittest::TestAllTypes message; EXPECT_TRUE(message.ParseFromBoundedZeroCopyStream(&stream, data.size())); TestUtil::ExpectAllFieldsSet(message); } { // Test that ParseFromBoundedZeroCopyStream fails (but doesn't crash) if // EOF is reached before the expected number of bytes. io::ArrayInputStream stream(data.data(), data.size()); protobuf_unittest::TestAllTypes message; EXPECT_FALSE( message.ParseFromBoundedZeroCopyStream(&stream, data.size() + 1)); } } TEST(MessageTest, ParseFailsIfNotInitialized) { unittest::TestRequired message; std::vector errors; { ScopedMemoryLog log; EXPECT_FALSE(message.ParseFromString("")); errors = log.GetMessages(ERROR); } ASSERT_EQ(1, errors.size()); EXPECT_EQ("Can't parse message of type \"protobuf_unittest.TestRequired\" " "because it is missing required fields: a, b, c", errors[0]); } TEST(MessageTest, BypassInitializationCheckOnParse) { unittest::TestRequired message; io::ArrayInputStream raw_input(NULL, 0); io::CodedInputStream input(&raw_input); EXPECT_TRUE(message.MergePartialFromCodedStream(&input)); } TEST(MessageTest, InitializationErrorString) { unittest::TestRequired message; EXPECT_EQ("a, b, c", message.InitializationErrorString()); } TEST(MessageTest, DynamicCastToGenerated) { unittest::TestAllTypes test_all_types; google::protobuf::Message* test_all_types_pointer = &test_all_types; EXPECT_EQ(&test_all_types, google::protobuf::internal::DynamicCastToGenerated( test_all_types_pointer)); EXPECT_EQ(NULL, google::protobuf::internal::DynamicCastToGenerated( test_all_types_pointer)); const google::protobuf::Message* test_all_types_pointer_const = &test_all_types; EXPECT_EQ( &test_all_types, google::protobuf::internal::DynamicCastToGenerated( test_all_types_pointer_const)); EXPECT_EQ( NULL, google::protobuf::internal::DynamicCastToGenerated( test_all_types_pointer_const)); } #ifdef PROTOBUF_HAS_DEATH_TEST // death tests do not work on Windows yet. TEST(MessageTest, SerializeFailsIfNotInitialized) { unittest::TestRequired message; string data; EXPECT_DEBUG_DEATH(EXPECT_TRUE(message.SerializeToString(&data)), "Can't serialize message of type \"protobuf_unittest.TestRequired\" because " "it is missing required fields: a, b, c"); } TEST(MessageTest, CheckInitialized) { unittest::TestRequired message; EXPECT_DEATH(message.CheckInitialized(), "Message of type \"protobuf_unittest.TestRequired\" is missing required " "fields: a, b, c"); } #endif // PROTOBUF_HAS_DEATH_TEST namespace { // An input stream that repeats a string's content for a number of times. It // helps us create a really large input without consuming too much memory. Used // to test the parsing behavior when the input size exceeds 2G or close to it. class RepeatedInputStream : public io::ZeroCopyInputStream { public: RepeatedInputStream(const string& data, size_t count) : data_(data), count_(count), position_(0), total_byte_count_(0) {} virtual bool Next(const void** data, int* size) { if (position_ == data_.size()) { if (--count_ == 0) { return false; } position_ = 0; } *data = &data_[position_]; *size = static_cast(data_.size() - position_); position_ = data_.size(); total_byte_count_ += *size; return true; } virtual void BackUp(int count) { position_ -= static_cast(count); total_byte_count_ -= count; } virtual bool Skip(int count) { while (count > 0) { const void* data; int size; if (!Next(&data, &size)) { break; } if (size >= count) { BackUp(size - count); return true; } else { count -= size; } } return false; } virtual int64 ByteCount() const { return total_byte_count_; } private: string data_; size_t count_; // The number of strings that haven't been consuemd. size_t position_; // Position in the string for the next read. int64 total_byte_count_; }; } // namespace TEST(MessageTest, TestParseMessagesCloseTo2G) { // Create a message with a large string field. string value = string(64 * 1024 * 1024, 'x'); protobuf_unittest::TestAllTypes message; message.set_optional_string(value); // Repeat this message in the input stream to make the total input size // close to 2G. string data = message.SerializeAsString(); size_t count = static_cast(kint32max) / data.size(); RepeatedInputStream input(data, count); // The parsing should succeed. protobuf_unittest::TestAllTypes result; EXPECT_TRUE(result.ParseFromZeroCopyStream(&input)); // When there are multiple occurences of a singulr field, the last one // should win. EXPECT_EQ(value, result.optional_string()); } TEST(MessageTest, TestParseMessagesOver2G) { // Create a message with a large string field. string value = string(64 * 1024 * 1024, 'x'); protobuf_unittest::TestAllTypes message; message.set_optional_string(value); // Repeat this message in the input stream to make the total input size // larger than 2G. string data = message.SerializeAsString(); size_t count = static_cast(kint32max) / data.size() + 1; RepeatedInputStream input(data, count); // The parsing should fail. protobuf_unittest::TestAllTypes result; EXPECT_FALSE(result.ParseFromZeroCopyStream(&input)); } TEST(MessageTest, BypassInitializationCheckOnSerialize) { unittest::TestRequired message; io::ArrayOutputStream raw_output(NULL, 0); io::CodedOutputStream output(&raw_output); EXPECT_TRUE(message.SerializePartialToCodedStream(&output)); } TEST(MessageTest, FindInitializationErrors) { unittest::TestRequired message; std::vector errors; message.FindInitializationErrors(&errors); ASSERT_EQ(3, errors.size()); EXPECT_EQ("a", errors[0]); EXPECT_EQ("b", errors[1]); EXPECT_EQ("c", errors[2]); } TEST(MessageTest, ParseFailsOnInvalidMessageEnd) { unittest::TestAllTypes message; // Control case. EXPECT_TRUE(message.ParseFromArray("", 0)); // The byte is a valid varint, but not a valid tag (zero). EXPECT_FALSE(message.ParseFromArray("\0", 1)); // The byte is a malformed varint. EXPECT_FALSE(message.ParseFromArray("\200", 1)); // The byte is an endgroup tag, but we aren't parsing a group. EXPECT_FALSE(message.ParseFromArray("\014", 1)); } // Regression test for b/23630858 TEST(MessageTest, MessageIsStillValidAfterParseFails) { unittest::TestAllTypes message; // 9 0xFFs for the "optional_uint64" field. string invalid_data = "\x20\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"; EXPECT_FALSE(message.ParseFromString(invalid_data)); message.Clear(); EXPECT_EQ(0, message.optional_uint64()); // invalid data for field "optional_string". Length prefix is 1 but no // payload. string invalid_string_data = "\x72\x01"; { google::protobuf::Arena arena; unittest::TestAllTypes* arena_message = google::protobuf::Arena::CreateMessage(&arena); EXPECT_FALSE(arena_message->ParseFromString(invalid_string_data)); arena_message->Clear(); EXPECT_EQ("", arena_message->optional_string()); } } namespace { void ExpectMessageMerged(const unittest::TestAllTypes& message) { EXPECT_EQ(3, message.optional_int32()); EXPECT_EQ(2, message.optional_int64()); EXPECT_EQ("hello", message.optional_string()); } void AssignParsingMergeMessages( unittest::TestAllTypes* msg1, unittest::TestAllTypes* msg2, unittest::TestAllTypes* msg3) { msg1->set_optional_int32(1); msg2->set_optional_int64(2); msg3->set_optional_int32(3); msg3->set_optional_string("hello"); } } // namespace // Test that if an optional or required message/group field appears multiple // times in the input, they need to be merged. TEST(MessageTest, ParsingMerge) { unittest::TestParsingMerge::RepeatedFieldsGenerator generator; unittest::TestAllTypes* msg1; unittest::TestAllTypes* msg2; unittest::TestAllTypes* msg3; #define ASSIGN_REPEATED_FIELD(FIELD) \ msg1 = generator.add_##FIELD(); \ msg2 = generator.add_##FIELD(); \ msg3 = generator.add_##FIELD(); \ AssignParsingMergeMessages(msg1, msg2, msg3) ASSIGN_REPEATED_FIELD(field1); ASSIGN_REPEATED_FIELD(field2); ASSIGN_REPEATED_FIELD(field3); ASSIGN_REPEATED_FIELD(ext1); ASSIGN_REPEATED_FIELD(ext2); #undef ASSIGN_REPEATED_FIELD #define ASSIGN_REPEATED_GROUP(FIELD) \ msg1 = generator.add_##FIELD()->mutable_field1(); \ msg2 = generator.add_##FIELD()->mutable_field1(); \ msg3 = generator.add_##FIELD()->mutable_field1(); \ AssignParsingMergeMessages(msg1, msg2, msg3) ASSIGN_REPEATED_GROUP(group1); ASSIGN_REPEATED_GROUP(group2); #undef ASSIGN_REPEATED_GROUP string buffer; generator.SerializeToString(&buffer); unittest::TestParsingMerge parsing_merge; parsing_merge.ParseFromString(buffer); // Required and optional fields should be merged. ExpectMessageMerged(parsing_merge.required_all_types()); ExpectMessageMerged(parsing_merge.optional_all_types()); ExpectMessageMerged( parsing_merge.optionalgroup().optional_group_all_types()); ExpectMessageMerged( parsing_merge.GetExtension(unittest::TestParsingMerge::optional_ext)); // Repeated fields should not be merged. EXPECT_EQ(3, parsing_merge.repeated_all_types_size()); EXPECT_EQ(3, parsing_merge.repeatedgroup_size()); EXPECT_EQ(3, parsing_merge.ExtensionSize( unittest::TestParsingMerge::repeated_ext)); } TEST(MessageTest, MergeFrom) { unittest::TestAllTypes source; unittest::TestAllTypes dest; // Optional fields source.set_optional_int32(1); // only source source.set_optional_int64(2); // both source and dest dest.set_optional_int64(3); dest.set_optional_uint32(4); // only dest // Optional fields with defaults source.set_default_int32(13); // only source source.set_default_int64(14); // both source and dest dest.set_default_int64(15); dest.set_default_uint32(16); // only dest // Repeated fields source.add_repeated_int32(5); // only source source.add_repeated_int32(6); source.add_repeated_int64(7); // both source and dest source.add_repeated_int64(8); dest.add_repeated_int64(9); dest.add_repeated_int64(10); dest.add_repeated_uint32(11); // only dest dest.add_repeated_uint32(12); dest.MergeFrom(source); // Optional fields: source overwrites dest if source is specified EXPECT_EQ(1, dest.optional_int32()); // only source: use source EXPECT_EQ(2, dest.optional_int64()); // source and dest: use source EXPECT_EQ(4, dest.optional_uint32()); // only dest: use dest EXPECT_EQ(0, dest.optional_uint64()); // neither: use default // Optional fields with defaults EXPECT_EQ(13, dest.default_int32()); // only source: use source EXPECT_EQ(14, dest.default_int64()); // source and dest: use source EXPECT_EQ(16, dest.default_uint32()); // only dest: use dest EXPECT_EQ(44, dest.default_uint64()); // neither: use default // Repeated fields: concatenate source onto the end of dest ASSERT_EQ(2, dest.repeated_int32_size()); EXPECT_EQ(5, dest.repeated_int32(0)); EXPECT_EQ(6, dest.repeated_int32(1)); ASSERT_EQ(4, dest.repeated_int64_size()); EXPECT_EQ(9, dest.repeated_int64(0)); EXPECT_EQ(10, dest.repeated_int64(1)); EXPECT_EQ(7, dest.repeated_int64(2)); EXPECT_EQ(8, dest.repeated_int64(3)); ASSERT_EQ(2, dest.repeated_uint32_size()); EXPECT_EQ(11, dest.repeated_uint32(0)); EXPECT_EQ(12, dest.repeated_uint32(1)); ASSERT_EQ(0, dest.repeated_uint64_size()); } TEST(MessageTest, IsInitialized) { protobuf_unittest::TestIsInitialized msg; EXPECT_TRUE(msg.IsInitialized()); protobuf_unittest::TestIsInitialized::SubMessage* sub_message = msg.mutable_sub_message(); EXPECT_TRUE(msg.IsInitialized()); protobuf_unittest::TestIsInitialized::SubMessage::SubGroup* sub_group = sub_message->mutable_subgroup(); EXPECT_FALSE(msg.IsInitialized()); sub_group->set_i(1); EXPECT_TRUE(msg.IsInitialized()); } TEST(MessageFactoryTest, GeneratedFactoryLookup) { EXPECT_EQ( MessageFactory::generated_factory()->GetPrototype( protobuf_unittest::TestAllTypes::descriptor()), &protobuf_unittest::TestAllTypes::default_instance()); } TEST(MessageFactoryTest, GeneratedFactoryUnknownType) { // Construct a new descriptor. DescriptorPool pool; FileDescriptorProto file; file.set_name("foo.proto"); file.add_message_type()->set_name("Foo"); const Descriptor* descriptor = pool.BuildFile(file)->message_type(0); // Trying to construct it should return NULL. EXPECT_TRUE( MessageFactory::generated_factory()->GetPrototype(descriptor) == NULL); } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/metadata.h000066400000000000000000000060461334102242000272300ustar00rootroot00000000000000// 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 header file defines an internal class that encapsulates internal message // metadata (Unknown-field set, Arena pointer, ...) and allows its // representation to be made more space-efficient via various optimizations. // // Note that this is distinct from google::protobuf::Metadata, which encapsulates // Descriptor and Reflection pointers. #ifndef GOOGLE_PROTOBUF_METADATA_H__ #define GOOGLE_PROTOBUF_METADATA_H__ #include #include namespace google { namespace protobuf { namespace internal { class InternalMetadataWithArena : public InternalMetadataWithArenaBase { public: InternalMetadataWithArena() {} explicit InternalMetadataWithArena(Arena* arena) : InternalMetadataWithArenaBase(arena) {} void DoSwap(UnknownFieldSet* other) { mutable_unknown_fields()->Swap(other); } void DoMergeFrom(const UnknownFieldSet& other) { mutable_unknown_fields()->MergeFrom(other); } void DoClear() { mutable_unknown_fields()->Clear(); } static const UnknownFieldSet& default_instance() { return *UnknownFieldSet::default_instance(); } }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_METADATA_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/metadata_lite.h000066400000000000000000000200041334102242000302330ustar00rootroot00000000000000// 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_METADATA_LITE_H__ #define GOOGLE_PROTOBUF_METADATA_LITE_H__ #include #include #include #include namespace google { namespace protobuf { namespace internal { // This is the representation for messages that support arena allocation. It // uses a tagged pointer to either store the Arena pointer, if there are no // unknown fields, or a pointer to a block of memory with both the Arena pointer // and the UnknownFieldSet, if there are unknown fields. This optimization // allows for "zero-overhead" storage of the Arena pointer, relative to the // above baseline implementation. // // The tagged pointer uses the LSB to disambiguate cases, and uses bit 0 == 0 to // indicate an arena pointer and bit 0 == 1 to indicate a UFS+Arena-container // pointer. template class InternalMetadataWithArenaBase { public: InternalMetadataWithArenaBase() : ptr_(NULL) {} explicit InternalMetadataWithArenaBase(Arena* arena) : ptr_(arena) {} ~InternalMetadataWithArenaBase() { if (have_unknown_fields() && arena() == NULL) { delete PtrValue(); } ptr_ = NULL; } GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE const T& unknown_fields() const { if (GOOGLE_PREDICT_FALSE(have_unknown_fields())) { return PtrValue()->unknown_fields; } else { return Derived::default_instance(); } } GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* mutable_unknown_fields() { if (GOOGLE_PREDICT_TRUE(have_unknown_fields())) { return &PtrValue()->unknown_fields; } else { return mutable_unknown_fields_slow(); } } GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE Arena* arena() const { if (GOOGLE_PREDICT_FALSE(have_unknown_fields())) { return PtrValue()->arena; } else { return PtrValue(); } } GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE bool have_unknown_fields() const { return PtrTag() == kTagContainer; } GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void Swap(Derived* other) { // Semantics here are that we swap only the unknown fields, not the arena // pointer. We cannot simply swap ptr_ with other->ptr_ because we need to // maintain our own arena ptr. Also, our ptr_ and other's ptr_ may be in // different states (direct arena pointer vs. container with UFS) so we // cannot simply swap ptr_ and then restore the arena pointers. We reuse // UFS's swap implementation instead. if (have_unknown_fields() || other->have_unknown_fields()) { static_cast(this)->DoSwap(other->mutable_unknown_fields()); } } GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void MergeFrom(const Derived& other) { if (other.have_unknown_fields()) { static_cast(this)->DoMergeFrom(other.unknown_fields()); } } GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void Clear() { if (have_unknown_fields()) { static_cast(this)->DoClear(); } } GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void* raw_arena_ptr() const { return ptr_; } private: void* ptr_; // Tagged pointer implementation. enum { // ptr_ is an Arena*. kTagArena = 0, // ptr_ is a Container*. kTagContainer = 1, }; static const intptr_t kPtrTagMask = 1; static const intptr_t kPtrValueMask = ~kPtrTagMask; // Accessors for pointer tag and pointer value. GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE int PtrTag() const { return reinterpret_cast(ptr_) & kPtrTagMask; } template U* PtrValue() const { return reinterpret_cast( reinterpret_cast(ptr_) & kPtrValueMask); } // If ptr_'s tag is kTagContainer, it points to an instance of this struct. struct Container { T unknown_fields; Arena* arena; }; GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE T* mutable_unknown_fields_slow() { Arena* my_arena = arena(); Container* container = Arena::Create(my_arena); // Two-step assignment works around a bug in clang's static analyzer: // https://bugs.llvm.org/show_bug.cgi?id=34198. ptr_ = container; ptr_ = reinterpret_cast( reinterpret_cast(ptr_) | kTagContainer); container->arena = my_arena; return &(container->unknown_fields); } }; // We store unknown fields as a string right now, because there is currently no // good interface for reading unknown fields into an ArenaString. We may want // to revisit this to allow unknown fields to be parsed onto the Arena. class InternalMetadataWithArenaLite : public InternalMetadataWithArenaBase { public: InternalMetadataWithArenaLite() {} explicit InternalMetadataWithArenaLite(Arena* arena) : InternalMetadataWithArenaBase(arena) {} void DoSwap(string* other) { mutable_unknown_fields()->swap(*other); } void DoMergeFrom(const string& other) { mutable_unknown_fields()->append(other); } void DoClear() { mutable_unknown_fields()->clear(); } static const string& default_instance() { return GetEmptyStringAlreadyInited(); } }; // 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 the // parse won't work, because the destructor of StringOutputStream needs to be // called before we can modify the string (it check-fails). Using // LiteUnknownFieldSetter setter(&_internal_metadata_); // StringOutputStream stream(setter.buffer()); // guarantees that the string is only swapped after stream is destroyed. class LIBPROTOBUF_EXPORT LiteUnknownFieldSetter { public: explicit LiteUnknownFieldSetter(InternalMetadataWithArenaLite* metadata) : metadata_(metadata) { if (metadata->have_unknown_fields()) { buffer_.swap(*metadata->mutable_unknown_fields()); } } ~LiteUnknownFieldSetter() { if (!buffer_.empty()) metadata_->mutable_unknown_fields()->swap(buffer_); } string* buffer() { return &buffer_; } private: InternalMetadataWithArenaLite* metadata_; string buffer_; }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_METADATA_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/no_field_presence_test.cc000066400000000000000000000553641334102242000323170ustar00rootroot00000000000000// 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 #include #include #include #include #include namespace google { namespace protobuf { namespace { // Helper: checks that all fields have default (zero/empty) values. void CheckDefaultValues( const proto2_nofieldpresence_unittest::TestAllTypes& m) { EXPECT_EQ(0, m.optional_int32()); EXPECT_EQ(0, m.optional_int64()); EXPECT_EQ(0, m.optional_uint32()); EXPECT_EQ(0, m.optional_uint64()); EXPECT_EQ(0, m.optional_sint32()); EXPECT_EQ(0, m.optional_sint64()); EXPECT_EQ(0, m.optional_fixed32()); EXPECT_EQ(0, m.optional_fixed64()); EXPECT_EQ(0, m.optional_sfixed32()); EXPECT_EQ(0, m.optional_sfixed64()); EXPECT_EQ(0, m.optional_float()); EXPECT_EQ(0, m.optional_double()); EXPECT_EQ(false, m.optional_bool()); EXPECT_EQ(0, m.optional_string().size()); EXPECT_EQ(0, m.optional_bytes().size()); EXPECT_EQ(false, m.has_optional_nested_message()); // accessor for message fields returns default instance when not present EXPECT_EQ(0, m.optional_nested_message().bb()); EXPECT_EQ(false, m.has_optional_proto2_message()); // Embedded proto2 messages still have proto2 semantics, e.g. non-zero default // values. Here the submessage is not present but its accessor returns the // default instance. EXPECT_EQ(41, m.optional_proto2_message().default_int32()); EXPECT_EQ(false, m.has_optional_foreign_message()); EXPECT_EQ(proto2_nofieldpresence_unittest::TestAllTypes_NestedEnum_FOO, m.optional_nested_enum()); EXPECT_EQ(proto2_nofieldpresence_unittest::FOREIGN_FOO, m.optional_foreign_enum()); EXPECT_EQ(0, m.repeated_int32_size()); EXPECT_EQ(0, m.repeated_int64_size()); EXPECT_EQ(0, m.repeated_uint32_size()); EXPECT_EQ(0, m.repeated_uint64_size()); EXPECT_EQ(0, m.repeated_sint32_size()); EXPECT_EQ(0, m.repeated_sint64_size()); EXPECT_EQ(0, m.repeated_fixed32_size()); EXPECT_EQ(0, m.repeated_fixed64_size()); EXPECT_EQ(0, m.repeated_sfixed32_size()); EXPECT_EQ(0, m.repeated_sfixed64_size()); EXPECT_EQ(0, m.repeated_float_size()); EXPECT_EQ(0, m.repeated_double_size()); EXPECT_EQ(0, m.repeated_bool_size()); EXPECT_EQ(0, m.repeated_string_size()); EXPECT_EQ(0, m.repeated_bytes_size()); EXPECT_EQ(0, m.repeated_nested_message_size()); EXPECT_EQ(0, m.repeated_foreign_message_size()); EXPECT_EQ(0, m.repeated_proto2_message_size()); EXPECT_EQ(0, m.repeated_nested_enum_size()); EXPECT_EQ(0, m.repeated_foreign_enum_size()); EXPECT_EQ(0, m.repeated_lazy_message_size()); EXPECT_EQ(proto2_nofieldpresence_unittest::TestAllTypes::ONEOF_FIELD_NOT_SET, m.oneof_field_case()); } void FillValues(proto2_nofieldpresence_unittest::TestAllTypes* m) { m->set_optional_int32(100); m->set_optional_int64(101); m->set_optional_uint32(102); m->set_optional_uint64(103); m->set_optional_sint32(104); m->set_optional_sint64(105); m->set_optional_fixed32(106); m->set_optional_fixed64(107); m->set_optional_sfixed32(108); m->set_optional_sfixed64(109); m->set_optional_float(110.0); m->set_optional_double(111.0); m->set_optional_bool(true); m->set_optional_string("asdf"); m->set_optional_bytes("jkl;"); m->mutable_optional_nested_message()->set_bb(42); m->mutable_optional_foreign_message()->set_c(43); m->mutable_optional_proto2_message()->set_optional_int32(44); m->set_optional_nested_enum( proto2_nofieldpresence_unittest::TestAllTypes_NestedEnum_BAZ); m->set_optional_foreign_enum( proto2_nofieldpresence_unittest::FOREIGN_BAZ); m->mutable_optional_lazy_message()->set_bb(45); m->add_repeated_int32(100); m->add_repeated_int64(101); m->add_repeated_uint32(102); m->add_repeated_uint64(103); m->add_repeated_sint32(104); m->add_repeated_sint64(105); m->add_repeated_fixed32(106); m->add_repeated_fixed64(107); m->add_repeated_sfixed32(108); m->add_repeated_sfixed64(109); m->add_repeated_float(110.0); m->add_repeated_double(111.0); m->add_repeated_bool(true); m->add_repeated_string("asdf"); m->add_repeated_bytes("jkl;"); m->add_repeated_nested_message()->set_bb(46); m->add_repeated_foreign_message()->set_c(47); m->add_repeated_proto2_message()->set_optional_int32(48); m->add_repeated_nested_enum( proto2_nofieldpresence_unittest::TestAllTypes_NestedEnum_BAZ); m->add_repeated_foreign_enum( proto2_nofieldpresence_unittest::FOREIGN_BAZ); m->add_repeated_lazy_message()->set_bb(49); m->set_oneof_uint32(1); m->mutable_oneof_nested_message()->set_bb(50); m->set_oneof_string("test"); // only this one remains set } void CheckNonDefaultValues( const proto2_nofieldpresence_unittest::TestAllTypes& m) { EXPECT_EQ(100, m.optional_int32()); EXPECT_EQ(101, m.optional_int64()); EXPECT_EQ(102, m.optional_uint32()); EXPECT_EQ(103, m.optional_uint64()); EXPECT_EQ(104, m.optional_sint32()); EXPECT_EQ(105, m.optional_sint64()); EXPECT_EQ(106, m.optional_fixed32()); EXPECT_EQ(107, m.optional_fixed64()); EXPECT_EQ(108, m.optional_sfixed32()); EXPECT_EQ(109, m.optional_sfixed64()); EXPECT_EQ(110.0, m.optional_float()); EXPECT_EQ(111.0, m.optional_double()); EXPECT_EQ(true, m.optional_bool()); EXPECT_EQ("asdf", m.optional_string()); EXPECT_EQ("jkl;", m.optional_bytes()); EXPECT_EQ(true, m.has_optional_nested_message()); EXPECT_EQ(42, m.optional_nested_message().bb()); EXPECT_EQ(true, m.has_optional_foreign_message()); EXPECT_EQ(43, m.optional_foreign_message().c()); EXPECT_EQ(true, m.has_optional_proto2_message()); EXPECT_EQ(44, m.optional_proto2_message().optional_int32()); EXPECT_EQ(proto2_nofieldpresence_unittest::TestAllTypes_NestedEnum_BAZ, m.optional_nested_enum()); EXPECT_EQ(proto2_nofieldpresence_unittest::FOREIGN_BAZ, m.optional_foreign_enum()); EXPECT_EQ(true, m.has_optional_lazy_message()); EXPECT_EQ(45, m.optional_lazy_message().bb()); EXPECT_EQ(1, m.repeated_int32_size()); EXPECT_EQ(100, m.repeated_int32(0)); EXPECT_EQ(1, m.repeated_int64_size()); EXPECT_EQ(101, m.repeated_int64(0)); EXPECT_EQ(1, m.repeated_uint32_size()); EXPECT_EQ(102, m.repeated_uint32(0)); EXPECT_EQ(1, m.repeated_uint64_size()); EXPECT_EQ(103, m.repeated_uint64(0)); EXPECT_EQ(1, m.repeated_sint32_size()); EXPECT_EQ(104, m.repeated_sint32(0)); EXPECT_EQ(1, m.repeated_sint64_size()); EXPECT_EQ(105, m.repeated_sint64(0)); EXPECT_EQ(1, m.repeated_fixed32_size()); EXPECT_EQ(106, m.repeated_fixed32(0)); EXPECT_EQ(1, m.repeated_fixed64_size()); EXPECT_EQ(107, m.repeated_fixed64(0)); EXPECT_EQ(1, m.repeated_sfixed32_size()); EXPECT_EQ(108, m.repeated_sfixed32(0)); EXPECT_EQ(1, m.repeated_sfixed64_size()); EXPECT_EQ(109, m.repeated_sfixed64(0)); EXPECT_EQ(1, m.repeated_float_size()); EXPECT_EQ(110.0, m.repeated_float(0)); EXPECT_EQ(1, m.repeated_double_size()); EXPECT_EQ(111.0, m.repeated_double(0)); EXPECT_EQ(1, m.repeated_bool_size()); EXPECT_EQ(true, m.repeated_bool(0)); EXPECT_EQ(1, m.repeated_string_size()); EXPECT_EQ("asdf", m.repeated_string(0)); EXPECT_EQ(1, m.repeated_bytes_size()); EXPECT_EQ("jkl;", m.repeated_bytes(0)); EXPECT_EQ(1, m.repeated_nested_message_size()); EXPECT_EQ(46, m.repeated_nested_message(0).bb()); EXPECT_EQ(1, m.repeated_foreign_message_size()); EXPECT_EQ(47, m.repeated_foreign_message(0).c()); EXPECT_EQ(1, m.repeated_proto2_message_size()); EXPECT_EQ(48, m.repeated_proto2_message(0).optional_int32()); EXPECT_EQ(1, m.repeated_nested_enum_size()); EXPECT_EQ(proto2_nofieldpresence_unittest::TestAllTypes_NestedEnum_BAZ, m.repeated_nested_enum(0)); EXPECT_EQ(1, m.repeated_foreign_enum_size()); EXPECT_EQ(proto2_nofieldpresence_unittest::FOREIGN_BAZ, m.repeated_foreign_enum(0)); EXPECT_EQ(1, m.repeated_lazy_message_size()); EXPECT_EQ(49, m.repeated_lazy_message(0).bb()); EXPECT_EQ(proto2_nofieldpresence_unittest::TestAllTypes::kOneofString, m.oneof_field_case()); EXPECT_EQ("test", m.oneof_string()); } TEST(NoFieldPresenceTest, BasicMessageTest) { proto2_nofieldpresence_unittest::TestAllTypes message; // Check default values, fill all fields, check values. We just want to // exercise the basic getters/setter paths here to make sure no // field-presence-related changes broke these. CheckDefaultValues(message); FillValues(&message); CheckNonDefaultValues(message); // Clear() should be equivalent to getting a freshly-constructed message. message.Clear(); CheckDefaultValues(message); } TEST(NoFieldPresenceTest, MessageFieldPresenceTest) { // check that presence still works properly for message fields. proto2_nofieldpresence_unittest::TestAllTypes message; EXPECT_EQ(false, message.has_optional_nested_message()); // Getter should fetch default instance, and not cause the field to become // present. EXPECT_EQ(0, message.optional_nested_message().bb()); EXPECT_EQ(false, message.has_optional_nested_message()); message.mutable_optional_nested_message()->set_bb(42); EXPECT_EQ(true, message.has_optional_nested_message()); message.clear_optional_nested_message(); EXPECT_EQ(false, message.has_optional_nested_message()); // Likewise for a lazy message field. EXPECT_EQ(false, message.has_optional_lazy_message()); // Getter should fetch default instance, and not cause the field to become // present. EXPECT_EQ(0, message.optional_lazy_message().bb()); EXPECT_EQ(false, message.has_optional_lazy_message()); message.mutable_optional_lazy_message()->set_bb(42); EXPECT_EQ(true, message.has_optional_lazy_message()); message.clear_optional_lazy_message(); EXPECT_EQ(false, message.has_optional_lazy_message()); // Test field presence of a message field on the default instance. EXPECT_EQ(false, proto2_nofieldpresence_unittest::TestAllTypes:: default_instance().has_optional_nested_message()); } TEST(NoFieldPresenceTest, ReflectionHasFieldTest) { // check that HasField reports true on all scalar fields. Check that it // behaves properly for message fields. proto2_nofieldpresence_unittest::TestAllTypes message; const google::protobuf::Reflection* r = message.GetReflection(); const google::protobuf::Descriptor* desc = message.GetDescriptor(); // Check initial state: scalars not present (due to need to be consistent with // MergeFrom()), message fields not present, oneofs not present. for (int i = 0; i < desc->field_count(); i++) { const google::protobuf::FieldDescriptor* field = desc->field(i); if (field->is_repeated()) continue; EXPECT_EQ(false, r->HasField(message, field)); } // Test field presence of a message field on the default instance. const google::protobuf::FieldDescriptor* msg_field = desc->FindFieldByName("optional_nested_message"); EXPECT_EQ(false, r->HasField( proto2_nofieldpresence_unittest::TestAllTypes:: default_instance(), msg_field)); // Fill all fields, expect everything to report true (check oneofs below). FillValues(&message); for (int i = 0; i < desc->field_count(); i++) { const google::protobuf::FieldDescriptor* field = desc->field(i); if (field->is_repeated() || field->containing_oneof()) { continue; } if (field->options().ctype() != google::protobuf::FieldOptions::STRING) { continue; } EXPECT_EQ(true, r->HasField(message, field)); } message.Clear(); // Check zero/empty-means-not-present semantics. const google::protobuf::FieldDescriptor* field_int32 = desc->FindFieldByName( "optional_int32"); const google::protobuf::FieldDescriptor* field_double = desc->FindFieldByName( "optional_double"); const google::protobuf::FieldDescriptor* field_string = desc->FindFieldByName( "optional_string"); EXPECT_EQ(false, r->HasField(message, field_int32)); EXPECT_EQ(false, r->HasField(message, field_double)); EXPECT_EQ(false, r->HasField(message, field_string)); message.set_optional_int32(42); EXPECT_EQ(true, r->HasField(message, field_int32)); message.set_optional_int32(0); EXPECT_EQ(false, r->HasField(message, field_int32)); message.set_optional_double(42.0); EXPECT_EQ(true, r->HasField(message, field_double)); message.set_optional_double(0.0); EXPECT_EQ(false, r->HasField(message, field_double)); message.set_optional_string("test"); EXPECT_EQ(true, r->HasField(message, field_string)); message.set_optional_string(""); EXPECT_EQ(false, r->HasField(message, field_string)); } TEST(NoFieldPresenceTest, ReflectionClearFieldTest) { proto2_nofieldpresence_unittest::TestAllTypes message; const google::protobuf::Reflection* r = message.GetReflection(); const google::protobuf::Descriptor* desc = message.GetDescriptor(); const google::protobuf::FieldDescriptor* field_int32 = desc->FindFieldByName( "optional_int32"); const google::protobuf::FieldDescriptor* field_double = desc->FindFieldByName( "optional_double"); const google::protobuf::FieldDescriptor* field_string = desc->FindFieldByName( "optional_string"); const google::protobuf::FieldDescriptor* field_message = desc->FindFieldByName( "optional_nested_message"); const google::protobuf::FieldDescriptor* field_lazy = desc->FindFieldByName( "optional_lazy_message"); message.set_optional_int32(42); r->ClearField(&message, field_int32); EXPECT_EQ(0, message.optional_int32()); message.set_optional_double(42.0); r->ClearField(&message, field_double); EXPECT_EQ(0.0, message.optional_double()); message.set_optional_string("test"); r->ClearField(&message, field_string); EXPECT_EQ("", message.optional_string()); message.mutable_optional_nested_message()->set_bb(1234); r->ClearField(&message, field_message); EXPECT_FALSE(message.has_optional_nested_message()); EXPECT_EQ(0, message.optional_nested_message().bb()); message.mutable_optional_lazy_message()->set_bb(42); r->ClearField(&message, field_lazy); EXPECT_FALSE(message.has_optional_lazy_message()); EXPECT_EQ(0, message.optional_lazy_message().bb()); } TEST(NoFieldPresenceTest, HasFieldOneofsTest) { // check that HasField behaves properly for oneofs. proto2_nofieldpresence_unittest::TestAllTypes message; const google::protobuf::Reflection* r = message.GetReflection(); const google::protobuf::Descriptor* desc = message.GetDescriptor(); const google::protobuf::FieldDescriptor* desc_oneof_uint32 = desc->FindFieldByName("oneof_uint32"); const google::protobuf::FieldDescriptor* desc_oneof_nested_message = desc->FindFieldByName("oneof_nested_message"); const google::protobuf::FieldDescriptor* desc_oneof_string = desc->FindFieldByName("oneof_string"); GOOGLE_CHECK_NOTNULL(desc_oneof_uint32); GOOGLE_CHECK_NOTNULL(desc_oneof_nested_message); GOOGLE_CHECK_NOTNULL(desc_oneof_string); EXPECT_EQ(false, r->HasField(message, desc_oneof_uint32)); EXPECT_EQ(false, r->HasField(message, desc_oneof_nested_message)); EXPECT_EQ(false, r->HasField(message, desc_oneof_string)); message.set_oneof_string("test"); EXPECT_EQ(false, r->HasField(message, desc_oneof_uint32)); EXPECT_EQ(false, r->HasField(message, desc_oneof_nested_message)); EXPECT_EQ(true, r->HasField(message, desc_oneof_string)); message.mutable_oneof_nested_message()->set_bb(42); EXPECT_EQ(false, r->HasField(message, desc_oneof_uint32)); EXPECT_EQ(true, r->HasField(message, desc_oneof_nested_message)); EXPECT_EQ(false, r->HasField(message, desc_oneof_string)); message.Clear(); EXPECT_EQ(false, r->HasField(message, desc_oneof_uint32)); EXPECT_EQ(false, r->HasField(message, desc_oneof_nested_message)); EXPECT_EQ(false, r->HasField(message, desc_oneof_string)); } TEST(NoFieldPresenceTest, DontSerializeDefaultValuesTest) { // check that serialized data contains only non-zero numeric fields/non-empty // string/byte fields. proto2_nofieldpresence_unittest::TestAllTypes message; string output; // All default values -> no output. message.SerializeToString(&output); EXPECT_EQ(0, output.size()); // Zero values -> still no output. message.set_optional_int32(0); message.set_optional_int64(0); message.set_optional_uint32(0); message.set_optional_uint64(0); message.set_optional_sint32(0); message.set_optional_sint64(0); message.set_optional_fixed32(0); message.set_optional_fixed64(0); message.set_optional_sfixed32(0); message.set_optional_sfixed64(0); message.set_optional_float(0); message.set_optional_double(0); message.set_optional_bool(0); message.set_optional_string(""); message.set_optional_bytes(""); message.set_optional_nested_enum( proto2_nofieldpresence_unittest::TestAllTypes_NestedEnum_FOO); // first enum entry message.set_optional_foreign_enum( proto2_nofieldpresence_unittest::FOREIGN_FOO); // first enum entry message.SerializeToString(&output); EXPECT_EQ(0, output.size()); message.set_optional_int32(1); message.SerializeToString(&output); EXPECT_EQ(2, output.size()); EXPECT_EQ("\x08\x01", output); message.set_optional_int32(0); message.SerializeToString(&output); EXPECT_EQ(0, output.size()); } TEST(NoFieldPresenceTest, MergeFromIfNonzeroTest) { // check that MergeFrom copies if nonzero/nondefault only. proto2_nofieldpresence_unittest::TestAllTypes source; proto2_nofieldpresence_unittest::TestAllTypes dest; dest.set_optional_int32(42); dest.set_optional_string("test"); source.set_optional_int32(0); source.set_optional_string(""); // MergeFrom() copies only if present in serialization, i.e., non-zero. dest.MergeFrom(source); EXPECT_EQ(42, dest.optional_int32()); EXPECT_EQ("test", dest.optional_string()); source.set_optional_int32(84); source.set_optional_string("test2"); dest.MergeFrom(source); EXPECT_EQ(84, dest.optional_int32()); EXPECT_EQ("test2", dest.optional_string()); } TEST(NoFieldPresenceTest, IsInitializedTest) { // Check that IsInitialized works properly. proto2_nofieldpresence_unittest::TestProto2Required message; EXPECT_EQ(true, message.IsInitialized()); message.mutable_proto2()->set_a(1); EXPECT_EQ(false, message.IsInitialized()); message.mutable_proto2()->set_b(1); EXPECT_EQ(false, message.IsInitialized()); message.mutable_proto2()->set_c(1); EXPECT_EQ(true, message.IsInitialized()); } TEST(NoFieldPresenceTest, LazyMessageFieldHasBit) { // Check that has-bit interaction with lazy message works (has-bit before and // after lazy decode). proto2_nofieldpresence_unittest::TestAllTypes message; const google::protobuf::Reflection* r = message.GetReflection(); const google::protobuf::Descriptor* desc = message.GetDescriptor(); const google::protobuf::FieldDescriptor* field = desc->FindFieldByName( "optional_lazy_message"); GOOGLE_CHECK_NOTNULL(field); EXPECT_EQ(false, message.has_optional_lazy_message()); EXPECT_EQ(false, r->HasField(message, field)); message.mutable_optional_lazy_message()->set_bb(42); EXPECT_EQ(true, message.has_optional_lazy_message()); EXPECT_EQ(true, r->HasField(message, field)); // Serialize and parse with a new message object so that lazy field on new // object is in unparsed state. string output; message.SerializeToString(&output); proto2_nofieldpresence_unittest::TestAllTypes message2; message2.ParseFromString(output); EXPECT_EQ(true, message2.has_optional_lazy_message()); EXPECT_EQ(true, r->HasField(message2, field)); // Access field to force lazy parse. EXPECT_EQ(42, message.optional_lazy_message().bb()); EXPECT_EQ(true, message2.has_optional_lazy_message()); EXPECT_EQ(true, r->HasField(message2, field)); } TEST(NoFieldPresenceTest, OneofPresence) { proto2_nofieldpresence_unittest::TestAllTypes message; // oneof fields still have field presence -- ensure that this goes on the wire // even though its value is the empty string. message.set_oneof_string(""); string serialized; message.SerializeToString(&serialized); // Tag: 113 --> tag is (113 << 3) | 2 (length delimited) = 906 // varint: 0x8a 0x07 // Length: 0x00 EXPECT_EQ(3, serialized.size()); EXPECT_EQ(static_cast(0x8a), serialized.at(0)); EXPECT_EQ(static_cast(0x07), serialized.at(1)); EXPECT_EQ(static_cast(0x00), serialized.at(2)); message.Clear(); EXPECT_TRUE(message.ParseFromString(serialized)); EXPECT_EQ(proto2_nofieldpresence_unittest::TestAllTypes::kOneofString, message.oneof_field_case()); // Also test int32 and enum fields. message.Clear(); message.set_oneof_uint32(0); // would not go on wire if ordinary field. message.SerializeToString(&serialized); EXPECT_EQ(3, serialized.size()); EXPECT_TRUE(message.ParseFromString(serialized)); EXPECT_EQ(proto2_nofieldpresence_unittest::TestAllTypes::kOneofUint32, message.oneof_field_case()); message.Clear(); message.set_oneof_enum(proto2_nofieldpresence_unittest:: TestAllTypes_NestedEnum_FOO); // default value. message.SerializeToString(&serialized); EXPECT_EQ(3, serialized.size()); EXPECT_TRUE(message.ParseFromString(serialized)); EXPECT_EQ(proto2_nofieldpresence_unittest::TestAllTypes::kOneofEnum, message.oneof_field_case()); message.Clear(); message.set_oneof_string("test"); message.clear_oneof_string(); EXPECT_EQ(0, message.ByteSize()); } } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/package_info.h000066400000000000000000000061261334102242000300550ustar00rootroot00000000000000// 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. // // This file exists solely to document the google::protobuf namespace. // It is not compiled into anything, but it may be read by an automated // documentation generator. namespace google { // Core components of the Protocol Buffers runtime library. // // The files in this package represent the core of the Protocol Buffer // system. All of them are part of the libprotobuf library. // // A note on thread-safety: // // Thread-safety in the Protocol Buffer library follows a simple rule: // unless explicitly noted otherwise, it is always safe to use an object // from multiple threads simultaneously as long as the object is declared // const in all threads (or, it is only used in ways that would be allowed // if it were declared const). However, if an object is accessed in one // thread in a way that would not be allowed if it were const, then it is // not safe to access that object in any other thread simultaneously. // // Put simply, read-only access to an object can happen in multiple threads // simultaneously, but write access can only happen in a single thread at // a time. // // The implementation does contain some "const" methods which actually modify // the object behind the scenes -- e.g., to cache results -- but in these cases // mutex locking is used to make the access thread-safe. namespace protobuf {} } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/preserve_unknown_enum_test.cc000066400000000000000000000306331334102242000333020ustar00rootroot00000000000000// 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 #include #include #include #include #include namespace google { namespace protobuf { namespace { void FillMessage( proto3_preserve_unknown_enum_unittest::MyMessagePlusExtra* message) { message->set_e( proto3_preserve_unknown_enum_unittest::E_EXTRA); message->add_repeated_e( proto3_preserve_unknown_enum_unittest::E_EXTRA); message->add_repeated_packed_e( proto3_preserve_unknown_enum_unittest::E_EXTRA); message->add_repeated_packed_unexpected_e( proto3_preserve_unknown_enum_unittest::E_EXTRA); message->set_oneof_e_1( proto3_preserve_unknown_enum_unittest::E_EXTRA); } void CheckMessage( const proto3_preserve_unknown_enum_unittest::MyMessagePlusExtra& message) { EXPECT_EQ(proto3_preserve_unknown_enum_unittest::E_EXTRA, message.e()); EXPECT_EQ(1, message.repeated_e_size()); EXPECT_EQ(proto3_preserve_unknown_enum_unittest::E_EXTRA, message.repeated_e(0)); EXPECT_EQ(1, message.repeated_packed_e_size()); EXPECT_EQ(proto3_preserve_unknown_enum_unittest::E_EXTRA, message.repeated_packed_e(0)); EXPECT_EQ(1, message.repeated_packed_unexpected_e_size()); EXPECT_EQ(proto3_preserve_unknown_enum_unittest::E_EXTRA, message.repeated_packed_unexpected_e(0)); EXPECT_EQ(proto3_preserve_unknown_enum_unittest::E_EXTRA, message.oneof_e_1()); } void CheckMessage( const proto3_preserve_unknown_enum_unittest::MyMessage& message) { EXPECT_EQ(static_cast( proto3_preserve_unknown_enum_unittest::E_EXTRA), static_cast(message.e())); EXPECT_EQ(1, message.repeated_e_size()); EXPECT_EQ(static_cast( proto3_preserve_unknown_enum_unittest::E_EXTRA), static_cast(message.repeated_e(0))); EXPECT_EQ(1, message.repeated_packed_e_size()); EXPECT_EQ(static_cast( proto3_preserve_unknown_enum_unittest::E_EXTRA), static_cast(message.repeated_packed_e(0))); EXPECT_EQ(1, message.repeated_packed_unexpected_e_size()); EXPECT_EQ(static_cast( proto3_preserve_unknown_enum_unittest::E_EXTRA), static_cast(message.repeated_packed_unexpected_e(0))); EXPECT_EQ(static_cast( proto3_preserve_unknown_enum_unittest::E_EXTRA), static_cast(message.oneof_e_1())); } } // anonymous namespace // Test that parsing preserves an unknown value in the enum field and does not // punt it to the UnknownFieldSet. TEST(PreserveUnknownEnumTest, PreserveParseAndSerialize) { proto3_preserve_unknown_enum_unittest::MyMessagePlusExtra orig_message; FillMessage(&orig_message); string serialized; orig_message.SerializeToString(&serialized); proto3_preserve_unknown_enum_unittest::MyMessage message; EXPECT_EQ(true, message.ParseFromString(serialized)); CheckMessage(message); serialized.clear(); message.SerializeToString(&serialized); EXPECT_EQ(true, orig_message.ParseFromString(serialized)); CheckMessage(orig_message); } // Test that reflection based implementation also keeps unknown enum values and // doesn't put them into UnknownFieldSet. TEST(PreserveUnknownEnumTest, PreserveParseAndSerializeDynamicMessage) { proto3_preserve_unknown_enum_unittest::MyMessagePlusExtra orig_message; FillMessage(&orig_message); string serialized = orig_message.SerializeAsString(); google::protobuf::DynamicMessageFactory factory; google::protobuf::scoped_ptr message(factory.GetPrototype( proto3_preserve_unknown_enum_unittest::MyMessage::descriptor())->New()); EXPECT_EQ(true, message->ParseFromString(serialized)); message->DiscardUnknownFields(); serialized = message->SerializeAsString(); EXPECT_EQ(true, orig_message.ParseFromString(serialized)); CheckMessage(orig_message); } // Test that for proto2 messages, unknown values are in unknown fields. TEST(PreserveUnknownEnumTest, Proto2HidesUnknownValues) { proto3_preserve_unknown_enum_unittest::MyMessagePlusExtra orig_message; FillMessage(&orig_message); string serialized; orig_message.SerializeToString(&serialized); proto2_preserve_unknown_enum_unittest::MyMessage message; EXPECT_EQ(true, message.ParseFromString(serialized)); // The intermediate message has everything in its "unknown fields". proto2_preserve_unknown_enum_unittest::MyMessage message2 = message; message2.DiscardUnknownFields(); EXPECT_EQ(0, message2.ByteSize()); // But when we pass it to the correct structure, all values are there. serialized.clear(); message.SerializeToString(&serialized); EXPECT_EQ(true, orig_message.ParseFromString(serialized)); CheckMessage(orig_message); } // Same as before, for a dynamic message. TEST(PreserveUnknownEnumTest, DynamicProto2HidesUnknownValues) { proto3_preserve_unknown_enum_unittest::MyMessagePlusExtra orig_message; FillMessage(&orig_message); string serialized; orig_message.SerializeToString(&serialized); google::protobuf::DynamicMessageFactory factory; google::protobuf::scoped_ptr message(factory.GetPrototype( proto2_preserve_unknown_enum_unittest::MyMessage::descriptor())->New()); EXPECT_EQ(true, message->ParseFromString(serialized)); // The intermediate message has everything in its "unknown fields". proto2_preserve_unknown_enum_unittest::MyMessage message2; message2.CopyFrom(*message); message2.DiscardUnknownFields(); EXPECT_EQ(0, message2.ByteSize()); // But when we pass it to the correct structure, all values are there. serialized.clear(); message->SerializeToString(&serialized); EXPECT_EQ(true, orig_message.ParseFromString(serialized)); CheckMessage(orig_message); } // Test that reflection provides EnumValueDescriptors for unknown values. TEST(PreserveUnknownEnumTest, DynamicEnumValueDescriptors) { proto3_preserve_unknown_enum_unittest::MyMessagePlusExtra orig_message; FillMessage(&orig_message); string serialized; orig_message.SerializeToString(&serialized); proto3_preserve_unknown_enum_unittest::MyMessage message; EXPECT_EQ(true, message.ParseFromString(serialized)); CheckMessage(message); const google::protobuf::Reflection* r = message.GetReflection(); const google::protobuf::Descriptor* d = message.GetDescriptor(); const google::protobuf::FieldDescriptor* field = d->FindFieldByName("e"); // This should dynamically create an EnumValueDescriptor. const google::protobuf::EnumValueDescriptor* enum_value = r->GetEnum(message, field); EXPECT_EQ(enum_value->number(), static_cast(proto3_preserve_unknown_enum_unittest::E_EXTRA)); // Fetching value for a second time should return the same pointer. const google::protobuf::EnumValueDescriptor* enum_value_second = r->GetEnum(message, field); EXPECT_EQ(enum_value, enum_value_second); // Check the repeated case too. const google::protobuf::FieldDescriptor* repeated_field = d->FindFieldByName("repeated_e"); enum_value = r->GetRepeatedEnum(message, repeated_field, 0); EXPECT_EQ(enum_value->number(), static_cast(proto3_preserve_unknown_enum_unittest::E_EXTRA)); // Should reuse the same EnumValueDescriptor, even for a different field. EXPECT_EQ(enum_value, enum_value_second); // We should be able to use the returned value descriptor to set a value on // another message. google::protobuf::Message* m = message.New(); r->SetEnum(m, field, enum_value); EXPECT_EQ(enum_value, r->GetEnum(*m, field)); delete m; } // Test that the new integer-based enum reflection API works. TEST(PreserveUnknownEnumTest, IntegerEnumReflectionAPI) { proto3_preserve_unknown_enum_unittest::MyMessage message; const google::protobuf::Reflection* r = message.GetReflection(); const google::protobuf::Descriptor* d = message.GetDescriptor(); const google::protobuf::FieldDescriptor* singular_field = d->FindFieldByName("e"); const google::protobuf::FieldDescriptor* repeated_field = d->FindFieldByName("repeated_e"); r->SetEnumValue(&message, singular_field, 42); EXPECT_EQ(42, r->GetEnumValue(message, singular_field)); r->AddEnumValue(&message, repeated_field, 42); r->AddEnumValue(&message, repeated_field, 42); EXPECT_EQ(42, r->GetRepeatedEnumValue(message, repeated_field, 0)); r->SetRepeatedEnumValue(&message, repeated_field, 1, 84); EXPECT_EQ(84, r->GetRepeatedEnumValue(message, repeated_field, 1)); const google::protobuf::EnumValueDescriptor* enum_value = r->GetEnum(message, singular_field); EXPECT_EQ(42, enum_value->number()); } // Test that the EnumValue API works properly for proto2 messages as well. TEST(PreserveUnknownEnumTest, Proto2CatchesUnknownValues) { protobuf_unittest::TestAllTypes message; // proto2 message const google::protobuf::Reflection* r = message.GetReflection(); const google::protobuf::Descriptor* d = message.GetDescriptor(); const google::protobuf::FieldDescriptor* repeated_field = d->FindFieldByName("repeated_nested_enum"); // Add one element to the repeated field so that we can test // SetRepeatedEnumValue. const google::protobuf::EnumValueDescriptor* enum_value = repeated_field->enum_type()->FindValueByName("BAR"); EXPECT_TRUE(enum_value != NULL); r->AddEnum(&message, repeated_field, enum_value); #ifdef PROTOBUF_HAS_DEATH_TEST const google::protobuf::FieldDescriptor* singular_field = d->FindFieldByName("optional_nested_enum"); // Enum-field integer-based setters GOOGLE_DCHECK-fail on invalid values, in order to // remain consistent with proto2 generated code. EXPECT_DEBUG_DEATH({ r->SetEnumValue(&message, singular_field, 4242); r->GetEnum(message, singular_field)->number(); }, "SetEnumValue accepts only valid integer values"); EXPECT_DEBUG_DEATH({ r->SetRepeatedEnumValue(&message, repeated_field, 0, 4242); r->GetRepeatedEnum(message, repeated_field, 0); }, "SetRepeatedEnumValue accepts only valid integer values"); EXPECT_DEBUG_DEATH({ r->AddEnumValue(&message, repeated_field, 4242); r->GetRepeatedEnum(message, repeated_field, 1); }, "AddEnumValue accepts only valid integer values"); #endif // PROTOBUF_HAS_DEATH_TEST } TEST(PreserveUnknownEnumTest, SupportsUnknownEnumValuesAPI) { protobuf_unittest::TestAllTypes proto2_message; proto3_preserve_unknown_enum_unittest::MyMessage new_message; const google::protobuf::Reflection* proto2_reflection = proto2_message.GetReflection(); const google::protobuf::Reflection* new_reflection = new_message.GetReflection(); EXPECT_FALSE(proto2_reflection->SupportsUnknownEnumValues()); EXPECT_TRUE(new_reflection->SupportsUnknownEnumValues()); } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/proto3_arena_lite_unittest.cc000066400000000000000000000147641334102242000331640ustar00rootroot00000000000000// 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 #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include namespace google { using proto3_arena_lite_unittest::TestAllTypes; namespace protobuf { namespace { // We selectively set/check a few representative fields rather than all fields // as this test is only expected to cover the basics of arena support. void SetAllFields(TestAllTypes* m) { m->set_optional_int32(100); m->set_optional_string("asdf"); m->set_optional_bytes("jkl;"); m->mutable_optional_nested_message()->set_bb(42); m->mutable_optional_foreign_message()->set_c(43); m->set_optional_nested_enum( proto3_arena_lite_unittest::TestAllTypes_NestedEnum_BAZ); m->set_optional_foreign_enum( proto3_arena_lite_unittest::FOREIGN_BAZ); m->mutable_optional_lazy_message()->set_bb(45); m->add_repeated_int32(100); m->add_repeated_string("asdf"); m->add_repeated_bytes("jkl;"); m->add_repeated_nested_message()->set_bb(46); m->add_repeated_foreign_message()->set_c(47); m->add_repeated_nested_enum( proto3_arena_lite_unittest::TestAllTypes_NestedEnum_BAZ); m->add_repeated_foreign_enum( proto3_arena_lite_unittest::FOREIGN_BAZ); m->add_repeated_lazy_message()->set_bb(49); m->set_oneof_uint32(1); m->mutable_oneof_nested_message()->set_bb(50); m->set_oneof_string("test"); // only this one remains set } void ExpectAllFieldsSet(const TestAllTypes& m) { EXPECT_EQ(100, m.optional_int32()); EXPECT_EQ("asdf", m.optional_string()); EXPECT_EQ("jkl;", m.optional_bytes()); EXPECT_EQ(true, m.has_optional_nested_message()); EXPECT_EQ(42, m.optional_nested_message().bb()); EXPECT_EQ(true, m.has_optional_foreign_message()); EXPECT_EQ(43, m.optional_foreign_message().c()); EXPECT_EQ(proto3_arena_lite_unittest::TestAllTypes_NestedEnum_BAZ, m.optional_nested_enum()); EXPECT_EQ(proto3_arena_lite_unittest::FOREIGN_BAZ, m.optional_foreign_enum()); EXPECT_EQ(true, m.has_optional_lazy_message()); EXPECT_EQ(45, m.optional_lazy_message().bb()); EXPECT_EQ(1, m.repeated_int32_size()); EXPECT_EQ(100, m.repeated_int32(0)); EXPECT_EQ(1, m.repeated_string_size()); EXPECT_EQ("asdf", m.repeated_string(0)); EXPECT_EQ(1, m.repeated_bytes_size()); EXPECT_EQ("jkl;", m.repeated_bytes(0)); EXPECT_EQ(1, m.repeated_nested_message_size()); EXPECT_EQ(46, m.repeated_nested_message(0).bb()); EXPECT_EQ(1, m.repeated_foreign_message_size()); EXPECT_EQ(47, m.repeated_foreign_message(0).c()); EXPECT_EQ(1, m.repeated_nested_enum_size()); EXPECT_EQ(proto3_arena_lite_unittest::TestAllTypes_NestedEnum_BAZ, m.repeated_nested_enum(0)); EXPECT_EQ(1, m.repeated_foreign_enum_size()); EXPECT_EQ(proto3_arena_lite_unittest::FOREIGN_BAZ, m.repeated_foreign_enum(0)); EXPECT_EQ(1, m.repeated_lazy_message_size()); EXPECT_EQ(49, m.repeated_lazy_message(0).bb()); EXPECT_EQ(proto3_arena_lite_unittest::TestAllTypes::kOneofString, m.oneof_field_case()); EXPECT_EQ("test", m.oneof_string()); } // In this file we only test some basic functionalities of arena support in // proto3 and expect the arena support to be fully tested in proto2 unittests // because proto3 shares most code with proto2. TEST(Proto3ArenaLiteTest, Parsing) { TestAllTypes original; SetAllFields(&original); Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->ParseFromString(original.SerializeAsString()); ExpectAllFieldsSet(*arena_message); } TEST(Proto3ArenaLiteTest, Swap) { Arena arena1; Arena arena2; // Test Swap(). TestAllTypes* arena1_message = Arena::CreateMessage(&arena1); TestAllTypes* arena2_message = Arena::CreateMessage(&arena2); arena1_message->Swap(arena2_message); EXPECT_EQ(&arena1, arena1_message->GetArena()); EXPECT_EQ(&arena2, arena2_message->GetArena()); } TEST(Proto3ArenaLiteTest, SetAllocatedMessage) { Arena arena; TestAllTypes *arena_message = Arena::CreateMessage(&arena); TestAllTypes::NestedMessage* nested = new TestAllTypes::NestedMessage; nested->set_bb(118); arena_message->set_allocated_optional_nested_message(nested); EXPECT_EQ(118, arena_message->optional_nested_message().bb()); } TEST(Proto3ArenaLiteTest, ReleaseMessage) { Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->mutable_optional_nested_message()->set_bb(118); google::protobuf::scoped_ptr nested( arena_message->release_optional_nested_message()); EXPECT_EQ(118, nested->bb()); } } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/proto3_arena_unittest.cc000066400000000000000000000220741334102242000321400ustar00rootroot00000000000000// 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 #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include namespace google { using proto3_arena_unittest::TestAllTypes; namespace protobuf { namespace { // We selectively set/check a few representative fields rather than all fields // as this test is only expected to cover the basics of arena support. void SetAllFields(TestAllTypes* m) { m->set_optional_int32(100); m->set_optional_string("asdf"); m->set_optional_bytes("jkl;"); m->mutable_optional_nested_message()->set_bb(42); m->mutable_optional_foreign_message()->set_c(43); m->set_optional_nested_enum( proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ); m->set_optional_foreign_enum( proto3_arena_unittest::FOREIGN_BAZ); m->mutable_optional_lazy_message()->set_bb(45); m->add_repeated_int32(100); m->add_repeated_string("asdf"); m->add_repeated_bytes("jkl;"); m->add_repeated_nested_message()->set_bb(46); m->add_repeated_foreign_message()->set_c(47); m->add_repeated_nested_enum( proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ); m->add_repeated_foreign_enum( proto3_arena_unittest::FOREIGN_BAZ); m->add_repeated_lazy_message()->set_bb(49); m->set_oneof_uint32(1); m->mutable_oneof_nested_message()->set_bb(50); m->set_oneof_string("test"); // only this one remains set } void ExpectAllFieldsSet(const TestAllTypes& m) { EXPECT_EQ(100, m.optional_int32()); EXPECT_EQ("asdf", m.optional_string()); EXPECT_EQ("jkl;", m.optional_bytes()); EXPECT_EQ(true, m.has_optional_nested_message()); EXPECT_EQ(42, m.optional_nested_message().bb()); EXPECT_EQ(true, m.has_optional_foreign_message()); EXPECT_EQ(43, m.optional_foreign_message().c()); EXPECT_EQ(proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ, m.optional_nested_enum()); EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ, m.optional_foreign_enum()); EXPECT_EQ(true, m.has_optional_lazy_message()); EXPECT_EQ(45, m.optional_lazy_message().bb()); EXPECT_EQ(1, m.repeated_int32_size()); EXPECT_EQ(100, m.repeated_int32(0)); EXPECT_EQ(1, m.repeated_string_size()); EXPECT_EQ("asdf", m.repeated_string(0)); EXPECT_EQ(1, m.repeated_bytes_size()); EXPECT_EQ("jkl;", m.repeated_bytes(0)); EXPECT_EQ(1, m.repeated_nested_message_size()); EXPECT_EQ(46, m.repeated_nested_message(0).bb()); EXPECT_EQ(1, m.repeated_foreign_message_size()); EXPECT_EQ(47, m.repeated_foreign_message(0).c()); EXPECT_EQ(1, m.repeated_nested_enum_size()); EXPECT_EQ(proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ, m.repeated_nested_enum(0)); EXPECT_EQ(1, m.repeated_foreign_enum_size()); EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ, m.repeated_foreign_enum(0)); EXPECT_EQ(1, m.repeated_lazy_message_size()); EXPECT_EQ(49, m.repeated_lazy_message(0).bb()); EXPECT_EQ(proto3_arena_unittest::TestAllTypes::kOneofString, m.oneof_field_case()); EXPECT_EQ("test", m.oneof_string()); } // In this file we only test some basic functionalities of arena support in // proto3 and expect the arena support to be fully tested in proto2 unittests // because proto3 shares most code with proto2. TEST(Proto3ArenaTest, Parsing) { TestAllTypes original; SetAllFields(&original); Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->ParseFromString(original.SerializeAsString()); ExpectAllFieldsSet(*arena_message); } TEST(Proto3ArenaTest, UnknownFieldsDefaultDrop) { ::google::protobuf::internal::SetProto3PreserveUnknownsDefault(false); TestAllTypes original; SetAllFields(&original); Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->ParseFromString(original.SerializeAsString()); ExpectAllFieldsSet(*arena_message); // In proto3 we can still get a pointer to the UnknownFieldSet through // reflection API. UnknownFieldSet* unknown_fields = arena_message->GetReflection()->MutableUnknownFields(arena_message); // We can modify this UnknownFieldSet. unknown_fields->AddVarint(1, 2); // But the change will never will serialized back. ASSERT_EQ(original.ByteSize(), arena_message->ByteSize()); ASSERT_TRUE( arena_message->GetReflection()->GetUnknownFields(*arena_message).empty()); } TEST(Proto3ArenaTest, UnknownFieldsDefaultPreserve) { ::google::protobuf::internal::SetProto3PreserveUnknownsDefault(true); TestAllTypes original; SetAllFields(&original); Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->ParseFromString(original.SerializeAsString()); ExpectAllFieldsSet(*arena_message); // In proto3 we can still get a pointer to the UnknownFieldSet through // reflection API. UnknownFieldSet* unknown_fields = arena_message->GetReflection()->MutableUnknownFields(arena_message); // We can modify this UnknownFieldSet. unknown_fields->AddVarint(1, 2); // And the unknown fields should be changed. ASSERT_NE(original.ByteSize(), arena_message->ByteSize()); ASSERT_FALSE( arena_message->GetReflection()->GetUnknownFields(*arena_message).empty()); } TEST(Proto3ArenaTest, Swap) { Arena arena1; Arena arena2; // Test Swap(). TestAllTypes* arena1_message = Arena::CreateMessage(&arena1); TestAllTypes* arena2_message = Arena::CreateMessage(&arena2); arena1_message->Swap(arena2_message); EXPECT_EQ(&arena1, arena1_message->GetArena()); EXPECT_EQ(&arena2, arena2_message->GetArena()); } TEST(Proto3ArenaTest, SetAllocatedMessage) { Arena arena; TestAllTypes *arena_message = Arena::CreateMessage(&arena); TestAllTypes::NestedMessage* nested = new TestAllTypes::NestedMessage; nested->set_bb(118); arena_message->set_allocated_optional_nested_message(nested); EXPECT_EQ(118, arena_message->optional_nested_message().bb()); } TEST(Proto3ArenaTest, ReleaseMessage) { Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->mutable_optional_nested_message()->set_bb(118); google::protobuf::scoped_ptr nested( arena_message->release_optional_nested_message()); EXPECT_EQ(118, nested->bb()); } TEST(Proto3ArenaTest, MessageFieldClear) { // GitHub issue #310: https://github.com/google/protobuf/issues/310 Arena arena; TestAllTypes* arena_message = Arena::CreateMessage(&arena); arena_message->mutable_optional_nested_message()->set_bb(118); // This should not crash, but prior to the bugfix, it tried to use `operator // delete` the nested message (which is on the arena): arena_message->Clear(); } TEST(Proto3ArenaTest, MessageFieldClearViaReflection) { Arena arena; TestAllTypes* message = Arena::CreateMessage(&arena); const Reflection* r = message->GetReflection(); const Descriptor* d = message->GetDescriptor(); const FieldDescriptor* msg_field = d->FindFieldByName( "optional_nested_message"); message->mutable_optional_nested_message()->set_bb(1); r->ClearField(message, msg_field); EXPECT_FALSE(message->has_optional_nested_message()); EXPECT_EQ(0, message->optional_nested_message().bb()); } } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/proto3_lite_unittest.cc000066400000000000000000000130401334102242000320000ustar00rootroot00000000000000// 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 #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include namespace google { using proto3_lite_unittest::TestAllTypes; namespace protobuf { namespace { // We selectively set/check a few representative fields rather than all fields // as this test is only expected to cover the basics of lite support. void SetAllFields(TestAllTypes* m) { m->set_optional_int32(100); m->set_optional_string("asdf"); m->set_optional_bytes("jkl;"); m->mutable_optional_nested_message()->set_bb(42); m->mutable_optional_foreign_message()->set_c(43); m->set_optional_nested_enum( proto3_lite_unittest::TestAllTypes_NestedEnum_BAZ); m->set_optional_foreign_enum( proto3_lite_unittest::FOREIGN_BAZ); m->mutable_optional_lazy_message()->set_bb(45); m->add_repeated_int32(100); m->add_repeated_string("asdf"); m->add_repeated_bytes("jkl;"); m->add_repeated_nested_message()->set_bb(46); m->add_repeated_foreign_message()->set_c(47); m->add_repeated_nested_enum( proto3_lite_unittest::TestAllTypes_NestedEnum_BAZ); m->add_repeated_foreign_enum( proto3_lite_unittest::FOREIGN_BAZ); m->add_repeated_lazy_message()->set_bb(49); m->set_oneof_uint32(1); m->mutable_oneof_nested_message()->set_bb(50); m->set_oneof_string("test"); // only this one remains set } void ExpectAllFieldsSet(const TestAllTypes& m) { EXPECT_EQ(100, m.optional_int32()); EXPECT_EQ("asdf", m.optional_string()); EXPECT_EQ("jkl;", m.optional_bytes()); EXPECT_EQ(true, m.has_optional_nested_message()); EXPECT_EQ(42, m.optional_nested_message().bb()); EXPECT_EQ(true, m.has_optional_foreign_message()); EXPECT_EQ(43, m.optional_foreign_message().c()); EXPECT_EQ(proto3_lite_unittest::TestAllTypes_NestedEnum_BAZ, m.optional_nested_enum()); EXPECT_EQ(proto3_lite_unittest::FOREIGN_BAZ, m.optional_foreign_enum()); EXPECT_EQ(true, m.has_optional_lazy_message()); EXPECT_EQ(45, m.optional_lazy_message().bb()); EXPECT_EQ(1, m.repeated_int32_size()); EXPECT_EQ(100, m.repeated_int32(0)); EXPECT_EQ(1, m.repeated_string_size()); EXPECT_EQ("asdf", m.repeated_string(0)); EXPECT_EQ(1, m.repeated_bytes_size()); EXPECT_EQ("jkl;", m.repeated_bytes(0)); EXPECT_EQ(1, m.repeated_nested_message_size()); EXPECT_EQ(46, m.repeated_nested_message(0).bb()); EXPECT_EQ(1, m.repeated_foreign_message_size()); EXPECT_EQ(47, m.repeated_foreign_message(0).c()); EXPECT_EQ(1, m.repeated_nested_enum_size()); EXPECT_EQ(proto3_lite_unittest::TestAllTypes_NestedEnum_BAZ, m.repeated_nested_enum(0)); EXPECT_EQ(1, m.repeated_foreign_enum_size()); EXPECT_EQ(proto3_lite_unittest::FOREIGN_BAZ, m.repeated_foreign_enum(0)); EXPECT_EQ(1, m.repeated_lazy_message_size()); EXPECT_EQ(49, m.repeated_lazy_message(0).bb()); EXPECT_EQ(proto3_lite_unittest::TestAllTypes::kOneofString, m.oneof_field_case()); EXPECT_EQ("test", m.oneof_string()); } // In this file we only test some basic functionalities of in proto3 and expect // the rest is fully tested in proto2 unittests because proto3 shares most code // with proto2. TEST(Proto3LiteTest, Parsing) { TestAllTypes original; SetAllFields(&original); TestAllTypes msg; msg.ParseFromString(original.SerializeAsString()); ExpectAllFieldsSet(msg); } TEST(Proto3LiteTest, Swap) { // Test Swap(). TestAllTypes msg1; TestAllTypes msg2; msg1.set_optional_string("123"); msg2.set_optional_string("3456"); msg1.Swap(&msg2); EXPECT_EQ("3456", msg1.optional_string()); EXPECT_EQ("123", msg2.optional_string()); EXPECT_EQ(msg1.ByteSize(), msg2.ByteSize() + 1); } } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/reflection.h000066400000000000000000000537671334102242000276160ustar00rootroot00000000000000// 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 header defines the RepeatedFieldRef class template used to access // repeated fields with protobuf reflection API. #ifndef GOOGLE_PROTOBUF_REFLECTION_H__ #define GOOGLE_PROTOBUF_REFLECTION_H__ #include #ifndef _SHARED_PTR_H #include #endif #include #include namespace google { namespace protobuf { namespace internal { template struct RefTypeTraits; } // namespace internal template RepeatedFieldRef Reflection::GetRepeatedFieldRef( const Message& message, const FieldDescriptor* field) const { return RepeatedFieldRef(message, field); } template MutableRepeatedFieldRef Reflection::GetMutableRepeatedFieldRef( Message* message, const FieldDescriptor* field) const { return MutableRepeatedFieldRef(message, field); } // RepeatedFieldRef definition for non-message types. template class RepeatedFieldRef< T, typename internal::enable_if::value>::type> { typedef typename internal::RefTypeTraits::iterator IteratorType; typedef typename internal::RefTypeTraits::AccessorType AccessorType; public: bool empty() const { return accessor_->IsEmpty(data_); } int size() const { return accessor_->Size(data_); } T Get(int index) const { return accessor_->template Get(data_, index); } typedef IteratorType iterator; typedef IteratorType const_iterator; typedef T value_type; typedef T& reference; typedef const T& const_reference; typedef int size_type; typedef ptrdiff_t difference_type; iterator begin() const { return iterator(data_, accessor_, true); } iterator end() const { return iterator(data_, accessor_, false); } private: friend class Reflection; RepeatedFieldRef( const Message& message, const FieldDescriptor* field) { const Reflection* reflection = message.GetReflection(); data_ = reflection->RepeatedFieldData( const_cast(&message), field, internal::RefTypeTraits::cpp_type, NULL); accessor_ = reflection->RepeatedFieldAccessor(field); } const void* data_; const AccessorType* accessor_; }; // MutableRepeatedFieldRef definition for non-message types. template class MutableRepeatedFieldRef< T, typename internal::enable_if::value>::type> { typedef typename internal::RefTypeTraits::AccessorType AccessorType; public: bool empty() const { return accessor_->IsEmpty(data_); } int size() const { return accessor_->Size(data_); } T Get(int index) const { return accessor_->template Get(data_, index); } void Set(int index, const T& value) const { accessor_->template Set(data_, index, value); } void Add(const T& value) const { accessor_->template Add(data_, value); } void RemoveLast() const { accessor_->RemoveLast(data_); } void SwapElements(int index1, int index2) const { accessor_->SwapElements(data_, index1, index2); } void Clear() const { accessor_->Clear(data_); } void Swap(const MutableRepeatedFieldRef& other) const { accessor_->Swap(data_, other.accessor_, other.data_); } template void MergeFrom(const Container& container) const { typedef typename Container::const_iterator Iterator; for (Iterator it = container.begin(); it != container.end(); ++it) { Add(*it); } } template void CopyFrom(const Container& container) const { Clear(); MergeFrom(container); } private: friend class Reflection; MutableRepeatedFieldRef( Message* message, const FieldDescriptor* field) { const Reflection* reflection = message->GetReflection(); data_ = reflection->RepeatedFieldData( message, field, internal::RefTypeTraits::cpp_type, NULL); accessor_ = reflection->RepeatedFieldAccessor(field); } void* data_; const AccessorType* accessor_; }; // RepeatedFieldRef definition for message types. template class RepeatedFieldRef< T, typename internal::enable_if::value>::type> { typedef typename internal::RefTypeTraits::iterator IteratorType; typedef typename internal::RefTypeTraits::AccessorType AccessorType; public: bool empty() const { return accessor_->IsEmpty(data_); } int size() const { return accessor_->Size(data_); } // This method returns a reference to the underlying message object if it // exists. If a message object doesn't exist (e.g., data stored in serialized // form), scratch_space will be filled with the data and a reference to it // will be returned. // // Example: // RepeatedFieldRef h = ... // unique_ptr scratch_space(h.NewMessage()); // const Message& item = h.Get(index, scratch_space.get()); const T& Get(int index, T* scratch_space) const { return *static_cast(accessor_->Get(data_, index, scratch_space)); } // Create a new message of the same type as the messages stored in this // repeated field. Caller takes ownership of the returned object. T* NewMessage() const { return static_cast(default_instance_->New()); } typedef IteratorType iterator; typedef IteratorType const_iterator; typedef T value_type; typedef T& reference; typedef const T& const_reference; typedef int size_type; typedef ptrdiff_t difference_type; iterator begin() const { return iterator(data_, accessor_, true, NewMessage()); } iterator end() const { // The end iterator must not be dereferenced, no need for scratch space. return iterator(data_, accessor_, false, NULL); } private: friend class Reflection; RepeatedFieldRef( const Message& message, const FieldDescriptor* field) { const Reflection* reflection = message.GetReflection(); data_ = reflection->RepeatedFieldData( const_cast(&message), field, internal::RefTypeTraits::cpp_type, internal::RefTypeTraits::GetMessageFieldDescriptor()); accessor_ = reflection->RepeatedFieldAccessor(field); default_instance_ = reflection->GetMessageFactory()->GetPrototype(field->message_type()); } const void* data_; const AccessorType* accessor_; const Message* default_instance_; }; // MutableRepeatedFieldRef definition for message types. template class MutableRepeatedFieldRef< T, typename internal::enable_if::value>::type> { typedef typename internal::RefTypeTraits::AccessorType AccessorType; public: bool empty() const { return accessor_->IsEmpty(data_); } int size() const { return accessor_->Size(data_); } // See comments for RepeatedFieldRef::Get() const T& Get(int index, T* scratch_space) const { return *static_cast(accessor_->Get(data_, index, scratch_space)); } // Create a new message of the same type as the messages stored in this // repeated field. Caller takes ownership of the returned object. T* NewMessage() const { return static_cast(default_instance_->New()); } void Set(int index, const T& value) const { accessor_->Set(data_, index, &value); } void Add(const T& value) const { accessor_->Add(data_, &value); } void RemoveLast() const { accessor_->RemoveLast(data_); } void SwapElements(int index1, int index2) const { accessor_->SwapElements(data_, index1, index2); } void Clear() const { accessor_->Clear(data_); } void Swap(const MutableRepeatedFieldRef& other) const { accessor_->Swap(data_, other.accessor_, other.data_); } template void MergeFrom(const Container& container) const { typedef typename Container::const_iterator Iterator; for (Iterator it = container.begin(); it != container.end(); ++it) { Add(*it); } } template void CopyFrom(const Container& container) const { Clear(); MergeFrom(container); } private: friend class Reflection; MutableRepeatedFieldRef( Message* message, const FieldDescriptor* field) { const Reflection* reflection = message->GetReflection(); data_ = reflection->RepeatedFieldData( message, field, internal::RefTypeTraits::cpp_type, internal::RefTypeTraits::GetMessageFieldDescriptor()); accessor_ = reflection->RepeatedFieldAccessor(field); default_instance_ = reflection->GetMessageFactory()->GetPrototype(field->message_type()); } void* data_; const AccessorType* accessor_; const Message* default_instance_; }; namespace internal { // Interfaces used to implement reflection RepeatedFieldRef API. // Reflection::GetRepeatedAccessor() should return a pointer to an singleton // object that implements the below interface. // // This interface passes/returns values using void pointers. The actual type // of the value depends on the field's cpp_type. Following is a mapping from // cpp_type to the type that should be used in this interface: // // field->cpp_type() T Actual type of void* // CPPTYPE_INT32 int32 int32 // CPPTYPE_UINT32 uint32 uint32 // CPPTYPE_INT64 int64 int64 // CPPTYPE_UINT64 uint64 uint64 // CPPTYPE_DOUBLE double double // CPPTYPE_FLOAT float float // CPPTYPE_BOOL bool bool // CPPTYPE_ENUM generated enum type int32 // CPPTYPE_STRING string string // CPPTYPE_MESSAGE generated message type google::protobuf::Message // or google::protobuf::Message // // Note that for enums we use int32 in the interface. // // You can map from T to the actual type using RefTypeTraits: // typedef RefTypeTraits::AccessorValueType ActualType; class LIBPROTOBUF_EXPORT RepeatedFieldAccessor { public: // Typedefs for clarity. typedef void Field; typedef void Value; typedef void Iterator; virtual ~RepeatedFieldAccessor(); virtual bool IsEmpty(const Field* data) const = 0; virtual int Size(const Field* data) const = 0; // Depends on the underlying representation of the repeated field, this // method can return a pointer to the underlying object if such an object // exists, or fill the data into scratch_space and return scratch_space. // Callers of this method must ensure scratch_space is a valid pointer // to a mutable object of the correct type. virtual const Value* Get( const Field* data, int index, Value* scratch_space) const = 0; virtual void Clear(Field* data) const = 0; virtual void Set(Field* data, int index, const Value* value) const = 0; virtual void Add(Field* data, const Value* value) const = 0; virtual void RemoveLast(Field* data) const = 0; virtual void SwapElements(Field* data, int index1, int index2) const = 0; virtual void Swap(Field* data, const RepeatedFieldAccessor* other_mutator, Field* other_data) const = 0; // Create an iterator that points at the beginning of the repeated field. virtual Iterator* BeginIterator(const Field* data) const = 0; // Create an iterator that points at the end of the repeated field. virtual Iterator* EndIterator(const Field* data) const = 0; // Make a copy of an iterator and return the new copy. virtual Iterator* CopyIterator(const Field* data, const Iterator* iterator) const = 0; // Move an iterator to point to the next element. virtual Iterator* AdvanceIterator(const Field* data, Iterator* iterator) const = 0; // Compare whether two iterators point to the same element. virtual bool EqualsIterator(const Field* data, const Iterator* a, const Iterator* b) const = 0; // Delete an iterator created by BeginIterator(), EndIterator() and // CopyIterator(). virtual void DeleteIterator(const Field* data, Iterator* iterator) const = 0; // Like Get() but for iterators. virtual const Value* GetIteratorValue(const Field* data, const Iterator* iterator, Value* scratch_space) const = 0; // Templated methods that make using this interface easier for non-message // types. template T Get(const Field* data, int index) const { typedef typename RefTypeTraits::AccessorValueType ActualType; ActualType scratch_space; return static_cast( *reinterpret_cast( Get(data, index, static_cast(&scratch_space)))); } template void Set(Field* data, int index, const ValueType& value) const { typedef typename RefTypeTraits::AccessorValueType ActualType; // In this RepeatedFieldAccessor interface we pass/return data using // raw pointers. Type of the data these raw pointers point to should // be ActualType. Here we have a ValueType object and want a ActualType // pointer. We can't cast a ValueType pointer to an ActualType pointer // directly because their type might be different (for enums ValueType // may be a generated enum type while ActualType is int32). To be safe // we make a copy to get a temporary ActualType object and use it. ActualType tmp = static_cast(value); Set(data, index, static_cast(&tmp)); } template void Add(Field* data, const ValueType& value) const { typedef typename RefTypeTraits::AccessorValueType ActualType; // In this RepeatedFieldAccessor interface we pass/return data using // raw pointers. Type of the data these raw pointers point to should // be ActualType. Here we have a ValueType object and want a ActualType // pointer. We can't cast a ValueType pointer to an ActualType pointer // directly because their type might be different (for enums ValueType // may be a generated enum type while ActualType is int32). To be safe // we make a copy to get a temporary ActualType object and use it. ActualType tmp = static_cast(value); Add(data, static_cast(&tmp)); } }; // Implement (Mutable)RepeatedFieldRef::iterator template class RepeatedFieldRefIterator : public std::iterator { typedef typename RefTypeTraits::AccessorValueType AccessorValueType; typedef typename RefTypeTraits::IteratorValueType IteratorValueType; typedef typename RefTypeTraits::IteratorPointerType IteratorPointerType; public: // Constructor for non-message fields. RepeatedFieldRefIterator(const void* data, const RepeatedFieldAccessor* accessor, bool begin) : data_(data), accessor_(accessor), iterator_(begin ? accessor->BeginIterator(data) : accessor->EndIterator(data)), // The end iterator must not be dereferenced, no need for scratch space. scratch_space_(begin ? new AccessorValueType : NULL) {} // Constructor for message fields. RepeatedFieldRefIterator(const void* data, const RepeatedFieldAccessor* accessor, bool begin, AccessorValueType* scratch_space) : data_(data), accessor_(accessor), iterator_(begin ? accessor->BeginIterator(data) : accessor->EndIterator(data)), scratch_space_(scratch_space) { } ~RepeatedFieldRefIterator() { accessor_->DeleteIterator(data_, iterator_); } RepeatedFieldRefIterator operator++(int) { RepeatedFieldRefIterator tmp(*this); iterator_ = accessor_->AdvanceIterator(data_, iterator_); return tmp; } RepeatedFieldRefIterator& operator++() { iterator_ = accessor_->AdvanceIterator(data_, iterator_); return *this; } IteratorValueType operator*() const { return static_cast( *static_cast( accessor_->GetIteratorValue( data_, iterator_, scratch_space_.get()))); } IteratorPointerType operator->() const { return static_cast( accessor_->GetIteratorValue( data_, iterator_, scratch_space_.get())); } bool operator!=(const RepeatedFieldRefIterator& other) const { assert(data_ == other.data_); assert(accessor_ == other.accessor_); return !accessor_->EqualsIterator(data_, iterator_, other.iterator_); } bool operator==(const RepeatedFieldRefIterator& other) const { return !this->operator!=(other); } RepeatedFieldRefIterator(const RepeatedFieldRefIterator& other) : data_(other.data_), accessor_(other.accessor_), iterator_(accessor_->CopyIterator(data_, other.iterator_)) { } RepeatedFieldRefIterator& operator=(const RepeatedFieldRefIterator& other) { if (this != &other) { accessor_->DeleteIterator(data_, iterator_); data_ = other.data_; accessor_ = other.accessor_; iterator_ = accessor_->CopyIterator(data_, other.iterator_); } return *this; } protected: const void* data_; const RepeatedFieldAccessor* accessor_; void* iterator_; google::protobuf::scoped_ptr scratch_space_; }; // TypeTraits that maps the type parameter T of RepeatedFieldRef or // MutableRepeatedFieldRef to corresponding iterator type, // RepeatedFieldAccessor type, etc. template struct PrimitiveTraits { static const bool is_primitive = false; }; #define DEFINE_PRIMITIVE(TYPE, type) \ template<> struct PrimitiveTraits { \ static const bool is_primitive = true; \ static const FieldDescriptor::CppType cpp_type = \ FieldDescriptor::CPPTYPE_ ## TYPE; \ }; DEFINE_PRIMITIVE(INT32, int32) DEFINE_PRIMITIVE(UINT32, uint32) DEFINE_PRIMITIVE(INT64, int64) DEFINE_PRIMITIVE(UINT64, uint64) DEFINE_PRIMITIVE(FLOAT, float) DEFINE_PRIMITIVE(DOUBLE, double) DEFINE_PRIMITIVE(BOOL, bool) #undef DEFINE_PRIMITIVE template struct RefTypeTraits< T, typename internal::enable_if::is_primitive>::type> { typedef RepeatedFieldRefIterator iterator; typedef RepeatedFieldAccessor AccessorType; typedef T AccessorValueType; typedef T IteratorValueType; typedef T* IteratorPointerType; static const FieldDescriptor::CppType cpp_type = PrimitiveTraits::cpp_type; static const Descriptor* GetMessageFieldDescriptor() { return NULL; } }; template struct RefTypeTraits< T, typename internal::enable_if::value>::type> { typedef RepeatedFieldRefIterator iterator; typedef RepeatedFieldAccessor AccessorType; // We use int32 for repeated enums in RepeatedFieldAccessor. typedef int32 AccessorValueType; typedef T IteratorValueType; typedef int32* IteratorPointerType; static const FieldDescriptor::CppType cpp_type = FieldDescriptor::CPPTYPE_ENUM; static const Descriptor* GetMessageFieldDescriptor() { return NULL; } }; template struct RefTypeTraits< T, typename internal::enable_if< ::google::protobuf::internal::is_same::value>::type> { typedef RepeatedFieldRefIterator iterator; typedef RepeatedFieldAccessor AccessorType; typedef string AccessorValueType; typedef const string IteratorValueType; typedef const string* IteratorPointerType; static const FieldDescriptor::CppType cpp_type = FieldDescriptor::CPPTYPE_STRING; static const Descriptor* GetMessageFieldDescriptor() { return NULL; } }; template struct MessageDescriptorGetter { static const Descriptor* get() { return T::default_instance().GetDescriptor(); } }; template<> struct MessageDescriptorGetter { static const Descriptor* get() { return NULL; } }; template struct RefTypeTraits< T, typename internal::enable_if::value>::type> { typedef RepeatedFieldRefIterator iterator; typedef RepeatedFieldAccessor AccessorType; typedef Message AccessorValueType; typedef const T& IteratorValueType; typedef const T* IteratorPointerType; static const FieldDescriptor::CppType cpp_type = FieldDescriptor::CPPTYPE_MESSAGE; static const Descriptor* GetMessageFieldDescriptor() { return MessageDescriptorGetter::get(); } }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_REFLECTION_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/reflection_internal.h000066400000000000000000000346301334102242000314760ustar00rootroot00000000000000// 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_REFLECTION_INTERNAL_H__ #define GOOGLE_PROTOBUF_REFLECTION_INTERNAL_H__ #include #include #include namespace google { namespace protobuf { namespace internal { // A base class for RepeatedFieldAccessor implementations that can support // random-access efficiently. All iterator methods delegates the work to // corresponding random-access methods. class RandomAccessRepeatedFieldAccessor : public RepeatedFieldAccessor { public: virtual ~RandomAccessRepeatedFieldAccessor() {} virtual Iterator* BeginIterator(const Field* data) const { return PositionToIterator(0); } virtual Iterator* EndIterator(const Field* data) const { return PositionToIterator(this->Size(data)); } virtual Iterator* CopyIterator(const Field* data, const Iterator* iterator) const { return const_cast(iterator); } virtual Iterator* AdvanceIterator(const Field* data, Iterator* iterator) const { return PositionToIterator(IteratorToPosition(iterator) + 1); } virtual bool EqualsIterator(const Field* data, const Iterator* a, const Iterator* b) const { return a == b; } virtual void DeleteIterator(const Field* data, Iterator* iterator) const { } virtual const Value* GetIteratorValue(const Field* data, const Iterator* iterator, Value* scratch_space) const { return Get(data, static_cast(IteratorToPosition(iterator)), scratch_space); } private: static intptr_t IteratorToPosition(const Iterator* iterator) { return reinterpret_cast(iterator); } static Iterator* PositionToIterator(intptr_t position) { return reinterpret_cast(position); } }; // Base class for RepeatedFieldAccessor implementations that manipulates // RepeatedField. template class RepeatedFieldWrapper : public RandomAccessRepeatedFieldAccessor { public: RepeatedFieldWrapper() {} virtual ~RepeatedFieldWrapper() {} virtual bool IsEmpty(const Field* data) const { return GetRepeatedField(data)->empty(); } virtual int Size(const Field* data) const { return GetRepeatedField(data)->size(); } virtual const Value* Get(const Field* data, int index, Value* scratch_space) const { return ConvertFromT(GetRepeatedField(data)->Get(index), scratch_space); } virtual void Clear(Field* data) const { MutableRepeatedField(data)->Clear(); } virtual void Set(Field* data, int index, const Value* value) const { MutableRepeatedField(data)->Set(index, ConvertToT(value)); } virtual void Add(Field* data, const Value* value) const { MutableRepeatedField(data)->Add(ConvertToT(value)); } virtual void RemoveLast(Field* data) const { MutableRepeatedField(data)->RemoveLast(); } virtual void SwapElements(Field* data, int index1, int index2) const { MutableRepeatedField(data)->SwapElements(index1, index2); } protected: typedef RepeatedField RepeatedFieldType; static const RepeatedFieldType* GetRepeatedField(const Field* data) { return reinterpret_cast(data); } static RepeatedFieldType* MutableRepeatedField(Field* data) { return reinterpret_cast(data); } // Convert an object recevied by this accessor to an object to be stored in // the underlying RepeatedField. virtual T ConvertToT(const Value* value) const = 0; // Convert an object stored in RepeatedPtrField to an object that will be // returned by this accessor. If the two objects have the same type (true // for string fields with ctype=STRING), a pointer to the source object can // be returned directly. Otherwise, data should be copied from value to // scratch_space and scratch_space should be returned. virtual const Value* ConvertFromT(const T& value, Value* scratch_space) const = 0; }; // Base class for RepeatedFieldAccessor implementations that manipulates // RepeatedPtrField. template class RepeatedPtrFieldWrapper : public RandomAccessRepeatedFieldAccessor { public: RepeatedPtrFieldWrapper() {} virtual ~RepeatedPtrFieldWrapper() {} virtual bool IsEmpty(const Field* data) const { return GetRepeatedField(data)->empty(); } virtual int Size(const Field* data) const { return GetRepeatedField(data)->size(); } virtual const Value* Get(const Field* data, int index, Value* scratch_space) const { return ConvertFromT(GetRepeatedField(data)->Get(index), scratch_space); } virtual void Clear(Field* data) const { MutableRepeatedField(data)->Clear(); } virtual void Set(Field* data, int index, const Value* value) const { ConvertToT(value, MutableRepeatedField(data)->Mutable(index)); } virtual void Add(Field* data, const Value* value) const { T* allocated = New(value); ConvertToT(value, allocated); MutableRepeatedField(data)->AddAllocated(allocated); } virtual void RemoveLast(Field* data) const { MutableRepeatedField(data)->RemoveLast(); } virtual void SwapElements(Field* data, int index1, int index2) const { MutableRepeatedField(data)->SwapElements(index1, index2); } protected: typedef RepeatedPtrField RepeatedFieldType; static const RepeatedFieldType* GetRepeatedField(const Field* data) { return reinterpret_cast(data); } static RepeatedFieldType* MutableRepeatedField(Field* data) { return reinterpret_cast(data); } // Create a new T instance. For repeated message fields, T can be specified // as google::protobuf::Message so we can't use "new T()" directly. In that case, value // should be a message of the same type (it's ensured by the caller) and a // new message object will be created using it. virtual T* New(const Value* value) const = 0; // Convert an object received by this accessor to an object that will be // stored in the underlying RepeatedPtrField. virtual void ConvertToT(const Value* value, T* result) const = 0; // Convert an object stored in RepeatedPtrField to an object that will be // returned by this accessor. If the two objects have the same type (true // for string fields with ctype=STRING), a pointer to the source object can // be returned directly. Otherwise, data should be copied from value to // scratch_space and scratch_space should be returned. virtual const Value* ConvertFromT(const T& value, Value* scratch_space) const = 0; }; // An implementation of RandomAccessRepeatedFieldAccessor that manipulates // MapFieldBase. class MapFieldAccessor : public RandomAccessRepeatedFieldAccessor { public: MapFieldAccessor() {} virtual ~MapFieldAccessor() {} virtual bool IsEmpty(const Field* data) const { return GetRepeatedField(data)->empty(); } virtual int Size(const Field* data) const { return GetRepeatedField(data)->size(); } virtual const Value* Get(const Field* data, int index, Value* scratch_space) const { return ConvertFromEntry(GetRepeatedField(data)->Get(index), scratch_space); } virtual void Clear(Field* data) const { MutableRepeatedField(data)->Clear(); } virtual void Set(Field* data, int index, const Value* value) const { ConvertToEntry(value, MutableRepeatedField(data)->Mutable(index)); } virtual void Add(Field* data, const Value* value) const { Message* allocated = New(value); ConvertToEntry(value, allocated); MutableRepeatedField(data)->AddAllocated(allocated); } virtual void RemoveLast(Field* data) const { MutableRepeatedField(data)->RemoveLast(); } virtual void SwapElements(Field* data, int index1, int index2) const { MutableRepeatedField(data)->SwapElements(index1, index2); } virtual void Swap( Field* data, const internal::RepeatedFieldAccessor* other_mutator, Field* other_data) const { GOOGLE_CHECK(this == other_mutator); MutableRepeatedField(data)->Swap(MutableRepeatedField(other_data)); } protected: typedef RepeatedPtrField RepeatedFieldType; static const RepeatedFieldType* GetRepeatedField(const Field* data) { return reinterpret_cast( (&reinterpret_cast(data)->GetRepeatedField())); } static RepeatedFieldType* MutableRepeatedField(Field* data) { return reinterpret_cast( reinterpret_cast(data)->MutableRepeatedField()); } virtual Message* New(const Value* value) const { return static_cast(value)->New(); } // Convert an object received by this accessor to an MapEntry message to be // stored in the underlying MapFieldBase. virtual void ConvertToEntry(const Value* value, Message* result) const { result->CopyFrom(*static_cast(value)); } // Convert a MapEntry message stored in the underlying MapFieldBase to an // object that will be returned by this accessor. virtual const Value* ConvertFromEntry(const Message& value, Value* scratch_space) const { return static_cast(&value); } }; // Default implementations of RepeatedFieldAccessor for primitive types. template class RepeatedFieldPrimitiveAccessor : public RepeatedFieldWrapper { typedef void Field; typedef void Value; using RepeatedFieldWrapper::MutableRepeatedField; public: RepeatedFieldPrimitiveAccessor() {} virtual ~RepeatedFieldPrimitiveAccessor() {} virtual void Swap( Field* data, const internal::RepeatedFieldAccessor* other_mutator, Field* other_data) const { // Currently RepeatedFieldPrimitiveAccessor is the only implementation of // RepeatedFieldAccessor for primitive types. As we are using singletons // for these accessors, here "other_mutator" must be "this". GOOGLE_CHECK(this == other_mutator); MutableRepeatedField(data)->Swap(MutableRepeatedField(other_data)); } protected: virtual T ConvertToT(const Value* value) const { return *static_cast(value); } virtual const Value* ConvertFromT(const T& value, Value* scratch_space) const { return static_cast(&value); } }; // Default implementation of RepeatedFieldAccessor for string fields with // ctype=STRING. class RepeatedPtrFieldStringAccessor : public RepeatedPtrFieldWrapper { typedef void Field; typedef void Value; using RepeatedFieldAccessor::Add; public: RepeatedPtrFieldStringAccessor() {} virtual ~RepeatedPtrFieldStringAccessor() {} virtual void Swap( Field* data, const internal::RepeatedFieldAccessor* other_mutator, Field* other_data) const { if (this == other_mutator) { MutableRepeatedField(data)->Swap(MutableRepeatedField(other_data)); } else { RepeatedPtrField tmp; tmp.Swap(MutableRepeatedField(data)); int other_size = other_mutator->Size(other_data); for (int i = 0; i < other_size; ++i) { Add(data, other_mutator->Get(other_data, i)); } int size = Size(data); other_mutator->Clear(other_data); for (int i = 0; i < size; ++i) { other_mutator->Add(other_data, tmp.Get(i)); } } } protected: virtual string* New(const Value*) const { return new string(); } virtual void ConvertToT(const Value* value, string* result) const { *result = *static_cast(value); } virtual const Value* ConvertFromT(const string& value, Value* scratch_space) const { return static_cast(&value); } }; class RepeatedPtrFieldMessageAccessor : public RepeatedPtrFieldWrapper { typedef void Field; typedef void Value; public: RepeatedPtrFieldMessageAccessor() {} virtual ~RepeatedPtrFieldMessageAccessor() {} virtual void Swap( Field* data, const internal::RepeatedFieldAccessor* other_mutator, Field* other_data) const { GOOGLE_CHECK(this == other_mutator); MutableRepeatedField(data)->Swap(MutableRepeatedField(other_data)); } protected: virtual Message* New(const Value* value) const { return static_cast(value)->New(); } virtual void ConvertToT(const Value* value, Message* result) const { result->CopyFrom(*static_cast(value)); } virtual const Value* ConvertFromT(const Message& value, Value* scratch_space) const { return static_cast(&value); } }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_REFLECTION_INTERNAL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/reflection_ops.cc000066400000000000000000000237741334102242000306300ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { void ReflectionOps::Copy(const Message& from, Message* to) { if (&from == to) return; Clear(to); Merge(from, to); } void ReflectionOps::Merge(const Message& from, Message* to) { GOOGLE_CHECK_NE(&from, to); const Descriptor* descriptor = from.GetDescriptor(); GOOGLE_CHECK_EQ(to->GetDescriptor(), descriptor) << "Tried to merge messages of different types " << "(merge " << descriptor->full_name() << " to " << to->GetDescriptor()->full_name() << ")"; const Reflection* from_reflection = from.GetReflection(); const Reflection* to_reflection = to->GetReflection(); std::vector fields; from_reflection->ListFields(from, &fields); for (int i = 0; i < fields.size(); i++) { const FieldDescriptor* field = fields[i]; if (field->is_repeated()) { int count = from_reflection->FieldSize(from, field); for (int j = 0; j < count; j++) { switch (field->cpp_type()) { #define HANDLE_TYPE(CPPTYPE, METHOD) \ case FieldDescriptor::CPPTYPE_##CPPTYPE: \ to_reflection->Add##METHOD(to, field, \ from_reflection->GetRepeated##METHOD(from, field, j)); \ break; HANDLE_TYPE(INT32 , Int32 ); HANDLE_TYPE(INT64 , Int64 ); HANDLE_TYPE(UINT32, UInt32); HANDLE_TYPE(UINT64, UInt64); HANDLE_TYPE(FLOAT , Float ); HANDLE_TYPE(DOUBLE, Double); HANDLE_TYPE(BOOL , Bool ); HANDLE_TYPE(STRING, String); HANDLE_TYPE(ENUM , Enum ); #undef HANDLE_TYPE case FieldDescriptor::CPPTYPE_MESSAGE: to_reflection->AddMessage(to, field)->MergeFrom( from_reflection->GetRepeatedMessage(from, field, j)); break; } } } else { switch (field->cpp_type()) { #define HANDLE_TYPE(CPPTYPE, METHOD) \ case FieldDescriptor::CPPTYPE_##CPPTYPE: \ to_reflection->Set##METHOD(to, field, \ from_reflection->Get##METHOD(from, field)); \ break; HANDLE_TYPE(INT32 , Int32 ); HANDLE_TYPE(INT64 , Int64 ); HANDLE_TYPE(UINT32, UInt32); HANDLE_TYPE(UINT64, UInt64); HANDLE_TYPE(FLOAT , Float ); HANDLE_TYPE(DOUBLE, Double); HANDLE_TYPE(BOOL , Bool ); HANDLE_TYPE(STRING, String); HANDLE_TYPE(ENUM , Enum ); #undef HANDLE_TYPE case FieldDescriptor::CPPTYPE_MESSAGE: to_reflection->MutableMessage(to, field)->MergeFrom( from_reflection->GetMessage(from, field)); break; } } } to_reflection->MutableUnknownFields(to)->MergeFrom( from_reflection->GetUnknownFields(from)); } void ReflectionOps::Clear(Message* message) { const Reflection* reflection = message->GetReflection(); std::vector fields; reflection->ListFields(*message, &fields); for (int i = 0; i < fields.size(); i++) { reflection->ClearField(message, fields[i]); } reflection->MutableUnknownFields(message)->Clear(); } bool ReflectionOps::IsInitialized(const Message& message) { const Descriptor* descriptor = message.GetDescriptor(); const Reflection* reflection = message.GetReflection(); // Check required fields of this message. for (int i = 0; i < descriptor->field_count(); i++) { if (descriptor->field(i)->is_required()) { if (!reflection->HasField(message, descriptor->field(i))) { return false; } } } // Check that sub-messages are initialized. std::vector fields; reflection->ListFields(message, &fields); for (int i = 0; i < fields.size(); i++) { const FieldDescriptor* field = fields[i]; if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { if (field->is_map()) { const FieldDescriptor* value_field = field->message_type()->field(1); if (value_field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { MapFieldBase* map_field = reflection->MapData(const_cast(&message), field); if (map_field->IsMapValid()) { MapIterator iter(const_cast(&message), field); MapIterator end(const_cast(&message), field); for (map_field->MapBegin(&iter), map_field->MapEnd(&end); iter != end; ++iter) { if (!iter.GetValueRef().GetMessageValue().IsInitialized()) { return false; } } continue; } } else { continue; } } if (field->is_repeated()) { int size = reflection->FieldSize(message, field); for (int j = 0; j < size; j++) { if (!reflection->GetRepeatedMessage(message, field, j) .IsInitialized()) { return false; } } } else { if (!reflection->GetMessage(message, field).IsInitialized()) { return false; } } } } return true; } void ReflectionOps::DiscardUnknownFields(Message* message) { const Reflection* reflection = message->GetReflection(); reflection->MutableUnknownFields(message)->Clear(); std::vector fields; reflection->ListFields(*message, &fields); for (int i = 0; i < fields.size(); i++) { const FieldDescriptor* field = fields[i]; if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { if (field->is_repeated()) { int size = reflection->FieldSize(*message, field); for (int j = 0; j < size; j++) { reflection->MutableRepeatedMessage(message, field, j) ->DiscardUnknownFields(); } } else { reflection->MutableMessage(message, field)->DiscardUnknownFields(); } } } } static string SubMessagePrefix(const string& prefix, const FieldDescriptor* field, int index) { string result(prefix); if (field->is_extension()) { result.append("("); result.append(field->full_name()); result.append(")"); } else { result.append(field->name()); } if (index != -1) { result.append("["); result.append(SimpleItoa(index)); result.append("]"); } result.append("."); return result; } void ReflectionOps::FindInitializationErrors( const Message& message, const string& prefix, std::vector* errors) { const Descriptor* descriptor = message.GetDescriptor(); const Reflection* reflection = message.GetReflection(); // Check required fields of this message. for (int i = 0; i < descriptor->field_count(); i++) { if (descriptor->field(i)->is_required()) { if (!reflection->HasField(message, descriptor->field(i))) { errors->push_back(prefix + descriptor->field(i)->name()); } } } // Check sub-messages. std::vector fields; reflection->ListFields(message, &fields); for (int i = 0; i < fields.size(); i++) { const FieldDescriptor* field = fields[i]; if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { if (field->is_repeated()) { int size = reflection->FieldSize(message, field); for (int j = 0; j < size; j++) { const Message& sub_message = reflection->GetRepeatedMessage(message, field, j); FindInitializationErrors(sub_message, SubMessagePrefix(prefix, field, j), errors); } } else { const Message& sub_message = reflection->GetMessage(message, field); FindInitializationErrors(sub_message, SubMessagePrefix(prefix, field, -1), errors); } } } } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/reflection_ops.h000066400000000000000000000067201334102242000304620ustar00rootroot00000000000000// 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. // // This header is logically internal, but is made public because it is used // from protocol-compiler-generated code, which may reside in other components. #ifndef GOOGLE_PROTOBUF_REFLECTION_OPS_H__ #define GOOGLE_PROTOBUF_REFLECTION_OPS_H__ #include #include namespace google { namespace protobuf { namespace internal { // Basic operations that can be performed using reflection. // These can be used as a cheap way to implement the corresponding // methods of the Message interface, though they are likely to be // slower than implementations tailored for the specific message type. // // This class should stay limited to operations needed to implement // the Message interface. // // This class is really a namespace that contains only static methods. class LIBPROTOBUF_EXPORT ReflectionOps { public: static void Copy(const Message& from, Message* to); static void Merge(const Message& from, Message* to); static void Clear(Message* message); static bool IsInitialized(const Message& message); static void DiscardUnknownFields(Message* message); // Finds all unset required fields in the message and adds their full // paths (e.g. "foo.bar[5].baz") to *names. "prefix" will be attached to // the front of each name. static void FindInitializationErrors(const Message& message, const string& prefix, std::vector* errors); private: // All methods are static. No need to construct. GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionOps); }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_REFLECTION_OPS_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/reflection_ops_unittest.cc000066400000000000000000000407331334102242000325610ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { namespace { TEST(ReflectionOpsTest, SanityCheck) { unittest::TestAllTypes message; TestUtil::SetAllFields(&message); TestUtil::ExpectAllFieldsSet(message); } TEST(ReflectionOpsTest, Copy) { unittest::TestAllTypes message, message2; TestUtil::SetAllFields(&message); ReflectionOps::Copy(message, &message2); TestUtil::ExpectAllFieldsSet(message2); // Copying from self should be a no-op. ReflectionOps::Copy(message2, &message2); TestUtil::ExpectAllFieldsSet(message2); } TEST(ReflectionOpsTest, CopyExtensions) { unittest::TestAllExtensions message, message2; TestUtil::SetAllExtensions(&message); ReflectionOps::Copy(message, &message2); TestUtil::ExpectAllExtensionsSet(message2); } TEST(ReflectionOpsTest, CopyOneof) { unittest::TestOneof2 message, message2; TestUtil::SetOneof1(&message); ReflectionOps::Copy(message, &message2); TestUtil::ExpectOneofSet1(message2); TestUtil::SetOneof2(&message); TestUtil::ExpectOneofSet2(message); ReflectionOps::Copy(message, &message2); TestUtil::ExpectOneofSet2(message2); } TEST(ReflectionOpsTest, Merge) { // Note: Copy is implemented in terms of Merge() so technically the Copy // test already tested most of this. unittest::TestAllTypes message, message2; TestUtil::SetAllFields(&message); // This field will test merging into an empty spot. message2.set_optional_int32(message.optional_int32()); message.clear_optional_int32(); // This tests overwriting. message2.set_optional_string(message.optional_string()); message.set_optional_string("something else"); // This tests concatenating. message2.add_repeated_int32(message.repeated_int32(1)); int32 i = message.repeated_int32(0); message.clear_repeated_int32(); message.add_repeated_int32(i); ReflectionOps::Merge(message2, &message); TestUtil::ExpectAllFieldsSet(message); } TEST(ReflectionOpsTest, MergeExtensions) { // Note: Copy is implemented in terms of Merge() so technically the Copy // test already tested most of this. unittest::TestAllExtensions message, message2; TestUtil::SetAllExtensions(&message); // This field will test merging into an empty spot. message2.SetExtension(unittest::optional_int32_extension, message.GetExtension(unittest::optional_int32_extension)); message.ClearExtension(unittest::optional_int32_extension); // This tests overwriting. message2.SetExtension(unittest::optional_string_extension, message.GetExtension(unittest::optional_string_extension)); message.SetExtension(unittest::optional_string_extension, "something else"); // This tests concatenating. message2.AddExtension(unittest::repeated_int32_extension, message.GetExtension(unittest::repeated_int32_extension, 1)); int32 i = message.GetExtension(unittest::repeated_int32_extension, 0); message.ClearExtension(unittest::repeated_int32_extension); message.AddExtension(unittest::repeated_int32_extension, i); ReflectionOps::Merge(message2, &message); TestUtil::ExpectAllExtensionsSet(message); } TEST(ReflectionOpsTest, MergeUnknown) { // Test that the messages' UnknownFieldSets are correctly merged. unittest::TestEmptyMessage message1, message2; message1.mutable_unknown_fields()->AddVarint(1234, 1); message2.mutable_unknown_fields()->AddVarint(1234, 2); ReflectionOps::Merge(message2, &message1); ASSERT_EQ(2, message1.unknown_fields().field_count()); ASSERT_EQ(UnknownField::TYPE_VARINT, message1.unknown_fields().field(0).type()); EXPECT_EQ(1, message1.unknown_fields().field(0).varint()); ASSERT_EQ(UnknownField::TYPE_VARINT, message1.unknown_fields().field(1).type()); EXPECT_EQ(2, message1.unknown_fields().field(1).varint()); } TEST(ReflectionOpsTest, MergeOneof) { unittest::TestOneof2 message1, message2; TestUtil::SetOneof1(&message1); // Merge to empty message ReflectionOps::Merge(message1, &message2); TestUtil::ExpectOneofSet1(message2); // Merge with the same oneof fields ReflectionOps::Merge(message1, &message2); TestUtil::ExpectOneofSet1(message2); // Merge with different oneof fields TestUtil::SetOneof2(&message1); ReflectionOps::Merge(message1, &message2); TestUtil::ExpectOneofSet2(message2); } #ifdef PROTOBUF_HAS_DEATH_TEST TEST(ReflectionOpsTest, MergeFromSelf) { // Note: Copy is implemented in terms of Merge() so technically the Copy // test already tested most of this. unittest::TestAllTypes message; EXPECT_DEATH( ReflectionOps::Merge(message, &message), "&from"); } #endif // PROTOBUF_HAS_DEATH_TEST TEST(ReflectionOpsTest, Clear) { unittest::TestAllTypes message; TestUtil::SetAllFields(&message); ReflectionOps::Clear(&message); TestUtil::ExpectClear(message); // Check that getting embedded messages returns the objects created during // SetAllFields() rather than default instances. EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(), &message.optionalgroup()); EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), &message.optional_nested_message()); EXPECT_NE(&unittest::ForeignMessage::default_instance(), &message.optional_foreign_message()); EXPECT_NE(&unittest_import::ImportMessage::default_instance(), &message.optional_import_message()); } TEST(ReflectionOpsTest, ClearExtensions) { unittest::TestAllExtensions message; TestUtil::SetAllExtensions(&message); ReflectionOps::Clear(&message); TestUtil::ExpectExtensionsClear(message); // Check that getting embedded messages returns the objects created during // SetAllExtensions() rather than default instances. EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(), &message.GetExtension(unittest::optionalgroup_extension)); EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), &message.GetExtension(unittest::optional_nested_message_extension)); EXPECT_NE(&unittest::ForeignMessage::default_instance(), &message.GetExtension( unittest::optional_foreign_message_extension)); EXPECT_NE(&unittest_import::ImportMessage::default_instance(), &message.GetExtension(unittest::optional_import_message_extension)); } TEST(ReflectionOpsTest, ClearUnknown) { // Test that the message's UnknownFieldSet is correctly cleared. unittest::TestEmptyMessage message; message.mutable_unknown_fields()->AddVarint(1234, 1); ReflectionOps::Clear(&message); EXPECT_EQ(0, message.unknown_fields().field_count()); } TEST(ReflectionOpsTest, ClearOneof) { unittest::TestOneof2 message; TestUtil::ExpectOneofClear(message); TestUtil::SetOneof1(&message); TestUtil::ExpectOneofSet1(message); ReflectionOps::Clear(&message); TestUtil::ExpectOneofClear(message); TestUtil::SetOneof1(&message); TestUtil::ExpectOneofSet1(message); TestUtil::SetOneof2(&message); TestUtil::ExpectOneofSet2(message); ReflectionOps::Clear(&message); TestUtil::ExpectOneofClear(message); } TEST(ReflectionOpsTest, DiscardUnknownFields) { unittest::TestAllTypes message; TestUtil::SetAllFields(&message); // Set some unknown fields in message. message.mutable_unknown_fields() ->AddVarint(123456, 654321); message.mutable_optional_nested_message() ->mutable_unknown_fields() ->AddVarint(123456, 654321); message.mutable_repeated_nested_message(0) ->mutable_unknown_fields() ->AddVarint(123456, 654321); EXPECT_EQ(1, message.unknown_fields().field_count()); EXPECT_EQ(1, message.optional_nested_message() .unknown_fields().field_count()); EXPECT_EQ(1, message.repeated_nested_message(0) .unknown_fields().field_count()); // Discard them. ReflectionOps::DiscardUnknownFields(&message); TestUtil::ExpectAllFieldsSet(message); EXPECT_EQ(0, message.unknown_fields().field_count()); EXPECT_EQ(0, message.optional_nested_message() .unknown_fields().field_count()); EXPECT_EQ(0, message.repeated_nested_message(0) .unknown_fields().field_count()); } TEST(ReflectionOpsTest, DiscardUnknownExtensions) { unittest::TestAllExtensions message; TestUtil::SetAllExtensions(&message); // Set some unknown fields. message.mutable_unknown_fields() ->AddVarint(123456, 654321); message.MutableExtension(unittest::optional_nested_message_extension) ->mutable_unknown_fields() ->AddVarint(123456, 654321); message.MutableExtension(unittest::repeated_nested_message_extension, 0) ->mutable_unknown_fields() ->AddVarint(123456, 654321); EXPECT_EQ(1, message.unknown_fields().field_count()); EXPECT_EQ(1, message.GetExtension(unittest::optional_nested_message_extension) .unknown_fields().field_count()); EXPECT_EQ(1, message.GetExtension(unittest::repeated_nested_message_extension, 0) .unknown_fields().field_count()); // Discard them. ReflectionOps::DiscardUnknownFields(&message); TestUtil::ExpectAllExtensionsSet(message); EXPECT_EQ(0, message.unknown_fields().field_count()); EXPECT_EQ(0, message.GetExtension(unittest::optional_nested_message_extension) .unknown_fields().field_count()); EXPECT_EQ(0, message.GetExtension(unittest::repeated_nested_message_extension, 0) .unknown_fields().field_count()); } TEST(ReflectionOpsTest, IsInitialized) { unittest::TestRequired message; EXPECT_FALSE(ReflectionOps::IsInitialized(message)); message.set_a(1); EXPECT_FALSE(ReflectionOps::IsInitialized(message)); message.set_b(2); EXPECT_FALSE(ReflectionOps::IsInitialized(message)); message.set_c(3); EXPECT_TRUE(ReflectionOps::IsInitialized(message)); } TEST(ReflectionOpsTest, ForeignIsInitialized) { unittest::TestRequiredForeign message; // Starts out initialized because the foreign message is itself an optional // field. EXPECT_TRUE(ReflectionOps::IsInitialized(message)); // Once we create that field, the message is no longer initialized. message.mutable_optional_message(); EXPECT_FALSE(ReflectionOps::IsInitialized(message)); // Initialize it. Now we're initialized. message.mutable_optional_message()->set_a(1); message.mutable_optional_message()->set_b(2); message.mutable_optional_message()->set_c(3); EXPECT_TRUE(ReflectionOps::IsInitialized(message)); // Add a repeated version of the message. No longer initialized. unittest::TestRequired* sub_message = message.add_repeated_message(); EXPECT_FALSE(ReflectionOps::IsInitialized(message)); // Initialize that repeated version. sub_message->set_a(1); sub_message->set_b(2); sub_message->set_c(3); EXPECT_TRUE(ReflectionOps::IsInitialized(message)); } TEST(ReflectionOpsTest, ExtensionIsInitialized) { unittest::TestAllExtensions message; // Starts out initialized because the foreign message is itself an optional // field. EXPECT_TRUE(ReflectionOps::IsInitialized(message)); // Once we create that field, the message is no longer initialized. message.MutableExtension(unittest::TestRequired::single); EXPECT_FALSE(ReflectionOps::IsInitialized(message)); // Initialize it. Now we're initialized. message.MutableExtension(unittest::TestRequired::single)->set_a(1); message.MutableExtension(unittest::TestRequired::single)->set_b(2); message.MutableExtension(unittest::TestRequired::single)->set_c(3); EXPECT_TRUE(ReflectionOps::IsInitialized(message)); // Add a repeated version of the message. No longer initialized. message.AddExtension(unittest::TestRequired::multi); EXPECT_FALSE(ReflectionOps::IsInitialized(message)); // Initialize that repeated version. message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1); message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2); message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3); EXPECT_TRUE(ReflectionOps::IsInitialized(message)); } TEST(ReflectionOpsTest, OneofIsInitialized) { unittest::TestRequiredOneof message; EXPECT_TRUE(ReflectionOps::IsInitialized(message)); message.mutable_foo_message(); EXPECT_FALSE(ReflectionOps::IsInitialized(message)); message.set_foo_int(1); EXPECT_TRUE(ReflectionOps::IsInitialized(message)); message.mutable_foo_message(); EXPECT_FALSE(ReflectionOps::IsInitialized(message)); message.mutable_foo_message()->set_required_double(0.1); EXPECT_TRUE(ReflectionOps::IsInitialized(message)); } static string FindInitializationErrors(const Message& message) { std::vector errors; ReflectionOps::FindInitializationErrors(message, "", &errors); return Join(errors, ","); } TEST(ReflectionOpsTest, FindInitializationErrors) { unittest::TestRequired message; EXPECT_EQ("a,b,c", FindInitializationErrors(message)); } TEST(ReflectionOpsTest, FindForeignInitializationErrors) { unittest::TestRequiredForeign message; message.mutable_optional_message(); message.add_repeated_message(); message.add_repeated_message(); EXPECT_EQ("optional_message.a," "optional_message.b," "optional_message.c," "repeated_message[0].a," "repeated_message[0].b," "repeated_message[0].c," "repeated_message[1].a," "repeated_message[1].b," "repeated_message[1].c", FindInitializationErrors(message)); } TEST(ReflectionOpsTest, FindExtensionInitializationErrors) { unittest::TestAllExtensions message; message.MutableExtension(unittest::TestRequired::single); message.AddExtension(unittest::TestRequired::multi); message.AddExtension(unittest::TestRequired::multi); EXPECT_EQ("(protobuf_unittest.TestRequired.single).a," "(protobuf_unittest.TestRequired.single).b," "(protobuf_unittest.TestRequired.single).c," "(protobuf_unittest.TestRequired.multi)[0].a," "(protobuf_unittest.TestRequired.multi)[0].b," "(protobuf_unittest.TestRequired.multi)[0].c," "(protobuf_unittest.TestRequired.multi)[1].a," "(protobuf_unittest.TestRequired.multi)[1].b," "(protobuf_unittest.TestRequired.multi)[1].c", FindInitializationErrors(message)); } TEST(ReflectionOpsTest, FindOneofInitializationErrors) { unittest::TestRequiredOneof message; message.mutable_foo_message(); EXPECT_EQ("foo_message.required_double", FindInitializationErrors(message)); } } // namespace } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/repeated_field.cc000066400000000000000000000103231334102242000305330ustar00rootroot00000000000000// 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 #include #include #include namespace google { namespace protobuf { namespace internal { void** RepeatedPtrFieldBase::InternalExtend(int extend_amount) { int new_size = current_size_ + extend_amount; if (total_size_ >= new_size) { // N.B.: rep_ is non-NULL because extend_amount is always > 0, hence // total_size must be non-zero since it is lower-bounded by new_size. return &rep_->elements[current_size_]; } Rep* old_rep = rep_; Arena* arena = GetArenaNoVirtual(); new_size = std::max(kMinRepeatedFieldAllocationSize, std::max(total_size_ * 2, new_size)); GOOGLE_CHECK_LE(new_size, (std::numeric_limits::max() - kRepHeaderSize) / sizeof(old_rep->elements[0])) << "Requested size is too large to fit into size_t."; size_t bytes = kRepHeaderSize + sizeof(old_rep->elements[0]) * new_size; if (arena == NULL) { rep_ = reinterpret_cast(::operator new(bytes)); } else { rep_ = reinterpret_cast( ::google::protobuf::Arena::CreateArray(arena, bytes)); } #if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation) const int old_total_size = total_size_; #endif total_size_ = new_size; if (old_rep && old_rep->allocated_size > 0) { memcpy(rep_->elements, old_rep->elements, old_rep->allocated_size * sizeof(rep_->elements[0])); rep_->allocated_size = old_rep->allocated_size; } else { rep_->allocated_size = 0; } if (arena == NULL) { #if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation) const size_t old_size = old_total_size * sizeof(rep_->elements[0]) + kRepHeaderSize; ::operator delete(static_cast(old_rep), old_size); #else ::operator delete(static_cast(old_rep)); #endif } return &rep_->elements[current_size_]; } void RepeatedPtrFieldBase::Reserve(int new_size) { if (new_size > current_size_) { InternalExtend(new_size - current_size_); } } void RepeatedPtrFieldBase::CloseGap(int start, int num) { if (rep_ == NULL) return; // 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; rep_->allocated_size -= num; } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/repeated_field.h000066400000000000000000002653111334102242000304060ustar00rootroot00000000000000// 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. // // RepeatedField and RepeatedPtrField are used by generated protocol message // classes to manipulate repeated fields. These classes are very similar to // STL's vector, but include a number of optimizations found to be useful // specifically in the case of Protocol Buffers. RepeatedPtrField is // particularly different from STL vector as it manages ownership of the // pointers that it contains. // // Typically, clients should not need to access RepeatedField objects directly, // but should instead use the accessor functions generated automatically by the // protocol compiler. #ifndef GOOGLE_PROTOBUF_REPEATED_FIELD_H__ #define GOOGLE_PROTOBUF_REPEATED_FIELD_H__ #ifdef _MSC_VER // This is required for min/max on VS2013 only. #include #endif #include #include #include #include #include #include #include #include #include #include // Forward-declare these so that we can make them friends. namespace google { namespace upb { namespace google_opensource { class GMR_Handlers; } // namespace google_opensource } // namespace upb namespace protobuf { class Message; namespace internal { class MergePartialFromCodedStreamHelper; static const int kMinRepeatedFieldAllocationSize = 4; // A utility function for logging that doesn't need any template types. void LogIndexOutOfBounds(int index, int size); template inline int CalculateReserve(Iter begin, Iter end, std::forward_iterator_tag) { return std::distance(begin, end); } template inline int CalculateReserve(Iter /*begin*/, Iter /*end*/, std::input_iterator_tag /*unused*/) { return -1; } template inline int CalculateReserve(Iter begin, Iter end) { typedef typename std::iterator_traits::iterator_category Category; return CalculateReserve(begin, end, Category()); } } // namespace internal // RepeatedField is used to represent repeated fields of a primitive type (in // other words, everything except strings and nested Messages). Most users will // not ever use a RepeatedField directly; they will use the get-by-index, // set-by-index, and add accessors that are generated for all repeated fields. template class RepeatedField PROTOBUF_FINAL { public: RepeatedField(); explicit RepeatedField(Arena* arena); RepeatedField(const RepeatedField& other); template RepeatedField(Iter begin, const Iter& end); ~RepeatedField(); RepeatedField& operator=(const RepeatedField& other); #if LANG_CXX11 RepeatedField(RepeatedField&& other) noexcept; RepeatedField& operator=(RepeatedField&& other) noexcept; #endif bool empty() const; int size() const; const Element& Get(int index) const; Element* Mutable(int index); const Element& operator[](int index) const { return Get(index); } Element& operator[](int index) { return *Mutable(index); } void Set(int index, const Element& value); void Add(const Element& value); // Appends a new element and return a pointer to it. // The new element is uninitialized if |Element| is a POD type. Element* Add(); // Remove the last element in the array. void RemoveLast(); // Extract elements with indices in "[start .. start+num-1]". // Copy them into "elements[0 .. num-1]" if "elements" is not NULL. // Caution: implementation also moves elements with indices [start+num ..]. // Calling this routine inside a loop can cause quadratic behavior. void ExtractSubrange(int start, int num, Element* elements); void Clear(); void MergeFrom(const RepeatedField& other); void CopyFrom(const RepeatedField& other); // Reserve space to expand the field to at least the given size. If the // array is grown, it will always be at least doubled in size. void Reserve(int new_size); // Resize the RepeatedField to a new, smaller size. This is O(1). void Truncate(int new_size); void AddAlreadyReserved(const Element& value); // Appends a new element and return a pointer to it. // The new element is uninitialized if |Element| is a POD type. // Should be called only if Capacity() > Size(). Element* AddAlreadyReserved(); Element* AddNAlreadyReserved(int elements); int Capacity() const; // Like STL resize. Uses value to fill appended elements. // Like Truncate() if new_size <= size(), otherwise this is // O(new_size - size()). void Resize(int new_size, const Element& value); // Gets the underlying array. This pointer is possibly invalidated by // any add or remove operation. Element* mutable_data(); const Element* data() const; // Swap entire contents with "other". If they are separate arenas then, copies // data between each other. void Swap(RepeatedField* other); // Swap 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); // Swap two elements. void SwapElements(int index1, int index2); // STL-like iterator support typedef Element* iterator; typedef const Element* const_iterator; typedef Element value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef value_type* pointer; typedef const value_type* const_pointer; typedef int size_type; typedef ptrdiff_t difference_type; iterator begin(); const_iterator begin() const; const_iterator cbegin() const; iterator end(); const_iterator end() const; const_iterator cend() const; // Reverse iterator support typedef std::reverse_iterator const_reverse_iterator; typedef std::reverse_iterator reverse_iterator; reverse_iterator rbegin() { return reverse_iterator(end()); } const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } // Returns the number of bytes used by the repeated field, excluding // sizeof(*this) size_t SpaceUsedExcludingSelfLong() const; int SpaceUsedExcludingSelf() const { return internal::ToIntSize(SpaceUsedExcludingSelfLong()); } // Removes the element referenced by position. // // Returns an iterator to the element immediately following the removed // element. // // Invalidates all iterators at or after the removed element, including end(). iterator erase(const_iterator position); // Removes the elements in the range [first, last). // // Returns an iterator to the element immediately following the removed range. // // Invalidates all iterators at or after the removed range, including end(). iterator erase(const_iterator first, const_iterator last); // Get the Arena on which this RepeatedField stores its elements. ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); } // For internal use only. // // This is public due to it being called by generated code. inline void InternalSwap(RepeatedField* other); private: static const int kInitialSize = 0; // A note on the representation here (see also comment below for // RepeatedPtrFieldBase's struct Rep): // // We maintain the same sizeof(RepeatedField) as before we added arena support // so that we do not degrade performance by bloating memory usage. Directly // adding an arena_ element to RepeatedField is quite costly. By using // indirection in this way, we keep the same size when the RepeatedField is // empty (common case), and add only an 8-byte header to the elements array // when non-empty. We make sure to place the size fields directly in the // RepeatedField class to avoid costly cache misses due to the indirection. int current_size_; int total_size_; struct Rep { Arena* arena; Element elements[1]; }; // We can not use sizeof(Rep) - sizeof(Element) due to the trailing padding on // the struct. We can not use sizeof(Arena*) as well because there might be // a "gap" after the field arena and before the field elements (e.g., when // Element is double and pointer is 32bit). static const size_t kRepHeaderSize; // Contains arena ptr and the elements array. We also keep the invariant that // if rep_ is NULL, then arena is NULL. Rep* rep_; friend class Arena; typedef void InternalArenaConstructable_; // Move the contents of |from| into |to|, possibly clobbering |from| in the // process. For primitive types this is just a memcpy(), but it could be // specialized for non-primitive types to, say, swap each element instead. void MoveArray(Element* to, Element* from, int size); // Copy the elements of |from| into |to|. void CopyArray(Element* to, const Element* from, int size); // Internal helper expected by Arena methods. inline Arena* GetArenaNoVirtual() const { return (rep_ == NULL) ? NULL : rep_->arena; } // Internal helper to delete all elements and deallocate the storage. // If Element has a trivial destructor (for example, if it's a fundamental // type, like int32), the loop will be removed by the optimizer. void InternalDeallocate(Rep* rep, int size) { if (rep != NULL) { Element* e = &rep->elements[0]; Element* limit = &rep->elements[size]; for (; e < limit; e++) { e->~Element(); } if (rep->arena == NULL) { #if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation) const size_t bytes = size * sizeof(*e) + kRepHeaderSize; ::operator delete(static_cast(rep), bytes); #else ::operator delete(static_cast(rep)); #endif } } } friend class internal::WireFormatLite; const Element* unsafe_data() const; }; template const size_t RepeatedField::kRepHeaderSize = reinterpret_cast(&reinterpret_cast(16)->elements[0]) - 16; namespace internal { template class RepeatedPtrIterator; template class RepeatedPtrOverPtrsIterator; } // namespace internal namespace internal { // This is a helper template to copy an array of elements efficiently when they // have a trivial copy constructor, and correctly otherwise. This really // shouldn't be necessary, but our compiler doesn't optimize std::copy very // effectively. template ::value> struct ElementCopier { void operator()(Element* to, const Element* from, int array_size); }; } // namespace internal namespace internal { // type-traits helper for RepeatedPtrFieldBase: we only want to invoke // arena-related "copy if on different arena" behavior if the necessary methods // exist on the contained type. In particular, we rely on MergeFrom() existing // as a general proxy for the fact that a copy will work, and we also provide a // specific override for string*. template struct TypeImplementsMergeBehaviorProbeForMergeFrom { typedef char HasMerge; typedef long HasNoMerge; // We accept either of: // - void MergeFrom(const T& other) // - bool MergeFrom(const T& other) // // We mangle these names a bit to avoid compatibility issues in 'unclean' // include environments that may have, e.g., "#define test ..." (yes, this // exists). template struct CheckType; template static HasMerge Check( CheckType*); template static HasMerge Check( CheckType*); template static HasNoMerge Check(...); // Resolves to either google::protobuf::internal::true_type or google::protobuf::internal::false_type. typedef google::protobuf::internal::integral_constant(0)) == sizeof(HasMerge))> type; }; template struct TypeImplementsMergeBehavior : TypeImplementsMergeBehaviorProbeForMergeFrom {}; template <> struct TypeImplementsMergeBehavior< ::std::string> { typedef google::protobuf::internal::true_type type; }; // This is the common base class for RepeatedPtrFields. It deals only in void* // pointers. Users should not use this interface directly. // // The methods of this interface correspond to the methods of RepeatedPtrField, // but may have a template argument called TypeHandler. Its signature is: // class TypeHandler { // public: // typedef MyType Type; // static Type* New(); // static void Delete(Type*); // static void Clear(Type*); // static void Merge(const Type& from, Type* to); // // // Only needs to be implemented if SpaceUsedExcludingSelf() is called. // static int SpaceUsedLong(const Type&); // }; class LIBPROTOBUF_EXPORT RepeatedPtrFieldBase { protected: // The reflection implementation needs to call protected methods directly, // reinterpreting pointers as being to Message instead of a specific Message // subclass. friend class GeneratedMessageReflection; // ExtensionSet stores repeated message extensions as // RepeatedPtrField, but non-lite ExtensionSets need to implement // SpaceUsedLong(), and thus need to call SpaceUsedExcludingSelfLong() // reinterpreting MessageLite as Message. ExtensionSet also needs to make use // of AddFromCleared(), which is not part of the public interface. friend class ExtensionSet; // The MapFieldBase implementation needs to call protected methods directly, // reinterpreting pointers as being to Message instead of a specific Message // subclass. friend class MapFieldBase; // The table-driven MergePartialFromCodedStream implementation needs to // operate on RepeatedPtrField. friend class MergePartialFromCodedStreamHelper; // To parse directly into a proto2 generated class, the upb class GMR_Handlers // needs to be able to modify a RepeatedPtrFieldBase directly. friend class upb::google_opensource::GMR_Handlers; RepeatedPtrFieldBase(); explicit RepeatedPtrFieldBase(::google::protobuf::Arena* arena); ~RepeatedPtrFieldBase() {} // Must be called from destructor. template void Destroy(); bool empty() const; int size() const; template const typename TypeHandler::Type& Get(int index) const; template typename TypeHandler::Type* Mutable(int index); template void Delete(int index); template typename TypeHandler::Type* Add(typename TypeHandler::Type* prototype = NULL); #if LANG_CXX11 template void Add(typename TypeHandler::Type&& value, internal::enable_if* dummy = NULL); #endif template void RemoveLast(); template void Clear(); template void MergeFrom(const RepeatedPtrFieldBase& other); template void CopyFrom(const RepeatedPtrFieldBase& other); void CloseGap(int start, int num); void Reserve(int new_size); int Capacity() const; // Used for constructing iterators. void* const* raw_data() const; void** raw_mutable_data() const; template typename TypeHandler::Type** mutable_data(); template const typename TypeHandler::Type* const* data() const; template GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void Swap(RepeatedPtrFieldBase* other); void SwapElements(int index1, int index2); template size_t SpaceUsedExcludingSelfLong() const; // Advanced memory management -------------------------------------- // Like Add(), but if there are no cleared objects to use, returns NULL. template typename TypeHandler::Type* AddFromCleared(); template void AddAllocated(typename TypeHandler::Type* value) { typename TypeImplementsMergeBehavior::type t; AddAllocatedInternal(value, t); } template void UnsafeArenaAddAllocated(typename TypeHandler::Type* value); template typename TypeHandler::Type* ReleaseLast() { typename TypeImplementsMergeBehavior::type t; return ReleaseLastInternal(t); } // Releases last element and returns it, but does not do out-of-arena copy. // And just returns the raw pointer to the contained element in the arena. template typename TypeHandler::Type* UnsafeArenaReleaseLast(); int ClearedCount() const; template void AddCleared(typename TypeHandler::Type* value); template typename TypeHandler::Type* ReleaseCleared(); protected: inline void InternalSwap(RepeatedPtrFieldBase* other); template void AddAllocatedInternal(typename TypeHandler::Type* value, google::protobuf::internal::true_type); template void AddAllocatedInternal(typename TypeHandler::Type* value, google::protobuf::internal::false_type); template GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE void AddAllocatedSlowWithCopy(typename TypeHandler::Type* value, Arena* value_arena, Arena* my_arena); template GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE void AddAllocatedSlowWithoutCopy(typename TypeHandler::Type* value); template typename TypeHandler::Type* ReleaseLastInternal(google::protobuf::internal::true_type); template typename TypeHandler::Type* ReleaseLastInternal(google::protobuf::internal::false_type); template GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE void SwapFallback(RepeatedPtrFieldBase* other); inline Arena* GetArenaNoVirtual() const { return arena_; } private: static const int kInitialSize = 0; // A few notes on internal representation: // // We use an indirected approach, with struct Rep, to keep // sizeof(RepeatedPtrFieldBase) equivalent to what it was before arena support // was added, namely, 3 8-byte machine words on x86-64. An instance of Rep is // allocated only when the repeated field is non-empty, and it is a // dynamically-sized struct (the header is directly followed by elements[]). // We place arena_ and current_size_ directly in the object to avoid cache // misses due to the indirection, because these fields are checked frequently. // Placing all fields directly in the RepeatedPtrFieldBase instance costs // significant performance for memory-sensitive workloads. Arena* arena_; int current_size_; int total_size_; struct Rep { int allocated_size; void* elements[1]; }; static const size_t kRepHeaderSize = sizeof(Rep) - sizeof(void*); // Contains arena ptr and the elements array. We also keep the invariant that // if rep_ is NULL, then arena is NULL. Rep* rep_; template static inline typename TypeHandler::Type* cast(void* element) { return reinterpret_cast(element); } template static inline const typename TypeHandler::Type* cast(const void* element) { return reinterpret_cast(element); } // 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)); template void MergeFromInnerLoop( void** our_elems, void** other_elems, int length, int already_allocated); // Internal helper: extend array space if necessary to contain |extend_amount| // more elements, and return a pointer to the element immediately following // the old list of elements. This interface factors out common behavior from // Reserve() and MergeFrom() to reduce code size. |extend_amount| must be > 0. void** InternalExtend(int extend_amount); friend class AccessorHelper; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPtrFieldBase); }; template class GenericTypeHandler { public: typedef GenericType Type; #if LANG_CXX11 static const bool Moveable = false; #endif static inline GenericType* New(Arena* arena) { return ::google::protobuf::Arena::CreateMaybeMessage(arena); } static inline GenericType* NewFromPrototype( const GenericType* prototype, ::google::protobuf::Arena* arena = NULL); static inline void Delete(GenericType* value, Arena* arena) { if (arena == NULL) { delete value; } } static inline ::google::protobuf::Arena* GetArena(GenericType* value) { return ::google::protobuf::Arena::GetArena(value); } static inline void* GetMaybeArenaPointer(GenericType* value) { return ::google::protobuf::Arena::GetArena(value); } static inline void Clear(GenericType* value) { value->Clear(); } GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE static void Merge(const GenericType& from, GenericType* to); static inline size_t SpaceUsedLong(const GenericType& value) { return value.SpaceUsedLong(); } static inline const Type& default_instance() { return Type::default_instance(); } }; template GenericType* GenericTypeHandler::NewFromPrototype( const GenericType* /* prototype */, ::google::protobuf::Arena* arena) { return New(arena); } template void GenericTypeHandler::Merge(const GenericType& from, GenericType* to) { to->MergeFrom(from); } // NewFromPrototype() and Merge() are not defined inline here, as we will need // to do a virtual function dispatch anyways to go from Message* to call // New/Merge. template<> MessageLite* GenericTypeHandler::NewFromPrototype( const MessageLite* prototype, google::protobuf::Arena* arena); template<> inline google::protobuf::Arena* GenericTypeHandler::GetArena( MessageLite* value) { return value->GetArena(); } template<> inline void* GenericTypeHandler::GetMaybeArenaPointer( MessageLite* value) { return value->GetMaybeArenaPointer(); } template <> void GenericTypeHandler::Merge(const MessageLite& from, MessageLite* to); template<> inline void GenericTypeHandler::Clear(string* value) { value->clear(); } template<> void GenericTypeHandler::Merge(const string& from, string* to); // Declarations of the specialization as we cannot define them here, as the // header that defines ProtocolMessage depends on types defined in this header. #define DECLARE_SPECIALIZATIONS_FOR_BASE_PROTO_TYPES(TypeName) \ template<> \ TypeName* GenericTypeHandler::NewFromPrototype( \ const TypeName* prototype, google::protobuf::Arena* arena); \ template<> \ google::protobuf::Arena* GenericTypeHandler::GetArena( \ TypeName* value); \ template<> \ void* GenericTypeHandler::GetMaybeArenaPointer( \ TypeName* value); // Message specialization bodies defined in message.cc. This split is necessary // to allow proto2-lite (which includes this header) to be independent of // Message. DECLARE_SPECIALIZATIONS_FOR_BASE_PROTO_TYPES(Message) #undef DECLARE_SPECIALIZATIONS_FOR_BASE_PROTO_TYPES template <> inline const MessageLite& GenericTypeHandler::default_instance() { // Yes, the behavior of the code is undefined, but this function is only // called when we're already deep into the world of undefined, because the // caller called Get(index) out of bounds. MessageLite* null = NULL; return *null; } template <> inline const Message& GenericTypeHandler::default_instance() { // Yes, the behavior of the code is undefined, but this function is only // called when we're already deep into the world of undefined, because the // caller called Get(index) out of bounds. Message* null = NULL; return *null; } class StringTypeHandler { public: typedef string Type; #if LANG_CXX11 static const bool Moveable = std::is_move_constructible::value && std::is_move_assignable::value; #endif static inline string* New(Arena* arena) { return Arena::Create(arena); } #if LANG_CXX11 static inline string* New(Arena* arena, string&& value) { return Arena::Create(arena, std::move(value)); } #endif static inline string* NewFromPrototype(const string*, ::google::protobuf::Arena* arena) { return New(arena); } static inline ::google::protobuf::Arena* GetArena(string*) { return NULL; } static inline void* GetMaybeArenaPointer(string* /* value */) { return NULL; } static inline void Delete(string* value, Arena* arena) { if (arena == NULL) { delete value; } } static inline void Clear(string* value) { value->clear(); } static inline void Merge(const string& from, string* to) { *to = from; } static inline const Type& default_instance() { return ::google::protobuf::internal::GetEmptyString(); } static size_t SpaceUsedLong(const string& value) { return sizeof(value) + StringSpaceUsedExcludingSelfLong(value); } }; } // namespace internal // RepeatedPtrField is like RepeatedField, but used for repeated strings or // Messages. template class RepeatedPtrField PROTOBUF_FINAL : public internal::RepeatedPtrFieldBase { public: RepeatedPtrField(); explicit RepeatedPtrField(::google::protobuf::Arena* arena); RepeatedPtrField(const RepeatedPtrField& other); template RepeatedPtrField(Iter begin, const Iter& end); ~RepeatedPtrField(); RepeatedPtrField& operator=(const RepeatedPtrField& other); #if LANG_CXX11 RepeatedPtrField(RepeatedPtrField&& other) noexcept; RepeatedPtrField& operator=(RepeatedPtrField&& other) noexcept; #endif bool empty() const; int size() const; const Element& Get(int index) const; Element* Mutable(int index); Element* Add(); #if LANG_CXX11 void Add(Element&& value); #endif const Element& operator[](int index) const { return Get(index); } Element& operator[](int index) { return *Mutable(index); } // Remove the last element in the array. // Ownership of the element is retained by the array. void RemoveLast(); // Delete elements with indices in the range [start .. start+num-1]. // Caution: implementation moves all elements with indices [start+num .. ]. // Calling this routine inside a loop can cause quadratic behavior. void DeleteSubrange(int start, int num); void Clear(); void MergeFrom(const RepeatedPtrField& other); void CopyFrom(const RepeatedPtrField& other); // Reserve space to expand the field to at least the given size. This only // resizes the pointer array; it doesn't allocate any objects. If the // array is grown, it will always be at least doubled in size. void Reserve(int new_size); int Capacity() const; // Gets the underlying array. This pointer is possibly invalidated by // any add or remove operation. Element** mutable_data(); const Element* const* data() const; // Swap entire contents with "other". If they are on separate arenas, then // copies data. void Swap(RepeatedPtrField* other); // Swap entire contents with "other". Caller should guarantee that either both // fields are on the same arena or both are on the heap. Swapping between // different arenas with this function is disallowed and is caught via // GOOGLE_DCHECK. void UnsafeArenaSwap(RepeatedPtrField* other); // Swap two elements. void SwapElements(int index1, int index2); // STL-like iterator support typedef internal::RepeatedPtrIterator iterator; typedef internal::RepeatedPtrIterator const_iterator; typedef Element value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef value_type* pointer; typedef const value_type* const_pointer; typedef int size_type; typedef ptrdiff_t difference_type; iterator begin(); const_iterator begin() const; const_iterator cbegin() const; iterator end(); const_iterator end() const; const_iterator cend() const; // Reverse iterator support typedef std::reverse_iterator const_reverse_iterator; typedef std::reverse_iterator reverse_iterator; reverse_iterator rbegin() { return reverse_iterator(end()); } const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } // Custom STL-like iterator that iterates over and returns the underlying // pointers to Element rather than Element itself. typedef internal::RepeatedPtrOverPtrsIterator pointer_iterator; typedef internal::RepeatedPtrOverPtrsIterator const_pointer_iterator; pointer_iterator pointer_begin(); const_pointer_iterator pointer_begin() const; pointer_iterator pointer_end(); const_pointer_iterator pointer_end() const; // Returns (an estimate of) the number of bytes used by the repeated field, // excluding sizeof(*this). size_t SpaceUsedExcludingSelfLong() const; int SpaceUsedExcludingSelf() const { return internal::ToIntSize(SpaceUsedExcludingSelfLong()); } // Advanced memory management -------------------------------------- // When hardcore memory management becomes necessary -- as it sometimes // does here at Google -- the following methods may be useful. // Add an already-allocated object, passing ownership to the // RepeatedPtrField. // // Note that some special behavior occurs with respect to arenas: // // (i) if this field holds submessages, the new submessage will be copied if // the original is in an arena and this RepeatedPtrField is either in a // different arena, or on the heap. // (ii) if this field holds strings, the passed-in string *must* be // heap-allocated, not arena-allocated. There is no way to dynamically check // this at runtime, so User Beware. void AddAllocated(Element* value); // Remove the last element and return it, passing ownership to the caller. // Requires: size() > 0 // // If this RepeatedPtrField is on an arena, an object copy is required to pass // ownership back to the user (for compatible semantics). Use // UnsafeArenaReleaseLast() if this behavior is undesired. Element* ReleaseLast(); // Add an already-allocated object, skipping arena-ownership checks. The user // must guarantee that the given object is in the same arena as this // RepeatedPtrField. // It is also useful in legacy code that uses temporary ownership to avoid // copies. Example: // RepeatedPtrField temp_field; // temp_field.AddAllocated(new T); // ... // Do something with temp_field // temp_field.ExtractSubrange(0, temp_field.size(), NULL); // If you put temp_field on the arena this fails, because the ownership // transfers to the arena at the "AddAllocated" call and is not released // anymore causing a double delete. UnsafeArenaAddAllocated prevents this. void UnsafeArenaAddAllocated(Element* value); // Remove the last element and return it. Works only when operating on an // arena. The returned pointer is to the original object in the arena, hence // has the arena's lifetime. // Requires: current_size_ > 0 Element* UnsafeArenaReleaseLast(); // Extract elements with indices in the range "[start .. start+num-1]". // The caller assumes ownership of the extracted elements and is responsible // for deleting them when they are no longer needed. // If "elements" is non-NULL, then pointers to the extracted elements // are stored in "elements[0 .. num-1]" for the convenience of the caller. // If "elements" is NULL, then the caller must use some other mechanism // to perform any further operations (like deletion) on these elements. // Caution: implementation also moves elements with indices [start+num ..]. // Calling this routine inside a loop can cause quadratic behavior. // // Memory copying behavior is identical to ReleaseLast(), described above: if // this RepeatedPtrField is on an arena, an object copy is performed for each // returned element, so that all returned element pointers are to // heap-allocated copies. If this copy is not desired, the user should call // UnsafeArenaExtractSubrange(). void ExtractSubrange(int start, int num, Element** elements); // Identical to ExtractSubrange() described above, except that when this // repeated field is on an arena, no object copies are performed. Instead, the // raw object pointers are returned. Thus, if on an arena, the returned // objects must not be freed, because they will not be heap-allocated objects. void UnsafeArenaExtractSubrange(int start, int num, Element** elements); // When elements are removed by calls to RemoveLast() or Clear(), they // are not actually freed. Instead, they are cleared and kept so that // they can be reused later. This can save lots of CPU time when // repeatedly reusing a protocol message for similar purposes. // // Hardcore programs may choose to manipulate these cleared objects // to better optimize memory management using the following routines. // Get the number of cleared objects that are currently being kept // around for reuse. int ClearedCount() const; // Add an element to the pool of cleared objects, passing ownership to // the RepeatedPtrField. The element must be cleared prior to calling // this method. // // This method cannot be called when the repeated field is on an arena or when // |value| is; both cases will trigger a GOOGLE_DCHECK-failure. void AddCleared(Element* value); // Remove a single element from the cleared pool and return it, passing // ownership to the caller. The element is guaranteed to be cleared. // Requires: ClearedCount() > 0 // // // This method cannot be called when the repeated field is on an arena; doing // so will trigger a GOOGLE_DCHECK-failure. Element* ReleaseCleared(); // Removes the element referenced by position. // // Returns an iterator to the element immediately following the removed // element. // // Invalidates all iterators at or after the removed element, including end(). iterator erase(const_iterator position); // Removes the elements in the range [first, last). // // Returns an iterator to the element immediately following the removed range. // // Invalidates all iterators at or after the removed range, including end(). iterator erase(const_iterator first, const_iterator last); // Gets the arena on which this RepeatedPtrField stores its elements. ::google::protobuf::Arena* GetArena() const { return GetArenaNoVirtual(); } // For internal use only. // // This is public due to it being called by generated code. using RepeatedPtrFieldBase::InternalSwap; private: // Note: RepeatedPtrField SHOULD NOT be subclassed by users. class TypeHandler; // Internal arena accessor expected by helpers in Arena. inline Arena* GetArenaNoVirtual() const; // Implementations for ExtractSubrange(). The copying behavior must be // included only if the type supports the necessary operations (e.g., // MergeFrom()), so we must resolve this at compile time. ExtractSubrange() // uses SFINAE to choose one of the below implementations. void ExtractSubrangeInternal(int start, int num, Element** elements, google::protobuf::internal::true_type); void ExtractSubrangeInternal(int start, int num, Element** elements, google::protobuf::internal::false_type); friend class Arena; typedef void InternalArenaConstructable_; }; // implementation ==================================================== template inline RepeatedField::RepeatedField() : current_size_(0), total_size_(0), rep_(NULL) { } template inline RepeatedField::RepeatedField(Arena* arena) : current_size_(0), total_size_(0), rep_(NULL) { // In case arena is NULL, then we do not create rep_, as code has an invariant // `rep_ == NULL then arena == NULL`. if (arena != NULL) { rep_ = reinterpret_cast( ::google::protobuf::Arena::CreateArray(arena, kRepHeaderSize)); rep_->arena = arena; } } template inline RepeatedField::RepeatedField(const RepeatedField& other) : current_size_(0), total_size_(0), rep_(NULL) { if (other.current_size_ != 0) { Reserve(other.current_size_); CopyArray(rep_->elements, other.rep_->elements, other.current_size_); current_size_ = other.current_size_; } } template template RepeatedField::RepeatedField(Iter begin, const Iter& end) : current_size_(0), total_size_(0), rep_(NULL) { int reserve = internal::CalculateReserve(begin, end); if (reserve != -1) { Reserve(reserve); for (; begin != end; ++begin) { AddAlreadyReserved(*begin); } } else { for (; begin != end; ++begin) { Add(*begin); } } } template RepeatedField::~RepeatedField() { // See explanation in Reserve(): we need to invoke destructors here for the // case that Element has a non-trivial destructor. InternalDeallocate(rep_, total_size_); } template inline RepeatedField& RepeatedField::operator=(const RepeatedField& other) { if (this != &other) CopyFrom(other); return *this; } #if LANG_CXX11 template inline RepeatedField::RepeatedField(RepeatedField&& other) noexcept : RepeatedField() { // We don't just call Swap(&other) here because it would perform 3 copies if // the two fields are on different arenas. if (other.GetArenaNoVirtual()) { CopyFrom(other); } else { InternalSwap(&other); } } template inline RepeatedField& RepeatedField::operator=( RepeatedField&& other) noexcept { // We don't just call Swap(&other) here because it would perform 3 copies if // the two fields are on different arenas. if (this != &other) { if (this->GetArenaNoVirtual() != other.GetArenaNoVirtual()) { CopyFrom(other); } else { InternalSwap(&other); } } return *this; } #endif // LANG_CXX11 template inline bool RepeatedField::empty() const { return current_size_ == 0; } template inline int RepeatedField::size() const { return current_size_; } template inline int RepeatedField::Capacity() const { return total_size_; } template inline void RepeatedField::AddAlreadyReserved(const Element& value) { GOOGLE_DCHECK_LT(current_size_, total_size_); rep_->elements[current_size_++] = value; } template inline Element* RepeatedField::AddAlreadyReserved() { GOOGLE_DCHECK_LT(current_size_, total_size_); return &rep_->elements[current_size_++]; } template inline Element* RepeatedField::AddNAlreadyReserved(int elements) { GOOGLE_DCHECK_LE(current_size_ + elements, total_size_); Element* ret = &rep_->elements[current_size_]; current_size_ += elements; return ret; } template inline void RepeatedField::Resize(int new_size, const Element& value) { GOOGLE_DCHECK_GE(new_size, 0); if (new_size > current_size_) { Reserve(new_size); std::fill(&rep_->elements[current_size_], &rep_->elements[new_size], value); } current_size_ = new_size; } template inline const Element& RepeatedField::Get(int index) const { GOOGLE_DCHECK_GE(index, 0); GOOGLE_DCHECK_LT(index, current_size_); return rep_->elements[index]; } template inline Element* RepeatedField::Mutable(int index) { GOOGLE_DCHECK_GE(index, 0); GOOGLE_DCHECK_LT(index, current_size_); return &rep_->elements[index]; } template inline void RepeatedField::Set(int index, const Element& value) { GOOGLE_DCHECK_GE(index, 0); GOOGLE_DCHECK_LT(index, current_size_); rep_->elements[index] = value; } template inline void RepeatedField::Add(const Element& value) { if (current_size_ == total_size_) Reserve(total_size_ + 1); rep_->elements[current_size_++] = value; } template inline Element* RepeatedField::Add() { if (current_size_ == total_size_) Reserve(total_size_ + 1); return &rep_->elements[current_size_++]; } template inline void RepeatedField::RemoveLast() { GOOGLE_DCHECK_GT(current_size_, 0); current_size_--; } template void RepeatedField::ExtractSubrange( int start, int num, Element* elements) { GOOGLE_DCHECK_GE(start, 0); GOOGLE_DCHECK_GE(num, 0); GOOGLE_DCHECK_LE(start + num, this->current_size_); // Save the values of the removed elements if requested. if (elements != NULL) { for (int i = 0; i < num; ++i) elements[i] = this->Get(i + start); } // Slide remaining elements down to fill the gap. if (num > 0) { for (int i = start + num; i < this->current_size_; ++i) this->Set(i - num, this->Get(i)); this->Truncate(this->current_size_ - num); } } template inline void RepeatedField::Clear() { current_size_ = 0; } template inline void RepeatedField::MergeFrom(const RepeatedField& other) { GOOGLE_DCHECK_NE(&other, this); if (other.current_size_ != 0) { Reserve(current_size_ + other.current_size_); CopyArray(rep_->elements + current_size_, other.rep_->elements, other.current_size_); current_size_ += other.current_size_; } } template inline void RepeatedField::CopyFrom(const RepeatedField& other) { if (&other == this) return; Clear(); MergeFrom(other); } template inline typename RepeatedField::iterator RepeatedField::erase( const_iterator position) { return erase(position, position + 1); } template inline typename RepeatedField::iterator RepeatedField::erase( const_iterator first, const_iterator last) { size_type first_offset = first - cbegin(); if (first != last) { Truncate(std::copy(last, cend(), begin() + first_offset) - cbegin()); } return begin() + first_offset; } template inline Element* RepeatedField::mutable_data() { return rep_ ? rep_->elements : NULL; } template inline const Element* RepeatedField::data() const { return rep_ ? rep_->elements : NULL; } template inline const Element* RepeatedField::unsafe_data() const { GOOGLE_DCHECK(rep_); return rep_->elements; } template inline void RepeatedField::InternalSwap(RepeatedField* other) { GOOGLE_DCHECK(this != other); GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); std::swap(rep_, other->rep_); std::swap(current_size_, other->current_size_); std::swap(total_size_, other->total_size_); } template void RepeatedField::Swap(RepeatedField* other) { if (this == other) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { RepeatedField temp(other->GetArenaNoVirtual()); temp.MergeFrom(*this); CopyFrom(*other); other->UnsafeArenaSwap(&temp); } } template void RepeatedField::UnsafeArenaSwap(RepeatedField* other) { if (this == other) return; InternalSwap(other); } template void RepeatedField::SwapElements(int index1, int index2) { using std::swap; // enable ADL with fallback swap(rep_->elements[index1], rep_->elements[index2]); } template inline typename RepeatedField::iterator RepeatedField::begin() { return rep_ ? rep_->elements : NULL; } template inline typename RepeatedField::const_iterator RepeatedField::begin() const { return rep_ ? rep_->elements : NULL; } template inline typename RepeatedField::const_iterator RepeatedField::cbegin() const { return rep_ ? rep_->elements : NULL; } template inline typename RepeatedField::iterator RepeatedField::end() { return rep_ ? rep_->elements + current_size_ : NULL; } template inline typename RepeatedField::const_iterator RepeatedField::end() const { return rep_ ? rep_->elements + current_size_ : NULL; } template inline typename RepeatedField::const_iterator RepeatedField::cend() const { return rep_ ? rep_->elements + current_size_ : NULL; } template inline size_t RepeatedField::SpaceUsedExcludingSelfLong() const { return rep_ ? (total_size_ * sizeof(Element) + kRepHeaderSize) : 0; } // Avoid inlining of Reserve(): new, copy, and delete[] lead to a significant // amount of code bloat. template void RepeatedField::Reserve(int new_size) { if (total_size_ >= new_size) return; Rep* old_rep = rep_; Arena* arena = GetArenaNoVirtual(); new_size = std::max(google::protobuf::internal::kMinRepeatedFieldAllocationSize, std::max(total_size_ * 2, new_size)); GOOGLE_DCHECK_LE( static_cast(new_size), (std::numeric_limits::max() - kRepHeaderSize) / sizeof(Element)) << "Requested size is too large to fit into size_t."; size_t bytes = kRepHeaderSize + sizeof(Element) * static_cast(new_size); if (arena == NULL) { rep_ = static_cast(::operator new(bytes)); } else { rep_ = reinterpret_cast( ::google::protobuf::Arena::CreateArray(arena, bytes)); } rep_->arena = arena; int old_total_size = total_size_; total_size_ = new_size; // Invoke placement-new on newly allocated elements. We shouldn't have to do // this, since Element is supposed to be POD, but a previous version of this // code allocated storage with "new Element[size]" and some code uses // RepeatedField with non-POD types, relying on constructor invocation. If // Element has a trivial constructor (e.g., int32), gcc (tested with -O2) // completely removes this loop because the loop body is empty, so this has no // effect unless its side-effects are required for correctness. // Note that we do this before MoveArray() below because Element's copy // assignment implementation will want an initialized instance first. Element* e = &rep_->elements[0]; Element* limit = &rep_->elements[total_size_]; for (; e < limit; e++) { new (e) Element; } if (current_size_ > 0) { MoveArray(rep_->elements, old_rep->elements, current_size_); } // Likewise, we need to invoke destructors on the old array. InternalDeallocate(old_rep, old_total_size); } template inline void RepeatedField::Truncate(int new_size) { GOOGLE_DCHECK_LE(new_size, current_size_); if (current_size_ > 0) { current_size_ = new_size; } } template inline void RepeatedField::MoveArray( Element* to, Element* from, int array_size) { CopyArray(to, from, array_size); } template inline void RepeatedField::CopyArray( Element* to, const Element* from, int array_size) { internal::ElementCopier()(to, from, array_size); } namespace internal { template void ElementCopier::operator()( Element* to, const Element* from, int array_size) { std::copy(from, from + array_size, to); } template struct ElementCopier { void operator()(Element* to, const Element* from, int array_size) { memcpy(to, from, static_cast(array_size) * sizeof(Element)); } }; } // namespace internal // ------------------------------------------------------------------- namespace internal { inline RepeatedPtrFieldBase::RepeatedPtrFieldBase() : arena_(NULL), current_size_(0), total_size_(0), rep_(NULL) { } inline RepeatedPtrFieldBase::RepeatedPtrFieldBase(::google::protobuf::Arena* arena) : arena_(arena), current_size_(0), total_size_(0), rep_(NULL) { } template void RepeatedPtrFieldBase::Destroy() { if (rep_ != NULL && arena_ == NULL) { int n = rep_->allocated_size; void* const* elements = rep_->elements; for (int i = 0; i < n; i++) { TypeHandler::Delete(cast(elements[i]), NULL); } #if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation) const size_t size = total_size_ * sizeof(elements[0]) + kRepHeaderSize; ::operator delete(static_cast(rep_), size); #else ::operator delete(static_cast(rep_)); #endif } rep_ = NULL; } template inline void RepeatedPtrFieldBase::Swap(RepeatedPtrFieldBase* other) { if (other->GetArenaNoVirtual() == GetArenaNoVirtual()) { InternalSwap(other); } else { SwapFallback(other); } } template void RepeatedPtrFieldBase::SwapFallback(RepeatedPtrFieldBase* other) { GOOGLE_DCHECK(other->GetArenaNoVirtual() != GetArenaNoVirtual()); // Copy semantics in this case. We try to improve efficiency by placing the // temporary on |other|'s arena so that messages are copied cross-arena only // once, not twice. RepeatedPtrFieldBase temp(other->GetArenaNoVirtual()); temp.MergeFrom(*this); this->Clear(); this->MergeFrom(*other); other->Clear(); other->InternalSwap(&temp); temp.Destroy(); // Frees rep_ if `other` had no arena. } inline bool RepeatedPtrFieldBase::empty() const { return current_size_ == 0; } inline int RepeatedPtrFieldBase::size() const { return current_size_; } template inline const typename TypeHandler::Type& RepeatedPtrFieldBase::Get(int index) const { GOOGLE_DCHECK_GE(index, 0); GOOGLE_DCHECK_LT(index, current_size_); return *cast(rep_->elements[index]); } template inline typename TypeHandler::Type* RepeatedPtrFieldBase::Mutable(int index) { GOOGLE_DCHECK_GE(index, 0); GOOGLE_DCHECK_LT(index, current_size_); return cast(rep_->elements[index]); } template inline void RepeatedPtrFieldBase::Delete(int index) { GOOGLE_DCHECK_GE(index, 0); GOOGLE_DCHECK_LT(index, current_size_); TypeHandler::Delete(cast(rep_->elements[index]), arena_); } template inline typename TypeHandler::Type* RepeatedPtrFieldBase::Add( typename TypeHandler::Type* prototype) { if (rep_ != NULL && current_size_ < rep_->allocated_size) { return cast(rep_->elements[current_size_++]); } if (!rep_ || rep_->allocated_size == total_size_) { Reserve(total_size_ + 1); } ++rep_->allocated_size; typename TypeHandler::Type* result = TypeHandler::NewFromPrototype(prototype, arena_); rep_->elements[current_size_++] = result; return result; } #if LANG_CXX11 template inline void RepeatedPtrFieldBase::Add( typename TypeHandler::Type&& value, internal::enable_if*) { if (rep_ != NULL && current_size_ < rep_->allocated_size) { *cast(rep_->elements[current_size_++]) = std::move(value); return; } if (!rep_ || rep_->allocated_size == total_size_) { Reserve(total_size_ + 1); } ++rep_->allocated_size; typename TypeHandler::Type* result = TypeHandler::New(arena_, std::move(value)); rep_->elements[current_size_++] = result; } #endif template inline void RepeatedPtrFieldBase::RemoveLast() { GOOGLE_DCHECK_GT(current_size_, 0); TypeHandler::Clear(cast(rep_->elements[--current_size_])); } template void RepeatedPtrFieldBase::Clear() { 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(elements[i++])); } while (i < n); current_size_ = 0; } } // To avoid unnecessary code duplication and reduce binary size, we use a // layered approach to implementing MergeFrom(). The toplevel method is // templated, so we get a small thunk per concrete message type in the binary. // This calls a shared implementation with most of the logic, passing a function // pointer to another type-specific piece of code that calls the object-allocate // and merge handlers. template inline void RepeatedPtrFieldBase::MergeFrom(const RepeatedPtrFieldBase& other) { GOOGLE_DCHECK_NE(&other, this); if (other.current_size_ == 0) return; MergeFromInternal( other, &RepeatedPtrFieldBase::MergeFromInnerLoop); } inline void RepeatedPtrFieldBase::MergeFromInternal( const RepeatedPtrFieldBase& other, void (RepeatedPtrFieldBase::*inner_loop)(void**, void**, int, int)) { // Note: wrapper has already guaranteed that other.rep_ != NULL here. int other_size = other.current_size_; void** other_elements = other.rep_->elements; void** new_elements = InternalExtend(other_size); int allocated_elems = rep_->allocated_size - current_size_; (this->*inner_loop)(new_elements, other_elements, other_size, allocated_elems); current_size_ += other_size; if (rep_->allocated_size < current_size_) { rep_->allocated_size = current_size_; } } // Merges other_elems to our_elems. template void RepeatedPtrFieldBase::MergeFromInnerLoop( void** our_elems, void** other_elems, int length, int already_allocated) { // Split into two loops, over ranges [0, allocated) and [allocated, length), // to avoid a branch within the loop. for (int i = 0; i < already_allocated && i < length; i++) { // Already allocated: use existing element. typename TypeHandler::Type* other_elem = reinterpret_cast(other_elems[i]); typename TypeHandler::Type* new_elem = reinterpret_cast(our_elems[i]); TypeHandler::Merge(*other_elem, new_elem); } Arena* arena = GetArenaNoVirtual(); for (int i = already_allocated; i < length; i++) { // Not allocated: alloc a new element first, then merge it. typename TypeHandler::Type* other_elem = reinterpret_cast(other_elems[i]); typename TypeHandler::Type* new_elem = TypeHandler::NewFromPrototype(other_elem, arena); TypeHandler::Merge(*other_elem, new_elem); our_elems[i] = new_elem; } } template inline void RepeatedPtrFieldBase::CopyFrom(const RepeatedPtrFieldBase& other) { if (&other == this) return; RepeatedPtrFieldBase::Clear(); RepeatedPtrFieldBase::MergeFrom(other); } inline int RepeatedPtrFieldBase::Capacity() const { return total_size_; } inline void* const* RepeatedPtrFieldBase::raw_data() const { return rep_ ? rep_->elements : NULL; } inline void** RepeatedPtrFieldBase::raw_mutable_data() const { return rep_ ? const_cast(rep_->elements) : NULL; } template inline typename TypeHandler::Type** RepeatedPtrFieldBase::mutable_data() { // TODO(kenton): Breaks C++ aliasing rules. We should probably remove this // method entirely. return reinterpret_cast(raw_mutable_data()); } template inline const typename TypeHandler::Type* const* RepeatedPtrFieldBase::data() const { // TODO(kenton): Breaks C++ aliasing rules. We should probably remove this // method entirely. return reinterpret_cast(raw_data()); } inline void RepeatedPtrFieldBase::SwapElements(int index1, int index2) { using std::swap; // enable ADL with fallback swap(rep_->elements[index1], rep_->elements[index2]); } template inline size_t RepeatedPtrFieldBase::SpaceUsedExcludingSelfLong() const { size_t allocated_bytes = static_cast(total_size_) * sizeof(void*); if (rep_ != NULL) { for (int i = 0; i < rep_->allocated_size; ++i) { allocated_bytes += TypeHandler::SpaceUsedLong( *cast(rep_->elements[i])); } allocated_bytes += kRepHeaderSize; } return allocated_bytes; } template inline typename TypeHandler::Type* RepeatedPtrFieldBase::AddFromCleared() { if (rep_ != NULL && current_size_ < rep_->allocated_size) { return cast(rep_->elements[current_size_++]); } else { return NULL; } } // AddAllocated version that implements arena-safe copying behavior. template void RepeatedPtrFieldBase::AddAllocatedInternal( typename TypeHandler::Type* value, google::protobuf::internal::true_type) { Arena* element_arena = reinterpret_cast( TypeHandler::GetMaybeArenaPointer(value)); Arena* arena = GetArenaNoVirtual(); if (arena == element_arena && rep_ && rep_->allocated_size < total_size_) { // Fast path: underlying arena representation (tagged pointer) is equal to // our arena pointer, and we can add to array without resizing it (at least // one slot that is not allocated). void** elems = rep_->elements; if (current_size_ < rep_->allocated_size) { // Make space at [current] by moving first allocated element to end of // allocated list. elems[rep_->allocated_size] = elems[current_size_]; } elems[current_size_] = value; current_size_ = current_size_ + 1; rep_->allocated_size = rep_->allocated_size + 1; } else { AddAllocatedSlowWithCopy( value, TypeHandler::GetArena(value), arena); } } // Slowpath handles all cases, copying if necessary. template void RepeatedPtrFieldBase::AddAllocatedSlowWithCopy( // Pass value_arena and my_arena to avoid duplicate virtual call (value) or // load (mine). typename TypeHandler::Type* value, Arena* value_arena, Arena* my_arena) { // Ensure that either the value is in the same arena, or if not, we do the // appropriate thing: Own() it (if it's on heap and we're in an arena) or copy // it to our arena/heap (otherwise). if (my_arena != NULL && value_arena == NULL) { my_arena->Own(value); } else if (my_arena != value_arena) { typename TypeHandler::Type* new_value = TypeHandler::NewFromPrototype(value, my_arena); TypeHandler::Merge(*value, new_value); TypeHandler::Delete(value, value_arena); value = new_value; } UnsafeArenaAddAllocated(value); } // AddAllocated version that does not implement arena-safe copying behavior. template void RepeatedPtrFieldBase::AddAllocatedInternal( typename TypeHandler::Type* value, google::protobuf::internal::false_type) { if (rep_ && rep_->allocated_size < total_size_) { // Fast path: underlying arena representation (tagged pointer) is equal to // our arena pointer, and we can add to array without resizing it (at least // one slot that is not allocated). void** elems = rep_->elements; if (current_size_ < rep_->allocated_size) { // Make space at [current] by moving first allocated element to end of // allocated list. elems[rep_->allocated_size] = elems[current_size_]; } elems[current_size_] = value; current_size_ = current_size_ + 1; ++rep_->allocated_size; } else { UnsafeArenaAddAllocated(value); } } template void RepeatedPtrFieldBase::UnsafeArenaAddAllocated( typename TypeHandler::Type* value) { // Make room for the new pointer. if (!rep_ || current_size_ == total_size_) { // The array is completely full with no cleared objects, so grow it. Reserve(total_size_ + 1); ++rep_->allocated_size; } else if (rep_->allocated_size == total_size_) { // There is no more space in the pointer array because it contains some // cleared objects awaiting reuse. We don't want to grow the array in this // case because otherwise a loop calling AddAllocated() followed by Clear() // would leak memory. TypeHandler::Delete( cast(rep_->elements[current_size_]), arena_); } else if (current_size_ < rep_->allocated_size) { // We have some cleared objects. We don't care about their order, so we // can just move the first one to the end to make space. rep_->elements[rep_->allocated_size] = rep_->elements[current_size_]; ++rep_->allocated_size; } else { // There are no cleared objects. ++rep_->allocated_size; } rep_->elements[current_size_++] = value; } // ReleaseLast() for types that implement merge/copy behavior. template inline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseLastInternal(google::protobuf::internal::true_type) { // First, release an element. typename TypeHandler::Type* result = UnsafeArenaReleaseLast(); // Now perform a copy if we're on an arena. Arena* arena = GetArenaNoVirtual(); if (arena == NULL) { return result; } else { typename TypeHandler::Type* new_result = TypeHandler::NewFromPrototype(result, NULL); TypeHandler::Merge(*result, new_result); return new_result; } } // ReleaseLast() for types that *do not* implement merge/copy behavior -- this // is the same as UnsafeArenaReleaseLast(). Note that we GOOGLE_DCHECK-fail if we're on // an arena, since the user really should implement the copy operation in this // case. template inline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseLastInternal(google::protobuf::internal::false_type) { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL) << "ReleaseLast() called on a RepeatedPtrField that is on an arena, " << "with a type that does not implement MergeFrom. This is unsafe; " << "please implement MergeFrom for your type."; return UnsafeArenaReleaseLast(); } template inline typename TypeHandler::Type* RepeatedPtrFieldBase::UnsafeArenaReleaseLast() { GOOGLE_DCHECK_GT(current_size_, 0); typename TypeHandler::Type* result = cast(rep_->elements[--current_size_]); --rep_->allocated_size; if (current_size_ < rep_->allocated_size) { // There are cleared elements on the end; replace the removed element // with the last allocated element. rep_->elements[current_size_] = rep_->elements[rep_->allocated_size]; } return result; } inline int RepeatedPtrFieldBase::ClearedCount() const { return rep_ ? (rep_->allocated_size - current_size_) : 0; } template inline void RepeatedPtrFieldBase::AddCleared( typename TypeHandler::Type* value) { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL) << "AddCleared() can only be used on a RepeatedPtrField not on an arena."; GOOGLE_DCHECK(TypeHandler::GetArena(value) == NULL) << "AddCleared() can only accept values not on an arena."; if (!rep_ || rep_->allocated_size == total_size_) { Reserve(total_size_ + 1); } rep_->elements[rep_->allocated_size++] = value; } template inline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseCleared() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL) << "ReleaseCleared() can only be used on a RepeatedPtrField not on " << "an arena."; GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); GOOGLE_DCHECK(rep_ != NULL); GOOGLE_DCHECK_GT(rep_->allocated_size, current_size_); return cast(rep_->elements[--rep_->allocated_size]); } } // namespace internal // ------------------------------------------------------------------- template class RepeatedPtrField::TypeHandler : public internal::GenericTypeHandler { }; template <> class RepeatedPtrField::TypeHandler : public internal::StringTypeHandler { }; template inline RepeatedPtrField::RepeatedPtrField() : RepeatedPtrFieldBase() {} template inline RepeatedPtrField::RepeatedPtrField(::google::protobuf::Arena* arena) : RepeatedPtrFieldBase(arena) {} template inline RepeatedPtrField::RepeatedPtrField( const RepeatedPtrField& other) : RepeatedPtrFieldBase() { MergeFrom(other); } template template inline RepeatedPtrField::RepeatedPtrField( Iter begin, const Iter& end) { int reserve = internal::CalculateReserve(begin, end); if (reserve != -1) { Reserve(reserve); } for (; begin != end; ++begin) { *Add() = *begin; } } template RepeatedPtrField::~RepeatedPtrField() { Destroy(); } template inline RepeatedPtrField& RepeatedPtrField::operator=( const RepeatedPtrField& other) { if (this != &other) CopyFrom(other); return *this; } #if LANG_CXX11 template inline RepeatedPtrField::RepeatedPtrField( RepeatedPtrField&& other) noexcept : RepeatedPtrField() { // We don't just call Swap(&other) here because it would perform 3 copies if // the two fields are on different arenas. if (other.GetArenaNoVirtual()) { CopyFrom(other); } else { InternalSwap(&other); } } template inline RepeatedPtrField& RepeatedPtrField::operator=( RepeatedPtrField&& other) noexcept { // We don't just call Swap(&other) here because it would perform 3 copies if // the two fields are on different arenas. if (this != &other) { if (this->GetArenaNoVirtual() != other.GetArenaNoVirtual()) { CopyFrom(other); } else { InternalSwap(&other); } } return *this; } #endif // LANG_CXX11 template inline bool RepeatedPtrField::empty() const { return RepeatedPtrFieldBase::empty(); } template inline int RepeatedPtrField::size() const { return RepeatedPtrFieldBase::size(); } template inline const Element& RepeatedPtrField::Get(int index) const { return RepeatedPtrFieldBase::Get(index); } template inline Element* RepeatedPtrField::Mutable(int index) { return RepeatedPtrFieldBase::Mutable(index); } template inline Element* RepeatedPtrField::Add() { return RepeatedPtrFieldBase::Add(); } #if LANG_CXX11 template inline void RepeatedPtrField::Add(Element&& value) { RepeatedPtrFieldBase::Add(std::move(value)); } #endif template inline void RepeatedPtrField::RemoveLast() { RepeatedPtrFieldBase::RemoveLast(); } template inline void RepeatedPtrField::DeleteSubrange(int start, int num) { GOOGLE_DCHECK_GE(start, 0); GOOGLE_DCHECK_GE(num, 0); GOOGLE_DCHECK_LE(start + num, size()); for (int i = 0; i < num; ++i) { RepeatedPtrFieldBase::Delete(start + i); } ExtractSubrange(start, num, NULL); } template inline void RepeatedPtrField::ExtractSubrange( int start, int num, Element** elements) { typename internal::TypeImplementsMergeBehavior< typename TypeHandler::Type>::type t; ExtractSubrangeInternal(start, num, elements, t); } // ExtractSubrange() implementation for types that implement merge/copy // behavior. template inline void RepeatedPtrField::ExtractSubrangeInternal( int start, int num, Element** elements, google::protobuf::internal::true_type) { GOOGLE_DCHECK_GE(start, 0); GOOGLE_DCHECK_GE(num, 0); GOOGLE_DCHECK_LE(start + num, size()); if (num > 0) { // Save the values of the removed elements if requested. if (elements != NULL) { if (GetArenaNoVirtual() != NULL) { // If we're on an arena, we perform a copy for each element so that the // returned elements are heap-allocated. for (int i = 0; i < num; ++i) { Element* element = RepeatedPtrFieldBase:: Mutable(i + start); typename TypeHandler::Type* new_value = TypeHandler::NewFromPrototype(element, NULL); TypeHandler::Merge(*element, new_value); elements[i] = new_value; } } else { for (int i = 0; i < num; ++i) { elements[i] = RepeatedPtrFieldBase::Mutable(i + start); } } } CloseGap(start, num); } } // ExtractSubrange() implementation for types that do not implement merge/copy // behavior. template inline void RepeatedPtrField::ExtractSubrangeInternal( int start, int num, Element** elements, google::protobuf::internal::false_type) { // This case is identical to UnsafeArenaExtractSubrange(). However, since // ExtractSubrange() must return heap-allocated objects by contract, and we // cannot fulfill this contract if we are an on arena, we must GOOGLE_DCHECK() that // we are not on an arena. GOOGLE_DCHECK(GetArenaNoVirtual() == NULL) << "ExtractSubrange() when arena is non-NULL is only supported when " << "the Element type supplies a MergeFrom() operation to make copies."; UnsafeArenaExtractSubrange(start, num, elements); } template inline void RepeatedPtrField::UnsafeArenaExtractSubrange( int start, int num, Element** elements) { GOOGLE_DCHECK_GE(start, 0); GOOGLE_DCHECK_GE(num, 0); GOOGLE_DCHECK_LE(start + num, size()); if (num > 0) { // Save the values of the removed elements if requested. if (elements != NULL) { for (int i = 0; i < num; ++i) { elements[i] = RepeatedPtrFieldBase::Mutable(i + start); } } CloseGap(start, num); } } template inline void RepeatedPtrField::Clear() { RepeatedPtrFieldBase::Clear(); } template inline void RepeatedPtrField::MergeFrom( const RepeatedPtrField& other) { RepeatedPtrFieldBase::MergeFrom(other); } template inline void RepeatedPtrField::CopyFrom( const RepeatedPtrField& other) { RepeatedPtrFieldBase::CopyFrom(other); } template inline typename RepeatedPtrField::iterator RepeatedPtrField::erase(const_iterator position) { return erase(position, position + 1); } template inline typename RepeatedPtrField::iterator RepeatedPtrField::erase(const_iterator first, const_iterator last) { size_type pos_offset = std::distance(cbegin(), first); size_type last_offset = std::distance(cbegin(), last); DeleteSubrange(pos_offset, last_offset - pos_offset); return begin() + pos_offset; } template inline Element** RepeatedPtrField::mutable_data() { return RepeatedPtrFieldBase::mutable_data(); } template inline const Element* const* RepeatedPtrField::data() const { return RepeatedPtrFieldBase::data(); } template inline void RepeatedPtrField::Swap(RepeatedPtrField* other) { if (this == other) return; RepeatedPtrFieldBase::Swap(other); } template inline void RepeatedPtrField::UnsafeArenaSwap( RepeatedPtrField* other) { if (this == other) return; RepeatedPtrFieldBase::InternalSwap(other); } template inline void RepeatedPtrField::SwapElements(int index1, int index2) { RepeatedPtrFieldBase::SwapElements(index1, index2); } template inline Arena* RepeatedPtrField::GetArenaNoVirtual() const { return RepeatedPtrFieldBase::GetArenaNoVirtual(); } template inline size_t RepeatedPtrField::SpaceUsedExcludingSelfLong() const { return RepeatedPtrFieldBase::SpaceUsedExcludingSelfLong(); } template inline void RepeatedPtrField::AddAllocated(Element* value) { RepeatedPtrFieldBase::AddAllocated(value); } template inline void RepeatedPtrField::UnsafeArenaAddAllocated(Element* value) { RepeatedPtrFieldBase::UnsafeArenaAddAllocated(value); } template inline Element* RepeatedPtrField::ReleaseLast() { return RepeatedPtrFieldBase::ReleaseLast(); } template inline Element* RepeatedPtrField::UnsafeArenaReleaseLast() { return RepeatedPtrFieldBase::UnsafeArenaReleaseLast(); } template inline int RepeatedPtrField::ClearedCount() const { return RepeatedPtrFieldBase::ClearedCount(); } template inline void RepeatedPtrField::AddCleared(Element* value) { return RepeatedPtrFieldBase::AddCleared(value); } template inline Element* RepeatedPtrField::ReleaseCleared() { return RepeatedPtrFieldBase::ReleaseCleared(); } template inline void RepeatedPtrField::Reserve(int new_size) { return RepeatedPtrFieldBase::Reserve(new_size); } template inline int RepeatedPtrField::Capacity() const { return RepeatedPtrFieldBase::Capacity(); } // ------------------------------------------------------------------- namespace internal { // STL-like iterator implementation for RepeatedPtrField. You should not // refer to this class directly; use RepeatedPtrField::iterator instead. // // The iterator for RepeatedPtrField, RepeatedPtrIterator, is // very similar to iterator_ptr in util/gtl/iterator_adaptors.h, // but adds random-access operators and is modified to wrap a void** base // iterator (since RepeatedPtrField stores its array as a void* array and // casting void** to T** would violate C++ aliasing rules). // // This code based on net/proto/proto-array-internal.h by Jeffrey Yasskin // (jyasskin@google.com). template class RepeatedPtrIterator : public std::iterator< std::random_access_iterator_tag, Element> { public: typedef RepeatedPtrIterator iterator; typedef std::iterator< std::random_access_iterator_tag, Element> superclass; // Shadow the value_type in std::iterator<> because const_iterator::value_type // needs to be T, not const T. typedef typename remove_const::type value_type; // Let the compiler know that these are type names, so we don't have to // write "typename" in front of them everywhere. typedef typename superclass::reference reference; typedef typename superclass::pointer pointer; typedef typename superclass::difference_type difference_type; RepeatedPtrIterator() : it_(NULL) {} explicit RepeatedPtrIterator(void* const* it) : it_(it) {} // Allow "upcasting" from RepeatedPtrIterator to // RepeatedPtrIterator. template RepeatedPtrIterator(const RepeatedPtrIterator& other) : it_(other.it_) { // Force a compiler error if the other type is not convertible to ours. if (false) { implicit_cast(static_cast(NULL)); } } // dereferenceable reference operator*() const { return *reinterpret_cast(*it_); } pointer operator->() const { return &(operator*()); } // {inc,dec}rementable iterator& operator++() { ++it_; return *this; } iterator operator++(int) { return iterator(it_++); } iterator& operator--() { --it_; return *this; } iterator operator--(int) { return iterator(it_--); } // equality_comparable bool operator==(const iterator& x) const { return it_ == x.it_; } bool operator!=(const iterator& x) const { return it_ != x.it_; } // less_than_comparable bool operator<(const iterator& x) const { return it_ < x.it_; } bool operator<=(const iterator& x) const { return it_ <= x.it_; } bool operator>(const iterator& x) const { return it_ > x.it_; } bool operator>=(const iterator& x) const { return it_ >= x.it_; } // addable, subtractable iterator& operator+=(difference_type d) { it_ += d; return *this; } friend iterator operator+(iterator it, const difference_type d) { it += d; return it; } friend iterator operator+(const difference_type d, iterator it) { it += d; return it; } iterator& operator-=(difference_type d) { it_ -= d; return *this; } friend iterator operator-(iterator it, difference_type d) { it -= d; return it; } // indexable reference operator[](difference_type d) const { return *(*this + d); } // random access iterator difference_type operator-(const iterator& x) const { return it_ - x.it_; } private: template friend class RepeatedPtrIterator; // The internal iterator. void* const* it_; }; // Provide an iterator that operates on pointers to the underlying objects // rather than the objects themselves as RepeatedPtrIterator does. // Consider using this when working with stl algorithms that change // the array. // The VoidPtr template parameter holds the type-agnostic pointer value // referenced by the iterator. It should either be "void *" for a mutable // iterator, or "const void* const" for a constant iterator. template class RepeatedPtrOverPtrsIterator : public std::iterator { public: typedef RepeatedPtrOverPtrsIterator iterator; typedef std::iterator superclass; // Shadow the value_type in std::iterator<> because const_iterator::value_type // needs to be T, not const T. typedef typename remove_const::type value_type; // Let the compiler know that these are type names, so we don't have to // write "typename" in front of them everywhere. typedef typename superclass::reference reference; typedef typename superclass::pointer pointer; typedef typename superclass::difference_type difference_type; RepeatedPtrOverPtrsIterator() : it_(NULL) {} explicit RepeatedPtrOverPtrsIterator(VoidPtr* it) : it_(it) {} // dereferenceable reference operator*() const { return *reinterpret_cast(it_); } pointer operator->() const { return &(operator*()); } // {inc,dec}rementable iterator& operator++() { ++it_; return *this; } iterator operator++(int) { return iterator(it_++); } iterator& operator--() { --it_; return *this; } iterator operator--(int) { return iterator(it_--); } // equality_comparable bool operator==(const iterator& x) const { return it_ == x.it_; } bool operator!=(const iterator& x) const { return it_ != x.it_; } // less_than_comparable bool operator<(const iterator& x) const { return it_ < x.it_; } bool operator<=(const iterator& x) const { return it_ <= x.it_; } bool operator>(const iterator& x) const { return it_ > x.it_; } bool operator>=(const iterator& x) const { return it_ >= x.it_; } // addable, subtractable iterator& operator+=(difference_type d) { it_ += d; return *this; } friend iterator operator+(iterator it, difference_type d) { it += d; return it; } friend iterator operator+(difference_type d, iterator it) { it += d; return it; } iterator& operator-=(difference_type d) { it_ -= d; return *this; } friend iterator operator-(iterator it, difference_type d) { it -= d; return it; } // indexable reference operator[](difference_type d) const { return *(*this + d); } // random access iterator difference_type operator-(const iterator& x) const { return it_ - x.it_; } private: template friend class RepeatedPtrIterator; // The internal iterator. VoidPtr* it_; }; void RepeatedPtrFieldBase::InternalSwap(RepeatedPtrFieldBase* other) { GOOGLE_DCHECK(this != other); GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); std::swap(rep_, other->rep_); std::swap(current_size_, other->current_size_); std::swap(total_size_, other->total_size_); } } // namespace internal template inline typename RepeatedPtrField::iterator RepeatedPtrField::begin() { return iterator(raw_data()); } template inline typename RepeatedPtrField::const_iterator RepeatedPtrField::begin() const { return iterator(raw_data()); } template inline typename RepeatedPtrField::const_iterator RepeatedPtrField::cbegin() const { return begin(); } template inline typename RepeatedPtrField::iterator RepeatedPtrField::end() { return iterator(raw_data() + size()); } template inline typename RepeatedPtrField::const_iterator RepeatedPtrField::end() const { return iterator(raw_data() + size()); } template inline typename RepeatedPtrField::const_iterator RepeatedPtrField::cend() const { return end(); } template inline typename RepeatedPtrField::pointer_iterator RepeatedPtrField::pointer_begin() { return pointer_iterator(raw_mutable_data()); } template inline typename RepeatedPtrField::const_pointer_iterator RepeatedPtrField::pointer_begin() const { return const_pointer_iterator(const_cast(raw_data())); } template inline typename RepeatedPtrField::pointer_iterator RepeatedPtrField::pointer_end() { return pointer_iterator(raw_mutable_data() + size()); } template inline typename RepeatedPtrField::const_pointer_iterator RepeatedPtrField::pointer_end() const { return const_pointer_iterator( const_cast(raw_data() + size())); } // Iterators and helper functions that follow the spirit of the STL // std::back_insert_iterator and std::back_inserter but are tailor-made // for RepeatedField and RepeatedPtrField. Typical usage would be: // // std::copy(some_sequence.begin(), some_sequence.end(), // google::protobuf::RepeatedFieldBackInserter(proto.mutable_sequence())); // // Ported by johannes from util/gtl/proto-array-iterators.h namespace internal { // A back inserter for RepeatedField objects. template class RepeatedFieldBackInsertIterator : public std::iterator { public: explicit RepeatedFieldBackInsertIterator( RepeatedField* const mutable_field) : field_(mutable_field) { } RepeatedFieldBackInsertIterator& operator=(const T& value) { field_->Add(value); return *this; } RepeatedFieldBackInsertIterator& operator*() { return *this; } RepeatedFieldBackInsertIterator& operator++() { return *this; } RepeatedFieldBackInsertIterator& operator++(int /* unused */) { return *this; } private: RepeatedField* field_; }; // A back inserter for RepeatedPtrField objects. template class RepeatedPtrFieldBackInsertIterator : public std::iterator { public: RepeatedPtrFieldBackInsertIterator( RepeatedPtrField* const mutable_field) : field_(mutable_field) { } RepeatedPtrFieldBackInsertIterator& operator=(const T& value) { *field_->Add() = value; return *this; } RepeatedPtrFieldBackInsertIterator& operator=( const T* const ptr_to_value) { *field_->Add() = *ptr_to_value; return *this; } #if LANG_CXX11 RepeatedPtrFieldBackInsertIterator& operator=(T&& value) { *field_->Add() = std::move(value); return *this; } #endif RepeatedPtrFieldBackInsertIterator& operator*() { return *this; } RepeatedPtrFieldBackInsertIterator& operator++() { return *this; } RepeatedPtrFieldBackInsertIterator& operator++(int /* unused */) { return *this; } private: RepeatedPtrField* field_; }; // A back inserter for RepeatedPtrFields that inserts by transferring ownership // of a pointer. template class AllocatedRepeatedPtrFieldBackInsertIterator : public std::iterator { public: explicit AllocatedRepeatedPtrFieldBackInsertIterator( RepeatedPtrField* const mutable_field) : field_(mutable_field) { } AllocatedRepeatedPtrFieldBackInsertIterator& operator=( T* const ptr_to_value) { field_->AddAllocated(ptr_to_value); return *this; } AllocatedRepeatedPtrFieldBackInsertIterator& operator*() { return *this; } AllocatedRepeatedPtrFieldBackInsertIterator& operator++() { return *this; } AllocatedRepeatedPtrFieldBackInsertIterator& operator++( int /* unused */) { return *this; } private: RepeatedPtrField* field_; }; // Almost identical to AllocatedRepeatedPtrFieldBackInsertIterator. This one // uses the UnsafeArenaAddAllocated instead. template class UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator : public std::iterator { public: explicit UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator( ::google::protobuf::RepeatedPtrField* const mutable_field) : field_(mutable_field) { } UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator& operator=( T const* const ptr_to_value) { field_->UnsafeArenaAddAllocated(const_cast(ptr_to_value)); return *this; } UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator& operator*() { return *this; } UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator& operator++() { return *this; } UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator& operator++( int /* unused */) { return *this; } private: ::google::protobuf::RepeatedPtrField* field_; }; } // namespace internal // Provides a back insert iterator for RepeatedField instances, // similar to std::back_inserter(). template internal::RepeatedFieldBackInsertIterator RepeatedFieldBackInserter(RepeatedField* const mutable_field) { return internal::RepeatedFieldBackInsertIterator(mutable_field); } // Provides a back insert iterator for RepeatedPtrField instances, // similar to std::back_inserter(). template internal::RepeatedPtrFieldBackInsertIterator RepeatedPtrFieldBackInserter(RepeatedPtrField* const mutable_field) { return internal::RepeatedPtrFieldBackInsertIterator(mutable_field); } // Special back insert iterator for RepeatedPtrField instances, just in // case someone wants to write generic template code that can access both // RepeatedFields and RepeatedPtrFields using a common name. template internal::RepeatedPtrFieldBackInsertIterator RepeatedFieldBackInserter(RepeatedPtrField* const mutable_field) { return internal::RepeatedPtrFieldBackInsertIterator(mutable_field); } // Provides a back insert iterator for RepeatedPtrField instances // similar to std::back_inserter() which transfers the ownership while // copying elements. template internal::AllocatedRepeatedPtrFieldBackInsertIterator AllocatedRepeatedPtrFieldBackInserter( RepeatedPtrField* const mutable_field) { return internal::AllocatedRepeatedPtrFieldBackInsertIterator( mutable_field); } // Similar to AllocatedRepeatedPtrFieldBackInserter, using // UnsafeArenaAddAllocated instead of AddAllocated. // This is slightly faster if that matters. It is also useful in legacy code // that uses temporary ownership to avoid copies. Example: // RepeatedPtrField temp_field; // temp_field.AddAllocated(new T); // ... // Do something with temp_field // temp_field.ExtractSubrange(0, temp_field.size(), NULL); // If you put temp_field on the arena this fails, because the ownership // transfers to the arena at the "AddAllocated" call and is not released anymore // causing a double delete. Using UnsafeArenaAddAllocated prevents this. template internal::UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator UnsafeArenaAllocatedRepeatedPtrFieldBackInserter( ::google::protobuf::RepeatedPtrField* const mutable_field) { return internal::UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator( mutable_field); } } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_REPEATED_FIELD_H__ repeated_field_reflection_unittest.cc000066400000000000000000000725531334102242000346420ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf// 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: tgs@google.com (Tom Szymanski) // // Test reflection methods for aggregate access to Repeated[Ptr]Fields. // This test proto2 methods on a proto2 layout. #include #include #include #include #include #include #include namespace google { namespace protobuf { using unittest::ForeignMessage; using unittest::TestAllTypes; using unittest::TestAllExtensions; namespace { static int Func(int i, int j) { return i * j; } static string StrFunc(int i, int j) { string str; SStringPrintf(&str, "%d", Func(i, 4)); return str; } TEST(RepeatedFieldReflectionTest, RegularFields) { TestAllTypes message; const Reflection* refl = message.GetReflection(); const Descriptor* desc = message.GetDescriptor(); for (int i = 0; i < 10; ++i) { message.add_repeated_int32(Func(i, 1)); message.add_repeated_double(Func(i, 2)); message.add_repeated_string(StrFunc(i, 5)); message.add_repeated_foreign_message()->set_c(Func(i, 6)); } // Get FieldDescriptors for all the fields of interest. const FieldDescriptor* fd_repeated_int32 = desc->FindFieldByName("repeated_int32"); const FieldDescriptor* fd_repeated_double = desc->FindFieldByName("repeated_double"); const FieldDescriptor* fd_repeated_string = desc->FindFieldByName("repeated_string"); const FieldDescriptor* fd_repeated_foreign_message = desc->FindFieldByName("repeated_foreign_message"); // Get RepeatedField objects for all fields of interest. const RepeatedField& rf_int32 = refl->GetRepeatedField(message, fd_repeated_int32); const RepeatedField& rf_double = refl->GetRepeatedField(message, fd_repeated_double); // Get mutable RepeatedField objects for all fields of interest. RepeatedField* mrf_int32 = refl->MutableRepeatedField(&message, fd_repeated_int32); RepeatedField* mrf_double = refl->MutableRepeatedField(&message, fd_repeated_double); // Get RepeatedPtrField objects for all fields of interest. const RepeatedPtrField& rpf_string = refl->GetRepeatedPtrField(message, fd_repeated_string); const RepeatedPtrField& rpf_foreign_message = refl->GetRepeatedPtrField( message, fd_repeated_foreign_message); const RepeatedPtrField& rpf_message = refl->GetRepeatedPtrField( message, fd_repeated_foreign_message); // Get mutable RepeatedPtrField objects for all fields of interest. RepeatedPtrField* mrpf_string = refl->MutableRepeatedPtrField(&message, fd_repeated_string); RepeatedPtrField* mrpf_foreign_message = refl->MutableRepeatedPtrField( &message, fd_repeated_foreign_message); RepeatedPtrField* mrpf_message = refl->MutableRepeatedPtrField( &message, fd_repeated_foreign_message); // Make sure we can do gets and sets through the Repeated[Ptr]Field objects. for (int i = 0; i < 10; ++i) { // Check gets through const objects. EXPECT_EQ(rf_int32.Get(i), Func(i, 1)); 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(&rpf_message.Get(i))->c(), Func(i, 6)); // Check gets through mutable objects. EXPECT_EQ(mrf_int32->Get(i), Func(i, 1)); 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(&mrpf_message->Get(i))->c(), Func(i, 6)); // Check sets through mutable objects. mrf_int32->Set(i, Func(i, -1)); mrf_double->Set(i, Func(i, -2)); mrpf_string->Mutable(i)->assign(StrFunc(i, -5)); mrpf_foreign_message->Mutable(i)->set_c(Func(i, -6)); EXPECT_EQ(message.repeated_int32(i), Func(i, -1)); 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(mrpf_message->Mutable(i))->set_c(Func(i, 7)); EXPECT_EQ(message.repeated_foreign_message(i).c(), Func(i, 7)); } #ifdef PROTOBUF_HAS_DEATH_TEST // Make sure types are checked correctly at runtime. const FieldDescriptor* fd_optional_int32 = desc->FindFieldByName("optional_int32"); EXPECT_DEATH(refl->GetRepeatedField( message, fd_optional_int32), "requires a repeated field"); EXPECT_DEATH(refl->GetRepeatedField( message, fd_repeated_int32), "not the right type"); EXPECT_DEATH(refl->GetRepeatedPtrField( message, fd_repeated_foreign_message), "wrong submessage type"); #endif // PROTOBUF_HAS_DEATH_TEST } TEST(RepeatedFieldReflectionTest, ExtensionFields) { TestAllExtensions extended_message; const Reflection* refl = extended_message.GetReflection(); const Descriptor* desc = extended_message.GetDescriptor(); for (int i = 0; i < 10; ++i) { extended_message.AddExtension( unittest::repeated_int64_extension, Func(i, 1)); } const FieldDescriptor* fd_repeated_int64_extension = desc->file()->FindExtensionByName("repeated_int64_extension"); GOOGLE_CHECK(fd_repeated_int64_extension != NULL); const RepeatedField& rf_int64_extension = refl->GetRepeatedField(extended_message, fd_repeated_int64_extension); RepeatedField* mrf_int64_extension = refl->MutableRepeatedField(&extended_message, fd_repeated_int64_extension); for (int i = 0; i < 10; ++i) { EXPECT_EQ(Func(i, 1), rf_int64_extension.Get(i)); mrf_int64_extension->Set(i, Func(i, -1)); EXPECT_EQ(Func(i, -1), extended_message.GetExtension(unittest::repeated_int64_extension, i)); } } template void TestRepeatedFieldRefIteratorForPrimitive( const Ref& handle, const MessageType& message, ValueType (MessageType::*GetFunc)(int) const) { int index = 0; for (typename Ref::const_iterator it = handle.begin(); it != handle.end(); ++it) { EXPECT_EQ((message.*GetFunc)(index), *it); ++index; } EXPECT_EQ(handle.size(), index); } template void TestRepeatedFieldRefIteratorForString( const RepeatedFieldRef& handle, const MessageType& message, ValueType (MessageType::*GetFunc)(int) const) { int index = 0; for (typename RepeatedFieldRef::const_iterator it = handle.begin(); it != handle.end(); ++it) { // Test both operator* and operator-> EXPECT_EQ((message.*GetFunc)(index), *it); EXPECT_EQ((message.*GetFunc)(index).size(), it->size()); ++index; } EXPECT_EQ(handle.size(), index); } TEST(RepeatedFieldReflectionTest, RepeatedFieldRefForRegularFields) { TestAllTypes message; const Reflection* refl = message.GetReflection(); const Descriptor* desc = message.GetDescriptor(); for (int i = 0; i < 10; ++i) { message.add_repeated_int32(Func(i, 1)); message.add_repeated_double(Func(i, 2)); message.add_repeated_string(StrFunc(i, 5)); message.add_repeated_foreign_message()->set_c(Func(i, 6)); } // Get FieldDescriptors for all the fields of interest. const FieldDescriptor* fd_repeated_int32 = desc->FindFieldByName("repeated_int32"); const FieldDescriptor* fd_repeated_double = desc->FindFieldByName("repeated_double"); const FieldDescriptor* fd_repeated_string = desc->FindFieldByName("repeated_string"); const FieldDescriptor* fd_repeated_foreign_message = desc->FindFieldByName("repeated_foreign_message"); // Get RepeatedFieldRef objects for all fields of interest. const RepeatedFieldRef rf_int32 = refl->GetRepeatedFieldRef(message, fd_repeated_int32); const RepeatedFieldRef rf_double = refl->GetRepeatedFieldRef(message, fd_repeated_double); const RepeatedFieldRef rf_string = refl->GetRepeatedFieldRef(message, fd_repeated_string); const RepeatedFieldRef rf_foreign_message = refl->GetRepeatedFieldRef( message, fd_repeated_foreign_message); const RepeatedFieldRef rf_message = refl->GetRepeatedFieldRef( message, fd_repeated_foreign_message); // Get MutableRepeatedFieldRef objects for all fields of interest. const MutableRepeatedFieldRef mrf_int32 = refl->GetMutableRepeatedFieldRef(&message, fd_repeated_int32); const MutableRepeatedFieldRef mrf_double = refl->GetMutableRepeatedFieldRef(&message, fd_repeated_double); const MutableRepeatedFieldRef mrf_string = refl->GetMutableRepeatedFieldRef(&message, fd_repeated_string); const MutableRepeatedFieldRef mrf_foreign_message = refl->GetMutableRepeatedFieldRef( &message, fd_repeated_foreign_message); const MutableRepeatedFieldRef mrf_message = refl->GetMutableRepeatedFieldRef( &message, fd_repeated_foreign_message); EXPECT_EQ(message.repeated_int32_size(), rf_int32.size()); EXPECT_EQ(message.repeated_int32_size(), mrf_int32.size()); EXPECT_EQ(message.repeated_double_size(), rf_double.size()); EXPECT_EQ(message.repeated_double_size(), mrf_double.size()); EXPECT_EQ(message.repeated_string_size(), rf_string.size()); EXPECT_EQ(message.repeated_string_size(), mrf_string.size()); EXPECT_EQ(message.repeated_foreign_message_size(), rf_foreign_message.size()); EXPECT_EQ(message.repeated_foreign_message_size(), mrf_foreign_message.size()); EXPECT_EQ(message.repeated_foreign_message_size(), rf_message.size()); EXPECT_EQ(message.repeated_foreign_message_size(), mrf_message.size()); EXPECT_FALSE(rf_int32.empty()); EXPECT_FALSE(mrf_int32.empty()); EXPECT_FALSE(rf_double.empty()); EXPECT_FALSE(mrf_double.empty()); EXPECT_FALSE(rf_string.empty()); EXPECT_FALSE(mrf_string.empty()); EXPECT_FALSE(rf_foreign_message.empty()); EXPECT_FALSE(mrf_foreign_message.empty()); EXPECT_FALSE(rf_message.empty()); EXPECT_FALSE(mrf_message.empty()); // Make sure we can do gets and sets through the RepeatedFieldRef objects. for (int i = 0; i < 10; ++i) { // Check gets through const objects. EXPECT_EQ(rf_int32.Get(i), Func(i, 1)); EXPECT_EQ(rf_double.Get(i), Func(i, 2)); EXPECT_EQ(rf_string.Get(i), StrFunc(i, 5)); ForeignMessage scratch_space; EXPECT_EQ(rf_foreign_message.Get(i, &scratch_space).c(), Func(i, 6)); EXPECT_EQ(down_cast( rf_message.Get(i, &scratch_space)).c(), Func(i, 6)); // Check gets through mutable objects. EXPECT_EQ(mrf_int32.Get(i), Func(i, 1)); EXPECT_EQ(mrf_double.Get(i), Func(i, 2)); 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( mrf_message.Get(i, &scratch_space)).c(), Func(i, 6)); // Check sets through mutable objects. mrf_int32.Set(i, Func(i, -1)); mrf_double.Set(i, Func(i, -2)); mrf_string.Set(i, StrFunc(i, -5)); ForeignMessage foreign_message; foreign_message.set_c(Func(i, -6)); mrf_foreign_message.Set(i, foreign_message); EXPECT_EQ(message.repeated_int32(i), Func(i, -1)); 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)); foreign_message.set_c(Func(i, 7)); mrf_message.Set(i, foreign_message); EXPECT_EQ(message.repeated_foreign_message(i).c(), Func(i, 7)); } // Test iterators. TestRepeatedFieldRefIteratorForPrimitive(rf_int32, message, &TestAllTypes::repeated_int32); TestRepeatedFieldRefIteratorForPrimitive(rf_double, message, &TestAllTypes::repeated_double); TestRepeatedFieldRefIteratorForString(rf_string, message, &TestAllTypes::repeated_string); // Test iterators for message fields. typedef RepeatedFieldRef::iterator MessageIterator; int index = 0; for (MessageIterator it = rf_foreign_message.begin(); it != rf_foreign_message.end(); ++it) { EXPECT_EQ(message.repeated_foreign_message(index).c(), it->c()); ++index; } EXPECT_EQ(10, index); // Test iterator operators that are not ususally used in regular for-loops. // Including: post increment, assign, ==. MessageIterator old_it = rf_foreign_message.begin(); MessageIterator new_it = old_it++; EXPECT_FALSE(old_it == new_it); // Check that old_it++ increments old_it once. for (index = 1; old_it != rf_foreign_message.end(); ++old_it, ++index) { EXPECT_EQ(message.repeated_foreign_message(index).c(), old_it->c()); } EXPECT_EQ(10, index); // Test assign operator. old_it = new_it; for (index = 0; old_it != rf_foreign_message.end(); ++old_it, ++index) { EXPECT_EQ(message.repeated_foreign_message(index).c(), old_it->c()); } EXPECT_EQ(10, index); // Check that the returned value of old_it++ is the one before increment. for (index = 0; new_it != rf_foreign_message.end(); ++new_it, ++index) { EXPECT_EQ(message.repeated_foreign_message(index).c(), new_it->c()); } EXPECT_EQ(10, index); // Test MutableRepeatedFieldRef::Add() mrf_int32.Add(1234); mrf_double.Add(1234.0); mrf_string.Add("1234"); ForeignMessage foreign_message; foreign_message.set_c(1234); mrf_foreign_message.Add(foreign_message); EXPECT_EQ(1234, message.repeated_int32(10)); EXPECT_EQ(1234.0, message.repeated_double(10)); EXPECT_EQ("1234", message.repeated_string(10)); EXPECT_EQ(1234, message.repeated_foreign_message(10).c()); // Test MutableRepeatedFieldRef::RemoveLast() mrf_int32.RemoveLast(); mrf_double.RemoveLast(); mrf_string.RemoveLast(); mrf_foreign_message.RemoveLast(); EXPECT_EQ(10, message.repeated_int32_size()); EXPECT_EQ(10, message.repeated_double_size()); EXPECT_EQ(10, message.repeated_string_size()); EXPECT_EQ(10, message.repeated_foreign_message_size()); // Test MutableRepeatedFieldRef::SwapElements() mrf_int32.SwapElements(0, 9); mrf_double.SwapElements(0, 9); mrf_string.SwapElements(0, 9); mrf_foreign_message.SwapElements(0, 9); EXPECT_EQ(Func(9, -1), message.repeated_int32(0)); EXPECT_EQ(Func(0, -1), message.repeated_int32(9)); EXPECT_EQ(Func(9, -2), message.repeated_double(0)); EXPECT_EQ(Func(0, -2), message.repeated_double(9)); EXPECT_EQ(StrFunc(9, -5), message.repeated_string(0)); EXPECT_EQ(StrFunc(0, -5), message.repeated_string(9)); EXPECT_EQ(Func(9, 7), message.repeated_foreign_message(0).c()); EXPECT_EQ(Func(0, 7), message.repeated_foreign_message(9).c()); // Test MutableRepeatedFieldRef::Clear() mrf_int32.Clear(); mrf_double.Clear(); mrf_string.Clear(); mrf_foreign_message.Clear(); EXPECT_EQ(0, message.repeated_int32_size()); EXPECT_EQ(0, message.repeated_double_size()); EXPECT_EQ(0, message.repeated_string_size()); EXPECT_EQ(0, message.repeated_foreign_message_size()); // Test (Mutable)RepeatedFieldRef::empty() EXPECT_TRUE(rf_int32.empty()); EXPECT_TRUE(mrf_int32.empty()); EXPECT_TRUE(rf_double.empty()); EXPECT_TRUE(mrf_double.empty()); EXPECT_TRUE(rf_string.empty()); EXPECT_TRUE(mrf_string.empty()); EXPECT_TRUE(rf_foreign_message.empty()); EXPECT_TRUE(mrf_foreign_message.empty()); EXPECT_TRUE(rf_message.empty()); EXPECT_TRUE(mrf_message.empty()); #ifdef PROTOBUF_HAS_DEATH_TEST // Make sure types are checked correctly at runtime. const FieldDescriptor* fd_optional_int32 = desc->FindFieldByName("optional_int32"); EXPECT_DEATH(refl->GetRepeatedFieldRef( message, fd_optional_int32), ""); EXPECT_DEATH(refl->GetRepeatedFieldRef( message, fd_repeated_int32), ""); EXPECT_DEATH(refl->GetRepeatedFieldRef( message, fd_repeated_foreign_message), ""); #endif // PROTOBUF_HAS_DEATH_TEST } TEST(RepeatedFieldReflectionTest, RepeatedFieldRefForEnums) { TestAllTypes message; const Reflection* refl = message.GetReflection(); const Descriptor* desc = message.GetDescriptor(); for (int i = 0; i < 10; ++i) { message.add_repeated_nested_enum(TestAllTypes::BAR); } const FieldDescriptor* fd_repeated_nested_enum = desc->FindFieldByName("repeated_nested_enum"); const RepeatedFieldRef enum_ref = refl->GetRepeatedFieldRef( message, fd_repeated_nested_enum); const MutableRepeatedFieldRef mutable_enum_ref = refl->GetMutableRepeatedFieldRef( &message, fd_repeated_nested_enum); const RepeatedFieldRef int32_ref = refl->GetRepeatedFieldRef( message, fd_repeated_nested_enum); const MutableRepeatedFieldRef mutable_int32_ref = refl->GetMutableRepeatedFieldRef( &message, fd_repeated_nested_enum); EXPECT_EQ(message.repeated_nested_enum_size(), enum_ref.size()); EXPECT_EQ(message.repeated_nested_enum_size(), mutable_enum_ref.size()); EXPECT_EQ(message.repeated_nested_enum_size(), int32_ref.size()); EXPECT_EQ(message.repeated_nested_enum_size(), mutable_int32_ref.size()); EXPECT_FALSE(enum_ref.empty()); EXPECT_FALSE(mutable_enum_ref.empty()); EXPECT_FALSE(int32_ref.empty()); EXPECT_FALSE(mutable_int32_ref.empty()); for (int i = 0; i < 10; ++i) { EXPECT_EQ(TestAllTypes::BAR, enum_ref.Get(i)); EXPECT_EQ(TestAllTypes::BAR, mutable_enum_ref.Get(i)); mutable_enum_ref.Set(i, TestAllTypes::BAZ); EXPECT_EQ(TestAllTypes::BAZ, enum_ref.Get(i)); EXPECT_EQ(TestAllTypes::BAZ, message.repeated_nested_enum(i)); message.set_repeated_nested_enum(i, TestAllTypes::BAR); EXPECT_EQ(TestAllTypes::BAR, int32_ref.Get(i)); EXPECT_EQ(TestAllTypes::BAR, mutable_int32_ref.Get(i)); mutable_int32_ref.Set(i, TestAllTypes::BAZ); EXPECT_EQ(TestAllTypes::BAZ, int32_ref.Get(i)); EXPECT_EQ(TestAllTypes::BAZ, message.repeated_nested_enum(i)); } TestRepeatedFieldRefIteratorForPrimitive(enum_ref, message, &TestAllTypes::repeated_nested_enum); TestRepeatedFieldRefIteratorForPrimitive(int32_ref, message, &TestAllTypes::repeated_nested_enum); // Test Add() mutable_enum_ref.Add(TestAllTypes::FOO); EXPECT_EQ(TestAllTypes::FOO, message.repeated_nested_enum(10)); mutable_int32_ref.Add(TestAllTypes::BAR); EXPECT_EQ(TestAllTypes::BAR, message.repeated_nested_enum(11)); // Test RemoveLast() mutable_enum_ref.RemoveLast(); EXPECT_EQ(11, message.repeated_nested_enum_size()); mutable_int32_ref.RemoveLast(); EXPECT_EQ(10, message.repeated_nested_enum_size()); // Test SwapElements() mutable_enum_ref.Set(0, TestAllTypes::BAR); mutable_enum_ref.Set(9, TestAllTypes::BAZ); mutable_enum_ref.SwapElements(0, 9); EXPECT_EQ(TestAllTypes::BAZ, enum_ref.Get(0)); EXPECT_EQ(TestAllTypes::BAR, enum_ref.Get(9)); mutable_int32_ref.SwapElements(0, 9); EXPECT_EQ(TestAllTypes::BAR, enum_ref.Get(0)); EXPECT_EQ(TestAllTypes::BAZ, enum_ref.Get(9)); // Test Clear() mutable_enum_ref.Clear(); EXPECT_EQ(0, message.repeated_nested_enum_size()); mutable_enum_ref.Add(TestAllTypes::FOO); EXPECT_EQ(1, message.repeated_nested_enum_size()); mutable_int32_ref.Clear(); EXPECT_EQ(0, message.repeated_nested_enum_size()); // Test empty() EXPECT_TRUE(enum_ref.empty()); EXPECT_TRUE(mutable_enum_ref.empty()); EXPECT_TRUE(int32_ref.empty()); EXPECT_TRUE(mutable_int32_ref.empty()); } TEST(RepeatedFieldReflectionTest, RepeatedFieldRefForExtensionFields) { TestAllExtensions extended_message; const Reflection* refl = extended_message.GetReflection(); const Descriptor* desc = extended_message.GetDescriptor(); for (int i = 0; i < 10; ++i) { extended_message.AddExtension( unittest::repeated_int64_extension, Func(i, 1)); } const FieldDescriptor* fd_repeated_int64_extension = desc->file()->FindExtensionByName("repeated_int64_extension"); GOOGLE_CHECK(fd_repeated_int64_extension != NULL); const RepeatedFieldRef rf_int64_extension = refl->GetRepeatedFieldRef(extended_message, fd_repeated_int64_extension); const MutableRepeatedFieldRef mrf_int64_extension = refl->GetMutableRepeatedFieldRef(&extended_message, fd_repeated_int64_extension); for (int i = 0; i < 10; ++i) { EXPECT_EQ(Func(i, 1), rf_int64_extension.Get(i)); mrf_int64_extension.Set(i, Func(i, -1)); EXPECT_EQ(Func(i, -1), extended_message.GetExtension(unittest::repeated_int64_extension, i)); } } TEST(RepeatedFieldReflectionTest, RepeatedFieldRefMergeFromAndSwap) { // Set-up message content. TestAllTypes m0, m1, m2; for (int i = 0; i < 10; ++i) { m0.add_repeated_int32(Func(i, 1)); m0.add_repeated_double(Func(i, 2)); m0.add_repeated_string(StrFunc(i, 5)); m0.add_repeated_foreign_message()->set_c(Func(i, 6)); m0.add_repeated_nested_enum(TestAllTypes::FOO); m1.add_repeated_int32(Func(i, 11)); m1.add_repeated_double(Func(i, 12)); m1.add_repeated_string(StrFunc(i, 15)); m1.add_repeated_foreign_message()->set_c(Func(i, 16)); m1.add_repeated_nested_enum(TestAllTypes::BAR); m2.add_repeated_int32(Func(i, 21)); m2.add_repeated_double(Func(i, 22)); m2.add_repeated_string(StrFunc(i, 25)); m2.add_repeated_foreign_message()->set_c(Func(i, 26)); m2.add_repeated_nested_enum(TestAllTypes::BAZ); } const Reflection* refl = m0.GetReflection(); const Descriptor* desc = m0.GetDescriptor(); // Get FieldDescriptors for all the fields of interest. const FieldDescriptor* fd_repeated_int32 = desc->FindFieldByName("repeated_int32"); const FieldDescriptor* fd_repeated_double = desc->FindFieldByName("repeated_double"); const FieldDescriptor* fd_repeated_string = desc->FindFieldByName("repeated_string"); const FieldDescriptor* fd_repeated_foreign_message = desc->FindFieldByName("repeated_foreign_message"); const FieldDescriptor* fd_repeated_nested_enum = desc->FindFieldByName("repeated_nested_enum"); // Get MutableRepeatedFieldRef objects for all fields of interest. const MutableRepeatedFieldRef mrf_int32 = refl->GetMutableRepeatedFieldRef(&m0, fd_repeated_int32); const MutableRepeatedFieldRef mrf_double = refl->GetMutableRepeatedFieldRef(&m0, fd_repeated_double); const MutableRepeatedFieldRef mrf_string = refl->GetMutableRepeatedFieldRef(&m0, fd_repeated_string); const MutableRepeatedFieldRef mrf_foreign_message = refl->GetMutableRepeatedFieldRef( &m0, fd_repeated_foreign_message); const MutableRepeatedFieldRef mrf_nested_enum = refl->GetMutableRepeatedFieldRef( &m0, fd_repeated_nested_enum); // Test MutableRepeatedRef::CopyFrom mrf_int32.CopyFrom( refl->GetRepeatedFieldRef(m1, fd_repeated_int32)); mrf_double.CopyFrom( refl->GetRepeatedFieldRef(m1, fd_repeated_double)); mrf_string.CopyFrom( refl->GetRepeatedFieldRef(m1, fd_repeated_string)); mrf_foreign_message.CopyFrom( refl->GetRepeatedFieldRef( m1, fd_repeated_foreign_message)); mrf_nested_enum.CopyFrom( refl->GetRepeatedFieldRef( m1, fd_repeated_nested_enum)); for (int i = 0; i < 10; ++i) { EXPECT_EQ(Func(i, 11), m0.repeated_int32(i)); EXPECT_EQ(Func(i, 12), m0.repeated_double(i)); EXPECT_EQ(StrFunc(i, 15), m0.repeated_string(i)); EXPECT_EQ(Func(i, 16), m0.repeated_foreign_message(i).c()); EXPECT_EQ(TestAllTypes::BAR, m0.repeated_nested_enum(i)); } // Test MutableRepeatedRef::MergeFrom mrf_int32.MergeFrom( refl->GetRepeatedFieldRef(m2, fd_repeated_int32)); mrf_double.MergeFrom( refl->GetRepeatedFieldRef(m2, fd_repeated_double)); mrf_string.MergeFrom( refl->GetRepeatedFieldRef(m2, fd_repeated_string)); mrf_foreign_message.MergeFrom( refl->GetRepeatedFieldRef( m2, fd_repeated_foreign_message)); mrf_nested_enum.MergeFrom( refl->GetRepeatedFieldRef( m2, fd_repeated_nested_enum)); for (int i = 0; i < 10; ++i) { EXPECT_EQ(Func(i, 21), m0.repeated_int32(i + 10)); EXPECT_EQ(Func(i, 22), m0.repeated_double(i + 10)); EXPECT_EQ(StrFunc(i, 25), m0.repeated_string(i + 10)); EXPECT_EQ(Func(i, 26), m0.repeated_foreign_message(i + 10).c()); EXPECT_EQ(TestAllTypes::BAZ, m0.repeated_nested_enum(i + 10)); } // Test MutableRepeatedRef::Swap // Swap between m0 and m2. mrf_int32.Swap( refl->GetMutableRepeatedFieldRef(&m2, fd_repeated_int32)); mrf_double.Swap( refl->GetMutableRepeatedFieldRef(&m2, fd_repeated_double)); mrf_string.Swap( refl->GetMutableRepeatedFieldRef(&m2, fd_repeated_string)); mrf_foreign_message.Swap( refl->GetMutableRepeatedFieldRef( &m2, fd_repeated_foreign_message)); mrf_nested_enum.Swap( refl->GetMutableRepeatedFieldRef( &m2, fd_repeated_nested_enum)); for (int i = 0; i < 10; ++i) { // Check the content of m0. EXPECT_EQ(Func(i, 21), m0.repeated_int32(i)); EXPECT_EQ(Func(i, 22), m0.repeated_double(i)); EXPECT_EQ(StrFunc(i, 25), m0.repeated_string(i)); EXPECT_EQ(Func(i, 26), m0.repeated_foreign_message(i).c()); EXPECT_EQ(TestAllTypes::BAZ, m0.repeated_nested_enum(i)); // Check the content of m2. EXPECT_EQ(Func(i, 11), m2.repeated_int32(i)); EXPECT_EQ(Func(i, 12), m2.repeated_double(i)); EXPECT_EQ(StrFunc(i, 15), m2.repeated_string(i)); EXPECT_EQ(Func(i, 16), m2.repeated_foreign_message(i).c()); EXPECT_EQ(TestAllTypes::BAR, m2.repeated_nested_enum(i)); EXPECT_EQ(Func(i, 21), m2.repeated_int32(i + 10)); EXPECT_EQ(Func(i, 22), m2.repeated_double(i + 10)); EXPECT_EQ(StrFunc(i, 25), m2.repeated_string(i + 10)); EXPECT_EQ(Func(i, 26), m2.repeated_foreign_message(i + 10).c()); EXPECT_EQ(TestAllTypes::BAZ, m2.repeated_nested_enum(i + 10)); } } // Test that GetRepeatedFieldRef/MutableRepeatedFieldRef works with // DynamicMessage. TEST(RepeatedFieldReflectionTest, RepeatedFieldRefDynamicMessage) { // DynamicMessage shares the same memory layout as generated message // and use the same GeneratedMessageReflection code for reflection. // All code paths should already be covered by the other tests for // generated messages. Here we just test one field. const Descriptor* desc = TestAllTypes::descriptor(); const FieldDescriptor* fd_repeated_int32 = desc->FindFieldByName("repeated_int32"); DynamicMessageFactory factory; google::protobuf::scoped_ptr dynamic_message(factory.GetPrototype(desc)->New()); const Reflection* refl = dynamic_message->GetReflection(); MutableRepeatedFieldRef rf_int32 = refl->GetMutableRepeatedFieldRef( dynamic_message.get(), fd_repeated_int32); rf_int32.Add(1234); EXPECT_EQ(1, refl->FieldSize(*dynamic_message, fd_repeated_int32)); EXPECT_EQ(1234, refl->GetRepeatedInt32(*dynamic_message, fd_repeated_int32, 0)); } } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/repeated_field_unittest.cc000066400000000000000000001567611334102242000325130ustar00rootroot00000000000000// 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. // // TODO(kenton): Improve this unittest to bring it up to the standards of // other proto2 unittests. #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace { using ::protobuf_unittest::TestAllTypes; using ::testing::ElementsAre; // Test operations on a small RepeatedField. TEST(RepeatedField, Small) { RepeatedField field; EXPECT_TRUE(field.empty()); EXPECT_EQ(field.size(), 0); field.Add(5); EXPECT_FALSE(field.empty()); EXPECT_EQ(field.size(), 1); EXPECT_EQ(field.Get(0), 5); field.Add(42); EXPECT_FALSE(field.empty()); EXPECT_EQ(field.size(), 2); EXPECT_EQ(field.Get(0), 5); EXPECT_EQ(field.Get(1), 42); field.Set(1, 23); EXPECT_FALSE(field.empty()); EXPECT_EQ(field.size(), 2); EXPECT_EQ(field.Get(0), 5); EXPECT_EQ(field.Get(1), 23); field.RemoveLast(); EXPECT_FALSE(field.empty()); EXPECT_EQ(field.size(), 1); EXPECT_EQ(field.Get(0), 5); field.Clear(); EXPECT_TRUE(field.empty()); EXPECT_EQ(field.size(), 0); // Additional bytes are for 'struct Rep' header. int expected_usage = 4 * sizeof(int) + sizeof(Arena*); EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage); } // Test operations on a RepeatedField which is large enough to allocate a // separate array. TEST(RepeatedField, Large) { RepeatedField field; for (int i = 0; i < 16; i++) { field.Add(i * i); } EXPECT_FALSE(field.empty()); EXPECT_EQ(field.size(), 16); for (int i = 0; i < 16; i++) { EXPECT_EQ(field.Get(i), i * i); } int expected_usage = 16 * sizeof(int); EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage); } // Test swapping between various types of RepeatedFields. TEST(RepeatedField, SwapSmallSmall) { RepeatedField field1; RepeatedField field2; field1.Add(5); field1.Add(42); EXPECT_FALSE(field1.empty()); EXPECT_EQ(field1.size(), 2); EXPECT_EQ(field1.Get(0), 5); EXPECT_EQ(field1.Get(1), 42); EXPECT_TRUE(field2.empty()); EXPECT_EQ(field2.size(), 0); field1.Swap(&field2); EXPECT_TRUE(field1.empty()); EXPECT_EQ(field1.size(), 0); EXPECT_FALSE(field2.empty()); EXPECT_EQ(field2.size(), 2); EXPECT_EQ(field2.Get(0), 5); EXPECT_EQ(field2.Get(1), 42); } TEST(RepeatedField, SwapLargeSmall) { RepeatedField field1; RepeatedField field2; for (int i = 0; i < 16; i++) { field1.Add(i * i); } field2.Add(5); field2.Add(42); field1.Swap(&field2); EXPECT_EQ(field1.size(), 2); EXPECT_EQ(field1.Get(0), 5); EXPECT_EQ(field1.Get(1), 42); EXPECT_EQ(field2.size(), 16); for (int i = 0; i < 16; i++) { EXPECT_EQ(field2.Get(i), i * i); } } TEST(RepeatedField, SwapLargeLarge) { RepeatedField field1; RepeatedField field2; field1.Add(5); field1.Add(42); for (int i = 0; i < 16; i++) { field1.Add(i); field2.Add(i * i); } field2.Swap(&field1); EXPECT_EQ(field1.size(), 16); for (int i = 0; i < 16; i++) { EXPECT_EQ(field1.Get(i), i * i); } EXPECT_EQ(field2.size(), 18); EXPECT_EQ(field2.Get(0), 5); EXPECT_EQ(field2.Get(1), 42); for (int i = 2; i < 18; i++) { EXPECT_EQ(field2.Get(i), i - 2); } } // 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* field) { const int* ptr = field->data(); do { field->Add(0); } while (field->data() == ptr); return field->size() - 1; } TEST(RepeatedField, ReserveMoreThanDouble) { // Reserve more than double the previous space in the field and expect the // field to reserve exactly the amount specified. RepeatedField field; field.Reserve(20); EXPECT_LE(20, ReservedSpace(&field)); } TEST(RepeatedField, ReserveLessThanDouble) { // Reserve less than double the previous space in the field and expect the // field to grow by double instead. RepeatedField field; field.Reserve(20); int capacity = field.Capacity(); field.Reserve(capacity * 1.5); EXPECT_LE(2 * capacity, ReservedSpace(&field)); } TEST(RepeatedField, ReserveLessThanExisting) { // Reserve less than the previous space in the field and expect the // field to not re-allocate at all. RepeatedField field; field.Reserve(20); const int* previous_ptr = field.data(); field.Reserve(10); EXPECT_EQ(previous_ptr, field.data()); EXPECT_LE(20, ReservedSpace(&field)); } TEST(RepeatedField, Resize) { RepeatedField field; field.Resize(2, 1); EXPECT_EQ(2, field.size()); field.Resize(5, 2); EXPECT_EQ(5, field.size()); field.Resize(4, 3); ASSERT_EQ(4, field.size()); EXPECT_EQ(1, field.Get(0)); EXPECT_EQ(1, field.Get(1)); EXPECT_EQ(2, field.Get(2)); EXPECT_EQ(2, field.Get(3)); field.Resize(0, 4); EXPECT_TRUE(field.empty()); } TEST(RepeatedField, MergeFrom) { RepeatedField source, destination; source.Add(4); source.Add(5); destination.Add(1); destination.Add(2); destination.Add(3); destination.MergeFrom(source); ASSERT_EQ(5, destination.size()); EXPECT_EQ(1, destination.Get(0)); EXPECT_EQ(2, destination.Get(1)); EXPECT_EQ(3, destination.Get(2)); EXPECT_EQ(4, destination.Get(3)); EXPECT_EQ(5, destination.Get(4)); } TEST(RepeatedField, CopyFrom) { RepeatedField source, destination; source.Add(4); source.Add(5); destination.Add(1); destination.Add(2); destination.Add(3); destination.CopyFrom(source); ASSERT_EQ(2, destination.size()); EXPECT_EQ(4, destination.Get(0)); EXPECT_EQ(5, destination.Get(1)); } TEST(RepeatedField, CopyFromSelf) { RepeatedField me; me.Add(3); me.CopyFrom(me); ASSERT_EQ(1, me.size()); EXPECT_EQ(3, me.Get(0)); } TEST(RepeatedField, Erase) { RepeatedField me; RepeatedField::iterator it = me.erase(me.begin(), me.end()); EXPECT_TRUE(me.begin() == it); EXPECT_EQ(0, me.size()); me.Add(1); me.Add(2); me.Add(3); it = me.erase(me.begin(), me.end()); EXPECT_TRUE(me.begin() == it); EXPECT_EQ(0, me.size()); me.Add(4); me.Add(5); me.Add(6); it = me.erase(me.begin() + 2, me.end()); EXPECT_TRUE(me.begin() + 2 == it); EXPECT_EQ(2, me.size()); EXPECT_EQ(4, me.Get(0)); EXPECT_EQ(5, me.Get(1)); me.Add(6); me.Add(7); me.Add(8); it = me.erase(me.begin() + 1, me.begin() + 3); EXPECT_TRUE(me.begin() + 1 == it); EXPECT_EQ(3, me.size()); EXPECT_EQ(4, me.Get(0)); EXPECT_EQ(7, me.Get(1)); EXPECT_EQ(8, me.Get(2)); } TEST(RepeatedField, CopyConstruct) { RepeatedField source; source.Add(1); source.Add(2); RepeatedField destination(source); ASSERT_EQ(2, destination.size()); EXPECT_EQ(1, destination.Get(0)); EXPECT_EQ(2, destination.Get(1)); } TEST(RepeatedField, IteratorConstruct) { std::vector values; values.push_back(1); values.push_back(2); RepeatedField field(values.begin(), values.end()); ASSERT_EQ(values.size(), field.size()); EXPECT_EQ(values[0], field.Get(0)); EXPECT_EQ(values[1], field.Get(1)); RepeatedField other(field.begin(), field.end()); ASSERT_EQ(values.size(), other.size()); EXPECT_EQ(values[0], other.Get(0)); EXPECT_EQ(values[1], other.Get(1)); } TEST(RepeatedField, CopyAssign) { RepeatedField source, destination; source.Add(4); source.Add(5); destination.Add(1); destination.Add(2); destination.Add(3); destination = source; ASSERT_EQ(2, destination.size()); EXPECT_EQ(4, destination.Get(0)); EXPECT_EQ(5, destination.Get(1)); } TEST(RepeatedField, SelfAssign) { // Verify that assignment to self does not destroy data. RepeatedField source, *p; p = &source; source.Add(7); source.Add(8); *p = source; ASSERT_EQ(2, source.size()); EXPECT_EQ(7, source.Get(0)); EXPECT_EQ(8, source.Get(1)); } #if LANG_CXX11 TEST(RepeatedField, MoveConstruct) { { RepeatedField source; source.Add(1); source.Add(2); const int* data = source.data(); RepeatedField destination = std::move(source); EXPECT_EQ(data, destination.data()); EXPECT_THAT(destination, ElementsAre(1, 2)); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_TRUE(source.empty()); } { Arena arena; RepeatedField* source = Arena::CreateMessage>(&arena); source->Add(1); source->Add(2); RepeatedField destination = std::move(*source); EXPECT_EQ(NULL, destination.GetArena()); EXPECT_THAT(destination, ElementsAre(1, 2)); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_THAT(*source, ElementsAre(1, 2)); } } TEST(RepeatedField, MoveAssign) { { RepeatedField source; source.Add(1); source.Add(2); RepeatedField destination; destination.Add(3); const int* source_data = source.data(); const int* destination_data = destination.data(); destination = std::move(source); EXPECT_EQ(source_data, destination.data()); EXPECT_THAT(destination, ElementsAre(1, 2)); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_EQ(destination_data, source.data()); EXPECT_THAT(source, ElementsAre(3)); } { Arena arena; RepeatedField* source = Arena::CreateMessage>(&arena); source->Add(1); source->Add(2); RepeatedField* destination = Arena::CreateMessage>(&arena); destination->Add(3); const int* source_data = source->data(); const int* destination_data = destination->data(); *destination = std::move(*source); EXPECT_EQ(source_data, destination->data()); EXPECT_THAT(*destination, ElementsAre(1, 2)); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_EQ(destination_data, source->data()); EXPECT_THAT(*source, ElementsAre(3)); } { Arena source_arena; RepeatedField* source = Arena::CreateMessage>(&source_arena); source->Add(1); source->Add(2); Arena destination_arena; RepeatedField* destination = Arena::CreateMessage>(&destination_arena); destination->Add(3); *destination = std::move(*source); EXPECT_THAT(*destination, ElementsAre(1, 2)); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_THAT(*source, ElementsAre(1, 2)); } { Arena arena; RepeatedField* source = Arena::CreateMessage>(&arena); source->Add(1); source->Add(2); RepeatedField destination; destination.Add(3); destination = std::move(*source); EXPECT_THAT(destination, ElementsAre(1, 2)); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_THAT(*source, ElementsAre(1, 2)); } { RepeatedField source; source.Add(1); source.Add(2); Arena arena; RepeatedField* destination = Arena::CreateMessage>(&arena); destination->Add(3); *destination = std::move(source); EXPECT_THAT(*destination, ElementsAre(1, 2)); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_THAT(source, ElementsAre(1, 2)); } { RepeatedField field; // An alias to defeat -Wself-move. RepeatedField& alias = field; field.Add(1); field.Add(2); const int* data = field.data(); field = std::move(alias); EXPECT_EQ(data, field.data()); EXPECT_THAT(field, ElementsAre(1, 2)); } { Arena arena; RepeatedField* field = Arena::CreateMessage>(&arena); field->Add(1); field->Add(2); const int* data = field->data(); *field = std::move(*field); EXPECT_EQ(data, field->data()); EXPECT_THAT(*field, ElementsAre(1, 2)); } } #endif // LANG_CXX11 TEST(RepeatedField, MutableDataIsMutable) { RepeatedField field; field.Add(1); EXPECT_EQ(1, field.Get(0)); // The fact that this line compiles would be enough, but we'll check the // value anyway. *field.mutable_data() = 2; EXPECT_EQ(2, field.Get(0)); } TEST(RepeatedField, SubscriptOperators) { RepeatedField field; field.Add(1); EXPECT_EQ(1, field.Get(0)); EXPECT_EQ(1, field[0]); EXPECT_EQ(field.Mutable(0), &field[0]); const RepeatedField& const_field = field; EXPECT_EQ(field.data(), &const_field[0]); } TEST(RepeatedField, Truncate) { RepeatedField field; field.Add(12); field.Add(34); field.Add(56); field.Add(78); EXPECT_EQ(4, field.size()); field.Truncate(3); EXPECT_EQ(3, field.size()); field.Add(90); EXPECT_EQ(4, field.size()); EXPECT_EQ(90, field.Get(3)); // Truncations that don't change the size are allowed, but growing is not // allowed. field.Truncate(field.size()); #ifdef PROTOBUF_HAS_DEATH_TEST EXPECT_DEBUG_DEATH(field.Truncate(field.size() + 1), "new_size"); #endif } TEST(RepeatedField, ExtractSubrange) { // Exhaustively test every subrange in arrays of all sizes from 0 through 9. for (int sz = 0; sz < 10; ++sz) { for (int num = 0; num <= sz; ++num) { for (int start = 0; start < sz - num; ++start) { // Create RepeatedField with sz elements having values 0 through sz-1. RepeatedField field; for (int i = 0; i < sz; ++i) field.Add(i); EXPECT_EQ(field.size(), sz); // Create a catcher array and call ExtractSubrange. int32 catcher[10]; for (int i = 0; i < 10; ++i) catcher[i] = -1; field.ExtractSubrange(start, num, catcher); // Does the resulting array have the right size? EXPECT_EQ(field.size(), sz - num); // Were the removed elements extracted into the catcher array? for (int i = 0; i < num; ++i) EXPECT_EQ(catcher[i], start + i); EXPECT_EQ(catcher[num], -1); // Does the resulting array contain the right values? for (int i = 0; i < start; ++i) EXPECT_EQ(field.Get(i), i); for (int i = start; i < field.size(); ++i) EXPECT_EQ(field.Get(i), i + num); } } } } TEST(RepeatedField, ClearThenReserveMore) { // Test that Reserve properly destroys the old internal array when it's forced // to allocate a new one, even when cleared-but-not-deleted objects are // present. Use a 'string' and > 16 bytes length so that the elements are // non-POD and allocate -- the leak checker will catch any skipped destructor // calls here. RepeatedField field; for (int i = 0; i < 32; i++) { field.Add(string("abcdefghijklmnopqrstuvwxyz0123456789")); } EXPECT_EQ(32, field.size()); field.Clear(); EXPECT_EQ(0, field.size()); EXPECT_LE(32, field.Capacity()); field.Reserve(1024); EXPECT_EQ(0, field.size()); EXPECT_LE(1024, field.Capacity()); // Finish test -- |field| should destroy the cleared-but-not-yet-destroyed // strings. } // =================================================================== // RepeatedPtrField tests. These pretty much just mirror the RepeatedField // tests above. TEST(RepeatedPtrField, Small) { RepeatedPtrField field; EXPECT_TRUE(field.empty()); EXPECT_EQ(field.size(), 0); field.Add()->assign("foo"); EXPECT_FALSE(field.empty()); EXPECT_EQ(field.size(), 1); EXPECT_EQ(field.Get(0), "foo"); field.Add()->assign("bar"); EXPECT_FALSE(field.empty()); EXPECT_EQ(field.size(), 2); EXPECT_EQ(field.Get(0), "foo"); EXPECT_EQ(field.Get(1), "bar"); field.Mutable(1)->assign("baz"); EXPECT_FALSE(field.empty()); EXPECT_EQ(field.size(), 2); EXPECT_EQ(field.Get(0), "foo"); EXPECT_EQ(field.Get(1), "baz"); field.RemoveLast(); EXPECT_FALSE(field.empty()); EXPECT_EQ(field.size(), 1); EXPECT_EQ(field.Get(0), "foo"); field.Clear(); EXPECT_TRUE(field.empty()); EXPECT_EQ(field.size(), 0); } TEST(RepeatedPtrField, Large) { RepeatedPtrField field; for (int i = 0; i < 16; i++) { *field.Add() += 'a' + i; } EXPECT_EQ(field.size(), 16); for (int i = 0; i < 16; i++) { EXPECT_EQ(field.Get(i).size(), 1); EXPECT_EQ(field.Get(i)[0], 'a' + i); } int min_expected_usage = 16 * sizeof(string); EXPECT_GE(field.SpaceUsedExcludingSelf(), min_expected_usage); } TEST(RepeatedPtrField, SwapSmallSmall) { RepeatedPtrField field1; RepeatedPtrField field2; EXPECT_TRUE(field1.empty()); EXPECT_EQ(field1.size(), 0); EXPECT_TRUE(field2.empty()); EXPECT_EQ(field2.size(), 0); field1.Add()->assign("foo"); field1.Add()->assign("bar"); EXPECT_FALSE(field1.empty()); EXPECT_EQ(field1.size(), 2); EXPECT_EQ(field1.Get(0), "foo"); EXPECT_EQ(field1.Get(1), "bar"); EXPECT_TRUE(field2.empty()); EXPECT_EQ(field2.size(), 0); field1.Swap(&field2); EXPECT_TRUE(field1.empty()); EXPECT_EQ(field1.size(), 0); EXPECT_EQ(field2.size(), 2); EXPECT_EQ(field2.Get(0), "foo"); EXPECT_EQ(field2.Get(1), "bar"); } TEST(RepeatedPtrField, SwapLargeSmall) { RepeatedPtrField field1; RepeatedPtrField field2; field2.Add()->assign("foo"); field2.Add()->assign("bar"); for (int i = 0; i < 16; i++) { *field1.Add() += 'a' + i; } field1.Swap(&field2); EXPECT_EQ(field1.size(), 2); EXPECT_EQ(field1.Get(0), "foo"); EXPECT_EQ(field1.Get(1), "bar"); EXPECT_EQ(field2.size(), 16); for (int i = 0; i < 16; i++) { EXPECT_EQ(field2.Get(i).size(), 1); EXPECT_EQ(field2.Get(i)[0], 'a' + i); } } TEST(RepeatedPtrField, SwapLargeLarge) { RepeatedPtrField field1; RepeatedPtrField field2; field1.Add()->assign("foo"); field1.Add()->assign("bar"); for (int i = 0; i < 16; i++) { *field1.Add() += 'A' + i; *field2.Add() += 'a' + i; } field2.Swap(&field1); EXPECT_EQ(field1.size(), 16); for (int i = 0; i < 16; i++) { EXPECT_EQ(field1.Get(i).size(), 1); EXPECT_EQ(field1.Get(i)[0], 'a' + i); } EXPECT_EQ(field2.size(), 18); EXPECT_EQ(field2.Get(0), "foo"); EXPECT_EQ(field2.Get(1), "bar"); for (int i = 2; i < 18; i++) { EXPECT_EQ(field2.Get(i).size(), 1); EXPECT_EQ(field2.Get(i)[0], 'A' + i - 2); } } static int ReservedSpace(RepeatedPtrField* field) { const string* const* ptr = field->data(); do { field->Add(); } while (field->data() == ptr); return field->size() - 1; } TEST(RepeatedPtrField, ReserveMoreThanDouble) { RepeatedPtrField field; field.Reserve(20); EXPECT_LE(20, ReservedSpace(&field)); } TEST(RepeatedPtrField, ReserveLessThanDouble) { RepeatedPtrField field; field.Reserve(20); int capacity = field.Capacity(); // Grow by 1.5x field.Reserve(capacity + (capacity >> 2)); EXPECT_LE(2 * capacity, ReservedSpace(&field)); } TEST(RepeatedPtrField, ReserveLessThanExisting) { RepeatedPtrField field; field.Reserve(20); const string* const* previous_ptr = field.data(); field.Reserve(10); EXPECT_EQ(previous_ptr, field.data()); EXPECT_LE(20, ReservedSpace(&field)); } TEST(RepeatedPtrField, ReserveDoesntLoseAllocated) { // Check that a bug is fixed: An earlier implementation of Reserve() // failed to copy pointers to allocated-but-cleared objects, possibly // leading to segfaults. RepeatedPtrField field; string* first = field.Add(); field.RemoveLast(); field.Reserve(20); EXPECT_EQ(first, field.Add()); } // Clearing elements is tricky with RepeatedPtrFields since the memory for // the elements is retained and reused. TEST(RepeatedPtrField, ClearedElements) { RepeatedPtrField field; string* original = field.Add(); *original = "foo"; EXPECT_EQ(field.ClearedCount(), 0); field.RemoveLast(); EXPECT_TRUE(original->empty()); EXPECT_EQ(field.ClearedCount(), 1); EXPECT_EQ(field.Add(), original); // Should return same string for reuse. EXPECT_EQ(field.ReleaseLast(), original); // We take ownership. EXPECT_EQ(field.ClearedCount(), 0); EXPECT_NE(field.Add(), original); // Should NOT return the same string. EXPECT_EQ(field.ClearedCount(), 0); field.AddAllocated(original); // Give ownership back. EXPECT_EQ(field.ClearedCount(), 0); EXPECT_EQ(field.Mutable(1), original); field.Clear(); EXPECT_EQ(field.ClearedCount(), 2); EXPECT_EQ(field.ReleaseCleared(), original); // Take ownership again. EXPECT_EQ(field.ClearedCount(), 1); EXPECT_NE(field.Add(), original); EXPECT_EQ(field.ClearedCount(), 0); EXPECT_NE(field.Add(), original); EXPECT_EQ(field.ClearedCount(), 0); field.AddCleared(original); // Give ownership back, but as a cleared object. EXPECT_EQ(field.ClearedCount(), 1); EXPECT_EQ(field.Add(), original); EXPECT_EQ(field.ClearedCount(), 0); } // Test all code paths in AddAllocated(). TEST(RepeatedPtrField, AddAlocated) { RepeatedPtrField field; while (field.size() < field.Capacity()) { field.Add()->assign("filler"); } int index = field.size(); // First branch: Field is at capacity with no cleared objects. string* foo = new string("foo"); field.AddAllocated(foo); EXPECT_EQ(index + 1, field.size()); EXPECT_EQ(0, field.ClearedCount()); EXPECT_EQ(foo, &field.Get(index)); // Last branch: Field is not at capacity and there are no cleared objects. string* bar = new string("bar"); field.AddAllocated(bar); ++index; EXPECT_EQ(index + 1, field.size()); EXPECT_EQ(0, field.ClearedCount()); EXPECT_EQ(bar, &field.Get(index)); // Third branch: Field is not at capacity and there are no cleared objects. field.RemoveLast(); string* baz = new string("baz"); field.AddAllocated(baz); EXPECT_EQ(index + 1, field.size()); EXPECT_EQ(1, field.ClearedCount()); EXPECT_EQ(baz, &field.Get(index)); // Second branch: Field is at capacity but has some cleared objects. while (field.size() < field.Capacity()) { field.Add()->assign("filler2"); } field.RemoveLast(); index = field.size(); string* qux = new string("qux"); field.AddAllocated(qux); EXPECT_EQ(index + 1, field.size()); // We should have discarded the cleared object. EXPECT_EQ(0, field.ClearedCount()); EXPECT_EQ(qux, &field.Get(index)); } TEST(RepeatedPtrField, MergeFrom) { RepeatedPtrField source, destination; source.Add()->assign("4"); source.Add()->assign("5"); destination.Add()->assign("1"); destination.Add()->assign("2"); destination.Add()->assign("3"); destination.MergeFrom(source); ASSERT_EQ(5, destination.size()); EXPECT_EQ("1", destination.Get(0)); EXPECT_EQ("2", destination.Get(1)); EXPECT_EQ("3", destination.Get(2)); EXPECT_EQ("4", destination.Get(3)); EXPECT_EQ("5", destination.Get(4)); } TEST(RepeatedPtrField, CopyFrom) { RepeatedPtrField source, destination; source.Add()->assign("4"); source.Add()->assign("5"); destination.Add()->assign("1"); destination.Add()->assign("2"); destination.Add()->assign("3"); destination.CopyFrom(source); ASSERT_EQ(2, destination.size()); EXPECT_EQ("4", destination.Get(0)); EXPECT_EQ("5", destination.Get(1)); } TEST(RepeatedPtrField, CopyFromSelf) { RepeatedPtrField me; me.Add()->assign("1"); me.CopyFrom(me); ASSERT_EQ(1, me.size()); EXPECT_EQ("1", me.Get(0)); } TEST(RepeatedPtrField, Erase) { RepeatedPtrField me; RepeatedPtrField::iterator it = me.erase(me.begin(), me.end()); EXPECT_TRUE(me.begin() == it); EXPECT_EQ(0, me.size()); *me.Add() = "1"; *me.Add() = "2"; *me.Add() = "3"; it = me.erase(me.begin(), me.end()); EXPECT_TRUE(me.begin() == it); EXPECT_EQ(0, me.size()); *me.Add() = "4"; *me.Add() = "5"; *me.Add() = "6"; it = me.erase(me.begin() + 2, me.end()); EXPECT_TRUE(me.begin() + 2 == it); EXPECT_EQ(2, me.size()); EXPECT_EQ("4", me.Get(0)); EXPECT_EQ("5", me.Get(1)); *me.Add() = "6"; *me.Add() = "7"; *me.Add() = "8"; it = me.erase(me.begin() + 1, me.begin() + 3); EXPECT_TRUE(me.begin() + 1 == it); EXPECT_EQ(3, me.size()); EXPECT_EQ("4", me.Get(0)); EXPECT_EQ("7", me.Get(1)); EXPECT_EQ("8", me.Get(2)); } TEST(RepeatedPtrField, CopyConstruct) { RepeatedPtrField source; source.Add()->assign("1"); source.Add()->assign("2"); RepeatedPtrField destination(source); ASSERT_EQ(2, destination.size()); EXPECT_EQ("1", destination.Get(0)); EXPECT_EQ("2", destination.Get(1)); } TEST(RepeatedPtrField, IteratorConstruct_String) { std::vector values; values.push_back("1"); values.push_back("2"); RepeatedPtrField field(values.begin(), values.end()); ASSERT_EQ(values.size(), field.size()); EXPECT_EQ(values[0], field.Get(0)); EXPECT_EQ(values[1], field.Get(1)); RepeatedPtrField other(field.begin(), field.end()); ASSERT_EQ(values.size(), other.size()); EXPECT_EQ(values[0], other.Get(0)); EXPECT_EQ(values[1], other.Get(1)); } TEST(RepeatedPtrField, IteratorConstruct_Proto) { typedef TestAllTypes::NestedMessage Nested; std::vector values; values.push_back(Nested()); values.back().set_bb(1); values.push_back(Nested()); values.back().set_bb(2); RepeatedPtrField field(values.begin(), values.end()); ASSERT_EQ(values.size(), field.size()); EXPECT_EQ(values[0].bb(), field.Get(0).bb()); EXPECT_EQ(values[1].bb(), field.Get(1).bb()); RepeatedPtrField other(field.begin(), field.end()); ASSERT_EQ(values.size(), other.size()); EXPECT_EQ(values[0].bb(), other.Get(0).bb()); EXPECT_EQ(values[1].bb(), other.Get(1).bb()); } TEST(RepeatedPtrField, CopyAssign) { RepeatedPtrField source, destination; source.Add()->assign("4"); source.Add()->assign("5"); destination.Add()->assign("1"); destination.Add()->assign("2"); destination.Add()->assign("3"); destination = source; ASSERT_EQ(2, destination.size()); EXPECT_EQ("4", destination.Get(0)); EXPECT_EQ("5", destination.Get(1)); } TEST(RepeatedPtrField, SelfAssign) { // Verify that assignment to self does not destroy data. RepeatedPtrField source, *p; p = &source; source.Add()->assign("7"); source.Add()->assign("8"); *p = source; ASSERT_EQ(2, source.size()); EXPECT_EQ("7", source.Get(0)); EXPECT_EQ("8", source.Get(1)); } #if LANG_CXX11 TEST(RepeatedPtrField, MoveConstruct) { { RepeatedPtrField source; *source.Add() = "1"; *source.Add() = "2"; const string* const* data = source.data(); RepeatedPtrField destination = std::move(source); EXPECT_EQ(data, destination.data()); EXPECT_THAT(destination, ElementsAre("1", "2")); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_TRUE(source.empty()); } { Arena arena; RepeatedPtrField* source = Arena::CreateMessage>(&arena); *source->Add() = "1"; *source->Add() = "2"; RepeatedPtrField destination = std::move(*source); EXPECT_EQ(NULL, destination.GetArena()); EXPECT_THAT(destination, ElementsAre("1", "2")); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_THAT(*source, ElementsAre("1", "2")); } } TEST(RepeatedPtrField, MoveAssign) { { RepeatedPtrField source; *source.Add() = "1"; *source.Add() = "2"; RepeatedPtrField destination; *destination.Add() = "3"; const string* const* source_data = source.data(); const string* const* destination_data = destination.data(); destination = std::move(source); EXPECT_EQ(source_data, destination.data()); EXPECT_THAT(destination, ElementsAre("1", "2")); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_EQ(destination_data, source.data()); EXPECT_THAT(source, ElementsAre("3")); } { Arena arena; RepeatedPtrField* source = Arena::CreateMessage>(&arena); *source->Add() = "1"; *source->Add() = "2"; RepeatedPtrField* destination = Arena::CreateMessage>(&arena); *destination->Add() = "3"; const string* const* source_data = source->data(); const string* const* destination_data = destination->data(); *destination = std::move(*source); EXPECT_EQ(source_data, destination->data()); EXPECT_THAT(*destination, ElementsAre("1", "2")); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_EQ(destination_data, source->data()); EXPECT_THAT(*source, ElementsAre("3")); } { Arena source_arena; RepeatedPtrField* source = Arena::CreateMessage>(&source_arena); *source->Add() = "1"; *source->Add() = "2"; Arena destination_arena; RepeatedPtrField* destination = Arena::CreateMessage>(&destination_arena); *destination->Add() = "3"; *destination = std::move(*source); EXPECT_THAT(*destination, ElementsAre("1", "2")); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_THAT(*source, ElementsAre("1", "2")); } { Arena arena; RepeatedPtrField* source = Arena::CreateMessage>(&arena); *source->Add() = "1"; *source->Add() = "2"; RepeatedPtrField destination; *destination.Add() = "3"; destination = std::move(*source); EXPECT_THAT(destination, ElementsAre("1", "2")); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_THAT(*source, ElementsAre("1", "2")); } { RepeatedPtrField source; *source.Add() = "1"; *source.Add() = "2"; Arena arena; RepeatedPtrField* destination = Arena::CreateMessage>(&arena); *destination->Add() = "3"; *destination = std::move(source); EXPECT_THAT(*destination, ElementsAre("1", "2")); // This property isn't guaranteed but it's useful to have a test that would // catch changes in this area. EXPECT_THAT(source, ElementsAre("1", "2")); } { RepeatedPtrField field; // An alias to defeat -Wself-move. RepeatedPtrField& alias = field; *field.Add() = "1"; *field.Add() = "2"; const string* const* data = field.data(); field = std::move(alias); EXPECT_EQ(data, field.data()); EXPECT_THAT(field, ElementsAre("1", "2")); } { Arena arena; RepeatedPtrField* field = Arena::CreateMessage>(&arena); *field->Add() = "1"; *field->Add() = "2"; const string* const* data = field->data(); *field = std::move(*field); EXPECT_EQ(data, field->data()); EXPECT_THAT(*field, ElementsAre("1", "2")); } } #endif // LANG_CXX11 TEST(RepeatedPtrField, MutableDataIsMutable) { RepeatedPtrField field; *field.Add() = "1"; EXPECT_EQ("1", field.Get(0)); // The fact that this line compiles would be enough, but we'll check the // value anyway. string** data = field.mutable_data(); **data = "2"; EXPECT_EQ("2", field.Get(0)); } TEST(RepeatedPtrField, SubscriptOperators) { RepeatedPtrField field; *field.Add() = "1"; EXPECT_EQ("1", field.Get(0)); EXPECT_EQ("1", field[0]); EXPECT_EQ(field.Mutable(0), &field[0]); const RepeatedPtrField& const_field = field; EXPECT_EQ(*field.data(), &const_field[0]); } TEST(RepeatedPtrField, ExtractSubrange) { // Exhaustively test every subrange in arrays of all sizes from 0 through 9 // with 0 through 3 cleared elements at the end. for (int sz = 0; sz < 10; ++sz) { for (int num = 0; num <= sz; ++num) { for (int start = 0; start < sz - num; ++start) { for (int extra = 0; extra < 4; ++extra) { std::vector subject; // Create an array with "sz" elements and "extra" cleared elements. RepeatedPtrField field; for (int i = 0; i < sz + extra; ++i) { subject.push_back(new string()); field.AddAllocated(subject[i]); } EXPECT_EQ(field.size(), sz + extra); for (int i = 0; i < extra; ++i) field.RemoveLast(); EXPECT_EQ(field.size(), sz); EXPECT_EQ(field.ClearedCount(), extra); // Create a catcher array and call ExtractSubrange. string* catcher[10]; for (int i = 0; i < 10; ++i) catcher[i] = NULL; field.ExtractSubrange(start, num, catcher); // Does the resulting array have the right size? EXPECT_EQ(field.size(), sz - num); // Were the removed elements extracted into the catcher array? for (int i = 0; i < num; ++i) EXPECT_EQ(catcher[i], subject[start + i]); EXPECT_EQ(NULL, catcher[num]); // Does the resulting array contain the right values? for (int i = 0; i < start; ++i) EXPECT_EQ(field.Mutable(i), subject[i]); for (int i = start; i < field.size(); ++i) EXPECT_EQ(field.Mutable(i), subject[i + num]); // Reinstate the cleared elements. EXPECT_EQ(field.ClearedCount(), extra); for (int i = 0; i < extra; ++i) field.Add(); EXPECT_EQ(field.ClearedCount(), 0); EXPECT_EQ(field.size(), sz - num + extra); // Make sure the extra elements are all there (in some order). for (int i = sz; i < sz + extra; ++i) { int count = 0; for (int j = sz; j < sz + extra; ++j) { if (field.Mutable(j - num) == subject[i]) count += 1; } EXPECT_EQ(count, 1); } // Release the caught elements. for (int i = 0; i < num; ++i) delete catcher[i]; } } } } } TEST(RepeatedPtrField, DeleteSubrange) { // DeleteSubrange is a trivial extension of ExtendSubrange. } // =================================================================== // Iterator tests stolen from net/proto/proto-array_unittest. class RepeatedFieldIteratorTest : public testing::Test { protected: virtual void SetUp() { for (int i = 0; i < 3; ++i) { proto_array_.Add(i); } } RepeatedField proto_array_; }; TEST_F(RepeatedFieldIteratorTest, Convertible) { RepeatedField::iterator iter = proto_array_.begin(); RepeatedField::const_iterator c_iter = iter; RepeatedField::value_type value = *c_iter; EXPECT_EQ(0, value); } TEST_F(RepeatedFieldIteratorTest, MutableIteration) { RepeatedField::iterator iter = proto_array_.begin(); EXPECT_EQ(0, *iter); ++iter; EXPECT_EQ(1, *iter++); EXPECT_EQ(2, *iter); ++iter; EXPECT_TRUE(proto_array_.end() == iter); EXPECT_EQ(2, *(proto_array_.end() - 1)); } TEST_F(RepeatedFieldIteratorTest, ConstIteration) { const RepeatedField& const_proto_array = proto_array_; RepeatedField::const_iterator iter = const_proto_array.begin(); EXPECT_EQ(0, *iter); ++iter; EXPECT_EQ(1, *iter++); EXPECT_EQ(2, *iter); ++iter; EXPECT_TRUE(proto_array_.end() == iter); EXPECT_EQ(2, *(proto_array_.end() - 1)); } TEST_F(RepeatedFieldIteratorTest, Mutation) { RepeatedField::iterator iter = proto_array_.begin(); *iter = 7; EXPECT_EQ(7, proto_array_.Get(0)); } // ------------------------------------------------------------------- class RepeatedPtrFieldIteratorTest : public testing::Test { protected: virtual void SetUp() { proto_array_.Add()->assign("foo"); proto_array_.Add()->assign("bar"); proto_array_.Add()->assign("baz"); } RepeatedPtrField proto_array_; }; TEST_F(RepeatedPtrFieldIteratorTest, Convertible) { RepeatedPtrField::iterator iter = proto_array_.begin(); RepeatedPtrField::const_iterator c_iter = iter; RepeatedPtrField::value_type value = *c_iter; EXPECT_EQ("foo", value); } TEST_F(RepeatedPtrFieldIteratorTest, MutableIteration) { RepeatedPtrField::iterator iter = proto_array_.begin(); EXPECT_EQ("foo", *iter); ++iter; EXPECT_EQ("bar", *(iter++)); EXPECT_EQ("baz", *iter); ++iter; EXPECT_TRUE(proto_array_.end() == iter); EXPECT_EQ("baz", *(--proto_array_.end())); } TEST_F(RepeatedPtrFieldIteratorTest, ConstIteration) { const RepeatedPtrField& const_proto_array = proto_array_; RepeatedPtrField::const_iterator iter = const_proto_array.begin(); EXPECT_EQ("foo", *iter); ++iter; EXPECT_EQ("bar", *(iter++)); EXPECT_EQ("baz", *iter); ++iter; EXPECT_TRUE(const_proto_array.end() == iter); EXPECT_EQ("baz", *(--const_proto_array.end())); } TEST_F(RepeatedPtrFieldIteratorTest, MutableReverseIteration) { RepeatedPtrField::reverse_iterator iter = proto_array_.rbegin(); EXPECT_EQ("baz", *iter); ++iter; EXPECT_EQ("bar", *(iter++)); EXPECT_EQ("foo", *iter); ++iter; EXPECT_TRUE(proto_array_.rend() == iter); EXPECT_EQ("foo", *(--proto_array_.rend())); } TEST_F(RepeatedPtrFieldIteratorTest, ConstReverseIteration) { const RepeatedPtrField& const_proto_array = proto_array_; RepeatedPtrField::const_reverse_iterator iter = const_proto_array.rbegin(); EXPECT_EQ("baz", *iter); ++iter; EXPECT_EQ("bar", *(iter++)); EXPECT_EQ("foo", *iter); ++iter; EXPECT_TRUE(const_proto_array.rend() == iter); EXPECT_EQ("foo", *(--const_proto_array.rend())); } TEST_F(RepeatedPtrFieldIteratorTest, RandomAccess) { RepeatedPtrField::iterator iter = proto_array_.begin(); RepeatedPtrField::iterator iter2 = iter; ++iter2; ++iter2; EXPECT_TRUE(iter + 2 == iter2); EXPECT_TRUE(iter == iter2 - 2); EXPECT_EQ("baz", iter[2]); EXPECT_EQ("baz", *(iter + 2)); EXPECT_EQ(3, proto_array_.end() - proto_array_.begin()); } TEST_F(RepeatedPtrFieldIteratorTest, Comparable) { RepeatedPtrField::const_iterator iter = proto_array_.begin(); RepeatedPtrField::const_iterator iter2 = iter + 1; EXPECT_TRUE(iter == iter); EXPECT_TRUE(iter != iter2); EXPECT_TRUE(iter < iter2); EXPECT_TRUE(iter <= iter2); EXPECT_TRUE(iter <= iter); EXPECT_TRUE(iter2 > iter); EXPECT_TRUE(iter2 >= iter); EXPECT_TRUE(iter >= iter); } // Uninitialized iterator does not point to any of the RepeatedPtrField. TEST_F(RepeatedPtrFieldIteratorTest, UninitializedIterator) { RepeatedPtrField::iterator iter; EXPECT_TRUE(iter != proto_array_.begin()); EXPECT_TRUE(iter != proto_array_.begin() + 1); EXPECT_TRUE(iter != proto_array_.begin() + 2); EXPECT_TRUE(iter != proto_array_.begin() + 3); EXPECT_TRUE(iter != proto_array_.end()); } TEST_F(RepeatedPtrFieldIteratorTest, STLAlgorithms_lower_bound) { proto_array_.Clear(); proto_array_.Add()->assign("a"); proto_array_.Add()->assign("c"); proto_array_.Add()->assign("d"); proto_array_.Add()->assign("n"); proto_array_.Add()->assign("p"); proto_array_.Add()->assign("x"); proto_array_.Add()->assign("y"); string v = "f"; RepeatedPtrField::const_iterator it = std::lower_bound(proto_array_.begin(), proto_array_.end(), v); EXPECT_EQ(*it, "n"); EXPECT_TRUE(it == proto_array_.begin() + 3); } TEST_F(RepeatedPtrFieldIteratorTest, Mutation) { RepeatedPtrField::iterator iter = proto_array_.begin(); *iter = "qux"; EXPECT_EQ("qux", proto_array_.Get(0)); } // ------------------------------------------------------------------- class RepeatedPtrFieldPtrsIteratorTest : public testing::Test { protected: virtual void SetUp() { proto_array_.Add()->assign("foo"); proto_array_.Add()->assign("bar"); proto_array_.Add()->assign("baz"); const_proto_array_ = &proto_array_; } RepeatedPtrField proto_array_; const RepeatedPtrField* const_proto_array_; }; TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertiblePtr) { RepeatedPtrField::pointer_iterator iter = proto_array_.pointer_begin(); static_cast(iter); } TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertibleConstPtr) { RepeatedPtrField::const_pointer_iterator iter = const_proto_array_->pointer_begin(); static_cast(iter); } TEST_F(RepeatedPtrFieldPtrsIteratorTest, MutablePtrIteration) { RepeatedPtrField::pointer_iterator iter = proto_array_.pointer_begin(); EXPECT_EQ("foo", **iter); ++iter; EXPECT_EQ("bar", **(iter++)); EXPECT_EQ("baz", **iter); ++iter; EXPECT_TRUE(proto_array_.pointer_end() == iter); EXPECT_EQ("baz", **(--proto_array_.pointer_end())); } TEST_F(RepeatedPtrFieldPtrsIteratorTest, MutableConstPtrIteration) { RepeatedPtrField::const_pointer_iterator iter = const_proto_array_->pointer_begin(); EXPECT_EQ("foo", **iter); ++iter; EXPECT_EQ("bar", **(iter++)); EXPECT_EQ("baz", **iter); ++iter; EXPECT_TRUE(const_proto_array_->pointer_end() == iter); EXPECT_EQ("baz", **(--const_proto_array_->pointer_end())); } TEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomPtrAccess) { RepeatedPtrField::pointer_iterator iter = proto_array_.pointer_begin(); RepeatedPtrField::pointer_iterator iter2 = iter; ++iter2; ++iter2; EXPECT_TRUE(iter + 2 == iter2); EXPECT_TRUE(iter == iter2 - 2); EXPECT_EQ("baz", *iter[2]); EXPECT_EQ("baz", **(iter + 2)); EXPECT_EQ(3, proto_array_.end() - proto_array_.begin()); } TEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomConstPtrAccess) { RepeatedPtrField::const_pointer_iterator iter = const_proto_array_->pointer_begin(); RepeatedPtrField::const_pointer_iterator iter2 = iter; ++iter2; ++iter2; EXPECT_TRUE(iter + 2 == iter2); EXPECT_TRUE(iter == iter2 - 2); EXPECT_EQ("baz", *iter[2]); EXPECT_EQ("baz", **(iter + 2)); EXPECT_EQ(3, const_proto_array_->end() - const_proto_array_->begin()); } TEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparablePtr) { RepeatedPtrField::pointer_iterator iter = proto_array_.pointer_begin(); RepeatedPtrField::pointer_iterator iter2 = iter + 1; EXPECT_TRUE(iter == iter); EXPECT_TRUE(iter != iter2); EXPECT_TRUE(iter < iter2); EXPECT_TRUE(iter <= iter2); EXPECT_TRUE(iter <= iter); EXPECT_TRUE(iter2 > iter); EXPECT_TRUE(iter2 >= iter); EXPECT_TRUE(iter >= iter); } TEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparableConstPtr) { RepeatedPtrField::const_pointer_iterator iter = const_proto_array_->pointer_begin(); RepeatedPtrField::const_pointer_iterator iter2 = iter + 1; EXPECT_TRUE(iter == iter); EXPECT_TRUE(iter != iter2); EXPECT_TRUE(iter < iter2); EXPECT_TRUE(iter <= iter2); EXPECT_TRUE(iter <= iter); EXPECT_TRUE(iter2 > iter); EXPECT_TRUE(iter2 >= iter); EXPECT_TRUE(iter >= iter); } // Uninitialized iterator does not point to any of the RepeatedPtrOverPtrs. // Dereferencing an uninitialized iterator crashes the process. TEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedPtrIterator) { RepeatedPtrField::pointer_iterator iter; EXPECT_TRUE(iter != proto_array_.pointer_begin()); EXPECT_TRUE(iter != proto_array_.pointer_begin() + 1); EXPECT_TRUE(iter != proto_array_.pointer_begin() + 2); EXPECT_TRUE(iter != proto_array_.pointer_begin() + 3); EXPECT_TRUE(iter != proto_array_.pointer_end()); } TEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedConstPtrIterator) { RepeatedPtrField::const_pointer_iterator iter; EXPECT_TRUE(iter != const_proto_array_->pointer_begin()); EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 1); EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 2); EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 3); EXPECT_TRUE(iter != const_proto_array_->pointer_end()); } // This comparison functor is required by the tests for RepeatedPtrOverPtrs. // They operate on strings and need to compare strings as strings in // any stl algorithm, even though the iterator returns a pointer to a string // - i.e. *iter has type string*. struct StringLessThan { bool operator()(const string* z, const string& y) { return *z < y; } bool operator()(const string* z, const string* y) const { return *z < *y; } }; TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrSTLAlgorithms_lower_bound) { proto_array_.Clear(); proto_array_.Add()->assign("a"); proto_array_.Add()->assign("c"); proto_array_.Add()->assign("d"); proto_array_.Add()->assign("n"); proto_array_.Add()->assign("p"); proto_array_.Add()->assign("x"); proto_array_.Add()->assign("y"); { string v = "f"; RepeatedPtrField::pointer_iterator it = std::lower_bound(proto_array_.pointer_begin(), proto_array_.pointer_end(), &v, StringLessThan()); GOOGLE_CHECK(*it != NULL); EXPECT_EQ(**it, "n"); EXPECT_TRUE(it == proto_array_.pointer_begin() + 3); } { string v = "f"; RepeatedPtrField::const_pointer_iterator it = std::lower_bound( const_proto_array_->pointer_begin(), const_proto_array_->pointer_end(), &v, StringLessThan()); GOOGLE_CHECK(*it != NULL); EXPECT_EQ(**it, "n"); EXPECT_TRUE(it == const_proto_array_->pointer_begin() + 3); } } TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrMutation) { RepeatedPtrField::pointer_iterator iter = proto_array_.pointer_begin(); **iter = "qux"; EXPECT_EQ("qux", proto_array_.Get(0)); EXPECT_EQ("bar", proto_array_.Get(1)); EXPECT_EQ("baz", proto_array_.Get(2)); ++iter; delete *iter; *iter = new string("a"); ++iter; delete *iter; *iter = new string("b"); EXPECT_EQ("a", proto_array_.Get(1)); EXPECT_EQ("b", proto_array_.Get(2)); } TEST_F(RepeatedPtrFieldPtrsIteratorTest, Sort) { proto_array_.Add()->assign("c"); proto_array_.Add()->assign("d"); proto_array_.Add()->assign("n"); proto_array_.Add()->assign("p"); proto_array_.Add()->assign("a"); proto_array_.Add()->assign("y"); proto_array_.Add()->assign("x"); EXPECT_EQ("foo", proto_array_.Get(0)); EXPECT_EQ("n", proto_array_.Get(5)); EXPECT_EQ("x", proto_array_.Get(9)); std::sort(proto_array_.pointer_begin(), proto_array_.pointer_end(), StringLessThan()); EXPECT_EQ("a", proto_array_.Get(0)); EXPECT_EQ("baz", proto_array_.Get(2)); EXPECT_EQ("y", proto_array_.Get(9)); } // ----------------------------------------------------------------------------- // Unit-tests for the insert iterators // google::protobuf::RepeatedFieldBackInserter, // google::protobuf::AllocatedRepeatedPtrFieldBackInserter // Ported from util/gtl/proto-array-iterators_unittest. class RepeatedFieldInsertionIteratorsTest : public testing::Test { protected: std::list halves; std::list fibonacci; std::vector words; typedef TestAllTypes::NestedMessage Nested; Nested nesteds[2]; std::vector nested_ptrs; TestAllTypes protobuffer; virtual void SetUp() { fibonacci.push_back(1); fibonacci.push_back(1); fibonacci.push_back(2); fibonacci.push_back(3); fibonacci.push_back(5); fibonacci.push_back(8); std::copy(fibonacci.begin(), fibonacci.end(), RepeatedFieldBackInserter(protobuffer.mutable_repeated_int32())); halves.push_back(1.0); halves.push_back(0.5); halves.push_back(0.25); halves.push_back(0.125); halves.push_back(0.0625); std::copy(halves.begin(), halves.end(), RepeatedFieldBackInserter(protobuffer.mutable_repeated_double())); words.push_back("Able"); words.push_back("was"); words.push_back("I"); words.push_back("ere"); words.push_back("I"); words.push_back("saw"); words.push_back("Elba"); std::copy(words.begin(), words.end(), RepeatedFieldBackInserter(protobuffer.mutable_repeated_string())); nesteds[0].set_bb(17); nesteds[1].set_bb(4711); std::copy(&nesteds[0], &nesteds[2], RepeatedFieldBackInserter( protobuffer.mutable_repeated_nested_message())); nested_ptrs.push_back(new Nested); nested_ptrs.back()->set_bb(170); nested_ptrs.push_back(new Nested); nested_ptrs.back()->set_bb(47110); std::copy(nested_ptrs.begin(), nested_ptrs.end(), RepeatedFieldBackInserter( protobuffer.mutable_repeated_nested_message())); } virtual void TearDown() { STLDeleteContainerPointers(nested_ptrs.begin(), nested_ptrs.end()); } }; TEST_F(RepeatedFieldInsertionIteratorsTest, Fibonacci) { EXPECT_TRUE(std::equal(fibonacci.begin(), fibonacci.end(), protobuffer.repeated_int32().begin())); EXPECT_TRUE(std::equal(protobuffer.repeated_int32().begin(), protobuffer.repeated_int32().end(), fibonacci.begin())); } TEST_F(RepeatedFieldInsertionIteratorsTest, Halves) { EXPECT_TRUE(std::equal(halves.begin(), halves.end(), protobuffer.repeated_double().begin())); EXPECT_TRUE(std::equal(protobuffer.repeated_double().begin(), protobuffer.repeated_double().end(), halves.begin())); } TEST_F(RepeatedFieldInsertionIteratorsTest, Words) { ASSERT_EQ(words.size(), protobuffer.repeated_string_size()); for (int i = 0; i < words.size(); ++i) EXPECT_EQ(words.at(i), protobuffer.repeated_string(i)); } TEST_F(RepeatedFieldInsertionIteratorsTest, Words2) { words.clear(); words.push_back("sing"); words.push_back("a"); words.push_back("song"); words.push_back("of"); words.push_back("six"); words.push_back("pence"); protobuffer.mutable_repeated_string()->Clear(); std::copy(words.begin(), words.end(), RepeatedPtrFieldBackInserter( protobuffer.mutable_repeated_string())); ASSERT_EQ(words.size(), protobuffer.repeated_string_size()); for (int i = 0; i < words.size(); ++i) EXPECT_EQ(words.at(i), protobuffer.repeated_string(i)); } TEST_F(RepeatedFieldInsertionIteratorsTest, Nesteds) { ASSERT_EQ(protobuffer.repeated_nested_message_size(), 4); EXPECT_EQ(protobuffer.repeated_nested_message(0).bb(), 17); EXPECT_EQ(protobuffer.repeated_nested_message(1).bb(), 4711); EXPECT_EQ(protobuffer.repeated_nested_message(2).bb(), 170); EXPECT_EQ(protobuffer.repeated_nested_message(3).bb(), 47110); } TEST_F(RepeatedFieldInsertionIteratorsTest, AllocatedRepeatedPtrFieldWithStringIntData) { std::vector data; TestAllTypes goldenproto; for (int i = 0; i < 10; ++i) { Nested* new_data = new Nested; new_data->set_bb(i); data.push_back(new_data); new_data = goldenproto.add_repeated_nested_message(); new_data->set_bb(i); } TestAllTypes testproto; std::copy(data.begin(), data.end(), AllocatedRepeatedPtrFieldBackInserter( testproto.mutable_repeated_nested_message())); EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString()); } TEST_F(RepeatedFieldInsertionIteratorsTest, AllocatedRepeatedPtrFieldWithString) { std::vector data; TestAllTypes goldenproto; for (int i = 0; i < 10; ++i) { string* new_data = new string; *new_data = "name-" + SimpleItoa(i); data.push_back(new_data); new_data = goldenproto.add_repeated_string(); *new_data = "name-" + SimpleItoa(i); } TestAllTypes testproto; std::copy(data.begin(), data.end(), AllocatedRepeatedPtrFieldBackInserter( testproto.mutable_repeated_string())); EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString()); } TEST_F(RepeatedFieldInsertionIteratorsTest, UnsafeArenaAllocatedRepeatedPtrFieldWithStringIntData) { std::vector data; TestAllTypes goldenproto; for (int i = 0; i < 10; ++i) { Nested* new_data = new Nested; new_data->set_bb(i); data.push_back(new_data); new_data = goldenproto.add_repeated_nested_message(); new_data->set_bb(i); } TestAllTypes testproto; std::copy(data.begin(), data.end(), UnsafeArenaAllocatedRepeatedPtrFieldBackInserter( testproto.mutable_repeated_nested_message())); EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString()); } TEST_F(RepeatedFieldInsertionIteratorsTest, UnsafeArenaAllocatedRepeatedPtrFieldWithString) { std::vector data; TestAllTypes goldenproto; for (int i = 0; i < 10; ++i) { string* new_data = new string; *new_data = "name-" + SimpleItoa(i); data.push_back(new_data); new_data = goldenproto.add_repeated_string(); *new_data = "name-" + SimpleItoa(i); } TestAllTypes testproto; std::copy(data.begin(), data.end(), UnsafeArenaAllocatedRepeatedPtrFieldBackInserter( testproto.mutable_repeated_string())); EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString()); } #if LANG_CXX11 TEST_F(RepeatedFieldInsertionIteratorsTest, MoveStrings) { std::vector src = {"a", "b", "c", "d"}; std::vector copy = src; // copy since move leaves in undefined state TestAllTypes testproto; std::move(copy.begin(), copy.end(), RepeatedFieldBackInserter(testproto.mutable_repeated_string())); ASSERT_THAT(testproto.repeated_string(), testing::ElementsAreArray(src)); } TEST_F(RepeatedFieldInsertionIteratorsTest, MoveProtos) { auto make_nested = [](int32 x) { Nested ret; ret.set_bb(x); return ret; }; std::vector src = {make_nested(3), make_nested(5), make_nested(7)}; std::vector copy = src; // copy since move leaves in undefined state TestAllTypes testproto; std::move( copy.begin(), copy.end(), RepeatedFieldBackInserter(testproto.mutable_repeated_nested_message())); ASSERT_EQ(src.size(), testproto.repeated_nested_message_size()); for (int i = 0; i < src.size(); ++i) { EXPECT_EQ(src[i].DebugString(), testproto.repeated_nested_message(i).DebugString()); } } #endif } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/service.cc000066400000000000000000000037361334102242000272510ustar00rootroot00000000000000// 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 namespace google { namespace protobuf { Service::~Service() {} RpcChannel::~RpcChannel() {} RpcController::~RpcController() {} } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/service.h000066400000000000000000000315211334102242000271040ustar00rootroot00000000000000// 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. // // DEPRECATED: This module declares the abstract interfaces underlying proto2 // RPC services. These are intented to be independent of any particular RPC // implementation, so that proto2 services can be used on top of a variety // of implementations. Starting with version 2.3.0, RPC implementations should // not try to build on these, but should instead provide code generator plugins // which generate code specific to the particular RPC implementation. This way // the generated code can be more appropriate for the implementation in use // and can avoid unnecessary layers of indirection. // // // When you use the protocol compiler to compile a service definition, it // generates two classes: An abstract interface for the service (with // methods matching the service definition) and a "stub" implementation. // A stub is just a type-safe wrapper around an RpcChannel which emulates a // local implementation of the service. // // For example, the service definition: // service MyService { // rpc Foo(MyRequest) returns(MyResponse); // } // will generate abstract interface "MyService" and class "MyService::Stub". // You could implement a MyService as follows: // class MyServiceImpl : public MyService { // public: // MyServiceImpl() {} // ~MyServiceImpl() {} // // // implements MyService --------------------------------------- // // void Foo(google::protobuf::RpcController* controller, // const MyRequest* request, // MyResponse* response, // Closure* done) { // // ... read request and fill in response ... // done->Run(); // } // }; // You would then register an instance of MyServiceImpl with your RPC server // implementation. (How to do that depends on the implementation.) // // To call a remote MyServiceImpl, first you need an RpcChannel connected to it. // How to construct a channel depends, again, on your RPC implementation. // Here we use a hypothetical "MyRpcChannel" as an example: // MyRpcChannel channel("rpc:hostname:1234/myservice"); // MyRpcController controller; // MyServiceImpl::Stub stub(&channel); // FooRequest request; // FooResponse response; // // // ... fill in request ... // // stub.Foo(&controller, request, &response, NewCallback(HandleResponse)); // // On Thread-Safety: // // Different RPC implementations may make different guarantees about what // threads they may run callbacks on, and what threads the application is // allowed to use to call the RPC system. Portable software should be ready // for callbacks to be called on any thread, but should not try to call the // RPC system from any thread except for the ones on which it received the // callbacks. Realistically, though, simple software will probably want to // use a single-threaded RPC system while high-end software will want to // use multiple threads. RPC implementations should provide multiple // choices. #ifndef GOOGLE_PROTOBUF_SERVICE_H__ #define GOOGLE_PROTOBUF_SERVICE_H__ #include #include #include namespace google { namespace protobuf { // Defined in this file. class Service; class RpcController; class RpcChannel; // Defined in other files. class Descriptor; // descriptor.h class ServiceDescriptor; // descriptor.h class MethodDescriptor; // descriptor.h class Message; // message.h // Abstract base interface for protocol-buffer-based RPC services. Services // themselves are abstract interfaces (implemented either by servers or as // stubs), but they subclass this base interface. The methods of this // interface can be used to call the methods of the Service without knowing // its exact type at compile time (analogous to Reflection). class LIBPROTOBUF_EXPORT Service { public: inline Service() {} virtual ~Service(); // When constructing a stub, you may pass STUB_OWNS_CHANNEL as the second // parameter to the constructor to tell it to delete its RpcChannel when // destroyed. enum ChannelOwnership { STUB_OWNS_CHANNEL, STUB_DOESNT_OWN_CHANNEL }; // Get the ServiceDescriptor describing this service and its methods. virtual const ServiceDescriptor* GetDescriptor() = 0; // Call a method of the service specified by MethodDescriptor. This is // normally implemented as a simple switch() that calls the standard // definitions of the service's methods. // // Preconditions: // * method->service() == GetDescriptor() // * request and response are of the exact same classes as the objects // returned by GetRequestPrototype(method) and // GetResponsePrototype(method). // * After the call has started, the request must not be modified and the // response must not be accessed at all until "done" is called. // * "controller" is of the correct type for the RPC implementation being // used by this Service. For stubs, the "correct type" depends on the // RpcChannel which the stub is using. Server-side Service // implementations are expected to accept whatever type of RpcController // the server-side RPC implementation uses. // // Postconditions: // * "done" will be called when the method is complete. This may be // before CallMethod() returns or it may be at some point in the future. // * If the RPC succeeded, "response" contains the response returned by // the server. // * If the RPC failed, "response"'s contents are undefined. The // RpcController can be queried to determine if an error occurred and // possibly to get more information about the error. virtual void CallMethod(const MethodDescriptor* method, RpcController* controller, const Message* request, Message* response, Closure* done) = 0; // CallMethod() requires that the request and response passed in are of a // particular subclass of Message. GetRequestPrototype() and // GetResponsePrototype() get the default instances of these required types. // You can then call Message::New() on these instances to construct mutable // objects which you can then pass to CallMethod(). // // Example: // const MethodDescriptor* method = // service->GetDescriptor()->FindMethodByName("Foo"); // Message* request = stub->GetRequestPrototype (method)->New(); // Message* response = stub->GetResponsePrototype(method)->New(); // request->ParseFromString(input); // service->CallMethod(method, *request, response, callback); virtual const Message& GetRequestPrototype( 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 // the controller is to provide a way to manipulate settings specific to the // RPC implementation and to find out about RPC-level errors. // // The methods provided by the RpcController interface are intended to be a // "least common denominator" set of features which we expect all // implementations to support. Specific implementations may provide more // advanced features (e.g. deadline propagation). class LIBPROTOBUF_EXPORT RpcController { public: inline RpcController() {} virtual ~RpcController(); // Client-side methods --------------------------------------------- // These calls may be made from the client side only. Their results // are undefined on the server side (may crash). // Resets the RpcController to its initial state so that it may be reused in // a new call. Must not be called while an RPC is in progress. virtual void Reset() = 0; // After a call has finished, returns true if the call failed. The possible // reasons for failure depend on the RPC implementation. Failed() must not // be called before a call has finished. If Failed() returns true, the // contents of the response message are undefined. virtual bool Failed() const = 0; // If Failed() is true, returns a human-readable description of the error. virtual string ErrorText() const = 0; // Advises the RPC system that the caller desires that the RPC call be // canceled. The RPC system may cancel it immediately, may wait awhile and // then cancel it, or may not even cancel the call at all. If the call is // canceled, the "done" callback will still be called and the RpcController // will indicate that the call failed at that time. virtual void StartCancel() = 0; // Server-side methods --------------------------------------------- // These calls may be made from the server side only. Their results // are undefined on the client side (may crash). // Causes Failed() to return true on the client side. "reason" will be // incorporated into the message returned by ErrorText(). If you find // you need to return machine-readable information about failures, you // should incorporate it into your response protocol buffer and should // NOT call SetFailed(). virtual void SetFailed(const string& reason) = 0; // If true, indicates that the client canceled the RPC, so the server may // as well give up on replying to it. The server should still call the // final "done" callback. virtual bool IsCanceled() const = 0; // Asks that the given callback be called when the RPC is canceled. The // callback will always be called exactly once. If the RPC completes without // being canceled, the callback will be called after completion. If the RPC // has already been canceled when NotifyOnCancel() is called, the callback // will be called immediately. // // 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 // communication line to a Service which can be used to call that Service's // methods. The Service may be running on another machine. Normally, you // should not call an RpcChannel directly, but instead construct a stub Service // wrapping it. Example: // RpcChannel* channel = new MyRpcChannel("remotehost.example.com:1234"); // MyService* service = new MyService::Stub(channel); // service->MyMethod(request, &response, callback); class LIBPROTOBUF_EXPORT RpcChannel { public: inline RpcChannel() {} virtual ~RpcChannel(); // Call the given method of the remote service. The signature of this // procedure looks the same as Service::CallMethod(), but the requirements // are less strict in one important way: the request and response objects // need not be of any specific class as long as their descriptors are // method->input_type() and method->output_type(). 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 #endif // GOOGLE_PROTOBUF_SERVICE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/source_context.pb.cc000066400000000000000000000345461334102242000312600ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/source_context.proto #include #include #include #include #include #include #include #include #include #include #include // This is a temporary google only hack #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS #include "third_party/protobuf/version.h" #endif // @@protoc_insertion_point(includes) namespace google { namespace protobuf { class SourceContextDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _SourceContext_default_instance_; } // namespace protobuf } // namespace google namespace protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto { void InitDefaultsSourceContextImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_SourceContext_default_instance_; new (ptr) ::google::protobuf::SourceContext(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::SourceContext::InitAsDefaultInstance(); } void InitDefaultsSourceContext() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsSourceContextImpl); } ::google::protobuf::Metadata file_level_metadata[1]; const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceContext, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::SourceContext, file_name_), }; static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { { 0, -1, sizeof(::google::protobuf::SourceContext)}, }; static ::google::protobuf::Message const * const file_default_instances[] = { reinterpret_cast(&::google::protobuf::_SourceContext_default_instance_), }; void protobuf_AssignDescriptors() { AddDescriptors(); ::google::protobuf::MessageFactory* factory = NULL; AssignDescriptors( "google/protobuf/source_context.proto", schemas, file_default_instances, TableStruct::offsets, factory, file_level_metadata, NULL, NULL); } void protobuf_AssignDescriptorsOnce() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors); } void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD; void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1); } void AddDescriptorsImpl() { InitDefaults(); static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_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\225\001\n\023com.google.protobufB\022Sou" "rceContextProtoP\001ZAgoogle.golang.org/gen" "proto/protobuf/source_context;source_con" "text\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTy" "pesb\006proto3" }; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( descriptor, 251); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "google/protobuf/source_context.proto", &protobuf_RegisterTypes); } void AddDescriptors() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl); } // Force AddDescriptors() to be called at dynamic initialization time. struct StaticDescriptorInitializer { StaticDescriptorInitializer() { AddDescriptors(); } } static_descriptor_initializer; } // namespace protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto namespace google { namespace protobuf { // =================================================================== void SourceContext::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int SourceContext::kFileNameFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 SourceContext::SourceContext() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaultsSourceContext(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.SourceContext) } SourceContext::SourceContext(const SourceContext& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); file_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); if (from.file_name().size() > 0) { file_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.file_name_); } // @@protoc_insertion_point(copy_constructor:google.protobuf.SourceContext) } void SourceContext::SharedCtor() { file_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); _cached_size_ = 0; } SourceContext::~SourceContext() { // @@protoc_insertion_point(destructor:google.protobuf.SourceContext) SharedDtor(); } void SourceContext::SharedDtor() { file_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } void SourceContext::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* SourceContext::descriptor() { ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const SourceContext& SourceContext::default_instance() { ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaultsSourceContext(); return *internal_default_instance(); } SourceContext* SourceContext::New(::google::protobuf::Arena* arena) const { SourceContext* n = new SourceContext; if (arena != NULL) { arena->Own(n); } return n; } void SourceContext::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.SourceContext) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; file_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); _internal_metadata_.Clear(); } bool SourceContext::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.SourceContext) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // string file_name = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_file_name())); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->file_name().data(), static_cast(this->file_name().length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.SourceContext.file_name")); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.SourceContext) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.SourceContext) return false; #undef DO_ } void SourceContext::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.SourceContext) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // string file_name = 1; if (this->file_name().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->file_name().data(), static_cast(this->file_name().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.SourceContext.file_name"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 1, this->file_name(), output); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.SourceContext) } ::google::protobuf::uint8* SourceContext::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.SourceContext) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // string file_name = 1; if (this->file_name().size() > 0) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->file_name().data(), static_cast(this->file_name().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.SourceContext.file_name"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->file_name(), target); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.SourceContext) return target; } size_t SourceContext::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.SourceContext) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } // string file_name = 1; if (this->file_name().size() > 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->file_name()); } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void SourceContext::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.SourceContext) GOOGLE_DCHECK_NE(&from, this); const SourceContext* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.SourceContext) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.SourceContext) MergeFrom(*source); } } void SourceContext::MergeFrom(const SourceContext& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.SourceContext) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; if (from.file_name().size() > 0) { file_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.file_name_); } } void SourceContext::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.SourceContext) if (&from == this) return; Clear(); MergeFrom(from); } void SourceContext::CopyFrom(const SourceContext& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.SourceContext) if (&from == this) return; Clear(); MergeFrom(from); } bool SourceContext::IsInitialized() const { return true; } void SourceContext::Swap(SourceContext* other) { if (other == this) return; InternalSwap(other); } void SourceContext::InternalSwap(SourceContext* other) { using std::swap; file_name_.Swap(&other->file_name_); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata SourceContext::GetMetadata() const { protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::file_level_metadata[kIndexInFileMessages]; } // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/source_context.pb.h000066400000000000000000000217711334102242000311160ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/source_context.proto #ifndef PROTOBUF_google_2fprotobuf_2fsource_5fcontext_2eproto__INCLUDED #define PROTOBUF_google_2fprotobuf_2fsource_5fcontext_2eproto__INCLUDED #include #include #if GOOGLE_PROTOBUF_VERSION < 3005000 #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 3005001 < GOOGLE_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 #include #include #include #include #include #include #include #include // IWYU pragma: export #include // IWYU pragma: export #include // @@protoc_insertion_point(includes) namespace protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto { // Internal implementation detail -- do not use these members. struct LIBPROTOBUF_EXPORT TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; static const ::google::protobuf::internal::ParseTable schema[1]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; }; void LIBPROTOBUF_EXPORT AddDescriptors(); void LIBPROTOBUF_EXPORT InitDefaultsSourceContextImpl(); void LIBPROTOBUF_EXPORT InitDefaultsSourceContext(); inline void LIBPROTOBUF_EXPORT InitDefaults() { InitDefaultsSourceContext(); } } // namespace protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto namespace google { namespace protobuf { class SourceContext; class SourceContextDefaultTypeInternal; LIBPROTOBUF_EXPORT extern SourceContextDefaultTypeInternal _SourceContext_default_instance_; } // namespace protobuf } // namespace google namespace google { namespace protobuf { // =================================================================== class LIBPROTOBUF_EXPORT SourceContext : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.SourceContext) */ { public: SourceContext(); virtual ~SourceContext(); SourceContext(const SourceContext& from); inline SourceContext& operator=(const SourceContext& from) { CopyFrom(from); return *this; } #if LANG_CXX11 SourceContext(SourceContext&& from) noexcept : SourceContext() { *this = ::std::move(from); } inline SourceContext& operator=(SourceContext&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif static const ::google::protobuf::Descriptor* descriptor(); static const SourceContext& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const SourceContext* internal_default_instance() { return reinterpret_cast( &_SourceContext_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 0; void Swap(SourceContext* other); friend void swap(SourceContext& a, SourceContext& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline SourceContext* New() const PROTOBUF_FINAL { return New(NULL); } SourceContext* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const SourceContext& from); void MergeFrom(const SourceContext& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(SourceContext* other); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return NULL; } inline void* MaybeArenaPtr() const { return NULL; } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // string file_name = 1; void clear_file_name(); static const int kFileNameFieldNumber = 1; const ::std::string& file_name() const; void set_file_name(const ::std::string& value); #if LANG_CXX11 void set_file_name(::std::string&& value); #endif void set_file_name(const char* value); void set_file_name(const char* value, size_t size); ::std::string* mutable_file_name(); ::std::string* release_file_name(); void set_allocated_file_name(::std::string* file_name); // @@protoc_insertion_point(class_scope:google.protobuf.SourceContext) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; ::google::protobuf::internal::ArenaStringPtr file_name_; mutable int _cached_size_; friend struct ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fsource_5fcontext_2eproto::InitDefaultsSourceContextImpl(); }; // =================================================================== // =================================================================== #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif // __GNUC__ // SourceContext // string file_name = 1; inline void SourceContext::clear_file_name() { file_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline const ::std::string& SourceContext::file_name() const { // @@protoc_insertion_point(field_get:google.protobuf.SourceContext.file_name) return file_name_.GetNoArena(); } inline void SourceContext::set_file_name(const ::std::string& value) { file_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); // @@protoc_insertion_point(field_set:google.protobuf.SourceContext.file_name) } #if LANG_CXX11 inline void SourceContext::set_file_name(::std::string&& value) { file_name_.SetNoArena( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.SourceContext.file_name) } #endif inline void SourceContext::set_file_name(const char* value) { GOOGLE_DCHECK(value != NULL); file_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); // @@protoc_insertion_point(field_set_char:google.protobuf.SourceContext.file_name) } inline void SourceContext::set_file_name(const char* value, size_t size) { file_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(reinterpret_cast(value), size)); // @@protoc_insertion_point(field_set_pointer:google.protobuf.SourceContext.file_name) } inline ::std::string* SourceContext::mutable_file_name() { // @@protoc_insertion_point(field_mutable:google.protobuf.SourceContext.file_name) return file_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline ::std::string* SourceContext::release_file_name() { // @@protoc_insertion_point(field_release:google.protobuf.SourceContext.file_name) return file_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } inline void SourceContext::set_allocated_file_name(::std::string* file_name) { if (file_name != NULL) { } else { } file_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), file_name); // @@protoc_insertion_point(field_set_allocated:google.protobuf.SourceContext.file_name) } #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) #endif // PROTOBUF_google_2fprotobuf_2fsource_5fcontext_2eproto__INCLUDED python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/source_context.proto000066400000000000000000000044601334102242000314260ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option java_package = "com.google.protobuf"; option java_outer_classname = "SourceContextProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; option go_package = "google.golang.org/genproto/protobuf/source_context;source_context"; // `SourceContext` represents information about the source of a // protobuf element, like the file in which it is defined. message SourceContext { // The path-qualified name of the .proto file that contained the associated // protobuf element. For example: `"google/protobuf/source_context.proto"`. string file_name = 1; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/struct.pb.cc000066400000000000000000001517151334102242000275360ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/struct.proto #include #include #include #include #include #include #include #include #include #include #include // This is a temporary google only hack #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS #include "third_party/protobuf/version.h" #endif // @@protoc_insertion_point(includes) namespace google { namespace protobuf { class Struct_FieldsEntry_DoNotUseDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Struct_FieldsEntry_DoNotUse_default_instance_; class StructDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Struct_default_instance_; class ValueDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; int null_value_; double number_value_; ::google::protobuf::internal::ArenaStringPtr string_value_; bool bool_value_; const ::google::protobuf::Struct* struct_value_; const ::google::protobuf::ListValue* list_value_; } _Value_default_instance_; class ListValueDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _ListValue_default_instance_; } // namespace protobuf } // namespace google namespace protobuf_google_2fprotobuf_2fstruct_2eproto { void InitDefaultsListValueImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_Struct_FieldsEntry_DoNotUse_default_instance_; new (ptr) ::google::protobuf::Struct_FieldsEntry_DoNotUse(); } { void* ptr = &::google::protobuf::_Struct_default_instance_; new (ptr) ::google::protobuf::Struct(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } { void* ptr = &::google::protobuf::_Value_default_instance_; new (ptr) ::google::protobuf::Value(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } { void* ptr = &::google::protobuf::_ListValue_default_instance_; new (ptr) ::google::protobuf::ListValue(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::Struct_FieldsEntry_DoNotUse::InitAsDefaultInstance(); ::google::protobuf::Struct::InitAsDefaultInstance(); ::google::protobuf::Value::InitAsDefaultInstance(); ::google::protobuf::ListValue::InitAsDefaultInstance(); } void InitDefaultsListValue() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsListValueImpl); } ::google::protobuf::Metadata file_level_metadata[4]; const ::google::protobuf::EnumDescriptor* file_level_enum_descriptors[1]; const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct_FieldsEntry_DoNotUse, _has_bits_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct_FieldsEntry_DoNotUse, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct_FieldsEntry_DoNotUse, key_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct_FieldsEntry_DoNotUse, value_), 0, 1, ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Struct, fields_), ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Value, _internal_metadata_), ~0u, // no _extensions_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Value, _oneof_case_[0]), ~0u, // no _weak_field_map_ offsetof(::google::protobuf::ValueDefaultTypeInternal, null_value_), offsetof(::google::protobuf::ValueDefaultTypeInternal, number_value_), offsetof(::google::protobuf::ValueDefaultTypeInternal, string_value_), offsetof(::google::protobuf::ValueDefaultTypeInternal, bool_value_), offsetof(::google::protobuf::ValueDefaultTypeInternal, struct_value_), offsetof(::google::protobuf::ValueDefaultTypeInternal, list_value_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Value, kind_), ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ListValue, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::ListValue, values_), }; static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { { 0, 7, sizeof(::google::protobuf::Struct_FieldsEntry_DoNotUse)}, { 9, -1, sizeof(::google::protobuf::Struct)}, { 15, -1, sizeof(::google::protobuf::Value)}, { 27, -1, sizeof(::google::protobuf::ListValue)}, }; static ::google::protobuf::Message const * const file_default_instances[] = { reinterpret_cast(&::google::protobuf::_Struct_FieldsEntry_DoNotUse_default_instance_), reinterpret_cast(&::google::protobuf::_Struct_default_instance_), reinterpret_cast(&::google::protobuf::_Value_default_instance_), reinterpret_cast(&::google::protobuf::_ListValue_default_instance_), }; void protobuf_AssignDescriptors() { AddDescriptors(); ::google::protobuf::MessageFactory* factory = NULL; AssignDescriptors( "google/protobuf/struct.proto", schemas, file_default_instances, TableStruct::offsets, factory, file_level_metadata, file_level_enum_descriptors, NULL); } void protobuf_AssignDescriptorsOnce() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors); } void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD; void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 4); } void AddDescriptorsImpl() { InitDefaults(); static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_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\201\001\n\023com.google.pro" "tobufB\013StructProtoP\001Z1github.com/golang/" "protobuf/ptypes/struct;structpb\370\001\001\242\002\003GPB" "\252\002\036Google.Protobuf.WellKnownTypesb\006proto" "3" }; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( descriptor, 641); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "google/protobuf/struct.proto", &protobuf_RegisterTypes); } void AddDescriptors() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl); } // Force AddDescriptors() to be called at dynamic initialization time. struct StaticDescriptorInitializer { StaticDescriptorInitializer() { AddDescriptors(); } } static_descriptor_initializer; } // namespace protobuf_google_2fprotobuf_2fstruct_2eproto namespace google { namespace protobuf { const ::google::protobuf::EnumDescriptor* NullValue_descriptor() { protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce(); return protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_enum_descriptors[0]; } bool NullValue_IsValid(int value) { switch (value) { case 0: return true; default: return false; } } // =================================================================== Struct_FieldsEntry_DoNotUse::Struct_FieldsEntry_DoNotUse() {} Struct_FieldsEntry_DoNotUse::Struct_FieldsEntry_DoNotUse(::google::protobuf::Arena* arena) : SuperType(arena) {} void Struct_FieldsEntry_DoNotUse::MergeFrom(const Struct_FieldsEntry_DoNotUse& other) { MergeFromInternal(other); } ::google::protobuf::Metadata Struct_FieldsEntry_DoNotUse::GetMetadata() const { ::protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[0]; } void Struct_FieldsEntry_DoNotUse::MergeFrom( const ::google::protobuf::Message& other) { ::google::protobuf::Message::MergeFrom(other); } // =================================================================== void Struct::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int Struct::kFieldsFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Struct::Struct() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.Struct) } Struct::Struct(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), fields_(arena) { ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.Struct) } Struct::Struct(const Struct& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); fields_.MergeFrom(from.fields_); // @@protoc_insertion_point(copy_constructor:google.protobuf.Struct) } void Struct::SharedCtor() { _cached_size_ = 0; } Struct::~Struct() { // @@protoc_insertion_point(destructor:google.protobuf.Struct) SharedDtor(); } void Struct::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void Struct::ArenaDtor(void* object) { Struct* _this = reinterpret_cast< Struct* >(object); (void)_this; } void Struct::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void Struct::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* Struct::descriptor() { ::protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const Struct& Struct::default_instance() { ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue(); return *internal_default_instance(); } Struct* Struct::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void Struct::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.Struct) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; fields_.Clear(); _internal_metadata_.Clear(); } bool Struct::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.Struct) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // map fields = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { Struct_FieldsEntry_DoNotUse::Parser< ::google::protobuf::internal::MapField< Struct_FieldsEntry_DoNotUse, ::std::string, ::google::protobuf::Value, ::google::protobuf::internal::WireFormatLite::TYPE_STRING, ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE, 0 >, ::google::protobuf::Map< ::std::string, ::google::protobuf::Value > > parser(&fields_); DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( input, &parser)); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( parser.key().data(), static_cast(parser.key().length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.Struct.FieldsEntry.key")); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.Struct) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.Struct) return false; #undef DO_ } void Struct::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.Struct) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // map fields = 1; if (!this->fields().empty()) { typedef ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_pointer ConstPtr; typedef ConstPtr SortItem; typedef ::google::protobuf::internal::CompareByDerefFirst Less; struct Utf8Check { static void Check(ConstPtr p) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( p->first.data(), static_cast(p->first.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Struct.FieldsEntry.key"); } }; if (output->IsSerializationDeterministic() && this->fields().size() > 1) { ::google::protobuf::scoped_array items( new SortItem[this->fields().size()]); typedef ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::size_type size_type; size_type n = 0; for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator it = this->fields().begin(); it != this->fields().end(); ++it, ++n) { items[static_cast(n)] = SortItem(&*it); } ::std::sort(&items[0], &items[static_cast(n)], Less()); ::google::protobuf::scoped_ptr entry; for (size_type i = 0; i < n; i++) { entry.reset(fields_.NewEntryWrapper( items[static_cast(i)]->first, items[static_cast(i)]->second)); ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 1, *entry, output); if (entry->GetArena() != NULL) { entry.release(); } Utf8Check::Check(items[static_cast(i)]); } } else { ::google::protobuf::scoped_ptr entry; for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator it = this->fields().begin(); it != this->fields().end(); ++it) { entry.reset(fields_.NewEntryWrapper( it->first, it->second)); ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 1, *entry, output); if (entry->GetArena() != NULL) { entry.release(); } Utf8Check::Check(&*it); } } } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.Struct) } ::google::protobuf::uint8* Struct::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Struct) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // map fields = 1; if (!this->fields().empty()) { typedef ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_pointer ConstPtr; typedef ConstPtr SortItem; typedef ::google::protobuf::internal::CompareByDerefFirst Less; struct Utf8Check { static void Check(ConstPtr p) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( p->first.data(), static_cast(p->first.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Struct.FieldsEntry.key"); } }; if (deterministic && this->fields().size() > 1) { ::google::protobuf::scoped_array items( new SortItem[this->fields().size()]); typedef ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::size_type size_type; size_type n = 0; for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator it = this->fields().begin(); it != this->fields().end(); ++it, ++n) { items[static_cast(n)] = SortItem(&*it); } ::std::sort(&items[0], &items[static_cast(n)], Less()); ::google::protobuf::scoped_ptr entry; for (size_type i = 0; i < n; i++) { entry.reset(fields_.NewEntryWrapper( items[static_cast(i)]->first, items[static_cast(i)]->second)); target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageNoVirtualToArray( 1, *entry, deterministic, target); ; if (entry->GetArena() != NULL) { entry.release(); } Utf8Check::Check(items[static_cast(i)]); } } else { ::google::protobuf::scoped_ptr entry; for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator it = this->fields().begin(); it != this->fields().end(); ++it) { entry.reset(fields_.NewEntryWrapper( it->first, it->second)); target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageNoVirtualToArray( 1, *entry, deterministic, target); ; if (entry->GetArena() != NULL) { entry.release(); } Utf8Check::Check(&*it); } } } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Struct) return target; } size_t Struct::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Struct) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } // map fields = 1; total_size += 1 * ::google::protobuf::internal::FromIntSize(this->fields_size()); { ::google::protobuf::scoped_ptr entry; for (::google::protobuf::Map< ::std::string, ::google::protobuf::Value >::const_iterator it = this->fields().begin(); it != this->fields().end(); ++it) { if (entry.get() != NULL && entry->GetArena() != NULL) { entry.release(); } entry.reset(fields_.NewEntryWrapper(it->first, it->second)); total_size += ::google::protobuf::internal::WireFormatLite:: MessageSizeNoVirtual(*entry); } if (entry.get() != NULL && entry->GetArena() != NULL) { entry.release(); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void Struct::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Struct) GOOGLE_DCHECK_NE(&from, this); const Struct* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.Struct) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.Struct) MergeFrom(*source); } } void Struct::MergeFrom(const Struct& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Struct) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; fields_.MergeFrom(from.fields_); } void Struct::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.Struct) if (&from == this) return; Clear(); MergeFrom(from); } void Struct::CopyFrom(const Struct& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Struct) if (&from == this) return; Clear(); MergeFrom(from); } bool Struct::IsInitialized() const { return true; } void Struct::Swap(Struct* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { Struct* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void Struct::UnsafeArenaSwap(Struct* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void Struct::InternalSwap(Struct* other) { using std::swap; fields_.Swap(&other->fields_); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata Struct::GetMetadata() const { protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void Value::InitAsDefaultInstance() { ::google::protobuf::_Value_default_instance_.null_value_ = 0; ::google::protobuf::_Value_default_instance_.number_value_ = 0; ::google::protobuf::_Value_default_instance_.string_value_.UnsafeSetDefault( &::google::protobuf::internal::GetEmptyStringAlreadyInited()); ::google::protobuf::_Value_default_instance_.bool_value_ = false; ::google::protobuf::_Value_default_instance_.struct_value_ = const_cast< ::google::protobuf::Struct*>( ::google::protobuf::Struct::internal_default_instance()); ::google::protobuf::_Value_default_instance_.list_value_ = const_cast< ::google::protobuf::ListValue*>( ::google::protobuf::ListValue::internal_default_instance()); } void Value::set_allocated_struct_value(::google::protobuf::Struct* struct_value) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); clear_kind(); if (struct_value) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(struct_value); if (message_arena != submessage_arena) { struct_value = ::google::protobuf::internal::GetOwnedMessage( message_arena, struct_value, submessage_arena); } set_has_struct_value(); kind_.struct_value_ = struct_value; } // @@protoc_insertion_point(field_set_allocated:google.protobuf.Value.struct_value) } void Value::set_allocated_list_value(::google::protobuf::ListValue* list_value) { ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); clear_kind(); if (list_value) { ::google::protobuf::Arena* submessage_arena = ::google::protobuf::Arena::GetArena(list_value); if (message_arena != submessage_arena) { list_value = ::google::protobuf::internal::GetOwnedMessage( message_arena, list_value, submessage_arena); } set_has_list_value(); kind_.list_value_ = list_value; } // @@protoc_insertion_point(field_set_allocated:google.protobuf.Value.list_value) } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int Value::kNullValueFieldNumber; const int Value::kNumberValueFieldNumber; const int Value::kStringValueFieldNumber; const int Value::kBoolValueFieldNumber; const int Value::kStructValueFieldNumber; const int Value::kListValueFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Value::Value() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.Value) } Value::Value(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.Value) } Value::Value(const Value& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); clear_has_kind(); switch (from.kind_case()) { case kNullValue: { set_null_value(from.null_value()); break; } case kNumberValue: { set_number_value(from.number_value()); break; } case kStringValue: { set_string_value(from.string_value()); break; } case kBoolValue: { set_bool_value(from.bool_value()); break; } case kStructValue: { mutable_struct_value()->::google::protobuf::Struct::MergeFrom(from.struct_value()); break; } case kListValue: { mutable_list_value()->::google::protobuf::ListValue::MergeFrom(from.list_value()); break; } case KIND_NOT_SET: { break; } } // @@protoc_insertion_point(copy_constructor:google.protobuf.Value) } void Value::SharedCtor() { clear_has_kind(); _cached_size_ = 0; } Value::~Value() { // @@protoc_insertion_point(destructor:google.protobuf.Value) SharedDtor(); } void Value::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); if (has_kind()) { clear_kind(); } } void Value::ArenaDtor(void* object) { Value* _this = reinterpret_cast< Value* >(object); (void)_this; } void Value::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void Value::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* Value::descriptor() { ::protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const Value& Value::default_instance() { ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue(); return *internal_default_instance(); } Value* Value::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void Value::clear_kind() { // @@protoc_insertion_point(one_of_clear_start:google.protobuf.Value) switch (kind_case()) { case kNullValue: { // No need to clear break; } case kNumberValue: { // No need to clear break; } case kStringValue: { kind_.string_value_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); break; } case kBoolValue: { // No need to clear break; } case kStructValue: { if (GetArenaNoVirtual() == NULL) { delete kind_.struct_value_; } break; } case kListValue: { if (GetArenaNoVirtual() == NULL) { delete kind_.list_value_; } break; } case KIND_NOT_SET: { break; } } _oneof_case_[0] = KIND_NOT_SET; } void Value::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.Value) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; clear_kind(); _internal_metadata_.Clear(); } bool Value::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.Value) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // .google.protobuf.NullValue null_value = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { int value; DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( input, &value))); set_null_value(static_cast< ::google::protobuf::NullValue >(value)); } else { goto handle_unusual; } break; } // double number_value = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(17u /* 17 & 0xFF */)) { clear_kind(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( input, &kind_.number_value_))); set_has_number_value(); } else { goto handle_unusual; } break; } // string string_value = 3; case 3: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_string_value())); DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->string_value().data(), static_cast(this->string_value().length()), ::google::protobuf::internal::WireFormatLite::PARSE, "google.protobuf.Value.string_value")); } else { goto handle_unusual; } break; } // bool bool_value = 4; case 4: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(32u /* 32 & 0xFF */)) { clear_kind(); DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( input, &kind_.bool_value_))); set_has_bool_value(); } else { goto handle_unusual; } break; } // .google.protobuf.Struct struct_value = 5; case 5: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_struct_value())); } else { goto handle_unusual; } break; } // .google.protobuf.ListValue list_value = 6; case 6: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(50u /* 50 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( input, mutable_list_value())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.Value) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.Value) return false; #undef DO_ } void Value::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.Value) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // .google.protobuf.NullValue null_value = 1; if (has_null_value()) { ::google::protobuf::internal::WireFormatLite::WriteEnum( 1, this->null_value(), output); } // double number_value = 2; if (has_number_value()) { ::google::protobuf::internal::WireFormatLite::WriteDouble(2, this->number_value(), output); } // string string_value = 3; if (has_string_value()) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->string_value().data(), static_cast(this->string_value().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Value.string_value"); ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( 3, this->string_value(), output); } // bool bool_value = 4; if (has_bool_value()) { ::google::protobuf::internal::WireFormatLite::WriteBool(4, this->bool_value(), output); } // .google.protobuf.Struct struct_value = 5; if (has_struct_value()) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 5, *kind_.struct_value_, output); } // .google.protobuf.ListValue list_value = 6; if (has_list_value()) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 6, *kind_.list_value_, output); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.Value) } ::google::protobuf::uint8* Value::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Value) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // .google.protobuf.NullValue null_value = 1; if (has_null_value()) { target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( 1, this->null_value(), target); } // double number_value = 2; if (has_number_value()) { target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(2, this->number_value(), target); } // string string_value = 3; if (has_string_value()) { ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( this->string_value().data(), static_cast(this->string_value().length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "google.protobuf.Value.string_value"); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 3, this->string_value(), target); } // bool bool_value = 4; if (has_bool_value()) { target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(4, this->bool_value(), target); } // .google.protobuf.Struct struct_value = 5; if (has_struct_value()) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 5, *kind_.struct_value_, deterministic, target); } // .google.protobuf.ListValue list_value = 6; if (has_list_value()) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 6, *kind_.list_value_, deterministic, target); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Value) return target; } size_t Value::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Value) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } switch (kind_case()) { // .google.protobuf.NullValue null_value = 1; case kNullValue: { total_size += 1 + ::google::protobuf::internal::WireFormatLite::EnumSize(this->null_value()); break; } // double number_value = 2; case kNumberValue: { total_size += 1 + 8; break; } // string string_value = 3; case kStringValue: { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->string_value()); break; } // bool bool_value = 4; case kBoolValue: { total_size += 1 + 1; break; } // .google.protobuf.Struct struct_value = 5; case kStructValue: { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *kind_.struct_value_); break; } // .google.protobuf.ListValue list_value = 6; case kListValue: { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( *kind_.list_value_); break; } case KIND_NOT_SET: { break; } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void Value::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Value) GOOGLE_DCHECK_NE(&from, this); const Value* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.Value) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.Value) MergeFrom(*source); } } void Value::MergeFrom(const Value& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Value) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; switch (from.kind_case()) { case kNullValue: { set_null_value(from.null_value()); break; } case kNumberValue: { set_number_value(from.number_value()); break; } case kStringValue: { set_string_value(from.string_value()); break; } case kBoolValue: { set_bool_value(from.bool_value()); break; } case kStructValue: { mutable_struct_value()->::google::protobuf::Struct::MergeFrom(from.struct_value()); break; } case kListValue: { mutable_list_value()->::google::protobuf::ListValue::MergeFrom(from.list_value()); break; } case KIND_NOT_SET: { break; } } } void Value::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.Value) if (&from == this) return; Clear(); MergeFrom(from); } void Value::CopyFrom(const Value& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Value) if (&from == this) return; Clear(); MergeFrom(from); } bool Value::IsInitialized() const { return true; } void Value::Swap(Value* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { Value* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void Value::UnsafeArenaSwap(Value* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void Value::InternalSwap(Value* other) { using std::swap; swap(kind_, other->kind_); swap(_oneof_case_[0], other->_oneof_case_[0]); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata Value::GetMetadata() const { protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages]; } // =================================================================== void ListValue::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int ListValue::kValuesFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 ListValue::ListValue() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.ListValue) } ListValue::ListValue(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena), values_(arena) { ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.ListValue) } ListValue::ListValue(const ListValue& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), values_(from.values_), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); // @@protoc_insertion_point(copy_constructor:google.protobuf.ListValue) } void ListValue::SharedCtor() { _cached_size_ = 0; } ListValue::~ListValue() { // @@protoc_insertion_point(destructor:google.protobuf.ListValue) SharedDtor(); } void ListValue::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void ListValue::ArenaDtor(void* object) { ListValue* _this = reinterpret_cast< ListValue* >(object); (void)_this; } void ListValue::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void ListValue::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* ListValue::descriptor() { ::protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const ListValue& ListValue::default_instance() { ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValue(); return *internal_default_instance(); } ListValue* ListValue::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void ListValue::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.ListValue) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; values_.Clear(); _internal_metadata_.Clear(); } bool ListValue::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.ListValue) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // repeated .google.protobuf.Value values = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(input, add_values())); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.ListValue) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.ListValue) return false; #undef DO_ } void ListValue::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.ListValue) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.Value values = 1; for (unsigned int i = 0, n = static_cast(this->values_size()); i < n; i++) { ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( 1, this->values(static_cast(i)), output); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.ListValue) } ::google::protobuf::uint8* ListValue::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.ListValue) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // repeated .google.protobuf.Value values = 1; for (unsigned int i = 0, n = static_cast(this->values_size()); i < n; i++) { target = ::google::protobuf::internal::WireFormatLite:: InternalWriteMessageToArray( 1, this->values(static_cast(i)), deterministic, target); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.ListValue) return target; } size_t ListValue::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.ListValue) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } // repeated .google.protobuf.Value values = 1; { unsigned int count = static_cast(this->values_size()); total_size += 1UL * count; for (unsigned int i = 0; i < count; i++) { total_size += ::google::protobuf::internal::WireFormatLite::MessageSize( this->values(static_cast(i))); } } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void ListValue::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.ListValue) GOOGLE_DCHECK_NE(&from, this); const ListValue* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.ListValue) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.ListValue) MergeFrom(*source); } } void ListValue::MergeFrom(const ListValue& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.ListValue) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; values_.MergeFrom(from.values_); } void ListValue::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.ListValue) if (&from == this) return; Clear(); MergeFrom(from); } void ListValue::CopyFrom(const ListValue& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.ListValue) if (&from == this) return; Clear(); MergeFrom(from); } bool ListValue::IsInitialized() const { return true; } void ListValue::Swap(ListValue* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { ListValue* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void ListValue::UnsafeArenaSwap(ListValue* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void ListValue::InternalSwap(ListValue* other) { using std::swap; values_.InternalSwap(&other->values_); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata ListValue::GetMetadata() const { protobuf_google_2fprotobuf_2fstruct_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2fstruct_2eproto::file_level_metadata[kIndexInFileMessages]; } // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/struct.pb.h000066400000000000000000001067711334102242000274020ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/struct.proto #ifndef PROTOBUF_google_2fprotobuf_2fstruct_2eproto__INCLUDED #define PROTOBUF_google_2fprotobuf_2fstruct_2eproto__INCLUDED #include #include #if GOOGLE_PROTOBUF_VERSION < 3005000 #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 3005001 < GOOGLE_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 #include #include #include #include #include #include #include #include // IWYU pragma: export #include // IWYU pragma: export #include // IWYU pragma: export #include #include #include #include // @@protoc_insertion_point(includes) namespace protobuf_google_2fprotobuf_2fstruct_2eproto { // Internal implementation detail -- do not use these members. struct LIBPROTOBUF_EXPORT TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; static const ::google::protobuf::internal::ParseTable schema[4]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; }; void LIBPROTOBUF_EXPORT AddDescriptors(); void LIBPROTOBUF_EXPORT InitDefaultsListValueImpl(); void LIBPROTOBUF_EXPORT InitDefaultsListValue(); inline void LIBPROTOBUF_EXPORT InitDefaults() { InitDefaultsListValue(); } } // namespace protobuf_google_2fprotobuf_2fstruct_2eproto namespace google { namespace protobuf { class ListValue; class ListValueDefaultTypeInternal; LIBPROTOBUF_EXPORT extern ListValueDefaultTypeInternal _ListValue_default_instance_; class Struct; class StructDefaultTypeInternal; LIBPROTOBUF_EXPORT extern StructDefaultTypeInternal _Struct_default_instance_; class Struct_FieldsEntry_DoNotUse; class Struct_FieldsEntry_DoNotUseDefaultTypeInternal; LIBPROTOBUF_EXPORT extern Struct_FieldsEntry_DoNotUseDefaultTypeInternal _Struct_FieldsEntry_DoNotUse_default_instance_; class Value; class ValueDefaultTypeInternal; LIBPROTOBUF_EXPORT extern ValueDefaultTypeInternal _Value_default_instance_; } // namespace protobuf } // namespace google namespace google { namespace protobuf { enum NullValue { NULL_VALUE = 0, NullValue_INT_MIN_SENTINEL_DO_NOT_USE_ = ::google::protobuf::kint32min, NullValue_INT_MAX_SENTINEL_DO_NOT_USE_ = ::google::protobuf::kint32max }; LIBPROTOBUF_EXPORT bool NullValue_IsValid(int value); const NullValue NullValue_MIN = NULL_VALUE; const NullValue NullValue_MAX = NULL_VALUE; const int NullValue_ARRAYSIZE = NullValue_MAX + 1; LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* NullValue_descriptor(); inline const ::std::string& NullValue_Name(NullValue value) { return ::google::protobuf::internal::NameOfEnum( NullValue_descriptor(), value); } inline bool NullValue_Parse( const ::std::string& name, NullValue* value) { return ::google::protobuf::internal::ParseNamedEnum( NullValue_descriptor(), name, value); } // =================================================================== class Struct_FieldsEntry_DoNotUse : public ::google::protobuf::internal::MapEntry { public: typedef ::google::protobuf::internal::MapEntry SuperType; Struct_FieldsEntry_DoNotUse(); Struct_FieldsEntry_DoNotUse(::google::protobuf::Arena* arena); void MergeFrom(const Struct_FieldsEntry_DoNotUse& other); static const Struct_FieldsEntry_DoNotUse* internal_default_instance() { return reinterpret_cast(&_Struct_FieldsEntry_DoNotUse_default_instance_); } void MergeFrom(const ::google::protobuf::Message& other) PROTOBUF_FINAL; ::google::protobuf::Metadata GetMetadata() const; }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT Struct : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Struct) */ { public: Struct(); virtual ~Struct(); Struct(const Struct& from); inline Struct& operator=(const Struct& from) { CopyFrom(from); return *this; } #if LANG_CXX11 Struct(Struct&& from) noexcept : Struct() { *this = ::std::move(from); } inline Struct& operator=(Struct&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const Struct& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const Struct* internal_default_instance() { return reinterpret_cast( &_Struct_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 1; void UnsafeArenaSwap(Struct* other); void Swap(Struct* other); friend void swap(Struct& a, Struct& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline Struct* New() const PROTOBUF_FINAL { return New(NULL); } Struct* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const Struct& from); void MergeFrom(const Struct& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(Struct* other); protected: explicit Struct(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // map fields = 1; int fields_size() const; void clear_fields(); static const int kFieldsFieldNumber = 1; const ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >& fields() const; ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >* mutable_fields(); // @@protoc_insertion_point(class_scope:google.protobuf.Struct) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::internal::MapField< Struct_FieldsEntry_DoNotUse, ::std::string, ::google::protobuf::Value, ::google::protobuf::internal::WireFormatLite::TYPE_STRING, ::google::protobuf::internal::WireFormatLite::TYPE_MESSAGE, 0 > fields_; mutable int _cached_size_; friend struct ::protobuf_google_2fprotobuf_2fstruct_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValueImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT Value : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Value) */ { public: Value(); virtual ~Value(); Value(const Value& from); inline Value& operator=(const Value& from) { CopyFrom(from); return *this; } #if LANG_CXX11 Value(Value&& from) noexcept : Value() { *this = ::std::move(from); } inline Value& operator=(Value&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const Value& default_instance(); enum KindCase { kNullValue = 1, kNumberValue = 2, kStringValue = 3, kBoolValue = 4, kStructValue = 5, kListValue = 6, KIND_NOT_SET = 0, }; static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const Value* internal_default_instance() { return reinterpret_cast( &_Value_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 2; void UnsafeArenaSwap(Value* other); void Swap(Value* other); friend void swap(Value& a, Value& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline Value* New() const PROTOBUF_FINAL { return New(NULL); } Value* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const Value& from); void MergeFrom(const Value& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(Value* other); protected: explicit Value(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // .google.protobuf.NullValue null_value = 1; private: bool has_null_value() const; public: void clear_null_value(); static const int kNullValueFieldNumber = 1; ::google::protobuf::NullValue null_value() const; void set_null_value(::google::protobuf::NullValue value); // double number_value = 2; private: bool has_number_value() const; public: void clear_number_value(); static const int kNumberValueFieldNumber = 2; double number_value() const; void set_number_value(double value); // string string_value = 3; private: bool has_string_value() const; public: void clear_string_value(); static const int kStringValueFieldNumber = 3; const ::std::string& string_value() const; void set_string_value(const ::std::string& value); #if LANG_CXX11 void set_string_value(::std::string&& value); #endif void set_string_value(const char* value); void set_string_value(const char* value, size_t size); ::std::string* mutable_string_value(); ::std::string* release_string_value(); void set_allocated_string_value(::std::string* string_value); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") ::std::string* unsafe_arena_release_string_value(); PROTOBUF_RUNTIME_DEPRECATED("The unsafe_arena_ accessors for" " string fields are deprecated and will be removed in a" " future release.") void unsafe_arena_set_allocated_string_value( ::std::string* string_value); // bool bool_value = 4; private: bool has_bool_value() const; public: void clear_bool_value(); static const int kBoolValueFieldNumber = 4; bool bool_value() const; void set_bool_value(bool value); // .google.protobuf.Struct struct_value = 5; bool has_struct_value() const; void clear_struct_value(); static const int kStructValueFieldNumber = 5; private: void _slow_mutable_struct_value(); public: const ::google::protobuf::Struct& struct_value() const; ::google::protobuf::Struct* release_struct_value(); ::google::protobuf::Struct* mutable_struct_value(); void set_allocated_struct_value(::google::protobuf::Struct* struct_value); void unsafe_arena_set_allocated_struct_value( ::google::protobuf::Struct* struct_value); ::google::protobuf::Struct* unsafe_arena_release_struct_value(); // .google.protobuf.ListValue list_value = 6; bool has_list_value() const; void clear_list_value(); static const int kListValueFieldNumber = 6; private: void _slow_mutable_list_value(); public: const ::google::protobuf::ListValue& list_value() const; ::google::protobuf::ListValue* release_list_value(); ::google::protobuf::ListValue* mutable_list_value(); void set_allocated_list_value(::google::protobuf::ListValue* list_value); void unsafe_arena_set_allocated_list_value( ::google::protobuf::ListValue* list_value); ::google::protobuf::ListValue* unsafe_arena_release_list_value(); KindCase kind_case() const; // @@protoc_insertion_point(class_scope:google.protobuf.Value) private: void set_has_null_value(); void set_has_number_value(); void set_has_string_value(); void set_has_bool_value(); void set_has_struct_value(); void set_has_list_value(); inline bool has_kind() const; void clear_kind(); inline void clear_has_kind(); ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; union KindUnion { KindUnion() {} int null_value_; double number_value_; ::google::protobuf::internal::ArenaStringPtr string_value_; bool bool_value_; ::google::protobuf::Struct* struct_value_; ::google::protobuf::ListValue* list_value_; } kind_; mutable int _cached_size_; ::google::protobuf::uint32 _oneof_case_[1]; friend struct ::protobuf_google_2fprotobuf_2fstruct_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValueImpl(); }; // ------------------------------------------------------------------- class LIBPROTOBUF_EXPORT ListValue : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.ListValue) */ { public: ListValue(); virtual ~ListValue(); ListValue(const ListValue& from); inline ListValue& operator=(const ListValue& from) { CopyFrom(from); return *this; } #if LANG_CXX11 ListValue(ListValue&& from) noexcept : ListValue() { *this = ::std::move(from); } inline ListValue& operator=(ListValue&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const ListValue& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const ListValue* internal_default_instance() { return reinterpret_cast( &_ListValue_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 3; void UnsafeArenaSwap(ListValue* other); void Swap(ListValue* other); friend void swap(ListValue& a, ListValue& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline ListValue* New() const PROTOBUF_FINAL { return New(NULL); } ListValue* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const ListValue& from); void MergeFrom(const ListValue& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(ListValue* other); protected: explicit ListValue(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // repeated .google.protobuf.Value values = 1; int values_size() const; void clear_values(); static const int kValuesFieldNumber = 1; const ::google::protobuf::Value& values(int index) const; ::google::protobuf::Value* mutable_values(int index); ::google::protobuf::Value* add_values(); ::google::protobuf::RepeatedPtrField< ::google::protobuf::Value >* mutable_values(); const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Value >& values() const; // @@protoc_insertion_point(class_scope:google.protobuf.ListValue) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::RepeatedPtrField< ::google::protobuf::Value > values_; mutable int _cached_size_; friend struct ::protobuf_google_2fprotobuf_2fstruct_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2fstruct_2eproto::InitDefaultsListValueImpl(); }; // =================================================================== // =================================================================== #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif // __GNUC__ // ------------------------------------------------------------------- // Struct // map fields = 1; inline int Struct::fields_size() const { return fields_.size(); } inline void Struct::clear_fields() { fields_.Clear(); } inline const ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >& Struct::fields() const { // @@protoc_insertion_point(field_map:google.protobuf.Struct.fields) return fields_.GetMap(); } inline ::google::protobuf::Map< ::std::string, ::google::protobuf::Value >* Struct::mutable_fields() { // @@protoc_insertion_point(field_mutable_map:google.protobuf.Struct.fields) return fields_.MutableMap(); } // ------------------------------------------------------------------- // Value // .google.protobuf.NullValue null_value = 1; inline bool Value::has_null_value() const { return kind_case() == kNullValue; } inline void Value::set_has_null_value() { _oneof_case_[0] = kNullValue; } inline void Value::clear_null_value() { if (has_null_value()) { kind_.null_value_ = 0; clear_has_kind(); } } inline ::google::protobuf::NullValue Value::null_value() const { // @@protoc_insertion_point(field_get:google.protobuf.Value.null_value) if (has_null_value()) { return static_cast< ::google::protobuf::NullValue >(kind_.null_value_); } return static_cast< ::google::protobuf::NullValue >(0); } inline void Value::set_null_value(::google::protobuf::NullValue value) { if (!has_null_value()) { clear_kind(); set_has_null_value(); } kind_.null_value_ = value; // @@protoc_insertion_point(field_set:google.protobuf.Value.null_value) } // double number_value = 2; inline bool Value::has_number_value() const { return kind_case() == kNumberValue; } inline void Value::set_has_number_value() { _oneof_case_[0] = kNumberValue; } inline void Value::clear_number_value() { if (has_number_value()) { kind_.number_value_ = 0; clear_has_kind(); } } inline double Value::number_value() const { // @@protoc_insertion_point(field_get:google.protobuf.Value.number_value) if (has_number_value()) { return kind_.number_value_; } return 0; } inline void Value::set_number_value(double value) { if (!has_number_value()) { clear_kind(); set_has_number_value(); } kind_.number_value_ = value; // @@protoc_insertion_point(field_set:google.protobuf.Value.number_value) } // string string_value = 3; inline bool Value::has_string_value() const { return kind_case() == kStringValue; } inline void Value::set_has_string_value() { _oneof_case_[0] = kStringValue; } inline void Value::clear_string_value() { if (has_string_value()) { kind_.string_value_.Destroy(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); clear_has_kind(); } } inline const ::std::string& Value::string_value() const { // @@protoc_insertion_point(field_get:google.protobuf.Value.string_value) if (has_string_value()) { return kind_.string_value_.Get(); } return *&::google::protobuf::internal::GetEmptyStringAlreadyInited(); } inline void Value::set_string_value(const ::std::string& value) { if (!has_string_value()) { clear_kind(); set_has_string_value(); kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } kind_.string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value, GetArenaNoVirtual()); // @@protoc_insertion_point(field_set:google.protobuf.Value.string_value) } #if LANG_CXX11 inline void Value::set_string_value(::std::string&& value) { // @@protoc_insertion_point(field_set:google.protobuf.Value.string_value) if (!has_string_value()) { clear_kind(); set_has_string_value(); kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } kind_.string_value_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_rvalue:google.protobuf.Value.string_value) } #endif inline void Value::set_string_value(const char* value) { GOOGLE_DCHECK(value != NULL); if (!has_string_value()) { clear_kind(); set_has_string_value(); kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } kind_.string_value_.Set(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_char:google.protobuf.Value.string_value) } inline void Value::set_string_value(const char* value, size_t size) { if (!has_string_value()) { clear_kind(); set_has_string_value(); kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } kind_.string_value_.Set( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string( reinterpret_cast(value), size), GetArenaNoVirtual()); // @@protoc_insertion_point(field_set_pointer:google.protobuf.Value.string_value) } inline ::std::string* Value::mutable_string_value() { if (!has_string_value()) { clear_kind(); set_has_string_value(); kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } return kind_.string_value_.Mutable(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); // @@protoc_insertion_point(field_mutable:google.protobuf.Value.string_value) } inline ::std::string* Value::release_string_value() { // @@protoc_insertion_point(field_release:google.protobuf.Value.string_value) if (has_string_value()) { clear_has_kind(); return kind_.string_value_.Release(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } else { return NULL; } } inline void Value::set_allocated_string_value(::std::string* string_value) { if (!has_string_value()) { kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } clear_kind(); if (string_value != NULL) { set_has_string_value(); kind_.string_value_.SetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), string_value, GetArenaNoVirtual()); } // @@protoc_insertion_point(field_set_allocated:google.protobuf.Value.string_value) } inline ::std::string* Value::unsafe_arena_release_string_value() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Value.string_value) GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (has_string_value()) { clear_has_kind(); return kind_.string_value_.UnsafeArenaRelease( &::google::protobuf::internal::GetEmptyStringAlreadyInited(), GetArenaNoVirtual()); } else { return NULL; } } inline void Value::unsafe_arena_set_allocated_string_value(::std::string* string_value) { GOOGLE_DCHECK(GetArenaNoVirtual() != NULL); if (!has_string_value()) { kind_.string_value_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); } clear_kind(); if (string_value) { set_has_string_value(); kind_.string_value_.UnsafeArenaSetAllocated(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), string_value, GetArenaNoVirtual()); } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Value.string_value) } // bool bool_value = 4; inline bool Value::has_bool_value() const { return kind_case() == kBoolValue; } inline void Value::set_has_bool_value() { _oneof_case_[0] = kBoolValue; } inline void Value::clear_bool_value() { if (has_bool_value()) { kind_.bool_value_ = false; clear_has_kind(); } } inline bool Value::bool_value() const { // @@protoc_insertion_point(field_get:google.protobuf.Value.bool_value) if (has_bool_value()) { return kind_.bool_value_; } return false; } inline void Value::set_bool_value(bool value) { if (!has_bool_value()) { clear_kind(); set_has_bool_value(); } kind_.bool_value_ = value; // @@protoc_insertion_point(field_set:google.protobuf.Value.bool_value) } // .google.protobuf.Struct struct_value = 5; inline bool Value::has_struct_value() const { return kind_case() == kStructValue; } inline void Value::set_has_struct_value() { _oneof_case_[0] = kStructValue; } inline void Value::clear_struct_value() { if (has_struct_value()) { if (GetArenaNoVirtual() == NULL) { delete kind_.struct_value_; } clear_has_kind(); } } inline ::google::protobuf::Struct* Value::release_struct_value() { // @@protoc_insertion_point(field_release:google.protobuf.Value.struct_value) if (has_struct_value()) { clear_has_kind(); ::google::protobuf::Struct* temp = kind_.struct_value_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } kind_.struct_value_ = NULL; return temp; } else { return NULL; } } inline const ::google::protobuf::Struct& Value::struct_value() const { // @@protoc_insertion_point(field_get:google.protobuf.Value.struct_value) return has_struct_value() ? *kind_.struct_value_ : *reinterpret_cast< ::google::protobuf::Struct*>(&::google::protobuf::_Struct_default_instance_); } inline ::google::protobuf::Struct* Value::unsafe_arena_release_struct_value() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Value.struct_value) if (has_struct_value()) { clear_has_kind(); ::google::protobuf::Struct* temp = kind_.struct_value_; kind_.struct_value_ = NULL; return temp; } else { return NULL; } } inline void Value::unsafe_arena_set_allocated_struct_value(::google::protobuf::Struct* struct_value) { clear_kind(); if (struct_value) { set_has_struct_value(); kind_.struct_value_ = struct_value; } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Value.struct_value) } inline ::google::protobuf::Struct* Value::mutable_struct_value() { if (!has_struct_value()) { clear_kind(); set_has_struct_value(); kind_.struct_value_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::Struct >( GetArenaNoVirtual()); } // @@protoc_insertion_point(field_mutable:google.protobuf.Value.struct_value) return kind_.struct_value_; } // .google.protobuf.ListValue list_value = 6; inline bool Value::has_list_value() const { return kind_case() == kListValue; } inline void Value::set_has_list_value() { _oneof_case_[0] = kListValue; } inline void Value::clear_list_value() { if (has_list_value()) { if (GetArenaNoVirtual() == NULL) { delete kind_.list_value_; } clear_has_kind(); } } inline ::google::protobuf::ListValue* Value::release_list_value() { // @@protoc_insertion_point(field_release:google.protobuf.Value.list_value) if (has_list_value()) { clear_has_kind(); ::google::protobuf::ListValue* temp = kind_.list_value_; if (GetArenaNoVirtual() != NULL) { temp = ::google::protobuf::internal::DuplicateIfNonNull(temp, NULL); } kind_.list_value_ = NULL; return temp; } else { return NULL; } } inline const ::google::protobuf::ListValue& Value::list_value() const { // @@protoc_insertion_point(field_get:google.protobuf.Value.list_value) return has_list_value() ? *kind_.list_value_ : *reinterpret_cast< ::google::protobuf::ListValue*>(&::google::protobuf::_ListValue_default_instance_); } inline ::google::protobuf::ListValue* Value::unsafe_arena_release_list_value() { // @@protoc_insertion_point(field_unsafe_arena_release:google.protobuf.Value.list_value) if (has_list_value()) { clear_has_kind(); ::google::protobuf::ListValue* temp = kind_.list_value_; kind_.list_value_ = NULL; return temp; } else { return NULL; } } inline void Value::unsafe_arena_set_allocated_list_value(::google::protobuf::ListValue* list_value) { clear_kind(); if (list_value) { set_has_list_value(); kind_.list_value_ = list_value; } // @@protoc_insertion_point(field_unsafe_arena_set_allocated:google.protobuf.Value.list_value) } inline ::google::protobuf::ListValue* Value::mutable_list_value() { if (!has_list_value()) { clear_kind(); set_has_list_value(); kind_.list_value_ = ::google::protobuf::Arena::CreateMessage< ::google::protobuf::ListValue >( GetArenaNoVirtual()); } // @@protoc_insertion_point(field_mutable:google.protobuf.Value.list_value) return kind_.list_value_; } inline bool Value::has_kind() const { return kind_case() != KIND_NOT_SET; } inline void Value::clear_has_kind() { _oneof_case_[0] = KIND_NOT_SET; } inline Value::KindCase Value::kind_case() const { return Value::KindCase(_oneof_case_[0]); } // ------------------------------------------------------------------- // ListValue // repeated .google.protobuf.Value values = 1; inline int ListValue::values_size() const { return values_.size(); } inline void ListValue::clear_values() { values_.Clear(); } inline const ::google::protobuf::Value& ListValue::values(int index) const { // @@protoc_insertion_point(field_get:google.protobuf.ListValue.values) return values_.Get(index); } inline ::google::protobuf::Value* ListValue::mutable_values(int index) { // @@protoc_insertion_point(field_mutable:google.protobuf.ListValue.values) return values_.Mutable(index); } inline ::google::protobuf::Value* ListValue::add_values() { // @@protoc_insertion_point(field_add:google.protobuf.ListValue.values) return values_.Add(); } inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::Value >* ListValue::mutable_values() { // @@protoc_insertion_point(field_mutable_list:google.protobuf.ListValue.values) return &values_; } inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::Value >& ListValue::values() const { // @@protoc_insertion_point(field_list:google.protobuf.ListValue.values) return values_; } #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ // ------------------------------------------------------------------- // ------------------------------------------------------------------- // ------------------------------------------------------------------- // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google namespace google { namespace protobuf { template <> struct is_proto_enum< ::google::protobuf::NullValue> : ::google::protobuf::internal::true_type {}; template <> inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::NullValue>() { return ::google::protobuf::NullValue_descriptor(); } } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) #endif // PROTOBUF_google_2fprotobuf_2fstruct_2eproto__INCLUDED python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/struct.proto000066400000000000000000000073051334102242000277070ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; option go_package = "github.com/golang/protobuf/ptypes/struct;structpb"; option java_package = "com.google.protobuf"; option java_outer_classname = "StructProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // `Struct` represents a structured data value, consisting of fields // which map to dynamically typed values. In some languages, `Struct` // might be supported by a native representation. For example, in // scripting languages like JS a struct is represented as an // object. The details of that representation are described together // with the proto support for the language. // // The JSON representation for `Struct` is JSON object. message Struct { // Unordered map of dynamically typed values. map fields = 1; } // `Value` represents a dynamically typed value which can be either // null, a number, a string, a boolean, a recursive struct value, or a // list of values. A producer of value is expected to set one of that // variants, absence of any variant indicates an error. // // The JSON representation for `Value` is JSON value. message Value { // The kind of value. oneof kind { // Represents a null value. NullValue null_value = 1; // Represents a double value. double number_value = 2; // Represents a string value. string string_value = 3; // Represents a boolean value. bool bool_value = 4; // Represents a structured value. Struct struct_value = 5; // Represents a repeated `Value`. ListValue list_value = 6; } } // `NullValue` is a singleton enumeration to represent the null value for the // `Value` type union. // // The JSON representation for `NullValue` is JSON `null`. enum NullValue { // Null value. NULL_VALUE = 0; } // `ListValue` is a wrapper around a repeated field of values. // // The JSON representation for `ListValue` is JSON array. message ListValue { // Repeated field of dynamically typed values. repeated Value values = 1; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/000077500000000000000000000000001334102242000264315ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/atomic_sequence_num.h000066400000000000000000000041701334102242000326270ustar00rootroot00000000000000// 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_ATOMIC_SEQUENCE_NUM_H_ #define GOOGLE_PROTOBUF_ATOMIC_SEQUENCE_NUM_H_ #include namespace google { namespace protobuf { namespace internal { class SequenceNumber { public: SequenceNumber() : word_(0) {} AtomicWord GetNext() { return NoBarrier_AtomicIncrement(&word_, 1) - 1; } private: AtomicWord word_; }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ATOMIC_SEQUENCE_NUM_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/atomicops.h000066400000000000000000000244271334102242000306110ustar00rootroot00000000000000// 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. // The routines exported by this module are subtle. If you use them, even if // you get the code right, it will depend on careful reasoning about atomicity // and memory ordering; it will be less readable, and harder to maintain. If // you plan to use these routines, you should have a good reason, such as solid // evidence that performance would otherwise suffer, or there being no // alternative. You should assume only properties explicitly guaranteed by the // specifications in this file. You are almost certainly _not_ writing code // just for the x86; if you assume x86 semantics, x86 hardware bugs and // implementations on other archtectures will cause your code to break. If you // do not know what you are doing, avoid these routines, and use a Mutex. // // It is incorrect to make direct assignments to/from an atomic variable. // You should use one of the Load or Store routines. The NoBarrier // versions are provided when no barriers are needed: // NoBarrier_Store() // NoBarrier_Load() // Although there are currently no compiler enforcement, you are encouraged // to use these. // This header and the implementations for each platform (located in // atomicops_internals_*) must be kept in sync with the upstream code (V8). #ifndef GOOGLE_PROTOBUF_ATOMICOPS_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_H_ // Don't include this file for people not concerned about thread safety. #ifndef GOOGLE_PROTOBUF_NO_THREAD_SAFETY #include #include namespace google { namespace protobuf { namespace internal { #ifdef GOOGLE_PROTOBUF_ARCH_32_BIT typedef intptr_t Atomic32; typedef int64 Atomic64; #else // We need to be able to go between Atomic64 and AtomicWord implicitly. This // means Atomic64 and AtomicWord should be the same type on 64-bit. #if defined(__ILP32__) || defined(GOOGLE_PROTOBUF_OS_NACL) // NaCl's intptr_t is not actually 64-bits on 64-bit! // http://code.google.com/p/nativeclient/issues/detail?id=1162 // sparcv9's pointer type is 32bits typedef intptr_t Atomic32; typedef int64 Atomic64; #else typedef int32 Atomic32; typedef intptr_t Atomic64; #endif #endif // Use AtomicWord for a machine-sized pointer. It will use the Atomic32 or // Atomic64 routines below, depending on your architecture. typedef intptr_t AtomicWord; // Atomically execute: // result = *ptr; // if (*ptr == old_value) // *ptr = new_value; // return result; // // I.e., replace "*ptr" with "new_value" if "*ptr" used to be "old_value". // Always return the old value of "*ptr" // // This routine implies no memory barriers. Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value); // Atomically store new_value into *ptr, returning the previous value held in // *ptr. This routine implies no memory barriers. Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value); // Atomically increment *ptr by "increment". Returns the new value of // *ptr with the increment applied. This routine implies no memory barriers. Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment); Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment); // These following lower-level operations are typically useful only to people // implementing higher-level synchronization operations like spinlocks, // mutexes, and condition-variables. They combine CompareAndSwap(), a load, or // a store with appropriate memory-ordering instructions. "Acquire" operations // ensure that no later memory access can be reordered ahead of the operation. // "Release" operations ensure that no previous memory access can be reordered // after the operation. "Barrier" operations have both "Acquire" and "Release" // semantics. A MemoryBarrierInternal() has "Barrier" semantics, but does no // memory access. Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value); Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value); // This function was renamed from MemoryBarrier to MemoryBarrierInternal // because MemoryBarrier is a define in Windows ARM builds and we do not // undefine it because we call it from this function. void MemoryBarrierInternal(); void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value); void Acquire_Store(volatile Atomic32* ptr, Atomic32 value); void Release_Store(volatile Atomic32* ptr, Atomic32 value); Atomic32 NoBarrier_Load(volatile const Atomic32* ptr); Atomic32 Acquire_Load(volatile const Atomic32* ptr); Atomic32 Release_Load(volatile const Atomic32* ptr); // 64-bit atomic operations (only available on 64-bit processors). #ifdef GOOGLE_PROTOBUF_ARCH_64_BIT Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value); Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value); Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment); Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment); Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value); Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value); void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value); void Acquire_Store(volatile Atomic64* ptr, Atomic64 value); void Release_Store(volatile Atomic64* ptr, Atomic64 value); Atomic64 NoBarrier_Load(volatile const Atomic64* ptr); Atomic64 Acquire_Load(volatile const Atomic64* ptr); Atomic64 Release_Load(volatile const Atomic64* ptr); #endif // GOOGLE_PROTOBUF_ARCH_64_BIT } // namespace internal } // namespace protobuf } // namespace google // Include our platform specific implementation. #define GOOGLE_PROTOBUF_ATOMICOPS_ERROR \ "Atomic operations are not supported on your platform" // ThreadSanitizer, http://clang.llvm.org/docs/ThreadSanitizer.html. #if defined(THREAD_SANITIZER) #include // MSVC. #elif defined(_MSC_VER) #if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64) || defined(GOOGLE_PROTOBUF_ARCH_ARM) #include #else #error GOOGLE_PROTOBUF_ATOMICOPS_ERROR #endif // Solaris #elif defined(GOOGLE_PROTOBUF_OS_SOLARIS) #include // AIX #elif defined(GOOGLE_PROTOBUF_OS_AIX) #include // GCC. #elif defined(__GNUC__) #if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64) #include #elif defined(GOOGLE_PROTOBUF_ARCH_ARM) && defined(__linux__) #if (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4)) #include #else #include #endif #elif defined(GOOGLE_PROTOBUF_ARCH_AARCH64) #include #elif defined(GOOGLE_PROTOBUF_ARCH_ARM_QNX) #include #elif defined(GOOGLE_PROTOBUF_ARCH_MIPS) || defined(GOOGLE_PROTOBUF_ARCH_MIPS64) #include #elif defined(GOOGLE_PROTOBUF_ARCH_POWER) #include #elif defined(__native_client__) // The static_asserts in the C++11 atomics implementation cause it to fail // with certain compilers, e.g. nvcc on macOS. Don't use elsewhere unless // the TODO in that file is addressed. #include #elif defined(GOOGLE_PROTOBUF_ARCH_PPC) #include #elif (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4)) #include #elif defined(__clang__) #if __has_extension(c_atomic) #include #else #error GOOGLE_PROTOBUF_ATOMICOPS_ERROR #endif #else #error GOOGLE_PROTOBUF_ATOMICOPS_ERROR #endif // Unknown. #else #error GOOGLE_PROTOBUF_ATOMICOPS_ERROR #endif #undef GOOGLE_PROTOBUF_ATOMICOPS_ERROR #endif // GOOGLE_PROTOBUF_NO_THREAD_SAFETY #endif // GOOGLE_PROTOBUF_ATOMICOPS_H_ atomicops_internals_arm64_gcc.h000066400000000000000000000242341334102242000344320ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// 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. // This file is an internal atomic implementation, use atomicops.h instead. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM64_GCC_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM64_GCC_H_ namespace google { namespace protobuf { namespace internal { inline void MemoryBarrierInternal() { __asm__ __volatile__ ("dmb ish" ::: "memory"); // NOLINT } // NoBarrier versions of the operation include "memory" in the clobber list. // This is not required for direct usage of the NoBarrier versions of the // operations. However this is required for correctness when they are used as // part of the Acquire or Release versions, to ensure that nothing from outside // the call is reordered between the operation and the memory barrier. This does // not change the code generated, so has no or minimal impact on the // NoBarrier operations. inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 prev; int32_t temp; __asm__ __volatile__ ( // NOLINT "0: \n\t" "ldxr %w[prev], %[ptr] \n\t" // Load the previous value. "cmp %w[prev], %w[old_value] \n\t" "bne 1f \n\t" "stxr %w[temp], %w[new_value], %[ptr] \n\t" // Try to store the new value. "cbnz %w[temp], 0b \n\t" // Retry if it did not work. "1: \n\t" : [prev]"=&r" (prev), [temp]"=&r" (temp), [ptr]"+Q" (*ptr) : [old_value]"IJr" (old_value), [new_value]"r" (new_value) : "cc", "memory" ); // NOLINT return prev; } inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value) { Atomic32 result; int32_t temp; __asm__ __volatile__ ( // NOLINT "0: \n\t" "ldxr %w[result], %[ptr] \n\t" // Load the previous value. "stxr %w[temp], %w[new_value], %[ptr] \n\t" // Try to store the new value. "cbnz %w[temp], 0b \n\t" // Retry if it did not work. : [result]"=&r" (result), [temp]"=&r" (temp), [ptr]"+Q" (*ptr) : [new_value]"r" (new_value) : "memory" ); // NOLINT return result; } inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { Atomic32 result; int32_t temp; __asm__ __volatile__ ( // NOLINT "0: \n\t" "ldxr %w[result], %[ptr] \n\t" // Load the previous value. "add %w[result], %w[result], %w[increment]\n\t" "stxr %w[temp], %w[result], %[ptr] \n\t" // Try to store the result. "cbnz %w[temp], 0b \n\t" // Retry on failure. : [result]"=&r" (result), [temp]"=&r" (temp), [ptr]"+Q" (*ptr) : [increment]"IJr" (increment) : "memory" ); // NOLINT return result; } inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { MemoryBarrierInternal(); Atomic32 result = NoBarrier_AtomicIncrement(ptr, increment); MemoryBarrierInternal(); return result; } inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value); MemoryBarrierInternal(); return prev; } inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { MemoryBarrierInternal(); Atomic32 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value); return prev; } inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; } inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; MemoryBarrierInternal(); } inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { __asm__ __volatile__ ( // NOLINT "stlr %w[value], %[ptr] \n\t" : [ptr]"=Q" (*ptr) : [value]"r" (value) : "memory" ); // NOLINT } inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return *ptr; } inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { Atomic32 value; __asm__ __volatile__ ( // NOLINT "ldar %w[value], %[ptr] \n\t" : [value]"=r" (value) : [ptr]"Q" (*ptr) : "memory" ); // NOLINT return value; } inline Atomic32 Release_Load(volatile const Atomic32* ptr) { MemoryBarrierInternal(); return *ptr; } // 64-bit versions of the operations. // See the 32-bit versions for comments. inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 prev; int32_t temp; __asm__ __volatile__ ( // NOLINT "0: \n\t" "ldxr %[prev], %[ptr] \n\t" "cmp %[prev], %[old_value] \n\t" "bne 1f \n\t" "stxr %w[temp], %[new_value], %[ptr] \n\t" "cbnz %w[temp], 0b \n\t" "1: \n\t" : [prev]"=&r" (prev), [temp]"=&r" (temp), [ptr]"+Q" (*ptr) : [old_value]"IJr" (old_value), [new_value]"r" (new_value) : "cc", "memory" ); // NOLINT return prev; } inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value) { Atomic64 result; int32_t temp; __asm__ __volatile__ ( // NOLINT "0: \n\t" "ldxr %[result], %[ptr] \n\t" "stxr %w[temp], %[new_value], %[ptr] \n\t" "cbnz %w[temp], 0b \n\t" : [result]"=&r" (result), [temp]"=&r" (temp), [ptr]"+Q" (*ptr) : [new_value]"r" (new_value) : "memory" ); // NOLINT return result; } inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { Atomic64 result; int32_t temp; __asm__ __volatile__ ( // NOLINT "0: \n\t" "ldxr %[result], %[ptr] \n\t" "add %[result], %[result], %[increment] \n\t" "stxr %w[temp], %[result], %[ptr] \n\t" "cbnz %w[temp], 0b \n\t" : [result]"=&r" (result), [temp]"=&r" (temp), [ptr]"+Q" (*ptr) : [increment]"IJr" (increment) : "memory" ); // NOLINT return result; } inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { MemoryBarrierInternal(); Atomic64 result = NoBarrier_AtomicIncrement(ptr, increment); MemoryBarrierInternal(); return result; } inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value); MemoryBarrierInternal(); return prev; } inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { MemoryBarrierInternal(); Atomic64 prev = NoBarrier_CompareAndSwap(ptr, old_value, new_value); return prev; } inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { *ptr = value; } inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { *ptr = value; MemoryBarrierInternal(); } inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { __asm__ __volatile__ ( // NOLINT "stlr %x[value], %[ptr] \n\t" : [ptr]"=Q" (*ptr) : [value]"r" (value) : "memory" ); // NOLINT } inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { return *ptr; } inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { Atomic64 value; __asm__ __volatile__ ( // NOLINT "ldar %x[value], %[ptr] \n\t" : [value]"=r" (value) : [ptr]"Q" (*ptr) : "memory" ); // NOLINT return value; } inline Atomic64 Release_Load(volatile const Atomic64* ptr) { MemoryBarrierInternal(); return *ptr; } } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM64_GCC_H_ atomicops_internals_arm_gcc.h000066400000000000000000000127621334102242000342630ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// 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. // This file is an internal atomic implementation, use atomicops.h instead. // // LinuxKernelCmpxchg and Barrier_AtomicIncrement are from Google Gears. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_GCC_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_GCC_H_ namespace google { namespace protobuf { namespace internal { // 0xffff0fc0 is the hard coded address of a function provided by // the kernel which implements an atomic compare-exchange. On older // ARM architecture revisions (pre-v6) this may be implemented using // a syscall. This address is stable, and in active use (hard coded) // by at least glibc-2.7 and the Android C library. typedef Atomic32 (*LinuxKernelCmpxchgFunc)(Atomic32 old_value, Atomic32 new_value, volatile Atomic32* ptr); LinuxKernelCmpxchgFunc pLinuxKernelCmpxchg __attribute__((weak)) = (LinuxKernelCmpxchgFunc) 0xffff0fc0; typedef void (*LinuxKernelMemoryBarrierFunc)(void); LinuxKernelMemoryBarrierFunc pLinuxKernelMemoryBarrier __attribute__((weak)) = (LinuxKernelMemoryBarrierFunc) 0xffff0fa0; inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 prev_value = *ptr; do { if (!pLinuxKernelCmpxchg(old_value, new_value, const_cast(ptr))) { return old_value; } prev_value = *ptr; } while (prev_value == old_value); return prev_value; } inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value) { Atomic32 old_value; do { old_value = *ptr; } while (pLinuxKernelCmpxchg(old_value, new_value, const_cast(ptr))); return old_value; } inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { return Barrier_AtomicIncrement(ptr, increment); } inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { for (;;) { // Atomic exchange the old value with an incremented one. Atomic32 old_value = *ptr; Atomic32 new_value = old_value + increment; if (pLinuxKernelCmpxchg(old_value, new_value, const_cast(ptr)) == 0) { // The exchange took place as expected. return new_value; } // Otherwise, *ptr changed mid-loop and we need to retry. } } inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; } inline void MemoryBarrierInternal() { pLinuxKernelMemoryBarrier(); } inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; MemoryBarrierInternal(); } inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { MemoryBarrierInternal(); *ptr = value; } inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return *ptr; } inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { Atomic32 value = *ptr; MemoryBarrierInternal(); return value; } inline Atomic32 Release_Load(volatile const Atomic32* ptr) { MemoryBarrierInternal(); return *ptr; } } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_GCC_H_ atomicops_internals_arm_qnx.h000066400000000000000000000116441334102242000343330ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// 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. // This file is an internal atomic implementation, use atomicops.h instead. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ // For _smp_cmpxchg() #include namespace google { namespace protobuf { namespace internal { inline Atomic32 QNXCmpxchg(Atomic32 old_value, Atomic32 new_value, volatile Atomic32* ptr) { return static_cast( _smp_cmpxchg((volatile unsigned *)ptr, (unsigned)old_value, (unsigned)new_value)); } inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 prev_value = *ptr; do { if (!QNXCmpxchg(old_value, new_value, const_cast(ptr))) { return old_value; } prev_value = *ptr; } while (prev_value == old_value); return prev_value; } inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value) { Atomic32 old_value; do { old_value = *ptr; } while (QNXCmpxchg(old_value, new_value, const_cast(ptr))); return old_value; } inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { return Barrier_AtomicIncrement(ptr, increment); } inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { for (;;) { // Atomic exchange the old value with an incremented one. Atomic32 old_value = *ptr; Atomic32 new_value = old_value + increment; if (QNXCmpxchg(old_value, new_value, const_cast(ptr)) == 0) { // The exchange took place as expected. return new_value; } // Otherwise, *ptr changed mid-loop and we need to retry. } } inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; } inline void MemoryBarrierInternal() { __sync_synchronize(); } inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; MemoryBarrierInternal(); } inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { MemoryBarrierInternal(); *ptr = value; } inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return *ptr; } inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { Atomic32 value = *ptr; MemoryBarrierInternal(); return value; } inline Atomic32 Release_Load(volatile const Atomic32* ptr) { MemoryBarrierInternal(); return *ptr; } } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_ARM_QNX_H_ atomicops_internals_generic_c11_atomic.h000066400000000000000000000216561334102242000363060ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// 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. // This file is an internal atomic implementation, use atomicops.h instead. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_C11_ATOMIC_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_C11_ATOMIC_H_ #include namespace google { namespace protobuf { namespace internal { // This implementation is transitional and maintains the original API for // atomicops.h. This requires casting memory locations to the atomic types, and // assumes that the API and the C++11 implementation are layout-compatible, // which isn't true for all implementations or hardware platforms. The static // assertion should detect this issue, were it to fire then this header // shouldn't be used. // // TODO(jfb) If this header manages to stay committed then the API should be // modified, and all call sites updated. typedef volatile std::atomic* AtomicLocation32; static_assert(sizeof(*(AtomicLocation32) nullptr) == sizeof(Atomic32), "incompatible 32-bit atomic layout"); inline void MemoryBarrierInternal() { #if defined(__GLIBCXX__) // Work around libstdc++ bug 51038 where atomic_thread_fence was declared but // not defined, leading to the linker complaining about undefined references. __atomic_thread_fence(std::memory_order_seq_cst); #else std::atomic_thread_fence(std::memory_order_seq_cst); #endif } inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { ((AtomicLocation32)ptr) ->compare_exchange_strong(old_value, new_value, std::memory_order_relaxed, std::memory_order_relaxed); return old_value; } inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value) { return ((AtomicLocation32)ptr) ->exchange(new_value, std::memory_order_relaxed); } inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { return increment + ((AtomicLocation32)ptr) ->fetch_add(increment, std::memory_order_relaxed); } inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { return increment + ((AtomicLocation32)ptr)->fetch_add(increment); } inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { ((AtomicLocation32)ptr) ->compare_exchange_strong(old_value, new_value, std::memory_order_acquire, std::memory_order_acquire); return old_value; } inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { ((AtomicLocation32)ptr) ->compare_exchange_strong(old_value, new_value, std::memory_order_release, std::memory_order_relaxed); return old_value; } inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { ((AtomicLocation32)ptr)->store(value, std::memory_order_relaxed); } inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { ((AtomicLocation32)ptr)->store(value, std::memory_order_relaxed); MemoryBarrierInternal(); } inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { ((AtomicLocation32)ptr)->store(value, std::memory_order_release); } inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return ((AtomicLocation32)ptr)->load(std::memory_order_relaxed); } inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { return ((AtomicLocation32)ptr)->load(std::memory_order_acquire); } inline Atomic32 Release_Load(volatile const Atomic32* ptr) { MemoryBarrierInternal(); return ((AtomicLocation32)ptr)->load(std::memory_order_relaxed); } #if defined(GOOGLE_PROTOBUF_ARCH_64_BIT) typedef volatile std::atomic* AtomicLocation64; static_assert(sizeof(*(AtomicLocation64) nullptr) == sizeof(Atomic64), "incompatible 64-bit atomic layout"); inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { ((AtomicLocation64)ptr) ->compare_exchange_strong(old_value, new_value, std::memory_order_relaxed, std::memory_order_relaxed); return old_value; } inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value) { return ((AtomicLocation64)ptr) ->exchange(new_value, std::memory_order_relaxed); } inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { return increment + ((AtomicLocation64)ptr) ->fetch_add(increment, std::memory_order_relaxed); } inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { return increment + ((AtomicLocation64)ptr)->fetch_add(increment); } inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { ((AtomicLocation64)ptr) ->compare_exchange_strong(old_value, new_value, std::memory_order_acquire, std::memory_order_acquire); return old_value; } inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { ((AtomicLocation64)ptr) ->compare_exchange_strong(old_value, new_value, std::memory_order_release, std::memory_order_relaxed); return old_value; } inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { ((AtomicLocation64)ptr)->store(value, std::memory_order_relaxed); } inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { ((AtomicLocation64)ptr)->store(value, std::memory_order_relaxed); MemoryBarrierInternal(); } inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { ((AtomicLocation64)ptr)->store(value, std::memory_order_release); } inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { return ((AtomicLocation64)ptr)->load(std::memory_order_relaxed); } inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { return ((AtomicLocation64)ptr)->load(std::memory_order_acquire); } inline Atomic64 Release_Load(volatile const Atomic64* ptr) { MemoryBarrierInternal(); return ((AtomicLocation64)ptr)->load(std::memory_order_relaxed); } #endif // defined(GOOGLE_PROTOBUF_ARCH_64_BIT) } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_C11_ATOMIC_H_ atomicops_internals_generic_gcc.h000066400000000000000000000134331334102242000351140ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// Copyright 2013 Red Hat 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 Red Hat 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 is an internal atomic implementation, use atomicops.h instead. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_GCC_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_GCC_H_ namespace google { namespace protobuf { namespace internal { inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { __atomic_compare_exchange_n(ptr, &old_value, new_value, false, __ATOMIC_RELAXED, __ATOMIC_RELAXED); return old_value; } inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value) { return __atomic_exchange_n(ptr, new_value, __ATOMIC_RELAXED); } inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { return __atomic_add_fetch(ptr, increment, __ATOMIC_RELAXED); } inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { return __atomic_add_fetch(ptr, increment, __ATOMIC_SEQ_CST); } inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { __atomic_compare_exchange_n(ptr, &old_value, new_value, false, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); return old_value; } inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { __atomic_compare_exchange_n(ptr, &old_value, new_value, false, __ATOMIC_RELEASE, __ATOMIC_ACQUIRE); return old_value; } inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { __atomic_store_n(ptr, value, __ATOMIC_RELAXED); } inline void MemoryBarrierInternal() { __sync_synchronize(); } inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { __atomic_store_n(ptr, value, __ATOMIC_SEQ_CST); } inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { __atomic_store_n(ptr, value, __ATOMIC_RELEASE); } inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return __atomic_load_n(ptr, __ATOMIC_RELAXED); } inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { return __atomic_load_n(ptr, __ATOMIC_ACQUIRE); } inline Atomic32 Release_Load(volatile const Atomic32* ptr) { return __atomic_load_n(ptr, __ATOMIC_SEQ_CST); } #ifdef __LP64__ inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { __atomic_store_n(ptr, value, __ATOMIC_RELEASE); } inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { return __atomic_load_n(ptr, __ATOMIC_ACQUIRE); } inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { __atomic_compare_exchange_n(ptr, &old_value, new_value, false, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE); return old_value; } inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { __atomic_compare_exchange_n(ptr, &old_value, new_value, false, __ATOMIC_RELAXED, __ATOMIC_RELAXED); return old_value; } inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { return __atomic_add_fetch(ptr, increment, __ATOMIC_RELAXED); } inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { __atomic_store_n(ptr, value, __ATOMIC_RELAXED); } inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value) { return __atomic_exchange_n(ptr, new_value, __ATOMIC_RELAXED); } inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { return __atomic_load_n(ptr, __ATOMIC_RELAXED); } #endif // defined(__LP64__) } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_GENERIC_GCC_H_ atomicops_internals_mips_gcc.h000066400000000000000000000274721334102242000344600ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// 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. // This file is an internal atomic implementation, use atomicops.h instead. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MIPS_GCC_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MIPS_GCC_H_ #define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory") namespace google { namespace protobuf { namespace internal { // Atomically execute: // result = *ptr; // if (*ptr == old_value) // *ptr = new_value; // return result; // // I.e., replace "*ptr" with "new_value" if "*ptr" used to be "old_value". // Always return the old value of "*ptr" // // This routine implies no memory barriers. inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 prev, tmp; __asm__ __volatile__(".set push\n" ".set noreorder\n" "1:\n" "ll %0, %5\n" // prev = *ptr "bne %0, %3, 2f\n" // if (prev != old_value) goto 2 "move %2, %4\n" // tmp = new_value "sc %2, %1\n" // *ptr = tmp (with atomic check) "beqz %2, 1b\n" // start again on atomic error "nop\n" // delay slot nop "2:\n" ".set pop\n" : "=&r" (prev), "=m" (*ptr), "=&r" (tmp) : "r" (old_value), "r" (new_value), "m" (*ptr) : "memory"); return prev; } // Atomically store new_value into *ptr, returning the previous value held in // *ptr. This routine implies no memory barriers. inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value) { Atomic32 temp, old; __asm__ __volatile__(".set push\n" ".set noreorder\n" "1:\n" "ll %1, %4\n" // old = *ptr "move %0, %3\n" // temp = new_value "sc %0, %2\n" // *ptr = temp (with atomic check) "beqz %0, 1b\n" // start again on atomic error "nop\n" // delay slot nop ".set pop\n" : "=&r" (temp), "=&r" (old), "=m" (*ptr) : "r" (new_value), "m" (*ptr) : "memory"); return old; } // Atomically increment *ptr by "increment". Returns the new value of // *ptr with the increment applied. This routine implies no memory barriers. inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { Atomic32 temp, temp2; __asm__ __volatile__(".set push\n" ".set noreorder\n" "1:\n" "ll %0, %4\n" // temp = *ptr "addu %1, %0, %3\n" // temp2 = temp + increment "sc %1, %2\n" // *ptr = temp2 (with atomic check) "beqz %1, 1b\n" // start again on atomic error "addu %1, %0, %3\n" // temp2 = temp + increment ".set pop\n" : "=&r" (temp), "=&r" (temp2), "=m" (*ptr) : "Ir" (increment), "m" (*ptr) : "memory"); // temp2 now holds the final value. return temp2; } inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { ATOMICOPS_COMPILER_BARRIER(); Atomic32 res = NoBarrier_AtomicIncrement(ptr, increment); ATOMICOPS_COMPILER_BARRIER(); return res; } // "Acquire" operations // ensure that no later memory access can be reordered ahead of the operation. // "Release" operations ensure that no previous memory access can be reordered // after the operation. "Barrier" operations have both "Acquire" and "Release" // semantics. A MemoryBarrierInternal() has "Barrier" semantics, but does no // memory access. inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { ATOMICOPS_COMPILER_BARRIER(); Atomic32 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value); ATOMICOPS_COMPILER_BARRIER(); return res; } inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { ATOMICOPS_COMPILER_BARRIER(); Atomic32 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value); ATOMICOPS_COMPILER_BARRIER(); return res; } inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; } inline void MemoryBarrierInternal() { __asm__ __volatile__("sync" : : : "memory"); } inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; MemoryBarrierInternal(); } inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { MemoryBarrierInternal(); *ptr = value; } inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return *ptr; } inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { Atomic32 value = *ptr; MemoryBarrierInternal(); return value; } inline Atomic32 Release_Load(volatile const Atomic32* ptr) { MemoryBarrierInternal(); return *ptr; } #if defined(__LP64__) // 64-bit versions of the atomic ops. inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 prev, tmp; __asm__ __volatile__(".set push\n" ".set noreorder\n" "1:\n" "lld %0, %5\n" // prev = *ptr "bne %0, %3, 2f\n" // if (prev != old_value) goto 2 "move %2, %4\n" // tmp = new_value "scd %2, %1\n" // *ptr = tmp (with atomic check) "beqz %2, 1b\n" // start again on atomic error "nop\n" // delay slot nop "2:\n" ".set pop\n" : "=&r" (prev), "=m" (*ptr), "=&r" (tmp) : "r" (old_value), "r" (new_value), "m" (*ptr) : "memory"); return prev; } // Atomically store new_value into *ptr, returning the previous value held in // *ptr. This routine implies no memory barriers. inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value) { Atomic64 temp, old; __asm__ __volatile__(".set push\n" ".set noreorder\n" "1:\n" "lld %1, %4\n" // old = *ptr "move %0, %3\n" // temp = new_value "scd %0, %2\n" // *ptr = temp (with atomic check) "beqz %0, 1b\n" // start again on atomic error "nop\n" // delay slot nop ".set pop\n" : "=&r" (temp), "=&r" (old), "=m" (*ptr) : "r" (new_value), "m" (*ptr) : "memory"); return old; } // Atomically increment *ptr by "increment". Returns the new value of // *ptr with the increment applied. This routine implies no memory barriers. inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { Atomic64 temp, temp2; __asm__ __volatile__(".set push\n" ".set noreorder\n" "1:\n" "lld %0, %4\n" // temp = *ptr "daddu %1, %0, %3\n" // temp2 = temp + increment "scd %1, %2\n" // *ptr = temp2 (with atomic check) "beqz %1, 1b\n" // start again on atomic error "daddu %1, %0, %3\n" // temp2 = temp + increment ".set pop\n" : "=&r" (temp), "=&r" (temp2), "=m" (*ptr) : "Ir" (increment), "m" (*ptr) : "memory"); // temp2 now holds the final value. return temp2; } inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { MemoryBarrierInternal(); Atomic64 res = NoBarrier_AtomicIncrement(ptr, increment); MemoryBarrierInternal(); return res; } // "Acquire" operations // ensure that no later memory access can be reordered ahead of the operation. // "Release" operations ensure that no previous memory access can be reordered // after the operation. "Barrier" operations have both "Acquire" and "Release" // semantics. A MemoryBarrierInternal() has "Barrier" semantics, but does no // memory access. inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value); MemoryBarrierInternal(); return res; } inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { MemoryBarrierInternal(); return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { *ptr = value; } inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { *ptr = value; MemoryBarrierInternal(); } inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { MemoryBarrierInternal(); *ptr = value; } inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { return *ptr; } inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { Atomic64 value = *ptr; MemoryBarrierInternal(); return value; } inline Atomic64 Release_Load(volatile const Atomic64* ptr) { MemoryBarrierInternal(); return *ptr; } #endif } // namespace internal } // namespace protobuf } // namespace google #undef ATOMICOPS_COMPILER_BARRIER #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_MIPS_GCC_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_power.h000066400000000000000000000362411334102242000341010ustar00rootroot00000000000000// Copyright 2014 Bloomberg Finance LP. 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 Bloomberg Finance LP. 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 is an internal atomic implementation, use atomicops.h instead. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_AIX_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_AIX_H_ namespace google { namespace protobuf { namespace internal { inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 result; asm volatile ( "1: lwarx %[res], %[zero], %[obj] \n\t" // load and reserve " cmpw %[cmp], %[res] \n\t" // compare values " bne- 2f \n\t" " stwcx. %[val], %[zero], %[obj] \n\t" // store new value " bne- 1b \n\t" "2: \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [cmp] "b" (old_value), [val] "b" (new_value), [zero] "i" (0) : "cr0", "ctr"); return result; } inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value) { Atomic32 result; asm volatile ( "1: lwarx %[res], %[zero], %[obj] \n\t" " stwcx. %[val], %[zero], %[obj] \n\t" " bne- 1b \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [val] "b" (new_value), [zero] "i" (0) : "cr0", "ctr"); return result; } inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { Atomic32 result; asm volatile ( "1: lwarx %[res], %[zero], %[obj] \n\t" // load and reserve " add %[res], %[val], %[res] \n\t" // add the operand " stwcx. %[res], %[zero], %[obj] \n\t" // store old value // if still reserved " bne- 1b \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [val] "b" (increment), [zero] "i" (0) : "cr0", "ctr"); return result; } inline void MemoryBarrierInternal(void) { asm volatile ( " lwsync \n\t" " isync \n\t" : : : "memory"); } inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { Atomic32 result; asm volatile ( " lwsync \n\t" "1: lwarx %[res], %[zero], %[obj] \n\t" // load and reserve " add %[res], %[val], %[res] \n\t" // add the operand " stwcx. %[res], %[zero], %[obj] \n\t" // store old value // if still reserved " bne- 1b \n\t" " isync \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [val] "b" (increment), [zero] "i" (0) : "cr0", "ctr"); return result; } inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 result; asm volatile ( "1: lwarx %[res], %[zero], %[obj] \n\t" // load and reserve " cmpw %[cmp], %[res] \n\t" // compare values " bne- 2f \n\t" " stwcx. %[val], %[zero], %[obj] \n\t" // store new value " bne- 1b \n\t" " isync \n\t" "2: \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [cmp] "b" (old_value), [val] "b" (new_value), [zero] "i" (0) : "cr0", "ctr"); return result; } inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 result; asm volatile ( " lwsync \n\t" "1: lwarx %[res], %[zero], %[obj] \n\t" // load and reserve " cmpw %[cmp], %[res] \n\t" // compare values " bne- 2f \n\t" " stwcx. %[val], %[zero], %[obj] \n\t" // store new value " bne- 1b \n\t" "2: \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [cmp] "b" (old_value), [val] "b" (new_value), [zero] "i" (0) : "cr0", "ctr"); return result; } inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; } inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { asm volatile ( " stw %[val], %[obj] \n\t" " isync \n\t" : [obj] "=m" (*ptr) : [val] "b" (value)); } inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { asm volatile ( " lwsync \n\t" " stw %[val], %[obj] \n\t" : [obj] "=m" (*ptr) : [val] "b" (value)); } inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return *ptr; } inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { Atomic32 result; asm volatile ( "1: lwz %[res], %[obj] \n\t" " cmpw %[res], %[res] \n\t" // create data // dependency for // load/load ordering " bne- 1b \n\t" // never taken " isync \n\t" : [res] "=b" (result) : [obj] "m" (*ptr), [zero] "i" (0) : "cr0", "ctr"); return result; } inline Atomic32 Release_Load(volatile const Atomic32* ptr) { Atomic32 result; asm volatile ( " lwsync \n\t" "1: lwz %[res], %[obj] \n\t" " cmpw %[res], %[res] \n\t" // create data // dependency for // load/load ordering " bne- 1b \n\t" // never taken : [res] "=b" (result) : [obj] "m" (*ptr), [zero] "i" (0) : "cr0", "ctr"); return result; } #ifdef GOOGLE_PROTOBUF_ARCH_64_BIT inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 result; asm volatile ( "1: ldarx %[res], %[zero], %[obj] \n\t" // load and reserve " cmpd %[cmp], %[res] \n\t" // compare values " bne- 2f \n\t" " stdcx. %[val], %[zero], %[obj] \n\t" // store the new value " bne- 1b \n\t" "2: \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [cmp] "b" (old_value), [val] "b" (new_value), [zero] "i" (0) : "cr0", "ctr"); return result; } inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value) { Atomic64 result; asm volatile ( "1: ldarx %[res], %[zero], %[obj] \n\t" " stdcx. %[val], %[zero], %[obj] \n\t" " bne- 1b \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [val] "b" (new_value), [zero] "i" (0) : "cr0", "ctr"); return result; } inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { Atomic64 result; asm volatile ( "1: ldarx %[res], %[zero], %[obj] \n\t" // load and reserve " add %[res], %[res], %[val] \n\t" // add the operand " stdcx. %[res], %[zero], %[obj] \n\t" // store old value if // still reserved " bne- 1b \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [val] "b" (increment), [zero] "i" (0) : "cr0", "ctr"); return result; } inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { Atomic64 result; asm volatile ( " lwsync \n\t" "1: ldarx %[res], %[zero], %[obj] \n\t" // load and reserve " add %[res], %[res], %[val] \n\t" // add the operand " stdcx. %[res], %[zero], %[obj] \n\t" // store old value if // still reserved " bne- 1b \n\t" " isync \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [val] "b" (increment), [zero] "i" (0) : "cr0", "ctr"); return result; } inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 result; asm volatile ( "1: ldarx %[res], %[zero], %[obj] \n\t" // load and reserve " cmpd %[cmp], %[res] \n\t" // compare values " bne- 2f \n\t" " stdcx. %[val], %[zero], %[obj] \n\t" // store the new value " bne- 1b \n\t" " isync \n\t" "2: \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [cmp] "b" (old_value), [val] "b" (new_value), [zero] "i" (0) : "cr0", "ctr"); return result; } inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 result; asm volatile ( " lwsync \n\t" "1: ldarx %[res], %[zero], %[obj] \n\t" // load and reserve " cmpd %[cmp], %[res] \n\t" // compare values " bne- 2f \n\t" " stdcx. %[val], %[zero], %[obj] \n\t" // store the new value " bne- 1b \n\t" "2: \n\t" : [res] "=&b" (result) : [obj] "b" (ptr), [cmp] "b" (old_value), [val] "b" (new_value), [zero] "i" (0) : "cr0", "ctr"); return result; } inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { *ptr = value; } inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { asm volatile ( " std %[val], %[obj] \n\t" " isync \n\t" : [obj] "=m" (*ptr) : [val] "b" (value)); } inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { asm volatile ( " lwsync \n\t" " std %[val], %[obj] \n\t" : [obj] "=m" (*ptr) : [val] "b" (value)); } inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { return *ptr; } inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { Atomic64 result; asm volatile ( "1: ld %[res], %[obj] \n\t" " cmpd %[res], %[res] \n\t" // create data // dependency for // load/load ordering " bne- 1b \n\t" // never taken " isync \n\t" : [res] "=b" (result) : [obj] "m" (*ptr), [zero] "i" (0) : "cr0", "ctr"); return result; } inline Atomic64 Release_Load(volatile const Atomic64* ptr) { Atomic64 result; asm volatile ( " lwsync \n\t" "1: ld %[res], %[obj] \n\t" " cmpd %[res], %[res] \n\t" // create data // dependency for // load/load ordering " bne- 1b \n\t" // never taken : [res] "=b" (result) : [obj] "m" (*ptr), [zero] "i" (0) : "cr0", "ctr"); return result; } #endif } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_SPARC_GCC_H_ atomicops_internals_ppc_gcc.h000066400000000000000000000126321334102242000342620ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// 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. // Author: ogabbay@advaoptical.com (Oded Gabbay) // Cleaned up by: bsilver16384@gmail.com (Brian Silverman) // // This file is an internal atomic implementation, use atomicops.h instead. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PPC_GCC_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PPC_GCC_H_ #define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory") namespace google { namespace protobuf { namespace internal { inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32 *ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 prev; __asm__ __volatile__( "0: \n\t" "lwarx %[prev],0,%[ptr] \n\t" "cmpw 0,%[prev],%[old_value] \n\t" "bne- 1f \n\t" "stwcx. %[new_value],0,%[ptr] \n\t" "bne- 0b \n\t" "1: \n\t" : [prev] "=&r"(prev), "+m"(*ptr) : [ptr] "r"(ptr), [old_value] "r"(old_value), [new_value] "r"(new_value) : "cc", "memory"); return prev; } inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32 *ptr, Atomic32 new_value) { Atomic32 old; __asm__ __volatile__( "0: \n\t" "lwarx %[old],0,%[ptr] \n\t" "stwcx. %[new_value],0,%[ptr] \n\t" "bne- 0b \n\t" : [old] "=&r"(old), "+m"(*ptr) : [ptr] "r"(ptr), [new_value] "r"(new_value) : "cc", "memory"); return old; } inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32 *ptr, Atomic32 increment) { Atomic32 temp; __asm__ __volatile__( "0: \n\t" "lwarx %[temp],0,%[ptr] \n\t" "add %[temp],%[increment],%[temp] \n\t" "stwcx. %[temp],0,%[ptr] \n\t" "bne- 0b \n\t" : [temp] "=&r"(temp) : [increment] "r"(increment), [ptr] "r"(ptr) : "cc", "memory"); return temp; } inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32 *ptr, Atomic32 increment) { MemoryBarrierInternal(); Atomic32 res = NoBarrier_AtomicIncrement(ptr, increment); MemoryBarrierInternal(); return res; } inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32 *ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value); MemoryBarrierInternal(); return res; } inline Atomic32 Release_CompareAndSwap(volatile Atomic32 *ptr, Atomic32 old_value, Atomic32 new_value) { MemoryBarrierInternal(); Atomic32 res = NoBarrier_CompareAndSwap(ptr, old_value, new_value); return res; } inline void NoBarrier_Store(volatile Atomic32 *ptr, Atomic32 value) { *ptr = value; } inline void MemoryBarrierInternal() { __asm__ __volatile__("sync" : : : "memory"); } inline void Acquire_Store(volatile Atomic32 *ptr, Atomic32 value) { *ptr = value; MemoryBarrierInternal(); } inline void Release_Store(volatile Atomic32 *ptr, Atomic32 value) { MemoryBarrierInternal(); *ptr = value; } inline Atomic32 NoBarrier_Load(volatile const Atomic32 *ptr) { return *ptr; } inline Atomic32 Acquire_Load(volatile const Atomic32 *ptr) { Atomic32 value = *ptr; MemoryBarrierInternal(); return value; } inline Atomic32 Release_Load(volatile const Atomic32 *ptr) { MemoryBarrierInternal(); return *ptr; } } // namespace internal } // namespace protobuf } // namespace google #undef ATOMICOPS_COMPILER_BARRIER #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_PPC_GCC_H_ atomicops_internals_solaris.h000066400000000000000000000142431334102242000343400ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// 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. // This file is an internal atomic implementation, use atomicops.h instead. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_SPARC_GCC_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_SPARC_GCC_H_ #include namespace google { namespace protobuf { namespace internal { inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { return (Atomic32)atomic_cas_32((volatile uint32_t*)ptr, (uint32_t)old_value, (uint32_t)new_value); } inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value) { return (Atomic32)atomic_swap_32((volatile uint32_t*)ptr, (uint32_t)new_value); } inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { return (Atomic32)atomic_add_32_nv((volatile uint32_t*)ptr, (uint32_t)increment); } inline void MemoryBarrierInternal(void) { membar_producer(); membar_consumer(); } inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { MemoryBarrierInternal(); Atomic32 ret = NoBarrier_AtomicIncrement(ptr, increment); MemoryBarrierInternal(); return ret; } inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value); MemoryBarrierInternal(); return ret; } inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { MemoryBarrierInternal(); return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; } inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; membar_producer(); } inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { membar_consumer(); *ptr = value; } inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return *ptr; } inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { Atomic32 val = *ptr; membar_consumer(); return val; } inline Atomic32 Release_Load(volatile const Atomic32* ptr) { membar_producer(); return *ptr; } #ifdef GOOGLE_PROTOBUF_ARCH_64_BIT inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { return atomic_cas_64((volatile uint64_t*)ptr, (uint64_t)old_value, (uint64_t)new_value); } inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value) { return atomic_swap_64((volatile uint64_t*)ptr, (uint64_t)new_value); } inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { return atomic_add_64_nv((volatile uint64_t*)ptr, increment); } inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { MemoryBarrierInternal(); Atomic64 ret = atomic_add_64_nv((volatile uint64_t*)ptr, increment); MemoryBarrierInternal(); return ret; } inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 ret = NoBarrier_CompareAndSwap(ptr, old_value, new_value); MemoryBarrierInternal(); return ret; } inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { MemoryBarrierInternal(); return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { *ptr = value; } inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { *ptr = value; membar_producer(); } inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { membar_consumer(); *ptr = value; } inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { return *ptr; } inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { Atomic64 ret = *ptr; membar_consumer(); return ret; } inline Atomic64 Release_Load(volatile const Atomic64* ptr) { membar_producer(); return *ptr; } #endif } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_SPARC_GCC_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h000066400000000000000000000205651334102242000337140ustar00rootroot00000000000000// Protocol Buffers - Google's data interchange format // Copyright 2013 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 is an internal atomic implementation for compiler-based // ThreadSanitizer (http://clang.llvm.org/docs/ThreadSanitizer.html). // Use atomicops.h instead. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_TSAN_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_TSAN_H_ #define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory") #include namespace google { namespace protobuf { namespace internal { inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32 *ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 cmp = old_value; __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value, __tsan_memory_order_relaxed, __tsan_memory_order_relaxed); return cmp; } inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32 *ptr, Atomic32 new_value) { return __tsan_atomic32_exchange(ptr, new_value, __tsan_memory_order_relaxed); } inline Atomic32 Acquire_AtomicExchange(volatile Atomic32 *ptr, Atomic32 new_value) { return __tsan_atomic32_exchange(ptr, new_value, __tsan_memory_order_acquire); } inline Atomic32 Release_AtomicExchange(volatile Atomic32 *ptr, Atomic32 new_value) { return __tsan_atomic32_exchange(ptr, new_value, __tsan_memory_order_release); } inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32 *ptr, Atomic32 increment) { return increment + __tsan_atomic32_fetch_add(ptr, increment, __tsan_memory_order_relaxed); } inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32 *ptr, Atomic32 increment) { return increment + __tsan_atomic32_fetch_add(ptr, increment, __tsan_memory_order_acq_rel); } inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32 *ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 cmp = old_value; __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value, __tsan_memory_order_acquire, __tsan_memory_order_acquire); return cmp; } inline Atomic32 Release_CompareAndSwap(volatile Atomic32 *ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 cmp = old_value; __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value, __tsan_memory_order_release, __tsan_memory_order_relaxed); return cmp; } inline void NoBarrier_Store(volatile Atomic32 *ptr, Atomic32 value) { __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed); } inline void Acquire_Store(volatile Atomic32 *ptr, Atomic32 value) { __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed); __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); } inline void Release_Store(volatile Atomic32 *ptr, Atomic32 value) { __tsan_atomic32_store(ptr, value, __tsan_memory_order_release); } inline Atomic32 NoBarrier_Load(volatile const Atomic32 *ptr) { return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed); } inline Atomic32 Acquire_Load(volatile const Atomic32 *ptr) { return __tsan_atomic32_load(ptr, __tsan_memory_order_acquire); } inline Atomic32 Release_Load(volatile const Atomic32 *ptr) { __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed); } inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64 *ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 cmp = old_value; __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value, __tsan_memory_order_relaxed, __tsan_memory_order_relaxed); return cmp; } inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64 *ptr, Atomic64 new_value) { return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_relaxed); } inline Atomic64 Acquire_AtomicExchange(volatile Atomic64 *ptr, Atomic64 new_value) { return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_acquire); } inline Atomic64 Release_AtomicExchange(volatile Atomic64 *ptr, Atomic64 new_value) { return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_release); } inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64 *ptr, Atomic64 increment) { return increment + __tsan_atomic64_fetch_add(ptr, increment, __tsan_memory_order_relaxed); } inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64 *ptr, Atomic64 increment) { return increment + __tsan_atomic64_fetch_add(ptr, increment, __tsan_memory_order_acq_rel); } inline void NoBarrier_Store(volatile Atomic64 *ptr, Atomic64 value) { __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed); } inline void Acquire_Store(volatile Atomic64 *ptr, Atomic64 value) { __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed); __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); } inline void Release_Store(volatile Atomic64 *ptr, Atomic64 value) { __tsan_atomic64_store(ptr, value, __tsan_memory_order_release); } inline Atomic64 NoBarrier_Load(volatile const Atomic64 *ptr) { return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed); } inline Atomic64 Acquire_Load(volatile const Atomic64 *ptr) { return __tsan_atomic64_load(ptr, __tsan_memory_order_acquire); } inline Atomic64 Release_Load(volatile const Atomic64 *ptr) { __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed); } inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64 *ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 cmp = old_value; __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value, __tsan_memory_order_acquire, __tsan_memory_order_acquire); return cmp; } inline Atomic64 Release_CompareAndSwap(volatile Atomic64 *ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 cmp = old_value; __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value, __tsan_memory_order_release, __tsan_memory_order_relaxed); return cmp; } inline void MemoryBarrierInternal() { __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); } } // namespace internal } // namespace protobuf } // namespace google #undef ATOMICOPS_COMPILER_BARRIER #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_TSAN_H_ atomicops_internals_x86_gcc.cc000066400000000000000000000121041334102242000342550ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// 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. // This module gets enough CPU information to optimize the // atomicops module on x86. #include #include // This file only makes sense with atomicops_internals_x86_gcc.h -- it // depends on structs that are defined in that file. If atomicops.h // doesn't sub-include that file, then we aren't needed, and shouldn't // try to do anything. #ifdef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_GCC_H_ // Inline cpuid instruction. In PIC compilations, %ebx contains the address // of the global offset table. To avoid breaking such executables, this code // must preserve that register's value across cpuid instructions. #if defined(__i386__) #define cpuid(a, b, c, d, inp) \ asm("mov %%ebx, %%edi\n" \ "cpuid\n" \ "xchg %%edi, %%ebx\n" \ : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) #elif defined(__x86_64__) #define cpuid(a, b, c, d, inp) \ asm("mov %%rbx, %%rdi\n" \ "cpuid\n" \ "xchg %%rdi, %%rbx\n" \ : "=a" (a), "=D" (b), "=c" (c), "=d" (d) : "a" (inp)) #endif #if defined(cpuid) // initialize the struct only on x86 namespace google { namespace protobuf { namespace internal { // Set the flags so that code will run correctly and conservatively, so even // if we haven't been initialized yet, we're probably single threaded, and our // default values should hopefully be pretty safe. struct AtomicOps_x86CPUFeatureStruct AtomicOps_Internalx86CPUFeatures = { false, // bug can't exist before process spawns multiple threads false, // no SSE2 }; namespace { // Initialize the AtomicOps_Internalx86CPUFeatures struct. void AtomicOps_Internalx86CPUFeaturesInit() { uint32_t eax; uint32_t ebx; uint32_t ecx; uint32_t edx; // Get vendor string (issue CPUID with eax = 0) cpuid(eax, ebx, ecx, edx, 0); char vendor[13]; memcpy(vendor, &ebx, 4); memcpy(vendor + 4, &edx, 4); memcpy(vendor + 8, &ecx, 4); vendor[12] = 0; // get feature flags in ecx/edx, and family/model in eax cpuid(eax, ebx, ecx, edx, 1); int family = (eax >> 8) & 0xf; // family and model fields int model = (eax >> 4) & 0xf; if (family == 0xf) { // use extended family and model fields family += (eax >> 20) & 0xff; model += ((eax >> 16) & 0xf) << 4; } // Opteron Rev E has a bug in which on very rare occasions a locked // instruction doesn't act as a read-acquire barrier if followed by a // non-locked read-modify-write instruction. Rev F has this bug in // pre-release versions, but not in versions released to customers, // so we test only for Rev E, which is family 15, model 32..63 inclusive. if (strcmp(vendor, "AuthenticAMD") == 0 && // AMD family == 15 && 32 <= model && model <= 63) { AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug = true; } else { AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug = false; } // edx bit 26 is SSE2 which we use to tell use whether we can use mfence AtomicOps_Internalx86CPUFeatures.has_sse2 = ((edx >> 26) & 1); } class AtomicOpsx86Initializer { public: AtomicOpsx86Initializer() { AtomicOps_Internalx86CPUFeaturesInit(); } }; // A global to get use initialized on startup via static initialization :/ AtomicOpsx86Initializer g_initer; } // namespace } // namespace internal } // namespace protobuf } // namespace google #endif // __i386__ #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_GCC_H_ atomicops_internals_x86_gcc.h000066400000000000000000000250031334102242000341210ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// 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. // This file is an internal atomic implementation, use atomicops.h instead. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_GCC_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_GCC_H_ namespace google { namespace protobuf { namespace internal { // This struct is not part of the public API of this module; clients may not // use it. // Features of this x86. Values may not be correct before main() is run, // but are set conservatively. struct AtomicOps_x86CPUFeatureStruct { bool has_amd_lock_mb_bug; // Processor has AMD memory-barrier bug; do lfence // after acquire compare-and-swap. bool has_sse2; // Processor has SSE2. }; extern struct AtomicOps_x86CPUFeatureStruct AtomicOps_Internalx86CPUFeatures; #define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory") // 32-bit low-level operations on any platform. inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 prev; __asm__ __volatile__("lock; cmpxchgl %1,%2" : "=a" (prev) : "q" (new_value), "m" (*ptr), "0" (old_value) : "memory"); return prev; } inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value) { __asm__ __volatile__("xchgl %1,%0" // The lock prefix is implicit for xchg. : "=r" (new_value) : "m" (*ptr), "0" (new_value) : "memory"); return new_value; // Now it's the previous value. } inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { Atomic32 temp = increment; __asm__ __volatile__("lock; xaddl %0,%1" : "+r" (temp), "+m" (*ptr) : : "memory"); // temp now holds the old value of *ptr return temp + increment; } inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { Atomic32 temp = increment; __asm__ __volatile__("lock; xaddl %0,%1" : "+r" (temp), "+m" (*ptr) : : "memory"); // temp now holds the old value of *ptr if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) { __asm__ __volatile__("lfence" : : : "memory"); } return temp + increment; } inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { Atomic32 x = NoBarrier_CompareAndSwap(ptr, old_value, new_value); if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) { __asm__ __volatile__("lfence" : : : "memory"); } return x; } inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; } #if defined(__x86_64__) // 64-bit implementations of memory barrier can be simpler, because it // "mfence" is guaranteed to exist. inline void MemoryBarrierInternal() { __asm__ __volatile__("mfence" : : : "memory"); } inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; MemoryBarrierInternal(); } #else inline void MemoryBarrierInternal() { if (AtomicOps_Internalx86CPUFeatures.has_sse2) { __asm__ __volatile__("mfence" : : : "memory"); } else { // mfence is faster but not present on PIII Atomic32 x = 0; NoBarrier_AtomicExchange(&x, 0); // acts as a barrier on PIII } } inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { if (AtomicOps_Internalx86CPUFeatures.has_sse2) { *ptr = value; __asm__ __volatile__("mfence" : : : "memory"); } else { NoBarrier_AtomicExchange(ptr, value); // acts as a barrier on PIII } } #endif inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { ATOMICOPS_COMPILER_BARRIER(); *ptr = value; // An x86 store acts as a release barrier. // See comments in Atomic64 version of Release_Store(), below. } inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return *ptr; } inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { Atomic32 value = *ptr; // An x86 load acts as a acquire barrier. // See comments in Atomic64 version of Release_Store(), below. ATOMICOPS_COMPILER_BARRIER(); return value; } inline Atomic32 Release_Load(volatile const Atomic32* ptr) { MemoryBarrierInternal(); return *ptr; } #if defined(__x86_64__) // 64-bit low-level operations on 64-bit platform. inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 prev; __asm__ __volatile__("lock; cmpxchgq %1,%2" : "=a" (prev) : "q" (new_value), "m" (*ptr), "0" (old_value) : "memory"); return prev; } inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value) { __asm__ __volatile__("xchgq %1,%0" // The lock prefix is implicit for xchg. : "=r" (new_value) : "m" (*ptr), "0" (new_value) : "memory"); return new_value; // Now it's the previous value. } inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { Atomic64 temp = increment; __asm__ __volatile__("lock; xaddq %0,%1" : "+r" (temp), "+m" (*ptr) : : "memory"); // temp now contains the previous value of *ptr return temp + increment; } inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { Atomic64 temp = increment; __asm__ __volatile__("lock; xaddq %0,%1" : "+r" (temp), "+m" (*ptr) : : "memory"); // temp now contains the previous value of *ptr if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) { __asm__ __volatile__("lfence" : : : "memory"); } return temp + increment; } inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { *ptr = value; } inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { *ptr = value; MemoryBarrierInternal(); } inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { ATOMICOPS_COMPILER_BARRIER(); *ptr = value; // An x86 store acts as a release barrier // for current AMD/Intel chips as of Jan 2008. // See also Acquire_Load(), below. // When new chips come out, check: // IA-32 Intel Architecture Software Developer's Manual, Volume 3: // System Programming Guide, Chatper 7: Multiple-processor management, // Section 7.2, Memory Ordering. // Last seen at: // http://developer.intel.com/design/pentium4/manuals/index_new.htm // // x86 stores/loads fail to act as barriers for a few instructions (clflush // maskmovdqu maskmovq movntdq movnti movntpd movntps movntq) but these are // not generated by the compiler, and are rare. Users of these instructions // need to know about cache behaviour in any case since all of these involve // either flushing cache lines or non-temporal cache hints. } inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { return *ptr; } inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { Atomic64 value = *ptr; // An x86 load acts as a acquire barrier, // for current AMD/Intel chips as of Jan 2008. // See also Release_Store(), above. ATOMICOPS_COMPILER_BARRIER(); return value; } inline Atomic64 Release_Load(volatile const Atomic64* ptr) { MemoryBarrierInternal(); return *ptr; } inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { Atomic64 x = NoBarrier_CompareAndSwap(ptr, old_value, new_value); if (AtomicOps_Internalx86CPUFeatures.has_amd_lock_mb_bug) { __asm__ __volatile__("lfence" : : : "memory"); } return x; } inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } #endif // defined(__x86_64__) } // namespace internal } // namespace protobuf } // namespace google #undef ATOMICOPS_COMPILER_BARRIER #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_GCC_H_ atomicops_internals_x86_msvc.cc000066400000000000000000000104161334102242000344750ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// 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. // The compilation of extension_set.cc fails when windows.h is included. // Therefore we move the code depending on windows.h to this separate cc file. // Don't compile this file for people not concerned about thread safety. #ifndef GOOGLE_PROTOBUF_NO_THREAD_SAFETY #include #ifdef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_MSVC_H_ #include namespace google { namespace protobuf { namespace internal { inline void MemoryBarrierInternal() { // On ARM this is a define while on x86/x64 this is // a function declared in WinNT.h MemoryBarrier(); } Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { LONG result = InterlockedCompareExchange( reinterpret_cast(ptr), static_cast(new_value), static_cast(old_value)); return static_cast(result); } Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value) { LONG result = InterlockedExchange( reinterpret_cast(ptr), static_cast(new_value)); return static_cast(result); } Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { return InterlockedExchangeAdd( reinterpret_cast(ptr), static_cast(increment)) + increment; } #if defined(_WIN64) // 64-bit low-level operations on 64-bit platform. Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { PVOID result = InterlockedCompareExchangePointer( reinterpret_cast(ptr), reinterpret_cast(new_value), reinterpret_cast(old_value)); return reinterpret_cast(result); } Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value) { PVOID result = InterlockedExchangePointer( reinterpret_cast(ptr), reinterpret_cast(new_value)); return reinterpret_cast(result); } Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { return InterlockedExchangeAdd64( reinterpret_cast(ptr), static_cast(increment)) + increment; } #endif // defined(_WIN64) } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_MSVC_H_ #endif // GOOGLE_PROTOBUF_NO_THREAD_SAFETY atomicops_internals_x86_msvc.h000066400000000000000000000124061334102242000343400ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// 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. // This file is an internal atomic implementation, use atomicops.h instead. #ifndef GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_MSVC_H_ #define GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_MSVC_H_ namespace google { namespace protobuf { namespace internal { inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment) { return Barrier_AtomicIncrement(ptr, increment); } #if !(defined(_MSC_VER) && _MSC_VER >= 1400) #error "We require at least vs2005 for MemoryBarrier" #endif inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, Atomic32 old_value, Atomic32 new_value) { return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; } inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { NoBarrier_AtomicExchange(ptr, value); // acts as a barrier in this implementation } inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { *ptr = value; // works w/o barrier for current Intel chips as of June 2005 // See comments in Atomic64 version of Release_Store() below. } inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return *ptr; } inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { Atomic32 value = *ptr; return value; } inline Atomic32 Release_Load(volatile const Atomic32* ptr) { MemoryBarrierInternal(); return *ptr; } #if defined(_WIN64) // 64-bit low-level operations on 64-bit platform. inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment) { return Barrier_AtomicIncrement(ptr, increment); } inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { *ptr = value; } inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { NoBarrier_AtomicExchange(ptr, value); // acts as a barrier in this implementation } inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { *ptr = value; // works w/o barrier for current Intel chips as of June 2005 // When new chips come out, check: // IA-32 Intel Architecture Software Developer's Manual, Volume 3: // System Programming Guide, Chatper 7: Multiple-processor management, // Section 7.2, Memory Ordering. // Last seen at: // http://developer.intel.com/design/pentium4/manuals/index_new.htm } inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { return *ptr; } inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { Atomic64 value = *ptr; return value; } inline Atomic64 Release_Load(volatile const Atomic64* ptr) { MemoryBarrierInternal(); return *ptr; } inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, Atomic64 new_value) { return NoBarrier_CompareAndSwap(ptr, old_value, new_value); } #endif // defined(_WIN64) } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_ATOMICOPS_INTERNALS_X86_MSVC_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/bytestream.cc000066400000000000000000000134501334102242000311220ustar00rootroot00000000000000// 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 #include #include namespace google { namespace protobuf { namespace strings { void ByteSource::CopyTo(ByteSink* sink, size_t n) { while (n > 0) { StringPiece fragment = Peek(); if (fragment.empty()) { GOOGLE_LOG(DFATAL) << "ByteSource::CopyTo() overran input."; break; } std::size_t fragment_size = std::min(n, fragment.size()); sink->Append(fragment.data(), fragment_size); Skip(fragment_size); n -= fragment_size; } } void ByteSink::Flush() {} void UncheckedArrayByteSink::Append(const char* data, size_t n) { if (data != dest_) { // Catch cases where the pointer returned by GetAppendBuffer() was modified. GOOGLE_DCHECK(!(dest_ <= data && data < (dest_ + n))) << "Append() data[] overlaps with dest_[]"; memcpy(dest_, data, n); } dest_ += n; } CheckedArrayByteSink::CheckedArrayByteSink(char* outbuf, size_t capacity) : outbuf_(outbuf), capacity_(capacity), size_(0), overflowed_(false) { } void CheckedArrayByteSink::Append(const char* bytes, size_t n) { size_t available = capacity_ - size_; if (n > available) { n = available; overflowed_ = true; } if (n > 0 && bytes != (outbuf_ + size_)) { // Catch cases where the pointer returned by GetAppendBuffer() was modified. GOOGLE_DCHECK(!(outbuf_ <= bytes && bytes < (outbuf_ + capacity_))) << "Append() bytes[] overlaps with outbuf_[]"; memcpy(outbuf_ + size_, bytes, n); } size_ += n; } GrowingArrayByteSink::GrowingArrayByteSink(size_t estimated_size) : capacity_(estimated_size), buf_(new char[estimated_size]), size_(0) { } GrowingArrayByteSink::~GrowingArrayByteSink() { delete[] buf_; // Just in case the user didn't call GetBuffer. } void GrowingArrayByteSink::Append(const char* bytes, size_t n) { size_t available = capacity_ - size_; if (bytes != (buf_ + size_)) { // Catch cases where the pointer returned by GetAppendBuffer() was modified. // We need to test for this before calling Expand() which may reallocate. GOOGLE_DCHECK(!(buf_ <= bytes && bytes < (buf_ + capacity_))) << "Append() bytes[] overlaps with buf_[]"; } if (n > available) { Expand(n - available); } if (n > 0 && bytes != (buf_ + size_)) { memcpy(buf_ + size_, bytes, n); } size_ += n; } char* GrowingArrayByteSink::GetBuffer(size_t* nbytes) { ShrinkToFit(); char* b = buf_; *nbytes = size_; buf_ = NULL; size_ = capacity_ = 0; return b; } void GrowingArrayByteSink::Expand(size_t amount) { // Expand by at least 50%. size_t new_capacity = std::max(capacity_ + amount, (3 * capacity_) / 2); char* bigger = new char[new_capacity]; memcpy(bigger, buf_, size_); delete[] buf_; buf_ = bigger; capacity_ = new_capacity; } void GrowingArrayByteSink::ShrinkToFit() { // Shrink only if the buffer is large and size_ is less than 3/4 // of capacity_. if (capacity_ > 256 && size_ < (3 * capacity_) / 4) { char* just_enough = new char[size_]; memcpy(just_enough, buf_, size_); delete[] buf_; buf_ = just_enough; capacity_ = size_; } } void StringByteSink::Append(const char* data, size_t n) { dest_->append(data, n); } size_t ArrayByteSource::Available() const { return input_.size(); } StringPiece ArrayByteSource::Peek() { return input_; } void ArrayByteSource::Skip(size_t n) { GOOGLE_DCHECK_LE(n, input_.size()); input_.remove_prefix(n); } LimitByteSource::LimitByteSource(ByteSource *source, size_t limit) : source_(source), limit_(limit) { } size_t LimitByteSource::Available() const { size_t available = source_->Available(); if (available > limit_) { available = limit_; } return available; } StringPiece LimitByteSource::Peek() { StringPiece piece(source_->Peek()); if (piece.size() > limit_) { piece.set(piece.data(), limit_); } return piece; } void LimitByteSource::Skip(size_t n) { GOOGLE_DCHECK_LE(n, limit_); source_->Skip(n); limit_ -= n; } void LimitByteSource::CopyTo(ByteSink *sink, size_t n) { GOOGLE_DCHECK_LE(n, limit_); source_->CopyTo(sink, n); limit_ -= n; } } // namespace strings } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/bytestream.h000066400000000000000000000265311334102242000307700ustar00rootroot00000000000000// 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 declares the ByteSink and ByteSource abstract interfaces. These // interfaces represent objects that consume (ByteSink) or produce (ByteSource) // a sequence of bytes. Using these abstract interfaces in your APIs can help // make your code work with a variety of input and output types. // // This file also declares the following commonly used implementations of these // interfaces. // // ByteSink: // UncheckedArrayByteSink Writes to an array, without bounds checking // CheckedArrayByteSink Writes to an array, with bounds checking // GrowingArrayByteSink Allocates and writes to a growable buffer // StringByteSink Writes to an STL string // NullByteSink Consumes a never-ending stream of bytes // // ByteSource: // ArrayByteSource Reads from an array or string/StringPiece // LimitedByteSource Limits the number of bytes read from an #ifndef GOOGLE_PROTOBUF_STUBS_BYTESTREAM_H_ #define GOOGLE_PROTOBUF_STUBS_BYTESTREAM_H_ #include #include #include #include class CordByteSink; class MemBlock; namespace google { namespace protobuf { namespace strings { // An abstract interface for an object that consumes a sequence of bytes. This // interface offers a way to append data as well as a Flush() function. // // Example: // // string my_data; // ... // ByteSink* sink = ... // sink->Append(my_data.data(), my_data.size()); // sink->Flush(); // class LIBPROTOBUF_EXPORT ByteSink { public: ByteSink() {} virtual ~ByteSink() {} // Appends the "n" bytes starting at "bytes". virtual void Append(const char* bytes, size_t n) = 0; // Flushes internal buffers. The default implemenation does nothing. ByteSink // 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 // bytes. // // Example: // // ByteSource* source = ... // while (source->Available() > 0) { // StringPiece data = source->Peek(); // ... do something with "data" ... // source->Skip(data.length()); // } // class LIBPROTOBUF_EXPORT ByteSource { public: ByteSource() {} virtual ~ByteSource() {} // Returns the number of bytes left to read from the source. Available() // should decrease by N each time Skip(N) is called. Available() may not // increase. Available() returning 0 indicates that the ByteSource is // exhausted. // // Note: Size() may have been a more appropriate name as it's more // 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. // // 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; // Skips the next n bytes. Invalidates any StringPiece returned by a previous // call to Peek(). // // REQUIRES: Available() >= n virtual void Skip(size_t n) = 0; // Writes the next n bytes in this ByteSource to the given ByteSink, and // advances this ByteSource past the copied bytes. The default implementation // of this method just copies the bytes normally, but subclasses might // override CopyTo to optimize certain cases. // // REQUIRES: Available() >= n virtual void CopyTo(ByteSink* sink, size_t n); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ByteSource); }; // // Some commonly used implementations of ByteSink // // Implementation of ByteSink that writes to an unsized byte array. No // bounds-checking is performed--it is the caller's responsibility to ensure // that the destination array is large enough. // // Example: // // char buf[10]; // UncheckedArrayByteSink sink(buf); // sink.Append("hi", 2); // OK // sink.Append(data, 100); // WOOPS! Overflows buf[10]. // class LIBPROTOBUF_EXPORT UncheckedArrayByteSink : public ByteSink { public: explicit UncheckedArrayByteSink(char* dest) : dest_(dest) {} virtual void Append(const char* data, size_t n); // Returns the current output pointer so that a caller can see how many bytes // were produced. // // Note: this method is not part of the ByteSink interface. char* CurrentDestination() const { return dest_; } private: char* dest_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UncheckedArrayByteSink); }; // Implementation of ByteSink that writes to a sized byte array. This sink will // not write more than "capacity" bytes to outbuf. Once "capacity" bytes are // appended, subsequent bytes will be ignored and Overflowed() will return true. // Overflowed() does not cause a runtime error (i.e., it does not CHECK fail). // // Example: // // char buf[10]; // CheckedArrayByteSink sink(buf, 10); // sink.Append("hi", 2); // OK // sink.Append(data, 100); // Will only write 8 more bytes // class LIBPROTOBUF_EXPORT CheckedArrayByteSink : public ByteSink { public: CheckedArrayByteSink(char* outbuf, size_t capacity); virtual void Append(const char* bytes, size_t n); // Returns the number of bytes actually written to the sink. size_t NumberOfBytesWritten() const { return size_; } // Returns true if any bytes were discarded, i.e., if there was an // attempt to write more than 'capacity' bytes. bool Overflowed() const { return overflowed_; } private: char* outbuf_; 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) // and expands it as needed to accommodate appended data (similar to a string), // and allows the caller to take ownership of the internal buffer via the // GetBuffer() method. The buffer returned from GetBuffer() must be deleted by // the caller with delete[]. GetBuffer() also sets the internal buffer to be // empty, and subsequent appends to the sink will create a new buffer. The // destructor will free the internal buffer if GetBuffer() was not called. // // Example: // // GrowingArrayByteSink sink(10); // sink.Append("hi", 2); // sink.Append(data, n); // const char* buf = sink.GetBuffer(); // Ownership transferred // delete[] buf; // class LIBPROTOBUF_EXPORT GrowingArrayByteSink : public strings::ByteSink { public: explicit GrowingArrayByteSink(size_t estimated_size); virtual ~GrowingArrayByteSink(); virtual void Append(const char* bytes, size_t n); // Returns the allocated buffer, and sets nbytes to its size. The caller takes // ownership of the buffer and must delete it with delete[]. char* GetBuffer(size_t* nbytes); private: void Expand(size_t amount); void ShrinkToFit(); size_t capacity_; char* buf_; size_t size_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GrowingArrayByteSink); }; // Implementation of ByteSink that appends to the given string. // Existing contents of "dest" are not modified; new data is appended. // // Example: // // string dest = "Hello "; // StringByteSink sink(&dest); // sink.Append("World", 5); // assert(dest == "Hello World"); // class LIBPROTOBUF_EXPORT StringByteSink : public ByteSink { public: explicit StringByteSink(string* dest) : dest_(dest) {} virtual void Append(const char* data, size_t n); private: string* dest_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringByteSink); }; // Implementation of ByteSink that discards all data. // // Example: // // NullByteSink sink; // sink.Append(data, data.size()); // All data ignored. // class LIBPROTOBUF_EXPORT NullByteSink : public ByteSink { public: NullByteSink() {} virtual void Append(const char *data, size_t n) {} private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(NullByteSink); }; // // Some commonly used implementations of ByteSource // // Implementation of ByteSource that reads from a StringPiece. // // Example: // // string data = "Hello"; // ArrayByteSource source(data); // assert(source.Available() == 5); // assert(source.Peek() == "Hello"); // class LIBPROTOBUF_EXPORT ArrayByteSource : public ByteSource { public: explicit ArrayByteSource(StringPiece s) : input_(s) {} virtual size_t Available() const; virtual StringPiece Peek(); virtual void Skip(size_t n); private: StringPiece input_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayByteSource); }; // Implementation of ByteSource that wraps another ByteSource, limiting the // number of bytes returned. // // The caller maintains ownership of the underlying source, and may not use the // underlying source while using the LimitByteSource object. The underlying // source's pointer is advanced by n bytes every time this LimitByteSource // object is advanced by n. // // Example: // // string data = "Hello World"; // ArrayByteSource abs(data); // assert(abs.Available() == data.size()); // // LimitByteSource limit(abs, 5); // assert(limit.Available() == 5); // assert(limit.Peek() == "Hello"); // class LIBPROTOBUF_EXPORT LimitByteSource : public ByteSource { public: // Returns at most "limit" bytes from "source". LimitByteSource(ByteSource* source, size_t limit); virtual size_t Available() const; virtual StringPiece Peek(); virtual void Skip(size_t n); // We override CopyTo so that we can forward to the underlying source, in // case it has an efficient implementation of CopyTo. virtual void CopyTo(ByteSink* sink, size_t n); private: ByteSource* source_; size_t limit_; }; } // namespace strings } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_BYTESTREAM_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/bytestream_unittest.cc000066400000000000000000000106451334102242000330640ustar00rootroot00000000000000// 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 #include #include #include #include #include namespace google { namespace protobuf { namespace strings { namespace { // We use this class instead of ArrayByteSource to simulate a ByteSource that // contains multiple fragments. ArrayByteSource returns the entire array in // one fragment. class MockByteSource : public ByteSource { public: MockByteSource(StringPiece 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_); } void Skip(size_t n) { data_.remove_prefix(n); } private: StringPiece data_; int block_size_; }; TEST(ByteSourceTest, CopyTo) { StringPiece data("Hello world!"); MockByteSource source(data, 3); string str; StringByteSink sink(&str); source.CopyTo(&sink, data.size()); EXPECT_EQ(data, str); } TEST(ByteSourceTest, CopySubstringTo) { StringPiece data("Hello world!"); MockByteSource source(data, 3); source.Skip(1); string str; StringByteSink sink(&str); source.CopyTo(&sink, data.size() - 2); EXPECT_EQ(data.substr(1, data.size() - 2), str); EXPECT_EQ("!", source.Peek()); } TEST(ByteSourceTest, LimitByteSource) { StringPiece data("Hello world!"); MockByteSource source(data, 3); LimitByteSource limit_source(&source, 6); EXPECT_EQ(6, limit_source.Available()); limit_source.Skip(1); EXPECT_EQ(5, limit_source.Available()); { string str; StringByteSink sink(&str); limit_source.CopyTo(&sink, limit_source.Available()); EXPECT_EQ("ello ", str); EXPECT_EQ(0, limit_source.Available()); EXPECT_EQ(6, source.Available()); } { string str; StringByteSink sink(&str); source.CopyTo(&sink, source.Available()); EXPECT_EQ("world!", str); EXPECT_EQ(0, source.Available()); } } TEST(ByteSourceTest, CopyToStringByteSink) { StringPiece data("Hello world!"); MockByteSource source(data, 3); string str; StringByteSink sink(&str); source.CopyTo(&sink, data.size()); EXPECT_EQ(data, str); } // Verify that ByteSink is subclassable and Flush() overridable. class FlushingByteSink : public StringByteSink { public: explicit FlushingByteSink(string* dest) : StringByteSink(dest) {} virtual void Flush() { Append("z", 1); } private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FlushingByteSink); }; // Write and Flush via the ByteSink superclass interface. void WriteAndFlush(ByteSink* s) { s->Append("abc", 3); s->Flush(); } TEST(ByteSinkTest, Flush) { string str; FlushingByteSink f_sink(&str); WriteAndFlush(&f_sink); EXPECT_STREQ("abcz", str.c_str()); } } // namespace } // namespace strings } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/callback.h000066400000000000000000000405251334102242000303440ustar00rootroot00000000000000#ifndef GOOGLE_PROTOBUF_STUBS_CALLBACK_H_ #define GOOGLE_PROTOBUF_STUBS_CALLBACK_H_ #include #include // =================================================================== // emulates google3/base/callback.h namespace google { namespace protobuf { // Abstract interface for a callback. When calling an RPC, you must provide // a Closure to call when the procedure completes. See the Service interface // in service.h. // // To automatically construct a Closure which calls a particular function or // method with a particular set of parameters, use the NewCallback() function. // Example: // void FooDone(const FooResponse* response) { // ... // } // // void CallFoo() { // ... // // When done, call FooDone() and pass it a pointer to the response. // Closure* callback = NewCallback(&FooDone, response); // // Make the call. // service->Foo(controller, request, response, callback); // } // // Example that calls a method: // class Handler { // public: // ... // // void FooDone(const FooResponse* response) { // ... // } // // void CallFoo() { // ... // // When done, call FooDone() and pass it a pointer to the response. // Closure* callback = NewCallback(this, &Handler::FooDone, response); // // Make the call. // service->Foo(controller, request, response, callback); // } // }; // // Currently NewCallback() supports binding zero, one, or two arguments. // // Callbacks created with NewCallback() automatically delete themselves when // executed. They should be used when a callback is to be called exactly // once (usually the case with RPC callbacks). If a callback may be called // a different number of times (including zero), create it with // NewPermanentCallback() instead. You are then responsible for deleting the // callback (using the "delete" keyword as normal). // // Note that NewCallback() is a bit touchy regarding argument types. Generally, // the values you provide for the parameter bindings must exactly match the // types accepted by the callback function. For example: // void Foo(string s); // NewCallback(&Foo, "foo"); // WON'T WORK: const char* != string // NewCallback(&Foo, string("foo")); // WORKS // Also note that the arguments cannot be references: // void Foo(const string& s); // string my_str; // NewCallback(&Foo, my_str); // WON'T WORK: Can't use referecnes. // However, correctly-typed pointers will work just fine. class LIBPROTOBUF_EXPORT Closure { public: Closure() {} virtual ~Closure(); virtual void Run() = 0; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Closure); }; template class ResultCallback { public: ResultCallback() {} virtual ~ResultCallback() {} virtual R Run() = 0; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ResultCallback); }; template class LIBPROTOBUF_EXPORT ResultCallback1 { public: ResultCallback1() {} virtual ~ResultCallback1() {} virtual R Run(A1) = 0; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ResultCallback1); }; template class LIBPROTOBUF_EXPORT ResultCallback2 { public: ResultCallback2() {} virtual ~ResultCallback2() {} virtual R Run(A1,A2) = 0; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ResultCallback2); }; namespace internal { class LIBPROTOBUF_EXPORT FunctionClosure0 : public Closure { public: typedef void (*FunctionType)(); FunctionClosure0(FunctionType function, bool self_deleting) : function_(function), self_deleting_(self_deleting) {} ~FunctionClosure0(); void Run() { bool needs_delete = self_deleting_; // read in case callback deletes function_(); if (needs_delete) delete this; } private: FunctionType function_; bool self_deleting_; }; template class MethodClosure0 : public Closure { public: typedef void (Class::*MethodType)(); MethodClosure0(Class* object, MethodType method, bool self_deleting) : object_(object), method_(method), self_deleting_(self_deleting) {} ~MethodClosure0() {} void Run() { bool needs_delete = self_deleting_; // read in case callback deletes (object_->*method_)(); if (needs_delete) delete this; } private: Class* object_; MethodType method_; bool self_deleting_; }; template class FunctionClosure1 : public Closure { public: typedef void (*FunctionType)(Arg1 arg1); FunctionClosure1(FunctionType function, bool self_deleting, Arg1 arg1) : function_(function), self_deleting_(self_deleting), arg1_(arg1) {} ~FunctionClosure1() {} void Run() { bool needs_delete = self_deleting_; // read in case callback deletes function_(arg1_); if (needs_delete) delete this; } private: FunctionType function_; bool self_deleting_; Arg1 arg1_; }; template class MethodClosure1 : public Closure { public: typedef void (Class::*MethodType)(Arg1 arg1); MethodClosure1(Class* object, MethodType method, bool self_deleting, Arg1 arg1) : object_(object), method_(method), self_deleting_(self_deleting), arg1_(arg1) {} ~MethodClosure1() {} void Run() { bool needs_delete = self_deleting_; // read in case callback deletes (object_->*method_)(arg1_); if (needs_delete) delete this; } private: Class* object_; MethodType method_; bool self_deleting_; Arg1 arg1_; }; template class FunctionClosure2 : public Closure { public: typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2); FunctionClosure2(FunctionType function, bool self_deleting, Arg1 arg1, Arg2 arg2) : function_(function), self_deleting_(self_deleting), arg1_(arg1), arg2_(arg2) {} ~FunctionClosure2() {} void Run() { bool needs_delete = self_deleting_; // read in case callback deletes function_(arg1_, arg2_); if (needs_delete) delete this; } private: FunctionType function_; bool self_deleting_; Arg1 arg1_; Arg2 arg2_; }; template class MethodClosure2 : public Closure { public: typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2); MethodClosure2(Class* object, MethodType method, bool self_deleting, Arg1 arg1, Arg2 arg2) : object_(object), method_(method), self_deleting_(self_deleting), arg1_(arg1), arg2_(arg2) {} ~MethodClosure2() {} void Run() { bool needs_delete = self_deleting_; // read in case callback deletes (object_->*method_)(arg1_, arg2_); if (needs_delete) delete this; } private: Class* object_; MethodType method_; bool self_deleting_; Arg1 arg1_; Arg2 arg2_; }; template class FunctionResultCallback_0_0 : public ResultCallback { public: typedef R (*FunctionType)(); FunctionResultCallback_0_0(FunctionType function, bool self_deleting) : function_(function), self_deleting_(self_deleting) {} ~FunctionResultCallback_0_0() {} R Run() { bool needs_delete = self_deleting_; // read in case callback deletes R result = function_(); if (needs_delete) delete this; return result; } private: FunctionType function_; bool self_deleting_; }; template class FunctionResultCallback_1_0 : public ResultCallback { public: typedef R (*FunctionType)(P1); FunctionResultCallback_1_0(FunctionType function, bool self_deleting, P1 p1) : function_(function), self_deleting_(self_deleting), p1_(p1) {} ~FunctionResultCallback_1_0() {} R Run() { bool needs_delete = self_deleting_; // read in case callback deletes R result = function_(p1_); if (needs_delete) delete this; return result; } private: FunctionType function_; bool self_deleting_; P1 p1_; }; template class FunctionResultCallback_0_1 : public ResultCallback1 { public: typedef R (*FunctionType)(Arg1 arg1); FunctionResultCallback_0_1(FunctionType function, bool self_deleting) : function_(function), self_deleting_(self_deleting) {} ~FunctionResultCallback_0_1() {} R Run(Arg1 a1) { bool needs_delete = self_deleting_; // read in case callback deletes R result = function_(a1); if (needs_delete) delete this; return result; } private: FunctionType function_; bool self_deleting_; }; template class FunctionResultCallback_1_1 : public ResultCallback1 { public: typedef R (*FunctionType)(P1, A1); FunctionResultCallback_1_1(FunctionType function, bool self_deleting, P1 p1) : function_(function), self_deleting_(self_deleting), p1_(p1) {} ~FunctionResultCallback_1_1() {} R Run(A1 a1) { bool needs_delete = self_deleting_; // read in case callback deletes R result = function_(p1_, a1); if (needs_delete) delete this; return result; } private: FunctionType function_; bool self_deleting_; P1 p1_; }; template struct InternalConstRef { typedef typename remove_reference::type base_type; typedef const base_type& type; }; template class MethodResultCallback_0_0 : public ResultCallback { public: typedef R (T::*MethodType)(); MethodResultCallback_0_0(T* object, MethodType method, bool self_deleting) : object_(object), method_(method), self_deleting_(self_deleting) {} ~MethodResultCallback_0_0() {} R Run() { bool needs_delete = self_deleting_; R result = (object_->*method_)(); if (needs_delete) delete this; return result; } private: T* object_; MethodType method_; bool self_deleting_; }; template class MethodResultCallback_5_2 : public ResultCallback2 { public: typedef R (T::*MethodType)(P1, P2, P3, P4, P5, A1, A2); MethodResultCallback_5_2(T* object, MethodType method, bool self_deleting, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) : object_(object), method_(method), self_deleting_(self_deleting), p1_(p1), p2_(p2), p3_(p3), p4_(p4), p5_(p5) {} ~MethodResultCallback_5_2() {} R Run(A1 a1, A2 a2) { bool needs_delete = self_deleting_; R result = (object_->*method_)(p1_, p2_, p3_, p4_, p5_, a1, a2); if (needs_delete) delete this; return result; } private: T* object_; MethodType method_; bool self_deleting_; typename remove_reference::type p1_; typename remove_reference::type p2_; typename remove_reference::type p3_; typename remove_reference::type p4_; typename remove_reference::type p5_; }; } // namespace internal // See Closure. inline Closure* NewCallback(void (*function)()) { return new internal::FunctionClosure0(function, true); } // See Closure. inline Closure* NewPermanentCallback(void (*function)()) { return new internal::FunctionClosure0(function, false); } // See Closure. template inline Closure* NewCallback(Class* object, void (Class::*method)()) { return new internal::MethodClosure0(object, method, true); } // See Closure. template inline Closure* NewPermanentCallback(Class* object, void (Class::*method)()) { return new internal::MethodClosure0(object, method, false); } // See Closure. template inline Closure* NewCallback(void (*function)(Arg1), Arg1 arg1) { return new internal::FunctionClosure1(function, true, arg1); } // See Closure. template inline Closure* NewPermanentCallback(void (*function)(Arg1), Arg1 arg1) { return new internal::FunctionClosure1(function, false, arg1); } // See Closure. template inline Closure* NewCallback(Class* object, void (Class::*method)(Arg1), Arg1 arg1) { return new internal::MethodClosure1(object, method, true, arg1); } // See Closure. template inline Closure* NewPermanentCallback(Class* object, void (Class::*method)(Arg1), Arg1 arg1) { return new internal::MethodClosure1(object, method, false, arg1); } // See Closure. template inline Closure* NewCallback(void (*function)(Arg1, Arg2), Arg1 arg1, Arg2 arg2) { return new internal::FunctionClosure2( function, true, arg1, arg2); } // See Closure. template inline Closure* NewPermanentCallback(void (*function)(Arg1, Arg2), Arg1 arg1, Arg2 arg2) { return new internal::FunctionClosure2( function, false, arg1, arg2); } // See Closure. template inline Closure* NewCallback(Class* object, void (Class::*method)(Arg1, Arg2), Arg1 arg1, Arg2 arg2) { return new internal::MethodClosure2( object, method, true, arg1, arg2); } // See Closure. template inline Closure* NewPermanentCallback( Class* object, void (Class::*method)(Arg1, Arg2), Arg1 arg1, Arg2 arg2) { return new internal::MethodClosure2( object, method, false, arg1, arg2); } // See ResultCallback template inline ResultCallback* NewCallback(R (*function)()) { return new internal::FunctionResultCallback_0_0(function, true); } // See ResultCallback template inline ResultCallback* NewPermanentCallback(R (*function)()) { return new internal::FunctionResultCallback_0_0(function, false); } // See ResultCallback template inline ResultCallback* NewCallback(R (*function)(P1), P1 p1) { return new internal::FunctionResultCallback_1_0( function, true, p1); } // See ResultCallback template inline ResultCallback* NewPermanentCallback( R (*function)(P1), P1 p1) { return new internal::FunctionResultCallback_1_0( function, false, p1); } // See ResultCallback1 template inline ResultCallback1* NewCallback(R (*function)(A1)) { return new internal::FunctionResultCallback_0_1(function, true); } // See ResultCallback1 template inline ResultCallback1* NewPermanentCallback(R (*function)(A1)) { return new internal::FunctionResultCallback_0_1(function, false); } // See ResultCallback1 template inline ResultCallback1* NewCallback(R (*function)(P1, A1), P1 p1) { return new internal::FunctionResultCallback_1_1( function, true, p1); } // See ResultCallback1 template inline ResultCallback1* NewPermanentCallback( R (*function)(P1, A1), P1 p1) { return new internal::FunctionResultCallback_1_1( function, false, p1); } // See MethodResultCallback_0_0 template inline ResultCallback* NewPermanentCallback( T1* object, R (T2::*function)()) { return new internal::MethodResultCallback_0_0(object, function, false); } // See MethodResultCallback_5_2 template inline ResultCallback2* NewPermanentCallback( T* object, R (T::*function)(P1, P2, P3, P4, P5, A1, A2), typename internal::InternalConstRef::type p1, typename internal::InternalConstRef::type p2, typename internal::InternalConstRef::type p3, typename internal::InternalConstRef::type p4, typename internal::InternalConstRef::type p5) { return new internal::MethodResultCallback_5_2(object, function, false, p1, p2, p3, p4, p5); } // A function which does nothing. Useful for creating no-op callbacks, e.g.: // Closure* nothing = NewCallback(&DoNothing); void LIBPROTOBUF_EXPORT DoNothing(); } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_CALLBACK_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/casts.h000066400000000000000000000131011334102242000277130ustar00rootroot00000000000000// 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 #include 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 convertable 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(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 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(foo)) HandleASubclass1Object(foo); // if (dynamic_cast(foo)) HandleASubclass2Object(foo); // You should design the code some other way not to need this. template // use like this: down_cast(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(0); } #if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI) assert(f == NULL || dynamic_cast(f) != NULL); // RTTI: debug mode only! #endif return static_cast(f); } template // use like this: down_cast(foo); inline To down_cast(From& f) { typedef typename remove_reference::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(0); } #if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI) // RTTI: debug mode only! assert(dynamic_cast(&f) != NULL); #endif return *static_cast(&f); } template inline To bit_cast(const From& from) { GOOGLE_COMPILE_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 #endif // GOOGLE_PROTOBUF_CASTS_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/common.cc000066400000000000000000000351621334102242000302370ustar00rootroot00000000000000// 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 // TODO(gerbens) ideally remove this. #include #include #include #include #include #include #include #include #include #include #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN // We only need minimal includes #include #define snprintf _snprintf // see comment in strutil.cc #elif defined(HAVE_PTHREAD) #include #else #error "No suitable threading library available." #endif #if defined(__ANDROID__) #include #endif namespace google { namespace protobuf { namespace internal { void VerifyVersion(int headerVersion, int minLibraryVersion, const char* filename) { if (GOOGLE_PROTOBUF_VERSION < minLibraryVersion) { // Library is too old for headers. GOOGLE_LOG(FATAL) << "This program requires version " << VersionString(minLibraryVersion) << " of the Protocol Buffer runtime library, but the installed version " "is " << VersionString(GOOGLE_PROTOBUF_VERSION) << ". Please update " "your library. If you compiled the program yourself, make sure that " "your headers are from the same version of Protocol Buffers as your " "link-time library. (Version verification failed in \"" << filename << "\".)"; } if (headerVersion < kMinHeaderVersionForLibrary) { // Headers are too old for library. GOOGLE_LOG(FATAL) << "This program was compiled against version " << VersionString(headerVersion) << " of the Protocol Buffer runtime " "library, which is not compatible with the installed version (" << VersionString(GOOGLE_PROTOBUF_VERSION) << "). Contact the program " "author for an update. If you compiled the program yourself, make " "sure that your headers are from the same version of Protocol Buffers " "as your link-time library. (Version verification failed in \"" << filename << "\".)"; } } string VersionString(int version) { int major = version / 1000000; 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.%d", major, minor, micro); // Guard against broken MSVC snprintf(). buffer[sizeof(buffer)-1] = '\0'; return buffer; } } // namespace internal // =================================================================== // emulates google3/base/logging.cc // If the minimum logging level is not set, we default to logging messages for // all levels. #ifndef GOOGLE_PROTOBUF_MIN_LOG_LEVEL #define GOOGLE_PROTOBUF_MIN_LOG_LEVEL LOGLEVEL_INFO #endif namespace internal { #if defined(__ANDROID__) inline void DefaultLogHandler(LogLevel level, const char* filename, int line, const string& message) { if (level < GOOGLE_PROTOBUF_MIN_LOG_LEVEL) { return; } static const char* level_names[] = {"INFO", "WARNING", "ERROR", "FATAL"}; static const int android_log_levels[] = { ANDROID_LOG_INFO, // LOG(INFO), ANDROID_LOG_WARN, // LOG(WARNING) ANDROID_LOG_ERROR, // LOG(ERROR) ANDROID_LOG_FATAL, // LOG(FATAL) }; // Bound the logging level. const int android_log_level = android_log_levels[level]; ::std::ostringstream ostr; ostr << "[libprotobuf " << level_names[level] << " " << filename << ":" << line << "] " << message.c_str(); // Output the log string the Android log at the appropriate level. __android_log_write(android_log_level, "libprotobuf-native", ostr.str().c_str()); // Also output to std::cerr. fprintf(stderr, "%s", ostr.str().c_str()); fflush(stderr); // Indicate termination if needed. if (android_log_level == ANDROID_LOG_FATAL) { __android_log_write(ANDROID_LOG_FATAL, "libprotobuf-native", "terminating.\n"); } } #else void DefaultLogHandler(LogLevel level, const char* filename, int line, const string& message) { if (level < GOOGLE_PROTOBUF_MIN_LOG_LEVEL) { return; } static const char* level_names[] = { "INFO", "WARNING", "ERROR", "FATAL" }; // We use fprintf() instead of cerr because we want this to work at static // initialization time. fprintf(stderr, "[libprotobuf %s %s:%d] %s\n", level_names[level], filename, line, message.c_str()); fflush(stderr); // Needed on MSVC. } #endif void NullLogHandler(LogLevel /* level */, const char* /* filename */, int /* line */, const string& /* message */) { // Nothing. } static LogHandler* log_handler_ = &DefaultLogHandler; static int log_silencer_count_ = 0; static Mutex* log_silencer_count_mutex_ = NULL; GOOGLE_PROTOBUF_DECLARE_ONCE(log_silencer_count_init_); void DeleteLogSilencerCount() { delete log_silencer_count_mutex_; log_silencer_count_mutex_ = NULL; } void InitLogSilencerCount() { log_silencer_count_mutex_ = new Mutex; OnShutdown(&DeleteLogSilencerCount); } void InitLogSilencerCountOnce() { GoogleOnceInit(&log_silencer_count_init_, &InitLogSilencerCount); } LogMessage& LogMessage::operator<<(const string& value) { message_ += value; return *this; } LogMessage& LogMessage::operator<<(const char* value) { message_ += value; return *this; } LogMessage& LogMessage::operator<<(const StringPiece& value) { message_ += value.ToString(); return *this; } LogMessage& LogMessage::operator<<( const ::google::protobuf::util::Status& status) { message_ += status.ToString(); return *this; } LogMessage& LogMessage::operator<<(const uint128& value) { std::ostringstream str; str << value; message_ += str.str(); return *this; } // Since this is just for logging, we don't care if the current locale changes // the results -- in fact, we probably prefer that. So we use snprintf() // instead of Simple*toa(). #undef DECLARE_STREAM_OPERATOR #define DECLARE_STREAM_OPERATOR(TYPE, FORMAT) \ LogMessage& LogMessage::operator<<(TYPE value) { \ /* 128 bytes should be big enough for any of the primitive */ \ /* values which we print with this, but well use snprintf() */ \ /* anyway to be extra safe. */ \ char buffer[128]; \ snprintf(buffer, sizeof(buffer), FORMAT, value); \ /* Guard against broken MSVC snprintf(). */ \ buffer[sizeof(buffer)-1] = '\0'; \ message_ += buffer; \ return *this; \ } DECLARE_STREAM_OPERATOR(char , "%c" ) DECLARE_STREAM_OPERATOR(int , "%d" ) DECLARE_STREAM_OPERATOR(unsigned int , "%u" ) DECLARE_STREAM_OPERATOR(long , "%ld") DECLARE_STREAM_OPERATOR(unsigned long, "%lu") DECLARE_STREAM_OPERATOR(double , "%g" ) DECLARE_STREAM_OPERATOR(void* , "%p" ) DECLARE_STREAM_OPERATOR(long long , "%" GOOGLE_LL_FORMAT "d") DECLARE_STREAM_OPERATOR(unsigned long long, "%" GOOGLE_LL_FORMAT "u") #undef DECLARE_STREAM_OPERATOR LogMessage::LogMessage(LogLevel level, const char* filename, int line) : level_(level), filename_(filename), line_(line) {} LogMessage::~LogMessage() {} void LogMessage::Finish() { bool suppress = false; if (level_ != LOGLEVEL_FATAL) { InitLogSilencerCountOnce(); MutexLock lock(log_silencer_count_mutex_); suppress = log_silencer_count_ > 0; } if (!suppress) { log_handler_(level_, filename_, line_, message_); } if (level_ == LOGLEVEL_FATAL) { #if PROTOBUF_USE_EXCEPTIONS throw FatalException(filename_, line_, message_); #else abort(); #endif } } void LogFinisher::operator=(LogMessage& other) { other.Finish(); } } // namespace internal LogHandler* SetLogHandler(LogHandler* new_func) { LogHandler* old = internal::log_handler_; if (old == &internal::NullLogHandler) { old = NULL; } if (new_func == NULL) { internal::log_handler_ = &internal::NullLogHandler; } else { internal::log_handler_ = new_func; } return old; } LogSilencer::LogSilencer() { internal::InitLogSilencerCountOnce(); MutexLock lock(internal::log_silencer_count_mutex_); ++internal::log_silencer_count_; }; LogSilencer::~LogSilencer() { internal::InitLogSilencerCountOnce(); MutexLock lock(internal::log_silencer_count_mutex_); --internal::log_silencer_count_; }; // =================================================================== // emulates google3/base/callback.cc Closure::~Closure() {} namespace internal { FunctionClosure0::~FunctionClosure0() {} } void DoNothing() {} // =================================================================== // emulates google3/base/mutex.cc #ifdef _WIN32 struct Mutex::Internal { CRITICAL_SECTION mutex; #ifndef NDEBUG // Used only to implement AssertHeld(). DWORD thread_id; #endif }; Mutex::Mutex() : mInternal(new Internal) { InitializeCriticalSection(&mInternal->mutex); } Mutex::~Mutex() { DeleteCriticalSection(&mInternal->mutex); delete mInternal; } void Mutex::Lock() { EnterCriticalSection(&mInternal->mutex); #ifndef NDEBUG mInternal->thread_id = GetCurrentThreadId(); #endif } void Mutex::Unlock() { #ifndef NDEBUG mInternal->thread_id = 0; #endif LeaveCriticalSection(&mInternal->mutex); } void Mutex::AssertHeld() { #ifndef NDEBUG GOOGLE_DCHECK_EQ(mInternal->thread_id, GetCurrentThreadId()); #endif } #elif defined(HAVE_PTHREAD) struct Mutex::Internal { pthread_mutex_t mutex; }; Mutex::Mutex() : mInternal(new Internal) { pthread_mutex_init(&mInternal->mutex, NULL); } Mutex::~Mutex() { pthread_mutex_destroy(&mInternal->mutex); delete mInternal; } void Mutex::Lock() { int result = pthread_mutex_lock(&mInternal->mutex); if (result != 0) { GOOGLE_LOG(FATAL) << "pthread_mutex_lock: " << strerror(result); } } void Mutex::Unlock() { int result = pthread_mutex_unlock(&mInternal->mutex); if (result != 0) { GOOGLE_LOG(FATAL) << "pthread_mutex_unlock: " << strerror(result); } } void Mutex::AssertHeld() { // pthreads dosn't provide a way to check which thread holds the mutex. // TODO(kenton): Maybe keep track of locking thread ID like with WIN32? } #endif // =================================================================== // emulates google3/util/endian/endian.h // // TODO(xiaofeng): PROTOBUF_LITTLE_ENDIAN is unfortunately defined in // google/protobuf/io/coded_stream.h and therefore can not be used here. // Maybe move that macro definition here in the furture. uint32 ghtonl(uint32 x) { union { uint32 result; uint8 result_array[4]; }; result_array[0] = static_cast(x >> 24); result_array[1] = static_cast((x >> 16) & 0xFF); result_array[2] = static_cast((x >> 8) & 0xFF); result_array[3] = static_cast(x & 0xFF); return result; } // =================================================================== // Shutdown support. namespace internal { typedef void OnShutdownFunc(); struct ShutdownData { ~ShutdownData() { for (int i = 0; i < functions.size(); i++) { functions[i](); } for (int i = 0; i < strings.size(); i++) { strings[i]->~string(); } for (int i = 0; i < messages.size(); i++) { messages[i]->~MessageLite(); } } vector functions; vector strings; vector messages; Mutex mutex; }; ShutdownData* shutdown_data = NULL; GOOGLE_PROTOBUF_DECLARE_ONCE(shutdown_functions_init); void InitShutdownFunctions() { shutdown_data = new ShutdownData; } inline void InitShutdownFunctionsOnce() { GoogleOnceInit(&shutdown_functions_init, &InitShutdownFunctions); } void OnShutdown(void (*func)()) { InitShutdownFunctionsOnce(); MutexLock lock(&shutdown_data->mutex); shutdown_data->functions.push_back(func); } void OnShutdownDestroyString(const std::string* ptr) { InitShutdownFunctionsOnce(); MutexLock lock(&shutdown_data->mutex); shutdown_data->strings.push_back(ptr); } void OnShutdownDestroyMessage(const void* ptr) { InitShutdownFunctionsOnce(); MutexLock lock(&shutdown_data->mutex); shutdown_data->messages.push_back(static_cast(ptr)); } } // namespace internal void ShutdownProtobufLibrary() { internal::InitShutdownFunctionsOnce(); // We don't need to lock shutdown_functions_mutex because it's up to the // caller to make sure that no one is using the library before this is // called. // Make it safe to call this multiple times. if (internal::shutdown_data == NULL) return; delete internal::shutdown_data; internal::shutdown_data = NULL; } #if PROTOBUF_USE_EXCEPTIONS FatalException::~FatalException() throw() {} const char* FatalException::what() const throw() { return message_.c_str(); } #endif } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/common.h000066400000000000000000000214531334102242000300770ustar00rootroot00000000000000// 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) and others // // Contains basic types and utilities used by the rest of the library. #ifndef GOOGLE_PROTOBUF_COMMON_H__ #define GOOGLE_PROTOBUF_COMMON_H__ #include #include #include #include #include #include #include #include #include // TODO(liujisi): Remove the following includes after the include clean-up. #include #include #include #include #ifndef PROTOBUF_USE_EXCEPTIONS #if defined(_MSC_VER) && defined(_CPPUNWIND) #define PROTOBUF_USE_EXCEPTIONS 1 #elif defined(__EXCEPTIONS) #define PROTOBUF_USE_EXCEPTIONS 1 #else #define PROTOBUF_USE_EXCEPTIONS 0 #endif #endif #if PROTOBUF_USE_EXCEPTIONS #include #endif #if defined(__APPLE__) #include // for TARGET_OS_IPHONE #endif #if defined(__ANDROID__) || defined(GOOGLE_PROTOBUF_OS_ANDROID) || (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || defined(GOOGLE_PROTOBUF_OS_IPHONE) #include #endif #if defined(_WIN32) && defined(GetMessage) // Allow GetMessage to be used as a valid method name in protobuf classes. // windows.h defines GetMessage() as a macro. Let's re-define it as an inline // function. The inline function should be equivalent for C++ users. inline BOOL GetMessage_Win32( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { return GetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); } #undef GetMessage inline BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { return GetMessage_Win32(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); } #endif namespace std {} namespace google { namespace protobuf { namespace internal { // Some of these constants are macros rather than const ints so that they can // be used in #if directives. // The current version, represented as a single integer to make comparison // easier: major * 10^6 + minor * 10^3 + micro #define GOOGLE_PROTOBUF_VERSION 3005001 // A suffix string for alpha, beta or rc releases. Empty for stable releases. #define GOOGLE_PROTOBUF_VERSION_SUFFIX "" // The minimum library version which works with the current version of the // headers. #define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 3005000 // The minimum header version which works with the current version of // the library. This constant should only be used by protoc's C++ code // generator. static const int kMinHeaderVersionForLibrary = 3005000; // The minimum protoc version which works with the current version of the // headers. #define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 3005000 // The minimum header version which works with the current version of // protoc. This constant should only be used in VerifyVersion(). static const int kMinHeaderVersionForProtoc = 3005000; // Verifies that the headers and libraries are compatible. Use the macro // below to call this. void LIBPROTOBUF_EXPORT VerifyVersion(int headerVersion, int minLibraryVersion, const char* filename); // Converts a numeric version number to a string. std::string LIBPROTOBUF_EXPORT VersionString(int version); } // namespace internal // Place this macro in your main() function (or somewhere before you attempt // to use the protobuf library) to verify that the version you link against // matches the headers you compiled against. If a version mismatch is // detected, the process will abort. #define GOOGLE_PROTOBUF_VERIFY_VERSION \ ::google::protobuf::internal::VerifyVersion( \ GOOGLE_PROTOBUF_VERSION, GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION, \ __FILE__) // =================================================================== // from google3/util/utf8/public/unilib.h class StringPiece; namespace internal { // Checks if the buffer contains structurally-valid UTF-8. Implemented in // structurally_valid.cc. LIBPROTOBUF_EXPORT bool IsStructurallyValidUTF8(const char* buf, int len); inline bool IsStructurallyValidUTF8(const std::string& str) { return IsStructurallyValidUTF8(str.data(), static_cast(str.length())); } // Returns initial number of bytes of structually valid UTF-8. LIBPROTOBUF_EXPORT int UTF8SpnStructurallyValid(const StringPiece& str); // Coerce UTF-8 byte string in src_str to be // a structurally-valid equal-length string by selectively // overwriting illegal bytes with replace_char (typically ' ' or '?'). // replace_char must be legal printable 7-bit Ascii 0x20..0x7e. // src_str is read-only. // // Returns pointer to output buffer, src_str.data() if no changes were made, // or idst if some bytes were changed. idst is allocated by the caller // and must be at least as big as src_str // // Optimized for: all structurally valid and no byte copying is done. // LIBPROTOBUF_EXPORT char* UTF8CoerceToStructurallyValid( const StringPiece& str, char* dst, char replace_char); } // namespace internal // =================================================================== // Shutdown support. // Shut down the entire protocol buffers library, deleting all static-duration // objects allocated by the library or by generated .pb.cc files. // // There are two reasons you might want to call this: // * You use a draconian definition of "memory leak" in which you expect // every single malloc() to have a corresponding free(), even for objects // which live until program exit. // * You are writing a dynamically-loaded library which needs to clean up // after itself when the library is unloaded. // // It is safe to call this multiple times. However, it is not safe to use // any other part of the protocol buffers library after // ShutdownProtobufLibrary() has been called. LIBPROTOBUF_EXPORT void ShutdownProtobufLibrary(); namespace internal { // Register a function to be called when ShutdownProtocolBuffers() is called. LIBPROTOBUF_EXPORT void OnShutdown(void (*func)()); // Destroy the string (call string destructor) LIBPROTOBUF_EXPORT void OnShutdownDestroyString(const std::string* ptr); // Destroy (not delete) the message LIBPROTOBUF_EXPORT void OnShutdownDestroyMessage(const void* ptr); } // namespace internal #if PROTOBUF_USE_EXCEPTIONS class FatalException : public std::exception { public: FatalException(const char* filename, int line, const std::string& message) : filename_(filename), line_(line), message_(message) {} virtual ~FatalException() throw(); virtual const char* what() const throw(); const char* filename() const { return filename_; } int line() const { return line_; } const std::string& message() const { return message_; } private: const char* filename_; const int line_; const std::string message_; }; #endif // This is at the end of the file instead of the beginning to work around a bug // in some versions of MSVC. // TODO(acozzette): remove these using statements using std::istream; using std::ostream; using std::pair; using std::string; using std::vector; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_COMMON_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/common_unittest.cc000066400000000000000000000244271334102242000322000ustar00rootroot00000000000000// 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 #include #include #include #include #include #include namespace google { namespace protobuf { namespace { // TODO(kenton): More tests. #ifdef PACKAGE_VERSION // only defined when using automake, not MSVC TEST(VersionTest, VersionMatchesConfig) { // Verify that the version string specified in config.h matches the one // in common.h. The config.h version is a string which may have a suffix // like "beta" or "rc1", so we remove that. string version = PACKAGE_VERSION; int pos = 0; while (pos < version.size() && (ascii_isdigit(version[pos]) || version[pos] == '.')) { ++pos; } version.erase(pos); EXPECT_EQ(version, internal::VersionString(GOOGLE_PROTOBUF_VERSION)); } #endif // PACKAGE_VERSION TEST(CommonTest, IntMinMaxConstants) { // kint32min was declared incorrectly in the first release of protobufs. // Ugh. EXPECT_LT(kint32min, kint32max); EXPECT_EQ(static_cast(kint32min), static_cast(kint32max) + 1); EXPECT_LT(kint64min, kint64max); EXPECT_EQ(static_cast(kint64min), static_cast(kint64max) + 1); EXPECT_EQ(0, kuint32max + 1); EXPECT_EQ(0, kuint64max + 1); } vector captured_messages_; void CaptureLog(LogLevel level, const char* filename, int line, const string& message) { captured_messages_.push_back( strings::Substitute("$0 $1:$2: $3", implicit_cast(level), filename, line, message)); } TEST(LoggingTest, DefaultLogging) { CaptureTestStderr(); int line = __LINE__; GOOGLE_LOG(INFO ) << "A message."; GOOGLE_LOG(WARNING) << "A warning."; GOOGLE_LOG(ERROR ) << "An error."; 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); } TEST(LoggingTest, NullLogging) { LogHandler* old_handler = SetLogHandler(NULL); CaptureTestStderr(); GOOGLE_LOG(INFO ) << "A message."; GOOGLE_LOG(WARNING) << "A warning."; GOOGLE_LOG(ERROR ) << "An error."; EXPECT_TRUE(SetLogHandler(old_handler) == NULL); string text = GetCapturedTestStderr(); EXPECT_EQ("", text); } TEST(LoggingTest, CaptureLogging) { captured_messages_.clear(); LogHandler* old_handler = SetLogHandler(&CaptureLog); int start_line = __LINE__; GOOGLE_LOG(ERROR) << "An error."; GOOGLE_LOG(WARNING) << "A warning."; 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]); } TEST(LoggingTest, SilenceLogging) { captured_messages_.clear(); LogHandler* old_handler = SetLogHandler(&CaptureLog); int line1 = __LINE__; GOOGLE_LOG(INFO) << "Visible1"; LogSilencer* silencer1 = new LogSilencer; GOOGLE_LOG(INFO) << "Not visible."; LogSilencer* silencer2 = new LogSilencer; GOOGLE_LOG(INFO) << "Not visible."; delete silencer1; GOOGLE_LOG(INFO) << "Not visible."; delete silencer2; int line2 = __LINE__; GOOGLE_LOG(INFO) << "Visible2"; 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]); } class ClosureTest : public testing::Test { public: void SetA123Method() { a_ = 123; } static void SetA123Function() { current_instance_->a_ = 123; } void SetAMethod(int a) { a_ = a; } void SetCMethod(string c) { c_ = c; } static void SetAFunction(int a) { current_instance_->a_ = a; } static void SetCFunction(string c) { current_instance_->c_ = c; } void SetABMethod(int a, const char* b) { a_ = a; b_ = b; } static void SetABFunction(int a, const char* b) { current_instance_->a_ = a; current_instance_->b_ = b; } virtual void SetUp() { current_instance_ = this; a_ = 0; b_ = NULL; c_.clear(); permanent_closure_ = NULL; } void DeleteClosureInCallback() { delete permanent_closure_; } int a_; const char* b_; string c_; Closure* permanent_closure_; static ClosureTest* current_instance_; }; ClosureTest* ClosureTest::current_instance_ = NULL; TEST_F(ClosureTest, TestClosureFunction0) { Closure* closure = NewCallback(&SetA123Function); EXPECT_NE(123, a_); closure->Run(); EXPECT_EQ(123, a_); } TEST_F(ClosureTest, TestClosureMethod0) { Closure* closure = NewCallback(current_instance_, &ClosureTest::SetA123Method); EXPECT_NE(123, a_); closure->Run(); EXPECT_EQ(123, a_); } TEST_F(ClosureTest, TestClosureFunction1) { Closure* closure = NewCallback(&SetAFunction, 456); EXPECT_NE(456, a_); closure->Run(); EXPECT_EQ(456, a_); } TEST_F(ClosureTest, TestClosureMethod1) { Closure* closure = NewCallback(current_instance_, &ClosureTest::SetAMethod, 456); EXPECT_NE(456, a_); closure->Run(); EXPECT_EQ(456, a_); } TEST_F(ClosureTest, TestClosureFunction1String) { Closure* closure = NewCallback(&SetCFunction, string("test")); EXPECT_NE("test", c_); closure->Run(); EXPECT_EQ("test", c_); } TEST_F(ClosureTest, TestClosureMethod1String) { Closure* closure = NewCallback(current_instance_, &ClosureTest::SetCMethod, string("test")); EXPECT_NE("test", c_); closure->Run(); EXPECT_EQ("test", c_); } TEST_F(ClosureTest, TestClosureFunction2) { const char* cstr = "hello"; Closure* closure = NewCallback(&SetABFunction, 789, cstr); EXPECT_NE(789, a_); EXPECT_NE(cstr, b_); closure->Run(); EXPECT_EQ(789, a_); EXPECT_EQ(cstr, b_); } TEST_F(ClosureTest, TestClosureMethod2) { const char* cstr = "hello"; Closure* closure = NewCallback(current_instance_, &ClosureTest::SetABMethod, 789, cstr); EXPECT_NE(789, a_); EXPECT_NE(cstr, b_); closure->Run(); EXPECT_EQ(789, a_); EXPECT_EQ(cstr, b_); } // Repeat all of the above with NewPermanentCallback() TEST_F(ClosureTest, TestPermanentClosureFunction0) { Closure* closure = NewPermanentCallback(&SetA123Function); EXPECT_NE(123, a_); closure->Run(); EXPECT_EQ(123, a_); a_ = 0; closure->Run(); EXPECT_EQ(123, a_); delete closure; } TEST_F(ClosureTest, TestPermanentClosureMethod0) { Closure* closure = NewPermanentCallback(current_instance_, &ClosureTest::SetA123Method); EXPECT_NE(123, a_); closure->Run(); EXPECT_EQ(123, a_); a_ = 0; closure->Run(); EXPECT_EQ(123, a_); delete closure; } TEST_F(ClosureTest, TestPermanentClosureFunction1) { Closure* closure = NewPermanentCallback(&SetAFunction, 456); EXPECT_NE(456, a_); closure->Run(); EXPECT_EQ(456, a_); a_ = 0; closure->Run(); EXPECT_EQ(456, a_); delete closure; } TEST_F(ClosureTest, TestPermanentClosureMethod1) { Closure* closure = NewPermanentCallback(current_instance_, &ClosureTest::SetAMethod, 456); EXPECT_NE(456, a_); closure->Run(); EXPECT_EQ(456, a_); a_ = 0; closure->Run(); EXPECT_EQ(456, a_); delete closure; } TEST_F(ClosureTest, TestPermanentClosureFunction2) { const char* cstr = "hello"; Closure* closure = NewPermanentCallback(&SetABFunction, 789, cstr); EXPECT_NE(789, a_); EXPECT_NE(cstr, b_); closure->Run(); EXPECT_EQ(789, a_); EXPECT_EQ(cstr, b_); a_ = 0; b_ = NULL; closure->Run(); EXPECT_EQ(789, a_); EXPECT_EQ(cstr, b_); delete closure; } TEST_F(ClosureTest, TestPermanentClosureMethod2) { const char* cstr = "hello"; Closure* closure = NewPermanentCallback(current_instance_, &ClosureTest::SetABMethod, 789, cstr); EXPECT_NE(789, a_); EXPECT_NE(cstr, b_); closure->Run(); EXPECT_EQ(789, a_); EXPECT_EQ(cstr, b_); a_ = 0; b_ = NULL; closure->Run(); EXPECT_EQ(789, a_); EXPECT_EQ(cstr, b_); delete closure; } TEST_F(ClosureTest, TestPermanentClosureDeleteInCallback) { permanent_closure_ = NewPermanentCallback((ClosureTest*) this, &ClosureTest::DeleteClosureInCallback); permanent_closure_->Run(); } } // anonymous namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/fastmem.h000066400000000000000000000134521334102242000302430ustar00rootroot00000000000000// 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. // Fast memory copying and comparison routines. // strings::fastmemcmp_inlined() replaces memcmp() // strings::memcpy_inlined() replaces memcpy() // strings::memeq(a, b, n) replaces memcmp(a, b, n) == 0 // // strings::*_inlined() routines are inline versions of the // routines exported by this module. Sometimes using the inlined // versions is faster. Measure before using the inlined versions. // // Performance measurement: // strings::fastmemcmp_inlined // Analysis: memcmp, fastmemcmp_inlined, fastmemcmp // 2012-01-30 #ifndef GOOGLE_PROTOBUF_STUBS_FASTMEM_H_ #define GOOGLE_PROTOBUF_STUBS_FASTMEM_H_ #include #include #include #include namespace google { namespace protobuf { namespace internal { // Return true if the n bytes at a equal the n bytes at b. // The regions are allowed to overlap. // // The performance is similar to the performance memcmp(), but faster for // moderately-sized inputs, or inputs that share a common prefix and differ // somewhere in their last 8 bytes. Further optimizations can be added later // if it makes sense to do so.:w inline bool memeq(const char* a, const char* b, size_t n) { size_t n_rounded_down = n & ~static_cast(7); if (GOOGLE_PREDICT_FALSE(n_rounded_down == 0)) { // n <= 7 return memcmp(a, b, n) == 0; } // n >= 8 uint64 u = GOOGLE_UNALIGNED_LOAD64(a) ^ GOOGLE_UNALIGNED_LOAD64(b); uint64 v = GOOGLE_UNALIGNED_LOAD64(a + n - 8) ^ GOOGLE_UNALIGNED_LOAD64(b + n - 8); if ((u | v) != 0) { // The first or last 8 bytes differ. return false; } a += 8; b += 8; n = n_rounded_down - 8; if (n > 128) { // As of 2012, memcmp on x86-64 uses a big unrolled loop with SSE2 // instructions, and while we could try to do something faster, it // doesn't seem worth pursuing. return memcmp(a, b, n) == 0; } for (; n >= 16; n -= 16) { uint64 x = GOOGLE_UNALIGNED_LOAD64(a) ^ GOOGLE_UNALIGNED_LOAD64(b); uint64 y = GOOGLE_UNALIGNED_LOAD64(a + 8) ^ GOOGLE_UNALIGNED_LOAD64(b + 8); if ((x | y) != 0) { return false; } a += 16; b += 16; } // n must be 0 or 8 now because it was a multiple of 8 at the top of the loop. return n == 0 || GOOGLE_UNALIGNED_LOAD64(a) == GOOGLE_UNALIGNED_LOAD64(b); } inline int fastmemcmp_inlined(const char *a, const char *b, size_t n) { if (n >= 64) { return memcmp(a, b, n); } const char* a_limit = a + n; while (a + sizeof(uint64) <= a_limit && GOOGLE_UNALIGNED_LOAD64(a) == GOOGLE_UNALIGNED_LOAD64(b)) { a += sizeof(uint64); b += sizeof(uint64); } if (a + sizeof(uint32) <= a_limit && GOOGLE_UNALIGNED_LOAD32(a) == GOOGLE_UNALIGNED_LOAD32(b)) { a += sizeof(uint32); b += sizeof(uint32); } while (a < a_limit) { int d = static_cast(static_cast(*a++) - static_cast(*b++)); if (d) return d; } return 0; } // The standard memcpy operation is slow for variable small sizes. // This implementation inlines the optimal realization for sizes 1 to 16. // To avoid code bloat don't use it in case of not performance-critical spots, // nor when you don't expect very frequent values of size <= 16. inline void memcpy_inlined(char *dst, const char *src, size_t size) { // Compiler inlines code with minimal amount of data movement when third // parameter of memcpy is a constant. switch (size) { case 1: memcpy(dst, src, 1); break; case 2: memcpy(dst, src, 2); break; case 3: memcpy(dst, src, 3); break; case 4: memcpy(dst, src, 4); break; case 5: memcpy(dst, src, 5); break; case 6: memcpy(dst, src, 6); break; case 7: memcpy(dst, src, 7); break; case 8: memcpy(dst, src, 8); break; case 9: memcpy(dst, src, 9); break; case 10: memcpy(dst, src, 10); break; case 11: memcpy(dst, src, 11); break; case 12: memcpy(dst, src, 12); break; case 13: memcpy(dst, src, 13); break; case 14: memcpy(dst, src, 14); break; case 15: memcpy(dst, src, 15); break; case 16: memcpy(dst, src, 16); break; default: memcpy(dst, src, size); break; } } } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_FASTMEM_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/hash.h000066400000000000000000000355641334102242000275420ustar00rootroot00000000000000// 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) // // Deals with the fact that hash_map is not defined everywhere. #ifndef GOOGLE_PROTOBUF_STUBS_HASH_H__ #define GOOGLE_PROTOBUF_STUBS_HASH_H__ #include #include #define GOOGLE_PROTOBUF_HAVE_HASH_MAP 1 #define GOOGLE_PROTOBUF_HAVE_HASH_SET 1 // Use C++11 unordered_{map|set} if available. #if ((defined(_LIBCPP_STD_VER) && _LIBCPP_STD_VER >= 11) || \ (((__cplusplus >= 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X)) && \ (__GLIBCXX__ > 20090421))) # define GOOGLE_PROTOBUF_HAS_CXX11_HASH // For XCode >= 4.6: the compiler is clang with libc++. // For earlier XCode version: the compiler is gcc-4.2.1 with libstdc++. // libc++ provides and friends even in non C++11 mode, // and it does not provide the tr1 library. Therefore the following macro // checks against this special case. // Note that we should not test the __APPLE_CC__ version number or the // __clang__ macro, since the new compiler can still use -stdlib=libstdc++, in // which case is not compilable without -std=c++11 #elif defined(__APPLE_CC__) # if __GNUC__ >= 4 # define GOOGLE_PROTOBUF_HAS_TR1 # else // Not tested for gcc < 4... These setting can compile under 4.2.1 though. # define GOOGLE_PROTOBUF_HASH_NAMESPACE __gnu_cxx # include # define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map # include # define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set # endif // Version checks for gcc. #elif defined(__GNUC__) // For GCC 4.x+, use tr1::unordered_map/set; otherwise, follow the // instructions from: // https://gcc.gnu.org/onlinedocs/libstdc++/manual/backwards.html # if __GNUC__ >= 4 # define GOOGLE_PROTOBUF_HAS_TR1 # elif __GNUC__ >= 3 # include # define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map # include # define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set # if __GNUC__ == 3 && __GNUC_MINOR__ == 0 # define GOOGLE_PROTOBUF_HASH_NAMESPACE std // GCC 3.0 # else # define GOOGLE_PROTOBUF_HASH_NAMESPACE __gnu_cxx // GCC 3.1 and later # endif # else # define GOOGLE_PROTOBUF_HASH_NAMESPACE # include # define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map # include # define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set # endif // GCC <= 4.1 does not define std::tr1::hash for `long long int` or `long long unsigned int` # if __GNUC__ == 4 && defined(__GNUC__MINOR__) && __GNUC__MINOR__ <= 1 # undef GOOGLE_PROTOBUF_HAS_TR1 # undef GOOGLE_PROTOBUF_HAVE_HASH_MAP # undef GOOGLE_PROTOBUF_HAVE_HASH_SET # endif // Version checks for MSC. // Apparently Microsoft decided to move hash_map *back* to the std namespace in // MSVC 2010: // http://blogs.msdn.com/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx // And.. they are moved back to stdext in MSVC 2013 (haven't checked 2012). That // said, use unordered_map for MSVC 2010 and beyond is our safest bet. #elif defined(_MSC_VER) # if _MSC_VER >= 1600 // Since Visual Studio 2010 # define GOOGLE_PROTOBUF_HAS_CXX11_HASH # define GOOGLE_PROTOBUF_HASH_COMPARE std::hash_compare # elif _MSC_VER >= 1500 // Since Visual Studio 2008 # define GOOGLE_PROTOBUF_HASH_NAMESPACE stdext # include # define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map # include # define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set # define GOOGLE_PROTOBUF_HASH_COMPARE stdext::hash_compare # define GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE # elif _MSC_VER >= 1310 # define GOOGLE_PROTOBUF_HASH_NAMESPACE stdext # include # define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map # include # define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set # define GOOGLE_PROTOBUF_HASH_COMPARE stdext::hash_compare # else # define GOOGLE_PROTOBUF_HASH_NAMESPACE std # include # define GOOGLE_PROTOBUF_HASH_MAP_CLASS hash_map # include # define GOOGLE_PROTOBUF_HASH_SET_CLASS hash_set # define GOOGLE_PROTOBUF_HASH_COMPARE stdext::hash_compare # endif // **ADD NEW COMPILERS SUPPORT HERE.** // For other compilers, undefine the macro and fallback to use std::map, in // google/protobuf/stubs/hash.h #else # undef GOOGLE_PROTOBUF_HAVE_HASH_MAP # undef GOOGLE_PROTOBUF_HAVE_HASH_SET #endif #if defined(GOOGLE_PROTOBUF_HAS_CXX11_HASH) # define GOOGLE_PROTOBUF_HASH_NAMESPACE std # include # define GOOGLE_PROTOBUF_HASH_MAP_CLASS unordered_map # include # define GOOGLE_PROTOBUF_HASH_SET_CLASS unordered_set #elif defined(GOOGLE_PROTOBUF_HAS_TR1) # define GOOGLE_PROTOBUF_HASH_NAMESPACE std::tr1 # include # define GOOGLE_PROTOBUF_HASH_MAP_CLASS unordered_map # include # define GOOGLE_PROTOBUF_HASH_SET_CLASS unordered_set #endif # define GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_START \ namespace google { \ namespace protobuf { # define GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_END }} #undef GOOGLE_PROTOBUF_HAS_CXX11_HASH #undef GOOGLE_PROTOBUF_HAS_TR1 #if defined(GOOGLE_PROTOBUF_HAVE_HASH_MAP) && \ defined(GOOGLE_PROTOBUF_HAVE_HASH_SET) #else #define GOOGLE_PROTOBUF_MISSING_HASH #include #include #endif namespace google { namespace protobuf { #ifdef GOOGLE_PROTOBUF_MISSING_HASH #undef GOOGLE_PROTOBUF_MISSING_HASH // This system doesn't have hash_map or hash_set. Emulate them using map and // set. // Make hash be the same as less. Note that everywhere where custom // hash functions are defined in the protobuf code, they are also defined such // that they can be used as "less" functions, which is required by MSVC anyway. template struct hash { // Dummy, just to make derivative hash functions compile. int operator()(const Key& key) { GOOGLE_LOG(FATAL) << "Should never be called."; return 0; } inline bool operator()(const Key& a, const Key& b) const { return a < b; } }; // Make sure char* is compared by value. template <> struct hash { // Dummy, just to make derivative hash functions compile. int operator()(const char* key) { GOOGLE_LOG(FATAL) << "Should never be called."; return 0; } inline bool operator()(const char* a, const char* b) const { return strcmp(a, b) < 0; } }; template , typename EqualKey = std::equal_to, typename Alloc = std::allocator< std::pair > > class hash_map : public std::map { typedef std::map BaseClass; public: hash_map(int a = 0, const HashFcn& b = HashFcn(), const EqualKey& c = EqualKey(), const Alloc& d = Alloc()) : BaseClass(b, d) {} HashFcn hash_function() const { return HashFcn(); } }; template , typename EqualKey = std::equal_to > class hash_set : public std::set { public: hash_set(int = 0) {} HashFcn hash_function() const { return HashFcn(); } }; #elif defined(_MSC_VER) && !defined(_STLPORT_VERSION) template struct hash : public GOOGLE_PROTOBUF_HASH_COMPARE { }; // MSVC's hash_compare hashes based on the string contents but // compares based on the string pointer. WTF? class CstringLess { public: inline bool operator()(const char* a, const char* b) const { return strcmp(a, b) < 0; } }; template <> struct hash : public GOOGLE_PROTOBUF_HASH_COMPARE {}; #ifdef GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE template struct InternalHashCompare : public GOOGLE_PROTOBUF_HASH_COMPARE { InternalHashCompare() {} InternalHashCompare(HashFcn hashfcn, EqualKey equalkey) : hashfcn_(hashfcn), equalkey_(equalkey) {} size_t operator()(const Key& key) const { return hashfcn_(key); } bool operator()(const Key& key1, const Key& key2) const { return !equalkey_(key1, key2); } HashFcn hashfcn_; EqualKey equalkey_; }; template , typename EqualKey = std::equal_to, typename Alloc = std::allocator< std::pair > > class hash_map : public GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_MAP_CLASS< Key, Data, InternalHashCompare, Alloc> { typedef GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_MAP_CLASS< Key, Data, InternalHashCompare, Alloc> BaseClass; public: hash_map(int a = 0, const HashFcn& b = HashFcn(), const EqualKey& c = EqualKey(), const Alloc& d = Alloc()) : BaseClass(InternalHashCompare(b, c), d) {} HashFcn hash_function() const { return HashFcn(); } }; template , typename EqualKey = std::equal_to > class hash_set : public GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_SET_CLASS< Key, InternalHashCompare > { public: hash_set(int = 0) {} HashFcn hash_function() const { return HashFcn(); } }; #else // GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE template , typename EqualKey = std::equal_to, typename Alloc = std::allocator< std::pair > > class hash_map : public GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_MAP_CLASS< Key, Data, HashFcn, EqualKey, Alloc> { typedef GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_MAP_CLASS< Key, Data, HashFcn, EqualKey, Alloc> BaseClass; public: hash_map(int a = 0, const HashFcn& b = HashFcn(), const EqualKey& c = EqualKey(), const Alloc& d = Alloc()) : BaseClass(a, b, c, d) {} HashFcn hash_function() const { return HashFcn(); } }; template , typename EqualKey = std::equal_to > class hash_set : public GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_SET_CLASS< Key, HashFcn, EqualKey> { public: hash_set(int = 0) {} HashFcn hash_function() const { return HashFcn(); } }; #endif // GOOGLE_PROTOBUF_CONTAINERS_NEED_HASH_COMPARE #else // defined(_MSC_VER) && !defined(_STLPORT_VERSION) template struct hash : public GOOGLE_PROTOBUF_HASH_NAMESPACE::hash { }; template struct hash { inline size_t operator()(const Key* key) const { return reinterpret_cast(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 { inline size_t operator()(const char* str) const { size_t result = 0; for (; *str != '\0'; str++) { result = 5 * result + static_cast(*str); } return result; } }; template<> struct hash { size_t operator()(bool x) const { return static_cast(x); } }; template , typename EqualKey = std::equal_to, typename Alloc = std::allocator< std::pair > > class hash_map : public GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_MAP_CLASS< Key, Data, HashFcn, EqualKey, Alloc> { typedef GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_MAP_CLASS< Key, Data, HashFcn, EqualKey, Alloc> BaseClass; public: hash_map(int a = 0, const HashFcn& b = HashFcn(), const EqualKey& c = EqualKey(), const Alloc& d = Alloc()) : BaseClass(a, b, c, d) {} HashFcn hash_function() const { return HashFcn(); } }; template , typename EqualKey = std::equal_to > class hash_set : public GOOGLE_PROTOBUF_HASH_NAMESPACE::GOOGLE_PROTOBUF_HASH_SET_CLASS< Key, HashFcn, EqualKey> { public: hash_set(int = 0) {} HashFcn hash_function() const { return HashFcn(); } }; #endif // !GOOGLE_PROTOBUF_MISSING_HASH template <> struct hash { inline size_t operator()(const string& key) const { return hash()(key.c_str()); } static const size_t bucket_size = 4; static const size_t min_buckets = 8; inline bool operator()(const string& a, const string& b) const { return a < b; } }; template struct hash > { inline size_t operator()(const pair& key) const { size_t first_hash = hash()(key.first); size_t second_hash = hash()(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 pair& a, const pair& b) const { return a < b; } }; // Used by GCC/SGI STL only. (Why isn't this provided by the standard // library? :( ) struct streq { inline bool operator()(const char* a, const char* b) const { return strcmp(a, b) == 0; } }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_HASH_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/int128.cc000066400000000000000000000151641334102242000277740ustar00rootroot00000000000000// 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 #include #include // NOLINT(readability/streams) #include namespace google { namespace protobuf { const uint128_pod kuint128max = { static_cast(GOOGLE_LONGLONG(0xFFFFFFFFFFFFFFFF)), static_cast(GOOGLE_LONGLONG(0xFFFFFFFFFFFFFFFF)) }; // 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(1) << (sh))) { \ (n) = (n) >> (sh); \ (pos) |= (sh); \ } \ } while (0) static inline int Fls64(uint64 n) { GOOGLE_DCHECK_NE(0, n); int pos = 0; STEP(uint64, n, pos, 0x20); uint32 n32 = n; STEP(uint32, n32, pos, 0x10); STEP(uint32, n32, pos, 0x08); STEP(uint32, n32, pos, 0x04); return pos + ((GOOGLE_ULONGLONG(0x3333333322221100) >> (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 hi = Uint128High64(n)) { return Fls64(hi) + 64; } return Fls64(Uint128Low64(n)); } // Long division/modulo for uint128 implemented using the shift-subtract // division algorithm adapted from: // http://stackoverflow.com/questions/5386377/division-without-using 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_; } if (divisor > dividend) { *quotient_ret = 0; *remainder_ret = dividend; return; } if (divisor == dividend) { *quotient_ret = 1; *remainder_ret = 0; return; } uint128 denominator = divisor; uint128 position = 1; uint128 quotient = 0; // Left aligns the MSB of the denominator and the dividend. int shift = Fls128(dividend) - Fls128(denominator); denominator <<= shift; position <<= shift; // Uses shift-subtract algorithm to divide dividend by denominator. The // remainder will be left in dividend. while (position > 0) { if (dividend >= denominator) { dividend -= denominator; quotient |= position; } position >>= 1; denominator >>= 1; } *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(GOOGLE_ULONGLONG(0x1000000000000000)); // 16^15 div_base_log = 15; break; case std::ios::oct: div = static_cast(GOOGLE_ULONGLONG(01000000000000000000000)); // 8^21 div_base_log = 21; break; default: // std::ios::dec div = static_cast(GOOGLE_ULONGLONG(10000000000000000000)); // 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); if (width > rep.size()) { if ((flags & std::ios::adjustfield) == std::ios::left) { rep.append(width - rep.size(), o.fill()); } else { rep.insert(static_cast(0), width - rep.size(), o.fill()); } } // Stream the final representation in a single "<<" call. return o << rep; } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/int128.h000066400000000000000000000272011334102242000276310ustar00rootroot00000000000000// 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 #include 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 LIBPROTOBUF_EXPORT uint128 { public: UINT128_CONSTEXPR uint128(); // Sets to 0, but don't trust on this behavior. UINT128_CONSTEXPR uint128(uint64 top, uint64 bottom); #ifndef SWIG UINT128_CONSTEXPR uint128(int bottom); UINT128_CONSTEXPR uint128(uint32 bottom); // Top 96 bits = 0 #endif UINT128_CONSTEXPR uint128(uint64 bottom); // hi_ = 0 UINT128_CONSTEXPR uint128(const uint128_pod &val); // Trivial copy constructor, assignment operator and destructor. void Initialize(uint64 top, uint64 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 Uint128Low64(const uint128& v); friend uint64 Uint128High64(const uint128& v); // We add "std::" to avoid including all of port.h. LIBPROTOBUF_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 lo_; uint64 hi_; // Not implemented, just declared for catching automatic type conversions. uint128(uint8); uint128(uint16); 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 hi; uint64 lo; }; LIBPROTOBUF_EXPORT extern const uint128_pod kuint128max; // allow uint128 to be logged LIBPROTOBUF_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 Uint128Low64(const uint128& v) { return v.lo_; } inline uint64 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 top, uint64 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 bottom) : lo_(bottom), hi_(0) {} #ifndef SWIG inline UINT128_CONSTEXPR uint128::uint128(uint32 bottom) : lo_(bottom), hi_(0) {} inline UINT128_CONSTEXPR uint128::uint128(int bottom) : lo_(bottom), hi_(static_cast((bottom < 0) ? -1 : 0)) {} #endif #undef UINT128_CONSTEXPR inline void uint128::Initialize(uint64 top, uint64 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 hi_flip = ~Uint128High64(val); const uint64 lo_flip = ~Uint128Low64(val); const uint64 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 new_hi = (Uint128High64(val) << amount) | (Uint128Low64(val) >> (64 - amount)); uint64 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 new_hi = Uint128High64(val) >> amount; uint64 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 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 a96 = hi_ >> 32; uint64 a64 = hi_ & 0xffffffffu; uint64 a32 = lo_ >> 32; uint64 a00 = lo_ & 0xffffffffu; uint64 b96 = b.hi_ >> 32; uint64 b64 = b.hi_ & 0xffffffffu; uint64 b32 = b.lo_ >> 32; uint64 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 c96 = a96 * b00 + a64 * b32 + a32 * b64 + a00 * b96; uint64 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 #endif // GOOGLE_PROTOBUF_STUBS_INT128_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/int128_unittest.cc000066400000000000000000000361221334102242000317300ustar00rootroot00000000000000// 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 #include #include #include #include #include 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, kuint64max); 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), kuint64max); EXPECT_EQ(Uint128Low64(biggest), kuint64max); 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 + kuint64max, 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), kuint64max); 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(GOOGLE_ULONGLONG(0xffffeeeeddddcccc), GOOGLE_ULONGLONG(0xbbbbaaaa99998888)); b = uint128(GOOGLE_ULONGLONG(0x7777666655554444), GOOGLE_ULONGLONG(0x3333222211110000)); c = a * b; EXPECT_EQ(uint128(GOOGLE_ULONGLONG(0x530EDA741C71D4C3), GOOGLE_ULONGLONG(0xBF25975319080000)), c); EXPECT_EQ(0, c - b * a); EXPECT_EQ(a*a - b*b, (a+b) * (a-b)); // Verified with dc. a = uint128(GOOGLE_ULONGLONG(0x0123456789abcdef), GOOGLE_ULONGLONG(0xfedcba9876543210)); b = uint128(GOOGLE_ULONGLONG(0x02468ace13579bdf), GOOGLE_ULONGLONG(0xfdb97531eca86420)); c = a * b; EXPECT_EQ(uint128(GOOGLE_ULONGLONG(0x97a87f4f261ba3f2), GOOGLE_ULONGLONG(0x342d0bbf48948200)), 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(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(GOOGLE_ULONGLONG(0x530eda741c71d4c3), GOOGLE_ULONGLONG(0xbf25975319080000)); q = uint128(GOOGLE_ULONGLONG(0x4de2cab081), GOOGLE_ULONGLONG(0x14c34ab4676e4bab)); 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:. 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(GOOGLE_ULONGLONG(0x29876d3a0e38ea61), GOOGLE_ULONGLONG(0xdf92cba98c83ffff)); // 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 RandomUint64() { uint64 v1 = rand(); uint64 v2 = rand(); uint64 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::value); EXPECT_TRUE(std::is_trivially_copy_assignable::value); EXPECT_TRUE(std::is_trivially_destructible::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(GOOGLE_ULONGLONG(0x8000000000000000), 0), std::ios::dec, 0, '_', "170141183460469231731687303715884105728"}, {uint128(GOOGLE_ULONGLONG(0x8000000000000000), 0), std::ios::oct, 0, '_', "2000000000000000000000000000000000000000000"}, {uint128(GOOGLE_ULONGLONG(0x8000000000000000), 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 python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/io_win32.cc000066400000000000000000000267361334102242000304070ustar00rootroot00000000000000// 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: laszlocsomor@google.com (Laszlo Csomor) // // Implementation for long-path-aware open/mkdir/access/etc. on Windows, as well // as for the supporting utility functions. // // These functions convert the input path to an absolute Windows path // with "\\?\" prefix, then pass that to _wopen/_wmkdir/_waccess/etc. // (declared in ) respectively. This allows working with files/directories // whose paths are longer than MAX_PATH (260 chars). // // This file is only used on Windows, it's empty on other platforms. #if defined(_WIN32) // Comment this out to fall back to using the ANSI versions (open, mkdir, ...) // instead of the Unicode ones (_wopen, _wmkdir, ...). Doing so can be useful to // debug failing tests if that's caused by the long path support. #define SUPPORT_LONGPATHS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { namespace win32 { namespace { using std::string; using std::wstring; template struct CharTraits { static bool is_alpha(char_type ch); }; template <> struct CharTraits { static bool is_alpha(char ch) { return isalpha(ch); } }; template <> struct CharTraits { static bool is_alpha(wchar_t ch) { return iswalpha(ch); } }; template bool null_or_empty(const char_type* s) { return s == NULL || *s == 0; } // Returns true if the path starts with a drive letter, e.g. "c:". // Note that this won't check for the "\" after the drive letter, so this also // returns true for "c:foo" (which is "c:\${PWD}\foo"). // This check requires that a path not have a longpath prefix ("\\?\"). template bool has_drive_letter(const char_type* ch) { return CharTraits::is_alpha(ch[0]) && ch[1] == ':'; } // Returns true if the path starts with a longpath prefix ("\\?\"). template bool has_longpath_prefix(const char_type* path) { return path[0] == '\\' && path[1] == '\\' && path[2] == '?' && path[3] == '\\'; } template bool is_separator(char_type c) { return c == '/' || c == '\\'; } // Returns true if the path starts with a drive specifier (e.g. "c:\"). template bool is_path_absolute(const char_type* path) { return has_drive_letter(path) && is_separator(path[2]); } template bool is_drive_relative(const char_type* path) { return has_drive_letter(path) && (path[2] == 0 || !is_separator(path[2])); } wstring join_paths(const wstring& path1, const wstring& path2) { if (path1.empty() || is_path_absolute(path2.c_str()) || has_longpath_prefix(path2.c_str())) { return path2; } if (path2.empty()) { return path1; } if (is_separator(path1[path1.size() - 1])) { return is_separator(path2[0]) ? (path1 + path2.substr(1)) : (path1 + path2); } else { return is_separator(path2[0]) ? (path1 + path2) : (path1 + L'\\' + path2); } } wstring normalize(wstring path) { if (has_longpath_prefix(path.c_str())) { path = path.substr(4); } static const wstring dot(L"."); static const wstring dotdot(L".."); std::vector segments; int segment_start = -1; // Find the path segments in `path` (separated by "/"). for (int i = 0;; ++i) { if (!is_separator(path[i]) && path[i] != L'\0') { // The current character does not end a segment, so start one unless it's // already started. if (segment_start < 0) { segment_start = i; } } else if (segment_start >= 0 && i > segment_start) { // The current character is "/" or "\0", so this ends a segment. // Add that to `segments` if there's anything to add; handle "." and "..". wstring segment(path, segment_start, i - segment_start); segment_start = -1; if (segment == dotdot) { if (!segments.empty() && (!has_drive_letter(segments[0].c_str()) || segments.size() > 1)) { segments.pop_back(); } } else if (segment != dot && !segment.empty()) { segments.push_back(segment); } } if (path[i] == L'\0') { break; } } // Handle the case when `path` is just a drive specifier (or some degenerate // form of it, e.g. "c:\.."). if (segments.size() == 1 && segments[0].size() == 2 && has_drive_letter(segments[0].c_str())) { return segments[0] + L'\\'; } // Join all segments. bool first = true; std::wstringstream result; for (int i = 0; i < segments.size(); ++i) { if (!first) { result << L'\\'; } first = false; result << segments[i]; } // Preserve trailing separator if the input contained it. if (!path.empty() && is_separator(path[path.size() - 1])) { result << L'\\'; } return result.str(); } bool as_windows_path(const char* path, wstring* result) { if (null_or_empty(path)) { result->clear(); return true; } wstring wpath; if (!strings::utf8_to_wcs(path, &wpath)) { return false; } if (has_longpath_prefix(wpath.c_str())) { *result = wpath; return true; } if (is_separator(path[0]) || is_drive_relative(path)) { return false; } if (!is_path_absolute(wpath.c_str())) { int size = ::GetCurrentDirectoryW(0, NULL); if (size == 0 && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { return false; } scoped_array wcwd(new WCHAR[size]); ::GetCurrentDirectoryW(size, wcwd.get()); wpath = join_paths(wcwd.get(), wpath); } wpath = normalize(wpath); if (!has_longpath_prefix(wpath.c_str())) { // Add the "\\?\" prefix unconditionally. This way we prevent the Win32 API // from processing the path and "helpfully" removing trailing dots from the // path, for example. // See https://github.com/bazelbuild/bazel/issues/2935 wpath = wstring(L"\\\\?\\") + wpath; } *result = wpath; return true; } } // namespace int open(const char* path, int flags, int mode) { #ifdef SUPPORT_LONGPATHS wstring wpath; if (!as_windows_path(path, &wpath)) { errno = ENOENT; return -1; } return ::_wopen(wpath.c_str(), flags, mode); #else return ::_open(path, flags, mode); #endif } int mkdir(const char* path, int _mode) { #ifdef SUPPORT_LONGPATHS wstring wpath; if (!as_windows_path(path, &wpath)) { errno = ENOENT; return -1; } return ::_wmkdir(wpath.c_str()); #else // not SUPPORT_LONGPATHS return ::_mkdir(path); #endif // not SUPPORT_LONGPATHS } int access(const char* path, int mode) { #ifdef SUPPORT_LONGPATHS wstring wpath; if (!as_windows_path(path, &wpath)) { errno = ENOENT; return -1; } return ::_waccess(wpath.c_str(), mode); #else return ::_access(path, mode); #endif } int chdir(const char* path) { #ifdef SUPPORT_LONGPATHS wstring wpath; if (!as_windows_path(path, &wpath)) { errno = ENOENT; return -1; } return ::_wchdir(wpath.c_str()); #else return ::_chdir(path); #endif } int stat(const char* path, struct _stat* buffer) { #ifdef SUPPORT_LONGPATHS wstring wpath; if (!as_windows_path(path, &wpath)) { errno = ENOENT; return -1; } return ::_wstat(wpath.c_str(), buffer); #else // not SUPPORT_LONGPATHS return ::_stat(path, buffer); #endif // not SUPPORT_LONGPATHS } FILE* fopen(const char* path, const char* mode) { #ifdef SUPPORT_LONGPATHS if (null_or_empty(path)) { errno = EINVAL; return NULL; } wstring wpath; if (!as_windows_path(path, &wpath)) { errno = ENOENT; return NULL; } wstring wmode; if (!strings::utf8_to_wcs(mode, &wmode)) { errno = EINVAL; return NULL; } return ::_wfopen(wpath.c_str(), wmode.c_str()); #else return ::fopen(path, mode); #endif } int close(int fd) { return ::close(fd); } int dup(int fd) { return ::_dup(fd); } int dup2(int fd1, int fd2) { return ::_dup2(fd1, fd2); } int read(int fd, void* buffer, size_t size) { return ::_read(fd, buffer, size); } int setmode(int fd, int mode) { return ::_setmode(fd, mode); } int write(int fd, const void* buffer, size_t size) { return ::_write(fd, buffer, size); } wstring testonly_utf8_to_winpath(const char* path) { wstring wpath; return as_windows_path(path, &wpath) ? wpath : wstring(); } namespace strings { bool wcs_to_mbs(const WCHAR* s, string* out, bool outUtf8) { if (null_or_empty(s)) { out->clear(); return true; } BOOL usedDefaultChar = FALSE; SetLastError(0); int size = WideCharToMultiByte( outUtf8 ? CP_UTF8 : CP_ACP, 0, s, -1, NULL, 0, NULL, outUtf8 ? NULL : &usedDefaultChar); if ((size == 0 && GetLastError() != ERROR_INSUFFICIENT_BUFFER) || usedDefaultChar) { return false; } scoped_array astr(new CHAR[size]); WideCharToMultiByte( outUtf8 ? CP_UTF8 : CP_ACP, 0, s, -1, astr.get(), size, NULL, NULL); out->assign(astr.get()); return true; } bool mbs_to_wcs(const char* s, wstring* out, bool inUtf8) { if (null_or_empty(s)) { out->clear(); return true; } SetLastError(0); int size = MultiByteToWideChar(inUtf8 ? CP_UTF8 : CP_ACP, 0, s, -1, NULL, 0); if (size == 0 && GetLastError() != ERROR_INSUFFICIENT_BUFFER) { return false; } scoped_array wstr(new WCHAR[size]); MultiByteToWideChar( inUtf8 ? CP_UTF8 : CP_ACP, 0, s, -1, wstr.get(), size + 1); out->assign(wstr.get()); return true; } bool utf8_to_wcs(const char* input, wstring* out) { return mbs_to_wcs(input, out, true); } bool wcs_to_utf8(const wchar_t* input, string* out) { return wcs_to_mbs(input, out, true); } } // namespace strings } // namespace win32 } // namespace internal } // namespace protobuf } // namespace google #endif // defined(_WIN32) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/io_win32.h000066400000000000000000000106371334102242000302420ustar00rootroot00000000000000// 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: laszlocsomor@google.com (Laszlo Csomor) // // This file contains the declarations for Windows implementations of // commonly used POSIX functions such as open(2) and access(2), as well // as macro definitions for flags of these functions. // // By including this file you'll redefine open/access/etc. to // ::google::protobuf::internal::win32::{open/access/etc.}. // Make sure you don't include a header that attempts to redeclare or // redefine these functions, that'll lead to confusing compilation // errors. It's best to #include this file as the last one to ensure that. // // This file is only used on Windows, it's empty on other platforms. #ifndef GOOGLE_PROTOBUF_STUBS_IO_WIN32_H__ #define GOOGLE_PROTOBUF_STUBS_IO_WIN32_H__ #if defined(_WIN32) #include #include // Compilers on Windows other than MSVC (e.g. Cygwin, MinGW32) define the // following functions already, except for mkdir. namespace google { namespace protobuf { namespace internal { namespace win32 { LIBPROTOBUF_EXPORT FILE* fopen(const char* path, const char* mode); LIBPROTOBUF_EXPORT int access(const char* path, int mode); LIBPROTOBUF_EXPORT int chdir(const char* path); LIBPROTOBUF_EXPORT int close(int fd); LIBPROTOBUF_EXPORT int dup(int fd); LIBPROTOBUF_EXPORT int dup2(int fd1, int fd2); LIBPROTOBUF_EXPORT int mkdir(const char* path, int _mode); LIBPROTOBUF_EXPORT int open(const char* path, int flags, int mode = 0); LIBPROTOBUF_EXPORT int read(int fd, void* buffer, size_t size); LIBPROTOBUF_EXPORT int setmode(int fd, int mode); LIBPROTOBUF_EXPORT int stat(const char* path, struct _stat* buffer); LIBPROTOBUF_EXPORT int write(int fd, const void* buffer, size_t size); LIBPROTOBUF_EXPORT std::wstring testonly_utf8_to_winpath(const char* path); namespace strings { // Convert from UTF-16 to Active-Code-Page-encoded or to UTF-8-encoded text. LIBPROTOBUF_EXPORT bool wcs_to_mbs( const wchar_t* s, std::string* out, bool outUtf8); // Convert from Active-Code-Page-encoded or UTF-8-encoded text to UTF-16. LIBPROTOBUF_EXPORT bool mbs_to_wcs( const char* s, std::wstring* out, bool inUtf8); // Convert from UTF-8-encoded text to UTF-16. LIBPROTOBUF_EXPORT bool utf8_to_wcs(const char* input, std::wstring* out); // Convert from UTF-16-encoded text to UTF-8. LIBPROTOBUF_EXPORT bool wcs_to_utf8(const wchar_t* input, std::string* out); } // namespace strings } // namespace win32 } // namespace internal } // namespace protobuf } // namespace google #ifndef W_OK #define W_OK 02 // not defined by MSVC for whatever reason #endif #ifndef F_OK #define F_OK 00 // not defined by MSVC for whatever reason #endif #ifndef STDIN_FILENO #define STDIN_FILENO 0 #endif #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif #endif // defined(_WIN32) #endif // GOOGLE_PROTOBUF_STUBS_IO_WIN32_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/io_win32_unittest.cc000066400000000000000000000357661334102242000323510ustar00rootroot00000000000000// 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: laszlocsomor@google.com (Laszlo Csomor) // // Unit tests for long-path-aware open/mkdir/access/etc. on Windows, as well as // for the supporting utility functions. // // This file is only used on Windows, it's empty on other platforms. #if defined(_WIN32) #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace internal { namespace win32 { namespace { const char kUtf8Text[] = { 'h', 'i', ' ', // utf-8: 11010000 10011111, utf-16: 100 0001 1111 = 0x041F 0xd0, 0x9f, // utf-8: 11010001 10000000, utf-16: 100 0100 0000 = 0x0440 0xd1, 0x80, // utf-8: 11010000 10111000, utf-16: 100 0011 1000 = 0x0438 0xd0, 0xb8, // utf-8: 11010000 10110010, utf-16: 100 0011 0010 = 0x0432 0xd0, 0xb2, // utf-8: 11010000 10110101, utf-16: 100 0011 0101 = 0x0435 0xd0, 0xb5, // utf-8: 11010001 10000010, utf-16: 100 0100 0010 = 0x0442 0xd1, 0x82, 0 }; const wchar_t kUtf16Text[] = { L'h', L'i', L' ', L'\x41f', L'\x440', L'\x438', L'\x432', L'\x435', L'\x442', 0 }; using std::string; using std::wstring; class IoWin32Test : public ::testing::Test { public: void SetUp(); void TearDown(); protected: bool CreateAllUnder(wstring path); bool DeleteAllUnder(wstring path); WCHAR working_directory[MAX_PATH]; string test_tmpdir; wstring wtest_tmpdir; }; #define ASSERT_INITIALIZED \ { \ EXPECT_FALSE(test_tmpdir.empty()); \ EXPECT_FALSE(wtest_tmpdir.empty()); \ } namespace { void StripTrailingSlashes(string* str) { int i = str->size() - 1; for (; i >= 0 && ((*str)[i] == '/' || (*str)[i] == '\\'); --i) {} str->resize(i+1); } bool GetEnvVarAsUtf8(const WCHAR* name, string* result) { DWORD size = ::GetEnvironmentVariableW(name, NULL, 0); if (size > 0 && GetLastError() != ERROR_ENVVAR_NOT_FOUND) { scoped_array wcs(new WCHAR[size]); ::GetEnvironmentVariableW(name, wcs.get(), size); // GetEnvironmentVariableA retrieves an Active-Code-Page-encoded text which // we'd first need to convert to UTF-16 then to UTF-8, because there seems // to be no API function to do that conversion directly. // GetEnvironmentVariableW retrieves an UTF-16-encoded text, which we need // to convert to UTF-8. return strings::wcs_to_utf8(wcs.get(), result); } else { return false; } } bool GetCwdAsUtf8(string* result) { DWORD size = ::GetCurrentDirectoryW(0, NULL); if (size > 0) { scoped_array wcs(new WCHAR[size]); ::GetCurrentDirectoryW(size, wcs.get()); // GetCurrentDirectoryA retrieves an Active-Code-Page-encoded text which // we'd first need to convert to UTF-16 then to UTF-8, because there seems // to be no API function to do that conversion directly. // GetCurrentDirectoryW retrieves an UTF-16-encoded text, which we need // to convert to UTF-8. return strings::wcs_to_utf8(wcs.get(), result); } else { return false; } } } // namespace void IoWin32Test::SetUp() { test_tmpdir.clear(); wtest_tmpdir.clear(); EXPECT_GT(::GetCurrentDirectoryW(MAX_PATH, working_directory), 0); string tmp; bool ok = false; if (!ok) { // Bazel sets this environment variable when it runs tests. ok = GetEnvVarAsUtf8(L"TEST_TMPDIR", &tmp); } if (!ok) { // Bazel 0.8.0 sets this environment for every build and test action. ok = GetEnvVarAsUtf8(L"TEMP", &tmp); } if (!ok) { // Bazel 0.8.0 sets this environment for every build and test action. ok = GetEnvVarAsUtf8(L"TMP", &tmp); } if (!ok) { // Fall back to using the current directory. ok = GetCwdAsUtf8(&tmp); } if (!ok || tmp.empty()) { FAIL() << "Cannot find a temp directory."; } StripTrailingSlashes(&tmp); std::stringstream result; // Deleting files and directories is asynchronous on Windows, and if TearDown // just deleted the previous temp directory, sometimes we cannot recreate the // same directory. // Use a counter so every test method gets its own temp directory. static unsigned int counter = 0; result << tmp << "\\w32tst" << counter++ << ".tmp"; test_tmpdir = result.str(); wtest_tmpdir = testonly_utf8_to_winpath(test_tmpdir.c_str()); ASSERT_FALSE(wtest_tmpdir.empty()); ASSERT_TRUE(DeleteAllUnder(wtest_tmpdir)); ASSERT_TRUE(CreateAllUnder(wtest_tmpdir)); } void IoWin32Test::TearDown() { if (!wtest_tmpdir.empty()) { DeleteAllUnder(wtest_tmpdir); } ::SetCurrentDirectoryW(working_directory); } bool IoWin32Test::CreateAllUnder(wstring path) { // Prepend UNC prefix if the path doesn't have it already. Don't bother // checking if the path is shorter than MAX_PATH, let's just do it // unconditionally. if (path.find(L"\\\\?\\") != 0) { path = wstring(L"\\\\?\\") + path; } if (::CreateDirectoryW(path.c_str(), NULL) || GetLastError() == ERROR_ALREADY_EXISTS || GetLastError() == ERROR_ACCESS_DENIED) { return true; } if (GetLastError() == ERROR_PATH_NOT_FOUND) { size_t pos = path.find_last_of(L'\\'); if (pos != wstring::npos) { wstring parent(path, 0, pos); if (CreateAllUnder(parent) && CreateDirectoryW(path.c_str(), NULL)) { return true; } } } return false; } bool IoWin32Test::DeleteAllUnder(wstring path) { static const wstring kDot(L"."); static const wstring kDotDot(L".."); // Prepend UNC prefix if the path doesn't have it already. Don't bother // checking if the path is shorter than MAX_PATH, let's just do it // unconditionally. if (path.find(L"\\\\?\\") != 0) { path = wstring(L"\\\\?\\") + path; } // Append "\" if necessary. if (path[path.size() - 1] != L'\\') { path.push_back(L'\\'); } WIN32_FIND_DATAW metadata; HANDLE handle = ::FindFirstFileW((path + L"*").c_str(), &metadata); if (handle == INVALID_HANDLE_VALUE) { return true; // directory doesn't exist } bool result = true; do { wstring childname = metadata.cFileName; if (kDot != childname && kDotDot != childname) { wstring childpath = path + childname; if ((metadata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) { // If this is not a junction, delete its contents recursively. // Finally delete this directory/junction too. if (((metadata.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) == 0 && !DeleteAllUnder(childpath)) || !::RemoveDirectoryW(childpath.c_str())) { result = false; break; } } else { if (!::DeleteFileW(childpath.c_str())) { result = false; break; } } } } while (::FindNextFileW(handle, &metadata)); ::FindClose(handle); return result; } TEST_F(IoWin32Test, AccessTest) { ASSERT_INITIALIZED; string path = test_tmpdir; while (path.size() < MAX_PATH - 30) { path += "\\accesstest"; EXPECT_EQ(mkdir(path.c_str(), 0644), 0); } string file = path + "\\file.txt"; int fd = open(file.c_str(), O_CREAT | O_WRONLY, 0644); if (fd > 0) { EXPECT_EQ(close(fd), 0); } else { EXPECT_TRUE(false); } EXPECT_EQ(access(test_tmpdir.c_str(), F_OK), 0); EXPECT_EQ(access(path.c_str(), F_OK), 0); EXPECT_EQ(access(path.c_str(), W_OK), 0); EXPECT_EQ(access(file.c_str(), F_OK | W_OK), 0); EXPECT_NE(access((file + ".blah").c_str(), F_OK), 0); EXPECT_NE(access((file + ".blah").c_str(), W_OK), 0); EXPECT_EQ(access(".", F_OK), 0); EXPECT_EQ(access(".", W_OK), 0); EXPECT_EQ(access((test_tmpdir + "/accesstest").c_str(), F_OK | W_OK), 0); ASSERT_EQ(access((test_tmpdir + "/./normalize_me/.././accesstest").c_str(), F_OK | W_OK), 0); EXPECT_NE(access("io_win32_unittest.AccessTest.nonexistent", F_OK), 0); EXPECT_NE(access("io_win32_unittest.AccessTest.nonexistent", W_OK), 0); ASSERT_EQ(access("c:bad", F_OK), -1); ASSERT_EQ(errno, ENOENT); ASSERT_EQ(access("/tmp/bad", F_OK), -1); ASSERT_EQ(errno, ENOENT); ASSERT_EQ(access("\\bad", F_OK), -1); ASSERT_EQ(errno, ENOENT); } TEST_F(IoWin32Test, OpenTest) { ASSERT_INITIALIZED; string path = test_tmpdir; while (path.size() < MAX_PATH) { path += "\\opentest"; EXPECT_EQ(mkdir(path.c_str(), 0644), 0); } string file = path + "\\file.txt"; int fd = open(file.c_str(), O_CREAT | O_WRONLY, 0644); if (fd > 0) { EXPECT_EQ(write(fd, "hello", 5), 5); EXPECT_EQ(close(fd), 0); } else { EXPECT_TRUE(false); } ASSERT_EQ(open("c:bad.txt", O_CREAT | O_WRONLY, 0644), -1); ASSERT_EQ(errno, ENOENT); ASSERT_EQ(open("/tmp/bad.txt", O_CREAT | O_WRONLY, 0644), -1); ASSERT_EQ(errno, ENOENT); ASSERT_EQ(open("\\bad.txt", O_CREAT | O_WRONLY, 0644), -1); ASSERT_EQ(errno, ENOENT); } TEST_F(IoWin32Test, MkdirTest) { ASSERT_INITIALIZED; string path = test_tmpdir; do { path += "\\mkdirtest"; ASSERT_EQ(mkdir(path.c_str(), 0644), 0); } while (path.size() <= MAX_PATH); ASSERT_EQ(mkdir("c:bad", 0644), -1); ASSERT_EQ(errno, ENOENT); ASSERT_EQ(mkdir("/tmp/bad", 0644), -1); ASSERT_EQ(errno, ENOENT); ASSERT_EQ(mkdir("\\bad", 0644), -1); ASSERT_EQ(errno, ENOENT); } TEST_F(IoWin32Test, MkdirTestNonAscii) { ASSERT_INITIALIZED; // Create a non-ASCII path. // Ensure that we can create the directory using SetCurrentDirectoryW. EXPECT_TRUE(CreateDirectoryW((wtest_tmpdir + L"\\1").c_str(), NULL)); EXPECT_TRUE(CreateDirectoryW((wtest_tmpdir + L"\\1\\" + kUtf16Text).c_str(), NULL)); // Ensure that we can create a very similarly named directory using mkdir. // We don't attemp to delete and recreate the same directory, because on // Windows, deleting files and directories seems to be asynchronous. EXPECT_EQ(mkdir((test_tmpdir + "\\2").c_str(), 0644), 0); EXPECT_EQ(mkdir((test_tmpdir + "\\2\\" + kUtf8Text).c_str(), 0644), 0); } TEST_F(IoWin32Test, ChdirTest) { string path("C:\\"); EXPECT_EQ(access(path.c_str(), F_OK), 0); ASSERT_EQ(chdir(path.c_str()), 0); // Do not try to chdir into the test_tmpdir, it may already contain directory // names with trailing dots. // Instead test here with an obviously dot-trailed path. If the win32_chdir // function would not convert the path to absolute and prefix with "\\?\" then // the Win32 API would ignore the trailing dot, but because of the prefixing // there'll be no path processing done, so we'll actually attempt to chdir // into "C:\some\path\foo." path = test_tmpdir + "/foo."; EXPECT_EQ(mkdir(path.c_str(), 644), 0); EXPECT_EQ(access(path.c_str(), F_OK), 0); ASSERT_NE(chdir(path.c_str()), 0); } TEST_F(IoWin32Test, ChdirTestNonAscii) { ASSERT_INITIALIZED; // Create a directory with a non-ASCII path and ensure we can cd into it. wstring wNonAscii(wtest_tmpdir + L"\\" + kUtf16Text); string nonAscii; EXPECT_TRUE(strings::wcs_to_utf8(wNonAscii.c_str(), &nonAscii)); EXPECT_TRUE(CreateDirectoryW(wNonAscii.c_str(), NULL)); WCHAR cwd[MAX_PATH]; EXPECT_TRUE(GetCurrentDirectoryW(MAX_PATH, cwd)); // Ensure that we can cd into the path using SetCurrentDirectoryW. EXPECT_TRUE(SetCurrentDirectoryW(wNonAscii.c_str())); EXPECT_TRUE(SetCurrentDirectoryW(cwd)); // Ensure that we can cd into the path using chdir. ASSERT_EQ(chdir(nonAscii.c_str()), 0); // Ensure that the GetCurrentDirectoryW returns the desired path. EXPECT_TRUE(GetCurrentDirectoryW(MAX_PATH, cwd)); ASSERT_EQ(wNonAscii, cwd); } TEST_F(IoWin32Test, AsWindowsPathTest) { DWORD size = GetCurrentDirectoryW(0, NULL); scoped_array cwd_str(new wchar_t[size]); EXPECT_GT(GetCurrentDirectoryW(size, cwd_str.get()), 0); wstring cwd = wstring(L"\\\\?\\") + cwd_str.get(); ASSERT_EQ(testonly_utf8_to_winpath("relative_mkdirtest"), cwd + L"\\relative_mkdirtest"); ASSERT_EQ(testonly_utf8_to_winpath("preserve//\\trailing///"), cwd + L"\\preserve\\trailing\\"); ASSERT_EQ(testonly_utf8_to_winpath("./normalize_me\\/../blah"), cwd + L"\\blah"); std::ostringstream relpath; for (wchar_t* p = cwd_str.get(); *p; ++p) { if (*p == '/' || *p == '\\') { relpath << "../"; } } relpath << ".\\/../\\./beyond-toplevel"; ASSERT_EQ(testonly_utf8_to_winpath(relpath.str().c_str()), wstring(L"\\\\?\\") + cwd_str.get()[0] + L":\\beyond-toplevel"); // Absolute unix paths lack drive letters, driveless absolute windows paths // do too. Neither can be converted to a drive-specifying absolute Windows // path. ASSERT_EQ(testonly_utf8_to_winpath("/absolute/unix/path"), L""); // Though valid on Windows, we also don't support UNC paths (\\UNC\\blah). ASSERT_EQ(testonly_utf8_to_winpath("\\driveless\\absolute"), L""); // Though valid in cmd.exe, drive-relative paths are not supported. ASSERT_EQ(testonly_utf8_to_winpath("c:foo"), L""); ASSERT_EQ(testonly_utf8_to_winpath("c:/foo"), L"\\\\?\\c:\\foo"); ASSERT_EQ(testonly_utf8_to_winpath("\\\\?\\C:\\foo"), L"\\\\?\\C:\\foo"); } TEST_F(IoWin32Test, Utf8Utf16ConversionTest) { string mbs; wstring wcs; ASSERT_TRUE(strings::utf8_to_wcs(kUtf8Text, &wcs)); ASSERT_TRUE(strings::wcs_to_utf8(kUtf16Text, &mbs)); ASSERT_EQ(wcs, kUtf16Text); ASSERT_EQ(mbs, kUtf8Text); } } // namespace } // namespace win32 } // namespace internal } // namespace protobuf } // namespace google #endif // defined(_WIN32) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/logging.h000066400000000000000000000213161334102242000302330ustar00rootroot00000000000000// 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_LOGGING_H_ #define GOOGLE_PROTOBUF_STUBS_LOGGING_H_ #include #include // =================================================================== // emulates google3/base/logging.h namespace google { namespace protobuf { enum LogLevel { LOGLEVEL_INFO, // Informational. This is never actually used by // libprotobuf. LOGLEVEL_WARNING, // Warns about issues that, although not technically a // problem now, could cause problems in the future. For // example, a // warning will be printed when parsing a // message that is near the message size limit. LOGLEVEL_ERROR, // An error occurred which should never happen during // normal use. LOGLEVEL_FATAL, // An error occurred from which the library cannot // recover. This usually indicates a programming error // in the code which calls the library, especially when // compiled in debug mode. #ifdef NDEBUG LOGLEVEL_DFATAL = LOGLEVEL_ERROR #else LOGLEVEL_DFATAL = LOGLEVEL_FATAL #endif }; class StringPiece; namespace util { class Status; } class uint128; namespace internal { class LogFinisher; class LIBPROTOBUF_EXPORT LogMessage { public: LogMessage(LogLevel level, const char* filename, int line); ~LogMessage(); LogMessage& operator<<(const std::string& value); LogMessage& operator<<(const char* value); LogMessage& operator<<(char value); LogMessage& operator<<(int value); LogMessage& operator<<(uint value); LogMessage& operator<<(long value); LogMessage& operator<<(unsigned long value); LogMessage& operator<<(long long value); LogMessage& operator<<(unsigned long long value); LogMessage& operator<<(double value); LogMessage& operator<<(void* value); LogMessage& operator<<(const StringPiece& value); LogMessage& operator<<(const ::google::protobuf::util::Status& status); LogMessage& operator<<(const uint128& value); private: friend class LogFinisher; void Finish(); LogLevel level_; const char* filename_; int line_; std::string message_; }; // Used to make the entire "LOG(BLAH) << etc." expression have a void return // type and print a newline after each message. class LIBPROTOBUF_EXPORT LogFinisher { public: void operator=(LogMessage& other); }; template bool IsOk(T status) { return status.ok(); } template<> inline bool IsOk(bool status) { return status; } } // namespace internal // Undef everything in case we're being mixed with some other Google library // which already defined them itself. Presumably all Google libraries will // support the same syntax for these so it should not be a big deal if they // end up using our definitions instead. #undef GOOGLE_LOG #undef GOOGLE_LOG_IF #undef GOOGLE_CHECK #undef GOOGLE_CHECK_OK #undef GOOGLE_CHECK_EQ #undef GOOGLE_CHECK_NE #undef GOOGLE_CHECK_LT #undef GOOGLE_CHECK_LE #undef GOOGLE_CHECK_GT #undef GOOGLE_CHECK_GE #undef GOOGLE_CHECK_NOTNULL #undef GOOGLE_DLOG #undef GOOGLE_DCHECK #undef GOOGLE_DCHECK_OK #undef GOOGLE_DCHECK_EQ #undef GOOGLE_DCHECK_NE #undef GOOGLE_DCHECK_LT #undef GOOGLE_DCHECK_LE #undef GOOGLE_DCHECK_GT #undef GOOGLE_DCHECK_GE #define GOOGLE_LOG(LEVEL) \ ::google::protobuf::internal::LogFinisher() = \ ::google::protobuf::internal::LogMessage( \ ::google::protobuf::LOGLEVEL_##LEVEL, __FILE__, __LINE__) #define GOOGLE_LOG_IF(LEVEL, CONDITION) \ !(CONDITION) ? (void)0 : GOOGLE_LOG(LEVEL) #define GOOGLE_CHECK(EXPRESSION) \ GOOGLE_LOG_IF(FATAL, !(EXPRESSION)) << "CHECK failed: " #EXPRESSION ": " #define GOOGLE_CHECK_OK(A) GOOGLE_CHECK(::google::protobuf::internal::IsOk(A)) #define GOOGLE_CHECK_EQ(A, B) GOOGLE_CHECK((A) == (B)) #define GOOGLE_CHECK_NE(A, B) GOOGLE_CHECK((A) != (B)) #define GOOGLE_CHECK_LT(A, B) GOOGLE_CHECK((A) < (B)) #define GOOGLE_CHECK_LE(A, B) GOOGLE_CHECK((A) <= (B)) #define GOOGLE_CHECK_GT(A, B) GOOGLE_CHECK((A) > (B)) #define GOOGLE_CHECK_GE(A, B) GOOGLE_CHECK((A) >= (B)) namespace internal { template T* CheckNotNull(const char* /* file */, int /* line */, const char* name, T* val) { if (val == NULL) { GOOGLE_LOG(FATAL) << name; } return val; } } // namespace internal #define GOOGLE_CHECK_NOTNULL(A) \ ::google::protobuf::internal::CheckNotNull(\ __FILE__, __LINE__, "'" #A "' must not be NULL", (A)) #ifdef NDEBUG #define GOOGLE_DLOG(LEVEL) GOOGLE_LOG_IF(LEVEL, false) #define GOOGLE_DCHECK(EXPRESSION) while(false) GOOGLE_CHECK(EXPRESSION) #define GOOGLE_DCHECK_OK(E) GOOGLE_DCHECK(::google::protobuf::internal::IsOk(E)) #define GOOGLE_DCHECK_EQ(A, B) GOOGLE_DCHECK((A) == (B)) #define GOOGLE_DCHECK_NE(A, B) GOOGLE_DCHECK((A) != (B)) #define GOOGLE_DCHECK_LT(A, B) GOOGLE_DCHECK((A) < (B)) #define GOOGLE_DCHECK_LE(A, B) GOOGLE_DCHECK((A) <= (B)) #define GOOGLE_DCHECK_GT(A, B) GOOGLE_DCHECK((A) > (B)) #define GOOGLE_DCHECK_GE(A, B) GOOGLE_DCHECK((A) >= (B)) #else // NDEBUG #define GOOGLE_DLOG GOOGLE_LOG #define GOOGLE_DCHECK GOOGLE_CHECK #define GOOGLE_DCHECK_OK GOOGLE_CHECK_OK #define GOOGLE_DCHECK_EQ GOOGLE_CHECK_EQ #define GOOGLE_DCHECK_NE GOOGLE_CHECK_NE #define GOOGLE_DCHECK_LT GOOGLE_CHECK_LT #define GOOGLE_DCHECK_LE GOOGLE_CHECK_LE #define GOOGLE_DCHECK_GT GOOGLE_CHECK_GT #define GOOGLE_DCHECK_GE GOOGLE_CHECK_GE #endif // !NDEBUG typedef void LogHandler(LogLevel level, const char* filename, int line, const std::string& message); // The protobuf library sometimes writes warning and error messages to // stderr. These messages are primarily useful for developers, but may // also help end users figure out a problem. If you would prefer that // these messages be sent somewhere other than stderr, call SetLogHandler() // to set your own handler. This returns the old handler. Set the handler // to NULL to ignore log messages (but see also LogSilencer, below). // // Obviously, SetLogHandler is not thread-safe. You should only call it // at initialization time, and probably not from library code. If you // simply want to suppress log messages temporarily (e.g. because you // have some code that tends to trigger them frequently and you know // the warnings are not important to you), use the LogSilencer class // below. LIBPROTOBUF_EXPORT LogHandler* SetLogHandler(LogHandler* new_func); // Create a LogSilencer if you want to temporarily suppress all log // messages. As long as any LogSilencer objects exist, non-fatal // log messages will be discarded (the current LogHandler will *not* // be called). Constructing a LogSilencer is thread-safe. You may // accidentally suppress log messages occurring in another thread, but // since messages are generally for debugging purposes only, this isn't // a big deal. If you want to intercept log messages, use SetLogHandler(). class LIBPROTOBUF_EXPORT LogSilencer { public: LogSilencer(); ~LogSilencer(); }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_LOGGING_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/macros.h000066400000000000000000000147411334102242000300750ustar00rootroot00000000000000// 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__ #include namespace google { namespace protobuf { #undef GOOGLE_DISALLOW_EVIL_CONSTRUCTORS #define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&) #undef GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS #define GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ TypeName(); \ TypeName(const TypeName&); \ void operator=(const TypeName&) // =================================================================== // 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(!(sizeof(a) % sizeof(*(a))))) // The COMPILE_ASSERT macro can be used to verify that a compile time // expression is true. For example, you could use it to verify the // size of a static array: // // COMPILE_ASSERT(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES, // content_type_names_incorrect_size); // // or to make sure a struct is smaller than a certain size: // // COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large); // // The second argument to the macro is the name of the variable. If // the expression is false, most compilers will issue a warning/error // containing the name of the variable. namespace internal { template struct CompileAssert { }; } // namespace internal #undef GOOGLE_COMPILE_ASSERT #if __cplusplus >= 201103L #define GOOGLE_COMPILE_ASSERT(expr, msg) static_assert(expr, #msg) #else #define GOOGLE_COMPILE_ASSERT(expr, msg) \ ::google::protobuf::internal::CompileAssert<(bool(expr))> \ msg[bool(expr) ? 1 : -1]; \ (void)msg // Implementation details of COMPILE_ASSERT: // // - COMPILE_ASSERT works by defining an array type that has -1 // elements (and thus is invalid) when the expression is false. // // - The simpler definition // // #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1] // // does not work, as gcc supports variable-length arrays whose sizes // are determined at run-time (this is gcc's extension and not part // of the C++ standard). As a result, gcc fails to reject the // following code with the simple definition: // // int foo; // COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is // // not a compile-time constant. // // - By using the type CompileAssert<(bool(expr))>, we ensures that // expr is a compile-time constant. (Template arguments must be // determined at compile-time.) // // - The outter parentheses in CompileAssert<(bool(expr))> are necessary // to work around a bug in gcc 3.4.4 and 4.0.1. If we had written // // CompileAssert // // instead, these compilers will refuse to compile // // COMPILE_ASSERT(5 > 0, some_message); // // (They seem to think the ">" in "5 > 0" marks the end of the // template argument list.) // // - The array size is (bool(expr) ? 1 : -1), instead of simply // // ((expr) ? 1 : -1). // // This is to avoid running into a bug in MS VC 7.1, which // causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. #endif // __cplusplus >= 201103L } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_MACROS_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/map_util.h000066400000000000000000000747101334102242000304250ustar00rootroot00000000000000// 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 #include #include #include #include #include namespace google { namespace protobuf { namespace internal { // Local implementation of RemoveConst to avoid including base/type_traits.h. template struct RemoveConst { typedef T type; }; template struct RemoveConst : RemoveConst {}; } // 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 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 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 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 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 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 NULL otherwise. template 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 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, // NULL 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 a NULL value. template 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 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 NULL if key is not found. template 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 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 // NULL). Returns false if the key was not found, true otherwise. template 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 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 bool ContainsKeyValuePair(const Collection& collection, const Key& key, const Value& value) { typedef typename Collection::const_iterator const_iterator; std::pair 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 bool InsertOrUpdate(Collection* const collection, const typename Collection::value_type& vt) { std::pair 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 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 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 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 bool InsertAndDeleteExisting( Collection* const collection, const typename Collection::value_type::first_type& key, const typename Collection::value_type::second_type& value) { std::pair 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 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 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 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 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 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 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 m; // SomeProto& proto = InsertKeyOrDie(&m, 3); // proto.set_field("foo"); template 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 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 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 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 v = {"a", "b", "c", "a", "b"}; // map m; // AddTokenCounts(v, 1, &m); // assert(m["a"] == 2); // assert(m["b"] == 2); // assert(m["c"] == 1); template 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, where // inserting a new key, value pair involves constructing a new heap-allocated // Value, and storing a pointer to that in the collection. template 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 ret = collection->insert(typename Collection::value_type( key, static_cast(NULL))); 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 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 ret = collection->insert(typename Collection::value_type( key, static_cast(NULL))); 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 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 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 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 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 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 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 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 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 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 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 bool UpdateReturnCopy(Collection* const collection, const typename Collection::value_type& vt, typename Collection::value_type::second_type* previous) { std::pair 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 NULL 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 typename Collection::value_type::second_type* const InsertOrReturnExisting(Collection* const collection, const typename Collection::value_type& vt) { std::pair ret = collection->insert(vt); if (ret.second) { return NULL; // 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 typename Collection::value_type::second_type* const 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 NULL if the key was not found in the // collection. // // Examples: // map my_map; // // One line cleanup: // delete EraseKeyReturnValuePtr(&my_map, "abc"); // // Use returned value: // scoped_ptr value_ptr(EraseKeyReturnValuePtr(&my_map, "abc")); // if (value_ptr.get()) // value_ptr->DoSomething(); // template 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 NULL; } 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 void InsertKeysFromMap(const MapContainer& map_container, KeyContainer* key_container) { GOOGLE_CHECK(key_container != NULL); 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 void AppendKeysFromMap(const MapContainer& map_container, KeyContainer* key_container) { GOOGLE_CHECK(key_container != NULL); 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 void AppendKeysFromMap(const MapContainer& map_container, vector* key_container) { GOOGLE_CHECK(key_container != NULL); // 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 void AppendValuesFromMap(const MapContainer& map_container, ValueContainer* value_container) { GOOGLE_CHECK(value_container != NULL); 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 void AppendValuesFromMap(const MapContainer& map_container, vector* value_container) { GOOGLE_CHECK(value_container != NULL); // 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__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/mathlimits.cc000066400000000000000000000135551334102242000311240ustar00rootroot00000000000000// 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. // All Rights Reserved. // // Author: Maxim Lifantsev // #include #include namespace google { namespace protobuf { // MSVC++ 2005 and older compilers think the header declaration was a // definition, and erroneously flag these as a duplicate definition. #if defined(COMPILER_MSVC) || __cpluscplus < 201103L #define DEF_COMMON_LIMITS(Type) #define DEF_UNSIGNED_INT_LIMITS(Type) #define DEF_SIGNED_INT_LIMITS(Type) #define DEF_PRECISION_LIMITS(Type) #else #define DEF_COMMON_LIMITS(Type) \ const bool MathLimits::kIsSigned; \ const bool MathLimits::kIsInteger; \ const int MathLimits::kMin10Exp; \ const int MathLimits::kMax10Exp; #define DEF_UNSIGNED_INT_LIMITS(Type) \ DEF_COMMON_LIMITS(Type) \ const Type MathLimits::kPosMin; \ const Type MathLimits::kPosMax; \ const Type MathLimits::kMin; \ const Type MathLimits::kMax; \ const Type MathLimits::kEpsilon; \ const Type MathLimits::kStdError; #define DEF_SIGNED_INT_LIMITS(Type) \ DEF_UNSIGNED_INT_LIMITS(Type) \ const Type MathLimits::kNegMin; \ const Type MathLimits::kNegMax; #define DEF_PRECISION_LIMITS(Type) \ const int MathLimits::kPrecisionDigits; #endif // not COMPILER_MSVC // http://en.wikipedia.org/wiki/Quadruple_precision_floating-point_format#Double-double_arithmetic // With some compilers (gcc 4.6.x) on some platforms (powerpc64), // "long double" is implemented as a pair of double: "double double" format. // This causes a problem with epsilon (eps). // eps is the smallest positive number such that 1.0 + eps > 1.0 // // Normal format: 1.0 + e = 1.0...01 // N-1 zeros for N fraction bits // D-D format: 1.0 + e = 1.000...0001 // epsilon can be very small // // In the normal format, 1.0 + e has to fit in one stretch of bits. // The maximum rounding error is half of eps. // // In the double-double format, 1.0 + e splits across two doubles: // 1.0 in the high double, e in the low double, and they do not have to // be contiguous. The maximum rounding error on a value close to 1.0 is // much larger than eps. // // Some code checks for errors by comparing a computed value to a golden // value +/- some multiple of the maximum rounding error. The maximum // rounding error is not available so we use eps as an approximation // instead. That fails when long double is in the double-double format. // Therefore, we define kStdError as a multiple of // max(DBL_EPSILON * DBL_EPSILON, kEpsilon) rather than a multiple of kEpsilon. #define DEF_FP_LIMITS(Type, PREFIX) \ DEF_COMMON_LIMITS(Type) \ const Type MathLimits::kPosMin = PREFIX##_MIN; \ const Type MathLimits::kPosMax = PREFIX##_MAX; \ const Type MathLimits::kMin = -MathLimits::kPosMax; \ const Type MathLimits::kMax = MathLimits::kPosMax; \ const Type MathLimits::kNegMin = -MathLimits::kPosMin; \ const Type MathLimits::kNegMax = -MathLimits::kPosMax; \ const Type MathLimits::kEpsilon = PREFIX##_EPSILON; \ /* 32 is 5 bits of mantissa error; should be adequate for common errors */ \ const Type MathLimits::kStdError = \ 32 * (DBL_EPSILON * DBL_EPSILON > MathLimits::kEpsilon \ ? DBL_EPSILON * DBL_EPSILON : MathLimits::kEpsilon); \ DEF_PRECISION_LIMITS(Type) \ const Type MathLimits::kNaN = HUGE_VAL - HUGE_VAL; \ const Type MathLimits::kPosInf = HUGE_VAL; \ const Type MathLimits::kNegInf = -HUGE_VAL; // The following are *not* casts! DEF_SIGNED_INT_LIMITS(int8) DEF_SIGNED_INT_LIMITS(int16) // NOLINT(readability/casting) DEF_SIGNED_INT_LIMITS(int32) // NOLINT(readability/casting) DEF_SIGNED_INT_LIMITS(int64) // NOLINT(readability/casting) DEF_UNSIGNED_INT_LIMITS(uint8) DEF_UNSIGNED_INT_LIMITS(uint16) // NOLINT(readability/casting) DEF_UNSIGNED_INT_LIMITS(uint32) // NOLINT(readability/casting) DEF_UNSIGNED_INT_LIMITS(uint64) // NOLINT(readability/casting) DEF_SIGNED_INT_LIMITS(long int) DEF_UNSIGNED_INT_LIMITS(unsigned long int) DEF_FP_LIMITS(float, FLT) DEF_FP_LIMITS(double, DBL) DEF_FP_LIMITS(long double, LDBL); #undef DEF_COMMON_LIMITS #undef DEF_SIGNED_INT_LIMITS #undef DEF_UNSIGNED_INT_LIMITS #undef DEF_FP_LIMITS #undef DEF_PRECISION_LIMITS } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/mathlimits.h000066400000000000000000000264601334102242000307650ustar00rootroot00000000000000// 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. // All Rights Reserved. // // Author: Maxim Lifantsev // // Useful integer and floating point limits and type traits. // // This partially replaces/duplictes numeric_limits<> from . // We get a Google-style class that we have a greater control over // and thus can add new features to it or fix whatever happens to be broken in // numeric_limits for the compilers we use. // #ifndef UTIL_MATH_MATHLIMITS_H__ #define UTIL_MATH_MATHLIMITS_H__ // Note that for Windows we do something different because it does not support // the plain isinf and isnan. #if __cplusplus >= 201103L // GCC 4.9 has a bug that makes isinf and isnan ambigious when both // and get pulled into the same translation unit. We use the ones in // std:: namespace explicitly for C++11 #include #define GOOGLE_PROTOBUF_USE_STD_CMATH #elif _GLIBCXX_USE_C99_MATH && !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC // libstdc++ header undefines the global macros and put functions in // std:: namespace even before C++11. Use the ones in std:: instead too. #include #define GOOGLE_PROTOBUF_USE_STD_CMATH #else #include #endif #include #include #include // ========================================================================= // // Useful integer and floating point limits and type traits. // This is just for the documentation; // real members are defined in our specializations below. namespace google { namespace protobuf { template struct MathLimits { // Type name. typedef T Type; // Unsigned version of the Type with the same byte size. // Same as Type for floating point and unsigned types. typedef T UnsignedType; // If the type supports negative values. static const bool kIsSigned; // If the type supports only integer values. static const bool kIsInteger; // Magnitude-wise smallest representable positive value. static const Type kPosMin; // Magnitude-wise largest representable positive value. static const Type kPosMax; // Smallest representable value. static const Type kMin; // Largest representable value. static const Type kMax; // Magnitude-wise smallest representable negative value. // Present only if kIsSigned. static const Type kNegMin; // Magnitude-wise largest representable negative value. // Present only if kIsSigned. static const Type kNegMax; // Smallest integer x such that 10^x is representable. static const int kMin10Exp; // Largest integer x such that 10^x is representable. static const int kMax10Exp; // Smallest positive value such that Type(1) + kEpsilon != Type(1) static const Type kEpsilon; // Typical rounding error that is enough to cover // a few simple floating-point operations. // Slightly larger than kEpsilon to account for a few rounding errors. // Is zero if kIsInteger. static const Type kStdError; // Number of decimal digits of mantissa precision. // Present only if !kIsInteger. static const int kPrecisionDigits; // Not a number, i.e. result of 0/0. // Present only if !kIsInteger. static const Type kNaN; // Positive infinity, i.e. result of 1/0. // Present only if !kIsInteger. static const Type kPosInf; // Negative infinity, i.e. result of -1/0. // Present only if !kIsInteger. static const Type kNegInf; // NOTE: Special floating point values behave // in a special (but mathematically-logical) way // in terms of (in)equalty comparison and mathematical operations // -- see out unittest for examples. // Special floating point value testers. // Present in integer types for convenience. static bool IsFinite(const Type x); static bool IsNaN(const Type x); static bool IsInf(const Type x); static bool IsPosInf(const Type x); static bool IsNegInf(const Type x); }; // ========================================================================= // // All #define-s below are simply to refactor the declarations of // MathLimits template specializations. // They are all #undef-ined below. // The hoop-jumping in *_INT_(MAX|MIN) below is so that the compiler does not // get an overflow while computing the constants. #define SIGNED_INT_MAX(Type) \ (((Type(1) << (sizeof(Type)*8 - 2)) - 1) + (Type(1) << (sizeof(Type)*8 - 2))) #define SIGNED_INT_MIN(Type) \ (-(Type(1) << (sizeof(Type)*8 - 2)) - (Type(1) << (sizeof(Type)*8 - 2))) #define UNSIGNED_INT_MAX(Type) \ (((Type(1) << (sizeof(Type)*8 - 1)) - 1) + (Type(1) << (sizeof(Type)*8 - 1))) // Compile-time selected log10-related constants for integer types. #define SIGNED_MAX_10_EXP(Type) \ (sizeof(Type) == 1 ? 2 : ( \ sizeof(Type) == 2 ? 4 : ( \ sizeof(Type) == 4 ? 9 : ( \ sizeof(Type) == 8 ? 18 : -1)))) #define UNSIGNED_MAX_10_EXP(Type) \ (sizeof(Type) == 1 ? 2 : ( \ sizeof(Type) == 2 ? 4 : ( \ sizeof(Type) == 4 ? 9 : ( \ sizeof(Type) == 8 ? 19 : -1)))) #define DECL_INT_LIMIT_FUNCS \ static bool IsFinite(const Type /*x*/) { return true; } \ static bool IsNaN(const Type /*x*/) { return false; } \ static bool IsInf(const Type /*x*/) { return false; } \ static bool IsPosInf(const Type /*x*/) { return false; } \ static bool IsNegInf(const Type /*x*/) { return false; } #define DECL_SIGNED_INT_LIMITS(IntType, UnsignedIntType) \ template<> \ struct LIBPROTOBUF_EXPORT MathLimits { \ typedef IntType Type; \ typedef UnsignedIntType UnsignedType; \ static const bool kIsSigned = true; \ static const bool kIsInteger = true; \ static const Type kPosMin = 1; \ static const Type kPosMax = SIGNED_INT_MAX(Type); \ static const Type kMin = SIGNED_INT_MIN(Type); \ static const Type kMax = kPosMax; \ static const Type kNegMin = -1; \ static const Type kNegMax = kMin; \ static const int kMin10Exp = 0; \ static const int kMax10Exp = SIGNED_MAX_10_EXP(Type); \ static const Type kEpsilon = 1; \ static const Type kStdError = 0; \ DECL_INT_LIMIT_FUNCS \ }; #define DECL_UNSIGNED_INT_LIMITS(IntType) \ template<> \ struct LIBPROTOBUF_EXPORT MathLimits { \ typedef IntType Type; \ typedef IntType UnsignedType; \ static const bool kIsSigned = false; \ static const bool kIsInteger = true; \ static const Type kPosMin = 1; \ static const Type kPosMax = UNSIGNED_INT_MAX(Type); \ static const Type kMin = 0; \ static const Type kMax = kPosMax; \ static const int kMin10Exp = 0; \ static const int kMax10Exp = UNSIGNED_MAX_10_EXP(Type); \ static const Type kEpsilon = 1; \ static const Type kStdError = 0; \ DECL_INT_LIMIT_FUNCS \ }; DECL_SIGNED_INT_LIMITS(signed char, unsigned char) DECL_SIGNED_INT_LIMITS(signed short int, unsigned short int) DECL_SIGNED_INT_LIMITS(signed int, unsigned int) DECL_SIGNED_INT_LIMITS(signed long int, unsigned long int) DECL_SIGNED_INT_LIMITS(signed long long int, unsigned long long int) DECL_UNSIGNED_INT_LIMITS(unsigned char) DECL_UNSIGNED_INT_LIMITS(unsigned short int) DECL_UNSIGNED_INT_LIMITS(unsigned int) DECL_UNSIGNED_INT_LIMITS(unsigned long int) DECL_UNSIGNED_INT_LIMITS(unsigned long long int) #undef DECL_SIGNED_INT_LIMITS #undef DECL_UNSIGNED_INT_LIMITS #undef SIGNED_INT_MAX #undef SIGNED_INT_MIN #undef UNSIGNED_INT_MAX #undef SIGNED_MAX_10_EXP #undef UNSIGNED_MAX_10_EXP #undef DECL_INT_LIMIT_FUNCS // For non-Windows builds we use the std:: versions of isinf and isnan if they // are available; see the comment about at the top of this file for the // details on why we need to do this. #ifdef GOOGLE_PROTOBUF_USE_STD_CMATH #define ISINF std::isinf #define ISNAN std::isnan #else #define ISINF isinf #define ISNAN isnan #endif // ========================================================================= // #ifdef WIN32 // Lacks built-in isnan() and isinf() #define DECL_FP_LIMIT_FUNCS \ static bool IsFinite(const Type x) { return _finite(x); } \ static bool IsNaN(const Type x) { return _isnan(x); } \ static bool IsInf(const Type x) { return (_fpclass(x) & (_FPCLASS_NINF | _FPCLASS_PINF)) != 0; } \ static bool IsPosInf(const Type x) { return _fpclass(x) == _FPCLASS_PINF; } \ static bool IsNegInf(const Type x) { return _fpclass(x) == _FPCLASS_NINF; } #else #define DECL_FP_LIMIT_FUNCS \ static bool IsFinite(const Type x) { return !ISINF(x) && !ISNAN(x); } \ static bool IsNaN(const Type x) { return ISNAN(x); } \ static bool IsInf(const Type x) { return ISINF(x); } \ static bool IsPosInf(const Type x) { return ISINF(x) && x > 0; } \ static bool IsNegInf(const Type x) { return ISINF(x) && x < 0; } #endif // We can't put floating-point constant values in the header here because // such constants are not considered to be primitive-type constants by gcc. // CAVEAT: Hence, they are going to be initialized only during // the global objects construction time. #define DECL_FP_LIMITS(FP_Type, PREFIX) \ template<> \ struct LIBPROTOBUF_EXPORT MathLimits { \ typedef FP_Type Type; \ typedef FP_Type UnsignedType; \ static const bool kIsSigned = true; \ static const bool kIsInteger = false; \ static const Type kPosMin; \ static const Type kPosMax; \ static const Type kMin; \ static const Type kMax; \ static const Type kNegMin; \ static const Type kNegMax; \ static const int kMin10Exp = PREFIX##_MIN_10_EXP; \ static const int kMax10Exp = PREFIX##_MAX_10_EXP; \ static const Type kEpsilon; \ static const Type kStdError; \ static const int kPrecisionDigits = PREFIX##_DIG; \ static const Type kNaN; \ static const Type kPosInf; \ static const Type kNegInf; \ DECL_FP_LIMIT_FUNCS \ }; DECL_FP_LIMITS(float, FLT) DECL_FP_LIMITS(double, DBL) DECL_FP_LIMITS(long double, LDBL) #undef ISINF #undef ISNAN #undef DECL_FP_LIMITS #undef DECL_FP_LIMIT_FUNCS // ========================================================================= // } // namespace protobuf } // namespace google #endif // UTIL_MATH_MATHLIMITS_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/mathutil.h000066400000000000000000000124641334102242000304400ustar00rootroot00000000000000// 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_MATHUTIL_H_ #define GOOGLE_PROTOBUF_STUBS_MATHUTIL_H_ #include #include #include #include #include namespace google { namespace protobuf { namespace internal { template bool AlmostEquals(T a, T b) { return a == b; } template<> inline bool AlmostEquals(float a, float b) { return fabs(a - b) < 32 * FLT_EPSILON; } template<> inline bool AlmostEquals(double a, double b) { return fabs(a - b) < 32 * DBL_EPSILON; } } // namespace internal class MathUtil { public: template static T Sign(T value) { if (value == T(0) || MathLimits::IsNaN(value)) { return value; } return value > T(0) ? 1 : -1; } template static bool AlmostEquals(T a, T b) { return ::google::protobuf::internal::AlmostEquals(a, b); } // Largest of two values. // Works correctly for special floating point values. // Note: 0.0 and -0.0 are not differentiated by Max (Max(0.0, -0.0) is -0.0), // which should be OK because, although they (can) have different // bit representation, they are observably the same when examined // with arithmetic and (in)equality operators. template static T Max(const T x, const T y) { return MathLimits::IsNaN(x) || x > y ? x : y; } // Absolute value of x // Works correctly for unsigned types and // for special floating point values. // Note: 0.0 and -0.0 are not differentiated by Abs (Abs(0.0) is -0.0), // which should be OK: see the comment for Max above. template static T Abs(const T x) { return x > T(0) ? x : -x; } // Absolute value of the difference between two numbers. // Works correctly for signed types and special floating point values. template static typename MathLimits::UnsignedType AbsDiff(const T x, const T y) { // Carries out arithmetic as unsigned to avoid overflow. typedef typename MathLimits::UnsignedType R; return x > y ? R(x) - R(y) : R(y) - R(x); } // If two (usually floating point) numbers are within a certain // fraction of their magnitude or within a certain absolute margin of error. // This is the same as the following but faster: // WithinFraction(x, y, fraction) || WithinMargin(x, y, margin) // E.g. WithinFraction(0.0, 1e-10, 1e-5) is false but // WithinFractionOrMargin(0.0, 1e-10, 1e-5, 1e-5) is true. template static bool WithinFractionOrMargin(const T x, const T y, const T fraction, const T margin); }; template bool MathUtil::WithinFractionOrMargin(const T x, const T y, const T fraction, const T margin) { // Not just "0 <= fraction" to fool the compiler for unsigned types. GOOGLE_DCHECK((T(0) < fraction || T(0) == fraction) && fraction < T(1) && margin >= T(0)); // Template specialization will convert the if() condition to a constant, // which will cause the compiler to generate code for either the "if" part // or the "then" part. In this way we avoid a compiler warning // about a potential integer overflow in crosstool v12 (gcc 4.3.1). if (MathLimits::kIsInteger) { return x == y; } else { // IsFinite checks are to make kPosInf and kNegInf not within fraction if (!MathLimits::IsFinite(x) && !MathLimits::IsFinite(y)) { return false; } T relative_margin = static_cast(fraction * Max(Abs(x), Abs(y))); return AbsDiff(x, y) <= Max(margin, relative_margin); } } } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_MATHUTIL_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/mutex.h000066400000000000000000000106701334102242000277500ustar00rootroot00000000000000// 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_ #ifdef GOOGLE_PROTOBUF_NO_THREADLOCAL #include #endif #include // =================================================================== // emulates google3/base/mutex.h namespace google { namespace protobuf { namespace internal { // A Mutex is a non-reentrant (aka non-recursive) mutex. At most one thread T // may hold a mutex at a given time. If T attempts to Lock() the same Mutex // while holding it, T will deadlock. class LIBPROTOBUF_EXPORT Mutex { public: // Create a Mutex that is not held by anybody. Mutex(); // Destructor ~Mutex(); // Block if necessary until this Mutex is free, then acquire it exclusively. void Lock(); // Release this Mutex. Caller must hold it exclusively. void 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(); private: struct Internal; Internal* mInternal; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Mutex); }; // MutexLock(mu) acquires mu when constructed and releases it when destroyed. class LIBPROTOBUF_EXPORT MutexLock { public: explicit MutexLock(Mutex *mu) : mu_(mu) { this->mu_->Lock(); } ~MutexLock() { 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 NULL. class LIBPROTOBUF_EXPORT MutexLockMaybe { public: explicit MutexLockMaybe(Mutex *mu) : mu_(mu) { if (this->mu_ != NULL) { this->mu_->Lock(); } } ~MutexLockMaybe() { if (this->mu_ != NULL) { this->mu_->Unlock(); } } private: Mutex *const mu_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MutexLockMaybe); }; #if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL) template class ThreadLocalStorage { public: ThreadLocalStorage() { pthread_key_create(&key_, &ThreadLocalStorage::Delete); } ~ThreadLocalStorage() { pthread_key_delete(key_); } T* Get() { T* result = static_cast(pthread_getspecific(key_)); if (result == NULL) { result = new T(); pthread_setspecific(key_, result); } return result; } private: static void Delete(void* value) { delete static_cast(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 #endif // GOOGLE_PROTOBUF_STUBS_MUTEX_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/once.cc000066400000000000000000000070051334102242000276660ustar00rootroot00000000000000// 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) // // emulates google3/base/once.h // // This header is intended to be included only by internal .cc files and // generated .pb.cc files. Users should not use this directly. #include #ifndef GOOGLE_PROTOBUF_NO_THREAD_SAFETY #ifdef _WIN32 #include #else #include #endif #include namespace google { namespace protobuf { namespace { void SchedYield() { #ifdef _WIN32 Sleep(0); #else // POSIX sched_yield(); #endif } } // namespace void GoogleOnceInitImpl(ProtobufOnceType* once, Closure* closure) { internal::AtomicWord state = internal::Acquire_Load(once); // Fast path. The provided closure was already executed. if (state == ONCE_STATE_DONE) { return; } // The closure execution did not complete yet. The once object can be in one // of the two following states: // - UNINITIALIZED: We are the first thread calling this function. // - EXECUTING_CLOSURE: Another thread is already executing the closure. // // First, try to change the state from UNINITIALIZED to EXECUTING_CLOSURE // atomically. state = internal::Acquire_CompareAndSwap( once, ONCE_STATE_UNINITIALIZED, ONCE_STATE_EXECUTING_CLOSURE); if (state == ONCE_STATE_UNINITIALIZED) { // We are the first thread to call this function, so we have to call the // closure. closure->Run(); internal::Release_Store(once, ONCE_STATE_DONE); } else { // Another thread has already started executing the closure. We need to // wait until it completes the initialization. while (state == ONCE_STATE_EXECUTING_CLOSURE) { // Note that futex() could be used here on Linux as an improvement. SchedYield(); state = internal::Acquire_Load(once); } } } } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_NO_THREAD_SAFETY python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/once.h000066400000000000000000000140041334102242000275250ustar00rootroot00000000000000// 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) // // emulates google3/base/once.h // // This header is intended to be included only by internal .cc files and // generated .pb.cc files. Users should not use this directly. // // This is basically a portable version of pthread_once(). // // This header declares: // * A type called ProtobufOnceType. // * A macro GOOGLE_PROTOBUF_DECLARE_ONCE() which declares a variable of type // ProtobufOnceType. This is the only legal way to declare such a variable. // The macro may only be used at the global scope (you cannot create local or // class member variables of this type). // * A function GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()). // This function, when invoked multiple times given the same ProtobufOnceType // object, will invoke init_func on the first call only, and will make sure // none of the calls return before that first call to init_func has finished. // * The user can provide a parameter which GoogleOnceInit() forwards to the // user-provided function when it is called. Usage example: // int a = 10; // GoogleOnceInit(&my_once, &MyFunctionExpectingIntArgument, &a); // * This implementation guarantees that ProtobufOnceType is a POD (i.e. no // static initializer generated). // // This implements a way to perform lazy initialization. It's more efficient // than using mutexes as no lock is needed if initialization has already // happened. // // Example usage: // void Init(); // GOOGLE_PROTOBUF_DECLARE_ONCE(once_init); // // // Calls Init() exactly once. // void InitOnce() { // GoogleOnceInit(&once_init, &Init); // } // // Note that if GoogleOnceInit() is called before main() has begun, it must // only be called by the thread that will eventually call main() -- that is, // the thread that performs dynamic initialization. In general this is a safe // assumption since people don't usually construct threads before main() starts, // but it is technically not guaranteed. Unfortunately, Win32 provides no way // whatsoever to statically-initialize its synchronization primitives, so our // only choice is to assume that dynamic initialization is single-threaded. #ifndef GOOGLE_PROTOBUF_STUBS_ONCE_H__ #define GOOGLE_PROTOBUF_STUBS_ONCE_H__ #include #include #include namespace google { namespace protobuf { #ifdef GOOGLE_PROTOBUF_NO_THREAD_SAFETY typedef bool ProtobufOnceType; #define GOOGLE_PROTOBUF_ONCE_INIT false inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()) { if (!*once) { *once = true; init_func(); } } template inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)(Arg), Arg arg) { if (!*once) { *once = true; init_func(arg); } } #else enum { ONCE_STATE_UNINITIALIZED = 0, ONCE_STATE_EXECUTING_CLOSURE = 1, ONCE_STATE_DONE = 2 }; typedef internal::AtomicWord ProtobufOnceType; #define GOOGLE_PROTOBUF_ONCE_INIT ::google::protobuf::ONCE_STATE_UNINITIALIZED LIBPROTOBUF_EXPORT void GoogleOnceInitImpl(ProtobufOnceType* once, Closure* closure); inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()) { if (internal::Acquire_Load(once) != ONCE_STATE_DONE) { internal::FunctionClosure0 func(init_func, false); GoogleOnceInitImpl(once, &func); } } template inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)(Arg*), Arg* arg) { if (internal::Acquire_Load(once) != ONCE_STATE_DONE) { internal::FunctionClosure1 func(init_func, false, arg); GoogleOnceInitImpl(once, &func); } } #endif // GOOGLE_PROTOBUF_NO_THREAD_SAFETY class GoogleOnceDynamic { public: GoogleOnceDynamic() : state_(GOOGLE_PROTOBUF_ONCE_INIT) { } // If this->Init() has not been called before by any thread, // execute (*func_with_arg)(arg) then return. // Otherwise, wait until that prior invocation has finished // executing its function, then return. template void Init(void (*func_with_arg)(T*), T* arg) { GoogleOnceInit(&this->state_, func_with_arg, arg); } private: ProtobufOnceType state_; }; #define GOOGLE_PROTOBUF_DECLARE_ONCE(NAME) \ ::google::protobuf::ProtobufOnceType NAME = GOOGLE_PROTOBUF_ONCE_INIT } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_ONCE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/once_unittest.cc000066400000000000000000000151321334102242000316250ustar00rootroot00000000000000// 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) #ifdef _WIN32 #include #else #include #include #endif #include #include #include namespace google { namespace protobuf { namespace { class OnceInitTest : public testing::Test { protected: void SetUp() { state_ = INIT_NOT_STARTED; current_test_ = this; } // Since ProtobufOnceType is only allowed to be allocated in static storage, // each test must use a different pair of ProtobufOnceType objects which it // must declare itself. void SetOnces(ProtobufOnceType* once, ProtobufOnceType* recursive_once) { once_ = once; recursive_once_ = recursive_once; } void InitOnce() { GoogleOnceInit(once_, &InitStatic); } void InitRecursiveOnce() { GoogleOnceInit(recursive_once_, &InitRecursiveStatic); } void BlockInit() { init_blocker_.Lock(); } void UnblockInit() { init_blocker_.Unlock(); } class TestThread { public: TestThread(Closure* callback) : done_(false), joined_(false), callback_(callback) { #ifdef _WIN32 thread_ = CreateThread(NULL, 0, &Start, this, 0, NULL); #else pthread_create(&thread_, NULL, &Start, this); #endif } ~TestThread() { if (!joined_) Join(); } bool IsDone() { MutexLock lock(&done_mutex_); return done_; } void Join() { joined_ = true; #ifdef _WIN32 WaitForSingleObject(thread_, INFINITE); CloseHandle(thread_); #else pthread_join(thread_, NULL); #endif } private: #ifdef _WIN32 HANDLE thread_; #else pthread_t thread_; #endif Mutex done_mutex_; bool done_; bool joined_; Closure* callback_; #ifdef _WIN32 static DWORD WINAPI Start(LPVOID arg) { #else static void* Start(void* arg) { #endif reinterpret_cast(arg)->Run(); return 0; } void Run() { callback_->Run(); MutexLock lock(&done_mutex_); done_ = true; } }; TestThread* RunInitOnceInNewThread() { return new TestThread(NewCallback(this, &OnceInitTest::InitOnce)); } TestThread* RunInitRecursiveOnceInNewThread() { return new TestThread( NewCallback(this, &OnceInitTest::InitRecursiveOnce)); } enum State { INIT_NOT_STARTED, INIT_STARTED, INIT_DONE }; State CurrentState() { MutexLock lock(&mutex_); return state_; } void WaitABit() { #ifdef _WIN32 Sleep(1000); #else sleep(1); #endif } private: Mutex mutex_; Mutex init_blocker_; State state_; ProtobufOnceType* once_; ProtobufOnceType* recursive_once_; void Init() { MutexLock lock(&mutex_); EXPECT_EQ(INIT_NOT_STARTED, state_); state_ = INIT_STARTED; mutex_.Unlock(); init_blocker_.Lock(); init_blocker_.Unlock(); mutex_.Lock(); state_ = INIT_DONE; } static OnceInitTest* current_test_; static void InitStatic() { current_test_->Init(); } static void InitRecursiveStatic() { current_test_->InitOnce(); } }; OnceInitTest* OnceInitTest::current_test_ = NULL; GOOGLE_PROTOBUF_DECLARE_ONCE(simple_once); TEST_F(OnceInitTest, Simple) { SetOnces(&simple_once, NULL); EXPECT_EQ(INIT_NOT_STARTED, CurrentState()); InitOnce(); EXPECT_EQ(INIT_DONE, CurrentState()); // Calling again has no effect. InitOnce(); EXPECT_EQ(INIT_DONE, CurrentState()); } GOOGLE_PROTOBUF_DECLARE_ONCE(recursive_once1); GOOGLE_PROTOBUF_DECLARE_ONCE(recursive_once2); TEST_F(OnceInitTest, Recursive) { SetOnces(&recursive_once1, &recursive_once2); EXPECT_EQ(INIT_NOT_STARTED, CurrentState()); InitRecursiveOnce(); EXPECT_EQ(INIT_DONE, CurrentState()); } GOOGLE_PROTOBUF_DECLARE_ONCE(multiple_threads_once); TEST_F(OnceInitTest, MultipleThreads) { SetOnces(&multiple_threads_once, NULL); scoped_ptr threads[4]; EXPECT_EQ(INIT_NOT_STARTED, CurrentState()); for (int i = 0; i < 4; i++) { threads[i].reset(RunInitOnceInNewThread()); } for (int i = 0; i < 4; i++) { threads[i]->Join(); } EXPECT_EQ(INIT_DONE, CurrentState()); } GOOGLE_PROTOBUF_DECLARE_ONCE(multiple_threads_blocked_once1); GOOGLE_PROTOBUF_DECLARE_ONCE(multiple_threads_blocked_once2); TEST_F(OnceInitTest, MultipleThreadsBlocked) { SetOnces(&multiple_threads_blocked_once1, &multiple_threads_blocked_once2); scoped_ptr threads[8]; EXPECT_EQ(INIT_NOT_STARTED, CurrentState()); BlockInit(); for (int i = 0; i < 4; i++) { threads[i].reset(RunInitOnceInNewThread()); } for (int i = 4; i < 8; i++) { threads[i].reset(RunInitRecursiveOnceInNewThread()); } WaitABit(); // We should now have one thread blocked inside Init(), four blocked waiting // for Init() to complete, and three blocked waiting for InitRecursive() to // complete. EXPECT_EQ(INIT_STARTED, CurrentState()); UnblockInit(); for (int i = 0; i < 8; i++) { threads[i]->Join(); } EXPECT_EQ(INIT_DONE, CurrentState()); } } // anonymous namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/platform_macros.h000066400000000000000000000114531334102242000317760ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_PLATFORM_MACROS_H_ #define GOOGLE_PROTOBUF_PLATFORM_MACROS_H_ #define GOOGLE_PROTOBUF_PLATFORM_ERROR \ #error "Host platform was not detected as supported by protobuf" // Processor architecture detection. For more info on what's defined, see: // http://msdn.microsoft.com/en-us/library/b0084kay.aspx // http://www.agner.org/optimize/calling_conventions.pdf // or with gcc, run: "echo | gcc -E -dM -" #if defined(_M_X64) || defined(__x86_64__) #define GOOGLE_PROTOBUF_ARCH_X64 1 #define GOOGLE_PROTOBUF_ARCH_64_BIT 1 #elif defined(_M_IX86) || defined(__i386__) #define GOOGLE_PROTOBUF_ARCH_IA32 1 #define GOOGLE_PROTOBUF_ARCH_32_BIT 1 #elif defined(__QNX__) #define GOOGLE_PROTOBUF_ARCH_ARM_QNX 1 #define GOOGLE_PROTOBUF_ARCH_32_BIT 1 #elif defined(_M_ARM) || defined(__ARMEL__) #define GOOGLE_PROTOBUF_ARCH_ARM 1 #define GOOGLE_PROTOBUF_ARCH_32_BIT 1 #elif defined(_M_ARM64) #define GOOGLE_PROTOBUF_ARCH_ARM 1 #define GOOGLE_PROTOBUF_ARCH_64_BIT 1 #elif defined(__aarch64__) #define GOOGLE_PROTOBUF_ARCH_AARCH64 1 #define GOOGLE_PROTOBUF_ARCH_64_BIT 1 #elif defined(__MIPSEL__) #if defined(__LP64__) #define GOOGLE_PROTOBUF_ARCH_MIPS64 1 #define GOOGLE_PROTOBUF_ARCH_64_BIT 1 #else #define GOOGLE_PROTOBUF_ARCH_MIPS 1 #define GOOGLE_PROTOBUF_ARCH_32_BIT 1 #endif #elif defined(__pnacl__) #define GOOGLE_PROTOBUF_ARCH_32_BIT 1 #elif defined(sparc) #define GOOGLE_PROTOBUF_ARCH_SPARC 1 #if defined(__sparc_v9__) || defined(__sparcv9) || defined(__arch64__) #define GOOGLE_PROTOBUF_ARCH_64_BIT 1 #else #define GOOGLE_PROTOBUF_ARCH_32_BIT 1 #endif #elif defined(_POWER) || defined(__powerpc64__) || defined(__PPC64__) #define GOOGLE_PROTOBUF_ARCH_POWER 1 #define GOOGLE_PROTOBUF_ARCH_64_BIT 1 #elif defined(__PPC__) #define GOOGLE_PROTOBUF_ARCH_PPC 1 #define GOOGLE_PROTOBUF_ARCH_32_BIT 1 #elif defined(__GNUC__) # if (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4)) // We fallback to the generic Clang/GCC >= 4.7 implementation in atomicops.h # elif defined(__clang__) # if !__has_extension(c_atomic) GOOGLE_PROTOBUF_PLATFORM_ERROR # endif // We fallback to the generic Clang/GCC >= 4.7 implementation in atomicops.h # endif # if __LP64__ # define GOOGLE_PROTOBUF_ARCH_64_BIT 1 # else # define GOOGLE_PROTOBUF_ARCH_32_BIT 1 # endif #else GOOGLE_PROTOBUF_PLATFORM_ERROR #endif #if defined(__APPLE__) #define GOOGLE_PROTOBUF_OS_APPLE #include #if TARGET_OS_IPHONE #define GOOGLE_PROTOBUF_OS_IPHONE #endif #elif defined(__EMSCRIPTEN__) #define GOOGLE_PROTOBUF_OS_EMSCRIPTEN #elif defined(__native_client__) #define GOOGLE_PROTOBUF_OS_NACL #elif defined(sun) #define GOOGLE_PROTOBUF_OS_SOLARIS #elif defined(_AIX) #define GOOGLE_PROTOBUF_OS_AIX #elif defined(__ANDROID__) #define GOOGLE_PROTOBUF_OS_ANDROID #endif #undef GOOGLE_PROTOBUF_PLATFORM_ERROR #if defined(GOOGLE_PROTOBUF_OS_ANDROID) || defined(GOOGLE_PROTOBUF_OS_IPHONE) || defined(__OpenBSD__) // 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. #define GOOGLE_PROTOBUF_NO_THREADLOCAL #endif #endif // GOOGLE_PROTOBUF_PLATFORM_MACROS_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/port.h000066400000000000000000000375441334102242000276030ustar00rootroot00000000000000// 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_PORT_H_ #define GOOGLE_PROTOBUF_STUBS_PORT_H_ #include #include #include #include #include #if defined(__osf__) // Tru64 lacks stdint.h, but has inttypes.h which defines a superset of // what stdint.h would define. #include #elif !defined(_MSC_VER) #include #endif #include #undef PROTOBUF_LITTLE_ENDIAN #ifdef _WIN32 // Assuming windows is always little-endian. // TODO(xiaofeng): The PROTOBUF_LITTLE_ENDIAN is not only used for // optimization but also for correctness. We should define an // different macro to test the big-endian code path in coded_stream. #if !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) #define PROTOBUF_LITTLE_ENDIAN 1 #endif #if _MSC_VER >= 1300 && !defined(__INTEL_COMPILER) // If MSVC has "/RTCc" set, it will complain about truncating casts at // runtime. This file contains some intentional truncating casts. #pragma runtime_checks("c", off) #endif #else #include // __BYTE_ORDER #if defined(__OpenBSD__) #include #endif #if ((defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) || \ (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN) || \ (defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN)) && \ !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) #define PROTOBUF_LITTLE_ENDIAN 1 #endif #endif #if defined(_MSC_VER) && defined(PROTOBUF_USE_DLLS) #ifdef LIBPROTOBUF_EXPORTS #define LIBPROTOBUF_EXPORT __declspec(dllexport) #else #define LIBPROTOBUF_EXPORT __declspec(dllimport) #endif #ifdef LIBPROTOC_EXPORTS #define LIBPROTOC_EXPORT __declspec(dllexport) #else #define LIBPROTOC_EXPORT __declspec(dllimport) #endif #else #define LIBPROTOBUF_EXPORT #define LIBPROTOC_EXPORT #endif // These #includes are for the byte swap functions declared later on. #ifdef _MSC_VER #include // NOLINT(build/include) #elif defined(__APPLE__) #include #elif defined(__GLIBC__) || defined(__CYGWIN__) #include // IWYU pragma: export #endif #define PROTOBUF_RUNTIME_DEPRECATED(message) // =================================================================== // from google3/base/port.h #if (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L || \ (defined(_MSC_VER) && _MSC_VER >= 1900)) // Define this to 1 if the code is compiled in C++11 mode; leave it // undefined otherwise. Do NOT define it to 0 -- that causes // '#ifdef LANG_CXX11' to behave differently from '#if LANG_CXX11'. #define LANG_CXX11 1 #endif #if LANG_CXX11 && !defined(__NVCC__) #define PROTOBUF_CXX11 1 #else #define PROTOBUF_CXX11 0 #endif #if PROTOBUF_CXX11 #define PROTOBUF_FINAL final #else #define PROTOBUF_FINAL #endif namespace google { namespace protobuf { typedef unsigned int uint; #ifdef _MSC_VER typedef signed __int8 int8; typedef __int16 int16; typedef __int32 int32; typedef __int64 int64; typedef unsigned __int8 uint8; typedef unsigned __int16 uint16; typedef unsigned __int32 uint32; typedef unsigned __int64 uint64; #else typedef int8_t int8; typedef int16_t int16; typedef int32_t int32; typedef int64_t int64; typedef uint8_t uint8; typedef uint16_t uint16; typedef uint32_t uint32; typedef uint64_t uint64; #endif // long long macros to be used because gcc and vc++ use different suffixes, // and different size specifiers in format strings #undef GOOGLE_LONGLONG #undef GOOGLE_ULONGLONG #undef GOOGLE_LL_FORMAT #ifdef _MSC_VER #define GOOGLE_LONGLONG(x) x##I64 #define GOOGLE_ULONGLONG(x) x##UI64 #define GOOGLE_LL_FORMAT "I64" // As in printf("%I64d", ...) #else // By long long, we actually mean int64. #define GOOGLE_LONGLONG(x) x##LL #define GOOGLE_ULONGLONG(x) x##ULL // Used to format real long long integers. #define GOOGLE_LL_FORMAT "ll" // As in "%lld". Note that "q" is poor form also. #endif static const int32 kint32max = 0x7FFFFFFF; static const int32 kint32min = -kint32max - 1; static const int64 kint64max = GOOGLE_LONGLONG(0x7FFFFFFFFFFFFFFF); static const int64 kint64min = -kint64max - 1; static const uint32 kuint32max = 0xFFFFFFFFu; static const uint64 kuint64max = GOOGLE_ULONGLONG(0xFFFFFFFFFFFFFFFF); // ------------------------------------------------------------------- // Annotations: Some parts of the code have been annotated in ways that might // be useful to some compilers or tools, but are not supported universally. // You can #define these annotations yourself if the default implementation // is not right for you. #ifndef GOOGLE_ATTRIBUTE_ALWAYS_INLINE #if defined(__GNUC__) && (__GNUC__ > 3 ||(__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) // For functions we want to force inline. // Introduced in gcc 3.1. #define GOOGLE_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline)) #else // Other compilers will have to figure it out for themselves. #define GOOGLE_ATTRIBUTE_ALWAYS_INLINE #endif #endif #define GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE GOOGLE_ATTRIBUTE_ALWAYS_INLINE #ifndef GOOGLE_ATTRIBUTE_NOINLINE #if defined(__GNUC__) && (__GNUC__ > 3 ||(__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) // For functions we want to force not inline. // Introduced in gcc 3.1. #define GOOGLE_ATTRIBUTE_NOINLINE __attribute__ ((noinline)) #elif defined(_MSC_VER) && (_MSC_VER >= 1400) // Seems to have been around since at least Visual Studio 2005 #define GOOGLE_ATTRIBUTE_NOINLINE __declspec(noinline) #else // Other compilers will have to figure it out for themselves. #define GOOGLE_ATTRIBUTE_NOINLINE #endif #endif #define GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE GOOGLE_ATTRIBUTE_NOINLINE #ifndef GOOGLE_PREDICT_TRUE #ifdef __GNUC__ // Provided at least since GCC 3.0. #define GOOGLE_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) #else #define GOOGLE_PREDICT_TRUE(x) (x) #endif #endif #ifndef GOOGLE_PREDICT_FALSE #ifdef __GNUC__ // Provided at least since GCC 3.0. #define GOOGLE_PREDICT_FALSE(x) (__builtin_expect(x, 0)) #else #define GOOGLE_PREDICT_FALSE(x) (x) #endif #endif // Delimits a block of code which may write to memory which is simultaneously // written by other threads, but which has been determined to be thread-safe // (e.g. because it is an idempotent write). #ifndef GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN #define GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN() #endif #ifndef GOOGLE_SAFE_CONCURRENT_WRITES_END #define GOOGLE_SAFE_CONCURRENT_WRITES_END() #endif #if defined(__clang__) && defined(__has_cpp_attribute) \ && !defined(GOOGLE_PROTOBUF_OS_APPLE) # if defined(GOOGLE_PROTOBUF_OS_NACL) || defined(EMSCRIPTEN) || \ __has_cpp_attribute(clang::fallthrough) # define GOOGLE_FALLTHROUGH_INTENDED [[clang::fallthrough]] # endif #elif defined(__GNUC__) && __GNUC__ > 6 # define GOOGLE_FALLTHROUGH_INTENDED [[gnu::fallthrough]] #endif #ifndef GOOGLE_FALLTHROUGH_INTENDED # define GOOGLE_FALLTHROUGH_INTENDED #endif #define GOOGLE_GUARDED_BY(x) #define GOOGLE_ATTRIBUTE_COLD #ifdef GOOGLE_PROTOBUF_DONT_USE_UNALIGNED # define GOOGLE_PROTOBUF_USE_UNALIGNED 0 #else # if defined(_M_X64) || defined(__x86_64__) || defined(_M_IX86) || defined(__i386__) # define GOOGLE_PROTOBUF_USE_UNALIGNED 1 # else # define GOOGLE_PROTOBUF_USE_UNALIGNED 0 # endif #endif #define GOOGLE_PROTOBUF_ATTRIBUTE_COLD GOOGLE_ATTRIBUTE_COLD #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 GOOGLE_UNALIGNED_LOAD16(const void *p) { return __sanitizer_unaligned_load16(p); } inline uint32 GOOGLE_UNALIGNED_LOAD32(const void *p) { return __sanitizer_unaligned_load32(p); } inline uint64 GOOGLE_UNALIGNED_LOAD64(const void *p) { return __sanitizer_unaligned_load64(p); } inline void GOOGLE_UNALIGNED_STORE16(void *p, uint16 v) { __sanitizer_unaligned_store16(p, v); } inline void GOOGLE_UNALIGNED_STORE32(void *p, uint32 v) { __sanitizer_unaligned_store32(p, v); } inline void GOOGLE_UNALIGNED_STORE64(void *p, uint64 v) { __sanitizer_unaligned_store64(p, v); } #elif GOOGLE_PROTOBUF_USE_UNALIGNED #define GOOGLE_UNALIGNED_LOAD16(_p) (*reinterpret_cast(_p)) #define GOOGLE_UNALIGNED_LOAD32(_p) (*reinterpret_cast(_p)) #define GOOGLE_UNALIGNED_LOAD64(_p) (*reinterpret_cast(_p)) #define GOOGLE_UNALIGNED_STORE16(_p, _val) (*reinterpret_cast(_p) = (_val)) #define GOOGLE_UNALIGNED_STORE32(_p, _val) (*reinterpret_cast(_p) = (_val)) #define GOOGLE_UNALIGNED_STORE64(_p, _val) (*reinterpret_cast(_p) = (_val)) #else inline uint16 GOOGLE_UNALIGNED_LOAD16(const void *p) { uint16 t; memcpy(&t, p, sizeof t); return t; } inline uint32 GOOGLE_UNALIGNED_LOAD32(const void *p) { uint32 t; memcpy(&t, p, sizeof t); return t; } inline uint64 GOOGLE_UNALIGNED_LOAD64(const void *p) { uint64 t; memcpy(&t, p, sizeof t); return t; } inline void GOOGLE_UNALIGNED_STORE16(void *p, uint16 v) { memcpy(p, &v, sizeof v); } inline void GOOGLE_UNALIGNED_STORE32(void *p, uint32 v) { memcpy(p, &v, sizeof v); } inline void GOOGLE_UNALIGNED_STORE64(void *p, uint64 v) { memcpy(p, &v, sizeof v); } #endif #if defined(_MSC_VER) #define GOOGLE_THREAD_LOCAL __declspec(thread) #else #define GOOGLE_THREAD_LOCAL __thread #endif // The following guarantees declaration of the byte swap functions. #ifdef _MSC_VER #define bswap_16(x) _byteswap_ushort(x) #define bswap_32(x) _byteswap_ulong(x) #define bswap_64(x) _byteswap_uint64(x) #elif defined(__APPLE__) // Mac OS X / Darwin features #define bswap_16(x) OSSwapInt16(x) #define bswap_32(x) OSSwapInt32(x) #define bswap_64(x) OSSwapInt64(x) #elif !defined(__GLIBC__) && !defined(__CYGWIN__) static inline uint16 bswap_16(uint16 x) { return static_cast(((x & 0xFF) << 8) | ((x & 0xFF00) >> 8)); } #define bswap_16(x) bswap_16(x) static inline uint32 bswap_32(uint32 x) { return (((x & 0xFF) << 24) | ((x & 0xFF00) << 8) | ((x & 0xFF0000) >> 8) | ((x & 0xFF000000) >> 24)); } #define bswap_32(x) bswap_32(x) static inline uint64 bswap_64(uint64 x) { return (((x & GOOGLE_ULONGLONG(0xFF)) << 56) | ((x & GOOGLE_ULONGLONG(0xFF00)) << 40) | ((x & GOOGLE_ULONGLONG(0xFF0000)) << 24) | ((x & GOOGLE_ULONGLONG(0xFF000000)) << 8) | ((x & GOOGLE_ULONGLONG(0xFF00000000)) >> 8) | ((x & GOOGLE_ULONGLONG(0xFF0000000000)) >> 24) | ((x & GOOGLE_ULONGLONG(0xFF000000000000)) >> 40) | ((x & GOOGLE_ULONGLONG(0xFF00000000000000)) >> 56)); } #define bswap_64(x) bswap_64(x) #endif // =================================================================== // from google3/util/bits/bits.h class Bits { public: static uint32 Log2FloorNonZero(uint32 n) { #if defined(__GNUC__) return 31 ^ static_cast(__builtin_clz(n)); #elif defined(COMPILER_MSVC) && defined(_M_IX86) _asm { bsr ebx, n mov n, ebx } return n; #else return Log2FloorNonZero_Portable(n); #endif } static uint32 Log2FloorNonZero64(uint64 n) { // arm-nacl-clang runs into an instruction-selection failure when it // encounters __builtin_clzll: // https://bugs.chromium.org/p/nativeclient/issues/detail?id=4395 // To work around this, when we build for NaCl we use the portable // implementation instead. #if defined(__GNUC__) && !defined(GOOGLE_PROTOBUF_OS_NACL) return 63 ^ static_cast(__builtin_clzll(n)); #else return Log2FloorNonZero64_Portable(n); #endif } private: static int Log2FloorNonZero_Portable(uint32 n) { if (n == 0) return -1; int log = 0; uint32 value = n; for (int i = 4; i >= 0; --i) { int shift = (1 << i); uint32 x = value >> shift; if (x != 0) { value = x; log += shift; } } assert(value == 1); return log; } static int Log2FloorNonZero64_Portable(uint64 n) { const uint32 topbits = static_cast(n >> 32); if (topbits == 0) { // Top bits are zero, so scan in bottom bits return static_cast(Log2FloorNonZero(static_cast(n))); } else { return 32 + static_cast(Log2FloorNonZero(topbits)); } } }; // =================================================================== // from google3/util/endian/endian.h LIBPROTOBUF_EXPORT uint32 ghtonl(uint32 x); class BigEndian { public: #ifdef PROTOBUF_LITTLE_ENDIAN static uint16 FromHost16(uint16 x) { return bswap_16(x); } static uint16 ToHost16(uint16 x) { return bswap_16(x); } static uint32 FromHost32(uint32 x) { return bswap_32(x); } static uint32 ToHost32(uint32 x) { return bswap_32(x); } static uint64 FromHost64(uint64 x) { return bswap_64(x); } static uint64 ToHost64(uint64 x) { return bswap_64(x); } static bool IsLittleEndian() { return true; } #else static uint16 FromHost16(uint16 x) { return x; } static uint16 ToHost16(uint16 x) { return x; } static uint32 FromHost32(uint32 x) { return x; } static uint32 ToHost32(uint32 x) { return x; } static uint64 FromHost64(uint64 x) { return x; } static uint64 ToHost64(uint64 x) { return x; } static bool IsLittleEndian() { return false; } #endif /* ENDIAN */ // Functions to do unaligned loads and stores in big-endian order. static uint16 Load16(const void *p) { return ToHost16(GOOGLE_UNALIGNED_LOAD16(p)); } static void Store16(void *p, uint16 v) { GOOGLE_UNALIGNED_STORE16(p, FromHost16(v)); } static uint32 Load32(const void *p) { return ToHost32(GOOGLE_UNALIGNED_LOAD32(p)); } static void Store32(void *p, uint32 v) { GOOGLE_UNALIGNED_STORE32(p, FromHost32(v)); } static uint64 Load64(const void *p) { return ToHost64(GOOGLE_UNALIGNED_LOAD64(p)); } static void Store64(void *p, uint64 v) { GOOGLE_UNALIGNED_STORE64(p, FromHost64(v)); } }; #ifndef GOOGLE_ATTRIBUTE_SECTION_VARIABLE #define GOOGLE_ATTRIBUTE_SECTION_VARIABLE(name) #endif #define GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(name) } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_PORT_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/scoped_ptr.h000066400000000000000000000173371334102242000307570ustar00rootroot00000000000000// 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_SCOPED_PTR_H_ #define GOOGLE_PROTOBUF_STUBS_SCOPED_PTR_H_ #include namespace google { namespace protobuf { // =================================================================== // from google3/base/scoped_ptr.h namespace internal { // This is an implementation designed to match the anticipated future TR2 // implementation of the scoped_ptr class, and its closely-related brethren, // scoped_array, scoped_ptr_malloc, and make_scoped_ptr. template class scoped_ptr; template class scoped_array; // A scoped_ptr is like a T*, except that the destructor of scoped_ptr // automatically deletes the pointer it holds (if any). // That is, scoped_ptr owns the T object that it points to. // Like a T*, a scoped_ptr may hold either NULL or a pointer to a T object. // // The size of a scoped_ptr is small: // sizeof(scoped_ptr) == sizeof(C*) template class scoped_ptr { public: // The element type typedef C element_type; // Constructor. Defaults to initializing with NULL. // There is no way to create an uninitialized scoped_ptr. // The input parameter must be allocated with new. explicit scoped_ptr(C* p = NULL) : ptr_(p) { } // Destructor. If there is a C object, delete it. // We don't need to test ptr_ == NULL because C++ does that for us. ~scoped_ptr() { enum { type_must_be_complete = sizeof(C) }; delete ptr_; } // Reset. Deletes the current owned object, if any. // Then takes ownership of a new object, if given. // this->reset(this->get()) works. void reset(C* p = NULL) { if (p != ptr_) { enum { type_must_be_complete = sizeof(C) }; delete ptr_; ptr_ = p; } } // Accessors to get the owned object. // operator* and operator-> will assert() if there is no current object. C& operator*() const { assert(ptr_ != NULL); return *ptr_; } C* operator->() const { assert(ptr_ != NULL); return ptr_; } C* get() const { return ptr_; } // Comparison operators. // These return whether two scoped_ptr refer to the same object, not just to // two different but equal objects. bool operator==(C* p) const { return ptr_ == p; } bool operator!=(C* p) const { return ptr_ != p; } // Swap two scoped pointers. void swap(scoped_ptr& p2) { C* tmp = ptr_; ptr_ = p2.ptr_; p2.ptr_ = tmp; } // Release a pointer. // The return value is the current pointer held by this object. // If this object holds a NULL pointer, the return value is NULL. // After this operation, this object will hold a NULL pointer, // and will not own the object any more. C* release() { C* retVal = ptr_; ptr_ = NULL; return retVal; } private: C* ptr_; // Forbid comparison of scoped_ptr types. If C2 != C, it totally doesn't // make sense, and if C2 == C, it still doesn't make sense because you should // never have the same object owned by two different scoped_ptrs. template bool operator==(scoped_ptr const& p2) const; template bool operator!=(scoped_ptr const& p2) const; // Disallow evil constructors scoped_ptr(const scoped_ptr&); void operator=(const scoped_ptr&); }; // scoped_array is like scoped_ptr, except that the caller must allocate // with new [] and the destructor deletes objects with delete []. // // As with scoped_ptr, a scoped_array either points to an object // or is NULL. A scoped_array owns the object that it points to. // // Size: sizeof(scoped_array) == sizeof(C*) template class scoped_array { public: // The element type typedef C element_type; // Constructor. Defaults to initializing with NULL. // There is no way to create an uninitialized scoped_array. // The input parameter must be allocated with new []. explicit scoped_array(C* p = NULL) : array_(p) { } // Destructor. If there is a C object, delete it. // We don't need to test ptr_ == NULL because C++ does that for us. ~scoped_array() { enum { type_must_be_complete = sizeof(C) }; delete[] array_; } // Reset. Deletes the current owned object, if any. // Then takes ownership of a new object, if given. // this->reset(this->get()) works. void reset(C* p = NULL) { if (p != array_) { enum { type_must_be_complete = sizeof(C) }; delete[] array_; array_ = p; } } // Get one element of the current object. // Will assert() if there is no current object, or index i is negative. C& operator[](std::ptrdiff_t i) const { assert(i >= 0); assert(array_ != NULL); return array_[i]; } // Get a pointer to the zeroth element of the current object. // If there is no current object, return NULL. C* get() const { return array_; } // Comparison operators. // These return whether two scoped_array refer to the same object, not just to // two different but equal objects. bool operator==(C* p) const { return array_ == p; } bool operator!=(C* p) const { return array_ != p; } // Swap two scoped arrays. void swap(scoped_array& p2) { C* tmp = array_; array_ = p2.array_; p2.array_ = tmp; } // Release an array. // The return value is the current pointer held by this object. // If this object holds a NULL pointer, the return value is NULL. // After this operation, this object will hold a NULL pointer, // and will not own the object any more. C* release() { C* retVal = array_; array_ = NULL; return retVal; } private: C* array_; // Forbid comparison of different scoped_array types. template bool operator==(scoped_array const& p2) const; template bool operator!=(scoped_array const& p2) const; // Disallow evil constructors scoped_array(const scoped_array&); void operator=(const scoped_array&); }; } // 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::scoped_ptr; using internal::scoped_array; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_SCOPED_PTR_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/shared_ptr.h000066400000000000000000000375231334102242000307470ustar00rootroot00000000000000// 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/shared_ptr.h #ifndef GOOGLE_PROTOBUF_STUBS_SHARED_PTR_H__ #define GOOGLE_PROTOBUF_STUBS_SHARED_PTR_H__ #include #include // for swap #include #include namespace google { namespace protobuf { namespace internal { // Alias to std::shared_ptr for any C++11 platform, // and for any supported MSVC compiler. #if !defined(UTIL_GTL_USE_STD_SHARED_PTR) && \ (defined(COMPILER_MSVC) || defined(LANG_CXX11)) #define UTIL_GTL_USE_STD_SHARED_PTR 1 #endif #if defined(UTIL_GTL_USE_STD_SHARED_PTR) && UTIL_GTL_USE_STD_SHARED_PTR // These are transitional. They will be going away soon. // Please just #include and just type std::shared_ptr yourself, instead // of relying on this file. // // Migration doc: http://go/std-shared-ptr-lsc using std::enable_shared_from_this; using std::shared_ptr; using std::static_pointer_cast; using std::weak_ptr; #else // below, UTIL_GTL_USE_STD_SHARED_PTR not set or set to 0. // For everything else there is the google3 implementation. inline bool RefCountDec(volatile Atomic32 *ptr) { return Barrier_AtomicIncrement(ptr, -1) != 0; } inline void RefCountInc(volatile Atomic32 *ptr) { NoBarrier_AtomicIncrement(ptr, 1); } template class shared_ptr; template class weak_ptr; // This class is an internal implementation detail for shared_ptr. If two // shared_ptrs point to the same object, they also share a control block. // An "empty" shared_pointer refers to NULL and also has a NULL control block. // It contains all of the state that's needed for reference counting or any // other kind of resource management. In this implementation the control block // happens to consist of two atomic words, the reference count (the number // of shared_ptrs that share ownership of the object) and the weak count // (the number of weak_ptrs that observe the object, plus 1 if the // refcount is nonzero). // // The "plus 1" is to prevent a race condition in the shared_ptr and // weak_ptr destructors. We need to make sure the control block is // only deleted once, so we need to make sure that at most one // object sees the weak count decremented from 1 to 0. class SharedPtrControlBlock { template friend class shared_ptr; template friend class weak_ptr; private: SharedPtrControlBlock() : refcount_(1), weak_count_(1) { } Atomic32 refcount_; Atomic32 weak_count_; }; // Forward declaration. The class is defined below. template class enable_shared_from_this; template class shared_ptr { template friend class weak_ptr; public: typedef T element_type; shared_ptr() : ptr_(NULL), control_block_(NULL) {} explicit shared_ptr(T* ptr) : ptr_(ptr), control_block_(ptr != NULL ? new SharedPtrControlBlock : NULL) { // If p is non-null and T inherits from enable_shared_from_this, we // set up the data that shared_from_this needs. MaybeSetupWeakThis(ptr); } // Copy constructor: makes this object a copy of ptr, and increments // the reference count. template shared_ptr(const shared_ptr& ptr) : ptr_(NULL), control_block_(NULL) { Initialize(ptr); } // Need non-templated version to prevent the compiler-generated default shared_ptr(const shared_ptr& ptr) : ptr_(NULL), control_block_(NULL) { Initialize(ptr); } // Assignment operator. Replaces the existing shared_ptr with ptr. // Increment ptr's reference count and decrement the one being replaced. template shared_ptr& operator=(const shared_ptr& ptr) { if (ptr_ != ptr.ptr_) { shared_ptr me(ptr); // will hold our previous state to be destroyed. swap(me); } return *this; } // Need non-templated version to prevent the compiler-generated default shared_ptr& operator=(const shared_ptr& ptr) { if (ptr_ != ptr.ptr_) { shared_ptr me(ptr); // will hold our previous state to be destroyed. swap(me); } return *this; } // TODO(austern): Consider providing this constructor. The draft C++ standard // (20.8.10.2.1) includes it. However, it says that this constructor throws // a bad_weak_ptr exception when ptr is expired. Is it better to provide this // constructor and make it do something else, like fail with a CHECK, or to // leave this constructor out entirely? // // template // shared_ptr(const weak_ptr& ptr); ~shared_ptr() { if (ptr_ != NULL) { if (!RefCountDec(&control_block_->refcount_)) { delete ptr_; // weak_count_ is defined as the number of weak_ptrs that observe // ptr_, plus 1 if refcount_ is nonzero. if (!RefCountDec(&control_block_->weak_count_)) { delete control_block_; } } } } // Replaces underlying raw pointer with the one passed in. The reference // count is set to one (or zero if the pointer is NULL) for the pointer // being passed in and decremented for the one being replaced. // // If you have a compilation error with this code, make sure you aren't // passing NULL, nullptr, or 0 to this function. Call reset without an // argument to reset to a null ptr. template void reset(Y* p) { if (p != ptr_) { shared_ptr tmp(p); tmp.swap(*this); } } void reset() { reset(static_cast(NULL)); } // Exchanges the contents of this with the contents of r. This function // supports more efficient swapping since it eliminates the need for a // temporary shared_ptr object. void swap(shared_ptr& r) { using std::swap; // http://go/using-std-swap swap(ptr_, r.ptr_); swap(control_block_, r.control_block_); } // The following function is useful for gaining access to the underlying // pointer when a shared_ptr remains in scope so the reference-count is // known to be > 0 (e.g. for parameter passing). T* get() const { return ptr_; } T& operator*() const { return *ptr_; } T* operator->() const { return ptr_; } long use_count() const { return control_block_ ? control_block_->refcount_ : 1; } bool unique() const { return use_count() == 1; } private: // If r is non-empty, initialize *this to share ownership with r, // increasing the underlying reference count. // If r is empty, *this remains empty. // Requires: this is empty, namely this->ptr_ == NULL. template void Initialize(const shared_ptr& r) { // This performs a static_cast on r.ptr_ to U*, which is a no-op since it // is already a U*. So initialization here requires that r.ptr_ is // implicitly convertible to T*. InitializeWithStaticCast(r); } // Initializes *this as described in Initialize, but additionally performs a // static_cast from r.ptr_ (V*) to U*. // NOTE(gfc): We'd need a more general form to support const_pointer_cast and // dynamic_pointer_cast, but those operations are sufficiently discouraged // that supporting static_pointer_cast is sufficient. template void InitializeWithStaticCast(const shared_ptr& r) { if (r.control_block_ != NULL) { RefCountInc(&r.control_block_->refcount_); ptr_ = static_cast(r.ptr_); control_block_ = r.control_block_; } } // Helper function for the constructor that takes a raw pointer. If T // doesn't inherit from enable_shared_from_this then we have nothing to // do, so this function is trivial and inline. The other version is declared // out of line, after the class definition of enable_shared_from_this. void MaybeSetupWeakThis(enable_shared_from_this* ptr); void MaybeSetupWeakThis(...) { } T* ptr_; SharedPtrControlBlock* control_block_; #ifndef SWIG template friend class shared_ptr; template friend shared_ptr static_pointer_cast(const shared_ptr& rhs); #endif }; // Matches the interface of std::swap as an aid to generic programming. template void swap(shared_ptr& r, shared_ptr& s) { r.swap(s); } template shared_ptr static_pointer_cast(const shared_ptr& rhs) { shared_ptr lhs; lhs.template InitializeWithStaticCast(rhs); return lhs; } // See comments at the top of the file for a description of why this // class exists, and the draft C++ standard (as of July 2009 the // latest draft is N2914) for the detailed specification. template class weak_ptr { template friend class weak_ptr; public: typedef T element_type; // Create an empty (i.e. already expired) weak_ptr. weak_ptr() : ptr_(NULL), control_block_(NULL) { } // Create a weak_ptr that observes the same object that ptr points // to. Note that there is no race condition here: we know that the // control block can't disappear while we're looking at it because // it is owned by at least one shared_ptr, ptr. template weak_ptr(const shared_ptr& ptr) { CopyFrom(ptr.ptr_, ptr.control_block_); } // Copy a weak_ptr. The object it points to might disappear, but we // don't care: we're only working with the control block, and it can't // disappear while we're looking at because it's owned by at least one // weak_ptr, ptr. template weak_ptr(const weak_ptr& ptr) { CopyFrom(ptr.ptr_, ptr.control_block_); } // Need non-templated version to prevent default copy constructor weak_ptr(const weak_ptr& ptr) { CopyFrom(ptr.ptr_, ptr.control_block_); } // Destroy the weak_ptr. If no shared_ptr owns the control block, and if // we are the last weak_ptr to own it, then it can be deleted. Note that // weak_count_ is defined as the number of weak_ptrs sharing this control // block, plus 1 if there are any shared_ptrs. We therefore know that it's // safe to delete the control block when weak_count_ reaches 0, without // having to perform any additional tests. ~weak_ptr() { if (control_block_ != NULL && !RefCountDec(&control_block_->weak_count_)) { delete control_block_; } } weak_ptr& operator=(const weak_ptr& ptr) { if (&ptr != this) { weak_ptr tmp(ptr); tmp.swap(*this); } return *this; } template weak_ptr& operator=(const weak_ptr& ptr) { weak_ptr tmp(ptr); tmp.swap(*this); return *this; } template weak_ptr& operator=(const shared_ptr& ptr) { weak_ptr tmp(ptr); tmp.swap(*this); return *this; } void swap(weak_ptr& ptr) { using std::swap; // http://go/using-std-swap swap(ptr_, ptr.ptr_); swap(control_block_, ptr.control_block_); } void reset() { weak_ptr tmp; tmp.swap(*this); } // Return the number of shared_ptrs that own the object we are observing. // Note that this number can be 0 (if this pointer has expired). long use_count() const { return control_block_ != NULL ? control_block_->refcount_ : 0; } bool expired() const { return use_count() == 0; } // Return a shared_ptr that owns the object we are observing. If we // have expired, the shared_ptr will be empty. We have to be careful // about concurrency, though, since some other thread might be // destroying the last owning shared_ptr while we're in this // function. We want to increment the refcount only if it's nonzero // and get the new value, and we want that whole operation to be // atomic. shared_ptr lock() const { shared_ptr result; if (control_block_ != NULL) { Atomic32 old_refcount; do { old_refcount = control_block_->refcount_; if (old_refcount == 0) break; } while (old_refcount != NoBarrier_CompareAndSwap( &control_block_->refcount_, old_refcount, old_refcount + 1)); if (old_refcount > 0) { result.ptr_ = ptr_; result.control_block_ = control_block_; } } return result; } private: void CopyFrom(T* ptr, SharedPtrControlBlock* control_block) { ptr_ = ptr; control_block_ = control_block; if (control_block_ != NULL) RefCountInc(&control_block_->weak_count_); } private: element_type* ptr_; SharedPtrControlBlock* control_block_; }; template void swap(weak_ptr& r, weak_ptr& s) { r.swap(s); } // See comments at the top of the file for a description of why this class // exists, and section 20.8.10.5 of the draft C++ standard (as of July 2009 // the latest draft is N2914) for the detailed specification. template class enable_shared_from_this { friend class shared_ptr; public: // Precondition: there must be a shared_ptr that owns *this and that was // created, directly or indirectly, from a raw pointer of type T*. (The // latter part of the condition is technical but not quite redundant; it // rules out some complicated uses involving inheritance hierarchies.) shared_ptr shared_from_this() { // Behavior is undefined if the precondition isn't satisfied; we choose // to die with a CHECK failure. GOOGLE_CHECK(!weak_this_.expired()) << "No shared_ptr owns this object"; return weak_this_.lock(); } shared_ptr shared_from_this() const { GOOGLE_CHECK(!weak_this_.expired()) << "No shared_ptr owns this object"; return weak_this_.lock(); } protected: enable_shared_from_this() { } enable_shared_from_this(const enable_shared_from_this& other) { } enable_shared_from_this& operator=(const enable_shared_from_this& other) { return *this; } ~enable_shared_from_this() { } private: weak_ptr weak_this_; }; // This is a helper function called by shared_ptr's constructor from a raw // pointer. If T inherits from enable_shared_from_this, it sets up // weak_this_ so that shared_from_this works correctly. If T does not inherit // from weak_this we get a different overload, defined inline, which does // nothing. template void shared_ptr::MaybeSetupWeakThis(enable_shared_from_this* ptr) { if (ptr) { GOOGLE_CHECK(ptr->weak_this_.expired()) << "Object already owned by a shared_ptr"; ptr->weak_this_ = *this; } } #endif // UTIL_GTL_USE_STD_SHARED_PTR } // internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_SHARED_PTR_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/singleton.h000066400000000000000000000047221334102242000306110ustar00rootroot00000000000000// 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_STUBS_SINGLETON_H__ #define GOOGLE_PROTOBUF_STUBS_SINGLETON_H__ #include #include #include namespace google { namespace protobuf { namespace internal { template class Singleton { public: static T* get() { GoogleOnceInit(&once_, &Singleton::Init); return instance_; } static void ShutDown() { delete instance_; instance_ = NULL; } private: static void Init() { instance_ = new T(); } static ProtobufOnceType once_; static T* instance_; }; template ProtobufOnceType Singleton::once_; template T* Singleton::instance_ = NULL; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_SINGLETON_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/status.cc000066400000000000000000000101211334102242000302560ustar00rootroot00000000000000// 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 #include #include #include #include namespace google { namespace protobuf { namespace util { namespace error { inline string CodeEnumToString(error::Code code) { switch (code) { case OK: return "OK"; case CANCELLED: return "CANCELLED"; case UNKNOWN: return "UNKNOWN"; case INVALID_ARGUMENT: return "INVALID_ARGUMENT"; case DEADLINE_EXCEEDED: return "DEADLINE_EXCEEDED"; case NOT_FOUND: return "NOT_FOUND"; case ALREADY_EXISTS: return "ALREADY_EXISTS"; case PERMISSION_DENIED: return "PERMISSION_DENIED"; case UNAUTHENTICATED: return "UNAUTHENTICATED"; case RESOURCE_EXHAUSTED: return "RESOURCE_EXHAUSTED"; case FAILED_PRECONDITION: return "FAILED_PRECONDITION"; case ABORTED: return "ABORTED"; case OUT_OF_RANGE: return "OUT_OF_RANGE"; case UNIMPLEMENTED: return "UNIMPLEMENTED"; case INTERNAL: return "INTERNAL"; case UNAVAILABLE: return "UNAVAILABLE"; case DATA_LOSS: return "DATA_LOSS"; } // No default clause, clang will abort if a code is missing from // above switch. return "UNKNOWN"; } } // namespace error. const Status Status::OK = Status(); const Status Status::CANCELLED = Status(error::CANCELLED, ""); const Status Status::UNKNOWN = Status(error::UNKNOWN, ""); Status::Status() : error_code_(error::OK) { } Status::Status(error::Code error_code, StringPiece error_message) : error_code_(error_code) { if (error_code != error::OK) { 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_; } string Status::ToString() const { if (error_code_ == error::OK) { return "OK"; } else { if (error_message_.empty()) { return error::CodeEnumToString(error_code_); } else { return error::CodeEnumToString(error_code_) + ":" + error_message_; } } } ostream& operator<<(ostream& os, const Status& x) { os << x.ToString(); return os; } } // namespace util } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/status.h000066400000000000000000000073061334102242000301330ustar00rootroot00000000000000// 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 #include #include #include namespace google { namespace protobuf { namespace util { namespace error { // These values must match error codes defined in google/rpc/code.proto. enum Code { OK = 0, CANCELLED = 1, UNKNOWN = 2, INVALID_ARGUMENT = 3, DEADLINE_EXCEEDED = 4, NOT_FOUND = 5, ALREADY_EXISTS = 6, PERMISSION_DENIED = 7, UNAUTHENTICATED = 16, RESOURCE_EXHAUSTED = 8, FAILED_PRECONDITION = 9, ABORTED = 10, OUT_OF_RANGE = 11, UNIMPLEMENTED = 12, INTERNAL = 13, UNAVAILABLE = 14, DATA_LOSS = 15, }; } // namespace error class LIBPROTOBUF_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::OK is // constructed. Status(error::Code error_code, StringPiece error_message); Status(const Status&); Status& operator=(const Status& x); ~Status() {} // Some pre-defined Status objects static const Status OK; // Identical to 0-arg constructor static const Status CANCELLED; static const Status UNKNOWN; // Accessor bool ok() const { return error_code_ == error::OK; } int error_code() const { return error_code_; } StringPiece error_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. string ToString() const; private: error::Code error_code_; string error_message_; }; // Prints a human-readable representation of 'x' to 'os'. LIBPROTOBUF_EXPORT ostream& operator<<(ostream& os, const Status& x); #define EXPECT_OK(value) EXPECT_TRUE((value).ok()) } // namespace util } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_STATUS_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/status_macros.h000066400000000000000000000070541334102242000314770ustar00rootroot00000000000000// 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. // From: util/task/contrib/status_macros/status_macros.h #ifndef GOOGLE_PROTOBUF_STUBS_STATUS_MACROS_H_ #define GOOGLE_PROTOBUF_STUBS_STATUS_MACROS_H_ #include #include #include namespace google { namespace protobuf { namespace util { // Run a command that returns a util::Status. If the called code returns an // error status, return that status up out of this method too. // // Example: // RETURN_IF_ERROR(DoThings(4)); #define RETURN_IF_ERROR(expr) \ do { \ /* Using _status below to avoid capture problems if expr is "status". */ \ const ::google::protobuf::util::Status _status = (expr); \ if (GOOGLE_PREDICT_FALSE(!_status.ok())) return _status; \ } while (0) // Internal helper for concatenating macro values. #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 Status DoAssignOrReturn(T& lhs, StatusOr result) { if (result.ok()) { lhs = result.ValueOrDie(); } return result.status(); } #define ASSIGN_OR_RETURN_IMPL(status, lhs, rexpr) \ Status status = DoAssignOrReturn(lhs, (rexpr)); \ if (GOOGLE_PREDICT_FALSE(!status.ok())) return status; // Executes an expression that returns a util::StatusOr, extracting its value // into the variable defined by lhs (or returning on error). // // Example: Assigning to an existing value // ValueType value; // ASSIGN_OR_RETURN(value, MaybeGetValue(arg)); // // 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( \ STATUS_MACROS_CONCAT_NAME(_status_or_value, __COUNTER__), lhs, rexpr); } // namespace util } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_STATUS_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/status_test.cc000066400000000000000000000106461334102242000313310ustar00rootroot00000000000000// 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 #include #include #include namespace google { namespace protobuf { namespace { TEST(Status, Empty) { util::Status status; EXPECT_EQ(util::error::OK, util::Status::OK.error_code()); EXPECT_EQ("OK", util::Status::OK.ToString()); } TEST(Status, GenericCodes) { EXPECT_EQ(util::error::OK, util::Status::OK.error_code()); EXPECT_EQ(util::error::CANCELLED, util::Status::CANCELLED.error_code()); EXPECT_EQ(util::error::UNKNOWN, util::Status::UNKNOWN.error_code()); } TEST(Status, ConstructorZero) { util::Status status(util::error::OK, "msg"); EXPECT_TRUE(status.ok()); 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::error::INVALID_ARGUMENT, ""); EXPECT_FALSE(status.ok()); EXPECT_EQ("", status.error_message().ToString()); EXPECT_EQ("INVALID_ARGUMENT", status.ToString()); status = util::Status(util::error::INVALID_ARGUMENT, "msg"); EXPECT_FALSE(status.ok()); EXPECT_EQ("msg", status.error_message().ToString()); EXPECT_EQ("INVALID_ARGUMENT:msg", status.ToString()); status = util::Status(util::error::OK, "msg"); EXPECT_TRUE(status.ok()); EXPECT_EQ("", status.error_message().ToString()); EXPECT_EQ("OK", status.ToString()); } TEST(Status, Copy) { util::Status a(util::error::UNKNOWN, "message"); util::Status b(a); ASSERT_EQ(a.ToString(), b.ToString()); } TEST(Status, Assign) { util::Status a(util::error::UNKNOWN, "message"); util::Status b; b = a; ASSERT_EQ(a.ToString(), b.ToString()); } TEST(Status, AssignEmpty) { util::Status a(util::error::UNKNOWN, "message"); util::Status b; a = b; ASSERT_EQ(string("OK"), a.ToString()); ASSERT_TRUE(b.ok()); ASSERT_TRUE(a.ok()); } TEST(Status, EqualsOK) { ASSERT_EQ(util::Status::OK, util::Status()); } TEST(Status, EqualsSame) { const util::Status a = util::Status(util::error::CANCELLED, "message"); const util::Status b = util::Status(util::error::CANCELLED, "message"); ASSERT_EQ(a, b); } TEST(Status, EqualsCopy) { const util::Status a = util::Status(util::error::CANCELLED, "message"); const util::Status b = a; ASSERT_EQ(a, b); } TEST(Status, EqualsDifferentCode) { const util::Status a = util::Status(util::error::CANCELLED, "message"); const util::Status b = util::Status(util::error::UNKNOWN, "message"); ASSERT_NE(a, b); } TEST(Status, EqualsDifferentMessage) { const util::Status a = util::Status(util::error::CANCELLED, "message"); const util::Status b = util::Status(util::error::CANCELLED, "another"); ASSERT_NE(a, b); } } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/statusor.cc000066400000000000000000000040041334102242000306220ustar00rootroot00000000000000// 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 namespace google { namespace protobuf { namespace util { namespace internal { void StatusOrHelper::Crash(const Status& status) { GOOGLE_LOG(FATAL) << "Attempting to fetch value instead of handling error " << status.ToString(); } } // namespace internal } // namespace util } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/statusor.h000066400000000000000000000201211334102242000304620ustar00rootroot00000000000000// 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 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 does not allow its Status // value to be Status::OK. Further, StatusOr does not allow the // contained pointer to be NULL. // // The primary use-case for StatusOr is as the return value of a // function which may fail. // // Example client usage for a StatusOr, where T is not a pointer: // // StatusOr result = DoBigCalculationThatCouldFail(); // if (result.ok()) { // float answer = result.ValueOrDie(); // printf("Big calculation yielded: %f", answer); // } else { // LOG(ERROR) << result.status(); // } // // Example client usage for a StatusOr: // // StatusOr result = FooFactory::MakeNewFoo(arg); // if (result.ok()) { // std::unique_ptr foo(result.ValueOrDie()); // foo->DoSomethingCool(); // } else { // LOG(ERROR) << result.status(); // } // // Example client usage for a StatusOr>: // // StatusOr> result = FooFactory::MakeNewFoo(arg); // if (result.ok()) { // std::unique_ptr foo = result.ConsumeValueOrDie(); // foo->DoSomethingCool(); // } else { // LOG(ERROR) << result.status(); // } // // Example factory implementation returning StatusOr: // // StatusOr FooFactory::MakeNewFoo(int arg) { // if (arg <= 0) { // return ::util::Status(::util::error::INVALID_ARGUMENT, // "Arg must be positive"); // } else { // return new Foo(arg); // } // } // #ifndef GOOGLE_PROTOBUF_STUBS_STATUSOR_H_ #define GOOGLE_PROTOBUF_STUBS_STATUSOR_H_ #include #include #include #include namespace google { namespace protobuf { namespace util { template class StatusOr { template friend class StatusOr; public: // Construct a new StatusOr with Status::UNKNOWN status StatusOr(); // Construct a new StatusOr with the given non-ok status. After calling // this constructor, calls to ValueOrDie() will CHECK-fail. // // NOTE: Not explicit - we want to use StatusOr as a return // value, so it is convenient and sensible to be able to do 'return // Status()' when the return type is StatusOr. // // REQUIRES: status != Status::OK. This requirement is DCHECKed. // In optimized builds, passing Status::OK 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 NULL. After calling this constructor, calls to // ValueOrDie() will succeed, and calls to status() will return OK. // // NOTE: Not explicit - we want to use StatusOr as a return type // so it is convenient and sensible to be able to do 'return T()' // when when the return type is StatusOr. // // REQUIRES: if T is a plain pointer, value != NULL. 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 StatusOr(const StatusOr& other); // Assignment operator. StatusOr& operator=(const StatusOr& other); // Conversion assignment operator, T must be assignable from U template StatusOr& operator=(const StatusOr& other); // Returns a reference to our status. If this contains a T, then // returns Status::OK. const Status& status() const; // Returns this->status().ok() bool ok() const; // Returns a reference to our current value, or CHECK-fails if !this->ok(). // If you need to initialize a T object from the stored value, // ConsumeValueOrDie() may be more efficient. const T& ValueOrDie() const; private: Status status_; T value_; }; //////////////////////////////////////////////////////////////////////////////// // Implementation details for StatusOr namespace internal { class LIBPROTOBUF_EXPORT StatusOrHelper { public: // Move type-agnostic error handling to the .cc. static void Crash(const util::Status& status); // Customized behavior for StatusOr vs. StatusOr template struct Specialize; }; template struct StatusOrHelper::Specialize { // For non-pointer T, a reference can never be NULL. static inline bool IsValueNull(const T& t) { return false; } }; template struct StatusOrHelper::Specialize { static inline bool IsValueNull(const T* t) { return t == NULL; } }; } // namespace internal template inline StatusOr::StatusOr() : status_(util::Status::UNKNOWN) { } template inline StatusOr::StatusOr(const Status& status) { if (status.ok()) { status_ = Status(error::INTERNAL, "Status::OK is not a valid argument."); } else { status_ = status; } } template inline StatusOr::StatusOr(const T& value) { if (internal::StatusOrHelper::Specialize::IsValueNull(value)) { status_ = Status(error::INTERNAL, "NULL is not a vaild argument."); } else { status_ = Status::OK; value_ = value; } } template inline StatusOr::StatusOr(const StatusOr& other) : status_(other.status_), value_(other.value_) { } template inline StatusOr& StatusOr::operator=(const StatusOr& other) { status_ = other.status_; value_ = other.value_; return *this; } template template inline StatusOr::StatusOr(const StatusOr& other) : status_(other.status_), value_(other.status_.ok() ? other.value_ : T()) { } template template inline StatusOr& StatusOr::operator=(const StatusOr& other) { status_ = other.status_; if (status_.ok()) value_ = other.value_; return *this; } template inline const Status& StatusOr::status() const { return status_; } template inline bool StatusOr::ok() const { return status().ok(); } template inline const T& StatusOr::ValueOrDie() const { if (!status_.ok()) { internal::StatusOrHelper::Crash(status_); } return value_; } } // namespace util } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_STATUSOR_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/statusor_test.cc000066400000000000000000000172151334102242000316710ustar00rootroot00000000000000// 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 #include #include #include #include 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 thing; EXPECT_FALSE(thing.ok()); EXPECT_EQ(Status::UNKNOWN, thing.status()); } TEST(StatusOr, TestStatusCtor) { StatusOr thing(Status::CANCELLED); EXPECT_FALSE(thing.ok()); EXPECT_EQ(Status::CANCELLED, thing.status()); } TEST(StatusOr, TestValueCtor) { const int kI = 4; StatusOr thing(kI); EXPECT_TRUE(thing.ok()); EXPECT_EQ(kI, thing.ValueOrDie()); } TEST(StatusOr, TestCopyCtorStatusOk) { const int kI = 4; StatusOr original(kI); StatusOr copy(original); EXPECT_EQ(original.status(), copy.status()); EXPECT_EQ(original.ValueOrDie(), copy.ValueOrDie()); } TEST(StatusOr, TestCopyCtorStatusNotOk) { StatusOr original(Status::CANCELLED); StatusOr copy(original); EXPECT_EQ(original.status(), copy.status()); } TEST(StatusOr, TestCopyCtorStatusOKConverting) { const int kI = 4; StatusOr original(kI); StatusOr copy(original); EXPECT_EQ(original.status(), copy.status()); EXPECT_EQ(original.ValueOrDie(), copy.ValueOrDie()); } TEST(StatusOr, TestCopyCtorStatusNotOkConverting) { StatusOr original(Status::CANCELLED); StatusOr copy(original); EXPECT_EQ(original.status(), copy.status()); } TEST(StatusOr, TestAssignmentStatusOk) { const int kI = 4; StatusOr source(kI); StatusOr target; target = source; EXPECT_EQ(source.status(), target.status()); EXPECT_EQ(source.ValueOrDie(), target.ValueOrDie()); } TEST(StatusOr, TestAssignmentStatusNotOk) { StatusOr source(Status::CANCELLED); StatusOr target; target = source; EXPECT_EQ(source.status(), target.status()); } TEST(StatusOr, TestAssignmentStatusOKConverting) { const int kI = 4; StatusOr source(kI); StatusOr target; target = source; EXPECT_EQ(source.status(), target.status()); EXPECT_DOUBLE_EQ(source.ValueOrDie(), target.ValueOrDie()); } TEST(StatusOr, TestAssignmentStatusNotOkConverting) { StatusOr source(Status::CANCELLED); StatusOr target; target = source; EXPECT_EQ(source.status(), target.status()); } TEST(StatusOr, TestStatus) { StatusOr good(4); EXPECT_TRUE(good.ok()); StatusOr bad(Status::CANCELLED); EXPECT_FALSE(bad.ok()); EXPECT_EQ(Status::CANCELLED, bad.status()); } TEST(StatusOr, TestValue) { const int kI = 4; StatusOr thing(kI); EXPECT_EQ(kI, thing.ValueOrDie()); } TEST(StatusOr, TestValueConst) { const int kI = 4; const StatusOr thing(kI); EXPECT_EQ(kI, thing.ValueOrDie()); } TEST(StatusOr, TestPointerDefaultCtor) { StatusOr thing; EXPECT_FALSE(thing.ok()); EXPECT_EQ(Status::UNKNOWN, thing.status()); } TEST(StatusOr, TestPointerStatusCtor) { StatusOr thing(Status::CANCELLED); EXPECT_FALSE(thing.ok()); EXPECT_EQ(Status::CANCELLED, thing.status()); } TEST(StatusOr, TestPointerValueCtor) { const int kI = 4; StatusOr thing(&kI); EXPECT_TRUE(thing.ok()); EXPECT_EQ(&kI, thing.ValueOrDie()); } TEST(StatusOr, TestPointerCopyCtorStatusOk) { const int kI = 0; StatusOr original(&kI); StatusOr copy(original); EXPECT_EQ(original.status(), copy.status()); EXPECT_EQ(original.ValueOrDie(), copy.ValueOrDie()); } TEST(StatusOr, TestPointerCopyCtorStatusNotOk) { StatusOr original(Status::CANCELLED); StatusOr copy(original); EXPECT_EQ(original.status(), copy.status()); } TEST(StatusOr, TestPointerCopyCtorStatusOKConverting) { Derived derived; StatusOr original(&derived); StatusOr copy(original); EXPECT_EQ(original.status(), copy.status()); EXPECT_EQ(static_cast(original.ValueOrDie()), copy.ValueOrDie()); } TEST(StatusOr, TestPointerCopyCtorStatusNotOkConverting) { StatusOr original(Status::CANCELLED); StatusOr copy(original); EXPECT_EQ(original.status(), copy.status()); } TEST(StatusOr, TestPointerAssignmentStatusOk) { const int kI = 0; StatusOr source(&kI); StatusOr target; target = source; EXPECT_EQ(source.status(), target.status()); EXPECT_EQ(source.ValueOrDie(), target.ValueOrDie()); } TEST(StatusOr, TestPointerAssignmentStatusNotOk) { StatusOr source(Status::CANCELLED); StatusOr target; target = source; EXPECT_EQ(source.status(), target.status()); } TEST(StatusOr, TestPointerAssignmentStatusOKConverting) { Derived derived; StatusOr source(&derived); StatusOr target; target = source; EXPECT_EQ(source.status(), target.status()); EXPECT_EQ(static_cast(source.ValueOrDie()), target.ValueOrDie()); } TEST(StatusOr, TestPointerAssignmentStatusNotOkConverting) { StatusOr source(Status::CANCELLED); StatusOr target; target = source; EXPECT_EQ(source.status(), target.status()); } TEST(StatusOr, TestPointerStatus) { const int kI = 0; StatusOr good(&kI); EXPECT_TRUE(good.ok()); StatusOr bad(Status::CANCELLED); EXPECT_EQ(Status::CANCELLED, bad.status()); } TEST(StatusOr, TestPointerValue) { const int kI = 0; StatusOr thing(&kI); EXPECT_EQ(&kI, thing.ValueOrDie()); } TEST(StatusOr, TestPointerValueConst) { const int kI = 0; const StatusOr thing(&kI); EXPECT_EQ(&kI, thing.ValueOrDie()); } } // namespace } // namespace util } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/stl_util.h000066400000000000000000000121061334102242000304410ustar00rootroot00000000000000// 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. // from google3/util/gtl/stl_util.h #ifndef GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__ #define GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__ #include namespace google { namespace protobuf { // STLDeleteContainerPointers() // For a range within a container of pointers, calls delete // (non-array version) on these pointers. // NOTE: for these three functions, we could just implement a DeleteObject // functor and then call for_each() on the range and functor, but this // requires us to pull in all of algorithm.h, which seems expensive. // For hash_[multi]set, it is important that this deletes behind the iterator // because the hash_set may call the hash function on the iterator when it is // advanced, which could result in the hash function trying to deference a // stale pointer. template void STLDeleteContainerPointers(ForwardIterator begin, ForwardIterator end) { while (begin != end) { ForwardIterator temp = begin; ++begin; delete *temp; } } // 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(string* s, size_t new_size) { s->resize(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. // // string_as_array(&str)[i] is valid for 0 <= i < str.size() until the // next call to a string method that invalidates iterators. // // As of 2006-04, there is no standard-blessed way of getting a // mutable reference to a string's internal buffer. However, issue 530 // (http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#530) // proposes this as the method. According to Matt Austern, this should // already work on all current implementations. inline char* string_as_array(string* str) { // DO NOT USE const_cast(str->data())! See the unittest for why. return str->empty() ? NULL : &*str->begin(); } // STLDeleteElements() deletes all the elements in an STL container and clears // the container. This function is suitable for use with a vector, set, // hash_set, or any other STL container which defines sensible begin(), end(), // and clear() methods. // // If container is NULL, this function is a no-op. // // As an alternative to calling STLDeleteElements() directly, consider // ElementDeleter (defined below), which ensures that your container's elements // are deleted when the ElementDeleter goes out of scope. template void STLDeleteElements(T *container) { if (!container) return; STLDeleteContainerPointers(container->begin(), container->end()); container->clear(); } // Given an STL container consisting of (key, value) pairs, STLDeleteValues // deletes all the "value" components and clears the container. Does nothing // in the case it's given a NULL pointer. template void STLDeleteValues(T *v) { if (!v) return; for (typename T::iterator i = v->begin(); i != v->end(); ++i) { delete i->second; } v->clear(); } } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_STL_UTIL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/stringpiece.cc000066400000000000000000000216601334102242000312610ustar00rootroot00000000000000// 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 #include #include #include #include #include namespace google { namespace protobuf { std::ostream& operator<<(std::ostream& o, StringPiece piece) { o.write(piece.data(), piece.size()); return o; } // Out-of-line error path. void StringPiece::LogFatalSizeTooBig(size_t size, const char* details) { GOOGLE_LOG(FATAL) << "size too big: " << size << " details: " << details; } StringPiece::StringPiece(StringPiece x, stringpiece_ssize_type pos) : ptr_(x.ptr_ + pos), length_(x.length_ - pos) { GOOGLE_DCHECK_LE(0, pos); GOOGLE_DCHECK_LE(pos, x.length_); } StringPiece::StringPiece(StringPiece x, stringpiece_ssize_type pos, stringpiece_ssize_type len) : ptr_(x.ptr_ + pos), length_(std::min(len, x.length_ - pos)) { GOOGLE_DCHECK_LE(0, pos); GOOGLE_DCHECK_LE(pos, x.length_); GOOGLE_DCHECK_GE(len, 0); } void StringPiece::CopyToString(string* target) const { target->assign(ptr_, length_); } void StringPiece::AppendToString(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_ssize_type StringPiece::copy(char* buf, size_type n, size_type pos) const { stringpiece_ssize_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_ssize_type StringPiece::find(StringPiece s, size_type pos) const { if (length_ <= 0 || pos > static_cast(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_ssize_type StringPiece::find(char c, size_type pos) const { if (length_ <= 0 || pos >= static_cast(length_)) { return npos; } const char* result = static_cast( memchr(ptr_ + pos, c, length_ - pos)); return result != NULL ? result - ptr_ : npos; } stringpiece_ssize_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_ssize_type StringPiece::rfind(char c, size_type pos) const { // Note: memrchr() is not available on Windows. if (length_ <= 0) return npos; for (stringpiece_ssize_type i = std::min(pos, static_cast(length_ - 1)); i >= 0; --i) { if (ptr_[i] == c) { return i; } } 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_ssize_type length = characters_wanted.length(); const char* const data = characters_wanted.data(); for (stringpiece_ssize_type i = 0; i < length; ++i) { table[static_cast(data[i])] = true; } } stringpiece_ssize_type StringPiece::find_first_of(StringPiece s, size_type pos) const { if (length_ <= 0 || s.length_ <= 0) { 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 (stringpiece_ssize_type i = pos; i < length_; ++i) { if (lookup[static_cast(ptr_[i])]) { return i; } } return npos; } stringpiece_ssize_type StringPiece::find_first_not_of(StringPiece s, size_type pos) const { if (length_ <= 0) return npos; if (s.length_ <= 0) 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 (stringpiece_ssize_type i = pos; i < length_; ++i) { if (!lookup[static_cast(ptr_[i])]) { return i; } } return npos; } stringpiece_ssize_type StringPiece::find_first_not_of(char c, size_type pos) const { if (length_ <= 0) return npos; for (; pos < static_cast(length_); ++pos) { if (ptr_[pos] != c) { return pos; } } return npos; } stringpiece_ssize_type StringPiece::find_last_of(StringPiece s, size_type pos) const { if (length_ <= 0 || s.length_ <= 0) 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 (stringpiece_ssize_type i = std::min(pos, static_cast(length_ - 1)); i >= 0; --i) { if (lookup[static_cast(ptr_[i])]) { return i; } } return npos; } stringpiece_ssize_type StringPiece::find_last_not_of(StringPiece s, size_type pos) const { if (length_ <= 0) return npos; stringpiece_ssize_type i = std::min(pos, static_cast(length_ - 1)); if (s.length_ <= 0) 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 >= 0; --i) { if (!lookup[static_cast(ptr_[i])]) { return i; } } return npos; } stringpiece_ssize_type StringPiece::find_last_not_of(char c, size_type pos) const { if (length_ <= 0) return npos; for (stringpiece_ssize_type i = std::min(pos, static_cast(length_ - 1)); i >= 0; --i) { if (ptr_[i] != c) { return i; } } 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 protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/stringpiece.h000066400000000000000000000423751334102242000311310ustar00rootroot00000000000000// 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 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(NULL) // StringPiece(NULL, 0) // For all of the above, sp.data() == NULL, sp.length() == 0, // and sp.empty() == true. Also, if you create a StringPiece with // a non-NULL pointer then sp.data() != NULL. Once created, // sp.data() will stay either NULL or not-NULL, except if you call // sp.clear() or sp.set(). // // Thus, you can use StringPiece(NULL) to signal an out-of-band value // that is different from other StringPiece values. This is similar // to the way that const char* p1 = NULL; is different from // const char* p2 = "";. // // There are many ways to create an empty StringPiece: // StringPiece() // StringPiece(NULL) // StringPiece(NULL, 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 NULL. // For some empty StringPiece values, sp.data() will not be NULL. // // 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(NULL) == StringPiece("abc", 0) // StringPiece(NULL, 0) == StringPiece("abcdef"+6, 0) // // Look carefully at this example: // StringPiece("") == NULL // True or false? TRUE, because StringPiece::operator== converts // the right-hand side from NULL to StringPiece(NULL), // 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 == NULL; } // BAD // Do not do that. Write one of these instead: // bool TestNull(StringPiece sp) { return sp.data() == NULL; } // 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 #include #include #include #include #include #include #include namespace google { namespace protobuf { // StringPiece has *two* size types. // StringPiece::size_type // is unsigned // is 32 bits in LP32, 64 bits in LP64, 64 bits in LLP64 // no future changes intended // stringpiece_ssize_type // is signed // is 32 bits in LP32, 64 bits in LP64, 64 bits in LLP64 // future changes intended: http://go/64BitStringPiece // typedef string::difference_type stringpiece_ssize_type; // STRINGPIECE_CHECK_SIZE protects us from 32-bit overflows. // TODO(mec): delete this after stringpiece_ssize_type goes 64 bit. #if !defined(NDEBUG) #define STRINGPIECE_CHECK_SIZE 1 #elif defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 #define STRINGPIECE_CHECK_SIZE 1 #else #define STRINGPIECE_CHECK_SIZE 0 #endif class LIBPROTOBUF_EXPORT StringPiece { private: const char* ptr_; stringpiece_ssize_type length_; // Prevent overflow in debug mode or fortified mode. // sizeof(stringpiece_ssize_type) may be smaller than sizeof(size_t). static stringpiece_ssize_type CheckedSsizeTFromSizeT(size_t size) { #if STRINGPIECE_CHECK_SIZE > 0 #ifdef max #undef max #endif if (size > static_cast( std::numeric_limits::max())) { // Some people grep for this message in logs // so take care if you ever change it. LogFatalSizeTooBig(size, "size_t to int conversion"); } #endif return static_cast(size); } // Out-of-line error path. static void LogFatalSizeTooBig(size_t 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_(NULL), length_(0) {} StringPiece(const char* str) // NOLINT(runtime/explicit) : ptr_(str), length_(0) { if (str != NULL) { length_ = CheckedSsizeTFromSizeT(strlen(str)); } } template StringPiece( // NOLINT(runtime/explicit) const std::basic_string, Allocator>& str) : ptr_(str.data()), length_(0) { length_ = CheckedSsizeTFromSizeT(str.size()); } StringPiece(const char* offset, stringpiece_ssize_type len) : ptr_(offset), length_(len) { assert(len >= 0); } // Substring of another StringPiece. // pos must be non-negative and <= x.length(). StringPiece(StringPiece x, stringpiece_ssize_type pos); // Substring of another StringPiece. // pos must be non-negative and <= x.length(). // len must be non-negative and will be pinned to at most x.length() - pos. StringPiece(StringPiece x, stringpiece_ssize_type pos, stringpiece_ssize_type 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 char* data() const { return ptr_; } stringpiece_ssize_type size() const { return length_; } stringpiece_ssize_type length() const { return length_; } bool empty() const { return length_ == 0; } void clear() { ptr_ = NULL; length_ = 0; } void set(const char* data, stringpiece_ssize_type len) { assert(len >= 0); ptr_ = data; length_ = len; } void set(const char* str) { ptr_ = str; if (str != NULL) length_ = CheckedSsizeTFromSizeT(strlen(str)); else length_ = 0; } void set(const void* data, stringpiece_ssize_type len) { ptr_ = reinterpret_cast(data); length_ = len; } char operator[](stringpiece_ssize_type i) const { assert(0 <= i); assert(i < length_); return ptr_[i]; } void remove_prefix(stringpiece_ssize_type n) { assert(length_ >= n); ptr_ += n; length_ -= n; } void remove_suffix(stringpiece_ssize_type n) { assert(length_ >= n); length_ -= n; } // returns {-1, 0, 1} int compare(StringPiece x) const { const stringpiece_ssize_type min_size = length_ < x.length_ ? length_ : x.length_; int r = memcmp(ptr_, x.ptr_, static_cast(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; } 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. string ToString() const { if (ptr_ == NULL) return string(); return string(data(), static_cast(size())); } operator string() const { return ToString(); } void CopyToString(string* target) const; void AppendToString(string* target) const; bool starts_with(StringPiece x) const { return (length_ >= x.length_) && (memcmp(ptr_, x.ptr_, static_cast(x.length_)) == 0); } bool ends_with(StringPiece x) const { return ((length_ >= x.length_) && (memcmp(ptr_ + (length_-x.length_), x.ptr_, static_cast(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 typedef char value_type; typedef const char* pointer; typedef const char& reference; typedef const char& const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; static const size_type npos; typedef const char* const_iterator; typedef const char* iterator; typedef std::reverse_iterator const_reverse_iterator; typedef std::reverse_iterator reverse_iterator; iterator begin() const { return ptr_; } 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_); } stringpiece_ssize_type max_size() const { return length_; } stringpiece_ssize_type capacity() const { return length_; } // cpplint.py emits a false positive [build/include_what_you_use] stringpiece_ssize_type copy(char* buf, size_type n, size_type pos = 0) const; // NOLINT bool contains(StringPiece s) const; stringpiece_ssize_type find(StringPiece s, size_type pos = 0) const; stringpiece_ssize_type find(char c, size_type pos = 0) const; stringpiece_ssize_type rfind(StringPiece s, size_type pos = npos) const; stringpiece_ssize_type rfind(char c, size_type pos = npos) const; stringpiece_ssize_type find_first_of(StringPiece s, size_type pos = 0) const; stringpiece_ssize_type find_first_of(char c, size_type pos = 0) const { return find(c, pos); } stringpiece_ssize_type find_first_not_of(StringPiece s, size_type pos = 0) const; stringpiece_ssize_type find_first_not_of(char c, size_type pos = 0) const; stringpiece_ssize_type find_last_of(StringPiece s, size_type pos = npos) const; stringpiece_ssize_type find_last_of(char c, size_type pos = npos) const { return rfind(c, pos); } stringpiece_ssize_type find_last_not_of(StringPiece s, size_type pos = npos) const; stringpiece_ssize_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_ssize_type len = x.size(); if (len != y.size()) { return false; } return x.data() == y.data() || len <= 0 || memcmp(x.data(), y.data(), static_cast(len)) == 0; } inline bool operator!=(StringPiece x, StringPiece y) { return !(x == y); } inline bool operator<(StringPiece x, StringPiece y) { const stringpiece_ssize_type min_size = x.size() < y.size() ? x.size() : y.size(); const int r = memcmp(x.data(), y.data(), static_cast(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 internal { // StringPiece is not a POD and can not be used in an union (pre C++11). We // need a POD version of it. struct StringPiecePod { // Create from a StringPiece. static StringPiecePod CreateFromStringPiece(StringPiece str) { StringPiecePod pod; pod.data_ = str.data(); pod.size_ = str.size(); return pod; } // Cast to StringPiece. operator StringPiece() const { return StringPiece(data_, size_); } bool operator==(const char* value) const { return StringPiece(data_, size_) == StringPiece(value); } char operator[](stringpiece_ssize_type i) const { assert(0 <= i); assert(i < size_); return data_[i]; } const char* data() const { return data_; } stringpiece_ssize_type size() const { return size_; } std::string ToString() const { return std::string(data_, static_cast(size_)); } private: const char* data_; stringpiece_ssize_type size_; }; } // namespace internal } // namespace protobuf } // namespace google GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_START template<> struct hash { 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(*str); } return result; } }; GOOGLE_PROTOBUF_HASH_NAMESPACE_DECLARATION_END #endif // STRINGS_STRINGPIECE_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/stringpiece_unittest.cc000066400000000000000000000611201334102242000332130ustar00rootroot00000000000000// 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 #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace { TEST(StringPiece, Ctor) { { // Null. StringPiece s10; EXPECT_TRUE(s10.data() == NULL); 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 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) { string s1("foo"); string s2("bar"); string s3("baz"); StringPiece p1(s1); StringPiece p2(s2); StringPiece p3(s3); typedef std::map 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, ==, "", NULL); COMPARE(true, ==, NULL, ""); 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"); string x; for (int i = 0; i < 256; i++) { x += 'a'; string y = x; COMPARE(true, ==, x, y); for (int j = 0; j < i; j++) { 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; 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() == NULL); 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"); StringPiece d("foobar"); const StringPiece e; const StringPiece f("123" "\0" "456", 7); d.clear(); EXPECT_EQ(d.size(), 0); EXPECT_TRUE(d.empty()); EXPECT_TRUE(d.data() == NULL); EXPECT_TRUE(d.begin() == d.end()); EXPECT_EQ(StringPiece::npos, 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(d), 0); EXPECT_EQ(a.find(e), 0); EXPECT_EQ(a.find(d, 12), 12); 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(d.find(b), StringPiece::npos); EXPECT_EQ(e.find(b), StringPiece::npos); EXPECT_EQ(d.find(b, 4), StringPiece::npos); EXPECT_EQ(e.find(b, 7), StringPiece::npos); size_t empty_search_pos = string().find(string()); EXPECT_EQ(d.find(d), empty_search_pos); EXPECT_EQ(d.find(e), empty_search_pos); EXPECT_EQ(e.find(d), empty_search_pos); EXPECT_EQ(e.find(e), empty_search_pos); EXPECT_EQ(d.find(d, 4), string().find(string(), 4)); EXPECT_EQ(d.find(e, 4), string().find(string(), 4)); EXPECT_EQ(e.find(d, 4), string().find(string(), 4)); EXPECT_EQ(e.find(e, 4), string().find(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(d.find('\0'), StringPiece::npos); EXPECT_EQ(e.find('\0'), StringPiece::npos); EXPECT_EQ(d.find('\0', 4), StringPiece::npos); EXPECT_EQ(e.find('\0', 7), StringPiece::npos); EXPECT_EQ(d.find('x'), StringPiece::npos); EXPECT_EQ(e.find('x'), StringPiece::npos); EXPECT_EQ(d.find('x', 4), 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(d), a.as_string().rfind(string())); EXPECT_EQ(a.rfind(e), a.as_string().rfind(string())); EXPECT_EQ(a.rfind(d, 12), 12); EXPECT_EQ(a.rfind(e, 17), 17); EXPECT_EQ(a.rfind(g), StringPiece::npos); EXPECT_EQ(d.rfind(b), StringPiece::npos); EXPECT_EQ(e.rfind(b), StringPiece::npos); EXPECT_EQ(d.rfind(b, 4), StringPiece::npos); EXPECT_EQ(e.rfind(b, 7), StringPiece::npos); // empty string nonsense EXPECT_EQ(d.rfind(d, 4), string().rfind(string())); EXPECT_EQ(e.rfind(d, 7), string().rfind(string())); EXPECT_EQ(d.rfind(e, 4), string().rfind(string())); EXPECT_EQ(e.rfind(e, 7), string().rfind(string())); EXPECT_EQ(d.rfind(d), string().rfind(string())); EXPECT_EQ(e.rfind(d), string().rfind(string())); EXPECT_EQ(d.rfind(e), string().rfind(string())); EXPECT_EQ(e.rfind(e), string().rfind(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(d.rfind('o'), StringPiece::npos); EXPECT_EQ(e.rfind('o'), StringPiece::npos); EXPECT_EQ(d.rfind('o', 4), 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(d), StringPiece::npos); EXPECT_EQ(a.find_first_of(e), StringPiece::npos); EXPECT_EQ(d.find_first_of(b), StringPiece::npos); EXPECT_EQ(e.find_first_of(b), StringPiece::npos); EXPECT_EQ(d.find_first_of(d), StringPiece::npos); EXPECT_EQ(e.find_first_of(d), StringPiece::npos); EXPECT_EQ(d.find_first_of(e), 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(d), 0); EXPECT_EQ(a.find_first_not_of(e), 0); // empty string nonsense EXPECT_EQ(d.find_first_not_of(a), StringPiece::npos); EXPECT_EQ(e.find_first_not_of(a), StringPiece::npos); EXPECT_EQ(d.find_first_not_of(d), StringPiece::npos); EXPECT_EQ(e.find_first_not_of(d), StringPiece::npos); EXPECT_EQ(d.find_first_not_of(e), 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(d.find_first_not_of('x'), StringPiece::npos); EXPECT_EQ(e.find_first_not_of('x'), StringPiece::npos); EXPECT_EQ(d.find_first_not_of('\0'), 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(d), StringPiece::npos); EXPECT_EQ(f.find_last_of(e), StringPiece::npos); EXPECT_EQ(f.find_last_of(d, 4), StringPiece::npos); EXPECT_EQ(f.find_last_of(e, 4), StringPiece::npos); EXPECT_EQ(d.find_last_of(d), StringPiece::npos); EXPECT_EQ(d.find_last_of(e), StringPiece::npos); EXPECT_EQ(e.find_last_of(d), StringPiece::npos); EXPECT_EQ(e.find_last_of(e), StringPiece::npos); EXPECT_EQ(d.find_last_of(f), StringPiece::npos); EXPECT_EQ(e.find_last_of(f), StringPiece::npos); EXPECT_EQ(d.find_last_of(d, 4), StringPiece::npos); EXPECT_EQ(d.find_last_of(e, 4), StringPiece::npos); EXPECT_EQ(e.find_last_of(d, 4), StringPiece::npos); EXPECT_EQ(e.find_last_of(e, 4), StringPiece::npos); EXPECT_EQ(d.find_last_of(f, 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(d), f.size()-1); EXPECT_EQ(f.find_last_not_of(e), f.size()-1); EXPECT_EQ(f.find_last_not_of(d, 4), 4); EXPECT_EQ(f.find_last_not_of(e, 4), 4); EXPECT_EQ(d.find_last_not_of(d), StringPiece::npos); EXPECT_EQ(d.find_last_not_of(e), StringPiece::npos); EXPECT_EQ(e.find_last_not_of(d), StringPiece::npos); EXPECT_EQ(e.find_last_not_of(e), StringPiece::npos); EXPECT_EQ(d.find_last_not_of(f), StringPiece::npos); EXPECT_EQ(e.find_last_not_of(f), StringPiece::npos); EXPECT_EQ(d.find_last_not_of(d, 4), StringPiece::npos); EXPECT_EQ(d.find_last_not_of(e, 4), StringPiece::npos); EXPECT_EQ(e.find_last_not_of(d, 4), StringPiece::npos); EXPECT_EQ(e.find_last_not_of(e, 4), StringPiece::npos); EXPECT_EQ(d.find_last_not_of(f, 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(d.find_last_not_of('x'), StringPiece::npos); EXPECT_EQ(e.find_last_not_of('x'), StringPiece::npos); EXPECT_EQ(d.find_last_not_of('\0'), 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(d.substr(99), e); EXPECT_EQ(d.substr(0, 99), e); EXPECT_EQ(d.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); // Substring constructors. EXPECT_EQ(StringPiece(a, 0, 3), b); EXPECT_EQ(StringPiece(a, 23), c); EXPECT_EQ(StringPiece(a, 23, 3), c); EXPECT_EQ(StringPiece(a, 23, 99), c); EXPECT_EQ(StringPiece(a, 0), a); EXPECT_EQ(StringPiece(a, 3, 2), "de"); // empty string nonsense EXPECT_EQ(StringPiece(d, 0, 99), e); // Verify that they work taking an actual string, not just a StringPiece. string a2 = a.as_string(); EXPECT_EQ(StringPiece(a2, 0, 3), b); EXPECT_EQ(StringPiece(a2, 23), c); EXPECT_EQ(StringPiece(a2, 23, 3), c); EXPECT_EQ(StringPiece(a2, 23, 99), c); EXPECT_EQ(StringPiece(a2, 0), a); EXPECT_EQ(StringPiece(a2, 3, 2), "de"); } TEST(StringPiece, Custom) { StringPiece a("foobar"); string s1("123"); s1 += '\0'; s1 += "456"; StringPiece b(s1); StringPiece e; 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); // set c.set("foobar", 6); EXPECT_EQ(c, a); c.set("foobar", 0); EXPECT_EQ(c, e); c.set("foobar", 7); EXPECT_NE(c, a); c.set("foobar"); EXPECT_EQ(c, a); c.set(static_cast("foobar"), 6); EXPECT_EQ(c, a); c.set(static_cast("foobar"), 0); EXPECT_EQ(c, e); c.set(static_cast("foobar"), 7); EXPECT_NE(c, a); // as_string string s3(a.as_string().c_str(), 7); EXPECT_EQ(c, s3); string s4(e.as_string()); EXPECT_TRUE(s4.empty()); // ToString { string s5(a.ToString().c_str(), 7); EXPECT_EQ(c, s5); string s6(e.ToString()); EXPECT_TRUE(s6.empty()); } // Consume a.set("foobar"); EXPECT_TRUE(a.Consume("foo")); EXPECT_EQ(a, "bar"); EXPECT_FALSE(a.Consume("foo")); EXPECT_FALSE(a.Consume("barbar")); EXPECT_FALSE(a.Consume("ar")); EXPECT_EQ(a, "bar"); a.set("foobar"); EXPECT_TRUE(a.ConsumeFromEnd("bar")); EXPECT_EQ(a, "foo"); EXPECT_FALSE(a.ConsumeFromEnd("bar")); EXPECT_FALSE(a.ConsumeFromEnd("foofoo")); EXPECT_FALSE(a.ConsumeFromEnd("fo")); EXPECT_EQ(a, "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(NULL); EXPECT_EQ(s.data(), (const char*)NULL); EXPECT_EQ(s.size(), 0); s.set(NULL); EXPECT_EQ(s.data(), (const char*)NULL); EXPECT_EQ(s.size(), 0); // .ToString() on a StringPiece with NULL 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", string("hello")); EXPECT_LT("hello", string("world")); } TEST(ComparisonOpsTest, HeterogenousStringPieceEquals) { EXPECT_EQ(StringPiece("hello"), 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), "len >= 0"); } #endif // ndef DEBUG #endif // PROTOBUF_HAS_DEATH_TEST } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/stringprintf.cc000066400000000000000000000140211334102242000314670ustar00rootroot00000000000000// 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 #include #include // For va_list and related operations #include // MSVC requires this for _vsnprintf #include #include namespace google { namespace protobuf { #ifdef _MSC_VER enum { IS_COMPILER_MSVC = 1 }; #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 #else enum { IS_COMPILER_MSVC = 0 }; #endif void StringAppendV(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; } if (IS_COMPILER_MSVC) { // 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(NULL, 0, format, backup_ap); va_end(backup_ap); } 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; } string StringPrintf(const char* format, ...) { va_list ap; va_start(ap, format); string result; StringAppendV(&result, format, ap); va_end(ap); return result; } const string& SStringPrintf(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(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' }; string StringPrintfVector(const char* format, const vector& 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. GOOGLE_COMPILE_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 python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/stringprintf.h000066400000000000000000000063541334102242000313430ustar00rootroot00000000000000// 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 #include #include #include namespace google { namespace protobuf { // Return a C++ string LIBPROTOBUF_EXPORT extern string StringPrintf(const char* format, ...); // Store result into a supplied string and return it LIBPROTOBUF_EXPORT extern const string& SStringPrintf(string* dst, const char* format, ...); // Append result to a supplied string LIBPROTOBUF_EXPORT extern void StringAppendF(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. LIBPROTOBUF_EXPORT extern void StringAppendV(string* dst, const char* format, va_list ap); // The max arguments supported by StringPrintfVector LIBPROTOBUF_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 LIBPROTOBUF_EXPORT extern string StringPrintfVector(const char* format, const vector& v); } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_STRINGPRINTF_H python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/stringprintf_unittest.cc000066400000000000000000000122001334102242000334230ustar00rootroot00000000000000// 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 #include #include #include #include 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", 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) { string value("Hello"); const char* empty = ""; StringAppendF(&value, "%s", empty); EXPECT_EQ("Hello", value); } TEST(StringAppendFTest, EmptyString) { string value("Hello"); StringAppendF(&value, "%s", ""); EXPECT_EQ("Hello", value); } TEST(StringAppendFTest, String) { string value("Hello"); StringAppendF(&value, " %s", "World"); EXPECT_EQ("Hello World", value); } TEST(StringAppendFTest, Int) { 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 = setlocale(LC_CTYPE, NULL); // Push locale with multibyte mode setlocale(LC_CTYPE, "en_US.utf8"); const char kInvalidCodePoint[] = "\375\067s"; 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. int n = 2048; char* buf = new char[n+1]; memset(buf, ' ', n-3); memcpy(buf + n - 3, kInvalidCodePoint, 4); value = StringPrintf("%.*s", n, buf); // See GRTEv2 vs. GRTEv3 comment above. EXPECT_TRUE(value.empty() || value == buf); delete[] buf; setlocale(LC_CTYPE, old_locale); } TEST(StringPrintfTest, NoMultibyte) { // No multibyte handling, but the string contains funny chars. char* old_locale = setlocale(LC_CTYPE, NULL); setlocale(LC_CTYPE, "POSIX"); string value = StringPrintf("%.*s", 3, "\375\067s"); setlocale(LC_CTYPE, old_locale); 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; 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; string value = StringPrintf("%s", buf); EXPECT_EQ(buf, value); delete[] buf; } } // anonymous namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/structurally_valid.cc000066400000000000000000000603571334102242000327070ustar00rootroot00000000000000// Copyright 2005-2008 Google Inc. All Rights Reserved. // Author: jrm@google.com (Jim Meehan) #include #include namespace google { namespace protobuf { namespace internal { // These four-byte entries compactly encode how many bytes 0..255 to delete // in making a string replacement, how many bytes to add 0..255, and the offset // 0..64k-1 of the replacement string in remap_string. struct RemapEntry { uint8 delete_bytes; uint8 add_bytes; uint16 bytes_offset; }; // Exit type codes for state tables. All but the first get stuffed into // signed one-byte entries. The first is only generated by executable code. // To distinguish from next-state entries, these must be contiguous and // all <= kExitNone typedef enum { kExitDstSpaceFull = 239, kExitIllegalStructure, // 240 kExitOK, // 241 kExitReject, // ... kExitReplace1, kExitReplace2, kExitReplace3, kExitReplace21, kExitReplace31, kExitReplace32, kExitReplaceOffset1, kExitReplaceOffset2, kExitReplace1S0, kExitSpecial, kExitDoAgain, kExitRejectAlt, kExitNone // 255 } ExitReason; // This struct represents one entire state table. The three initialized byte // areas are state_table, remap_base, and remap_string. state0 and state0_size // give the byte offset and length within state_table of the initial state -- // table lookups are expected to start and end in this state, but for // truncated UTF-8 strings, may end in a different state. These allow a quick // test for that condition. entry_shift is 8 for tables subscripted by a full // byte value and 6 for space-optimized tables subscripted by only six // significant bits in UTF-8 continuation bytes. typedef struct { const uint32 state0; const uint32 state0_size; const uint32 total_size; const int max_expand; const int entry_shift; const int bytes_per_entry; const uint32 losub; const uint32 hiadd; const uint8* state_table; const RemapEntry* remap_base; const uint8* remap_string; const uint8* fast_state; } UTF8StateMachineObj; typedef UTF8StateMachineObj UTF8ScanObj; #define X__ (kExitIllegalStructure) #define RJ_ (kExitReject) #define S1_ (kExitReplace1) #define S2_ (kExitReplace2) #define S3_ (kExitReplace3) #define S21 (kExitReplace21) #define S31 (kExitReplace31) #define S32 (kExitReplace32) #define T1_ (kExitReplaceOffset1) #define T2_ (kExitReplaceOffset2) #define S11 (kExitReplace1S0) #define SP_ (kExitSpecial) #define D__ (kExitDoAgain) #define RJA (kExitRejectAlt) // Entire table has 9 state blocks of 256 entries each static const unsigned int utf8acceptnonsurrogates_STATE0 = 0; // state[0] static const unsigned int utf8acceptnonsurrogates_STATE0_SIZE = 256; // =[1] static const unsigned int utf8acceptnonsurrogates_TOTAL_SIZE = 2304; static const unsigned int utf8acceptnonsurrogates_MAX_EXPAND_X4 = 0; static const unsigned int utf8acceptnonsurrogates_SHIFT = 8; static const unsigned int utf8acceptnonsurrogates_BYTES = 1; static const unsigned int utf8acceptnonsurrogates_LOSUB = 0x20202020; static const unsigned int utf8acceptnonsurrogates_HIADD = 0x00000000; static const uint8 utf8acceptnonsurrogates[] = { // state[0] 0x000000 Byte 1 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 3, 4, 5, 5, 5, 6, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, // state[1] 0x000080 Byte 2 of 2 X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, // state[2] 0x000000 Byte 2 of 3 X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, // state[3] 0x001000 Byte 2 of 3 X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, // state[4] 0x000000 Byte 2 of 4 X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, // state[5] 0x040000 Byte 2 of 4 X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, // state[6] 0x100000 Byte 2 of 4 X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, // state[7] 0x00d000 Byte 2 of 3 X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, // state[8] 0x00d800 Byte 3 of 3 X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, }; // Remap base[0] = (del, add, string_offset) static const RemapEntry utf8acceptnonsurrogates_remap_base[] = { {0, 0, 0} }; // Remap string[0] static const unsigned char utf8acceptnonsurrogates_remap_string[] = { 0 }; static const unsigned char utf8acceptnonsurrogates_fast[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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 UTF8ScanObj utf8acceptnonsurrogates_obj = { utf8acceptnonsurrogates_STATE0, utf8acceptnonsurrogates_STATE0_SIZE, utf8acceptnonsurrogates_TOTAL_SIZE, utf8acceptnonsurrogates_MAX_EXPAND_X4, utf8acceptnonsurrogates_SHIFT, utf8acceptnonsurrogates_BYTES, utf8acceptnonsurrogates_LOSUB, utf8acceptnonsurrogates_HIADD, utf8acceptnonsurrogates, utf8acceptnonsurrogates_remap_base, utf8acceptnonsurrogates_remap_string, utf8acceptnonsurrogates_fast }; #undef X__ #undef RJ_ #undef S1_ #undef S2_ #undef S3_ #undef S21 #undef S31 #undef S32 #undef T1_ #undef T2_ #undef S11 #undef SP_ #undef D__ #undef RJA // Return true if current Tbl pointer is within state0 range // Note that unsigned compare checks both ends of range simultaneously static inline bool InStateZero(const UTF8ScanObj* st, const uint8* Tbl) { const uint8* Tbl0 = &st->state_table[st->state0]; return (static_cast(Tbl - Tbl0) < st->state0_size); } // Scan a UTF-8 string based on state table. // Always scan complete UTF-8 characters // Set number of bytes scanned. Return reason for exiting int UTF8GenericScan(const UTF8ScanObj* st, const char * str, int str_length, int* bytes_consumed) { *bytes_consumed = 0; if (str_length == 0) return kExitOK; int eshift = st->entry_shift; const uint8* isrc = reinterpret_cast(str); const uint8* src = isrc; const uint8* srclimit = isrc + str_length; const uint8* srclimit8 = srclimit - 7; const uint8* Tbl_0 = &st->state_table[st->state0]; DoAgain: // Do state-table scan int e = 0; uint8 c; const uint8* Tbl2 = &st->fast_state[0]; const uint32 losub = st->losub; const uint32 hiadd = st->hiadd; // Check initial few bytes one at a time until 8-byte aligned //---------------------------- while ((((uintptr_t)src & 0x07) != 0) && (src < srclimit) && Tbl2[src[0]] == 0) { src++; } if (((uintptr_t)src & 0x07) == 0) { // Do fast for groups of 8 identity bytes. // This covers a lot of 7-bit ASCII ~8x faster then the 1-byte loop, // including slowing slightly on cr/lf/ht //---------------------------- while (src < srclimit8) { uint32 s0123 = (reinterpret_cast(src))[0]; uint32 s4567 = (reinterpret_cast(src))[1]; src += 8; // This is a fast range check for all bytes in [lowsub..0x80-hiadd) uint32 temp = (s0123 - losub) | (s0123 + hiadd) | (s4567 - losub) | (s4567 + hiadd); if ((temp & 0x80808080) != 0) { // We typically end up here on cr/lf/ht; src was incremented int e0123 = (Tbl2[src[-8]] | Tbl2[src[-7]]) | (Tbl2[src[-6]] | Tbl2[src[-5]]); if (e0123 != 0) { src -= 8; break; } // Exit on Non-interchange e0123 = (Tbl2[src[-4]] | Tbl2[src[-3]]) | (Tbl2[src[-2]] | Tbl2[src[-1]]); if (e0123 != 0) { src -= 4; break; } // Exit on Non-interchange // Else OK, go around again } } } //---------------------------- // Byte-at-a-time scan //---------------------------- const uint8* Tbl = Tbl_0; while (src < srclimit) { c = *src; e = Tbl[c]; src++; if (e >= kExitIllegalStructure) {break;} Tbl = &Tbl_0[e << eshift]; } //---------------------------- // Exit posibilities: // Some exit code, !state0, back up over last char // Some exit code, state0, back up one byte exactly // source consumed, !state0, back up over partial char // source consumed, state0, exit OK // For illegal byte in state0, avoid backup up over PREVIOUS char // For truncated last char, back up to beginning of it if (e >= kExitIllegalStructure) { // Back up over exactly one byte of rejected/illegal UTF-8 character src--; // Back up more if needed if (!InStateZero(st, Tbl)) { do { src--; } while ((src > isrc) && ((src[0] & 0xc0) == 0x80)); } } else if (!InStateZero(st, Tbl)) { // Back up over truncated UTF-8 character e = kExitIllegalStructure; do { src--; } while ((src > isrc) && ((src[0] & 0xc0) == 0x80)); } else { // Normal termination, source fully consumed e = kExitOK; } if (e == kExitDoAgain) { // Loop back up to the fast scan goto DoAgain; } *bytes_consumed = src - isrc; return e; } int UTF8GenericScanFastAscii(const UTF8ScanObj* st, const char * str, int str_length, int* bytes_consumed) { *bytes_consumed = 0; if (str_length == 0) return kExitOK; const uint8* isrc = reinterpret_cast(str); const uint8* src = isrc; const uint8* srclimit = isrc + str_length; const uint8* srclimit8 = srclimit - 7; int n; int rest_consumed; int exit_reason; do { // Check initial few bytes one at a time until 8-byte aligned while ((((uintptr_t)src & 0x07) != 0) && (src < srclimit) && (src[0] < 0x80)) { src++; } if (((uintptr_t)src & 0x07) == 0) { while ((src < srclimit8) && (((reinterpret_cast(src)[0] | reinterpret_cast(src)[1]) & 0x80808080) == 0)) { src += 8; } } while ((src < srclimit) && (src[0] < 0x80)) { src++; } // Run state table on the rest n = src - isrc; exit_reason = UTF8GenericScan(st, str + n, str_length - n, &rest_consumed); src += rest_consumed; } while ( exit_reason == kExitDoAgain ); *bytes_consumed = src - isrc; return exit_reason; } // Hack: On some compilers the static tables are initialized at startup. // We can't use them until they are initialized. However, some Protocol // Buffer parsing happens at static init time and may try to validate // UTF-8 strings. Since UTF-8 validation is only used for debugging // anyway, we simply always return success if initialization hasn't // occurred yet. namespace { bool module_initialized_ = false; struct InitDetector { InitDetector() { module_initialized_ = true; } }; InitDetector init_detector; } // namespace bool IsStructurallyValidUTF8(const char* buf, int len) { if (!module_initialized_) return true; int bytes_consumed = 0; UTF8GenericScanFastAscii(&utf8acceptnonsurrogates_obj, buf, len, &bytes_consumed); return (bytes_consumed == len); } int UTF8SpnStructurallyValid(const StringPiece& str) { if (!module_initialized_) return str.size(); int bytes_consumed = 0; UTF8GenericScanFastAscii(&utf8acceptnonsurrogates_obj, str.data(), str.size(), &bytes_consumed); return bytes_consumed; } // Coerce UTF-8 byte string in src_str to be // a structurally-valid equal-length string by selectively // overwriting illegal bytes with replace_char (typically blank). // replace_char must be legal printable 7-bit Ascii 0x20..0x7e. // src_str is read-only. If any overwriting is needed, a modified byte string // is created in idst, length isrclen. // // Returns pointer to output buffer, isrc if no changes were made, // or idst if some bytes were changed. // // Fast case: all is structurally valid and no byte copying is done. // char* UTF8CoerceToStructurallyValid(const StringPiece& src_str, char* idst, const char replace_char) { const char* isrc = src_str.data(); const int len = src_str.length(); int n = UTF8SpnStructurallyValid(src_str); if (n == len) { // Normal case -- all is cool, return return const_cast(isrc); } else { // Unusual case -- copy w/o bad bytes const char* src = isrc; const char* srclimit = isrc + len; char* dst = idst; memmove(dst, src, n); // Copy initial good chunk src += n; dst += n; while (src < srclimit) { // src points to bogus byte or is off the end dst[0] = replace_char; // replace one bad byte src++; dst++; StringPiece str2(src, srclimit - src); n = UTF8SpnStructurallyValid(str2); // scan the remainder memmove(dst, src, n); // copy next good chunk src += n; dst += n; } } return idst; } } // namespace internal } // namespace protobuf } // namespace google structurally_valid_unittest.cc000066400000000000000000000025151334102242000345570ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs// Copyright 2008 Google Inc. All Rights Reserved. // Author: xpeng@google.com (Peter Peng) #include #include namespace google { namespace protobuf { namespace internal { namespace { TEST(StructurallyValidTest, ValidUTF8String) { // On GCC, this string can be written as: // "abcd 1234 - \u2014\u2013\u2212" // MSVC seems to interpret \u differently. string valid_str("abcd 1234 - \342\200\224\342\200\223\342\210\222 - xyz789"); EXPECT_TRUE(IsStructurallyValidUTF8(valid_str.data(), valid_str.size())); // Additional check for pointer alignment for (int i = 1; i < 8; ++i) { EXPECT_TRUE(IsStructurallyValidUTF8(valid_str.data() + i, valid_str.size() - i)); } } TEST(StructurallyValidTest, InvalidUTF8String) { const string invalid_str("abcd\xA0\xB0\xA0\xB0\xA0\xB0 - xyz789"); EXPECT_FALSE(IsStructurallyValidUTF8(invalid_str.data(), invalid_str.size())); // Additional check for pointer alignment for (int i = 1; i < 8; ++i) { EXPECT_FALSE(IsStructurallyValidUTF8(invalid_str.data() + i, invalid_str.size() - i)); } } } // namespace } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/strutil.cc000066400000000000000000002372061334102242000304600ustar00rootroot00000000000000// 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. // from google3/strings/strutil.cc #include #include #include #include // FLT_DIG and DBL_DIG #include #include #include #include #include #ifdef _WIN32 // MSVC has only _snprintf, not snprintf. // // MinGW has both snprintf and _snprintf, but they appear to be different // functions. The former is buggy. When invoked like so: // char buffer[32]; // snprintf(buffer, 32, "%.*g\n", FLT_DIG, 1.23e10f); // it prints "1.23000e+10". This is plainly wrong: %g should never print // trailing zeros after the decimal point. For some reason this bug only // occurs with some input values, not all. In any case, _snprintf does the // right thing, so we use it. #define snprintf _snprintf #endif 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; } // ---------------------------------------------------------------------- // StripString // Replaces any occurrence of the character 'remove' (or the characters // in 'remove') with the character 'replacewith'. // ---------------------------------------------------------------------- void StripString(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 != NULL; str = strpbrk(str + 1, remove)) { (*s)[str - str_start] = replacewith; } } // ---------------------------------------------------------------------- // ReplaceCharacters // Replaces any occurrence of the character 'remove' (or the characters // in 'remove') with the character 'replacewith'. // ---------------------------------------------------------------------- void ReplaceCharacters(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 != NULL; str = strpbrk(str + 1, remove)) { (*s)[str - str_start] = replacewith; } } void StripWhitespace(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, 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." // ---------------------------------------------------------------------- void StringReplace(const string& s, const string& oldsub, const string& newsub, bool replace_all, string* res) { if (oldsub.empty()) { res->append(s); // if empty, append the given string. return; } string::size_type start_pos = 0; string::size_type pos; do { pos = s.find(oldsub, start_pos); if (pos == string::npos) { break; } res->append(s, start_pos, pos - start_pos); res->append(newsub); start_pos = pos + oldsub.size(); // start searching again after the "old" } while (replace_all); res->append(s, start_pos, s.length() - start_pos); } // ---------------------------------------------------------------------- // 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 // exists. If "global" is true; call this repeatedly until it // fails. RETURN a new string, regardless of whether the replacement // happened or not. // ---------------------------------------------------------------------- string StringReplace(const string& s, const string& oldsub, const string& newsub, bool replace_all) { string ret; StringReplace(s, oldsub, newsub, replace_all, &ret); return ret; } // ---------------------------------------------------------------------- // 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 static inline void SplitStringToIteratorUsing(const string& 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++ = string(start, p - start); } } return; } string::size_type begin_index, end_index; begin_index = full.find_first_not_of(delim); while (begin_index != string::npos) { end_index = full.find_first_of(delim, begin_index); if (end_index == string::npos) { *result++ = full.substr(begin_index); return; } *result++ = full.substr(begin_index, (end_index - begin_index)); begin_index = full.find_first_not_of(delim, end_index); } } void SplitStringUsing(const string& full, const char* delim, vector* result) { std::back_insert_iterator< vector > 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 static inline void SplitStringToIteratorAllowEmpty(const StringType& full, const char* delim, int pieces, ITR& result) { 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 == string::npos) { *result++ = full.substr(begin_index); return; } *result++ = full.substr(begin_index, (end_index - begin_index)); begin_index = end_index + 1; } *result++ = full.substr(begin_index); } void SplitStringAllowEmpty(const string& full, const char* delim, vector* result) { std::back_insert_iterator > it(*result); SplitStringToIteratorAllowEmpty(full, delim, 0, it); } // ---------------------------------------------------------------------- // JoinStrings() // This merges a vector of string components with delim inserted // as separaters between components. // // ---------------------------------------------------------------------- template static void JoinStringsIterator(const ITERATOR& start, const ITERATOR& end, const char* delim, string* result) { GOOGLE_CHECK(result != NULL); 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 vector& components, const char* delim, 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 NULL, 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, NULL); } int UnescapeCEscapeSequences(const char* source, char* dest, vector *errors) { GOOGLE_DCHECK(errors == NULL) << "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 " << "\\" << 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: \\" << 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 \\" << 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: \\" << 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 NULL, 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 string& src, string* dest) { return UnescapeCEscapeString(src, dest, NULL); } int UnescapeCEscapeString(const string& src, string* dest, vector *errors) { scoped_array 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; } string UnescapeCEscapeString(const string& src) { scoped_array unescaped(new char[src.size() + 1]); int len = UnescapeCEscapeSequences(src.c_str(), unescaped.get(), NULL); return 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(*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(*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 (int i = 0; i < src.size(); ++i) { unsigned char c = static_cast(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, 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 (int i = 0; i < src.size(); ++i) { unsigned char c = static_cast(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; } } } string CEscape(const string& src) { string dest; CEscapeAndAppend(src, &dest); return dest; } namespace strings { string Utf8SafeCEscape(const string& src) { const int dest_length = src.size() * 4 + 1; // Maximum possible expansion scoped_array 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 string(dest.get(), len); } string CHexEscape(const string& src) { const int dest_length = src.size() * 4 + 1; // Maximum possible expansion scoped_array 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 string(dest.get(), len); } } // namespace strings // ---------------------------------------------------------------------- // strto32_adaptor() // strtou32_adaptor() // Implementation of strto[u]l replacements that have identical // overflow and underflow characteristics for both ILP-32 and LP-64 // platforms, including errno preservation in error-free calls. // ---------------------------------------------------------------------- int32 strto32_adaptor(const char *nptr, char **endptr, int base) { const int saved_errno = errno; errno = 0; const long result = strtol(nptr, endptr, base); if (errno == ERANGE && result == LONG_MIN) { return kint32min; } else if (errno == ERANGE && result == LONG_MAX) { return kint32max; } else if (errno == 0 && result < kint32min) { errno = ERANGE; return kint32min; } else if (errno == 0 && result > kint32max) { errno = ERANGE; return kint32max; } if (errno == 0) errno = saved_errno; return static_cast(result); } uint32 strtou32_adaptor(const char *nptr, char **endptr, int base) { const int saved_errno = errno; errno = 0; const unsigned long result = strtoul(nptr, endptr, base); if (errno == ERANGE && result == ULONG_MAX) { return kuint32max; } else if (errno == 0 && result > kuint32max) { errno = ERANGE; return kuint32max; } if (errno == 0) errno = saved_errno; return static_cast(result); } inline bool safe_parse_sign(string* text /*inout*/, bool* negative_ptr /*output*/) { const char* start = text->data(); const char* end = start + text->size(); // Consume whitespace. while (start < end && (start[0] == ' ')) { ++start; } while (start < end && (end[-1] == ' ')) { --end; } if (start >= end) { return false; } // Consume sign. *negative_ptr = (start[0] == '-'); if (*negative_ptr || start[0] == '+') { ++start; if (start >= end) { return false; } } *text = text->substr(start - text->data(), end - start); return true; } template bool safe_parse_positive_int( string text, IntType* value_p) { int base = 10; IntType value = 0; const IntType vmax = std::numeric_limits::max(); assert(vmax > 0); assert(vmax >= base); const IntType vmax_over_base = vmax / base; const char* start = text.data(); const char* end = start + text.size(); // loop over digits for (; start < end; ++start) { unsigned char c = static_cast(start[0]); int digit = c - '0'; if (digit >= base || digit < 0) { *value_p = value; return false; } if (value > vmax_over_base) { *value_p = vmax; return false; } value *= base; if (value > vmax - digit) { *value_p = vmax; return false; } value += digit; } *value_p = value; return true; } template bool safe_parse_negative_int( const string& text, IntType* value_p) { int base = 10; IntType value = 0; const IntType vmin = std::numeric_limits::min(); assert(vmin < 0); assert(vmin <= 0 - base); IntType vmin_over_base = vmin / base; // 2003 c++ standard [expr.mul] // "... the sign of the remainder is implementation-defined." // Although (vmin/base)*base + vmin%base is always vmin. // 2011 c++ standard tightens the spec but we cannot rely on it. if (vmin % base > 0) { vmin_over_base += 1; } const char* start = text.data(); const char* end = start + text.size(); // loop over digits for (; start < end; ++start) { unsigned char c = static_cast(start[0]); int digit = c - '0'; if (digit >= base || digit < 0) { *value_p = value; return false; } if (value < vmin_over_base) { *value_p = vmin; return false; } value *= base; if (value < vmin + digit) { *value_p = vmin; return false; } value -= digit; } *value_p = value; return true; } template bool safe_int_internal(string text, IntType* value_p) { *value_p = 0; bool negative; if (!safe_parse_sign(&text, &negative)) { return false; } if (!negative) { return safe_parse_positive_int(text, value_p); } else { return safe_parse_negative_int(text, value_p); } } template bool safe_uint_internal(string text, IntType* value_p) { *value_p = 0; bool negative; if (!safe_parse_sign(&text, &negative) || negative) { return false; } return safe_parse_positive_int(text, value_p); } // ---------------------------------------------------------------------- // 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 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 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 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(value) & 0xf]; #endif value >>= 4; } return buffer; } char *FastHex64ToBuffer(uint64 value, char* buffer) { return InternalFastHexToBuffer(value, buffer, 16); } char *FastHex32ToBuffer(uint32 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 u, char* buffer) { uint32 digits; const char *ASCII_digits = NULL; // 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 i, char* buffer) { uint32 u = i; if (i < 0) { *buffer++ = '-'; u = -i; } return FastUInt32ToBufferLeft(u, buffer); } char* FastUInt64ToBufferLeft(uint64 u64, char* buffer) { int digits; const char *ASCII_digits = NULL; uint32 u = static_cast(u64); if (u == u64) return FastUInt32ToBufferLeft(u, buffer); uint64 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 i, char* buffer) { uint64 u = i; if (i < 0) { *buffer++ = '-'; u = -i; } return FastUInt64ToBufferLeft(u, buffer); } // ---------------------------------------------------------------------- // SimpleItoa() // Description: converts an integer to a string. // // Return value: string // ---------------------------------------------------------------------- string SimpleItoa(int i) { char buffer[kFastToBufferSize]; return (sizeof(i) == 4) ? FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer); } string SimpleItoa(unsigned int i) { char buffer[kFastToBufferSize]; return string(buffer, (sizeof(i) == 4) ? FastUInt32ToBufferLeft(i, buffer) : FastUInt64ToBufferLeft(i, buffer)); } string SimpleItoa(long i) { char buffer[kFastToBufferSize]; return (sizeof(i) == 4) ? FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer); } string SimpleItoa(unsigned long i) { char buffer[kFastToBufferSize]; return string(buffer, (sizeof(i) == 4) ? FastUInt32ToBufferLeft(i, buffer) : FastUInt64ToBufferLeft(i, buffer)); } string SimpleItoa(long long i) { char buffer[kFastToBufferSize]; return (sizeof(i) == 4) ? FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer); } string SimpleItoa(unsigned long long i) { char buffer[kFastToBufferSize]; return 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 // exactly in binary. If we print 0.2 with a very large precision, // e.g. "%.50g", we get "0.2000000000000000111022302462515654042363167". // On the other hand, if we set the precision too low, we lose // significant digits when printing numbers that actually need them. // It turns out there is no precision value that does the right thing // for all numbers. // // Our strategy is to first try printing with a precision that is never // over-precise, then parse the result with strtod() to see if it // matches. If not, we print again with a precision that will always // give a precise result, but may use more digits than necessary. // // An arguably better strategy would be to use the algorithm described // in "How to Print Floating-Point Numbers Accurately" by Steele & // White, e.g. as implemented by David M. Gay's dtoa(). It turns out, // however, that the following implementation is about as fast as // DMG's code. Furthermore, DMG's code locks mutexes, which means it // will not scale well on multi-core machines. DMG's code is slightly // more accurate (in that it will never use more digits than // necessary), but this is probably irrelevant for most users. // // Rob Pike and Ken Thompson also have an implementation of dtoa() in // third_party/fmt/fltfmt.cc. Their implementation is similar to this // one in that it makes guesses and then uses strtod() to check them. // Their implementation is faster because they use their own code to // generate the digits in the first place rather than use snprintf(), // thus avoiding format string parsing overhead. However, this makes // it considerably more complicated than the following implementation, // and it is embedded in a larger library. If speed turns out to be // an issue, we could re-implement this in terms of their // implementation. // ---------------------------------------------------------------------- string SimpleDtoa(double value) { char buffer[kDoubleToBufferSize]; return DoubleToBuffer(value, buffer); } string SimpleFtoa(float value) { char buffer[kFloatToBufferSize]; return FloatToBuffer(value, buffer); } static inline bool IsValidFloatChar(char c) { return ('0' <= c && c <= '9') || c == 'e' || c == 'E' || c == '+' || c == '-'; } void DelocalizeRadix(char* buffer) { // Fast check: if the buffer has a normal decimal point, assume no // translation is needed. if (strchr(buffer, '.') != NULL) return; // Find the first unknown character. while (IsValidFloatChar(*buffer)) ++buffer; if (*buffer == '\0') { // No radix character found. return; } // We are now pointing at the locale-specific radix character. Replace it // with '.'. *buffer = '.'; ++buffer; 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'); memmove(target, buffer, strlen(buffer) + 1); } } 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 // is significantly larger -- and risks overflowing our buffer -- we have // this assert. GOOGLE_COMPILE_ASSERT(DBL_DIG < 20, DBL_DIG_is_too_big); if (value == std::numeric_limits::infinity()) { strcpy(buffer, "inf"); return buffer; } else if (value == -std::numeric_limits::infinity()) { strcpy(buffer, "-inf"); return buffer; } else if (MathLimits::IsNaN(value)) { strcpy(buffer, "nan"); return buffer; } int snprintf_result = snprintf(buffer, kDoubleToBufferSize, "%.*g", DBL_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 < kDoubleToBufferSize); // We need to make parsed_value volatile in order to force the compiler to // write it out to the stack. Otherwise, it may keep the value in a // register, and if it does that, it may keep it as a long double instead // of a double. This long double may have extra bits that make it compare // unequal to "value" even though it would be exactly equal if it were // truncated to a double. volatile double parsed_value = strtod(buffer, NULL); if (parsed_value != value) { int snprintf_result = snprintf(buffer, kDoubleToBufferSize, "%.*g", DBL_DIG+2, value); // Should never overflow; see above. GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kDoubleToBufferSize); } DelocalizeRadix(buffer); return buffer; } static int memcasecmp(const char *s1, const char *s2, size_t len) { const unsigned char *us1 = reinterpret_cast(s1); const unsigned char *us2 = reinterpret_cast(s2); for ( int i = 0; i < len; i++ ) { const int diff = static_cast(static_cast(ascii_tolower(us1[i]))) - static_cast(static_cast(ascii_tolower(us2[i]))); if (diff != 0) return diff; } return 0; } inline bool CaseEqual(StringPiece s1, StringPiece s2) { if (s1.size() != s2.size()) return false; return memcasecmp(s1.data(), s2.data(), s1.size()) == 0; } bool safe_strtob(StringPiece str, bool* value) { GOOGLE_CHECK(value != NULL) << "NULL output boolean given."; if (CaseEqual(str, "true") || CaseEqual(str, "t") || CaseEqual(str, "yes") || CaseEqual(str, "y") || CaseEqual(str, "1")) { *value = true; return true; } if (CaseEqual(str, "false") || CaseEqual(str, "f") || CaseEqual(str, "no") || CaseEqual(str, "n") || CaseEqual(str, "0")) { *value = false; return true; } return false; } bool safe_strtof(const char* str, float* value) { char* endptr; errno = 0; // errno only gets set on errors #if defined(_WIN32) || defined (__hpux) // has no strtof() *value = strtod(str, &endptr); #else *value = strtof(str, &endptr); #endif return *str != 0 && *endptr == 0 && errno == 0; } bool safe_strtod(const char* str, double* value) { char* endptr; *value = strtod(str, &endptr); if (endptr != str) { while (ascii_isspace(*endptr)) ++endptr; } // Ignore range errors from strtod. The values it // returns on underflow and overflow are the right // fallback in a robust setting. return *str != '\0' && *endptr == '\0'; } bool safe_strto32(const string& str, int32* value) { return safe_int_internal(str, value); } bool safe_strtou32(const string& str, uint32* value) { return safe_uint_internal(str, value); } bool safe_strto64(const string& str, int64* value) { return safe_int_internal(str, value); } bool safe_strtou64(const string& str, uint64* value) { 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. GOOGLE_COMPILE_ASSERT(FLT_DIG < 10, FLT_DIG_is_too_big); if (value == std::numeric_limits::infinity()) { strcpy(buffer, "inf"); return buffer; } else if (value == -std::numeric_limits::infinity()) { strcpy(buffer, "-inf"); return buffer; } else if (MathLimits::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) { int 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 value = hex.value; uint64 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 mask = ((static_cast(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) { memcpy(out, x.data(), x.size()); return out + x.size(); } static char *Append2(char *out, const AlphaNum &x1, const AlphaNum &x2) { memcpy(out, x1.data(), x1.size()); out += x1.size(); memcpy(out, x2.data(), x2.size()); return out + x2.size(); } static char *Append4(char *out, const AlphaNum &x1, const AlphaNum &x2, const AlphaNum &x3, const AlphaNum &x4) { memcpy(out, x1.data(), x1.size()); out += x1.size(); memcpy(out, x2.data(), x2.size()); out += x2.size(); memcpy(out, x3.data(), x3.size()); out += x3.size(); memcpy(out, x4.data(), x4.size()); return out + x4.size(); } string StrCat(const AlphaNum &a, const AlphaNum &b) { 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; } string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c) { 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; } string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c, const AlphaNum &d) { 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; } string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c, const AlphaNum &d, const AlphaNum &e) { 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; } string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c, const AlphaNum &d, const AlphaNum &e, const AlphaNum &f) { 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; } string StrCat(const AlphaNum &a, const AlphaNum &b, const AlphaNum &c, const AlphaNum &d, const AlphaNum &e, const AlphaNum &f, const AlphaNum &g) { 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; } 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) { 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; } 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) { 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(string *result, const AlphaNum &a) { GOOGLE_DCHECK_NO_OVERLAP(*result, a); result->append(a.data(), a.size()); } void StrAppend(string *result, const AlphaNum &a, const AlphaNum &b) { GOOGLE_DCHECK_NO_OVERLAP(*result, a); GOOGLE_DCHECK_NO_OVERLAP(*result, b); 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(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); 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(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); 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 string& substring, const string& replacement, string* s) { GOOGLE_CHECK(s != NULL); if (s->empty() || substring.empty()) return 0; string tmp; int num_replacements = 0; int pos = 0; for (int match_pos = s->find(substring.data(), pos, substring.length()); match_pos != 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; } 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. // // (from http://tools.ietf.org/html/rfc3548) // Special processing is performed if fewer than 24 bits are available // at the end of the data being encoded. A full encoding quantum is // always completed at the end of a quantity. When fewer than 24 input // bits are available in an input group, zero bits are added (on the // right) to form an integral number of 6-bit groups. Padding at the // end of the data is performed using the '=' character. Since all base // 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; if (input_len % 3 == 0) { // (from http://tools.ietf.org/html/rfc3548) // (1) the final quantum of encoding input is an integral multiple of 24 // bits; here, the final unit of encoded output will be an integral // multiple of 4 characters with no "=" padding, } else if (input_len % 3 == 1) { // (from http://tools.ietf.org/html/rfc3548) // (2) the final quantum of encoding input is exactly 8 bits; here, the // final unit of encoded output will be two characters followed by two // "=" padding characters, or len += 2; if (do_padding) { len += 2; } } else { // (input_len % 3 == 2) // (from http://tools.ietf.org/html/rfc3548) // (3) the final quantum of encoding input is exactly 16 bits; here, the // final unit of encoded output will be three characters followed by one // "=" padding character. len += 3; if (do_padding) { len += 1; } } assert(len >= input_len); // make sure we didn't overflow 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(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 // #include // #include // main() // { // static const char Base64[] = // "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // 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 == NULL) || (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*/, 07/*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*/, 07/*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, 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, string* dest) { return Base64UnescapeInternal(src.data(), src.size(), dest, kUnBase64); } bool WebSafeBase64Unescape(StringPiece src, 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, bool do_padding) { static const char kPad64 = '='; if (szsrc <= 0) return 0; if (szsrc * 4 > szdest * 3) return 0; char *cur_dest = dest; const unsigned char *cur_src = src; char *limit_dest = dest + szdest; const unsigned char *limit_src = src + szsrc; // Three bytes of data encodes to four characters of cyphertext. // So we can pump through three-byte chunks atomically. while (cur_src < limit_src - 3) { // keep going as long as we have >= 32 bits uint32 in = BigEndian::Load32(cur_src) >> 8; cur_dest[0] = base64[in >> 18]; in &= 0x3FFFF; cur_dest[1] = base64[in >> 12]; in &= 0xFFF; cur_dest[2] = base64[in >> 6]; in &= 0x3F; cur_dest[3] = base64[in]; cur_dest += 4; cur_src += 3; } // To save time, we didn't update szdest or szsrc in the loop. So do it now. szdest = limit_dest - cur_dest; szsrc = limit_src - cur_src; /* now deal with the tail (<=3 bytes) */ switch (szsrc) { case 0: // Nothing left; nothing more to do. break; case 1: { // One byte left: this encodes to two characters, and (optionally) // two pad characters to round out the four-character cypherblock. if ((szdest -= 2) < 0) return 0; uint32 in = cur_src[0]; cur_dest[0] = base64[in >> 2]; in &= 0x3; cur_dest[1] = base64[in << 4]; cur_dest += 2; if (do_padding) { if ((szdest -= 2) < 0) return 0; cur_dest[0] = kPad64; cur_dest[1] = kPad64; cur_dest += 2; } break; } case 2: { // Two bytes left: this encodes to three characters, and (optionally) // one pad character to round out the four-character cypherblock. if ((szdest -= 3) < 0) return 0; uint32 in = BigEndian::Load16(cur_src); cur_dest[0] = base64[in >> 10]; in &= 0x3FF; cur_dest[1] = base64[in >> 4]; in &= 0x00F; cur_dest[2] = base64[in << 2]; cur_dest += 3; if (do_padding) { if ((szdest -= 1) < 0) return 0; cur_dest[0] = kPad64; cur_dest += 1; } break; } case 3: { // Three bytes left: same as in the big loop above. We can't do this in // the loop because the loop above always reads 4 bytes, and the fourth // byte is past the end of the input. if ((szdest -= 4) < 0) return 0; uint32 in = (cur_src[0] << 16) + BigEndian::Load16(cur_src + 1); cur_dest[0] = base64[in >> 18]; in &= 0x3FFFF; cur_dest[1] = base64[in >> 12]; in &= 0xFFF; cur_dest[2] = base64[in >> 6]; in &= 0x3F; cur_dest[3] = base64[in]; cur_dest += 4; break; } default: // Should not be reached: blocks of 4 bytes are handled // in the while loop before this switch statement. GOOGLE_LOG(FATAL) << "Logic problem? szsrc = " << szsrc; break; } 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, string* dest, bool do_padding, const char* 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); GOOGLE_DCHECK_EQ(calc_escaped_size, escaped_len); dest->erase(escaped_len); } void Base64Escape(const unsigned char *src, int szsrc, string* dest, bool do_padding) { Base64EscapeInternal(src, szsrc, dest, do_padding, kBase64Chars); } void WebSafeBase64Escape(const unsigned char *src, int szsrc, string *dest, bool do_padding) { Base64EscapeInternal(src, szsrc, dest, do_padding, kWebSafeBase64Chars); } void Base64Escape(StringPiece src, string* dest) { Base64Escape(reinterpret_cast(src.data()), src.size(), dest, true); } void WebSafeBase64Escape(StringPiece src, string* dest) { WebSafeBase64Escape(reinterpret_cast(src.data()), src.size(), dest, false); } void WebSafeBase64EscapeWithPadding(StringPiece src, string* dest) { WebSafeBase64Escape(reinterpret_cast(src.data()), src.size(), dest, true); } // Helper to append a Unicode code point to a string as UTF8, without bringing // in any external dependencies. int EncodeAsUTF8Char(uint32 code_point, char* output) { uint32 tmp = 0; int len = 0; if (code_point <= 0x7f) { tmp = code_point; len = 1; } else if (code_point <= 0x07ff) { tmp = 0x0000c080 | ((code_point & 0x07c0) << 2) | (code_point & 0x003f); len = 2; } else if (code_point <= 0xffff) { tmp = 0x00e08080 | ((code_point & 0xf000) << 4) | ((code_point & 0x0fc0) << 2) | (code_point & 0x003f); len = 3; } else { // UTF-16 is only defined for code points up to 0x10FFFF, and UTF-8 is // normally only defined up to there as well. tmp = 0xf0808080 | ((code_point & 0x1c0000) << 6) | ((code_point & 0x03f000) << 4) | ((code_point & 0x000fc0) << 2) | (code_point & 0x003f); len = 4; } tmp = ghtonl(tmp); memcpy(output, reinterpret_cast(&tmp) + sizeof(tmp) - len, len); return len; } // Table of UTF-8 character lengths, based on first byte static const unsigned char kUTF8LenTbl[256] = { 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4 }; // Return length of a single UTF-8 source character int UTF8FirstLetterNumBytes(const char* src, int len) { if (len == 0) { return 0; } return kUTF8LenTbl[*reinterpret_cast(src)]; } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/strutil.h000066400000000000000000001070041334102242000303120ustar00rootroot00000000000000// 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. // from google3/strings/strutil.h #ifndef GOOGLE_PROTOBUF_STUBS_STRUTIL_H__ #define GOOGLE_PROTOBUF_STUBS_STRUTIL_H__ #include #include #include #include namespace google { namespace protobuf { #ifdef _MSC_VER #define strtoll _strtoi64 #define strtoull _strtoui64 #elif defined(__DECCXX) && defined(__osf__) // HP C++ on Tru64 does not have strtoll, but strtol is already 64-bit. #define strtoll strtol #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(c); if (x > '9') { x += 9; } return x & 0xf; } // ---------------------------------------------------------------------- // 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(const string& str, const string& prefix) { return str.size() >= prefix.size() && str.compare(0, prefix.size(), prefix) == 0; } inline string StripPrefixString(const string& str, const 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(const string& str, const string& suffix) { return str.size() >= suffix.size() && str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; } inline string StripSuffixString(const string& str, const 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. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT void ReplaceCharacters(string* s, const char* remove, char replacewith); LIBPROTOBUF_EXPORT void StripString(string* s, const char* remove, char replacewith); LIBPROTOBUF_EXPORT void StripWhitespace(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(string * s) { string::iterator end = s->end(); for (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(string * s) { string::iterator end = s->end(); for (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 string ToUpper(const string& s) { 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 // exists. RETURN a new string, regardless of whether the replacement // happened or not. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT string StringReplace(const string& s, const string& oldsub, const string& newsub, 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. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT void SplitStringUsing(const string& full, const char* delim, vector* 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. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT void SplitStringAllowEmpty(const string& full, const char* delim, vector* result); // ---------------------------------------------------------------------- // Split() // Split a string using a character delimiter. // ---------------------------------------------------------------------- inline vector Split( const string& full, const char* delim, bool skip_empty = true) { vector 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. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT void JoinStrings(const vector& components, const char* delim, string* result); inline string JoinStrings(const vector& components, const char* delim) { 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 vector is NULL; otherwise, error // messages are stored in the vector. In either case, the effect on // the dest array is not defined, but rest of the source will be // processed. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest); LIBPROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest, vector *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 NULL, 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. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT int UnescapeCEscapeString(const string& src, string* dest); LIBPROTOBUF_EXPORT int UnescapeCEscapeString(const string& src, string* dest, vector *errors); LIBPROTOBUF_EXPORT string UnescapeCEscapeString(const string& src); // ---------------------------------------------------------------------- // CEscape() // Escapes 'src' using C-style escape sequences and returns the resulting // string. // // Escaped chars: \n, \r, \t, ", ', \, and !isprint(). // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT string CEscape(const string& src); // ---------------------------------------------------------------------- // CEscapeAndAppend() // Escapes 'src' using C-style escape sequences, and appends the escaped // string to 'dest'. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT void CEscapeAndAppend(StringPiece src, string* dest); namespace strings { // Like CEscape() but does not escape bytes with the upper bit set. LIBPROTOBUF_EXPORT string Utf8SafeCEscape(const string& src); // Like CEscape() but uses hex (\x) escapes instead of octals. LIBPROTOBUF_EXPORT string CHexEscape(const string& src); } // namespace strings // ---------------------------------------------------------------------- // strto32() // strtou32() // strto64() // strtou64() // Architecture-neutral plug compatible replacements for strtol() and // strtoul(). Long's have different lengths on ILP-32 and LP-64 // platforms, so using these is safer, from the point of view of // overflow behavior, than using the standard libc functions. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT int32 strto32_adaptor(const char *nptr, char **endptr, int base); LIBPROTOBUF_EXPORT uint32 strtou32_adaptor(const char *nptr, char **endptr, int base); inline int32 strto32(const char *nptr, char **endptr, int base) { if (sizeof(int32) == sizeof(long)) return strtol(nptr, endptr, base); else return strto32_adaptor(nptr, endptr, base); } inline uint32 strtou32(const char *nptr, char **endptr, int base) { if (sizeof(uint32) == sizeof(unsigned long)) return strtoul(nptr, endptr, base); else return strtou32_adaptor(nptr, endptr, base); } // For now, long long is 64-bit on all the platforms we care about, so these // functions can simply pass the call to strto[u]ll. inline int64 strto64(const char *nptr, char **endptr, int base) { GOOGLE_COMPILE_ASSERT(sizeof(int64) == sizeof(long long), sizeof_int64_is_not_sizeof_long_long); return strtoll(nptr, endptr, base); } inline uint64 strtou64(const char *nptr, char **endptr, int base) { GOOGLE_COMPILE_ASSERT(sizeof(uint64) == sizeof(unsigned long long), sizeof_uint64_is_not_sizeof_long_long); return strtoull(nptr, endptr, base); } // ---------------------------------------------------------------------- // safe_strtob() // safe_strto32() // safe_strtou32() // safe_strto64() // safe_strtou64() // safe_strtof() // safe_strtod() // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT bool safe_strtob(StringPiece str, bool* value); LIBPROTOBUF_EXPORT bool safe_strto32(const string& str, int32* value); LIBPROTOBUF_EXPORT bool safe_strtou32(const string& str, uint32* value); inline bool safe_strto32(const char* str, int32* value) { return safe_strto32(string(str), value); } inline bool safe_strto32(StringPiece str, int32* value) { return safe_strto32(str.ToString(), value); } inline bool safe_strtou32(const char* str, uint32* value) { return safe_strtou32(string(str), value); } inline bool safe_strtou32(StringPiece str, uint32* value) { return safe_strtou32(str.ToString(), value); } LIBPROTOBUF_EXPORT bool safe_strto64(const string& str, int64* value); LIBPROTOBUF_EXPORT bool safe_strtou64(const string& str, uint64* value); inline bool safe_strto64(const char* str, int64* value) { return safe_strto64(string(str), value); } inline bool safe_strto64(StringPiece str, int64* value) { return safe_strto64(str.ToString(), value); } inline bool safe_strtou64(const char* str, uint64* value) { return safe_strtou64(string(str), value); } inline bool safe_strtou64(StringPiece str, uint64* value) { return safe_strtou64(str.ToString(), value); } LIBPROTOBUF_EXPORT bool safe_strtof(const char* str, float* value); LIBPROTOBUF_EXPORT bool safe_strtod(const char* str, double* value); inline bool safe_strtof(const string& str, float* value) { return safe_strtof(str.c_str(), value); } inline bool safe_strtod(const 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_strtod(StringPiece str, double* value) { return safe_strtod(str.ToString(), 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; LIBPROTOBUF_EXPORT char* FastInt32ToBuffer(int32 i, char* buffer); LIBPROTOBUF_EXPORT char* FastInt64ToBuffer(int64 i, char* buffer); char* FastUInt32ToBuffer(uint32 i, char* buffer); // inline below char* FastUInt64ToBuffer(uint64 i, char* buffer); // inline below LIBPROTOBUF_EXPORT char* FastHexToBuffer(int i, char* buffer); LIBPROTOBUF_EXPORT char* FastHex64ToBuffer(uint64 i, char* buffer); LIBPROTOBUF_EXPORT char* FastHex32ToBuffer(uint32 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). // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT char* FastInt32ToBufferLeft(int32 i, char* buffer); LIBPROTOBUF_EXPORT char* FastUInt32ToBufferLeft(uint32 i, char* buffer); LIBPROTOBUF_EXPORT char* FastInt64ToBufferLeft(int64 i, char* buffer); LIBPROTOBUF_EXPORT char* FastUInt64ToBufferLeft(uint64 i, char* buffer); // Just define these in terms of the above. inline char* FastUInt32ToBuffer(uint32 i, char* buffer) { FastUInt32ToBufferLeft(i, buffer); return buffer; } inline char* FastUInt64ToBuffer(uint64 i, char* buffer) { FastUInt64ToBufferLeft(i, buffer); return buffer; } inline string SimpleBtoa(bool value) { return value ? "true" : "false"; } // ---------------------------------------------------------------------- // SimpleItoa() // Description: converts an integer to a string. // // Return value: string // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT string SimpleItoa(int i); LIBPROTOBUF_EXPORT string SimpleItoa(unsigned int i); LIBPROTOBUF_EXPORT string SimpleItoa(long i); LIBPROTOBUF_EXPORT string SimpleItoa(unsigned long i); LIBPROTOBUF_EXPORT string SimpleItoa(long long i); LIBPROTOBUF_EXPORT 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 // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT string SimpleDtoa(double value); LIBPROTOBUF_EXPORT string SimpleFtoa(float value); LIBPROTOBUF_EXPORT char* DoubleToBuffer(double i, char* buffer); LIBPROTOBUF_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 value; enum PadSpec spec; template 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(v) : sizeof(v) == 2 ? static_cast(v) : sizeof(v) == 4 ? static_cast(v) : static_cast(v); } }; struct LIBPROTOBUF_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(int32 i32) : piece_data_(digits), piece_size_(FastInt32ToBufferLeft(i32, digits) - &digits[0]) {} AlphaNum(uint32 u32) : piece_data_(digits), piece_size_(FastUInt32ToBufferLeft(u32, digits) - &digits[0]) {} AlphaNum(int64 i64) : piece_data_(digits), piece_size_(FastInt64ToBufferLeft(i64, digits) - &digits[0]) {} AlphaNum(uint64 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 string& str) : piece_data_(str.data()), piece_size_(str.size()) {} AlphaNum(StringPiece str) : piece_data_(str.data()), piece_size_(str.size()) {} AlphaNum(internal::StringPiecePod 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&); }; } // 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. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT string StrCat(const AlphaNum& a, const AlphaNum& b); LIBPROTOBUF_EXPORT string StrCat(const AlphaNum& a, const AlphaNum& b, const AlphaNum& c); LIBPROTOBUF_EXPORT string StrCat(const AlphaNum& a, const AlphaNum& b, const AlphaNum& c, const AlphaNum& d); LIBPROTOBUF_EXPORT string StrCat(const AlphaNum& a, const AlphaNum& b, const AlphaNum& c, const AlphaNum& d, const AlphaNum& e); LIBPROTOBUF_EXPORT string StrCat(const AlphaNum& a, const AlphaNum& b, const AlphaNum& c, const AlphaNum& d, const AlphaNum& e, const AlphaNum& f); LIBPROTOBUF_EXPORT string StrCat(const AlphaNum& a, const AlphaNum& b, const AlphaNum& c, const AlphaNum& d, const AlphaNum& e, const AlphaNum& f, const AlphaNum& g); LIBPROTOBUF_EXPORT 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); LIBPROTOBUF_EXPORT 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 string StrCat(const AlphaNum& a) { return 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. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT void StrAppend(string* dest, const AlphaNum& a); LIBPROTOBUF_EXPORT void StrAppend(string* dest, const AlphaNum& a, const AlphaNum& b); LIBPROTOBUF_EXPORT void StrAppend(string* dest, const AlphaNum& a, const AlphaNum& b, const AlphaNum& c); LIBPROTOBUF_EXPORT void StrAppend(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 void Join(Iterator start, Iterator end, const char* delim, string* result) { for (Iterator it = start; it != end; ++it) { if (it != start) { result->append(delim); } StrAppend(result, *it); } } template string Join(const Range& components, const char* delim) { string result; Join(components.begin(), components.end(), delim, &result); return result; } // ---------------------------------------------------------------------- // ToHex() // Return a lower-case hex string representation of the given integer. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT string ToHex(uint64 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. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT int GlobalReplaceSubstring(const string& substring, const string& replacement, 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. // ---------------------------------------------------------------------- LIBPROTOBUF_EXPORT bool Base64Unescape(StringPiece src, 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 #include #include #include #include #ifdef _WIN32 #define snprintf _snprintf #endif namespace google { namespace protobuf { namespace { // TODO(kenton): Copy strutil tests from google3? TEST(StringUtilityTest, ImmuneToLocales) { // Remember the old locale. char* old_locale_cstr = setlocale(LC_NUMERIC, NULL); ASSERT_TRUE(old_locale_cstr != NULL); string old_locale = old_locale_cstr; // Set the locale to "C". ASSERT_TRUE(setlocale(LC_NUMERIC, "C") != NULL); EXPECT_EQ("1.5", SimpleDtoa(1.5)); EXPECT_EQ("1.5", SimpleFtoa(1.5)); if (setlocale(LC_NUMERIC, "es_ES") == NULL && setlocale(LC_NUMERIC, "es_ES.utf8") == NULL) { // Some systems may not have the desired locale available. GOOGLE_LOG(WARNING) << "Couldn't set locale to es_ES. Skipping this test."; } else { EXPECT_EQ("1.5", SimpleDtoa(1.5)); EXPECT_EQ("1.5", SimpleFtoa(1.5)); } // Return to original locale. 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* cyphertext; } 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* cyphertext; } base64_strings[] = { // Some google quotes // Cyphertext 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 cypher_length; string decode_str; const unsigned char* unsigned_plaintext = reinterpret_cast(base64_tests[i].plaintext); StringPiece plaintext(base64_tests[i].plaintext, base64_tests[i].plain_length); cypher_length = strlen(base64_tests[i].cyphertext); // 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, cypher_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].cyphertext); // 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, cypher_length); // Is it still of the expected length? EXPECT_EQ(encode_length, cypher_length); // And is the value still correct? (i.e., not losing the last byte) EXPECT_STREQ(encode_buffer, base64_tests[i].cyphertext); // If we decode it back: decode_str.clear(); EXPECT_TRUE(Base64Unescape( StringPiece(encode_buffer, cypher_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. string encoded("this junk should be ignored"); Base64Escape(string(base64_tests[i].plaintext, base64_tests[i].plain_length), &encoded); EXPECT_EQ(encoded, string(encode_buffer, cypher_length)); string decoded("this junk should be ignored"); EXPECT_TRUE(Base64Unescape( StringPiece(encode_buffer, cypher_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. 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].cyphertext, cypher_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, cypher_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, cypher_length, true); // Is it still of the expected length? EXPECT_EQ(encode_length, cypher_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(), cypher_length); EXPECT_STREQ(encoded.c_str(), websafe); // If we decode it back: memset(decode_buffer, 0, sizeof(decode_buffer)); decode_length = WebSafeBase64Unescape(encode_buffer, cypher_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, cypher_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 = cypher_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, cypher_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, cypher_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, cypher_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'; cypher_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, cypher_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, cypher_length, false); // Is it still of the expected length? EXPECT_EQ(encode_length, cypher_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 string plain(base64_tests[i].plaintext, base64_tests[i].plain_length); encoded = "this junk should be ignored"; WebSafeBase64Escape(plain, &encoded); EXPECT_EQ(encoded.size(), cypher_length); EXPECT_STREQ(encoded.c_str(), websafe); // If we decode it back: memset(decode_buffer, 0, sizeof(decode_buffer)); decode_length = WebSafeBase64Unescape(encode_buffer, cypher_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, cypher_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, cypher_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(base64_strings[i].plaintext); int plain_length = strlen(base64_strings[i].plaintext); int cypher_length = strlen(base64_strings[i].cyphertext); vector buffer(cypher_length+1); int encode_length = WebSafeBase64Escape(unsigned_plaintext, plain_length, &buffer[0], buffer.size(), false); EXPECT_EQ(cypher_length, encode_length); EXPECT_EQ( CalculateBase64EscapedLen(plain_length, false), encode_length); buffer[ encode_length ] = '\0'; EXPECT_STREQ(base64_strings[i].cyphertext, &buffer[0]); } // Verify the behavior when decoding bad data { const char* bad_data = "ab-/"; string buf; EXPECT_FALSE(Base64Unescape(StringPiece(bad_data), &buf)); EXPECT_TRUE(!WebSafeBase64Unescape(bad_data, &buf)); EXPECT_TRUE(buf.empty()); } } } // anonymous namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/substitute.cc000066400000000000000000000116201334102242000311530ustar00rootroot00000000000000// 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 #include #include 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] != NULL && args_array[count]->size() != -1) { ++count; } return count; } string Substitute( 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) { string result; SubstituteAndAppend(&result, format, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); return result; } void SubstituteAndAppend( 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, NULL }; // 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 python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/substitute.h000066400000000000000000000166761334102242000310350ustar00rootroot00000000000000// 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 #include #include #ifndef GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_ #define GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_ 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 string& value) : text_(value.data()), size_(value.size()) {} // Indicates that no argument was given. inline explicit SubstituteArg() : text_(NULL), 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 LIBPROTOBUF_EXPORT string Substitute( 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()); LIBPROTOBUF_EXPORT void SubstituteAndAppend( 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 #endif // GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/template_util.h000066400000000000000000000113421334102242000314530ustar00rootroot00000000000000// 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 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 struct integral_constant { static const T value = v; typedef T value_type; typedef integral_constant type; }; template const T integral_constant::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 true_type; typedef integral_constant false_type; typedef true_type true_; typedef false_type false_; // if_ is a templatized conditional statement. // if_ is a compile time evaluation of cond. // if_<>::type contains A if cond is true, B otherwise. template struct if_{ typedef A type; }; template struct if_ { typedef B type; }; // type_equals_ is a template type comparator, similar to Loki IsSameType. // type_equals_::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 struct type_equals_ : public false_ { }; template struct type_equals_ : public true_ { }; // and_ is a template && operator. // and_::value evaluates "A::value && B::value". template struct and_ : public integral_constant { }; // or_ is a template || operator. // or_::value evaluates "A::value || B::value". template struct or_ : public integral_constant { }; } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_TEMPLATE_UTIL_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/template_util_unittest.cc000066400000000000000000000101711334102242000335470ustar00rootroot00000000000000// 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 #include #include 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 one_type; EXPECT_EQ(1, one_type::value); } TEST(TemplateUtilTest, TestTemplateIf) { typedef if_::type if_true; EXPECT_TRUE(if_true::value); typedef if_::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_::value; EXPECT_TRUE(value); // Test different types are false. value = type_equals_::value; EXPECT_FALSE(value); // Test type aliasing. typedef const int foo; value = type_equals_::value; EXPECT_TRUE(value); } TEST(TemplateUtilTest, TestTemplateAndOr) { // Check that the TemplateTypeEquals works correctly. bool value = false; // Yes && Yes == true. value = and_::value; EXPECT_TRUE(value); // Yes && No == false. value = and_::value; EXPECT_FALSE(value); // No && Yes == false. value = and_::value; EXPECT_FALSE(value); // No && No == false. value = and_::value; EXPECT_FALSE(value); // Yes || Yes == true. value = or_::value; EXPECT_TRUE(value); // Yes || No == true. value = or_::value; EXPECT_TRUE(value); // No || Yes == true. value = or_::value; EXPECT_TRUE(value); // No || No == false. value = or_::value; EXPECT_FALSE(value); } TEST(TemplateUtilTest, TestIdentity) { EXPECT_TRUE( (type_equals_::type, int>::value)); EXPECT_TRUE( (type_equals_::type, void>::value)); } } // anonymous namespace } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/time.cc000066400000000000000000000236231334102242000277040ustar00rootroot00000000000000#include #include #include #include namespace google { namespace protobuf { namespace internal { namespace { static const int64 kSecondsPerMinute = 60; static const int64 kSecondsPerHour = 3600; static const int64 kSecondsPerDay = kSecondsPerHour * 24; static const int64 kSecondsPer400Years = kSecondsPerDay * (400 * 365 + 400 / 4 - 3); // Seconds from 0001-01-01T00:00:00 to 1970-01-01T:00:00:00 static const int64 kSecondsFromEraToEpoch = 62135596800LL; // The range of timestamp values we support. static const int64 kMinTime = -62135596800LL; // 0001-01-01T00:00:00 static const int64 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 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 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 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 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.month <= kDaysInMonth[time.month] + 1; } else { return time.month <= kDaysInMonth[time.month]; } } // Count the number of seconds elapsed from 0001-01-01T00:00:00 to the given // time. int64 SecondsSinceCommonEra(const DateTime& time) { int64 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. string FormatNanos(int32 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 NULL 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 NULL; } 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 NULL; } } // 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* nanos) { if (!ascii_isdigit(*data)) { return NULL; } 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* offset) { // Accept format "HH:MM". E.g., "08:00" int hour; if ((data = ParseInt(data, 2, 0, 23, &hour)) == NULL) { return NULL; } if (*data++ != ':') { return NULL; } int minute; if ((data = ParseInt(data, 2, 0, 59, &minute)) == NULL) { return NULL; } *offset = (hour * 60 + minute) * 60; return data; } } // namespace bool SecondsToDateTime(int64 seconds, DateTime* time) { if (seconds < kMinTime || seconds > kMaxTime) { return false; } // It's easier to calcuate 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(seconds); return true; } bool DateTimeToSeconds(const DateTime& time, int64* seconds) { if (!ValidateDateTime(time)) { return false; } *seconds = SecondsSinceCommonEra(time) - kSecondsFromEraToEpoch; return true; } void GetCurrentTime(int64* seconds, int32* nanos) { // TODO(xiaofeng): Improve the accuracy of this implementation (or just // remove this method from protobuf). *seconds = time(NULL); *nanos = 0; } string FormatTime(int64 seconds, int32 nanos) { DateTime time; if (nanos < 0 || nanos > 999999999 || !SecondsToDateTime(seconds, &time)) { return "InvalidTime"; } 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 string& value, int64* seconds, int32* 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)) == NULL) { return false; } // Expect '-' if (*data++ != '-') return false; // Parse month if ((data = ParseInt(data, 2, 1, 12, &time.month)) == NULL) { return false; } // Expect '-' if (*data++ != '-') return false; // Parse day if ((data = ParseInt(data, 2, 1, 31, &time.day)) == NULL) { return false; } // Expect 'T' if (*data++ != 'T') return false; // Parse hour if ((data = ParseInt(data, 2, 0, 23, &time.hour)) == NULL) { return false; } // Expect ':' if (*data++ != ':') return false; // Parse minute if ((data = ParseInt(data, 2, 0, 59, &time.minute)) == NULL) { return false; } // Expect ':' if (*data++ != ':') return false; // Parse second if ((data = ParseInt(data, 2, 0, 59, &time.second)) == NULL) { return false; } if (!DateTimeToSeconds(time, seconds)) { return false; } // Parse nanoseconds. if (*data == '.') { ++data; // Parse nanoseconds. if ((data = ParseNanos(data, nanos)) == NULL) { return false; } } else { *nanos = 0; } // Parse UTC offsets. if (*data == 'Z') { ++data; } else if (*data == '+') { ++data; int64 offset; if ((data = ParseTimezoneOffset(data, &offset)) == NULL) { return false; } *seconds -= offset; } else if (*data == '-') { ++data; int64 offset; if ((data = ParseTimezoneOffset(data, &offset)) == NULL) { return false; } *seconds += offset; } else { return false; } // Done with parsing. return *data == 0; } } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/time.h000066400000000000000000000062561334102242000275510ustar00rootroot00000000000000// 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 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 LIBPROTOBUF_EXPORT SecondsToDateTime(int64 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 LIBPROTOBUF_EXPORT DateTimeToSeconds(const DateTime& time, int64* seconds); void LIBPROTOBUF_EXPORT GetCurrentTime(int64* seconds, int32* nanos); // Formats a time string in RFC3339 fromat. // // 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]. string LIBPROTOBUF_EXPORT FormatTime(int64 seconds, int32 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 LIBPROTOBUF_EXPORT ParseTime(const string& value, int64* seconds, int32* nanos); } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_STUBS_TIME_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/time_test.cc000066400000000000000000000174461334102242000307510ustar00rootroot00000000000000// 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 #include #include namespace google { namespace protobuf { namespace internal { namespace { static const int64 kSecondsPerDay = 3600 * 24; // For DateTime, tests will mostly focuse 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, 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 formated 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 python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/type_traits.h000066400000000000000000000363761334102242000311700ustar00rootroot00000000000000// 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. // ---- // Author: Matt Austern // // 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. // // Define a small subset of tr1 type traits. The traits we define are: // enable_if // is_integral // is_floating_point // is_pointer // is_enum // is_reference // is_pod // has_trivial_constructor // has_trivial_copy // has_trivial_assign // has_trivial_destructor // remove_const // remove_volatile // remove_cv // remove_reference // add_reference // remove_pointer // is_same // is_convertible // We can add more type traits as required. #ifndef GOOGLE_PROTOBUF_TYPE_TRAITS_H_ #define GOOGLE_PROTOBUF_TYPE_TRAITS_H_ #include // for NULL #include // For pair #include // For true_type and false_type namespace google { namespace protobuf { namespace internal { template struct is_base_of { typedef char (&yes)[1]; typedef char (&no)[2]; // BEGIN GOOGLE LOCAL MODIFICATION -- check is a #define on Mac. #undef check // END GOOGLE LOCAL MODIFICATION static yes check(const B*); static no check(const void*); enum { value = sizeof(check(static_cast(NULL))) == sizeof(yes), }; }; template struct enable_if; template struct is_integral; template struct is_floating_point; template struct is_pointer; // MSVC can't compile this correctly, and neither can gcc 3.3.5 (at least) #if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) // is_enum uses is_convertible, which is not available on MSVC. template struct is_enum; #endif template struct is_reference; template struct is_pod; template struct has_trivial_constructor; template struct has_trivial_copy; template struct has_trivial_assign; template struct has_trivial_destructor; template struct remove_const; template struct remove_volatile; template struct remove_cv; template struct remove_reference; template struct add_reference; template struct remove_pointer; template struct is_same; #if !(defined(__GNUC__) && __GNUC__ <= 3) template struct is_convertible; #endif // enable_if, equivalent semantics to c++11 std::enable_if, specifically: // "If B is true, the member typedef type shall equal T; otherwise, there // shall be no member typedef type." // Specified by 20.9.7.6 [Other transformations] template struct enable_if { typedef T type; }; template struct enable_if {}; // is_integral is false except for the built-in integer types. A // cv-qualified type is integral if and only if the underlying type is. template struct is_integral : false_type { }; template<> struct is_integral : true_type { }; template<> struct is_integral : true_type { }; template<> struct is_integral : true_type { }; template<> struct is_integral : true_type { }; #if defined(_MSC_VER) // wchar_t is not by default a distinct type from unsigned short in // Microsoft C. // See http://msdn2.microsoft.com/en-us/library/dh8che7s(VS.80).aspx template<> struct is_integral<__wchar_t> : true_type { }; #else template<> struct is_integral : true_type { }; #endif template<> struct is_integral : true_type { }; template<> struct is_integral : true_type { }; template<> struct is_integral : true_type { }; template<> struct is_integral : true_type { }; template<> struct is_integral : true_type { }; template<> struct is_integral : true_type { }; #if defined(HAVE_LONG_LONG) || defined(_MSC_VER) template<> struct is_integral : true_type { }; template<> struct is_integral : true_type { }; #endif template struct is_integral : is_integral { }; template struct is_integral : is_integral { }; template struct is_integral : is_integral { }; // is_floating_point is false except for the built-in floating-point types. // A cv-qualified type is integral if and only if the underlying type is. template struct is_floating_point : false_type { }; template<> struct is_floating_point : true_type { }; template<> struct is_floating_point : true_type { }; template<> struct is_floating_point : true_type { }; template struct is_floating_point : is_floating_point { }; template struct is_floating_point : is_floating_point { }; template struct is_floating_point : is_floating_point { }; // is_pointer is false except for pointer types. A cv-qualified type (e.g. // "int* const", as opposed to "int const*") is cv-qualified if and only if // the underlying type is. template struct is_pointer : false_type { }; template struct is_pointer : true_type { }; template struct is_pointer : is_pointer { }; template struct is_pointer : is_pointer { }; template struct is_pointer : is_pointer { }; #if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) namespace type_traits_internal { template struct is_class_or_union { template static small_ tester(void (U::*)()); template static big_ tester(...); static const bool value = sizeof(tester(0)) == sizeof(small_); }; // is_convertible chokes if the first argument is an array. That's why // we use add_reference here. template struct is_enum_impl : is_convertible::type, int> { }; template struct is_enum_impl : false_type { }; } // namespace type_traits_internal // Specified by TR1 [4.5.1] primary type categories. // Implementation note: // // Each type is either void, integral, floating point, array, pointer, // reference, member object pointer, member function pointer, enum, // union or class. Out of these, only integral, floating point, reference, // class and enum types are potentially convertible to int. Therefore, // if a type is not a reference, integral, floating point or class and // is convertible to int, it's a enum. Adding cv-qualification to a type // does not change whether it's an enum. // // Is-convertible-to-int check is done only if all other checks pass, // because it can't be used with some types (e.g. void or classes with // inaccessible conversion operators). template struct is_enum : type_traits_internal::is_enum_impl< is_same::value || is_integral::value || is_floating_point::value || is_reference::value || type_traits_internal::is_class_or_union::value, T> { }; template struct is_enum : is_enum { }; template struct is_enum : is_enum { }; template struct is_enum : is_enum { }; #endif // is_reference is false except for reference types. template struct is_reference : false_type {}; template struct is_reference : true_type {}; // We can't get is_pod right without compiler help, so fail conservatively. // We will assume it's false except for arithmetic types, enumerations, // pointers and cv-qualified versions thereof. Note that std::pair // is not a POD even if T and U are PODs. template struct is_pod : integral_constant::value || is_floating_point::value || #if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) // is_enum is not available on MSVC. is_enum::value || #endif is_pointer::value)> { }; template struct is_pod : is_pod { }; template struct is_pod : is_pod { }; template struct is_pod : is_pod { }; // We can't get has_trivial_constructor right without compiler help, so // fail conservatively. We will assume it's false except for: (1) types // for which is_pod is true. (2) std::pair of types with trivial // constructors. (3) array of a type with a trivial constructor. // (4) const versions thereof. template struct has_trivial_constructor : is_pod { }; template struct has_trivial_constructor > : integral_constant::value && has_trivial_constructor::value)> { }; template struct has_trivial_constructor : has_trivial_constructor { }; template struct has_trivial_constructor : has_trivial_constructor { }; // We can't get has_trivial_copy right without compiler help, so fail // conservatively. We will assume it's false except for: (1) types // for which is_pod is true. (2) std::pair of types with trivial copy // constructors. (3) array of a type with a trivial copy constructor. // (4) const versions thereof. template struct has_trivial_copy : is_pod { }; template struct has_trivial_copy > : integral_constant::value && has_trivial_copy::value)> { }; template struct has_trivial_copy : has_trivial_copy { }; template struct has_trivial_copy : has_trivial_copy { }; // We can't get has_trivial_assign right without compiler help, so fail // conservatively. We will assume it's false except for: (1) types // for which is_pod is true. (2) std::pair of types with trivial copy // constructors. (3) array of a type with a trivial assign constructor. template struct has_trivial_assign : is_pod { }; template struct has_trivial_assign > : integral_constant::value && has_trivial_assign::value)> { }; template struct has_trivial_assign : has_trivial_assign { }; // We can't get has_trivial_destructor right without compiler help, so // fail conservatively. We will assume it's false except for: (1) types // for which is_pod is true. (2) std::pair of types with trivial // destructors. (3) array of a type with a trivial destructor. // (4) const versions thereof. template struct has_trivial_destructor : is_pod { }; template struct has_trivial_destructor > : integral_constant::value && has_trivial_destructor::value)> { }; template struct has_trivial_destructor : has_trivial_destructor { }; template struct has_trivial_destructor : has_trivial_destructor { }; // Specified by TR1 [4.7.1] template struct remove_const { typedef T type; }; template struct remove_const { typedef T type; }; template struct remove_volatile { typedef T type; }; template struct remove_volatile { typedef T type; }; template struct remove_cv { typedef typename remove_const::type>::type type; }; // Specified by TR1 [4.7.2] Reference modifications. template struct remove_reference { typedef T type; }; template struct remove_reference { typedef T type; }; template struct add_reference { typedef T& type; }; template struct add_reference { typedef T& type; }; // Specified by TR1 [4.7.4] Pointer modifications. template struct remove_pointer { typedef T type; }; template struct remove_pointer { typedef T type; }; template struct remove_pointer { typedef T type; }; template struct remove_pointer { typedef T type; }; template struct remove_pointer { typedef T type; }; // Specified by TR1 [4.6] Relationships between types template struct is_same : public false_type { }; template struct is_same : public true_type { }; // Specified by TR1 [4.6] Relationships between types #if !(defined(__GNUC__) && __GNUC__ <= 3) namespace type_traits_internal { // This class is an implementation detail for is_convertible, and you // don't need to know how it works to use is_convertible. For those // who care: we declare two different functions, one whose argument is // of type To and one with a variadic argument list. We give them // return types of different size, so we can use sizeof to trick the // compiler into telling us which function it would have chosen if we // had called it with an argument of type From. See Alexandrescu's // _Modern C++ Design_ for more details on this sort of trick. template struct ConvertHelper { static small_ Test(To); static big_ Test(...); static From Create(); enum { value = sizeof(Test(Create())) == sizeof(small_) }; }; } // namespace type_traits_internal // Inherits from true_type if From is convertible to To, false_type otherwise. template struct is_convertible : integral_constant::value> { }; #endif } // namespace internal } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_TYPE_TRAITS_H_ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc000066400000000000000000000572031334102242000332550ustar00rootroot00000000000000// 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. // ---- // Author: Matt Austern #include #include // for exit() #include #include #include #include #include typedef int int32; // IBM AIX typedefs `int64` in `sys/inttypes.h`, included transitively above. #ifndef _AIX typedef long int64; #endif using std::string; using std::vector; using std::pair; // This assertion produces errors like "error: invalid use of // incomplete type 'struct ::AssertTypesEq'" // when it fails. template struct AssertTypesEq; template struct AssertTypesEq {}; #define COMPILE_ASSERT_TYPES_EQ(T, U) static_cast(AssertTypesEq()) // A user-defined POD type. struct A { int n_; }; // A user-defined non-POD type with a trivial copy constructor. class B { public: explicit B(int n) : n_(n) { } private: int n_; }; // Another user-defined non-POD type with a trivial copy constructor. // We will explicitly declare C to have a trivial copy constructor // by specializing has_trivial_copy. class C { public: explicit C(int n) : n_(n) { } private: int n_; }; namespace google { namespace protobuf { namespace internal { template<> struct has_trivial_copy : true_type { }; } // namespace internal } // namespace protobuf } // namespace google // Another user-defined non-POD type with a trivial assignment operator. // We will explicitly declare C to have a trivial assignment operator // by specializing has_trivial_assign. class D { public: explicit D(int n) : n_(n) { } private: int n_; }; namespace google { namespace protobuf { namespace internal { template<> struct has_trivial_assign : true_type { }; } // namespace internal } // namespace protobuf } // namespace google // Another user-defined non-POD type with a trivial constructor. // We will explicitly declare E to have a trivial constructor // by specializing has_trivial_constructor. class E { public: int n_; }; namespace google { namespace protobuf { namespace internal { template<> struct has_trivial_constructor : true_type { }; } // namespace internal } // namespace protobuf } // namespace google // Another user-defined non-POD type with a trivial destructor. // We will explicitly declare E to have a trivial destructor // by specializing has_trivial_destructor. class F { public: explicit F(int n) : n_(n) { } private: int n_; }; namespace google { namespace protobuf { namespace internal { template<> struct has_trivial_destructor : true_type { }; } // namespace internal } // namespace protobuf } // namespace google enum G {}; union H {}; class I { public: operator int() const; }; class J { private: operator int() const; }; namespace google { namespace protobuf { namespace internal { namespace { // A base class and a derived class that inherits from it, used for // testing conversion type traits. class Base { public: virtual ~Base() { } }; class Derived : public Base { }; TEST(TypeTraitsTest, TestIsInteger) { // Verify that is_integral is true for all integer types. EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); // Verify that is_integral is false for a few non-integer types. EXPECT_FALSE(is_integral::value); EXPECT_FALSE(is_integral::value); EXPECT_FALSE(is_integral::value); EXPECT_FALSE(is_integral::value); EXPECT_FALSE(is_integral::value); EXPECT_FALSE((is_integral >::value)); // Verify that cv-qualified integral types are still integral, and // cv-qualified non-integral types are still non-integral. EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); EXPECT_TRUE(is_integral::value); EXPECT_FALSE(is_integral::value); EXPECT_FALSE(is_integral::value); EXPECT_FALSE(is_integral::value); } TEST(TypeTraitsTest, TestIsFloating) { // Verify that is_floating_point is true for all floating-point types. EXPECT_TRUE(is_floating_point::value); EXPECT_TRUE(is_floating_point::value); EXPECT_TRUE(is_floating_point::value); // Verify that is_floating_point is false for a few non-float types. EXPECT_FALSE(is_floating_point::value); EXPECT_FALSE(is_floating_point::value); EXPECT_FALSE(is_floating_point::value); EXPECT_FALSE(is_floating_point::value); EXPECT_FALSE(is_floating_point::value); EXPECT_FALSE((is_floating_point >::value)); // Verify that cv-qualified floating point types are still floating, and // cv-qualified non-floating types are still non-floating. EXPECT_TRUE(is_floating_point::value); EXPECT_TRUE(is_floating_point::value); EXPECT_TRUE(is_floating_point::value); EXPECT_FALSE(is_floating_point::value); EXPECT_FALSE(is_floating_point::value); EXPECT_FALSE(is_floating_point::value); } TEST(TypeTraitsTest, TestIsPointer) { // Verify that is_pointer is true for some pointer types. EXPECT_TRUE(is_pointer::value); EXPECT_TRUE(is_pointer::value); EXPECT_TRUE(is_pointer::value); EXPECT_TRUE(is_pointer::value); EXPECT_TRUE(is_pointer::value); // Verify that is_pointer is false for some non-pointer types. EXPECT_FALSE(is_pointer::value); EXPECT_FALSE(is_pointer::value); EXPECT_FALSE(is_pointer::value); EXPECT_FALSE(is_pointer >::value); EXPECT_FALSE(is_pointer::value); // A function pointer is a pointer, but a function type, or a function // reference type, is not. EXPECT_TRUE(is_pointer::value); EXPECT_FALSE(is_pointer::value); EXPECT_FALSE(is_pointer::value); // Verify that is_pointer is true for some cv-qualified pointer types, // and false for some cv-qualified non-pointer types. EXPECT_TRUE(is_pointer::value); EXPECT_TRUE(is_pointer::value); EXPECT_TRUE(is_pointer::value); EXPECT_FALSE(is_pointer::value); EXPECT_FALSE(is_pointer >::value); EXPECT_FALSE(is_pointer::value); } TEST(TypeTraitsTest, TestIsEnum) { // is_enum isn't supported on MSVC or gcc 3.x #if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) // Verify that is_enum is true for enum types. EXPECT_TRUE(is_enum::value); EXPECT_TRUE(is_enum::value); EXPECT_TRUE(is_enum::value); EXPECT_TRUE(is_enum::value); // Verify that is_enum is false for a few non-enum types. EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); EXPECT_FALSE(is_enum::value); #endif } TEST(TypeTraitsTest, TestIsReference) { // Verifies that is_reference is true for all reference types. typedef float& RefFloat; EXPECT_TRUE(is_reference::value); EXPECT_TRUE(is_reference::value); EXPECT_TRUE(is_reference::value); EXPECT_TRUE(is_reference::value); EXPECT_TRUE(is_reference::value); EXPECT_TRUE(is_reference::value); EXPECT_TRUE(is_reference::value); EXPECT_TRUE(is_reference::value); // Verifies that is_reference is false for all non-reference types. EXPECT_FALSE(is_reference::value); EXPECT_FALSE(is_reference::value); EXPECT_FALSE(is_reference::value); EXPECT_FALSE(is_reference::value); EXPECT_FALSE(is_reference::value); EXPECT_FALSE(is_reference::value); EXPECT_FALSE(is_reference::value); } TEST(TypeTraitsTest, TestAddReference) { COMPILE_ASSERT_TYPES_EQ(int&, add_reference::type); COMPILE_ASSERT_TYPES_EQ(const int&, add_reference::type); COMPILE_ASSERT_TYPES_EQ(volatile int&, add_reference::type); COMPILE_ASSERT_TYPES_EQ(const volatile int&, add_reference::type); COMPILE_ASSERT_TYPES_EQ(int&, add_reference::type); COMPILE_ASSERT_TYPES_EQ(const int&, add_reference::type); COMPILE_ASSERT_TYPES_EQ(volatile int&, add_reference::type); COMPILE_ASSERT_TYPES_EQ(const volatile int&, add_reference::type); } TEST(TypeTraitsTest, TestIsPod) { // Verify that arithmetic types and pointers are marked as PODs. EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); #if !defined(_MSC_VER) && !(defined(__GNUC__) && __GNUC__ <= 3) EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); EXPECT_TRUE(is_pod::value); #endif // Verify that some non-POD types are not marked as PODs. EXPECT_FALSE(is_pod::value); EXPECT_FALSE(is_pod::value); EXPECT_FALSE((is_pod >::value)); EXPECT_FALSE(is_pod::value); EXPECT_FALSE(is_pod::value); EXPECT_FALSE(is_pod::value); EXPECT_FALSE(is_pod::value); EXPECT_FALSE(is_pod::value); EXPECT_FALSE(is_pod::value); } TEST(TypeTraitsTest, TestHasTrivialConstructor) { // Verify that arithmetic types and pointers have trivial constructors. EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); EXPECT_TRUE(has_trivial_constructor::value); // Verify that pairs and arrays of such types have trivial // constructors. typedef int int10[10]; EXPECT_TRUE((has_trivial_constructor >::value)); EXPECT_TRUE(has_trivial_constructor::value); // Verify that pairs of types without trivial constructors // are not marked as trivial. EXPECT_FALSE((has_trivial_constructor >::value)); EXPECT_FALSE((has_trivial_constructor >::value)); // Verify that types without trivial constructors are // correctly marked as such. EXPECT_FALSE(has_trivial_constructor::value); EXPECT_FALSE(has_trivial_constructor >::value); // Verify that E, which we have declared to have a trivial // constructor, is correctly marked as such. EXPECT_TRUE(has_trivial_constructor::value); } TEST(TypeTraitsTest, TestHasTrivialCopy) { // Verify that arithmetic types and pointers have trivial copy // constructors. EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); EXPECT_TRUE(has_trivial_copy::value); // Verify that pairs and arrays of such types have trivial // copy constructors. typedef int int10[10]; EXPECT_TRUE((has_trivial_copy >::value)); EXPECT_TRUE(has_trivial_copy::value); // Verify that pairs of types without trivial copy constructors // are not marked as trivial. EXPECT_FALSE((has_trivial_copy >::value)); EXPECT_FALSE((has_trivial_copy >::value)); // Verify that types without trivial copy constructors are // correctly marked as such. EXPECT_FALSE(has_trivial_copy::value); EXPECT_FALSE(has_trivial_copy >::value); // Verify that C, which we have declared to have a trivial // copy constructor, is correctly marked as such. EXPECT_TRUE(has_trivial_copy::value); } TEST(TypeTraitsTest, TestHasTrivialAssign) { // Verify that arithmetic types and pointers have trivial assignment // operators. EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); EXPECT_TRUE(has_trivial_assign::value); // Verify that pairs and arrays of such types have trivial // assignment operators. typedef int int10[10]; EXPECT_TRUE((has_trivial_assign >::value)); EXPECT_TRUE(has_trivial_assign::value); // Verify that pairs of types without trivial assignment operators // are not marked as trivial. EXPECT_FALSE((has_trivial_assign >::value)); EXPECT_FALSE((has_trivial_assign >::value)); // Verify that types without trivial assignment operators are // correctly marked as such. EXPECT_FALSE(has_trivial_assign::value); EXPECT_FALSE(has_trivial_assign >::value); // Verify that D, which we have declared to have a trivial // assignment operator, is correctly marked as such. EXPECT_TRUE(has_trivial_assign::value); } TEST(TypeTraitsTest, TestHasTrivialDestructor) { // Verify that arithmetic types and pointers have trivial destructors. EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); EXPECT_TRUE(has_trivial_destructor::value); // Verify that pairs and arrays of such types have trivial // destructors. typedef int int10[10]; EXPECT_TRUE((has_trivial_destructor >::value)); EXPECT_TRUE(has_trivial_destructor::value); // Verify that pairs of types without trivial destructors // are not marked as trivial. EXPECT_FALSE((has_trivial_destructor >::value)); EXPECT_FALSE((has_trivial_destructor >::value)); // Verify that types without trivial destructors are // correctly marked as such. EXPECT_FALSE(has_trivial_destructor::value); EXPECT_FALSE(has_trivial_destructor >::value); // Verify that F, which we have declared to have a trivial // destructor, is correctly marked as such. EXPECT_TRUE(has_trivial_destructor::value); } // Tests remove_pointer. TEST(TypeTraitsTest, TestRemovePointer) { COMPILE_ASSERT_TYPES_EQ(int, remove_pointer::type); COMPILE_ASSERT_TYPES_EQ(int, remove_pointer::type); COMPILE_ASSERT_TYPES_EQ(const int, remove_pointer::type); COMPILE_ASSERT_TYPES_EQ(int, remove_pointer::type); COMPILE_ASSERT_TYPES_EQ(int, remove_pointer::type); } TEST(TypeTraitsTest, TestRemoveConst) { COMPILE_ASSERT_TYPES_EQ(int, remove_const::type); COMPILE_ASSERT_TYPES_EQ(int, remove_const::type); COMPILE_ASSERT_TYPES_EQ(int *, remove_const::type); // TR1 examples. COMPILE_ASSERT_TYPES_EQ(const int *, remove_const::type); COMPILE_ASSERT_TYPES_EQ(volatile int, remove_const::type); } TEST(TypeTraitsTest, TestRemoveVolatile) { COMPILE_ASSERT_TYPES_EQ(int, remove_volatile::type); COMPILE_ASSERT_TYPES_EQ(int, remove_volatile::type); COMPILE_ASSERT_TYPES_EQ(int *, remove_volatile::type); // TR1 examples. COMPILE_ASSERT_TYPES_EQ(volatile int *, remove_volatile::type); COMPILE_ASSERT_TYPES_EQ(const int, remove_volatile::type); } TEST(TypeTraitsTest, TestRemoveCV) { COMPILE_ASSERT_TYPES_EQ(int, remove_cv::type); COMPILE_ASSERT_TYPES_EQ(int, remove_cv::type); COMPILE_ASSERT_TYPES_EQ(int, remove_cv::type); COMPILE_ASSERT_TYPES_EQ(int *, remove_cv::type); // TR1 examples. COMPILE_ASSERT_TYPES_EQ(const volatile int *, remove_cv::type); COMPILE_ASSERT_TYPES_EQ(int, remove_cv::type); } TEST(TypeTraitsTest, TestRemoveReference) { COMPILE_ASSERT_TYPES_EQ(int, remove_reference::type); COMPILE_ASSERT_TYPES_EQ(int, remove_reference::type); COMPILE_ASSERT_TYPES_EQ(const int, remove_reference::type); COMPILE_ASSERT_TYPES_EQ(int*, remove_reference::type); } TEST(TypeTraitsTest, TestIsSame) { EXPECT_TRUE((is_same::value)); EXPECT_FALSE((is_same::value)); EXPECT_FALSE((is_same::value)); EXPECT_FALSE((is_same::value)); EXPECT_TRUE((is_same::value)); EXPECT_FALSE((is_same::value)); EXPECT_FALSE((is_same::value)); EXPECT_TRUE((is_same::value)); EXPECT_TRUE((is_same::value)); EXPECT_FALSE((is_same::value)); EXPECT_FALSE((is_same::value)); EXPECT_FALSE((is_same::value)); EXPECT_FALSE((is_same::value)); EXPECT_TRUE((is_same::value)); EXPECT_TRUE((is_same::value)); EXPECT_FALSE((is_same::value)); EXPECT_FALSE((is_same::value)); } TEST(TypeTraitsTest, TestConvertible) { #if !(defined(__GNUC__) && __GNUC__ <= 3) EXPECT_TRUE((is_convertible::value)); EXPECT_TRUE((is_convertible::value)); EXPECT_TRUE((is_convertible::value)); EXPECT_TRUE((is_convertible::value)); EXPECT_FALSE((is_convertible::value)); EXPECT_TRUE((is_convertible::value)); EXPECT_FALSE((is_convertible::value)); EXPECT_TRUE((is_convertible::value)); EXPECT_FALSE((is_convertible::value)); #endif } } // anonymous namespace } // namespace internal } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/test_messages_proto2.proto000066400000000000000000000172011334102242000325320ustar00rootroot00000000000000// 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 schema for proto2 messages. This test schema is used by: // // - conformance tests // syntax = "proto2"; package protobuf_test_messages.proto2; option java_package = "com.google.protobuf_test_messages.proto2"; // This is the default, but we specify it here explicitly. option optimize_for = SPEED; option cc_enable_arenas = true; // This proto includes every type of field in both singular and repeated // forms. // // Also, crucially, all messages and enums in this file are eventually // submessages of this message. So for example, a fuzz test of TestAllTypes // could trigger bugs that occur in any message type in this file. We verify // this stays true in a unit test. message TestAllTypesProto2 { message NestedMessage { optional int32 a = 1; optional TestAllTypesProto2 corecursive = 2; } enum NestedEnum { FOO = 0; BAR = 1; BAZ = 2; 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 NestedMessage optional_nested_message = 18; optional ForeignMessageProto2 optional_foreign_message = 19; optional NestedEnum optional_nested_enum = 21; optional ForeignEnumProto2 optional_foreign_enum = 22; optional string optional_string_piece = 24 [ctype=STRING_PIECE]; optional string optional_cord = 25 [ctype=CORD]; optional TestAllTypesProto2 recursive_message = 27; // 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 NestedMessage repeated_nested_message = 48; repeated ForeignMessageProto2 repeated_foreign_message = 49; repeated NestedEnum repeated_nested_enum = 51; repeated ForeignEnumProto2 repeated_foreign_enum = 52; repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; repeated string repeated_cord = 55 [ctype=CORD]; // Map map < int32, int32> map_int32_int32 = 56; map < int64, int64> map_int64_int64 = 57; map < uint32, uint32> map_uint32_uint32 = 58; map < uint64, uint64> map_uint64_uint64 = 59; map < sint32, sint32> map_sint32_sint32 = 60; map < sint64, sint64> map_sint64_sint64 = 61; map < fixed32, fixed32> map_fixed32_fixed32 = 62; map < fixed64, fixed64> map_fixed64_fixed64 = 63; map map_sfixed32_sfixed32 = 64; map map_sfixed64_sfixed64 = 65; map < int32, float> map_int32_float = 66; map < int32, double> map_int32_double = 67; map < bool, bool> map_bool_bool = 68; map < string, string> map_string_string = 69; map < string, bytes> map_string_bytes = 70; map < string, NestedMessage> map_string_nested_message = 71; map < string, ForeignMessageProto2> map_string_foreign_message = 72; map < string, NestedEnum> map_string_nested_enum = 73; map < string, ForeignEnumProto2> map_string_foreign_enum = 74; oneof oneof_field { uint32 oneof_uint32 = 111; NestedMessage oneof_nested_message = 112; string oneof_string = 113; bytes oneof_bytes = 114; bool oneof_bool = 115; uint64 oneof_uint64 = 116; float oneof_float = 117; double oneof_double = 118; NestedEnum oneof_enum = 119; } // extensions extensions 120 to 200; // groups optional group Data = 201 { optional int32 group_int32 = 202; optional uint32 group_uint32 = 203; }; // Test field-name-to-JSON-name convention. // (protobuf says names can be any valid C/C++ identifier.) optional int32 fieldname1 = 401; optional int32 field_name2 = 402; optional int32 _field_name3 = 403; optional int32 field__name4_ = 404; optional int32 field0name5 = 405; optional int32 field_0_name6 = 406; optional int32 fieldName7 = 407; optional int32 FieldName8 = 408; optional int32 field_Name9 = 409; optional int32 Field_Name10 = 410; optional int32 FIELD_NAME11 = 411; optional int32 FIELD_name12 = 412; optional int32 __field_name13 = 413; optional int32 __Field_name14 = 414; optional int32 field__name15 = 415; optional int32 field__Name16 = 416; optional int32 field_name17__ = 417; optional int32 Field_name18__ = 418; // message_set test case. message MessageSetCorrect { option message_set_wire_format = true; extensions 4 to max; } message MessageSetCorrectExtension1 { extend MessageSetCorrect { optional MessageSetCorrectExtension1 message_set_extension = 1547769; } optional string str = 25; } message MessageSetCorrectExtension2 { extend MessageSetCorrect { optional MessageSetCorrectExtension2 message_set_extension = 4135312; } optional int32 i = 9; } } message ForeignMessageProto2 { optional int32 c = 1; } enum ForeignEnumProto2 { FOREIGN_FOO = 0; FOREIGN_BAR = 1; FOREIGN_BAZ = 2; } extend TestAllTypesProto2 { optional int32 extension_int32 = 120; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/test_messages_proto3.proto000066400000000000000000000213251334102242000325350ustar00rootroot00000000000000// 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 schema for proto3 messages. This test schema is used by: // // - benchmarks // - fuzz tests // - conformance tests // syntax = "proto3"; package protobuf_test_messages.proto3; option java_package = "com.google.protobuf_test_messages.proto3"; option objc_class_prefix = "Proto3"; // This is the default, but we specify it here explicitly. option optimize_for = SPEED; import "google/protobuf/any.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/field_mask.proto"; import "google/protobuf/struct.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; option cc_enable_arenas = true; // This proto includes every type of field in both singular and repeated // forms. // // Also, crucially, all messages and enums in this file are eventually // submessages of this message. So for example, a fuzz test of TestAllTypes // could trigger bugs that occur in any message type in this file. We verify // this stays true in a unit test. message TestAllTypesProto3 { message NestedMessage { int32 a = 1; TestAllTypesProto3 corecursive = 2; } enum NestedEnum { FOO = 0; BAR = 1; BAZ = 2; NEG = -1; // Intentionally negative. } // Singular int32 optional_int32 = 1; int64 optional_int64 = 2; uint32 optional_uint32 = 3; uint64 optional_uint64 = 4; sint32 optional_sint32 = 5; sint64 optional_sint64 = 6; fixed32 optional_fixed32 = 7; fixed64 optional_fixed64 = 8; sfixed32 optional_sfixed32 = 9; sfixed64 optional_sfixed64 = 10; float optional_float = 11; double optional_double = 12; bool optional_bool = 13; string optional_string = 14; bytes optional_bytes = 15; NestedMessage optional_nested_message = 18; ForeignMessage optional_foreign_message = 19; NestedEnum optional_nested_enum = 21; ForeignEnum optional_foreign_enum = 22; string optional_string_piece = 24 [ctype=STRING_PIECE]; string optional_cord = 25 [ctype=CORD]; TestAllTypesProto3 recursive_message = 27; // 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 NestedMessage repeated_nested_message = 48; repeated ForeignMessage repeated_foreign_message = 49; repeated NestedEnum repeated_nested_enum = 51; repeated ForeignEnum repeated_foreign_enum = 52; repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; repeated string repeated_cord = 55 [ctype=CORD]; // Map map < int32, int32> map_int32_int32 = 56; map < int64, int64> map_int64_int64 = 57; map < uint32, uint32> map_uint32_uint32 = 58; map < uint64, uint64> map_uint64_uint64 = 59; map < sint32, sint32> map_sint32_sint32 = 60; map < sint64, sint64> map_sint64_sint64 = 61; map < fixed32, fixed32> map_fixed32_fixed32 = 62; map < fixed64, fixed64> map_fixed64_fixed64 = 63; map map_sfixed32_sfixed32 = 64; map map_sfixed64_sfixed64 = 65; map < int32, float> map_int32_float = 66; map < int32, double> map_int32_double = 67; map < bool, bool> map_bool_bool = 68; map < string, string> map_string_string = 69; map < string, bytes> map_string_bytes = 70; map < string, NestedMessage> map_string_nested_message = 71; map < string, ForeignMessage> map_string_foreign_message = 72; map < string, NestedEnum> map_string_nested_enum = 73; map < string, ForeignEnum> map_string_foreign_enum = 74; oneof oneof_field { uint32 oneof_uint32 = 111; NestedMessage oneof_nested_message = 112; string oneof_string = 113; bytes oneof_bytes = 114; bool oneof_bool = 115; uint64 oneof_uint64 = 116; float oneof_float = 117; double oneof_double = 118; NestedEnum oneof_enum = 119; } // Well-known types google.protobuf.BoolValue optional_bool_wrapper = 201; google.protobuf.Int32Value optional_int32_wrapper = 202; google.protobuf.Int64Value optional_int64_wrapper = 203; google.protobuf.UInt32Value optional_uint32_wrapper = 204; google.protobuf.UInt64Value optional_uint64_wrapper = 205; google.protobuf.FloatValue optional_float_wrapper = 206; google.protobuf.DoubleValue optional_double_wrapper = 207; google.protobuf.StringValue optional_string_wrapper = 208; google.protobuf.BytesValue optional_bytes_wrapper = 209; repeated google.protobuf.BoolValue repeated_bool_wrapper = 211; repeated google.protobuf.Int32Value repeated_int32_wrapper = 212; repeated google.protobuf.Int64Value repeated_int64_wrapper = 213; repeated google.protobuf.UInt32Value repeated_uint32_wrapper = 214; repeated google.protobuf.UInt64Value repeated_uint64_wrapper = 215; repeated google.protobuf.FloatValue repeated_float_wrapper = 216; repeated google.protobuf.DoubleValue repeated_double_wrapper = 217; repeated google.protobuf.StringValue repeated_string_wrapper = 218; repeated google.protobuf.BytesValue repeated_bytes_wrapper = 219; google.protobuf.Duration optional_duration = 301; google.protobuf.Timestamp optional_timestamp = 302; google.protobuf.FieldMask optional_field_mask = 303; google.protobuf.Struct optional_struct = 304; google.protobuf.Any optional_any = 305; google.protobuf.Value optional_value = 306; repeated google.protobuf.Duration repeated_duration = 311; repeated google.protobuf.Timestamp repeated_timestamp = 312; repeated google.protobuf.FieldMask repeated_fieldmask = 313; repeated google.protobuf.Struct repeated_struct = 324; repeated google.protobuf.Any repeated_any = 315; repeated google.protobuf.Value repeated_value = 316; // Test field-name-to-JSON-name convention. // (protobuf says names can be any valid C/C++ identifier.) int32 fieldname1 = 401; int32 field_name2 = 402; int32 _field_name3 = 403; int32 field__name4_ = 404; int32 field0name5 = 405; int32 field_0_name6 = 406; int32 fieldName7 = 407; int32 FieldName8 = 408; int32 field_Name9 = 409; int32 Field_Name10 = 410; int32 FIELD_NAME11 = 411; int32 FIELD_name12 = 412; int32 __field_name13 = 413; int32 __Field_name14 = 414; int32 field__name15 = 415; int32 field__Name16 = 416; int32 field_name17__ = 417; int32 Field_name18__ = 418; // Reserved for testing unknown fields reserved 501 to 510; } message ForeignMessage { int32 c = 1; } enum ForeignEnum { FOREIGN_FOO = 0; FOREIGN_BAR = 1; FOREIGN_BAZ = 2; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/test_util.cc000066400000000000000000005473571334102242000276410ustar00rootroot00000000000000// 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. #ifdef _WIN32 // Verify that #including windows.h does not break anything (e.g. because // windows.h #defines GetMessage() as a macro). #include #endif #include #include #include #include #include #include #include namespace google { namespace protobuf { void TestUtil::SetAllFields(unittest::TestAllTypes* message) { SetOptionalFields(message); AddRepeatedFields1(message); AddRepeatedFields2(message); SetDefaultFields(message); SetOneofFields(message); } void TestUtil::SetOptionalFields(unittest::TestAllTypes* message) { message->set_optional_int32 (101); message->set_optional_int64 (102); message->set_optional_uint32 (103); message->set_optional_uint64 (104); message->set_optional_sint32 (105); message->set_optional_sint64 (106); message->set_optional_fixed32 (107); message->set_optional_fixed64 (108); message->set_optional_sfixed32(109); message->set_optional_sfixed64(110); message->set_optional_float (111); message->set_optional_double (112); message->set_optional_bool (true); message->set_optional_string ("115"); message->set_optional_bytes ("116"); message->mutable_optionalgroup ()->set_a(117); message->mutable_optional_nested_message ()->set_bb(118); message->mutable_optional_foreign_message ()->set_c(119); message->mutable_optional_import_message ()->set_d(120); message->mutable_optional_public_import_message()->set_e(126); message->mutable_optional_lazy_message ()->set_bb(127); message->set_optional_nested_enum (unittest::TestAllTypes::BAZ); message->set_optional_foreign_enum(unittest::FOREIGN_BAZ ); message->set_optional_import_enum (unittest_import::IMPORT_BAZ); // StringPiece and Cord fields are only accessible via reflection in the // open source release; see comments in compiler/cpp/string_field.cc. #ifndef PROTOBUF_TEST_NO_DESCRIPTORS message->GetReflection()->SetString( message, message->GetDescriptor()->FindFieldByName("optional_string_piece"), "124"); message->GetReflection()->SetString( message, message->GetDescriptor()->FindFieldByName("optional_cord"), "125"); #endif // !PROTOBUF_TEST_NO_DESCRIPTORS } // ------------------------------------------------------------------- void TestUtil::AddRepeatedFields1(unittest::TestAllTypes* message) { message->add_repeated_int32 (201); message->add_repeated_int64 (202); message->add_repeated_uint32 (203); message->add_repeated_uint64 (204); message->add_repeated_sint32 (205); message->add_repeated_sint64 (206); message->add_repeated_fixed32 (207); message->add_repeated_fixed64 (208); message->add_repeated_sfixed32(209); message->add_repeated_sfixed64(210); message->add_repeated_float (211); message->add_repeated_double (212); message->add_repeated_bool (true); message->add_repeated_string ("215"); message->add_repeated_bytes ("216"); message->add_repeatedgroup ()->set_a(217); message->add_repeated_nested_message ()->set_bb(218); message->add_repeated_foreign_message()->set_c(219); message->add_repeated_import_message ()->set_d(220); message->add_repeated_lazy_message ()->set_bb(227); message->add_repeated_nested_enum (unittest::TestAllTypes::BAR); message->add_repeated_foreign_enum(unittest::FOREIGN_BAR ); message->add_repeated_import_enum (unittest_import::IMPORT_BAR); #ifndef PROTOBUF_TEST_NO_DESCRIPTORS message->GetReflection()->AddString( message, message->GetDescriptor()->FindFieldByName("repeated_string_piece"), "224"); message->GetReflection()->AddString( message, message->GetDescriptor()->FindFieldByName("repeated_cord"), "225"); #endif // !PROTOBUF_TEST_NO_DESCRIPTORS } void TestUtil::AddRepeatedFields2(unittest::TestAllTypes* message) { // Add a second one of each field. message->add_repeated_int32 (301); message->add_repeated_int64 (302); message->add_repeated_uint32 (303); message->add_repeated_uint64 (304); message->add_repeated_sint32 (305); message->add_repeated_sint64 (306); message->add_repeated_fixed32 (307); message->add_repeated_fixed64 (308); message->add_repeated_sfixed32(309); message->add_repeated_sfixed64(310); message->add_repeated_float (311); message->add_repeated_double (312); message->add_repeated_bool (false); message->add_repeated_string ("315"); message->add_repeated_bytes ("316"); message->add_repeatedgroup ()->set_a(317); message->add_repeated_nested_message ()->set_bb(318); message->add_repeated_foreign_message()->set_c(319); message->add_repeated_import_message ()->set_d(320); message->add_repeated_lazy_message ()->set_bb(327); message->add_repeated_nested_enum (unittest::TestAllTypes::BAZ); message->add_repeated_foreign_enum(unittest::FOREIGN_BAZ ); message->add_repeated_import_enum (unittest_import::IMPORT_BAZ); #ifndef PROTOBUF_TEST_NO_DESCRIPTORS message->GetReflection()->AddString( message, message->GetDescriptor()->FindFieldByName("repeated_string_piece"), "324"); message->GetReflection()->AddString( message, message->GetDescriptor()->FindFieldByName("repeated_cord"), "325"); #endif // !PROTOBUF_TEST_NO_DESCRIPTORS } // ------------------------------------------------------------------- void TestUtil::SetDefaultFields(unittest::TestAllTypes* message) { message->set_default_int32 (401); message->set_default_int64 (402); message->set_default_uint32 (403); message->set_default_uint64 (404); message->set_default_sint32 (405); message->set_default_sint64 (406); message->set_default_fixed32 (407); message->set_default_fixed64 (408); message->set_default_sfixed32(409); message->set_default_sfixed64(410); message->set_default_float (411); message->set_default_double (412); message->set_default_bool (false); message->set_default_string ("415"); message->set_default_bytes ("416"); message->set_default_nested_enum (unittest::TestAllTypes::FOO); message->set_default_foreign_enum(unittest::FOREIGN_FOO ); message->set_default_import_enum (unittest_import::IMPORT_FOO); #ifndef PROTOBUF_TEST_NO_DESCRIPTORS message->GetReflection()->SetString( message, message->GetDescriptor()->FindFieldByName("default_string_piece"), "424"); message->GetReflection()->SetString( message, message->GetDescriptor()->FindFieldByName("default_cord"), "425"); #endif // !PROTOBUF_TEST_NO_DESCRIPTORS } // ------------------------------------------------------------------- void TestUtil::ModifyRepeatedFields(unittest::TestAllTypes* message) { message->set_repeated_int32 (1, 501); message->set_repeated_int64 (1, 502); message->set_repeated_uint32 (1, 503); message->set_repeated_uint64 (1, 504); message->set_repeated_sint32 (1, 505); message->set_repeated_sint64 (1, 506); message->set_repeated_fixed32 (1, 507); message->set_repeated_fixed64 (1, 508); message->set_repeated_sfixed32(1, 509); message->set_repeated_sfixed64(1, 510); message->set_repeated_float (1, 511); message->set_repeated_double (1, 512); message->set_repeated_bool (1, true); message->set_repeated_string (1, "515"); message->set_repeated_bytes (1, "516"); message->mutable_repeatedgroup (1)->set_a(517); message->mutable_repeated_nested_message (1)->set_bb(518); message->mutable_repeated_foreign_message(1)->set_c(519); message->mutable_repeated_import_message (1)->set_d(520); message->mutable_repeated_lazy_message (1)->set_bb(527); message->set_repeated_nested_enum (1, unittest::TestAllTypes::FOO); message->set_repeated_foreign_enum(1, unittest::FOREIGN_FOO ); message->set_repeated_import_enum (1, unittest_import::IMPORT_FOO); #ifndef PROTOBUF_TEST_NO_DESCRIPTORS message->GetReflection()->SetRepeatedString( message, message->GetDescriptor()->FindFieldByName("repeated_string_piece"), 1, "524"); message->GetReflection()->SetRepeatedString( message, message->GetDescriptor()->FindFieldByName("repeated_cord"), 1, "525"); #endif // !PROTOBUF_TEST_NO_DESCRIPTORS } // ------------------------------------------------------------------ void TestUtil::SetOneofFields(unittest::TestAllTypes* message) { message->set_oneof_uint32(601); message->mutable_oneof_nested_message()->set_bb(602); message->set_oneof_string("603"); message->set_oneof_bytes("604"); } // ------------------------------------------------------------------- void TestUtil::ExpectAllFieldsSet(const unittest::TestAllTypes& message) { EXPECT_TRUE(message.has_optional_int32 ()); EXPECT_TRUE(message.has_optional_int64 ()); EXPECT_TRUE(message.has_optional_uint32 ()); EXPECT_TRUE(message.has_optional_uint64 ()); EXPECT_TRUE(message.has_optional_sint32 ()); EXPECT_TRUE(message.has_optional_sint64 ()); EXPECT_TRUE(message.has_optional_fixed32 ()); EXPECT_TRUE(message.has_optional_fixed64 ()); EXPECT_TRUE(message.has_optional_sfixed32()); EXPECT_TRUE(message.has_optional_sfixed64()); EXPECT_TRUE(message.has_optional_float ()); EXPECT_TRUE(message.has_optional_double ()); EXPECT_TRUE(message.has_optional_bool ()); EXPECT_TRUE(message.has_optional_string ()); EXPECT_TRUE(message.has_optional_bytes ()); EXPECT_TRUE(message.has_optionalgroup ()); EXPECT_TRUE(message.has_optional_nested_message ()); EXPECT_TRUE(message.has_optional_foreign_message ()); EXPECT_TRUE(message.has_optional_import_message ()); EXPECT_TRUE(message.has_optional_public_import_message()); EXPECT_TRUE(message.has_optional_lazy_message ()); EXPECT_TRUE(message.optionalgroup ().has_a()); EXPECT_TRUE(message.optional_nested_message ().has_bb()); EXPECT_TRUE(message.optional_foreign_message ().has_c()); EXPECT_TRUE(message.optional_import_message ().has_d()); EXPECT_TRUE(message.optional_public_import_message().has_e()); EXPECT_TRUE(message.optional_lazy_message ().has_bb()); EXPECT_TRUE(message.has_optional_nested_enum ()); EXPECT_TRUE(message.has_optional_foreign_enum()); EXPECT_TRUE(message.has_optional_import_enum ()); #ifndef PROTOBUF_TEST_NO_DESCRIPTORS EXPECT_TRUE(message.has_optional_string_piece()); EXPECT_TRUE(message.has_optional_cord()); #endif EXPECT_EQ(101 , message.optional_int32 ()); EXPECT_EQ(102 , message.optional_int64 ()); EXPECT_EQ(103 , message.optional_uint32 ()); EXPECT_EQ(104 , message.optional_uint64 ()); EXPECT_EQ(105 , message.optional_sint32 ()); EXPECT_EQ(106 , message.optional_sint64 ()); EXPECT_EQ(107 , message.optional_fixed32 ()); EXPECT_EQ(108 , message.optional_fixed64 ()); EXPECT_EQ(109 , message.optional_sfixed32()); EXPECT_EQ(110 , message.optional_sfixed64()); EXPECT_EQ(111 , message.optional_float ()); EXPECT_EQ(112 , message.optional_double ()); EXPECT_TRUE( message.optional_bool ()); EXPECT_EQ("115", message.optional_string ()); EXPECT_EQ("116", message.optional_bytes ()); EXPECT_EQ(117, message.optionalgroup ().a()); EXPECT_EQ(118, message.optional_nested_message ().bb()); EXPECT_EQ(119, message.optional_foreign_message ().c()); EXPECT_EQ(120, message.optional_import_message ().d()); EXPECT_EQ(126, message.optional_public_import_message ().e()); EXPECT_EQ(127, message.optional_lazy_message ().bb()); EXPECT_EQ(unittest::TestAllTypes::BAZ, message.optional_nested_enum ()); EXPECT_EQ(unittest::FOREIGN_BAZ , message.optional_foreign_enum()); EXPECT_EQ(unittest_import::IMPORT_BAZ, message.optional_import_enum ()); // ----------------------------------------------------------------- ASSERT_EQ(2, message.repeated_int32_size ()); ASSERT_EQ(2, message.repeated_int64_size ()); ASSERT_EQ(2, message.repeated_uint32_size ()); ASSERT_EQ(2, message.repeated_uint64_size ()); ASSERT_EQ(2, message.repeated_sint32_size ()); ASSERT_EQ(2, message.repeated_sint64_size ()); ASSERT_EQ(2, message.repeated_fixed32_size ()); ASSERT_EQ(2, message.repeated_fixed64_size ()); ASSERT_EQ(2, message.repeated_sfixed32_size()); ASSERT_EQ(2, message.repeated_sfixed64_size()); ASSERT_EQ(2, message.repeated_float_size ()); ASSERT_EQ(2, message.repeated_double_size ()); ASSERT_EQ(2, message.repeated_bool_size ()); ASSERT_EQ(2, message.repeated_string_size ()); ASSERT_EQ(2, message.repeated_bytes_size ()); ASSERT_EQ(2, message.repeatedgroup_size ()); ASSERT_EQ(2, message.repeated_nested_message_size ()); ASSERT_EQ(2, message.repeated_foreign_message_size()); ASSERT_EQ(2, message.repeated_import_message_size ()); ASSERT_EQ(2, message.repeated_lazy_message_size ()); ASSERT_EQ(2, message.repeated_nested_enum_size ()); ASSERT_EQ(2, message.repeated_foreign_enum_size ()); ASSERT_EQ(2, message.repeated_import_enum_size ()); #ifndef PROTOBUF_TEST_NO_DESCRIPTORS ASSERT_EQ(2, message.repeated_string_piece_size()); ASSERT_EQ(2, message.repeated_cord_size()); #endif EXPECT_EQ(201 , message.repeated_int32 (0)); EXPECT_EQ(202 , message.repeated_int64 (0)); EXPECT_EQ(203 , message.repeated_uint32 (0)); EXPECT_EQ(204 , message.repeated_uint64 (0)); EXPECT_EQ(205 , message.repeated_sint32 (0)); EXPECT_EQ(206 , message.repeated_sint64 (0)); EXPECT_EQ(207 , message.repeated_fixed32 (0)); EXPECT_EQ(208 , message.repeated_fixed64 (0)); EXPECT_EQ(209 , message.repeated_sfixed32(0)); EXPECT_EQ(210 , message.repeated_sfixed64(0)); EXPECT_EQ(211 , message.repeated_float (0)); EXPECT_EQ(212 , message.repeated_double (0)); EXPECT_TRUE( message.repeated_bool (0)); EXPECT_EQ("215", message.repeated_string (0)); EXPECT_EQ("216", message.repeated_bytes (0)); EXPECT_EQ(217, message.repeatedgroup (0).a()); EXPECT_EQ(218, message.repeated_nested_message (0).bb()); EXPECT_EQ(219, message.repeated_foreign_message(0).c()); EXPECT_EQ(220, message.repeated_import_message (0).d()); EXPECT_EQ(227, message.repeated_lazy_message (0).bb()); EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0)); EXPECT_EQ(unittest::FOREIGN_BAR , message.repeated_foreign_enum(0)); EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0)); EXPECT_EQ(301 , message.repeated_int32 (1)); EXPECT_EQ(302 , message.repeated_int64 (1)); EXPECT_EQ(303 , message.repeated_uint32 (1)); EXPECT_EQ(304 , message.repeated_uint64 (1)); EXPECT_EQ(305 , message.repeated_sint32 (1)); EXPECT_EQ(306 , message.repeated_sint64 (1)); EXPECT_EQ(307 , message.repeated_fixed32 (1)); EXPECT_EQ(308 , message.repeated_fixed64 (1)); EXPECT_EQ(309 , message.repeated_sfixed32(1)); EXPECT_EQ(310 , message.repeated_sfixed64(1)); EXPECT_EQ(311 , message.repeated_float (1)); EXPECT_EQ(312 , message.repeated_double (1)); EXPECT_FALSE( message.repeated_bool (1)); EXPECT_EQ("315", message.repeated_string (1)); EXPECT_EQ("316", message.repeated_bytes (1)); EXPECT_EQ(317, message.repeatedgroup (1).a()); EXPECT_EQ(318, message.repeated_nested_message (1).bb()); EXPECT_EQ(319, message.repeated_foreign_message(1).c()); EXPECT_EQ(320, message.repeated_import_message (1).d()); EXPECT_EQ(327, message.repeated_lazy_message (1).bb()); EXPECT_EQ(unittest::TestAllTypes::BAZ, message.repeated_nested_enum (1)); EXPECT_EQ(unittest::FOREIGN_BAZ , message.repeated_foreign_enum(1)); EXPECT_EQ(unittest_import::IMPORT_BAZ, message.repeated_import_enum (1)); // ----------------------------------------------------------------- EXPECT_TRUE(message.has_default_int32 ()); EXPECT_TRUE(message.has_default_int64 ()); EXPECT_TRUE(message.has_default_uint32 ()); EXPECT_TRUE(message.has_default_uint64 ()); EXPECT_TRUE(message.has_default_sint32 ()); EXPECT_TRUE(message.has_default_sint64 ()); EXPECT_TRUE(message.has_default_fixed32 ()); EXPECT_TRUE(message.has_default_fixed64 ()); EXPECT_TRUE(message.has_default_sfixed32()); EXPECT_TRUE(message.has_default_sfixed64()); EXPECT_TRUE(message.has_default_float ()); EXPECT_TRUE(message.has_default_double ()); EXPECT_TRUE(message.has_default_bool ()); EXPECT_TRUE(message.has_default_string ()); EXPECT_TRUE(message.has_default_bytes ()); EXPECT_TRUE(message.has_default_nested_enum ()); EXPECT_TRUE(message.has_default_foreign_enum()); EXPECT_TRUE(message.has_default_import_enum ()); EXPECT_EQ(401 , message.default_int32 ()); EXPECT_EQ(402 , message.default_int64 ()); EXPECT_EQ(403 , message.default_uint32 ()); EXPECT_EQ(404 , message.default_uint64 ()); EXPECT_EQ(405 , message.default_sint32 ()); EXPECT_EQ(406 , message.default_sint64 ()); EXPECT_EQ(407 , message.default_fixed32 ()); EXPECT_EQ(408 , message.default_fixed64 ()); EXPECT_EQ(409 , message.default_sfixed32()); EXPECT_EQ(410 , message.default_sfixed64()); EXPECT_EQ(411 , message.default_float ()); EXPECT_EQ(412 , message.default_double ()); EXPECT_FALSE( message.default_bool ()); EXPECT_EQ("415", message.default_string ()); EXPECT_EQ("416", message.default_bytes ()); EXPECT_EQ(unittest::TestAllTypes::FOO, message.default_nested_enum ()); EXPECT_EQ(unittest::FOREIGN_FOO , message.default_foreign_enum()); EXPECT_EQ(unittest_import::IMPORT_FOO, message.default_import_enum ()); EXPECT_FALSE(message.has_oneof_uint32 ()); EXPECT_FALSE(message.has_oneof_nested_message()); EXPECT_FALSE(message.has_oneof_string ()); EXPECT_TRUE(message.has_oneof_bytes ()); EXPECT_EQ("604", message.oneof_bytes()); } // ------------------------------------------------------------------- void TestUtil::ExpectClear(const unittest::TestAllTypes& message) { // has_blah() should initially be false for all optional fields. EXPECT_FALSE(message.has_optional_int32 ()); EXPECT_FALSE(message.has_optional_int64 ()); EXPECT_FALSE(message.has_optional_uint32 ()); EXPECT_FALSE(message.has_optional_uint64 ()); EXPECT_FALSE(message.has_optional_sint32 ()); EXPECT_FALSE(message.has_optional_sint64 ()); EXPECT_FALSE(message.has_optional_fixed32 ()); EXPECT_FALSE(message.has_optional_fixed64 ()); EXPECT_FALSE(message.has_optional_sfixed32()); EXPECT_FALSE(message.has_optional_sfixed64()); EXPECT_FALSE(message.has_optional_float ()); EXPECT_FALSE(message.has_optional_double ()); EXPECT_FALSE(message.has_optional_bool ()); EXPECT_FALSE(message.has_optional_string ()); EXPECT_FALSE(message.has_optional_bytes ()); EXPECT_FALSE(message.has_optionalgroup ()); EXPECT_FALSE(message.has_optional_nested_message ()); EXPECT_FALSE(message.has_optional_foreign_message ()); EXPECT_FALSE(message.has_optional_import_message ()); EXPECT_FALSE(message.has_optional_public_import_message()); EXPECT_FALSE(message.has_optional_lazy_message ()); EXPECT_FALSE(message.has_optional_nested_enum ()); EXPECT_FALSE(message.has_optional_foreign_enum()); EXPECT_FALSE(message.has_optional_import_enum ()); EXPECT_FALSE(message.has_optional_string_piece()); EXPECT_FALSE(message.has_optional_cord()); // Optional fields without defaults are set to zero or something like it. EXPECT_EQ(0 , message.optional_int32 ()); EXPECT_EQ(0 , message.optional_int64 ()); EXPECT_EQ(0 , message.optional_uint32 ()); EXPECT_EQ(0 , message.optional_uint64 ()); EXPECT_EQ(0 , message.optional_sint32 ()); EXPECT_EQ(0 , message.optional_sint64 ()); EXPECT_EQ(0 , message.optional_fixed32 ()); EXPECT_EQ(0 , message.optional_fixed64 ()); EXPECT_EQ(0 , message.optional_sfixed32()); EXPECT_EQ(0 , message.optional_sfixed64()); EXPECT_EQ(0 , message.optional_float ()); EXPECT_EQ(0 , message.optional_double ()); EXPECT_FALSE( message.optional_bool ()); EXPECT_EQ("" , message.optional_string ()); EXPECT_EQ("" , message.optional_bytes ()); // Embedded messages should also be clear. EXPECT_FALSE(message.optionalgroup ().has_a()); EXPECT_FALSE(message.optional_nested_message ().has_bb()); EXPECT_FALSE(message.optional_foreign_message ().has_c()); EXPECT_FALSE(message.optional_import_message ().has_d()); EXPECT_FALSE(message.optional_public_import_message().has_e()); EXPECT_FALSE(message.optional_lazy_message ().has_bb()); EXPECT_EQ(0, message.optionalgroup ().a()); EXPECT_EQ(0, message.optional_nested_message ().bb()); EXPECT_EQ(0, message.optional_foreign_message ().c()); EXPECT_EQ(0, message.optional_import_message ().d()); EXPECT_EQ(0, message.optional_public_import_message().e()); EXPECT_EQ(0, message.optional_lazy_message ().bb()); // Enums without defaults are set to the first value in the enum. EXPECT_EQ(unittest::TestAllTypes::FOO, message.optional_nested_enum ()); EXPECT_EQ(unittest::FOREIGN_FOO , message.optional_foreign_enum()); EXPECT_EQ(unittest_import::IMPORT_FOO, message.optional_import_enum ()); // Repeated fields are empty. EXPECT_EQ(0, message.repeated_int32_size ()); EXPECT_EQ(0, message.repeated_int64_size ()); EXPECT_EQ(0, message.repeated_uint32_size ()); EXPECT_EQ(0, message.repeated_uint64_size ()); EXPECT_EQ(0, message.repeated_sint32_size ()); EXPECT_EQ(0, message.repeated_sint64_size ()); EXPECT_EQ(0, message.repeated_fixed32_size ()); EXPECT_EQ(0, message.repeated_fixed64_size ()); EXPECT_EQ(0, message.repeated_sfixed32_size()); EXPECT_EQ(0, message.repeated_sfixed64_size()); EXPECT_EQ(0, message.repeated_float_size ()); EXPECT_EQ(0, message.repeated_double_size ()); EXPECT_EQ(0, message.repeated_bool_size ()); EXPECT_EQ(0, message.repeated_string_size ()); EXPECT_EQ(0, message.repeated_bytes_size ()); EXPECT_EQ(0, message.repeatedgroup_size ()); EXPECT_EQ(0, message.repeated_nested_message_size ()); EXPECT_EQ(0, message.repeated_foreign_message_size()); EXPECT_EQ(0, message.repeated_import_message_size ()); EXPECT_EQ(0, message.repeated_lazy_message_size ()); EXPECT_EQ(0, message.repeated_nested_enum_size ()); EXPECT_EQ(0, message.repeated_foreign_enum_size ()); EXPECT_EQ(0, message.repeated_import_enum_size ()); EXPECT_EQ(0, message.repeated_string_piece_size()); EXPECT_EQ(0, message.repeated_cord_size()); // has_blah() should also be false for all default fields. EXPECT_FALSE(message.has_default_int32 ()); EXPECT_FALSE(message.has_default_int64 ()); EXPECT_FALSE(message.has_default_uint32 ()); EXPECT_FALSE(message.has_default_uint64 ()); EXPECT_FALSE(message.has_default_sint32 ()); EXPECT_FALSE(message.has_default_sint64 ()); EXPECT_FALSE(message.has_default_fixed32 ()); EXPECT_FALSE(message.has_default_fixed64 ()); EXPECT_FALSE(message.has_default_sfixed32()); EXPECT_FALSE(message.has_default_sfixed64()); EXPECT_FALSE(message.has_default_float ()); EXPECT_FALSE(message.has_default_double ()); EXPECT_FALSE(message.has_default_bool ()); EXPECT_FALSE(message.has_default_string ()); EXPECT_FALSE(message.has_default_bytes ()); EXPECT_FALSE(message.has_default_nested_enum ()); EXPECT_FALSE(message.has_default_foreign_enum()); EXPECT_FALSE(message.has_default_import_enum ()); // Fields with defaults have their default values (duh). EXPECT_EQ( 41 , message.default_int32 ()); EXPECT_EQ( 42 , message.default_int64 ()); EXPECT_EQ( 43 , message.default_uint32 ()); EXPECT_EQ( 44 , message.default_uint64 ()); EXPECT_EQ(-45 , message.default_sint32 ()); EXPECT_EQ( 46 , message.default_sint64 ()); EXPECT_EQ( 47 , message.default_fixed32 ()); EXPECT_EQ( 48 , message.default_fixed64 ()); EXPECT_EQ( 49 , message.default_sfixed32()); EXPECT_EQ(-50 , message.default_sfixed64()); EXPECT_EQ( 51.5 , message.default_float ()); EXPECT_EQ( 52e3 , message.default_double ()); EXPECT_TRUE( message.default_bool ()); EXPECT_EQ("hello", message.default_string ()); EXPECT_EQ("world", message.default_bytes ()); EXPECT_EQ(unittest::TestAllTypes::BAR, message.default_nested_enum ()); EXPECT_EQ(unittest::FOREIGN_BAR , message.default_foreign_enum()); EXPECT_EQ(unittest_import::IMPORT_BAR, message.default_import_enum ()); EXPECT_FALSE(message.has_oneof_uint32 ()); EXPECT_FALSE(message.has_oneof_nested_message()); EXPECT_FALSE(message.has_oneof_string ()); EXPECT_FALSE(message.has_oneof_bytes ()); } // ------------------------------------------------------------------- void TestUtil::ExpectRepeatedFieldsModified( const unittest::TestAllTypes& message) { // 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. ASSERT_EQ(2, message.repeated_int32_size ()); ASSERT_EQ(2, message.repeated_int64_size ()); ASSERT_EQ(2, message.repeated_uint32_size ()); ASSERT_EQ(2, message.repeated_uint64_size ()); ASSERT_EQ(2, message.repeated_sint32_size ()); ASSERT_EQ(2, message.repeated_sint64_size ()); ASSERT_EQ(2, message.repeated_fixed32_size ()); ASSERT_EQ(2, message.repeated_fixed64_size ()); ASSERT_EQ(2, message.repeated_sfixed32_size()); ASSERT_EQ(2, message.repeated_sfixed64_size()); ASSERT_EQ(2, message.repeated_float_size ()); ASSERT_EQ(2, message.repeated_double_size ()); ASSERT_EQ(2, message.repeated_bool_size ()); ASSERT_EQ(2, message.repeated_string_size ()); ASSERT_EQ(2, message.repeated_bytes_size ()); ASSERT_EQ(2, message.repeatedgroup_size ()); ASSERT_EQ(2, message.repeated_nested_message_size ()); ASSERT_EQ(2, message.repeated_foreign_message_size()); ASSERT_EQ(2, message.repeated_import_message_size ()); ASSERT_EQ(2, message.repeated_lazy_message_size ()); ASSERT_EQ(2, message.repeated_nested_enum_size ()); ASSERT_EQ(2, message.repeated_foreign_enum_size ()); ASSERT_EQ(2, message.repeated_import_enum_size ()); #ifndef PROTOBUF_TEST_NO_DESCRIPTORS ASSERT_EQ(2, message.repeated_string_piece_size()); ASSERT_EQ(2, message.repeated_cord_size()); #endif EXPECT_EQ(201 , message.repeated_int32 (0)); EXPECT_EQ(202 , message.repeated_int64 (0)); EXPECT_EQ(203 , message.repeated_uint32 (0)); EXPECT_EQ(204 , message.repeated_uint64 (0)); EXPECT_EQ(205 , message.repeated_sint32 (0)); EXPECT_EQ(206 , message.repeated_sint64 (0)); EXPECT_EQ(207 , message.repeated_fixed32 (0)); EXPECT_EQ(208 , message.repeated_fixed64 (0)); EXPECT_EQ(209 , message.repeated_sfixed32(0)); EXPECT_EQ(210 , message.repeated_sfixed64(0)); EXPECT_EQ(211 , message.repeated_float (0)); EXPECT_EQ(212 , message.repeated_double (0)); EXPECT_TRUE( message.repeated_bool (0)); EXPECT_EQ("215", message.repeated_string (0)); EXPECT_EQ("216", message.repeated_bytes (0)); EXPECT_EQ(217, message.repeatedgroup (0).a()); EXPECT_EQ(218, message.repeated_nested_message (0).bb()); EXPECT_EQ(219, message.repeated_foreign_message(0).c()); EXPECT_EQ(220, message.repeated_import_message (0).d()); EXPECT_EQ(227, message.repeated_lazy_message (0).bb()); EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0)); EXPECT_EQ(unittest::FOREIGN_BAR , message.repeated_foreign_enum(0)); EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0)); // Actually verify the second (modified) elements now. EXPECT_EQ(501 , message.repeated_int32 (1)); EXPECT_EQ(502 , message.repeated_int64 (1)); EXPECT_EQ(503 , message.repeated_uint32 (1)); EXPECT_EQ(504 , message.repeated_uint64 (1)); EXPECT_EQ(505 , message.repeated_sint32 (1)); EXPECT_EQ(506 , message.repeated_sint64 (1)); EXPECT_EQ(507 , message.repeated_fixed32 (1)); EXPECT_EQ(508 , message.repeated_fixed64 (1)); EXPECT_EQ(509 , message.repeated_sfixed32(1)); EXPECT_EQ(510 , message.repeated_sfixed64(1)); EXPECT_EQ(511 , message.repeated_float (1)); EXPECT_EQ(512 , message.repeated_double (1)); EXPECT_TRUE( message.repeated_bool (1)); EXPECT_EQ("515", message.repeated_string (1)); EXPECT_EQ("516", message.repeated_bytes (1)); EXPECT_EQ(517, message.repeatedgroup (1).a()); EXPECT_EQ(518, message.repeated_nested_message (1).bb()); EXPECT_EQ(519, message.repeated_foreign_message(1).c()); EXPECT_EQ(520, message.repeated_import_message (1).d()); EXPECT_EQ(527, message.repeated_lazy_message (1).bb()); EXPECT_EQ(unittest::TestAllTypes::FOO, message.repeated_nested_enum (1)); EXPECT_EQ(unittest::FOREIGN_FOO , message.repeated_foreign_enum(1)); EXPECT_EQ(unittest_import::IMPORT_FOO, message.repeated_import_enum (1)); } // ------------------------------------------------------------------- void TestUtil::SetPackedFields(unittest::TestPackedTypes* message) { message->add_packed_int32 (601); message->add_packed_int64 (602); message->add_packed_uint32 (603); message->add_packed_uint64 (604); message->add_packed_sint32 (605); message->add_packed_sint64 (606); message->add_packed_fixed32 (607); message->add_packed_fixed64 (608); message->add_packed_sfixed32(609); message->add_packed_sfixed64(610); message->add_packed_float (611); message->add_packed_double (612); message->add_packed_bool (true); message->add_packed_enum (unittest::FOREIGN_BAR); // add a second one of each field message->add_packed_int32 (701); message->add_packed_int64 (702); message->add_packed_uint32 (703); message->add_packed_uint64 (704); message->add_packed_sint32 (705); message->add_packed_sint64 (706); message->add_packed_fixed32 (707); message->add_packed_fixed64 (708); message->add_packed_sfixed32(709); message->add_packed_sfixed64(710); message->add_packed_float (711); message->add_packed_double (712); message->add_packed_bool (false); message->add_packed_enum (unittest::FOREIGN_BAZ); } void TestUtil::SetUnpackedFields(unittest::TestUnpackedTypes* message) { // The values applied here must match those of SetPackedFields. message->add_unpacked_int32 (601); message->add_unpacked_int64 (602); message->add_unpacked_uint32 (603); message->add_unpacked_uint64 (604); message->add_unpacked_sint32 (605); message->add_unpacked_sint64 (606); message->add_unpacked_fixed32 (607); message->add_unpacked_fixed64 (608); message->add_unpacked_sfixed32(609); message->add_unpacked_sfixed64(610); message->add_unpacked_float (611); message->add_unpacked_double (612); message->add_unpacked_bool (true); message->add_unpacked_enum (unittest::FOREIGN_BAR); // add a second one of each field message->add_unpacked_int32 (701); message->add_unpacked_int64 (702); message->add_unpacked_uint32 (703); message->add_unpacked_uint64 (704); message->add_unpacked_sint32 (705); message->add_unpacked_sint64 (706); message->add_unpacked_fixed32 (707); message->add_unpacked_fixed64 (708); message->add_unpacked_sfixed32(709); message->add_unpacked_sfixed64(710); message->add_unpacked_float (711); message->add_unpacked_double (712); message->add_unpacked_bool (false); message->add_unpacked_enum (unittest::FOREIGN_BAZ); } // ------------------------------------------------------------------- void TestUtil::ModifyPackedFields(unittest::TestPackedTypes* message) { message->set_packed_int32 (1, 801); message->set_packed_int64 (1, 802); message->set_packed_uint32 (1, 803); message->set_packed_uint64 (1, 804); message->set_packed_sint32 (1, 805); message->set_packed_sint64 (1, 806); message->set_packed_fixed32 (1, 807); message->set_packed_fixed64 (1, 808); message->set_packed_sfixed32(1, 809); message->set_packed_sfixed64(1, 810); message->set_packed_float (1, 811); message->set_packed_double (1, 812); message->set_packed_bool (1, true); message->set_packed_enum (1, unittest::FOREIGN_FOO); } // ------------------------------------------------------------------- void TestUtil::ExpectPackedFieldsSet(const unittest::TestPackedTypes& message) { ASSERT_EQ(2, message.packed_int32_size ()); ASSERT_EQ(2, message.packed_int64_size ()); ASSERT_EQ(2, message.packed_uint32_size ()); ASSERT_EQ(2, message.packed_uint64_size ()); ASSERT_EQ(2, message.packed_sint32_size ()); ASSERT_EQ(2, message.packed_sint64_size ()); ASSERT_EQ(2, message.packed_fixed32_size ()); ASSERT_EQ(2, message.packed_fixed64_size ()); ASSERT_EQ(2, message.packed_sfixed32_size()); ASSERT_EQ(2, message.packed_sfixed64_size()); ASSERT_EQ(2, message.packed_float_size ()); ASSERT_EQ(2, message.packed_double_size ()); ASSERT_EQ(2, message.packed_bool_size ()); ASSERT_EQ(2, message.packed_enum_size ()); EXPECT_EQ(601 , message.packed_int32 (0)); EXPECT_EQ(602 , message.packed_int64 (0)); EXPECT_EQ(603 , message.packed_uint32 (0)); EXPECT_EQ(604 , message.packed_uint64 (0)); EXPECT_EQ(605 , message.packed_sint32 (0)); EXPECT_EQ(606 , message.packed_sint64 (0)); EXPECT_EQ(607 , message.packed_fixed32 (0)); EXPECT_EQ(608 , message.packed_fixed64 (0)); EXPECT_EQ(609 , message.packed_sfixed32(0)); EXPECT_EQ(610 , message.packed_sfixed64(0)); EXPECT_EQ(611 , message.packed_float (0)); EXPECT_EQ(612 , message.packed_double (0)); EXPECT_TRUE( message.packed_bool (0)); EXPECT_EQ(unittest::FOREIGN_BAR, message.packed_enum(0)); EXPECT_EQ(701 , message.packed_int32 (1)); EXPECT_EQ(702 , message.packed_int64 (1)); EXPECT_EQ(703 , message.packed_uint32 (1)); EXPECT_EQ(704 , message.packed_uint64 (1)); EXPECT_EQ(705 , message.packed_sint32 (1)); EXPECT_EQ(706 , message.packed_sint64 (1)); EXPECT_EQ(707 , message.packed_fixed32 (1)); EXPECT_EQ(708 , message.packed_fixed64 (1)); EXPECT_EQ(709 , message.packed_sfixed32(1)); EXPECT_EQ(710 , message.packed_sfixed64(1)); EXPECT_EQ(711 , message.packed_float (1)); EXPECT_EQ(712 , message.packed_double (1)); EXPECT_FALSE( message.packed_bool (1)); EXPECT_EQ(unittest::FOREIGN_BAZ, message.packed_enum(1)); } void TestUtil::ExpectUnpackedFieldsSet( const unittest::TestUnpackedTypes& message) { // The values expected here must match those of ExpectPackedFieldsSet. ASSERT_EQ(2, message.unpacked_int32_size ()); ASSERT_EQ(2, message.unpacked_int64_size ()); ASSERT_EQ(2, message.unpacked_uint32_size ()); ASSERT_EQ(2, message.unpacked_uint64_size ()); ASSERT_EQ(2, message.unpacked_sint32_size ()); ASSERT_EQ(2, message.unpacked_sint64_size ()); ASSERT_EQ(2, message.unpacked_fixed32_size ()); ASSERT_EQ(2, message.unpacked_fixed64_size ()); ASSERT_EQ(2, message.unpacked_sfixed32_size()); ASSERT_EQ(2, message.unpacked_sfixed64_size()); ASSERT_EQ(2, message.unpacked_float_size ()); ASSERT_EQ(2, message.unpacked_double_size ()); ASSERT_EQ(2, message.unpacked_bool_size ()); ASSERT_EQ(2, message.unpacked_enum_size ()); EXPECT_EQ(601 , message.unpacked_int32 (0)); EXPECT_EQ(602 , message.unpacked_int64 (0)); EXPECT_EQ(603 , message.unpacked_uint32 (0)); EXPECT_EQ(604 , message.unpacked_uint64 (0)); EXPECT_EQ(605 , message.unpacked_sint32 (0)); EXPECT_EQ(606 , message.unpacked_sint64 (0)); EXPECT_EQ(607 , message.unpacked_fixed32 (0)); EXPECT_EQ(608 , message.unpacked_fixed64 (0)); EXPECT_EQ(609 , message.unpacked_sfixed32(0)); EXPECT_EQ(610 , message.unpacked_sfixed64(0)); EXPECT_EQ(611 , message.unpacked_float (0)); EXPECT_EQ(612 , message.unpacked_double (0)); EXPECT_TRUE( message.unpacked_bool (0)); EXPECT_EQ(unittest::FOREIGN_BAR, message.unpacked_enum(0)); EXPECT_EQ(701 , message.unpacked_int32 (1)); EXPECT_EQ(702 , message.unpacked_int64 (1)); EXPECT_EQ(703 , message.unpacked_uint32 (1)); EXPECT_EQ(704 , message.unpacked_uint64 (1)); EXPECT_EQ(705 , message.unpacked_sint32 (1)); EXPECT_EQ(706 , message.unpacked_sint64 (1)); EXPECT_EQ(707 , message.unpacked_fixed32 (1)); EXPECT_EQ(708 , message.unpacked_fixed64 (1)); EXPECT_EQ(709 , message.unpacked_sfixed32(1)); EXPECT_EQ(710 , message.unpacked_sfixed64(1)); EXPECT_EQ(711 , message.unpacked_float (1)); EXPECT_EQ(712 , message.unpacked_double (1)); EXPECT_FALSE( message.unpacked_bool (1)); EXPECT_EQ(unittest::FOREIGN_BAZ, message.unpacked_enum(1)); } // ------------------------------------------------------------------- void TestUtil::ExpectPackedClear( const unittest::TestPackedTypes& message) { // Packed repeated fields are empty. EXPECT_EQ(0, message.packed_int32_size ()); EXPECT_EQ(0, message.packed_int64_size ()); EXPECT_EQ(0, message.packed_uint32_size ()); EXPECT_EQ(0, message.packed_uint64_size ()); EXPECT_EQ(0, message.packed_sint32_size ()); EXPECT_EQ(0, message.packed_sint64_size ()); EXPECT_EQ(0, message.packed_fixed32_size ()); EXPECT_EQ(0, message.packed_fixed64_size ()); EXPECT_EQ(0, message.packed_sfixed32_size()); EXPECT_EQ(0, message.packed_sfixed64_size()); EXPECT_EQ(0, message.packed_float_size ()); EXPECT_EQ(0, message.packed_double_size ()); EXPECT_EQ(0, message.packed_bool_size ()); EXPECT_EQ(0, message.packed_enum_size ()); } // ------------------------------------------------------------------- void TestUtil::ExpectPackedFieldsModified( const unittest::TestPackedTypes& message) { // Do the same for packed repeated fields. ASSERT_EQ(2, message.packed_int32_size ()); ASSERT_EQ(2, message.packed_int64_size ()); ASSERT_EQ(2, message.packed_uint32_size ()); ASSERT_EQ(2, message.packed_uint64_size ()); ASSERT_EQ(2, message.packed_sint32_size ()); ASSERT_EQ(2, message.packed_sint64_size ()); ASSERT_EQ(2, message.packed_fixed32_size ()); ASSERT_EQ(2, message.packed_fixed64_size ()); ASSERT_EQ(2, message.packed_sfixed32_size()); ASSERT_EQ(2, message.packed_sfixed64_size()); ASSERT_EQ(2, message.packed_float_size ()); ASSERT_EQ(2, message.packed_double_size ()); ASSERT_EQ(2, message.packed_bool_size ()); ASSERT_EQ(2, message.packed_enum_size ()); EXPECT_EQ(601 , message.packed_int32 (0)); EXPECT_EQ(602 , message.packed_int64 (0)); EXPECT_EQ(603 , message.packed_uint32 (0)); EXPECT_EQ(604 , message.packed_uint64 (0)); EXPECT_EQ(605 , message.packed_sint32 (0)); EXPECT_EQ(606 , message.packed_sint64 (0)); EXPECT_EQ(607 , message.packed_fixed32 (0)); EXPECT_EQ(608 , message.packed_fixed64 (0)); EXPECT_EQ(609 , message.packed_sfixed32(0)); EXPECT_EQ(610 , message.packed_sfixed64(0)); EXPECT_EQ(611 , message.packed_float (0)); EXPECT_EQ(612 , message.packed_double (0)); EXPECT_TRUE( message.packed_bool (0)); EXPECT_EQ(unittest::FOREIGN_BAR, message.packed_enum(0)); // Actually verify the second (modified) elements now. EXPECT_EQ(801 , message.packed_int32 (1)); EXPECT_EQ(802 , message.packed_int64 (1)); EXPECT_EQ(803 , message.packed_uint32 (1)); EXPECT_EQ(804 , message.packed_uint64 (1)); EXPECT_EQ(805 , message.packed_sint32 (1)); EXPECT_EQ(806 , message.packed_sint64 (1)); EXPECT_EQ(807 , message.packed_fixed32 (1)); EXPECT_EQ(808 , message.packed_fixed64 (1)); EXPECT_EQ(809 , message.packed_sfixed32(1)); EXPECT_EQ(810 , message.packed_sfixed64(1)); EXPECT_EQ(811 , message.packed_float (1)); EXPECT_EQ(812 , message.packed_double (1)); EXPECT_TRUE( message.packed_bool (1)); EXPECT_EQ(unittest::FOREIGN_FOO, message.packed_enum(1)); } // =================================================================== // Extensions // // All this code is exactly equivalent to the above code except that it's // manipulating extension fields instead of normal ones. // // I gave up on the 80-char limit here. Sorry. void TestUtil::SetAllExtensions(unittest::TestAllExtensions* message) { message->SetExtension(unittest::optional_int32_extension , 101); message->SetExtension(unittest::optional_int64_extension , 102); message->SetExtension(unittest::optional_uint32_extension , 103); message->SetExtension(unittest::optional_uint64_extension , 104); message->SetExtension(unittest::optional_sint32_extension , 105); message->SetExtension(unittest::optional_sint64_extension , 106); message->SetExtension(unittest::optional_fixed32_extension , 107); message->SetExtension(unittest::optional_fixed64_extension , 108); message->SetExtension(unittest::optional_sfixed32_extension, 109); message->SetExtension(unittest::optional_sfixed64_extension, 110); message->SetExtension(unittest::optional_float_extension , 111); message->SetExtension(unittest::optional_double_extension , 112); message->SetExtension(unittest::optional_bool_extension , true); message->SetExtension(unittest::optional_string_extension , "115"); message->SetExtension(unittest::optional_bytes_extension , "116"); message->MutableExtension(unittest::optionalgroup_extension )->set_a(117); message->MutableExtension(unittest::optional_nested_message_extension )->set_bb(118); message->MutableExtension(unittest::optional_foreign_message_extension)->set_c(119); message->MutableExtension(unittest::optional_import_message_extension )->set_d(120); message->SetExtension(unittest::optional_nested_enum_extension , unittest::TestAllTypes::BAZ); message->SetExtension(unittest::optional_foreign_enum_extension, unittest::FOREIGN_BAZ ); message->SetExtension(unittest::optional_import_enum_extension , unittest_import::IMPORT_BAZ); message->SetExtension(unittest::optional_string_piece_extension, "124"); message->SetExtension(unittest::optional_cord_extension, "125"); message->MutableExtension(unittest::optional_public_import_message_extension)->set_e(126); message->MutableExtension(unittest::optional_lazy_message_extension)->set_bb(127); // ----------------------------------------------------------------- message->AddExtension(unittest::repeated_int32_extension , 201); message->AddExtension(unittest::repeated_int64_extension , 202); message->AddExtension(unittest::repeated_uint32_extension , 203); message->AddExtension(unittest::repeated_uint64_extension , 204); message->AddExtension(unittest::repeated_sint32_extension , 205); message->AddExtension(unittest::repeated_sint64_extension , 206); message->AddExtension(unittest::repeated_fixed32_extension , 207); message->AddExtension(unittest::repeated_fixed64_extension , 208); message->AddExtension(unittest::repeated_sfixed32_extension, 209); message->AddExtension(unittest::repeated_sfixed64_extension, 210); message->AddExtension(unittest::repeated_float_extension , 211); message->AddExtension(unittest::repeated_double_extension , 212); message->AddExtension(unittest::repeated_bool_extension , true); message->AddExtension(unittest::repeated_string_extension , "215"); message->AddExtension(unittest::repeated_bytes_extension , "216"); message->AddExtension(unittest::repeatedgroup_extension )->set_a(217); message->AddExtension(unittest::repeated_nested_message_extension )->set_bb(218); message->AddExtension(unittest::repeated_foreign_message_extension)->set_c(219); message->AddExtension(unittest::repeated_import_message_extension )->set_d(220); message->AddExtension(unittest::repeated_lazy_message_extension )->set_bb(227); message->AddExtension(unittest::repeated_nested_enum_extension , unittest::TestAllTypes::BAR); message->AddExtension(unittest::repeated_foreign_enum_extension, unittest::FOREIGN_BAR ); message->AddExtension(unittest::repeated_import_enum_extension , unittest_import::IMPORT_BAR); message->AddExtension(unittest::repeated_string_piece_extension, "224"); message->AddExtension(unittest::repeated_cord_extension, "225"); // Add a second one of each field. message->AddExtension(unittest::repeated_int32_extension , 301); message->AddExtension(unittest::repeated_int64_extension , 302); message->AddExtension(unittest::repeated_uint32_extension , 303); message->AddExtension(unittest::repeated_uint64_extension , 304); message->AddExtension(unittest::repeated_sint32_extension , 305); message->AddExtension(unittest::repeated_sint64_extension , 306); message->AddExtension(unittest::repeated_fixed32_extension , 307); message->AddExtension(unittest::repeated_fixed64_extension , 308); message->AddExtension(unittest::repeated_sfixed32_extension, 309); message->AddExtension(unittest::repeated_sfixed64_extension, 310); message->AddExtension(unittest::repeated_float_extension , 311); message->AddExtension(unittest::repeated_double_extension , 312); message->AddExtension(unittest::repeated_bool_extension , false); message->AddExtension(unittest::repeated_string_extension , "315"); message->AddExtension(unittest::repeated_bytes_extension , "316"); message->AddExtension(unittest::repeatedgroup_extension )->set_a(317); message->AddExtension(unittest::repeated_nested_message_extension )->set_bb(318); message->AddExtension(unittest::repeated_foreign_message_extension)->set_c(319); message->AddExtension(unittest::repeated_import_message_extension )->set_d(320); message->AddExtension(unittest::repeated_lazy_message_extension )->set_bb(327); message->AddExtension(unittest::repeated_nested_enum_extension , unittest::TestAllTypes::BAZ); message->AddExtension(unittest::repeated_foreign_enum_extension, unittest::FOREIGN_BAZ ); message->AddExtension(unittest::repeated_import_enum_extension , unittest_import::IMPORT_BAZ); message->AddExtension(unittest::repeated_string_piece_extension, "324"); message->AddExtension(unittest::repeated_cord_extension, "325"); // ----------------------------------------------------------------- message->SetExtension(unittest::default_int32_extension , 401); message->SetExtension(unittest::default_int64_extension , 402); message->SetExtension(unittest::default_uint32_extension , 403); message->SetExtension(unittest::default_uint64_extension , 404); message->SetExtension(unittest::default_sint32_extension , 405); message->SetExtension(unittest::default_sint64_extension , 406); message->SetExtension(unittest::default_fixed32_extension , 407); message->SetExtension(unittest::default_fixed64_extension , 408); message->SetExtension(unittest::default_sfixed32_extension, 409); message->SetExtension(unittest::default_sfixed64_extension, 410); message->SetExtension(unittest::default_float_extension , 411); message->SetExtension(unittest::default_double_extension , 412); message->SetExtension(unittest::default_bool_extension , false); message->SetExtension(unittest::default_string_extension , "415"); message->SetExtension(unittest::default_bytes_extension , "416"); message->SetExtension(unittest::default_nested_enum_extension , unittest::TestAllTypes::FOO); message->SetExtension(unittest::default_foreign_enum_extension, unittest::FOREIGN_FOO ); message->SetExtension(unittest::default_import_enum_extension , unittest_import::IMPORT_FOO); message->SetExtension(unittest::default_string_piece_extension, "424"); message->SetExtension(unittest::default_cord_extension, "425"); SetOneofFields(message); } void TestUtil::SetOneofFields(unittest::TestAllExtensions* message) { message->SetExtension(unittest::oneof_uint32_extension, 601); message->MutableExtension(unittest::oneof_nested_message_extension)->set_bb(602); message->SetExtension(unittest::oneof_string_extension, "603"); message->SetExtension(unittest::oneof_bytes_extension, "604"); } // ------------------------------------------------------------------- void TestUtil::SetAllFieldsAndExtensions( unittest::TestFieldOrderings* message) { GOOGLE_CHECK(message); message->set_my_int(1); message->set_my_string("foo"); message->set_my_float(1.0); message->SetExtension(unittest::my_extension_int, 23); message->SetExtension(unittest::my_extension_string, "bar"); } // ------------------------------------------------------------------- void TestUtil::ModifyRepeatedExtensions(unittest::TestAllExtensions* message) { message->SetExtension(unittest::repeated_int32_extension , 1, 501); message->SetExtension(unittest::repeated_int64_extension , 1, 502); message->SetExtension(unittest::repeated_uint32_extension , 1, 503); message->SetExtension(unittest::repeated_uint64_extension , 1, 504); message->SetExtension(unittest::repeated_sint32_extension , 1, 505); message->SetExtension(unittest::repeated_sint64_extension , 1, 506); message->SetExtension(unittest::repeated_fixed32_extension , 1, 507); message->SetExtension(unittest::repeated_fixed64_extension , 1, 508); message->SetExtension(unittest::repeated_sfixed32_extension, 1, 509); message->SetExtension(unittest::repeated_sfixed64_extension, 1, 510); message->SetExtension(unittest::repeated_float_extension , 1, 511); message->SetExtension(unittest::repeated_double_extension , 1, 512); message->SetExtension(unittest::repeated_bool_extension , 1, true); message->SetExtension(unittest::repeated_string_extension , 1, "515"); message->SetExtension(unittest::repeated_bytes_extension , 1, "516"); message->MutableExtension(unittest::repeatedgroup_extension , 1)->set_a(517); message->MutableExtension(unittest::repeated_nested_message_extension , 1)->set_bb(518); message->MutableExtension(unittest::repeated_foreign_message_extension, 1)->set_c(519); message->MutableExtension(unittest::repeated_import_message_extension , 1)->set_d(520); message->MutableExtension(unittest::repeated_lazy_message_extension , 1)->set_bb(527); message->SetExtension(unittest::repeated_nested_enum_extension , 1, unittest::TestAllTypes::FOO); message->SetExtension(unittest::repeated_foreign_enum_extension, 1, unittest::FOREIGN_FOO ); message->SetExtension(unittest::repeated_import_enum_extension , 1, unittest_import::IMPORT_FOO); message->SetExtension(unittest::repeated_string_piece_extension, 1, "524"); message->SetExtension(unittest::repeated_cord_extension, 1, "525"); } // ------------------------------------------------------------------- void TestUtil::ExpectAllExtensionsSet( const unittest::TestAllExtensions& message) { EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_int64_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_uint64_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_sint32_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_sint64_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_fixed32_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_fixed64_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed32_extension)); EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed64_extension)); EXPECT_TRUE(message.HasExtension(unittest::optional_float_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_double_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_bool_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_bytes_extension )); EXPECT_TRUE(message.HasExtension(unittest::optionalgroup_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_nested_message_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_message_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_import_message_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_public_import_message_extension)); EXPECT_TRUE(message.HasExtension(unittest::optional_lazy_message_extension )); EXPECT_TRUE(message.GetExtension(unittest::optionalgroup_extension ).has_a()); EXPECT_TRUE(message.GetExtension(unittest::optional_nested_message_extension ).has_bb()); EXPECT_TRUE(message.GetExtension(unittest::optional_foreign_message_extension ).has_c()); EXPECT_TRUE(message.GetExtension(unittest::optional_import_message_extension ).has_d()); EXPECT_TRUE(message.GetExtension(unittest::optional_public_import_message_extension).has_e()); EXPECT_TRUE(message.GetExtension(unittest::optional_lazy_message_extension ).has_bb()); EXPECT_TRUE(message.HasExtension(unittest::optional_nested_enum_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_enum_extension)); EXPECT_TRUE(message.HasExtension(unittest::optional_import_enum_extension )); EXPECT_TRUE(message.HasExtension(unittest::optional_string_piece_extension)); EXPECT_TRUE(message.HasExtension(unittest::optional_cord_extension)); EXPECT_EQ(101 , message.GetExtension(unittest::optional_int32_extension )); EXPECT_EQ(102 , message.GetExtension(unittest::optional_int64_extension )); EXPECT_EQ(103 , message.GetExtension(unittest::optional_uint32_extension )); EXPECT_EQ(104 , message.GetExtension(unittest::optional_uint64_extension )); EXPECT_EQ(105 , message.GetExtension(unittest::optional_sint32_extension )); EXPECT_EQ(106 , message.GetExtension(unittest::optional_sint64_extension )); EXPECT_EQ(107 , message.GetExtension(unittest::optional_fixed32_extension )); EXPECT_EQ(108 , message.GetExtension(unittest::optional_fixed64_extension )); EXPECT_EQ(109 , message.GetExtension(unittest::optional_sfixed32_extension)); EXPECT_EQ(110 , message.GetExtension(unittest::optional_sfixed64_extension)); EXPECT_EQ(111 , message.GetExtension(unittest::optional_float_extension )); EXPECT_EQ(112 , message.GetExtension(unittest::optional_double_extension )); EXPECT_TRUE( message.GetExtension(unittest::optional_bool_extension )); EXPECT_EQ("115", message.GetExtension(unittest::optional_string_extension )); EXPECT_EQ("116", message.GetExtension(unittest::optional_bytes_extension )); EXPECT_EQ(117, message.GetExtension(unittest::optionalgroup_extension ).a()); EXPECT_EQ(118, message.GetExtension(unittest::optional_nested_message_extension ).bb()); EXPECT_EQ(119, message.GetExtension(unittest::optional_foreign_message_extension).c()); EXPECT_EQ(120, message.GetExtension(unittest::optional_import_message_extension ).d()); EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::optional_nested_enum_extension )); EXPECT_EQ(unittest::FOREIGN_BAZ , message.GetExtension(unittest::optional_foreign_enum_extension)); EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::optional_import_enum_extension )); EXPECT_EQ("124", message.GetExtension(unittest::optional_string_piece_extension)); EXPECT_EQ("125", message.GetExtension(unittest::optional_cord_extension)); EXPECT_EQ(126, message.GetExtension(unittest::optional_public_import_message_extension ).e()); EXPECT_EQ(127, message.GetExtension(unittest::optional_lazy_message_extension).bb()); // ----------------------------------------------------------------- ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_lazy_message_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension)); EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension , 0)); EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension , 0)); EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension , 0)); EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension , 0)); EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension , 0)); EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension , 0)); EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension , 0)); EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension , 0)); EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension, 0)); EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 0)); EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 0)); EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 0)); EXPECT_TRUE( message.GetExtension(unittest::repeated_bool_extension , 0)); EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 0)); EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 0)); EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension , 0).a()); EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb()); EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c()); EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d()); EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension , 0).bb()); EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0)); EXPECT_EQ(unittest::FOREIGN_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension, 0)); EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0)); EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 0)); EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 0)); EXPECT_EQ(301 , message.GetExtension(unittest::repeated_int32_extension , 1)); EXPECT_EQ(302 , message.GetExtension(unittest::repeated_int64_extension , 1)); EXPECT_EQ(303 , message.GetExtension(unittest::repeated_uint32_extension , 1)); EXPECT_EQ(304 , message.GetExtension(unittest::repeated_uint64_extension , 1)); EXPECT_EQ(305 , message.GetExtension(unittest::repeated_sint32_extension , 1)); EXPECT_EQ(306 , message.GetExtension(unittest::repeated_sint64_extension , 1)); EXPECT_EQ(307 , message.GetExtension(unittest::repeated_fixed32_extension , 1)); EXPECT_EQ(308 , message.GetExtension(unittest::repeated_fixed64_extension , 1)); EXPECT_EQ(309 , message.GetExtension(unittest::repeated_sfixed32_extension, 1)); EXPECT_EQ(310 , message.GetExtension(unittest::repeated_sfixed64_extension, 1)); EXPECT_EQ(311 , message.GetExtension(unittest::repeated_float_extension , 1)); EXPECT_EQ(312 , message.GetExtension(unittest::repeated_double_extension , 1)); EXPECT_FALSE( message.GetExtension(unittest::repeated_bool_extension , 1)); EXPECT_EQ("315", message.GetExtension(unittest::repeated_string_extension , 1)); EXPECT_EQ("316", message.GetExtension(unittest::repeated_bytes_extension , 1)); EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension , 1).a()); EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb()); EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c()); EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension , 1).d()); EXPECT_EQ(327, message.GetExtension(unittest::repeated_lazy_message_extension , 1).bb()); EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::repeated_nested_enum_extension , 1)); EXPECT_EQ(unittest::FOREIGN_BAZ , message.GetExtension(unittest::repeated_foreign_enum_extension, 1)); EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::repeated_import_enum_extension , 1)); EXPECT_EQ("324", message.GetExtension(unittest::repeated_string_piece_extension, 1)); EXPECT_EQ("325", message.GetExtension(unittest::repeated_cord_extension, 1)); // ----------------------------------------------------------------- EXPECT_TRUE(message.HasExtension(unittest::default_int32_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_int64_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_uint32_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_uint64_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_sint32_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_sint64_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_fixed32_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_fixed64_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_sfixed32_extension)); EXPECT_TRUE(message.HasExtension(unittest::default_sfixed64_extension)); EXPECT_TRUE(message.HasExtension(unittest::default_float_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_double_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_bool_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_string_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_bytes_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_nested_enum_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_foreign_enum_extension)); EXPECT_TRUE(message.HasExtension(unittest::default_import_enum_extension )); EXPECT_TRUE(message.HasExtension(unittest::default_string_piece_extension)); EXPECT_TRUE(message.HasExtension(unittest::default_cord_extension)); EXPECT_EQ(401 , message.GetExtension(unittest::default_int32_extension )); EXPECT_EQ(402 , message.GetExtension(unittest::default_int64_extension )); EXPECT_EQ(403 , message.GetExtension(unittest::default_uint32_extension )); EXPECT_EQ(404 , message.GetExtension(unittest::default_uint64_extension )); EXPECT_EQ(405 , message.GetExtension(unittest::default_sint32_extension )); EXPECT_EQ(406 , message.GetExtension(unittest::default_sint64_extension )); EXPECT_EQ(407 , message.GetExtension(unittest::default_fixed32_extension )); EXPECT_EQ(408 , message.GetExtension(unittest::default_fixed64_extension )); EXPECT_EQ(409 , message.GetExtension(unittest::default_sfixed32_extension)); EXPECT_EQ(410 , message.GetExtension(unittest::default_sfixed64_extension)); EXPECT_EQ(411 , message.GetExtension(unittest::default_float_extension )); EXPECT_EQ(412 , message.GetExtension(unittest::default_double_extension )); EXPECT_FALSE( message.GetExtension(unittest::default_bool_extension )); EXPECT_EQ("415", message.GetExtension(unittest::default_string_extension )); EXPECT_EQ("416", message.GetExtension(unittest::default_bytes_extension )); EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::default_nested_enum_extension )); EXPECT_EQ(unittest::FOREIGN_FOO , message.GetExtension(unittest::default_foreign_enum_extension)); EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::default_import_enum_extension )); EXPECT_EQ("424", message.GetExtension(unittest::default_string_piece_extension)); EXPECT_EQ("425", message.GetExtension(unittest::default_cord_extension)); EXPECT_TRUE(message.HasExtension(unittest::oneof_uint32_extension)); EXPECT_TRUE(message.GetExtension(unittest::oneof_nested_message_extension).has_bb()); EXPECT_TRUE(message.HasExtension(unittest::oneof_string_extension)); EXPECT_TRUE(message.HasExtension(unittest::oneof_bytes_extension)); EXPECT_EQ(601, message.GetExtension(unittest::oneof_uint32_extension)); EXPECT_EQ(602, message.GetExtension(unittest::oneof_nested_message_extension).bb()); EXPECT_EQ("603", message.GetExtension(unittest::oneof_string_extension)); EXPECT_EQ("604", message.GetExtension(unittest::oneof_bytes_extension)); } // ------------------------------------------------------------------- void TestUtil::ExpectExtensionsClear( const unittest::TestAllExtensions& message) { string serialized; ASSERT_TRUE(message.SerializeToString(&serialized)); EXPECT_EQ("", serialized); EXPECT_EQ(0, message.ByteSize()); // has_blah() should initially be false for all optional fields. EXPECT_FALSE(message.HasExtension(unittest::optional_int32_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_uint32_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_uint64_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_sint32_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_sint64_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_fixed32_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_fixed64_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed32_extension)); EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed64_extension)); EXPECT_FALSE(message.HasExtension(unittest::optional_float_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_double_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_bool_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_string_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_bytes_extension )); EXPECT_FALSE(message.HasExtension(unittest::optionalgroup_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_nested_message_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_message_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_import_message_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_public_import_message_extension)); EXPECT_FALSE(message.HasExtension(unittest::optional_lazy_message_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_nested_enum_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_enum_extension)); EXPECT_FALSE(message.HasExtension(unittest::optional_import_enum_extension )); EXPECT_FALSE(message.HasExtension(unittest::optional_string_piece_extension)); EXPECT_FALSE(message.HasExtension(unittest::optional_cord_extension)); // Optional fields without defaults are set to zero or something like it. EXPECT_EQ(0 , message.GetExtension(unittest::optional_int32_extension )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_int64_extension )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_uint32_extension )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_uint64_extension )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_sint32_extension )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_sint64_extension )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_fixed32_extension )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_fixed64_extension )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_sfixed32_extension)); EXPECT_EQ(0 , message.GetExtension(unittest::optional_sfixed64_extension)); EXPECT_EQ(0 , message.GetExtension(unittest::optional_float_extension )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_double_extension )); EXPECT_FALSE( message.GetExtension(unittest::optional_bool_extension )); EXPECT_EQ("" , message.GetExtension(unittest::optional_string_extension )); EXPECT_EQ("" , message.GetExtension(unittest::optional_bytes_extension )); // Embedded messages should also be clear. EXPECT_FALSE(message.GetExtension(unittest::optionalgroup_extension ).has_a()); EXPECT_FALSE(message.GetExtension(unittest::optional_nested_message_extension ).has_bb()); EXPECT_FALSE(message.GetExtension(unittest::optional_foreign_message_extension ).has_c()); EXPECT_FALSE(message.GetExtension(unittest::optional_import_message_extension ).has_d()); EXPECT_FALSE(message.GetExtension(unittest::optional_public_import_message_extension).has_e()); EXPECT_FALSE(message.GetExtension(unittest::optional_lazy_message_extension ).has_bb()); EXPECT_EQ(0, message.GetExtension(unittest::optionalgroup_extension ).a()); EXPECT_EQ(0, message.GetExtension(unittest::optional_nested_message_extension ).bb()); EXPECT_EQ(0, message.GetExtension(unittest::optional_foreign_message_extension ).c()); EXPECT_EQ(0, message.GetExtension(unittest::optional_import_message_extension ).d()); EXPECT_EQ(0, message.GetExtension(unittest::optional_public_import_message_extension).e()); EXPECT_EQ(0, message.GetExtension(unittest::optional_lazy_message_extension ).bb()); // Enums without defaults are set to the first value in the enum. EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::optional_nested_enum_extension )); EXPECT_EQ(unittest::FOREIGN_FOO , message.GetExtension(unittest::optional_foreign_enum_extension)); EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::optional_import_enum_extension )); EXPECT_EQ("", message.GetExtension(unittest::optional_string_piece_extension)); EXPECT_EQ("", message.GetExtension(unittest::optional_cord_extension)); // Repeated fields are empty. EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int32_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int64_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint32_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint64_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint32_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint64_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed32_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed64_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed32_extension)); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed64_extension)); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_float_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_double_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bool_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bytes_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeatedgroup_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_message_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_message_extension)); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_message_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_lazy_message_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_enum_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_enum_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_enum_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_piece_extension)); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_cord_extension)); // has_blah() should also be false for all default fields. EXPECT_FALSE(message.HasExtension(unittest::default_int32_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_int64_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_uint32_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_uint64_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_sint32_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_sint64_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_fixed32_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_fixed64_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_sfixed32_extension)); EXPECT_FALSE(message.HasExtension(unittest::default_sfixed64_extension)); EXPECT_FALSE(message.HasExtension(unittest::default_float_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_double_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_bool_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_string_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_bytes_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_nested_enum_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_foreign_enum_extension)); EXPECT_FALSE(message.HasExtension(unittest::default_import_enum_extension )); EXPECT_FALSE(message.HasExtension(unittest::default_string_piece_extension)); EXPECT_FALSE(message.HasExtension(unittest::default_cord_extension)); // Fields with defaults have their default values (duh). EXPECT_EQ( 41 , message.GetExtension(unittest::default_int32_extension )); EXPECT_EQ( 42 , message.GetExtension(unittest::default_int64_extension )); EXPECT_EQ( 43 , message.GetExtension(unittest::default_uint32_extension )); EXPECT_EQ( 44 , message.GetExtension(unittest::default_uint64_extension )); EXPECT_EQ(-45 , message.GetExtension(unittest::default_sint32_extension )); EXPECT_EQ( 46 , message.GetExtension(unittest::default_sint64_extension )); EXPECT_EQ( 47 , message.GetExtension(unittest::default_fixed32_extension )); EXPECT_EQ( 48 , message.GetExtension(unittest::default_fixed64_extension )); EXPECT_EQ( 49 , message.GetExtension(unittest::default_sfixed32_extension)); EXPECT_EQ(-50 , message.GetExtension(unittest::default_sfixed64_extension)); EXPECT_EQ( 51.5 , message.GetExtension(unittest::default_float_extension )); EXPECT_EQ( 52e3 , message.GetExtension(unittest::default_double_extension )); EXPECT_TRUE( message.GetExtension(unittest::default_bool_extension )); EXPECT_EQ("hello", message.GetExtension(unittest::default_string_extension )); EXPECT_EQ("world", message.GetExtension(unittest::default_bytes_extension )); EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::default_nested_enum_extension )); EXPECT_EQ(unittest::FOREIGN_BAR , message.GetExtension(unittest::default_foreign_enum_extension)); EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::default_import_enum_extension )); EXPECT_EQ("abc", message.GetExtension(unittest::default_string_piece_extension)); EXPECT_EQ("123", message.GetExtension(unittest::default_cord_extension)); EXPECT_FALSE(message.HasExtension(unittest::oneof_uint32_extension)); EXPECT_FALSE(message.GetExtension(unittest::oneof_nested_message_extension).has_bb()); EXPECT_FALSE(message.HasExtension(unittest::oneof_string_extension)); EXPECT_FALSE(message.HasExtension(unittest::oneof_bytes_extension)); } // ------------------------------------------------------------------- void TestUtil::ExpectRepeatedExtensionsModified( const unittest::TestAllExtensions& message) { // 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. ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_lazy_message_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension)); EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension , 0)); EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension , 0)); EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension , 0)); EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension , 0)); EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension , 0)); EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension , 0)); EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension , 0)); EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension , 0)); EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension, 0)); EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 0)); EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 0)); EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 0)); EXPECT_TRUE( message.GetExtension(unittest::repeated_bool_extension , 0)); EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 0)); EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 0)); EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension , 0).a()); EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb()); EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c()); EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d()); EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension , 0).bb()); EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0)); EXPECT_EQ(unittest::FOREIGN_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension, 0)); EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0)); EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 0)); EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 0)); // Actually verify the second (modified) elements now. EXPECT_EQ(501 , message.GetExtension(unittest::repeated_int32_extension , 1)); EXPECT_EQ(502 , message.GetExtension(unittest::repeated_int64_extension , 1)); EXPECT_EQ(503 , message.GetExtension(unittest::repeated_uint32_extension , 1)); EXPECT_EQ(504 , message.GetExtension(unittest::repeated_uint64_extension , 1)); EXPECT_EQ(505 , message.GetExtension(unittest::repeated_sint32_extension , 1)); EXPECT_EQ(506 , message.GetExtension(unittest::repeated_sint64_extension , 1)); EXPECT_EQ(507 , message.GetExtension(unittest::repeated_fixed32_extension , 1)); EXPECT_EQ(508 , message.GetExtension(unittest::repeated_fixed64_extension , 1)); EXPECT_EQ(509 , message.GetExtension(unittest::repeated_sfixed32_extension, 1)); EXPECT_EQ(510 , message.GetExtension(unittest::repeated_sfixed64_extension, 1)); EXPECT_EQ(511 , message.GetExtension(unittest::repeated_float_extension , 1)); EXPECT_EQ(512 , message.GetExtension(unittest::repeated_double_extension , 1)); EXPECT_TRUE( message.GetExtension(unittest::repeated_bool_extension , 1)); EXPECT_EQ("515", message.GetExtension(unittest::repeated_string_extension , 1)); EXPECT_EQ("516", message.GetExtension(unittest::repeated_bytes_extension , 1)); EXPECT_EQ(517, message.GetExtension(unittest::repeatedgroup_extension , 1).a()); EXPECT_EQ(518, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb()); EXPECT_EQ(519, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c()); EXPECT_EQ(520, message.GetExtension(unittest::repeated_import_message_extension , 1).d()); EXPECT_EQ(527, message.GetExtension(unittest::repeated_lazy_message_extension , 1).bb()); EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::repeated_nested_enum_extension , 1)); EXPECT_EQ(unittest::FOREIGN_FOO , message.GetExtension(unittest::repeated_foreign_enum_extension, 1)); EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::repeated_import_enum_extension , 1)); EXPECT_EQ("524", message.GetExtension(unittest::repeated_string_piece_extension, 1)); EXPECT_EQ("525", message.GetExtension(unittest::repeated_cord_extension, 1)); } // ------------------------------------------------------------------- void TestUtil::SetPackedExtensions(unittest::TestPackedExtensions* message) { message->AddExtension(unittest::packed_int32_extension , 601); message->AddExtension(unittest::packed_int64_extension , 602); message->AddExtension(unittest::packed_uint32_extension , 603); message->AddExtension(unittest::packed_uint64_extension , 604); message->AddExtension(unittest::packed_sint32_extension , 605); message->AddExtension(unittest::packed_sint64_extension , 606); message->AddExtension(unittest::packed_fixed32_extension , 607); message->AddExtension(unittest::packed_fixed64_extension , 608); message->AddExtension(unittest::packed_sfixed32_extension, 609); message->AddExtension(unittest::packed_sfixed64_extension, 610); message->AddExtension(unittest::packed_float_extension , 611); message->AddExtension(unittest::packed_double_extension , 612); message->AddExtension(unittest::packed_bool_extension , true); message->AddExtension(unittest::packed_enum_extension, unittest::FOREIGN_BAR); // add a second one of each field message->AddExtension(unittest::packed_int32_extension , 701); message->AddExtension(unittest::packed_int64_extension , 702); message->AddExtension(unittest::packed_uint32_extension , 703); message->AddExtension(unittest::packed_uint64_extension , 704); message->AddExtension(unittest::packed_sint32_extension , 705); message->AddExtension(unittest::packed_sint64_extension , 706); message->AddExtension(unittest::packed_fixed32_extension , 707); message->AddExtension(unittest::packed_fixed64_extension , 708); message->AddExtension(unittest::packed_sfixed32_extension, 709); message->AddExtension(unittest::packed_sfixed64_extension, 710); message->AddExtension(unittest::packed_float_extension , 711); message->AddExtension(unittest::packed_double_extension , 712); message->AddExtension(unittest::packed_bool_extension , false); message->AddExtension(unittest::packed_enum_extension, unittest::FOREIGN_BAZ); } // ------------------------------------------------------------------- void TestUtil::ModifyPackedExtensions(unittest::TestPackedExtensions* message) { message->SetExtension(unittest::packed_int32_extension , 1, 801); message->SetExtension(unittest::packed_int64_extension , 1, 802); message->SetExtension(unittest::packed_uint32_extension , 1, 803); message->SetExtension(unittest::packed_uint64_extension , 1, 804); message->SetExtension(unittest::packed_sint32_extension , 1, 805); message->SetExtension(unittest::packed_sint64_extension , 1, 806); message->SetExtension(unittest::packed_fixed32_extension , 1, 807); message->SetExtension(unittest::packed_fixed64_extension , 1, 808); message->SetExtension(unittest::packed_sfixed32_extension, 1, 809); message->SetExtension(unittest::packed_sfixed64_extension, 1, 810); message->SetExtension(unittest::packed_float_extension , 1, 811); message->SetExtension(unittest::packed_double_extension , 1, 812); message->SetExtension(unittest::packed_bool_extension , 1, true); message->SetExtension(unittest::packed_enum_extension , 1, unittest::FOREIGN_FOO); } // ------------------------------------------------------------------- void TestUtil::ExpectPackedExtensionsSet( const unittest::TestPackedExtensions& message) { ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension )); EXPECT_EQ(601 , message.GetExtension(unittest::packed_int32_extension , 0)); EXPECT_EQ(602 , message.GetExtension(unittest::packed_int64_extension , 0)); EXPECT_EQ(603 , message.GetExtension(unittest::packed_uint32_extension , 0)); EXPECT_EQ(604 , message.GetExtension(unittest::packed_uint64_extension , 0)); EXPECT_EQ(605 , message.GetExtension(unittest::packed_sint32_extension , 0)); EXPECT_EQ(606 , message.GetExtension(unittest::packed_sint64_extension , 0)); EXPECT_EQ(607 , message.GetExtension(unittest::packed_fixed32_extension , 0)); EXPECT_EQ(608 , message.GetExtension(unittest::packed_fixed64_extension , 0)); EXPECT_EQ(609 , message.GetExtension(unittest::packed_sfixed32_extension, 0)); EXPECT_EQ(610 , message.GetExtension(unittest::packed_sfixed64_extension, 0)); EXPECT_EQ(611 , message.GetExtension(unittest::packed_float_extension , 0)); EXPECT_EQ(612 , message.GetExtension(unittest::packed_double_extension , 0)); EXPECT_TRUE( message.GetExtension(unittest::packed_bool_extension , 0)); EXPECT_EQ(unittest::FOREIGN_BAR, message.GetExtension(unittest::packed_enum_extension, 0)); EXPECT_EQ(701 , message.GetExtension(unittest::packed_int32_extension , 1)); EXPECT_EQ(702 , message.GetExtension(unittest::packed_int64_extension , 1)); EXPECT_EQ(703 , message.GetExtension(unittest::packed_uint32_extension , 1)); EXPECT_EQ(704 , message.GetExtension(unittest::packed_uint64_extension , 1)); EXPECT_EQ(705 , message.GetExtension(unittest::packed_sint32_extension , 1)); EXPECT_EQ(706 , message.GetExtension(unittest::packed_sint64_extension , 1)); EXPECT_EQ(707 , message.GetExtension(unittest::packed_fixed32_extension , 1)); EXPECT_EQ(708 , message.GetExtension(unittest::packed_fixed64_extension , 1)); EXPECT_EQ(709 , message.GetExtension(unittest::packed_sfixed32_extension, 1)); EXPECT_EQ(710 , message.GetExtension(unittest::packed_sfixed64_extension, 1)); EXPECT_EQ(711 , message.GetExtension(unittest::packed_float_extension , 1)); EXPECT_EQ(712 , message.GetExtension(unittest::packed_double_extension , 1)); EXPECT_FALSE( message.GetExtension(unittest::packed_bool_extension , 1)); EXPECT_EQ(unittest::FOREIGN_BAZ, message.GetExtension(unittest::packed_enum_extension, 1)); } // ------------------------------------------------------------------- void TestUtil::ExpectPackedExtensionsClear( const unittest::TestPackedExtensions& message) { EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int32_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int64_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint32_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint64_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint32_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint64_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed32_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed64_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed32_extension)); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed64_extension)); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_float_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_double_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_bool_extension )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_enum_extension )); } // ------------------------------------------------------------------- void TestUtil::ExpectPackedExtensionsModified( const unittest::TestPackedExtensions& message) { ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension )); EXPECT_EQ(601 , message.GetExtension(unittest::packed_int32_extension , 0)); EXPECT_EQ(602 , message.GetExtension(unittest::packed_int64_extension , 0)); EXPECT_EQ(603 , message.GetExtension(unittest::packed_uint32_extension , 0)); EXPECT_EQ(604 , message.GetExtension(unittest::packed_uint64_extension , 0)); EXPECT_EQ(605 , message.GetExtension(unittest::packed_sint32_extension , 0)); EXPECT_EQ(606 , message.GetExtension(unittest::packed_sint64_extension , 0)); EXPECT_EQ(607 , message.GetExtension(unittest::packed_fixed32_extension , 0)); EXPECT_EQ(608 , message.GetExtension(unittest::packed_fixed64_extension , 0)); EXPECT_EQ(609 , message.GetExtension(unittest::packed_sfixed32_extension, 0)); EXPECT_EQ(610 , message.GetExtension(unittest::packed_sfixed64_extension, 0)); EXPECT_EQ(611 , message.GetExtension(unittest::packed_float_extension , 0)); EXPECT_EQ(612 , message.GetExtension(unittest::packed_double_extension , 0)); EXPECT_TRUE( message.GetExtension(unittest::packed_bool_extension , 0)); EXPECT_EQ(unittest::FOREIGN_BAR, message.GetExtension(unittest::packed_enum_extension, 0)); // Actually verify the second (modified) elements now. EXPECT_EQ(801 , message.GetExtension(unittest::packed_int32_extension , 1)); EXPECT_EQ(802 , message.GetExtension(unittest::packed_int64_extension , 1)); EXPECT_EQ(803 , message.GetExtension(unittest::packed_uint32_extension , 1)); EXPECT_EQ(804 , message.GetExtension(unittest::packed_uint64_extension , 1)); EXPECT_EQ(805 , message.GetExtension(unittest::packed_sint32_extension , 1)); EXPECT_EQ(806 , message.GetExtension(unittest::packed_sint64_extension , 1)); EXPECT_EQ(807 , message.GetExtension(unittest::packed_fixed32_extension , 1)); EXPECT_EQ(808 , message.GetExtension(unittest::packed_fixed64_extension , 1)); EXPECT_EQ(809 , message.GetExtension(unittest::packed_sfixed32_extension, 1)); EXPECT_EQ(810 , message.GetExtension(unittest::packed_sfixed64_extension, 1)); EXPECT_EQ(811 , message.GetExtension(unittest::packed_float_extension , 1)); EXPECT_EQ(812 , message.GetExtension(unittest::packed_double_extension , 1)); EXPECT_TRUE( message.GetExtension(unittest::packed_bool_extension , 1)); EXPECT_EQ(unittest::FOREIGN_FOO, message.GetExtension(unittest::packed_enum_extension, 1)); } // ------------------------------------------------------------------- void TestUtil::ExpectUnpackedExtensionsSet( const unittest::TestUnpackedExtensions& message) { ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_int32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_int64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_uint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_uint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_sint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_sint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_fixed32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_fixed64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_sfixed32_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_sfixed64_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_float_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_double_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_bool_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::unpacked_enum_extension )); EXPECT_EQ(601 , message.GetExtension(unittest::unpacked_int32_extension , 0)); EXPECT_EQ(602 , message.GetExtension(unittest::unpacked_int64_extension , 0)); EXPECT_EQ(603 , message.GetExtension(unittest::unpacked_uint32_extension , 0)); EXPECT_EQ(604 , message.GetExtension(unittest::unpacked_uint64_extension , 0)); EXPECT_EQ(605 , message.GetExtension(unittest::unpacked_sint32_extension , 0)); EXPECT_EQ(606 , message.GetExtension(unittest::unpacked_sint64_extension , 0)); EXPECT_EQ(607 , message.GetExtension(unittest::unpacked_fixed32_extension , 0)); EXPECT_EQ(608 , message.GetExtension(unittest::unpacked_fixed64_extension , 0)); EXPECT_EQ(609 , message.GetExtension(unittest::unpacked_sfixed32_extension, 0)); EXPECT_EQ(610 , message.GetExtension(unittest::unpacked_sfixed64_extension, 0)); EXPECT_EQ(611 , message.GetExtension(unittest::unpacked_float_extension , 0)); EXPECT_EQ(612 , message.GetExtension(unittest::unpacked_double_extension , 0)); EXPECT_EQ(true , message.GetExtension(unittest::unpacked_bool_extension , 0)); EXPECT_EQ(unittest::FOREIGN_BAR, message.GetExtension(unittest::unpacked_enum_extension, 0)); EXPECT_EQ(701 , message.GetExtension(unittest::unpacked_int32_extension , 1)); EXPECT_EQ(702 , message.GetExtension(unittest::unpacked_int64_extension , 1)); EXPECT_EQ(703 , message.GetExtension(unittest::unpacked_uint32_extension , 1)); EXPECT_EQ(704 , message.GetExtension(unittest::unpacked_uint64_extension , 1)); EXPECT_EQ(705 , message.GetExtension(unittest::unpacked_sint32_extension , 1)); EXPECT_EQ(706 , message.GetExtension(unittest::unpacked_sint64_extension , 1)); EXPECT_EQ(707 , message.GetExtension(unittest::unpacked_fixed32_extension , 1)); EXPECT_EQ(708 , message.GetExtension(unittest::unpacked_fixed64_extension , 1)); EXPECT_EQ(709 , message.GetExtension(unittest::unpacked_sfixed32_extension, 1)); EXPECT_EQ(710 , 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_EQ(unittest::FOREIGN_BAZ, message.GetExtension(unittest::unpacked_enum_extension, 1)); } // ------------------------------------------------------------------- void TestUtil::ExpectAllFieldsAndExtensionsInOrder(const string& serialized) { // We set each field individually, serialize separately, and concatenate all // the strings in canonical order to determine the expected serialization. string expected; unittest::TestFieldOrderings message; message.set_my_int(1); // Field 1. message.AppendToString(&expected); message.Clear(); message.SetExtension(unittest::my_extension_int, 23); // Field 5. message.AppendToString(&expected); message.Clear(); message.set_my_string("foo"); // Field 11. message.AppendToString(&expected); message.Clear(); message.SetExtension(unittest::my_extension_string, "bar"); // Field 50. message.AppendToString(&expected); message.Clear(); message.set_my_float(1.0); // Field 101. message.AppendToString(&expected); message.Clear(); // We don't EXPECT_EQ() since we don't want to print raw bytes to stdout. EXPECT_TRUE(serialized == expected); } void TestUtil::ExpectLastRepeatedsRemoved( const unittest::TestAllTypes& message) { ASSERT_EQ(1, message.repeated_int32_size ()); ASSERT_EQ(1, message.repeated_int64_size ()); ASSERT_EQ(1, message.repeated_uint32_size ()); ASSERT_EQ(1, message.repeated_uint64_size ()); ASSERT_EQ(1, message.repeated_sint32_size ()); ASSERT_EQ(1, message.repeated_sint64_size ()); ASSERT_EQ(1, message.repeated_fixed32_size ()); ASSERT_EQ(1, message.repeated_fixed64_size ()); ASSERT_EQ(1, message.repeated_sfixed32_size()); ASSERT_EQ(1, message.repeated_sfixed64_size()); ASSERT_EQ(1, message.repeated_float_size ()); ASSERT_EQ(1, message.repeated_double_size ()); ASSERT_EQ(1, message.repeated_bool_size ()); ASSERT_EQ(1, message.repeated_string_size ()); ASSERT_EQ(1, message.repeated_bytes_size ()); ASSERT_EQ(1, message.repeatedgroup_size ()); ASSERT_EQ(1, message.repeated_nested_message_size ()); ASSERT_EQ(1, message.repeated_foreign_message_size()); ASSERT_EQ(1, message.repeated_import_message_size ()); ASSERT_EQ(1, message.repeated_import_message_size ()); ASSERT_EQ(1, message.repeated_nested_enum_size ()); ASSERT_EQ(1, message.repeated_foreign_enum_size ()); ASSERT_EQ(1, message.repeated_import_enum_size ()); #ifndef PROTOBUF_TEST_NO_DESCRIPTORS ASSERT_EQ(1, message.repeated_string_piece_size()); ASSERT_EQ(1, message.repeated_cord_size()); #endif // Test that the remaining element is the correct one. EXPECT_EQ(201 , message.repeated_int32 (0)); EXPECT_EQ(202 , message.repeated_int64 (0)); EXPECT_EQ(203 , message.repeated_uint32 (0)); EXPECT_EQ(204 , message.repeated_uint64 (0)); EXPECT_EQ(205 , message.repeated_sint32 (0)); EXPECT_EQ(206 , message.repeated_sint64 (0)); EXPECT_EQ(207 , message.repeated_fixed32 (0)); EXPECT_EQ(208 , message.repeated_fixed64 (0)); EXPECT_EQ(209 , message.repeated_sfixed32(0)); EXPECT_EQ(210 , message.repeated_sfixed64(0)); EXPECT_EQ(211 , message.repeated_float (0)); EXPECT_EQ(212 , message.repeated_double (0)); EXPECT_TRUE( message.repeated_bool (0)); EXPECT_EQ("215", message.repeated_string (0)); EXPECT_EQ("216", message.repeated_bytes (0)); EXPECT_EQ(217, message.repeatedgroup (0).a()); EXPECT_EQ(218, message.repeated_nested_message (0).bb()); EXPECT_EQ(219, message.repeated_foreign_message(0).c()); EXPECT_EQ(220, message.repeated_import_message (0).d()); EXPECT_EQ(220, message.repeated_import_message (0).d()); EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0)); EXPECT_EQ(unittest::FOREIGN_BAR , message.repeated_foreign_enum(0)); EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0)); } void TestUtil::ExpectLastRepeatedExtensionsRemoved( const unittest::TestAllExtensions& message) { // Test that one element was removed. ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_int32_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_int64_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_uint32_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_uint64_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sint32_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sint64_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_fixed32_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_fixed64_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sfixed32_extension)); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sfixed64_extension)); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_float_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_double_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_bool_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_bytes_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeatedgroup_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_nested_message_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_foreign_message_extension)); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_import_message_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_lazy_message_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_nested_enum_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_foreign_enum_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_import_enum_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_piece_extension)); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_cord_extension)); // Test that the remaining element is the correct one. EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension , 0)); EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension , 0)); EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension , 0)); EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension , 0)); EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension , 0)); EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension , 0)); EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension , 0)); EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension , 0)); EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension, 0)); EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 0)); EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 0)); EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 0)); EXPECT_TRUE( message.GetExtension(unittest::repeated_bool_extension , 0)); EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 0)); EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 0)); EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension , 0).a()); EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb()); EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c()); EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d()); EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension , 0).bb()); EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0)); EXPECT_EQ(unittest::FOREIGN_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension, 0)); EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0)); EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 0)); EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 0)); } void TestUtil::ExpectLastRepeatedsReleased( const unittest::TestAllTypes& message) { ASSERT_EQ(1, message.repeatedgroup_size ()); ASSERT_EQ(1, message.repeated_nested_message_size ()); ASSERT_EQ(1, message.repeated_foreign_message_size()); ASSERT_EQ(1, message.repeated_import_message_size ()); ASSERT_EQ(1, message.repeated_import_message_size ()); EXPECT_EQ(217, message.repeatedgroup (0).a()); EXPECT_EQ(218, message.repeated_nested_message (0).bb()); EXPECT_EQ(219, message.repeated_foreign_message(0).c()); EXPECT_EQ(220, message.repeated_import_message (0).d()); EXPECT_EQ(220, message.repeated_import_message (0).d()); } void TestUtil::ExpectLastRepeatedExtensionsReleased( const unittest::TestAllExtensions& message) { ASSERT_EQ(1, message.ExtensionSize(unittest::repeatedgroup_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_nested_message_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_foreign_message_extension)); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_import_message_extension )); ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_lazy_message_extension )); EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension , 0).a()); EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb()); EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c()); EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d()); EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension , 0).bb()); } void TestUtil::ExpectRepeatedsSwapped( const unittest::TestAllTypes& message) { ASSERT_EQ(2, message.repeated_int32_size ()); ASSERT_EQ(2, message.repeated_int64_size ()); ASSERT_EQ(2, message.repeated_uint32_size ()); ASSERT_EQ(2, message.repeated_uint64_size ()); ASSERT_EQ(2, message.repeated_sint32_size ()); ASSERT_EQ(2, message.repeated_sint64_size ()); ASSERT_EQ(2, message.repeated_fixed32_size ()); ASSERT_EQ(2, message.repeated_fixed64_size ()); ASSERT_EQ(2, message.repeated_sfixed32_size()); ASSERT_EQ(2, message.repeated_sfixed64_size()); ASSERT_EQ(2, message.repeated_float_size ()); ASSERT_EQ(2, message.repeated_double_size ()); ASSERT_EQ(2, message.repeated_bool_size ()); ASSERT_EQ(2, message.repeated_string_size ()); ASSERT_EQ(2, message.repeated_bytes_size ()); ASSERT_EQ(2, message.repeatedgroup_size ()); ASSERT_EQ(2, message.repeated_nested_message_size ()); ASSERT_EQ(2, message.repeated_foreign_message_size()); ASSERT_EQ(2, message.repeated_import_message_size ()); ASSERT_EQ(2, message.repeated_import_message_size ()); ASSERT_EQ(2, message.repeated_nested_enum_size ()); ASSERT_EQ(2, message.repeated_foreign_enum_size ()); ASSERT_EQ(2, message.repeated_import_enum_size ()); #ifndef PROTOBUF_TEST_NO_DESCRIPTORS ASSERT_EQ(2, message.repeated_string_piece_size()); ASSERT_EQ(2, message.repeated_cord_size()); #endif // Test that the first element and second element are flipped. EXPECT_EQ(201 , message.repeated_int32 (1)); EXPECT_EQ(202 , message.repeated_int64 (1)); EXPECT_EQ(203 , message.repeated_uint32 (1)); EXPECT_EQ(204 , message.repeated_uint64 (1)); EXPECT_EQ(205 , message.repeated_sint32 (1)); EXPECT_EQ(206 , message.repeated_sint64 (1)); EXPECT_EQ(207 , message.repeated_fixed32 (1)); EXPECT_EQ(208 , message.repeated_fixed64 (1)); EXPECT_EQ(209 , message.repeated_sfixed32(1)); EXPECT_EQ(210 , message.repeated_sfixed64(1)); EXPECT_EQ(211 , message.repeated_float (1)); EXPECT_EQ(212 , message.repeated_double (1)); EXPECT_TRUE( message.repeated_bool (1)); EXPECT_EQ("215", message.repeated_string (1)); EXPECT_EQ("216", message.repeated_bytes (1)); EXPECT_EQ(217, message.repeatedgroup (1).a()); EXPECT_EQ(218, message.repeated_nested_message (1).bb()); EXPECT_EQ(219, message.repeated_foreign_message(1).c()); EXPECT_EQ(220, message.repeated_import_message (1).d()); EXPECT_EQ(220, message.repeated_import_message (1).d()); EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (1)); EXPECT_EQ(unittest::FOREIGN_BAR , message.repeated_foreign_enum(1)); EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (1)); EXPECT_EQ(301 , message.repeated_int32 (0)); EXPECT_EQ(302 , message.repeated_int64 (0)); EXPECT_EQ(303 , message.repeated_uint32 (0)); EXPECT_EQ(304 , message.repeated_uint64 (0)); EXPECT_EQ(305 , message.repeated_sint32 (0)); EXPECT_EQ(306 , message.repeated_sint64 (0)); EXPECT_EQ(307 , message.repeated_fixed32 (0)); EXPECT_EQ(308 , message.repeated_fixed64 (0)); EXPECT_EQ(309 , message.repeated_sfixed32(0)); EXPECT_EQ(310 , message.repeated_sfixed64(0)); EXPECT_EQ(311 , message.repeated_float (0)); EXPECT_EQ(312 , message.repeated_double (0)); EXPECT_FALSE( message.repeated_bool (0)); EXPECT_EQ("315", message.repeated_string (0)); EXPECT_EQ("316", message.repeated_bytes (0)); EXPECT_EQ(317, message.repeatedgroup (0).a()); EXPECT_EQ(318, message.repeated_nested_message (0).bb()); EXPECT_EQ(319, message.repeated_foreign_message(0).c()); EXPECT_EQ(320, message.repeated_import_message (0).d()); EXPECT_EQ(320, message.repeated_import_message (0).d()); EXPECT_EQ(unittest::TestAllTypes::BAZ, message.repeated_nested_enum (0)); EXPECT_EQ(unittest::FOREIGN_BAZ , message.repeated_foreign_enum(0)); EXPECT_EQ(unittest_import::IMPORT_BAZ, message.repeated_import_enum (0)); } void TestUtil::ExpectRepeatedExtensionsSwapped( const unittest::TestAllExtensions& message) { ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_lazy_message_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension)); EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension , 1)); EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension , 1)); EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension , 1)); EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension , 1)); EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension , 1)); EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension , 1)); EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension , 1)); EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension , 1)); EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension, 1)); EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 1)); EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 1)); EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 1)); EXPECT_TRUE( message.GetExtension(unittest::repeated_bool_extension , 1)); EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 1)); EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 1)); EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension , 1).a()); EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb()); EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c()); EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 1).d()); EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension , 1).bb()); EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 1)); EXPECT_EQ(unittest::FOREIGN_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension, 1)); EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 1)); EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 1)); EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 1)); EXPECT_EQ(301 , message.GetExtension(unittest::repeated_int32_extension , 0)); EXPECT_EQ(302 , message.GetExtension(unittest::repeated_int64_extension , 0)); EXPECT_EQ(303 , message.GetExtension(unittest::repeated_uint32_extension , 0)); EXPECT_EQ(304 , message.GetExtension(unittest::repeated_uint64_extension , 0)); EXPECT_EQ(305 , message.GetExtension(unittest::repeated_sint32_extension , 0)); EXPECT_EQ(306 , message.GetExtension(unittest::repeated_sint64_extension , 0)); EXPECT_EQ(307 , message.GetExtension(unittest::repeated_fixed32_extension , 0)); EXPECT_EQ(308 , message.GetExtension(unittest::repeated_fixed64_extension , 0)); EXPECT_EQ(309 , message.GetExtension(unittest::repeated_sfixed32_extension, 0)); EXPECT_EQ(310 , message.GetExtension(unittest::repeated_sfixed64_extension, 0)); EXPECT_EQ(311 , message.GetExtension(unittest::repeated_float_extension , 0)); EXPECT_EQ(312 , message.GetExtension(unittest::repeated_double_extension , 0)); EXPECT_FALSE( message.GetExtension(unittest::repeated_bool_extension , 0)); EXPECT_EQ("315", message.GetExtension(unittest::repeated_string_extension , 0)); EXPECT_EQ("316", message.GetExtension(unittest::repeated_bytes_extension , 0)); EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension , 0).a()); EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb()); EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c()); EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension , 0).d()); EXPECT_EQ(327, message.GetExtension(unittest::repeated_lazy_message_extension , 0).bb()); EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::repeated_nested_enum_extension , 0)); EXPECT_EQ(unittest::FOREIGN_BAZ , message.GetExtension(unittest::repeated_foreign_enum_extension, 0)); EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::repeated_import_enum_extension , 0)); EXPECT_EQ("324", message.GetExtension(unittest::repeated_string_piece_extension, 0)); EXPECT_EQ("325", message.GetExtension(unittest::repeated_cord_extension, 0)); } void TestUtil::SetOneof1(unittest::TestOneof2* message) { message->mutable_foo_lazy_message()->set_qux_int(100); message->set_bar_string("101"); message->set_baz_int(102); message->set_baz_string("103"); } void TestUtil::SetOneof2(unittest::TestOneof2* message) { message->set_foo_int(200); message->set_bar_enum(unittest::TestOneof2::BAZ); message->set_baz_int(202); message->set_baz_string("203"); } void TestUtil::ExpectOneofSet1(const unittest::TestOneof2& message) { ExpectAtMostOneFieldSetInOneof(message); EXPECT_TRUE(message.has_foo_lazy_message ()); EXPECT_TRUE(message.foo_lazy_message().has_qux_int()); EXPECT_TRUE(message.has_bar_string()); EXPECT_TRUE(message.has_baz_int ()); EXPECT_TRUE(message.has_baz_string()); ASSERT_EQ(0, message.foo_lazy_message().corge_int_size()); EXPECT_EQ(100 , message.foo_lazy_message().qux_int()); EXPECT_EQ("101", message.bar_string ()); EXPECT_EQ(102 , message.baz_int ()); EXPECT_EQ("103", message.baz_string ()); } void TestUtil::ExpectOneofSet2(const unittest::TestOneof2& message) { ExpectAtMostOneFieldSetInOneof(message); EXPECT_TRUE(message.has_foo_int ()); EXPECT_TRUE(message.has_bar_enum ()); EXPECT_TRUE(message.has_baz_int ()); EXPECT_TRUE(message.has_baz_string()); EXPECT_EQ(200 , message.foo_int ()); EXPECT_EQ(unittest::TestOneof2::BAZ, message.bar_enum ()); EXPECT_EQ(202 , message.baz_int ()); EXPECT_EQ("203" , message.baz_string()); } void TestUtil::ExpectOneofClear(const unittest::TestOneof2& message) { EXPECT_FALSE(message.has_foo_int()); EXPECT_FALSE(message.has_foo_string()); EXPECT_FALSE(message.has_foo_bytes()); EXPECT_FALSE(message.has_foo_enum()); EXPECT_FALSE(message.has_foo_message()); EXPECT_FALSE(message.has_foogroup()); EXPECT_FALSE(message.has_foo_lazy_message()); EXPECT_FALSE(message.has_bar_int()); EXPECT_FALSE(message.has_bar_string()); EXPECT_FALSE(message.has_bar_bytes()); EXPECT_FALSE(message.has_bar_enum()); EXPECT_FALSE(message.has_baz_int()); EXPECT_FALSE(message.has_baz_string()); EXPECT_EQ(unittest::TestOneof2::FOO_NOT_SET, message.foo_case()); EXPECT_EQ(unittest::TestOneof2::BAR_NOT_SET, message.bar_case()); } void TestUtil::ExpectAtMostOneFieldSetInOneof( const unittest::TestOneof2& message) { int count = 0; if (message.has_foo_int()) count++; if (message.has_foo_string()) count++; if (message.has_foo_bytes()) count++; if (message.has_foo_enum()) count++; if (message.has_foo_message()) count++; if (message.has_foogroup()) count++; if (message.has_foo_lazy_message()) count++; EXPECT_LE(count, 1); count = 0; if (message.has_bar_int()) count++; if (message.has_bar_string()) count++; if (message.has_bar_bytes()) count++; if (message.has_bar_enum()) count++; EXPECT_TRUE(count == 0 || count == 1); } // =================================================================== TestUtil::ReflectionTester::ReflectionTester( const Descriptor* base_descriptor) : base_descriptor_(base_descriptor) { const DescriptorPool* pool = base_descriptor->file()->pool(); nested_b_ = pool->FindFieldByName("protobuf_unittest.TestAllTypes.NestedMessage.bb"); foreign_c_ = pool->FindFieldByName("protobuf_unittest.ForeignMessage.c"); import_d_ = pool->FindFieldByName("protobuf_unittest_import.ImportMessage.d"); import_e_ = pool->FindFieldByName("protobuf_unittest_import.PublicImportMessage.e"); nested_foo_ = pool->FindEnumValueByName("protobuf_unittest.TestAllTypes.FOO"); nested_bar_ = pool->FindEnumValueByName("protobuf_unittest.TestAllTypes.BAR"); nested_baz_ = pool->FindEnumValueByName("protobuf_unittest.TestAllTypes.BAZ"); foreign_foo_ = pool->FindEnumValueByName("protobuf_unittest.FOREIGN_FOO"); foreign_bar_ = pool->FindEnumValueByName("protobuf_unittest.FOREIGN_BAR"); foreign_baz_ = pool->FindEnumValueByName("protobuf_unittest.FOREIGN_BAZ"); import_foo_ = pool->FindEnumValueByName("protobuf_unittest_import.IMPORT_FOO"); import_bar_ = pool->FindEnumValueByName("protobuf_unittest_import.IMPORT_BAR"); import_baz_ = pool->FindEnumValueByName("protobuf_unittest_import.IMPORT_BAZ"); if (base_descriptor_->name() == "TestAllExtensions") { group_a_ = pool->FindFieldByName("protobuf_unittest.OptionalGroup_extension.a"); repeated_group_a_ = pool->FindFieldByName("protobuf_unittest.RepeatedGroup_extension.a"); } else { group_a_ = pool->FindFieldByName("protobuf_unittest.TestAllTypes.OptionalGroup.a"); repeated_group_a_ = pool->FindFieldByName("protobuf_unittest.TestAllTypes.RepeatedGroup.a"); } EXPECT_TRUE(group_a_ != NULL); EXPECT_TRUE(repeated_group_a_ != NULL); EXPECT_TRUE(nested_b_ != NULL); EXPECT_TRUE(foreign_c_ != NULL); EXPECT_TRUE(import_d_ != NULL); EXPECT_TRUE(import_e_ != NULL); EXPECT_TRUE(nested_foo_ != NULL); EXPECT_TRUE(nested_bar_ != NULL); EXPECT_TRUE(nested_baz_ != NULL); EXPECT_TRUE(foreign_foo_ != NULL); EXPECT_TRUE(foreign_bar_ != NULL); EXPECT_TRUE(foreign_baz_ != NULL); EXPECT_TRUE(import_foo_ != NULL); EXPECT_TRUE(import_bar_ != NULL); EXPECT_TRUE(import_baz_ != NULL); } // Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes. const FieldDescriptor* TestUtil::ReflectionTester::F(const string& name) { const FieldDescriptor* result = NULL; if (base_descriptor_->name() == "TestAllExtensions" || base_descriptor_->name() == "TestPackedExtensions") { result = base_descriptor_->file()->FindExtensionByName(name + "_extension"); } else { result = base_descriptor_->FindFieldByName(name); } GOOGLE_CHECK(result != NULL); return result; } // ------------------------------------------------------------------- void TestUtil::ReflectionTester::SetAllFieldsViaReflection(Message* message) { const Reflection* reflection = message->GetReflection(); Message* sub_message; reflection->SetInt32 (message, F("optional_int32" ), 101); reflection->SetInt64 (message, F("optional_int64" ), 102); reflection->SetUInt32(message, F("optional_uint32" ), 103); reflection->SetUInt64(message, F("optional_uint64" ), 104); reflection->SetInt32 (message, F("optional_sint32" ), 105); reflection->SetInt64 (message, F("optional_sint64" ), 106); reflection->SetUInt32(message, F("optional_fixed32" ), 107); reflection->SetUInt64(message, F("optional_fixed64" ), 108); reflection->SetInt32 (message, F("optional_sfixed32"), 109); reflection->SetInt64 (message, F("optional_sfixed64"), 110); reflection->SetFloat (message, F("optional_float" ), 111); reflection->SetDouble(message, F("optional_double" ), 112); reflection->SetBool (message, F("optional_bool" ), true); reflection->SetString(message, F("optional_string" ), "115"); reflection->SetString(message, F("optional_bytes" ), "116"); sub_message = reflection->MutableMessage(message, F("optionalgroup")); sub_message->GetReflection()->SetInt32(sub_message, group_a_, 117); sub_message = reflection->MutableMessage(message, F("optional_nested_message")); sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 118); sub_message = reflection->MutableMessage(message, F("optional_foreign_message")); sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 119); sub_message = reflection->MutableMessage(message, F("optional_import_message")); sub_message->GetReflection()->SetInt32(sub_message, import_d_, 120); reflection->SetEnum(message, F("optional_nested_enum" ), nested_baz_); reflection->SetEnum(message, F("optional_foreign_enum"), foreign_baz_); reflection->SetEnum(message, F("optional_import_enum" ), import_baz_); reflection->SetString(message, F("optional_string_piece"), "124"); reflection->SetString(message, F("optional_cord"), "125"); sub_message = reflection->MutableMessage(message, F("optional_public_import_message")); sub_message->GetReflection()->SetInt32(sub_message, import_e_, 126); sub_message = reflection->MutableMessage(message, F("optional_lazy_message")); sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 127); // ----------------------------------------------------------------- reflection->AddInt32 (message, F("repeated_int32" ), 201); reflection->AddInt64 (message, F("repeated_int64" ), 202); reflection->AddUInt32(message, F("repeated_uint32" ), 203); reflection->AddUInt64(message, F("repeated_uint64" ), 204); reflection->AddInt32 (message, F("repeated_sint32" ), 205); reflection->AddInt64 (message, F("repeated_sint64" ), 206); reflection->AddUInt32(message, F("repeated_fixed32" ), 207); reflection->AddUInt64(message, F("repeated_fixed64" ), 208); reflection->AddInt32 (message, F("repeated_sfixed32"), 209); reflection->AddInt64 (message, F("repeated_sfixed64"), 210); reflection->AddFloat (message, F("repeated_float" ), 211); reflection->AddDouble(message, F("repeated_double" ), 212); reflection->AddBool (message, F("repeated_bool" ), true); reflection->AddString(message, F("repeated_string" ), "215"); reflection->AddString(message, F("repeated_bytes" ), "216"); sub_message = reflection->AddMessage(message, F("repeatedgroup")); sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 217); sub_message = reflection->AddMessage(message, F("repeated_nested_message")); sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 218); sub_message = reflection->AddMessage(message, F("repeated_foreign_message")); sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 219); sub_message = reflection->AddMessage(message, F("repeated_import_message")); sub_message->GetReflection()->SetInt32(sub_message, import_d_, 220); sub_message = reflection->AddMessage(message, F("repeated_lazy_message")); sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 227); reflection->AddEnum(message, F("repeated_nested_enum" ), nested_bar_); reflection->AddEnum(message, F("repeated_foreign_enum"), foreign_bar_); reflection->AddEnum(message, F("repeated_import_enum" ), import_bar_); reflection->AddString(message, F("repeated_string_piece"), "224"); reflection->AddString(message, F("repeated_cord"), "225"); // Add a second one of each field. reflection->AddInt32 (message, F("repeated_int32" ), 301); reflection->AddInt64 (message, F("repeated_int64" ), 302); reflection->AddUInt32(message, F("repeated_uint32" ), 303); reflection->AddUInt64(message, F("repeated_uint64" ), 304); reflection->AddInt32 (message, F("repeated_sint32" ), 305); reflection->AddInt64 (message, F("repeated_sint64" ), 306); reflection->AddUInt32(message, F("repeated_fixed32" ), 307); reflection->AddUInt64(message, F("repeated_fixed64" ), 308); reflection->AddInt32 (message, F("repeated_sfixed32"), 309); reflection->AddInt64 (message, F("repeated_sfixed64"), 310); reflection->AddFloat (message, F("repeated_float" ), 311); reflection->AddDouble(message, F("repeated_double" ), 312); reflection->AddBool (message, F("repeated_bool" ), false); reflection->AddString(message, F("repeated_string" ), "315"); reflection->AddString(message, F("repeated_bytes" ), "316"); sub_message = reflection->AddMessage(message, F("repeatedgroup")); sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 317); sub_message = reflection->AddMessage(message, F("repeated_nested_message")); sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 318); sub_message = reflection->AddMessage(message, F("repeated_foreign_message")); sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 319); sub_message = reflection->AddMessage(message, F("repeated_import_message")); sub_message->GetReflection()->SetInt32(sub_message, import_d_, 320); sub_message = reflection->AddMessage(message, F("repeated_lazy_message")); sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 327); reflection->AddEnum(message, F("repeated_nested_enum" ), nested_baz_); reflection->AddEnum(message, F("repeated_foreign_enum"), foreign_baz_); reflection->AddEnum(message, F("repeated_import_enum" ), import_baz_); reflection->AddString(message, F("repeated_string_piece"), "324"); reflection->AddString(message, F("repeated_cord"), "325"); // ----------------------------------------------------------------- reflection->SetInt32 (message, F("default_int32" ), 401); reflection->SetInt64 (message, F("default_int64" ), 402); reflection->SetUInt32(message, F("default_uint32" ), 403); reflection->SetUInt64(message, F("default_uint64" ), 404); reflection->SetInt32 (message, F("default_sint32" ), 405); reflection->SetInt64 (message, F("default_sint64" ), 406); reflection->SetUInt32(message, F("default_fixed32" ), 407); reflection->SetUInt64(message, F("default_fixed64" ), 408); reflection->SetInt32 (message, F("default_sfixed32"), 409); reflection->SetInt64 (message, F("default_sfixed64"), 410); reflection->SetFloat (message, F("default_float" ), 411); reflection->SetDouble(message, F("default_double" ), 412); reflection->SetBool (message, F("default_bool" ), false); reflection->SetString(message, F("default_string" ), "415"); reflection->SetString(message, F("default_bytes" ), "416"); reflection->SetEnum(message, F("default_nested_enum" ), nested_foo_); reflection->SetEnum(message, F("default_foreign_enum"), foreign_foo_); reflection->SetEnum(message, F("default_import_enum" ), import_foo_); reflection->SetString(message, F("default_string_piece"), "424"); reflection->SetString(message, F("default_cord"), "425"); reflection->SetUInt32(message, F("oneof_uint32" ), 601); sub_message = reflection->MutableMessage(message, F("oneof_nested_message")); sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 602); reflection->SetString(message, F("oneof_string"), "603"); reflection->SetString(message, F("oneof_bytes" ), "604"); } void TestUtil::ReflectionTester::SetOneofViaReflection(Message* message) { const Descriptor* descriptor = message->GetDescriptor(); const Reflection* reflection = message->GetReflection(); Message* sub_message = reflection->MutableMessage( message, descriptor->FindFieldByName("foo_lazy_message")); sub_message->GetReflection()->SetInt64( sub_message, descriptor->file()->pool()->FindFieldByName( "protobuf_unittest.TestOneof2.NestedMessage.qux_int"), 100); reflection->SetString(message, descriptor->FindFieldByName("bar_cord"), "101"); reflection->SetInt32(message, descriptor->FindFieldByName("baz_int"), 102); reflection->SetString(message, descriptor->FindFieldByName("baz_string"), "103"); } void TestUtil::ReflectionTester::ExpectOneofSetViaReflection( const Message& message) { const Descriptor* descriptor = message.GetDescriptor(); const Reflection* reflection = message.GetReflection(); string scratch; EXPECT_TRUE(reflection->HasField( message, descriptor->FindFieldByName("foo_lazy_message"))); EXPECT_TRUE(reflection->HasField( message, descriptor->FindFieldByName("bar_cord"))); EXPECT_TRUE(reflection->HasField( message, descriptor->FindFieldByName("baz_int"))); EXPECT_TRUE(reflection->HasField( message, descriptor->FindFieldByName("baz_string"))); const Message* sub_message = &reflection->GetMessage( message, descriptor->FindFieldByName("foo_lazy_message")); EXPECT_EQ(100, sub_message->GetReflection()->GetInt64( *sub_message, descriptor->file()->pool()->FindFieldByName( "protobuf_unittest.TestOneof2.NestedMessage.qux_int"))); EXPECT_EQ("101", reflection->GetString( message, descriptor->FindFieldByName("bar_cord"))); EXPECT_EQ("101", reflection->GetStringReference( message, descriptor->FindFieldByName("bar_cord"), &scratch)); EXPECT_EQ(102, reflection->GetInt32( message, descriptor->FindFieldByName("baz_int"))); EXPECT_EQ("103", reflection->GetString( message, descriptor->FindFieldByName("baz_string"))); EXPECT_EQ("103", reflection->GetStringReference( message, descriptor->FindFieldByName("baz_string"), &scratch)); } void TestUtil::ReflectionTester::SetPackedFieldsViaReflection( Message* message) { const Reflection* reflection = message->GetReflection(); reflection->AddInt32 (message, F("packed_int32" ), 601); reflection->AddInt64 (message, F("packed_int64" ), 602); reflection->AddUInt32(message, F("packed_uint32" ), 603); reflection->AddUInt64(message, F("packed_uint64" ), 604); reflection->AddInt32 (message, F("packed_sint32" ), 605); reflection->AddInt64 (message, F("packed_sint64" ), 606); reflection->AddUInt32(message, F("packed_fixed32" ), 607); reflection->AddUInt64(message, F("packed_fixed64" ), 608); reflection->AddInt32 (message, F("packed_sfixed32"), 609); reflection->AddInt64 (message, F("packed_sfixed64"), 610); reflection->AddFloat (message, F("packed_float" ), 611); reflection->AddDouble(message, F("packed_double" ), 612); reflection->AddBool (message, F("packed_bool" ), true); reflection->AddEnum (message, F("packed_enum" ), foreign_bar_); reflection->AddInt32 (message, F("packed_int32" ), 701); reflection->AddInt64 (message, F("packed_int64" ), 702); reflection->AddUInt32(message, F("packed_uint32" ), 703); reflection->AddUInt64(message, F("packed_uint64" ), 704); reflection->AddInt32 (message, F("packed_sint32" ), 705); reflection->AddInt64 (message, F("packed_sint64" ), 706); reflection->AddUInt32(message, F("packed_fixed32" ), 707); reflection->AddUInt64(message, F("packed_fixed64" ), 708); reflection->AddInt32 (message, F("packed_sfixed32"), 709); reflection->AddInt64 (message, F("packed_sfixed64"), 710); reflection->AddFloat (message, F("packed_float" ), 711); reflection->AddDouble(message, F("packed_double" ), 712); reflection->AddBool (message, F("packed_bool" ), false); reflection->AddEnum (message, F("packed_enum" ), foreign_baz_); } // ------------------------------------------------------------------- void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection( const Message& message) { // We have to split this into three function otherwise it creates a stack // frame so large that it triggers a warning. ExpectAllFieldsSetViaReflection1(message); ExpectAllFieldsSetViaReflection2(message); ExpectAllFieldsSetViaReflection3(message); } void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection1( const Message& message) { const Reflection* reflection = message.GetReflection(); string scratch; const Message* sub_message; EXPECT_TRUE(reflection->HasField(message, F("optional_int32" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_int64" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_uint32" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_uint64" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_sint32" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_sint64" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_fixed32" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_fixed64" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_sfixed32"))); EXPECT_TRUE(reflection->HasField(message, F("optional_sfixed64"))); EXPECT_TRUE(reflection->HasField(message, F("optional_float" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_double" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_bool" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_string" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_bytes" ))); EXPECT_TRUE(reflection->HasField(message, F("optionalgroup" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_nested_message" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_foreign_message" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_import_message" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_public_import_message"))); EXPECT_TRUE(reflection->HasField(message, F("optional_lazy_message" ))); sub_message = &reflection->GetMessage(message, F("optionalgroup")); EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, group_a_)); sub_message = &reflection->GetMessage(message, F("optional_nested_message")); EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, nested_b_)); sub_message = &reflection->GetMessage(message, F("optional_foreign_message")); EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, foreign_c_)); sub_message = &reflection->GetMessage(message, F("optional_import_message")); EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, import_d_)); sub_message = &reflection->GetMessage(message, F("optional_public_import_message")); EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, import_e_)); sub_message = &reflection->GetMessage(message, F("optional_lazy_message")); EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, nested_b_)); EXPECT_TRUE(reflection->HasField(message, F("optional_nested_enum" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_foreign_enum"))); EXPECT_TRUE(reflection->HasField(message, F("optional_import_enum" ))); EXPECT_TRUE(reflection->HasField(message, F("optional_string_piece"))); EXPECT_TRUE(reflection->HasField(message, F("optional_cord"))); EXPECT_EQ(101 , reflection->GetInt32 (message, F("optional_int32" ))); EXPECT_EQ(102 , reflection->GetInt64 (message, F("optional_int64" ))); EXPECT_EQ(103 , reflection->GetUInt32(message, F("optional_uint32" ))); EXPECT_EQ(104 , reflection->GetUInt64(message, F("optional_uint64" ))); EXPECT_EQ(105 , reflection->GetInt32 (message, F("optional_sint32" ))); EXPECT_EQ(106 , reflection->GetInt64 (message, F("optional_sint64" ))); EXPECT_EQ(107 , reflection->GetUInt32(message, F("optional_fixed32" ))); EXPECT_EQ(108 , reflection->GetUInt64(message, F("optional_fixed64" ))); EXPECT_EQ(109 , reflection->GetInt32 (message, F("optional_sfixed32"))); EXPECT_EQ(110 , reflection->GetInt64 (message, F("optional_sfixed64"))); EXPECT_EQ(111 , reflection->GetFloat (message, F("optional_float" ))); EXPECT_EQ(112 , reflection->GetDouble(message, F("optional_double" ))); EXPECT_TRUE( reflection->GetBool (message, F("optional_bool" ))); EXPECT_EQ("115", reflection->GetString(message, F("optional_string" ))); EXPECT_EQ("116", reflection->GetString(message, F("optional_bytes" ))); EXPECT_EQ("115", reflection->GetStringReference(message, F("optional_string"), &scratch)); EXPECT_EQ("116", reflection->GetStringReference(message, F("optional_bytes" ), &scratch)); sub_message = &reflection->GetMessage(message, F("optionalgroup")); EXPECT_EQ(117, sub_message->GetReflection()->GetInt32(*sub_message, group_a_)); sub_message = &reflection->GetMessage(message, F("optional_nested_message")); EXPECT_EQ(118, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); sub_message = &reflection->GetMessage(message, F("optional_foreign_message")); EXPECT_EQ(119, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_)); sub_message = &reflection->GetMessage(message, F("optional_import_message")); EXPECT_EQ(120, sub_message->GetReflection()->GetInt32(*sub_message, import_d_)); sub_message = &reflection->GetMessage(message, F("optional_public_import_message")); EXPECT_EQ(126, sub_message->GetReflection()->GetInt32(*sub_message, import_e_)); sub_message = &reflection->GetMessage(message, F("optional_lazy_message")); EXPECT_EQ(127, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); EXPECT_EQ( nested_baz_, reflection->GetEnum(message, F("optional_nested_enum" ))); EXPECT_EQ(foreign_baz_, reflection->GetEnum(message, F("optional_foreign_enum"))); EXPECT_EQ( import_baz_, reflection->GetEnum(message, F("optional_import_enum" ))); EXPECT_EQ("124", reflection->GetString(message, F("optional_string_piece"))); EXPECT_EQ("124", reflection->GetStringReference(message, F("optional_string_piece"), &scratch)); EXPECT_EQ("125", reflection->GetString(message, F("optional_cord"))); EXPECT_EQ("125", reflection->GetStringReference(message, F("optional_cord"), &scratch)); EXPECT_TRUE(reflection->HasField(message, F("oneof_bytes" ))); EXPECT_EQ("604", reflection->GetString(message, F("oneof_bytes" ))); if (base_descriptor_->name() == "TestAllTypes") { EXPECT_FALSE(reflection->HasField(message, F("oneof_uint32"))); EXPECT_FALSE(reflection->HasField(message, F("oneof_string"))); } else { EXPECT_TRUE(reflection->HasField(message, F("oneof_uint32"))); EXPECT_TRUE(reflection->HasField(message, F("oneof_string"))); EXPECT_EQ(601 , reflection->GetUInt32(message, F("oneof_uint32"))); EXPECT_EQ("603", reflection->GetString(message, F("oneof_string"))); sub_message = &reflection->GetMessage(message, F("oneof_nested_message")); EXPECT_EQ(602, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); } } void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection2( const Message& message) { const Reflection* reflection = message.GetReflection(); string scratch; const Message* sub_message; // ----------------------------------------------------------------- ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_int32" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_int64" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_uint32" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_uint64" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sint32" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sint64" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_fixed32" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_fixed64" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sfixed32"))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sfixed64"))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_float" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_double" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_bool" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_string" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_bytes" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeatedgroup" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_nested_message" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_foreign_message"))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_import_message" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_lazy_message" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_nested_enum" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_foreign_enum" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_import_enum" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_string_piece"))); ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_cord"))); EXPECT_EQ(201 , reflection->GetRepeatedInt32 (message, F("repeated_int32" ), 0)); EXPECT_EQ(202 , reflection->GetRepeatedInt64 (message, F("repeated_int64" ), 0)); EXPECT_EQ(203 , reflection->GetRepeatedUInt32(message, F("repeated_uint32" ), 0)); EXPECT_EQ(204 , reflection->GetRepeatedUInt64(message, F("repeated_uint64" ), 0)); EXPECT_EQ(205 , reflection->GetRepeatedInt32 (message, F("repeated_sint32" ), 0)); EXPECT_EQ(206 , reflection->GetRepeatedInt64 (message, F("repeated_sint64" ), 0)); EXPECT_EQ(207 , reflection->GetRepeatedUInt32(message, F("repeated_fixed32" ), 0)); EXPECT_EQ(208 , reflection->GetRepeatedUInt64(message, F("repeated_fixed64" ), 0)); EXPECT_EQ(209 , reflection->GetRepeatedInt32 (message, F("repeated_sfixed32"), 0)); EXPECT_EQ(210 , reflection->GetRepeatedInt64 (message, F("repeated_sfixed64"), 0)); EXPECT_EQ(211 , reflection->GetRepeatedFloat (message, F("repeated_float" ), 0)); EXPECT_EQ(212 , reflection->GetRepeatedDouble(message, F("repeated_double" ), 0)); EXPECT_TRUE( reflection->GetRepeatedBool (message, F("repeated_bool" ), 0)); EXPECT_EQ("215", reflection->GetRepeatedString(message, F("repeated_string" ), 0)); EXPECT_EQ("216", reflection->GetRepeatedString(message, F("repeated_bytes" ), 0)); EXPECT_EQ("215", reflection->GetRepeatedStringReference(message, F("repeated_string"), 0, &scratch)); EXPECT_EQ("216", reflection->GetRepeatedStringReference(message, F("repeated_bytes"), 0, &scratch)); sub_message = &reflection->GetRepeatedMessage(message, F("repeatedgroup"), 0); EXPECT_EQ(217, sub_message->GetReflection()->GetInt32(*sub_message, repeated_group_a_)); sub_message = &reflection->GetRepeatedMessage(message, F("repeated_nested_message"), 0); EXPECT_EQ(218, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); sub_message = &reflection->GetRepeatedMessage(message, F("repeated_foreign_message"), 0); EXPECT_EQ(219, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_)); sub_message = &reflection->GetRepeatedMessage(message, F("repeated_import_message"), 0); EXPECT_EQ(220, sub_message->GetReflection()->GetInt32(*sub_message, import_d_)); sub_message = &reflection->GetRepeatedMessage(message, F("repeated_lazy_message"), 0); EXPECT_EQ(227, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); EXPECT_EQ( nested_bar_, reflection->GetRepeatedEnum(message, F("repeated_nested_enum" ),0)); EXPECT_EQ(foreign_bar_, reflection->GetRepeatedEnum(message, F("repeated_foreign_enum"),0)); EXPECT_EQ( import_bar_, reflection->GetRepeatedEnum(message, F("repeated_import_enum" ),0)); EXPECT_EQ("224", reflection->GetRepeatedString(message, F("repeated_string_piece"), 0)); EXPECT_EQ("224", reflection->GetRepeatedStringReference( message, F("repeated_string_piece"), 0, &scratch)); EXPECT_EQ("225", reflection->GetRepeatedString(message, F("repeated_cord"), 0)); EXPECT_EQ("225", reflection->GetRepeatedStringReference( message, F("repeated_cord"), 0, &scratch)); EXPECT_EQ(301 , reflection->GetRepeatedInt32 (message, F("repeated_int32" ), 1)); EXPECT_EQ(302 , reflection->GetRepeatedInt64 (message, F("repeated_int64" ), 1)); EXPECT_EQ(303 , reflection->GetRepeatedUInt32(message, F("repeated_uint32" ), 1)); EXPECT_EQ(304 , reflection->GetRepeatedUInt64(message, F("repeated_uint64" ), 1)); EXPECT_EQ(305 , reflection->GetRepeatedInt32 (message, F("repeated_sint32" ), 1)); EXPECT_EQ(306 , reflection->GetRepeatedInt64 (message, F("repeated_sint64" ), 1)); EXPECT_EQ(307 , reflection->GetRepeatedUInt32(message, F("repeated_fixed32" ), 1)); EXPECT_EQ(308 , reflection->GetRepeatedUInt64(message, F("repeated_fixed64" ), 1)); EXPECT_EQ(309 , reflection->GetRepeatedInt32 (message, F("repeated_sfixed32"), 1)); EXPECT_EQ(310 , reflection->GetRepeatedInt64 (message, F("repeated_sfixed64"), 1)); EXPECT_EQ(311 , reflection->GetRepeatedFloat (message, F("repeated_float" ), 1)); EXPECT_EQ(312 , reflection->GetRepeatedDouble(message, F("repeated_double" ), 1)); EXPECT_FALSE( reflection->GetRepeatedBool (message, F("repeated_bool" ), 1)); EXPECT_EQ("315", reflection->GetRepeatedString(message, F("repeated_string" ), 1)); EXPECT_EQ("316", reflection->GetRepeatedString(message, F("repeated_bytes" ), 1)); EXPECT_EQ("315", reflection->GetRepeatedStringReference(message, F("repeated_string"), 1, &scratch)); EXPECT_EQ("316", reflection->GetRepeatedStringReference(message, F("repeated_bytes"), 1, &scratch)); sub_message = &reflection->GetRepeatedMessage(message, F("repeatedgroup"), 1); EXPECT_EQ(317, sub_message->GetReflection()->GetInt32(*sub_message, repeated_group_a_)); sub_message = &reflection->GetRepeatedMessage(message, F("repeated_nested_message"), 1); EXPECT_EQ(318, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); sub_message = &reflection->GetRepeatedMessage(message, F("repeated_foreign_message"), 1); EXPECT_EQ(319, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_)); sub_message = &reflection->GetRepeatedMessage(message, F("repeated_import_message"), 1); EXPECT_EQ(320, sub_message->GetReflection()->GetInt32(*sub_message, import_d_)); sub_message = &reflection->GetRepeatedMessage(message, F("repeated_lazy_message"), 1); EXPECT_EQ(327, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); EXPECT_EQ( nested_baz_, reflection->GetRepeatedEnum(message, F("repeated_nested_enum" ),1)); EXPECT_EQ(foreign_baz_, reflection->GetRepeatedEnum(message, F("repeated_foreign_enum"),1)); EXPECT_EQ( import_baz_, reflection->GetRepeatedEnum(message, F("repeated_import_enum" ),1)); EXPECT_EQ("324", reflection->GetRepeatedString(message, F("repeated_string_piece"), 1)); EXPECT_EQ("324", reflection->GetRepeatedStringReference( message, F("repeated_string_piece"), 1, &scratch)); EXPECT_EQ("325", reflection->GetRepeatedString(message, F("repeated_cord"), 1)); EXPECT_EQ("325", reflection->GetRepeatedStringReference( message, F("repeated_cord"), 1, &scratch)); } void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection3( const Message& message) { const Reflection* reflection = message.GetReflection(); string scratch; // ----------------------------------------------------------------- EXPECT_TRUE(reflection->HasField(message, F("default_int32" ))); EXPECT_TRUE(reflection->HasField(message, F("default_int64" ))); EXPECT_TRUE(reflection->HasField(message, F("default_uint32" ))); EXPECT_TRUE(reflection->HasField(message, F("default_uint64" ))); EXPECT_TRUE(reflection->HasField(message, F("default_sint32" ))); EXPECT_TRUE(reflection->HasField(message, F("default_sint64" ))); EXPECT_TRUE(reflection->HasField(message, F("default_fixed32" ))); EXPECT_TRUE(reflection->HasField(message, F("default_fixed64" ))); EXPECT_TRUE(reflection->HasField(message, F("default_sfixed32"))); EXPECT_TRUE(reflection->HasField(message, F("default_sfixed64"))); EXPECT_TRUE(reflection->HasField(message, F("default_float" ))); EXPECT_TRUE(reflection->HasField(message, F("default_double" ))); EXPECT_TRUE(reflection->HasField(message, F("default_bool" ))); EXPECT_TRUE(reflection->HasField(message, F("default_string" ))); EXPECT_TRUE(reflection->HasField(message, F("default_bytes" ))); EXPECT_TRUE(reflection->HasField(message, F("default_nested_enum" ))); EXPECT_TRUE(reflection->HasField(message, F("default_foreign_enum"))); EXPECT_TRUE(reflection->HasField(message, F("default_import_enum" ))); EXPECT_TRUE(reflection->HasField(message, F("default_string_piece"))); EXPECT_TRUE(reflection->HasField(message, F("default_cord"))); EXPECT_EQ(401 , reflection->GetInt32 (message, F("default_int32" ))); EXPECT_EQ(402 , reflection->GetInt64 (message, F("default_int64" ))); EXPECT_EQ(403 , reflection->GetUInt32(message, F("default_uint32" ))); EXPECT_EQ(404 , reflection->GetUInt64(message, F("default_uint64" ))); EXPECT_EQ(405 , reflection->GetInt32 (message, F("default_sint32" ))); EXPECT_EQ(406 , reflection->GetInt64 (message, F("default_sint64" ))); EXPECT_EQ(407 , reflection->GetUInt32(message, F("default_fixed32" ))); EXPECT_EQ(408 , reflection->GetUInt64(message, F("default_fixed64" ))); EXPECT_EQ(409 , reflection->GetInt32 (message, F("default_sfixed32"))); EXPECT_EQ(410 , reflection->GetInt64 (message, F("default_sfixed64"))); EXPECT_EQ(411 , reflection->GetFloat (message, F("default_float" ))); EXPECT_EQ(412 , reflection->GetDouble(message, F("default_double" ))); EXPECT_FALSE( reflection->GetBool (message, F("default_bool" ))); EXPECT_EQ("415", reflection->GetString(message, F("default_string" ))); EXPECT_EQ("416", reflection->GetString(message, F("default_bytes" ))); EXPECT_EQ("415", reflection->GetStringReference(message, F("default_string"), &scratch)); EXPECT_EQ("416", reflection->GetStringReference(message, F("default_bytes" ), &scratch)); EXPECT_EQ( nested_foo_, reflection->GetEnum(message, F("default_nested_enum" ))); EXPECT_EQ(foreign_foo_, reflection->GetEnum(message, F("default_foreign_enum"))); EXPECT_EQ( import_foo_, reflection->GetEnum(message, F("default_import_enum" ))); EXPECT_EQ("424", reflection->GetString(message, F("default_string_piece"))); EXPECT_EQ("424", reflection->GetStringReference(message, F("default_string_piece"), &scratch)); EXPECT_EQ("425", reflection->GetString(message, F("default_cord"))); EXPECT_EQ("425", reflection->GetStringReference(message, F("default_cord"), &scratch)); } void TestUtil::ReflectionTester::ExpectPackedFieldsSetViaReflection( const Message& message) { const Reflection* reflection = message.GetReflection(); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_int32" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_int64" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_uint32" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_uint64" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sint32" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sint64" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_fixed32" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_fixed64" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sfixed32"))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sfixed64"))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_float" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_double" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_bool" ))); ASSERT_EQ(2, reflection->FieldSize(message, F("packed_enum" ))); EXPECT_EQ(601 , reflection->GetRepeatedInt32 (message, F("packed_int32" ), 0)); EXPECT_EQ(602 , reflection->GetRepeatedInt64 (message, F("packed_int64" ), 0)); EXPECT_EQ(603 , reflection->GetRepeatedUInt32(message, F("packed_uint32" ), 0)); EXPECT_EQ(604 , reflection->GetRepeatedUInt64(message, F("packed_uint64" ), 0)); EXPECT_EQ(605 , reflection->GetRepeatedInt32 (message, F("packed_sint32" ), 0)); EXPECT_EQ(606 , reflection->GetRepeatedInt64 (message, F("packed_sint64" ), 0)); EXPECT_EQ(607 , reflection->GetRepeatedUInt32(message, F("packed_fixed32" ), 0)); EXPECT_EQ(608 , reflection->GetRepeatedUInt64(message, F("packed_fixed64" ), 0)); EXPECT_EQ(609 , reflection->GetRepeatedInt32 (message, F("packed_sfixed32"), 0)); EXPECT_EQ(610 , reflection->GetRepeatedInt64 (message, F("packed_sfixed64"), 0)); EXPECT_EQ(611 , reflection->GetRepeatedFloat (message, F("packed_float" ), 0)); EXPECT_EQ(612 , reflection->GetRepeatedDouble(message, F("packed_double" ), 0)); EXPECT_TRUE( reflection->GetRepeatedBool (message, F("packed_bool" ), 0)); EXPECT_EQ(foreign_bar_, reflection->GetRepeatedEnum(message, F("packed_enum"), 0)); EXPECT_EQ(701 , reflection->GetRepeatedInt32 (message, F("packed_int32" ), 1)); EXPECT_EQ(702 , reflection->GetRepeatedInt64 (message, F("packed_int64" ), 1)); EXPECT_EQ(703 , reflection->GetRepeatedUInt32(message, F("packed_uint32" ), 1)); EXPECT_EQ(704 , reflection->GetRepeatedUInt64(message, F("packed_uint64" ), 1)); EXPECT_EQ(705 , reflection->GetRepeatedInt32 (message, F("packed_sint32" ), 1)); EXPECT_EQ(706 , reflection->GetRepeatedInt64 (message, F("packed_sint64" ), 1)); EXPECT_EQ(707 , reflection->GetRepeatedUInt32(message, F("packed_fixed32" ), 1)); EXPECT_EQ(708 , reflection->GetRepeatedUInt64(message, F("packed_fixed64" ), 1)); EXPECT_EQ(709 , reflection->GetRepeatedInt32 (message, F("packed_sfixed32"), 1)); EXPECT_EQ(710 , reflection->GetRepeatedInt64 (message, F("packed_sfixed64"), 1)); EXPECT_EQ(711 , reflection->GetRepeatedFloat (message, F("packed_float" ), 1)); EXPECT_EQ(712 , reflection->GetRepeatedDouble(message, F("packed_double" ), 1)); EXPECT_FALSE( reflection->GetRepeatedBool (message, F("packed_bool" ), 1)); EXPECT_EQ(foreign_baz_, reflection->GetRepeatedEnum(message, F("packed_enum"), 1)); } // ------------------------------------------------------------------- void TestUtil::ReflectionTester::ExpectClearViaReflection( const Message& message) { const Reflection* reflection = message.GetReflection(); string scratch; const Message* sub_message; // has_blah() should initially be false for all optional fields. EXPECT_FALSE(reflection->HasField(message, F("optional_int32" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_int64" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_uint32" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_uint64" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_sint32" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_sint64" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_fixed32" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_fixed64" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_sfixed32"))); EXPECT_FALSE(reflection->HasField(message, F("optional_sfixed64"))); EXPECT_FALSE(reflection->HasField(message, F("optional_float" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_double" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_bool" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_string" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_bytes" ))); EXPECT_FALSE(reflection->HasField(message, F("optionalgroup" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_nested_message" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_foreign_message"))); EXPECT_FALSE(reflection->HasField(message, F("optional_import_message" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_public_import_message"))); EXPECT_FALSE(reflection->HasField(message, F("optional_lazy_message"))); EXPECT_FALSE(reflection->HasField(message, F("optional_nested_enum" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_foreign_enum"))); EXPECT_FALSE(reflection->HasField(message, F("optional_import_enum" ))); EXPECT_FALSE(reflection->HasField(message, F("optional_string_piece"))); EXPECT_FALSE(reflection->HasField(message, F("optional_cord"))); // Optional fields without defaults are set to zero or something like it. EXPECT_EQ(0 , reflection->GetInt32 (message, F("optional_int32" ))); EXPECT_EQ(0 , reflection->GetInt64 (message, F("optional_int64" ))); EXPECT_EQ(0 , reflection->GetUInt32(message, F("optional_uint32" ))); EXPECT_EQ(0 , reflection->GetUInt64(message, F("optional_uint64" ))); EXPECT_EQ(0 , reflection->GetInt32 (message, F("optional_sint32" ))); EXPECT_EQ(0 , reflection->GetInt64 (message, F("optional_sint64" ))); EXPECT_EQ(0 , reflection->GetUInt32(message, F("optional_fixed32" ))); EXPECT_EQ(0 , reflection->GetUInt64(message, F("optional_fixed64" ))); EXPECT_EQ(0 , reflection->GetInt32 (message, F("optional_sfixed32"))); EXPECT_EQ(0 , reflection->GetInt64 (message, F("optional_sfixed64"))); EXPECT_EQ(0 , reflection->GetFloat (message, F("optional_float" ))); EXPECT_EQ(0 , reflection->GetDouble(message, F("optional_double" ))); EXPECT_FALSE( reflection->GetBool (message, F("optional_bool" ))); EXPECT_EQ("" , reflection->GetString(message, F("optional_string" ))); EXPECT_EQ("" , reflection->GetString(message, F("optional_bytes" ))); EXPECT_EQ("", reflection->GetStringReference(message, F("optional_string"), &scratch)); EXPECT_EQ("", reflection->GetStringReference(message, F("optional_bytes" ), &scratch)); // Embedded messages should also be clear. sub_message = &reflection->GetMessage(message, F("optionalgroup")); EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, group_a_)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, group_a_)); sub_message = &reflection->GetMessage(message, F("optional_nested_message")); EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, nested_b_)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); sub_message = &reflection->GetMessage(message, F("optional_foreign_message")); EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, foreign_c_)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_)); sub_message = &reflection->GetMessage(message, F("optional_import_message")); EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, import_d_)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, import_d_)); sub_message = &reflection->GetMessage(message, F("optional_public_import_message")); EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, import_e_)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, import_e_)); sub_message = &reflection->GetMessage(message, F("optional_lazy_message")); EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, nested_b_)); EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); // Enums without defaults are set to the first value in the enum. EXPECT_EQ( nested_foo_, reflection->GetEnum(message, F("optional_nested_enum" ))); EXPECT_EQ(foreign_foo_, reflection->GetEnum(message, F("optional_foreign_enum"))); EXPECT_EQ( import_foo_, reflection->GetEnum(message, F("optional_import_enum" ))); EXPECT_EQ("", reflection->GetString(message, F("optional_string_piece"))); EXPECT_EQ("", reflection->GetStringReference(message, F("optional_string_piece"), &scratch)); EXPECT_EQ("", reflection->GetString(message, F("optional_cord"))); EXPECT_EQ("", reflection->GetStringReference(message, F("optional_cord"), &scratch)); // Repeated fields are empty. EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_int32" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_int64" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_uint32" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_uint64" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sint32" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sint64" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_fixed32" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_fixed64" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sfixed32"))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sfixed64"))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_float" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_double" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_bool" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_string" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_bytes" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeatedgroup" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_nested_message" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_foreign_message"))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_import_message" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_lazy_message" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_nested_enum" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_foreign_enum" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_import_enum" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_string_piece"))); EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_cord"))); // has_blah() should also be false for all default fields. EXPECT_FALSE(reflection->HasField(message, F("default_int32" ))); EXPECT_FALSE(reflection->HasField(message, F("default_int64" ))); EXPECT_FALSE(reflection->HasField(message, F("default_uint32" ))); EXPECT_FALSE(reflection->HasField(message, F("default_uint64" ))); EXPECT_FALSE(reflection->HasField(message, F("default_sint32" ))); EXPECT_FALSE(reflection->HasField(message, F("default_sint64" ))); EXPECT_FALSE(reflection->HasField(message, F("default_fixed32" ))); EXPECT_FALSE(reflection->HasField(message, F("default_fixed64" ))); EXPECT_FALSE(reflection->HasField(message, F("default_sfixed32"))); EXPECT_FALSE(reflection->HasField(message, F("default_sfixed64"))); EXPECT_FALSE(reflection->HasField(message, F("default_float" ))); EXPECT_FALSE(reflection->HasField(message, F("default_double" ))); EXPECT_FALSE(reflection->HasField(message, F("default_bool" ))); EXPECT_FALSE(reflection->HasField(message, F("default_string" ))); EXPECT_FALSE(reflection->HasField(message, F("default_bytes" ))); EXPECT_FALSE(reflection->HasField(message, F("default_nested_enum" ))); EXPECT_FALSE(reflection->HasField(message, F("default_foreign_enum"))); EXPECT_FALSE(reflection->HasField(message, F("default_import_enum" ))); EXPECT_FALSE(reflection->HasField(message, F("default_string_piece"))); EXPECT_FALSE(reflection->HasField(message, F("default_cord"))); // Fields with defaults have their default values (duh). EXPECT_EQ( 41 , reflection->GetInt32 (message, F("default_int32" ))); EXPECT_EQ( 42 , reflection->GetInt64 (message, F("default_int64" ))); EXPECT_EQ( 43 , reflection->GetUInt32(message, F("default_uint32" ))); EXPECT_EQ( 44 , reflection->GetUInt64(message, F("default_uint64" ))); EXPECT_EQ(-45 , reflection->GetInt32 (message, F("default_sint32" ))); EXPECT_EQ( 46 , reflection->GetInt64 (message, F("default_sint64" ))); EXPECT_EQ( 47 , reflection->GetUInt32(message, F("default_fixed32" ))); EXPECT_EQ( 48 , reflection->GetUInt64(message, F("default_fixed64" ))); EXPECT_EQ( 49 , reflection->GetInt32 (message, F("default_sfixed32"))); EXPECT_EQ(-50 , reflection->GetInt64 (message, F("default_sfixed64"))); EXPECT_EQ( 51.5 , reflection->GetFloat (message, F("default_float" ))); EXPECT_EQ( 52e3 , reflection->GetDouble(message, F("default_double" ))); EXPECT_TRUE( reflection->GetBool (message, F("default_bool" ))); EXPECT_EQ("hello", reflection->GetString(message, F("default_string" ))); EXPECT_EQ("world", reflection->GetString(message, F("default_bytes" ))); EXPECT_EQ("hello", reflection->GetStringReference(message, F("default_string"), &scratch)); EXPECT_EQ("world", reflection->GetStringReference(message, F("default_bytes" ), &scratch)); EXPECT_EQ( nested_bar_, reflection->GetEnum(message, F("default_nested_enum" ))); EXPECT_EQ(foreign_bar_, reflection->GetEnum(message, F("default_foreign_enum"))); EXPECT_EQ( import_bar_, reflection->GetEnum(message, F("default_import_enum" ))); EXPECT_EQ("abc", reflection->GetString(message, F("default_string_piece"))); EXPECT_EQ("abc", reflection->GetStringReference(message, F("default_string_piece"), &scratch)); EXPECT_EQ("123", reflection->GetString(message, F("default_cord"))); EXPECT_EQ("123", reflection->GetStringReference(message, F("default_cord"), &scratch)); } void TestUtil::ReflectionTester::ExpectPackedClearViaReflection( const Message& message) { const Reflection* reflection = message.GetReflection(); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_int32" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_int64" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_uint32" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_uint64" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sint32" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sint64" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_fixed32" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_fixed64" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sfixed32"))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sfixed64"))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_float" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_double" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_bool" ))); EXPECT_EQ(0, reflection->FieldSize(message, F("packed_enum" ))); } // ------------------------------------------------------------------- void TestUtil::ReflectionTester::ModifyRepeatedFieldsViaReflection( Message* message) { const Reflection* reflection = message->GetReflection(); Message* sub_message; reflection->SetRepeatedInt32 (message, F("repeated_int32" ), 1, 501); reflection->SetRepeatedInt64 (message, F("repeated_int64" ), 1, 502); reflection->SetRepeatedUInt32(message, F("repeated_uint32" ), 1, 503); reflection->SetRepeatedUInt64(message, F("repeated_uint64" ), 1, 504); reflection->SetRepeatedInt32 (message, F("repeated_sint32" ), 1, 505); reflection->SetRepeatedInt64 (message, F("repeated_sint64" ), 1, 506); reflection->SetRepeatedUInt32(message, F("repeated_fixed32" ), 1, 507); reflection->SetRepeatedUInt64(message, F("repeated_fixed64" ), 1, 508); reflection->SetRepeatedInt32 (message, F("repeated_sfixed32"), 1, 509); reflection->SetRepeatedInt64 (message, F("repeated_sfixed64"), 1, 510); reflection->SetRepeatedFloat (message, F("repeated_float" ), 1, 511); reflection->SetRepeatedDouble(message, F("repeated_double" ), 1, 512); reflection->SetRepeatedBool (message, F("repeated_bool" ), 1, true); reflection->SetRepeatedString(message, F("repeated_string" ), 1, "515"); reflection->SetRepeatedString(message, F("repeated_bytes" ), 1, "516"); sub_message = reflection->MutableRepeatedMessage(message, F("repeatedgroup"), 1); sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 517); sub_message = reflection->MutableRepeatedMessage(message, F("repeated_nested_message"), 1); sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 518); sub_message = reflection->MutableRepeatedMessage(message, F("repeated_foreign_message"), 1); sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 519); sub_message = reflection->MutableRepeatedMessage(message, F("repeated_import_message"), 1); sub_message->GetReflection()->SetInt32(sub_message, import_d_, 520); sub_message = reflection->MutableRepeatedMessage(message, F("repeated_lazy_message"), 1); sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 527); reflection->SetRepeatedEnum(message, F("repeated_nested_enum" ), 1, nested_foo_); reflection->SetRepeatedEnum(message, F("repeated_foreign_enum"), 1, foreign_foo_); reflection->SetRepeatedEnum(message, F("repeated_import_enum" ), 1, import_foo_); reflection->SetRepeatedString(message, F("repeated_string_piece"), 1, "524"); reflection->SetRepeatedString(message, F("repeated_cord"), 1, "525"); } void TestUtil::ReflectionTester::ModifyPackedFieldsViaReflection( Message* message) { const Reflection* reflection = message->GetReflection(); reflection->SetRepeatedInt32 (message, F("packed_int32" ), 1, 801); reflection->SetRepeatedInt64 (message, F("packed_int64" ), 1, 802); reflection->SetRepeatedUInt32(message, F("packed_uint32" ), 1, 803); reflection->SetRepeatedUInt64(message, F("packed_uint64" ), 1, 804); reflection->SetRepeatedInt32 (message, F("packed_sint32" ), 1, 805); reflection->SetRepeatedInt64 (message, F("packed_sint64" ), 1, 806); reflection->SetRepeatedUInt32(message, F("packed_fixed32" ), 1, 807); reflection->SetRepeatedUInt64(message, F("packed_fixed64" ), 1, 808); reflection->SetRepeatedInt32 (message, F("packed_sfixed32"), 1, 809); reflection->SetRepeatedInt64 (message, F("packed_sfixed64"), 1, 810); reflection->SetRepeatedFloat (message, F("packed_float" ), 1, 811); reflection->SetRepeatedDouble(message, F("packed_double" ), 1, 812); reflection->SetRepeatedBool (message, F("packed_bool" ), 1, true); reflection->SetRepeatedEnum (message, F("packed_enum" ), 1, foreign_foo_); } void TestUtil::ReflectionTester::RemoveLastRepeatedsViaReflection( Message* message) { const Reflection* reflection = message->GetReflection(); std::vector output; reflection->ListFields(*message, &output); for (int i=0; iis_repeated()) continue; reflection->RemoveLast(message, field); } } void TestUtil::ReflectionTester::ReleaseLastRepeatedsViaReflection( Message* message, bool expect_extensions_notnull) { const Reflection* reflection = message->GetReflection(); std::vector output; reflection->ListFields(*message, &output); for (int i=0; iis_repeated()) continue; if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) continue; Message* released = reflection->ReleaseLast(message, field); if (!field->is_extension() || expect_extensions_notnull) { ASSERT_TRUE(released != NULL) << "ReleaseLast returned NULL for: " << field->name(); } delete released; } } void TestUtil::ReflectionTester::SwapRepeatedsViaReflection(Message* message) { const Reflection* reflection = message->GetReflection(); std::vector output; reflection->ListFields(*message, &output); for (int i=0; iis_repeated()) continue; reflection->SwapElements(message, field, 0, 1); } } void TestUtil::ReflectionTester:: SetAllocatedOptionalMessageFieldsToNullViaReflection( Message* message) { const Reflection* reflection = message->GetReflection(); std::vector fields; reflection->ListFields(*message, &fields); for (int i = 0; i < fields.size(); ++i) { const FieldDescriptor* field = fields[i]; if (!field->is_optional() || field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) continue; reflection->SetAllocatedMessage(message, NULL, field); } } void TestUtil::ReflectionTester:: SetAllocatedOptionalMessageFieldsToMessageViaReflection( Message* from_message, Message* to_message) { EXPECT_EQ(from_message->GetDescriptor(), to_message->GetDescriptor()); const Reflection* from_reflection = from_message->GetReflection(); const Reflection* to_reflection = to_message->GetReflection(); std::vector fields; from_reflection->ListFields(*from_message, &fields); for (int i = 0; i < fields.size(); ++i) { const FieldDescriptor* field = fields[i]; if (!field->is_optional() || field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) continue; Message* sub_message = from_reflection->ReleaseMessage(from_message, field); to_reflection->SetAllocatedMessage(to_message, sub_message, field); } } void TestUtil::ReflectionTester::ExpectMessagesReleasedViaReflection( Message* message, TestUtil::ReflectionTester::MessageReleaseState expected_release_state) { const Reflection* reflection = message->GetReflection(); static const char* fields[] = { "optionalgroup", "optional_nested_message", "optional_foreign_message", "optional_import_message", }; for (int i = 0; i < GOOGLE_ARRAYSIZE(fields); i++) { const Message& sub_message = reflection->GetMessage(*message, F(fields[i])); Message* released = reflection->ReleaseMessage(message, F(fields[i])); switch (expected_release_state) { case IS_NULL: EXPECT_TRUE(released == NULL); break; case NOT_NULL: EXPECT_TRUE(released != NULL); if (message->GetArena() == NULL) { // released message must be same as sub_message if source message is // not on arena. EXPECT_EQ(&sub_message, released); } break; case CAN_BE_NULL: break; } delete released; EXPECT_FALSE(reflection->HasField(*message, F(fields[i]))); } } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/test_util.h000066400000000000000000000225511334102242000274630ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_TEST_UTIL_H__ #define GOOGLE_PROTOBUF_TEST_UTIL_H__ #include #include #include #include namespace google { namespace protobuf { namespace unittest = ::protobuf_unittest; namespace unittest_import = protobuf_unittest_import; class TestUtil { public: // Set every field in the message to a unique value. static void SetAllFields(unittest::TestAllTypes* message); static void SetOptionalFields(unittest::TestAllTypes* message); static void AddRepeatedFields1(unittest::TestAllTypes* message); static void AddRepeatedFields2(unittest::TestAllTypes* message); static void SetDefaultFields(unittest::TestAllTypes* message); static void SetOneofFields(unittest::TestAllTypes* message); static void SetAllExtensions(unittest::TestAllExtensions* message); static void SetOneofFields(unittest::TestAllExtensions* message); static void SetAllFieldsAndExtensions(unittest::TestFieldOrderings* message); static void SetPackedFields(unittest::TestPackedTypes* message); static void SetPackedExtensions(unittest::TestPackedExtensions* message); static void SetUnpackedFields(unittest::TestUnpackedTypes* message); static void SetOneof1(unittest::TestOneof2* message); static void SetOneof2(unittest::TestOneof2* message); // Use the repeated versions of the set_*() accessors to modify all the // repeated fields of the message (which should already have been // initialized with Set*Fields()). Set*Fields() itself only tests // the add_*() accessors. static void ModifyRepeatedFields(unittest::TestAllTypes* message); static void ModifyRepeatedExtensions(unittest::TestAllExtensions* message); static void ModifyPackedFields(unittest::TestPackedTypes* message); static void ModifyPackedExtensions(unittest::TestPackedExtensions* message); // Check that all fields have the values that they should have after // Set*Fields() is called. static void ExpectAllFieldsSet(const unittest::TestAllTypes& message); static void ExpectAllExtensionsSet( const unittest::TestAllExtensions& message); static void ExpectPackedFieldsSet(const unittest::TestPackedTypes& message); static void ExpectPackedExtensionsSet( const unittest::TestPackedExtensions& message); static void ExpectUnpackedFieldsSet( const unittest::TestUnpackedTypes& message); static void ExpectUnpackedExtensionsSet( const unittest::TestUnpackedExtensions& message); static void ExpectOneofSet1(const unittest::TestOneof2& message); static void ExpectOneofSet2(const unittest::TestOneof2& message); // Expect that the message is modified as would be expected from // Modify*Fields(). static void ExpectRepeatedFieldsModified( const unittest::TestAllTypes& message); static void ExpectRepeatedExtensionsModified( const unittest::TestAllExtensions& message); static void ExpectPackedFieldsModified( const unittest::TestPackedTypes& message); static void ExpectPackedExtensionsModified( const unittest::TestPackedExtensions& message); // Check that all fields have their default values. static void ExpectClear(const unittest::TestAllTypes& message); static void ExpectExtensionsClear(const unittest::TestAllExtensions& message); static void ExpectPackedClear(const unittest::TestPackedTypes& message); static void ExpectPackedExtensionsClear( const unittest::TestPackedExtensions& message); static void ExpectOneofClear(const unittest::TestOneof2& message); // Check that the passed-in serialization is the canonical serialization we // expect for a TestFieldOrderings message filled in by // SetAllFieldsAndExtensions(). static void ExpectAllFieldsAndExtensionsInOrder(const string& serialized); // Check that all repeated fields have had their last elements removed. static void ExpectLastRepeatedsRemoved( const unittest::TestAllTypes& message); static void ExpectLastRepeatedExtensionsRemoved( const unittest::TestAllExtensions& message); static void ExpectLastRepeatedsReleased( const unittest::TestAllTypes& message); static void ExpectLastRepeatedExtensionsReleased( const unittest::TestAllExtensions& message); // Check that all repeated fields have had their first and last elements // swapped. static void ExpectRepeatedsSwapped(const unittest::TestAllTypes& message); static void ExpectRepeatedExtensionsSwapped( const unittest::TestAllExtensions& message); static void ExpectAtMostOneFieldSetInOneof( const unittest::TestOneof2 &message); // Like above, but use the reflection interface. class ReflectionTester { public: // base_descriptor must be a descriptor for TestAllTypes or // TestAllExtensions. In the former case, ReflectionTester fetches from // it the FieldDescriptors needed to use the reflection interface. In // the latter case, ReflectionTester searches for extension fields in // its file. explicit ReflectionTester(const Descriptor* base_descriptor); void SetAllFieldsViaReflection(Message* message); void ModifyRepeatedFieldsViaReflection(Message* message); void ExpectAllFieldsSetViaReflection(const Message& message); void ExpectClearViaReflection(const Message& message); void SetPackedFieldsViaReflection(Message* message); void ModifyPackedFieldsViaReflection(Message* message); void ExpectPackedFieldsSetViaReflection(const Message& message); void ExpectPackedClearViaReflection(const Message& message); void RemoveLastRepeatedsViaReflection(Message* message); void ReleaseLastRepeatedsViaReflection( Message* message, bool expect_extensions_notnull); void SwapRepeatedsViaReflection(Message* message); void SetAllocatedOptionalMessageFieldsToNullViaReflection( Message* message); static void SetAllocatedOptionalMessageFieldsToMessageViaReflection( Message* from_message, Message* to_message); enum MessageReleaseState { IS_NULL, CAN_BE_NULL, NOT_NULL, }; void ExpectMessagesReleasedViaReflection( Message* message, MessageReleaseState expected_release_state); // Set and check functions for TestOneof2 messages. No need to construct // the ReflectionTester by TestAllTypes nor TestAllExtensions. static void SetOneofViaReflection(Message* message); static void ExpectOneofSetViaReflection(const Message& message); private: const FieldDescriptor* F(const string& name); const Descriptor* base_descriptor_; const FieldDescriptor* group_a_; const FieldDescriptor* repeated_group_a_; const FieldDescriptor* nested_b_; const FieldDescriptor* foreign_c_; const FieldDescriptor* import_d_; const FieldDescriptor* import_e_; const EnumValueDescriptor* nested_foo_; const EnumValueDescriptor* nested_bar_; const EnumValueDescriptor* nested_baz_; const EnumValueDescriptor* foreign_foo_; const EnumValueDescriptor* foreign_bar_; const EnumValueDescriptor* foreign_baz_; const EnumValueDescriptor* import_foo_; const EnumValueDescriptor* import_bar_; const EnumValueDescriptor* import_baz_; // We have to split this into three function otherwise it creates a stack // frame so large that it triggers a warning. void ExpectAllFieldsSetViaReflection1(const Message& message); void ExpectAllFieldsSetViaReflection2(const Message& message); void ExpectAllFieldsSetViaReflection3(const Message& message); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionTester); }; private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TestUtil); }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_TEST_UTIL_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/test_util_lite.cc000066400000000000000000002623301334102242000306370ustar00rootroot00000000000000// 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 #include #include #include namespace google { namespace protobuf { void TestUtilLite::SetAllFields(unittest::TestAllTypesLite* message) { message->set_optional_int32 (101); message->set_optional_int64 (102); message->set_optional_uint32 (103); message->set_optional_uint64 (104); message->set_optional_sint32 (105); message->set_optional_sint64 (106); message->set_optional_fixed32 (107); message->set_optional_fixed64 (108); message->set_optional_sfixed32(109); message->set_optional_sfixed64(110); message->set_optional_float (111); message->set_optional_double (112); message->set_optional_bool (true); message->set_optional_string ("115"); message->set_optional_bytes ("116"); message->mutable_optionalgroup ()->set_a(117); message->mutable_optional_nested_message ()->set_bb(118); message->mutable_optional_foreign_message ()->set_c(119); message->mutable_optional_import_message ()->set_d(120); message->mutable_optional_public_import_message()->set_e(126); message->mutable_optional_lazy_message ()->set_bb(127); message->set_optional_nested_enum (unittest::TestAllTypesLite::BAZ ); message->set_optional_foreign_enum(unittest::FOREIGN_LITE_BAZ ); message->set_optional_import_enum (unittest_import::IMPORT_LITE_BAZ); // ----------------------------------------------------------------- message->add_repeated_int32 (201); message->add_repeated_int64 (202); message->add_repeated_uint32 (203); message->add_repeated_uint64 (204); message->add_repeated_sint32 (205); message->add_repeated_sint64 (206); message->add_repeated_fixed32 (207); message->add_repeated_fixed64 (208); message->add_repeated_sfixed32(209); message->add_repeated_sfixed64(210); message->add_repeated_float (211); message->add_repeated_double (212); message->add_repeated_bool (true); message->add_repeated_string ("215"); message->add_repeated_bytes ("216"); message->add_repeatedgroup ()->set_a(217); message->add_repeated_nested_message ()->set_bb(218); message->add_repeated_foreign_message()->set_c(219); message->add_repeated_import_message ()->set_d(220); message->add_repeated_lazy_message ()->set_bb(227); message->add_repeated_nested_enum (unittest::TestAllTypesLite::BAR ); message->add_repeated_foreign_enum(unittest::FOREIGN_LITE_BAR ); message->add_repeated_import_enum (unittest_import::IMPORT_LITE_BAR); // Add a second one of each field. message->add_repeated_int32 (301); message->add_repeated_int64 (302); message->add_repeated_uint32 (303); message->add_repeated_uint64 (304); message->add_repeated_sint32 (305); message->add_repeated_sint64 (306); message->add_repeated_fixed32 (307); message->add_repeated_fixed64 (308); message->add_repeated_sfixed32(309); message->add_repeated_sfixed64(310); message->add_repeated_float (311); message->add_repeated_double (312); message->add_repeated_bool (false); message->add_repeated_string ("315"); message->add_repeated_bytes ("316"); message->add_repeatedgroup ()->set_a(317); message->add_repeated_nested_message ()->set_bb(318); message->add_repeated_foreign_message()->set_c(319); message->add_repeated_import_message ()->set_d(320); message->add_repeated_lazy_message ()->set_bb(327); message->add_repeated_nested_enum (unittest::TestAllTypesLite::BAZ ); message->add_repeated_foreign_enum(unittest::FOREIGN_LITE_BAZ ); message->add_repeated_import_enum (unittest_import::IMPORT_LITE_BAZ); // ----------------------------------------------------------------- message->set_default_int32 (401); message->set_default_int64 (402); message->set_default_uint32 (403); message->set_default_uint64 (404); message->set_default_sint32 (405); message->set_default_sint64 (406); message->set_default_fixed32 (407); message->set_default_fixed64 (408); message->set_default_sfixed32(409); message->set_default_sfixed64(410); message->set_default_float (411); message->set_default_double (412); message->set_default_bool (false); message->set_default_string ("415"); message->set_default_bytes ("416"); message->set_default_nested_enum (unittest::TestAllTypesLite::FOO ); message->set_default_foreign_enum(unittest::FOREIGN_LITE_FOO ); message->set_default_import_enum (unittest_import::IMPORT_LITE_FOO); message->set_oneof_uint32(601); message->mutable_oneof_nested_message()->set_bb(602); message->set_oneof_string("603"); message->set_oneof_bytes("604"); } // ------------------------------------------------------------------- void TestUtilLite::ModifyRepeatedFields(unittest::TestAllTypesLite* message) { message->set_repeated_int32 (1, 501); message->set_repeated_int64 (1, 502); message->set_repeated_uint32 (1, 503); message->set_repeated_uint64 (1, 504); message->set_repeated_sint32 (1, 505); message->set_repeated_sint64 (1, 506); message->set_repeated_fixed32 (1, 507); message->set_repeated_fixed64 (1, 508); message->set_repeated_sfixed32(1, 509); message->set_repeated_sfixed64(1, 510); message->set_repeated_float (1, 511); message->set_repeated_double (1, 512); message->set_repeated_bool (1, true); message->set_repeated_string (1, "515"); message->set_repeated_bytes (1, "516"); message->mutable_repeatedgroup (1)->set_a(517); message->mutable_repeated_nested_message (1)->set_bb(518); message->mutable_repeated_foreign_message(1)->set_c(519); message->mutable_repeated_import_message (1)->set_d(520); message->mutable_repeated_lazy_message (1)->set_bb(527); message->set_repeated_nested_enum (1, unittest::TestAllTypesLite::FOO ); message->set_repeated_foreign_enum(1, unittest::FOREIGN_LITE_FOO ); message->set_repeated_import_enum (1, unittest_import::IMPORT_LITE_FOO); } // ------------------------------------------------------------------- void TestUtilLite::ExpectAllFieldsSet( const unittest::TestAllTypesLite& message) { EXPECT_TRUE(message.has_optional_int32 ()); EXPECT_TRUE(message.has_optional_int64 ()); EXPECT_TRUE(message.has_optional_uint32 ()); EXPECT_TRUE(message.has_optional_uint64 ()); EXPECT_TRUE(message.has_optional_sint32 ()); EXPECT_TRUE(message.has_optional_sint64 ()); EXPECT_TRUE(message.has_optional_fixed32 ()); EXPECT_TRUE(message.has_optional_fixed64 ()); EXPECT_TRUE(message.has_optional_sfixed32()); EXPECT_TRUE(message.has_optional_sfixed64()); EXPECT_TRUE(message.has_optional_float ()); EXPECT_TRUE(message.has_optional_double ()); EXPECT_TRUE(message.has_optional_bool ()); EXPECT_TRUE(message.has_optional_string ()); EXPECT_TRUE(message.has_optional_bytes ()); EXPECT_TRUE(message.has_optionalgroup ()); EXPECT_TRUE(message.has_optional_nested_message ()); EXPECT_TRUE(message.has_optional_foreign_message ()); EXPECT_TRUE(message.has_optional_import_message ()); EXPECT_TRUE(message.has_optional_public_import_message()); EXPECT_TRUE(message.has_optional_lazy_message ()); EXPECT_TRUE(message.optionalgroup ().has_a()); EXPECT_TRUE(message.optional_nested_message ().has_bb()); EXPECT_TRUE(message.optional_foreign_message ().has_c()); EXPECT_TRUE(message.optional_import_message ().has_d()); EXPECT_TRUE(message.optional_public_import_message().has_e()); EXPECT_TRUE(message.optional_lazy_message ().has_bb()); EXPECT_TRUE(message.has_optional_nested_enum ()); EXPECT_TRUE(message.has_optional_foreign_enum()); EXPECT_TRUE(message.has_optional_import_enum ()); EXPECT_EQ(101 , message.optional_int32 ()); EXPECT_EQ(102 , message.optional_int64 ()); EXPECT_EQ(103 , message.optional_uint32 ()); EXPECT_EQ(104 , message.optional_uint64 ()); EXPECT_EQ(105 , message.optional_sint32 ()); EXPECT_EQ(106 , message.optional_sint64 ()); EXPECT_EQ(107 , message.optional_fixed32 ()); EXPECT_EQ(108 , message.optional_fixed64 ()); EXPECT_EQ(109 , message.optional_sfixed32()); EXPECT_EQ(110 , message.optional_sfixed64()); EXPECT_EQ(111 , message.optional_float ()); EXPECT_EQ(112 , message.optional_double ()); EXPECT_EQ(true , message.optional_bool ()); EXPECT_EQ("115", message.optional_string ()); EXPECT_EQ("116", message.optional_bytes ()); EXPECT_EQ(117, message.optionalgroup ().a()); EXPECT_EQ(118, message.optional_nested_message ().bb()); EXPECT_EQ(119, message.optional_foreign_message ().c()); EXPECT_EQ(120, message.optional_import_message ().d()); EXPECT_EQ(126, message.optional_public_import_message().e()); EXPECT_EQ(127, message.optional_lazy_message ().bb()); EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.optional_nested_enum ()); EXPECT_EQ(unittest::FOREIGN_LITE_BAZ , message.optional_foreign_enum()); EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.optional_import_enum ()); // ----------------------------------------------------------------- ASSERT_EQ(2, message.repeated_int32_size ()); ASSERT_EQ(2, message.repeated_int64_size ()); ASSERT_EQ(2, message.repeated_uint32_size ()); ASSERT_EQ(2, message.repeated_uint64_size ()); ASSERT_EQ(2, message.repeated_sint32_size ()); ASSERT_EQ(2, message.repeated_sint64_size ()); ASSERT_EQ(2, message.repeated_fixed32_size ()); ASSERT_EQ(2, message.repeated_fixed64_size ()); ASSERT_EQ(2, message.repeated_sfixed32_size()); ASSERT_EQ(2, message.repeated_sfixed64_size()); ASSERT_EQ(2, message.repeated_float_size ()); ASSERT_EQ(2, message.repeated_double_size ()); ASSERT_EQ(2, message.repeated_bool_size ()); ASSERT_EQ(2, message.repeated_string_size ()); ASSERT_EQ(2, message.repeated_bytes_size ()); ASSERT_EQ(2, message.repeatedgroup_size ()); ASSERT_EQ(2, message.repeated_nested_message_size ()); ASSERT_EQ(2, message.repeated_foreign_message_size()); ASSERT_EQ(2, message.repeated_import_message_size ()); ASSERT_EQ(2, message.repeated_lazy_message_size ()); ASSERT_EQ(2, message.repeated_nested_enum_size ()); ASSERT_EQ(2, message.repeated_foreign_enum_size ()); ASSERT_EQ(2, message.repeated_import_enum_size ()); EXPECT_EQ(201 , message.repeated_int32 (0)); EXPECT_EQ(202 , message.repeated_int64 (0)); EXPECT_EQ(203 , message.repeated_uint32 (0)); EXPECT_EQ(204 , message.repeated_uint64 (0)); EXPECT_EQ(205 , message.repeated_sint32 (0)); EXPECT_EQ(206 , message.repeated_sint64 (0)); EXPECT_EQ(207 , message.repeated_fixed32 (0)); EXPECT_EQ(208 , message.repeated_fixed64 (0)); EXPECT_EQ(209 , message.repeated_sfixed32(0)); EXPECT_EQ(210 , message.repeated_sfixed64(0)); EXPECT_EQ(211 , message.repeated_float (0)); EXPECT_EQ(212 , message.repeated_double (0)); EXPECT_EQ(true , message.repeated_bool (0)); EXPECT_EQ("215", message.repeated_string (0)); EXPECT_EQ("216", message.repeated_bytes (0)); EXPECT_EQ(217, message.repeatedgroup (0).a()); EXPECT_EQ(218, message.repeated_nested_message (0).bb()); EXPECT_EQ(219, message.repeated_foreign_message(0).c()); EXPECT_EQ(220, message.repeated_import_message (0).d()); EXPECT_EQ(227, message.repeated_lazy_message (0).bb()); EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.repeated_nested_enum (0)); EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.repeated_foreign_enum(0)); EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.repeated_import_enum (0)); EXPECT_EQ(301 , message.repeated_int32 (1)); EXPECT_EQ(302 , message.repeated_int64 (1)); EXPECT_EQ(303 , message.repeated_uint32 (1)); EXPECT_EQ(304 , message.repeated_uint64 (1)); EXPECT_EQ(305 , message.repeated_sint32 (1)); EXPECT_EQ(306 , message.repeated_sint64 (1)); EXPECT_EQ(307 , message.repeated_fixed32 (1)); EXPECT_EQ(308 , message.repeated_fixed64 (1)); EXPECT_EQ(309 , message.repeated_sfixed32(1)); 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("315", message.repeated_string (1)); EXPECT_EQ("316", message.repeated_bytes (1)); EXPECT_EQ(317, message.repeatedgroup (1).a()); EXPECT_EQ(318, message.repeated_nested_message (1).bb()); EXPECT_EQ(319, message.repeated_foreign_message(1).c()); EXPECT_EQ(320, message.repeated_import_message (1).d()); EXPECT_EQ(327, message.repeated_lazy_message (1).bb()); EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.repeated_nested_enum (1)); EXPECT_EQ(unittest::FOREIGN_LITE_BAZ , message.repeated_foreign_enum(1)); EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.repeated_import_enum (1)); // ----------------------------------------------------------------- EXPECT_TRUE(message.has_default_int32 ()); EXPECT_TRUE(message.has_default_int64 ()); EXPECT_TRUE(message.has_default_uint32 ()); EXPECT_TRUE(message.has_default_uint64 ()); EXPECT_TRUE(message.has_default_sint32 ()); EXPECT_TRUE(message.has_default_sint64 ()); EXPECT_TRUE(message.has_default_fixed32 ()); EXPECT_TRUE(message.has_default_fixed64 ()); EXPECT_TRUE(message.has_default_sfixed32()); EXPECT_TRUE(message.has_default_sfixed64()); EXPECT_TRUE(message.has_default_float ()); EXPECT_TRUE(message.has_default_double ()); EXPECT_TRUE(message.has_default_bool ()); EXPECT_TRUE(message.has_default_string ()); EXPECT_TRUE(message.has_default_bytes ()); EXPECT_TRUE(message.has_default_nested_enum ()); EXPECT_TRUE(message.has_default_foreign_enum()); EXPECT_TRUE(message.has_default_import_enum ()); EXPECT_EQ(401 , message.default_int32 ()); EXPECT_EQ(402 , message.default_int64 ()); EXPECT_EQ(403 , message.default_uint32 ()); EXPECT_EQ(404 , message.default_uint64 ()); EXPECT_EQ(405 , message.default_sint32 ()); EXPECT_EQ(406 , message.default_sint64 ()); EXPECT_EQ(407 , message.default_fixed32 ()); EXPECT_EQ(408 , message.default_fixed64 ()); EXPECT_EQ(409 , message.default_sfixed32()); 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_EQ("415", message.default_string ()); EXPECT_EQ("416", message.default_bytes ()); EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.default_nested_enum ()); EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.default_foreign_enum()); EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.default_import_enum ()); EXPECT_FALSE(message.has_oneof_uint32 ()); EXPECT_FALSE(message.has_oneof_nested_message()); EXPECT_FALSE(message.has_oneof_string ()); EXPECT_TRUE(message.has_oneof_bytes ()); EXPECT_EQ("604", message.oneof_bytes()); } // ------------------------------------------------------------------- void TestUtilLite::ExpectClear(const unittest::TestAllTypesLite& message) { // has_blah() should initially be false for all optional fields. EXPECT_FALSE(message.has_optional_int32 ()); EXPECT_FALSE(message.has_optional_int64 ()); EXPECT_FALSE(message.has_optional_uint32 ()); EXPECT_FALSE(message.has_optional_uint64 ()); EXPECT_FALSE(message.has_optional_sint32 ()); EXPECT_FALSE(message.has_optional_sint64 ()); EXPECT_FALSE(message.has_optional_fixed32 ()); EXPECT_FALSE(message.has_optional_fixed64 ()); EXPECT_FALSE(message.has_optional_sfixed32()); EXPECT_FALSE(message.has_optional_sfixed64()); EXPECT_FALSE(message.has_optional_float ()); EXPECT_FALSE(message.has_optional_double ()); EXPECT_FALSE(message.has_optional_bool ()); EXPECT_FALSE(message.has_optional_string ()); EXPECT_FALSE(message.has_optional_bytes ()); EXPECT_FALSE(message.has_optionalgroup ()); EXPECT_FALSE(message.has_optional_nested_message ()); EXPECT_FALSE(message.has_optional_foreign_message ()); EXPECT_FALSE(message.has_optional_import_message ()); EXPECT_FALSE(message.has_optional_public_import_message()); EXPECT_FALSE(message.has_optional_lazy_message ()); EXPECT_FALSE(message.has_optional_nested_enum ()); EXPECT_FALSE(message.has_optional_foreign_enum()); EXPECT_FALSE(message.has_optional_import_enum ()); // Optional fields without defaults are set to zero or something like it. EXPECT_EQ(0 , message.optional_int32 ()); EXPECT_EQ(0 , message.optional_int64 ()); EXPECT_EQ(0 , message.optional_uint32 ()); EXPECT_EQ(0 , message.optional_uint64 ()); EXPECT_EQ(0 , message.optional_sint32 ()); EXPECT_EQ(0 , message.optional_sint64 ()); EXPECT_EQ(0 , message.optional_fixed32 ()); EXPECT_EQ(0 , message.optional_fixed64 ()); EXPECT_EQ(0 , message.optional_sfixed32()); 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_EQ("" , message.optional_string ()); EXPECT_EQ("" , message.optional_bytes ()); // Embedded messages should also be clear. EXPECT_FALSE(message.optionalgroup ().has_a()); EXPECT_FALSE(message.optional_nested_message ().has_bb()); EXPECT_FALSE(message.optional_foreign_message ().has_c()); EXPECT_FALSE(message.optional_import_message ().has_d()); EXPECT_FALSE(message.optional_public_import_message().has_e()); EXPECT_FALSE(message.optional_lazy_message ().has_bb()); EXPECT_EQ(0, message.optionalgroup ().a()); EXPECT_EQ(0, message.optional_nested_message ().bb()); EXPECT_EQ(0, message.optional_foreign_message().c()); EXPECT_EQ(0, message.optional_import_message ().d()); // Enums without defaults are set to the first value in the enum. EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.optional_nested_enum ()); EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.optional_foreign_enum()); EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.optional_import_enum ()); // Repeated fields are empty. EXPECT_EQ(0, message.repeated_int32_size ()); EXPECT_EQ(0, message.repeated_int64_size ()); EXPECT_EQ(0, message.repeated_uint32_size ()); EXPECT_EQ(0, message.repeated_uint64_size ()); EXPECT_EQ(0, message.repeated_sint32_size ()); EXPECT_EQ(0, message.repeated_sint64_size ()); EXPECT_EQ(0, message.repeated_fixed32_size ()); EXPECT_EQ(0, message.repeated_fixed64_size ()); EXPECT_EQ(0, message.repeated_sfixed32_size()); EXPECT_EQ(0, message.repeated_sfixed64_size()); EXPECT_EQ(0, message.repeated_float_size ()); EXPECT_EQ(0, message.repeated_double_size ()); EXPECT_EQ(0, message.repeated_bool_size ()); EXPECT_EQ(0, message.repeated_string_size ()); EXPECT_EQ(0, message.repeated_bytes_size ()); EXPECT_EQ(0, message.repeatedgroup_size ()); EXPECT_EQ(0, message.repeated_nested_message_size ()); EXPECT_EQ(0, message.repeated_foreign_message_size()); EXPECT_EQ(0, message.repeated_import_message_size ()); EXPECT_EQ(0, message.repeated_lazy_message_size ()); EXPECT_EQ(0, message.repeated_nested_enum_size ()); EXPECT_EQ(0, message.repeated_foreign_enum_size ()); EXPECT_EQ(0, message.repeated_import_enum_size ()); // has_blah() should also be false for all default fields. EXPECT_FALSE(message.has_default_int32 ()); EXPECT_FALSE(message.has_default_int64 ()); EXPECT_FALSE(message.has_default_uint32 ()); EXPECT_FALSE(message.has_default_uint64 ()); EXPECT_FALSE(message.has_default_sint32 ()); EXPECT_FALSE(message.has_default_sint64 ()); EXPECT_FALSE(message.has_default_fixed32 ()); EXPECT_FALSE(message.has_default_fixed64 ()); EXPECT_FALSE(message.has_default_sfixed32()); EXPECT_FALSE(message.has_default_sfixed64()); EXPECT_FALSE(message.has_default_float ()); EXPECT_FALSE(message.has_default_double ()); EXPECT_FALSE(message.has_default_bool ()); EXPECT_FALSE(message.has_default_string ()); EXPECT_FALSE(message.has_default_bytes ()); EXPECT_FALSE(message.has_default_nested_enum ()); EXPECT_FALSE(message.has_default_foreign_enum()); EXPECT_FALSE(message.has_default_import_enum ()); // Fields with defaults have their default values (duh). EXPECT_EQ( 41 , message.default_int32 ()); EXPECT_EQ( 42 , message.default_int64 ()); EXPECT_EQ( 43 , message.default_uint32 ()); EXPECT_EQ( 44 , message.default_uint64 ()); EXPECT_EQ(-45 , message.default_sint32 ()); EXPECT_EQ( 46 , message.default_sint64 ()); EXPECT_EQ( 47 , message.default_fixed32 ()); EXPECT_EQ( 48 , message.default_fixed64 ()); EXPECT_EQ( 49 , message.default_sfixed32()); EXPECT_EQ(-50 , message.default_sfixed64()); EXPECT_EQ( 51.5 , message.default_float ()); EXPECT_EQ( 52e3 , message.default_double ()); EXPECT_EQ(true , message.default_bool ()); EXPECT_EQ("hello", message.default_string ()); EXPECT_EQ("world", message.default_bytes ()); EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.default_nested_enum ()); EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.default_foreign_enum()); EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.default_import_enum ()); EXPECT_FALSE(message.has_oneof_uint32 ()); EXPECT_FALSE(message.has_oneof_nested_message()); EXPECT_FALSE(message.has_oneof_string ()); EXPECT_FALSE(message.has_oneof_bytes ()); } // ------------------------------------------------------------------- void TestUtilLite::ExpectRepeatedFieldsModified( const unittest::TestAllTypesLite& message) { // 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. ASSERT_EQ(2, message.repeated_int32_size ()); ASSERT_EQ(2, message.repeated_int64_size ()); ASSERT_EQ(2, message.repeated_uint32_size ()); ASSERT_EQ(2, message.repeated_uint64_size ()); ASSERT_EQ(2, message.repeated_sint32_size ()); ASSERT_EQ(2, message.repeated_sint64_size ()); ASSERT_EQ(2, message.repeated_fixed32_size ()); ASSERT_EQ(2, message.repeated_fixed64_size ()); ASSERT_EQ(2, message.repeated_sfixed32_size()); ASSERT_EQ(2, message.repeated_sfixed64_size()); ASSERT_EQ(2, message.repeated_float_size ()); ASSERT_EQ(2, message.repeated_double_size ()); ASSERT_EQ(2, message.repeated_bool_size ()); ASSERT_EQ(2, message.repeated_string_size ()); ASSERT_EQ(2, message.repeated_bytes_size ()); ASSERT_EQ(2, message.repeatedgroup_size ()); ASSERT_EQ(2, message.repeated_nested_message_size ()); ASSERT_EQ(2, message.repeated_foreign_message_size()); ASSERT_EQ(2, message.repeated_import_message_size ()); ASSERT_EQ(2, message.repeated_lazy_message_size ()); ASSERT_EQ(2, message.repeated_nested_enum_size ()); ASSERT_EQ(2, message.repeated_foreign_enum_size ()); ASSERT_EQ(2, message.repeated_import_enum_size ()); EXPECT_EQ(201 , message.repeated_int32 (0)); EXPECT_EQ(202 , message.repeated_int64 (0)); EXPECT_EQ(203 , message.repeated_uint32 (0)); EXPECT_EQ(204 , message.repeated_uint64 (0)); EXPECT_EQ(205 , message.repeated_sint32 (0)); EXPECT_EQ(206 , message.repeated_sint64 (0)); EXPECT_EQ(207 , message.repeated_fixed32 (0)); EXPECT_EQ(208 , message.repeated_fixed64 (0)); EXPECT_EQ(209 , message.repeated_sfixed32(0)); EXPECT_EQ(210 , message.repeated_sfixed64(0)); EXPECT_EQ(211 , message.repeated_float (0)); EXPECT_EQ(212 , message.repeated_double (0)); EXPECT_EQ(true , message.repeated_bool (0)); EXPECT_EQ("215", message.repeated_string (0)); EXPECT_EQ("216", message.repeated_bytes (0)); EXPECT_EQ(217, message.repeatedgroup (0).a()); EXPECT_EQ(218, message.repeated_nested_message (0).bb()); EXPECT_EQ(219, message.repeated_foreign_message(0).c()); EXPECT_EQ(220, message.repeated_import_message (0).d()); EXPECT_EQ(227, message.repeated_lazy_message (0).bb()); EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.repeated_nested_enum (0)); EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.repeated_foreign_enum(0)); EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.repeated_import_enum (0)); // Actually verify the second (modified) elements now. EXPECT_EQ(501 , message.repeated_int32 (1)); EXPECT_EQ(502 , message.repeated_int64 (1)); EXPECT_EQ(503 , message.repeated_uint32 (1)); EXPECT_EQ(504 , message.repeated_uint64 (1)); EXPECT_EQ(505 , message.repeated_sint32 (1)); EXPECT_EQ(506 , message.repeated_sint64 (1)); EXPECT_EQ(507 , message.repeated_fixed32 (1)); EXPECT_EQ(508 , message.repeated_fixed64 (1)); EXPECT_EQ(509 , message.repeated_sfixed32(1)); EXPECT_EQ(510 , message.repeated_sfixed64(1)); EXPECT_EQ(511 , message.repeated_float (1)); EXPECT_EQ(512 , message.repeated_double (1)); EXPECT_EQ(true , message.repeated_bool (1)); EXPECT_EQ("515", message.repeated_string (1)); EXPECT_EQ("516", message.repeated_bytes (1)); EXPECT_EQ(517, message.repeatedgroup (1).a()); EXPECT_EQ(518, message.repeated_nested_message (1).bb()); EXPECT_EQ(519, message.repeated_foreign_message(1).c()); EXPECT_EQ(520, message.repeated_import_message (1).d()); EXPECT_EQ(527, message.repeated_lazy_message (1).bb()); EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.repeated_nested_enum (1)); EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.repeated_foreign_enum(1)); EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.repeated_import_enum (1)); } // ------------------------------------------------------------------- void TestUtilLite::SetPackedFields(unittest::TestPackedTypesLite* message) { message->add_packed_int32 (601); message->add_packed_int64 (602); message->add_packed_uint32 (603); message->add_packed_uint64 (604); message->add_packed_sint32 (605); message->add_packed_sint64 (606); message->add_packed_fixed32 (607); message->add_packed_fixed64 (608); message->add_packed_sfixed32(609); message->add_packed_sfixed64(610); message->add_packed_float (611); message->add_packed_double (612); message->add_packed_bool (true); message->add_packed_enum (unittest::FOREIGN_LITE_BAR); // add a second one of each field message->add_packed_int32 (701); message->add_packed_int64 (702); message->add_packed_uint32 (703); message->add_packed_uint64 (704); message->add_packed_sint32 (705); message->add_packed_sint64 (706); message->add_packed_fixed32 (707); message->add_packed_fixed64 (708); message->add_packed_sfixed32(709); message->add_packed_sfixed64(710); message->add_packed_float (711); message->add_packed_double (712); message->add_packed_bool (false); message->add_packed_enum (unittest::FOREIGN_LITE_BAZ); } // ------------------------------------------------------------------- void TestUtilLite::ModifyPackedFields(unittest::TestPackedTypesLite* message) { message->set_packed_int32 (1, 801); message->set_packed_int64 (1, 802); message->set_packed_uint32 (1, 803); message->set_packed_uint64 (1, 804); message->set_packed_sint32 (1, 805); message->set_packed_sint64 (1, 806); message->set_packed_fixed32 (1, 807); message->set_packed_fixed64 (1, 808); message->set_packed_sfixed32(1, 809); message->set_packed_sfixed64(1, 810); message->set_packed_float (1, 811); message->set_packed_double (1, 812); message->set_packed_bool (1, true); message->set_packed_enum (1, unittest::FOREIGN_LITE_FOO); } // ------------------------------------------------------------------- void TestUtilLite::ExpectPackedFieldsSet( const unittest::TestPackedTypesLite& message) { ASSERT_EQ(2, message.packed_int32_size ()); ASSERT_EQ(2, message.packed_int64_size ()); ASSERT_EQ(2, message.packed_uint32_size ()); ASSERT_EQ(2, message.packed_uint64_size ()); ASSERT_EQ(2, message.packed_sint32_size ()); ASSERT_EQ(2, message.packed_sint64_size ()); ASSERT_EQ(2, message.packed_fixed32_size ()); ASSERT_EQ(2, message.packed_fixed64_size ()); ASSERT_EQ(2, message.packed_sfixed32_size()); ASSERT_EQ(2, message.packed_sfixed64_size()); ASSERT_EQ(2, message.packed_float_size ()); ASSERT_EQ(2, message.packed_double_size ()); ASSERT_EQ(2, message.packed_bool_size ()); ASSERT_EQ(2, message.packed_enum_size ()); EXPECT_EQ(601 , message.packed_int32 (0)); EXPECT_EQ(602 , message.packed_int64 (0)); EXPECT_EQ(603 , message.packed_uint32 (0)); EXPECT_EQ(604 , message.packed_uint64 (0)); EXPECT_EQ(605 , message.packed_sint32 (0)); EXPECT_EQ(606 , message.packed_sint64 (0)); EXPECT_EQ(607 , message.packed_fixed32 (0)); EXPECT_EQ(608 , message.packed_fixed64 (0)); EXPECT_EQ(609 , message.packed_sfixed32(0)); EXPECT_EQ(610 , message.packed_sfixed64(0)); EXPECT_EQ(611 , message.packed_float (0)); EXPECT_EQ(612 , message.packed_double (0)); EXPECT_EQ(true , message.packed_bool (0)); EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.packed_enum(0)); EXPECT_EQ(701 , message.packed_int32 (1)); EXPECT_EQ(702 , message.packed_int64 (1)); EXPECT_EQ(703 , message.packed_uint32 (1)); EXPECT_EQ(704 , message.packed_uint64 (1)); EXPECT_EQ(705 , message.packed_sint32 (1)); EXPECT_EQ(706 , message.packed_sint64 (1)); EXPECT_EQ(707 , message.packed_fixed32 (1)); EXPECT_EQ(708 , message.packed_fixed64 (1)); EXPECT_EQ(709 , message.packed_sfixed32(1)); 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_EQ(unittest::FOREIGN_LITE_BAZ, message.packed_enum(1)); } // ------------------------------------------------------------------- void TestUtilLite::ExpectPackedClear( const unittest::TestPackedTypesLite& message) { // Packed repeated fields are empty. EXPECT_EQ(0, message.packed_int32_size ()); EXPECT_EQ(0, message.packed_int64_size ()); EXPECT_EQ(0, message.packed_uint32_size ()); EXPECT_EQ(0, message.packed_uint64_size ()); EXPECT_EQ(0, message.packed_sint32_size ()); EXPECT_EQ(0, message.packed_sint64_size ()); EXPECT_EQ(0, message.packed_fixed32_size ()); EXPECT_EQ(0, message.packed_fixed64_size ()); EXPECT_EQ(0, message.packed_sfixed32_size()); EXPECT_EQ(0, message.packed_sfixed64_size()); EXPECT_EQ(0, message.packed_float_size ()); EXPECT_EQ(0, message.packed_double_size ()); EXPECT_EQ(0, message.packed_bool_size ()); EXPECT_EQ(0, message.packed_enum_size ()); } // ------------------------------------------------------------------- void TestUtilLite::ExpectPackedFieldsModified( const unittest::TestPackedTypesLite& message) { // Do the same for packed repeated fields. ASSERT_EQ(2, message.packed_int32_size ()); ASSERT_EQ(2, message.packed_int64_size ()); ASSERT_EQ(2, message.packed_uint32_size ()); ASSERT_EQ(2, message.packed_uint64_size ()); ASSERT_EQ(2, message.packed_sint32_size ()); ASSERT_EQ(2, message.packed_sint64_size ()); ASSERT_EQ(2, message.packed_fixed32_size ()); ASSERT_EQ(2, message.packed_fixed64_size ()); ASSERT_EQ(2, message.packed_sfixed32_size()); ASSERT_EQ(2, message.packed_sfixed64_size()); ASSERT_EQ(2, message.packed_float_size ()); ASSERT_EQ(2, message.packed_double_size ()); ASSERT_EQ(2, message.packed_bool_size ()); ASSERT_EQ(2, message.packed_enum_size ()); EXPECT_EQ(601 , message.packed_int32 (0)); EXPECT_EQ(602 , message.packed_int64 (0)); EXPECT_EQ(603 , message.packed_uint32 (0)); EXPECT_EQ(604 , message.packed_uint64 (0)); EXPECT_EQ(605 , message.packed_sint32 (0)); EXPECT_EQ(606 , message.packed_sint64 (0)); EXPECT_EQ(607 , message.packed_fixed32 (0)); EXPECT_EQ(608 , message.packed_fixed64 (0)); EXPECT_EQ(609 , message.packed_sfixed32(0)); EXPECT_EQ(610 , message.packed_sfixed64(0)); EXPECT_EQ(611 , message.packed_float (0)); EXPECT_EQ(612 , message.packed_double (0)); EXPECT_EQ(true , message.packed_bool (0)); EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.packed_enum(0)); // Actually verify the second (modified) elements now. EXPECT_EQ(801 , message.packed_int32 (1)); EXPECT_EQ(802 , message.packed_int64 (1)); EXPECT_EQ(803 , message.packed_uint32 (1)); EXPECT_EQ(804 , message.packed_uint64 (1)); EXPECT_EQ(805 , message.packed_sint32 (1)); EXPECT_EQ(806 , message.packed_sint64 (1)); EXPECT_EQ(807 , message.packed_fixed32 (1)); EXPECT_EQ(808 , message.packed_fixed64 (1)); EXPECT_EQ(809 , message.packed_sfixed32(1)); EXPECT_EQ(810 , message.packed_sfixed64(1)); EXPECT_EQ(811 , message.packed_float (1)); EXPECT_EQ(812 , message.packed_double (1)); EXPECT_EQ(true , message.packed_bool (1)); EXPECT_EQ(unittest::FOREIGN_LITE_FOO, message.packed_enum(1)); } // =================================================================== // Extensions // // All this code is exactly equivalent to the above code except that it's // manipulating extension fields instead of normal ones. // // I gave up on the 80-char limit here. Sorry. void TestUtilLite::SetAllExtensions(unittest::TestAllExtensionsLite* message) { message->SetExtension(unittest::optional_int32_extension_lite , 101); message->SetExtension(unittest::optional_int64_extension_lite , 102); message->SetExtension(unittest::optional_uint32_extension_lite , 103); message->SetExtension(unittest::optional_uint64_extension_lite , 104); message->SetExtension(unittest::optional_sint32_extension_lite , 105); message->SetExtension(unittest::optional_sint64_extension_lite , 106); message->SetExtension(unittest::optional_fixed32_extension_lite , 107); message->SetExtension(unittest::optional_fixed64_extension_lite , 108); message->SetExtension(unittest::optional_sfixed32_extension_lite, 109); message->SetExtension(unittest::optional_sfixed64_extension_lite, 110); message->SetExtension(unittest::optional_float_extension_lite , 111); message->SetExtension(unittest::optional_double_extension_lite , 112); message->SetExtension(unittest::optional_bool_extension_lite , true); message->SetExtension(unittest::optional_string_extension_lite , "115"); message->SetExtension(unittest::optional_bytes_extension_lite , "116"); message->MutableExtension(unittest::optionalgroup_extension_lite )->set_a(117); message->MutableExtension(unittest::optional_nested_message_extension_lite )->set_bb(118); message->MutableExtension(unittest::optional_foreign_message_extension_lite )->set_c(119); message->MutableExtension(unittest::optional_import_message_extension_lite )->set_d(120); message->MutableExtension(unittest::optional_public_import_message_extension_lite)->set_e(126); message->MutableExtension(unittest::optional_lazy_message_extension_lite )->set_bb(127); message->SetExtension(unittest::optional_nested_enum_extension_lite , unittest::TestAllTypesLite::BAZ ); message->SetExtension(unittest::optional_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAZ ); message->SetExtension(unittest::optional_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAZ); // ----------------------------------------------------------------- message->AddExtension(unittest::repeated_int32_extension_lite , 201); message->AddExtension(unittest::repeated_int64_extension_lite , 202); message->AddExtension(unittest::repeated_uint32_extension_lite , 203); message->AddExtension(unittest::repeated_uint64_extension_lite , 204); message->AddExtension(unittest::repeated_sint32_extension_lite , 205); message->AddExtension(unittest::repeated_sint64_extension_lite , 206); message->AddExtension(unittest::repeated_fixed32_extension_lite , 207); message->AddExtension(unittest::repeated_fixed64_extension_lite , 208); message->AddExtension(unittest::repeated_sfixed32_extension_lite, 209); message->AddExtension(unittest::repeated_sfixed64_extension_lite, 210); message->AddExtension(unittest::repeated_float_extension_lite , 211); message->AddExtension(unittest::repeated_double_extension_lite , 212); message->AddExtension(unittest::repeated_bool_extension_lite , true); message->AddExtension(unittest::repeated_string_extension_lite , "215"); message->AddExtension(unittest::repeated_bytes_extension_lite , "216"); message->AddExtension(unittest::repeatedgroup_extension_lite )->set_a(217); message->AddExtension(unittest::repeated_nested_message_extension_lite )->set_bb(218); message->AddExtension(unittest::repeated_foreign_message_extension_lite)->set_c(219); message->AddExtension(unittest::repeated_import_message_extension_lite )->set_d(220); message->AddExtension(unittest::repeated_lazy_message_extension_lite )->set_bb(227); message->AddExtension(unittest::repeated_nested_enum_extension_lite , unittest::TestAllTypesLite::BAR ); message->AddExtension(unittest::repeated_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAR ); message->AddExtension(unittest::repeated_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAR); // Add a second one of each field. message->AddExtension(unittest::repeated_int32_extension_lite , 301); message->AddExtension(unittest::repeated_int64_extension_lite , 302); message->AddExtension(unittest::repeated_uint32_extension_lite , 303); message->AddExtension(unittest::repeated_uint64_extension_lite , 304); message->AddExtension(unittest::repeated_sint32_extension_lite , 305); message->AddExtension(unittest::repeated_sint64_extension_lite , 306); message->AddExtension(unittest::repeated_fixed32_extension_lite , 307); message->AddExtension(unittest::repeated_fixed64_extension_lite , 308); message->AddExtension(unittest::repeated_sfixed32_extension_lite, 309); message->AddExtension(unittest::repeated_sfixed64_extension_lite, 310); message->AddExtension(unittest::repeated_float_extension_lite , 311); message->AddExtension(unittest::repeated_double_extension_lite , 312); message->AddExtension(unittest::repeated_bool_extension_lite , false); message->AddExtension(unittest::repeated_string_extension_lite , "315"); message->AddExtension(unittest::repeated_bytes_extension_lite , "316"); message->AddExtension(unittest::repeatedgroup_extension_lite )->set_a(317); message->AddExtension(unittest::repeated_nested_message_extension_lite )->set_bb(318); message->AddExtension(unittest::repeated_foreign_message_extension_lite)->set_c(319); message->AddExtension(unittest::repeated_import_message_extension_lite )->set_d(320); message->AddExtension(unittest::repeated_lazy_message_extension_lite )->set_bb(327); message->AddExtension(unittest::repeated_nested_enum_extension_lite , unittest::TestAllTypesLite::BAZ ); message->AddExtension(unittest::repeated_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAZ ); message->AddExtension(unittest::repeated_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAZ); // ----------------------------------------------------------------- message->SetExtension(unittest::default_int32_extension_lite , 401); message->SetExtension(unittest::default_int64_extension_lite , 402); message->SetExtension(unittest::default_uint32_extension_lite , 403); message->SetExtension(unittest::default_uint64_extension_lite , 404); message->SetExtension(unittest::default_sint32_extension_lite , 405); message->SetExtension(unittest::default_sint64_extension_lite , 406); message->SetExtension(unittest::default_fixed32_extension_lite , 407); message->SetExtension(unittest::default_fixed64_extension_lite , 408); message->SetExtension(unittest::default_sfixed32_extension_lite, 409); message->SetExtension(unittest::default_sfixed64_extension_lite, 410); message->SetExtension(unittest::default_float_extension_lite , 411); message->SetExtension(unittest::default_double_extension_lite , 412); message->SetExtension(unittest::default_bool_extension_lite , false); message->SetExtension(unittest::default_string_extension_lite , "415"); message->SetExtension(unittest::default_bytes_extension_lite , "416"); message->SetExtension(unittest::default_nested_enum_extension_lite , unittest::TestAllTypesLite::FOO ); message->SetExtension(unittest::default_foreign_enum_extension_lite, unittest::FOREIGN_LITE_FOO ); message->SetExtension(unittest::default_import_enum_extension_lite , unittest_import::IMPORT_LITE_FOO); message->SetExtension(unittest::oneof_uint32_extension_lite, 601); message->MutableExtension(unittest::oneof_nested_message_extension_lite)->set_bb(602);; message->SetExtension(unittest::oneof_string_extension_lite, "603"); message->SetExtension(unittest::oneof_bytes_extension_lite, "604"); } // ------------------------------------------------------------------- void TestUtilLite::ModifyRepeatedExtensions( unittest::TestAllExtensionsLite* message) { message->SetExtension(unittest::repeated_int32_extension_lite , 1, 501); message->SetExtension(unittest::repeated_int64_extension_lite , 1, 502); message->SetExtension(unittest::repeated_uint32_extension_lite , 1, 503); message->SetExtension(unittest::repeated_uint64_extension_lite , 1, 504); message->SetExtension(unittest::repeated_sint32_extension_lite , 1, 505); message->SetExtension(unittest::repeated_sint64_extension_lite , 1, 506); message->SetExtension(unittest::repeated_fixed32_extension_lite , 1, 507); message->SetExtension(unittest::repeated_fixed64_extension_lite , 1, 508); message->SetExtension(unittest::repeated_sfixed32_extension_lite, 1, 509); message->SetExtension(unittest::repeated_sfixed64_extension_lite, 1, 510); message->SetExtension(unittest::repeated_float_extension_lite , 1, 511); message->SetExtension(unittest::repeated_double_extension_lite , 1, 512); message->SetExtension(unittest::repeated_bool_extension_lite , 1, true); message->SetExtension(unittest::repeated_string_extension_lite , 1, "515"); message->SetExtension(unittest::repeated_bytes_extension_lite , 1, "516"); message->MutableExtension(unittest::repeatedgroup_extension_lite , 1)->set_a(517); message->MutableExtension(unittest::repeated_nested_message_extension_lite , 1)->set_bb(518); message->MutableExtension(unittest::repeated_foreign_message_extension_lite, 1)->set_c(519); message->MutableExtension(unittest::repeated_import_message_extension_lite , 1)->set_d(520); message->MutableExtension(unittest::repeated_lazy_message_extension_lite , 1)->set_bb(527); message->SetExtension(unittest::repeated_nested_enum_extension_lite , 1, unittest::TestAllTypesLite::FOO ); message->SetExtension(unittest::repeated_foreign_enum_extension_lite, 1, unittest::FOREIGN_LITE_FOO ); message->SetExtension(unittest::repeated_import_enum_extension_lite , 1, unittest_import::IMPORT_LITE_FOO); } // ------------------------------------------------------------------- void TestUtilLite::ExpectAllExtensionsSet( const unittest::TestAllExtensionsLite& message) { EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_int64_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_uint64_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_sint32_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_sint64_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_fixed32_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_fixed64_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed32_extension_lite)); EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed64_extension_lite)); EXPECT_TRUE(message.HasExtension(unittest::optional_float_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_double_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_bool_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_bytes_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optionalgroup_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_nested_message_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_message_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_import_message_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_public_import_message_extension_lite)); EXPECT_TRUE(message.HasExtension(unittest::optional_lazy_message_extension_lite )); EXPECT_TRUE(message.GetExtension(unittest::optionalgroup_extension_lite ).has_a()); EXPECT_TRUE(message.GetExtension(unittest::optional_nested_message_extension_lite ).has_bb()); EXPECT_TRUE(message.GetExtension(unittest::optional_foreign_message_extension_lite ).has_c()); EXPECT_TRUE(message.GetExtension(unittest::optional_import_message_extension_lite ).has_d()); EXPECT_TRUE(message.GetExtension(unittest::optional_public_import_message_extension_lite).has_e()); EXPECT_TRUE(message.GetExtension(unittest::optional_lazy_message_extension_lite ).has_bb()); EXPECT_TRUE(message.HasExtension(unittest::optional_nested_enum_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_enum_extension_lite)); EXPECT_TRUE(message.HasExtension(unittest::optional_import_enum_extension_lite )); EXPECT_EQ(101 , message.GetExtension(unittest::optional_int32_extension_lite )); EXPECT_EQ(102 , message.GetExtension(unittest::optional_int64_extension_lite )); EXPECT_EQ(103 , message.GetExtension(unittest::optional_uint32_extension_lite )); EXPECT_EQ(104 , message.GetExtension(unittest::optional_uint64_extension_lite )); EXPECT_EQ(105 , message.GetExtension(unittest::optional_sint32_extension_lite )); EXPECT_EQ(106 , message.GetExtension(unittest::optional_sint64_extension_lite )); EXPECT_EQ(107 , message.GetExtension(unittest::optional_fixed32_extension_lite )); EXPECT_EQ(108 , message.GetExtension(unittest::optional_fixed64_extension_lite )); EXPECT_EQ(109 , message.GetExtension(unittest::optional_sfixed32_extension_lite)); EXPECT_EQ(110 , message.GetExtension(unittest::optional_sfixed64_extension_lite)); EXPECT_EQ(111 , message.GetExtension(unittest::optional_float_extension_lite )); EXPECT_EQ(112 , message.GetExtension(unittest::optional_double_extension_lite )); EXPECT_EQ(true , message.GetExtension(unittest::optional_bool_extension_lite )); EXPECT_EQ("115", message.GetExtension(unittest::optional_string_extension_lite )); EXPECT_EQ("116", message.GetExtension(unittest::optional_bytes_extension_lite )); EXPECT_EQ(117, message.GetExtension(unittest::optionalgroup_extension_lite ).a()); EXPECT_EQ(118, message.GetExtension(unittest::optional_nested_message_extension_lite ).bb()); EXPECT_EQ(119, message.GetExtension(unittest::optional_foreign_message_extension_lite ).c()); EXPECT_EQ(120, message.GetExtension(unittest::optional_import_message_extension_lite ).d()); EXPECT_EQ(126, message.GetExtension(unittest::optional_public_import_message_extension_lite).e()); EXPECT_EQ(127, message.GetExtension(unittest::optional_lazy_message_extension_lite ).bb()); EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.GetExtension(unittest::optional_nested_enum_extension_lite )); EXPECT_EQ(unittest::FOREIGN_LITE_BAZ , message.GetExtension(unittest::optional_foreign_enum_extension_lite)); EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.GetExtension(unittest::optional_import_enum_extension_lite )); // ----------------------------------------------------------------- ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_lazy_message_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension_lite )); EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension_lite , 0)); EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension_lite , 0)); EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension_lite , 0)); EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension_lite , 0)); EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension_lite , 0)); EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension_lite , 0)); EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension_lite , 0)); EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension_lite , 0)); EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 0)); EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 0)); EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension_lite , 0)); EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension_lite , 0)); EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite , 0)); EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension_lite , 0)); EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension_lite , 0)); EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension_lite , 0).a()); EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension_lite , 0).bb()); EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 0).c()); EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension_lite , 0).d()); EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension_lite , 0).bb()); EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 0)); EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 0)); EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::repeated_import_enum_extension_lite , 0)); EXPECT_EQ(301 , message.GetExtension(unittest::repeated_int32_extension_lite , 1)); EXPECT_EQ(302 , message.GetExtension(unittest::repeated_int64_extension_lite , 1)); EXPECT_EQ(303 , message.GetExtension(unittest::repeated_uint32_extension_lite , 1)); EXPECT_EQ(304 , message.GetExtension(unittest::repeated_uint64_extension_lite , 1)); EXPECT_EQ(305 , message.GetExtension(unittest::repeated_sint32_extension_lite , 1)); EXPECT_EQ(306 , message.GetExtension(unittest::repeated_sint64_extension_lite , 1)); EXPECT_EQ(307 , message.GetExtension(unittest::repeated_fixed32_extension_lite , 1)); EXPECT_EQ(308 , message.GetExtension(unittest::repeated_fixed64_extension_lite , 1)); EXPECT_EQ(309 , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 1)); EXPECT_EQ(310 , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 1)); EXPECT_EQ(311 , 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_EQ("315", message.GetExtension(unittest::repeated_string_extension_lite , 1)); EXPECT_EQ("316", message.GetExtension(unittest::repeated_bytes_extension_lite , 1)); EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension_lite , 1).a()); EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension_lite , 1).bb()); EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 1).c()); EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension_lite , 1).d()); EXPECT_EQ(327, message.GetExtension(unittest::repeated_lazy_message_extension_lite , 1).bb()); EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 1)); EXPECT_EQ(unittest::FOREIGN_LITE_BAZ , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 1)); EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.GetExtension(unittest::repeated_import_enum_extension_lite , 1)); // ----------------------------------------------------------------- EXPECT_TRUE(message.HasExtension(unittest::default_int32_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_int64_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_uint32_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_uint64_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_sint32_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_sint64_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_fixed32_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_fixed64_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_sfixed32_extension_lite)); EXPECT_TRUE(message.HasExtension(unittest::default_sfixed64_extension_lite)); EXPECT_TRUE(message.HasExtension(unittest::default_float_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_double_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_bool_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_string_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_bytes_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_nested_enum_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::default_foreign_enum_extension_lite)); EXPECT_TRUE(message.HasExtension(unittest::default_import_enum_extension_lite )); EXPECT_EQ(401 , message.GetExtension(unittest::default_int32_extension_lite )); EXPECT_EQ(402 , message.GetExtension(unittest::default_int64_extension_lite )); EXPECT_EQ(403 , message.GetExtension(unittest::default_uint32_extension_lite )); EXPECT_EQ(404 , message.GetExtension(unittest::default_uint64_extension_lite )); EXPECT_EQ(405 , message.GetExtension(unittest::default_sint32_extension_lite )); EXPECT_EQ(406 , message.GetExtension(unittest::default_sint64_extension_lite )); EXPECT_EQ(407 , message.GetExtension(unittest::default_fixed32_extension_lite )); EXPECT_EQ(408 , message.GetExtension(unittest::default_fixed64_extension_lite )); EXPECT_EQ(409 , message.GetExtension(unittest::default_sfixed32_extension_lite)); EXPECT_EQ(410 , 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_EQ("415", message.GetExtension(unittest::default_string_extension_lite )); EXPECT_EQ("416", message.GetExtension(unittest::default_bytes_extension_lite )); EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::default_nested_enum_extension_lite )); EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.GetExtension(unittest::default_foreign_enum_extension_lite)); EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::default_import_enum_extension_lite )); EXPECT_TRUE(message.HasExtension(unittest::oneof_uint32_extension_lite)); EXPECT_TRUE(message.GetExtension(unittest::oneof_nested_message_extension_lite).has_bb()); EXPECT_TRUE(message.HasExtension(unittest::oneof_string_extension_lite)); EXPECT_TRUE(message.HasExtension(unittest::oneof_bytes_extension_lite)); EXPECT_EQ(601, message.GetExtension(unittest::oneof_uint32_extension_lite)); EXPECT_EQ(602, message.GetExtension(unittest::oneof_nested_message_extension_lite).bb()); EXPECT_EQ("603", message.GetExtension(unittest::oneof_string_extension_lite)); EXPECT_EQ("604", message.GetExtension(unittest::oneof_bytes_extension_lite)); } // ------------------------------------------------------------------- void TestUtilLite::ExpectExtensionsClear( const unittest::TestAllExtensionsLite& message) { string serialized; ASSERT_TRUE(message.SerializeToString(&serialized)); EXPECT_EQ("", serialized); EXPECT_EQ(0, message.ByteSize()); // has_blah() should initially be false for all optional fields. EXPECT_FALSE(message.HasExtension(unittest::optional_int32_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_uint32_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_uint64_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_sint32_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_sint64_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_fixed32_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_fixed64_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed32_extension_lite)); EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed64_extension_lite)); EXPECT_FALSE(message.HasExtension(unittest::optional_float_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_double_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_bool_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_string_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_bytes_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optionalgroup_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_nested_message_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_message_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_import_message_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_public_import_message_extension_lite)); EXPECT_FALSE(message.HasExtension(unittest::optional_lazy_message_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_nested_enum_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_enum_extension_lite)); EXPECT_FALSE(message.HasExtension(unittest::optional_import_enum_extension_lite )); // Optional fields without defaults are set to zero or something like it. EXPECT_EQ(0 , message.GetExtension(unittest::optional_int32_extension_lite )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_int64_extension_lite )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_uint32_extension_lite )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_uint64_extension_lite )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_sint32_extension_lite )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_sint64_extension_lite )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_fixed32_extension_lite )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_fixed64_extension_lite )); EXPECT_EQ(0 , message.GetExtension(unittest::optional_sfixed32_extension_lite)); EXPECT_EQ(0 , 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_EQ("" , message.GetExtension(unittest::optional_string_extension_lite )); EXPECT_EQ("" , message.GetExtension(unittest::optional_bytes_extension_lite )); // Embedded messages should also be clear. EXPECT_FALSE(message.GetExtension(unittest::optionalgroup_extension_lite ).has_a()); EXPECT_FALSE(message.GetExtension(unittest::optional_nested_message_extension_lite ).has_bb()); EXPECT_FALSE(message.GetExtension(unittest::optional_foreign_message_extension_lite ).has_c()); EXPECT_FALSE(message.GetExtension(unittest::optional_import_message_extension_lite ).has_d()); EXPECT_FALSE(message.GetExtension(unittest::optional_public_import_message_extension_lite).has_e()); EXPECT_FALSE(message.GetExtension(unittest::optional_lazy_message_extension_lite ).has_bb()); EXPECT_EQ(0, message.GetExtension(unittest::optionalgroup_extension_lite ).a()); EXPECT_EQ(0, message.GetExtension(unittest::optional_nested_message_extension_lite ).bb()); EXPECT_EQ(0, message.GetExtension(unittest::optional_foreign_message_extension_lite ).c()); EXPECT_EQ(0, message.GetExtension(unittest::optional_import_message_extension_lite ).d()); EXPECT_EQ(0, message.GetExtension(unittest::optional_public_import_message_extension_lite).e()); EXPECT_EQ(0, message.GetExtension(unittest::optional_lazy_message_extension_lite ).bb()); // Enums without defaults are set to the first value in the enum. EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::optional_nested_enum_extension_lite )); EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.GetExtension(unittest::optional_foreign_enum_extension_lite)); EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::optional_import_enum_extension_lite )); // Repeated fields are empty. EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int32_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int64_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint32_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint64_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint32_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint64_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed32_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed64_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite)); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite)); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_float_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_double_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bool_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bytes_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeatedgroup_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_message_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite)); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_message_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_lazy_message_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_enum_extension_lite )); // has_blah() should also be false for all default fields. EXPECT_FALSE(message.HasExtension(unittest::default_int32_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_int64_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_uint32_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_uint64_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_sint32_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_sint64_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_fixed32_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_fixed64_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_sfixed32_extension_lite)); EXPECT_FALSE(message.HasExtension(unittest::default_sfixed64_extension_lite)); EXPECT_FALSE(message.HasExtension(unittest::default_float_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_double_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_bool_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_string_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_bytes_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_nested_enum_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::default_foreign_enum_extension_lite)); EXPECT_FALSE(message.HasExtension(unittest::default_import_enum_extension_lite )); // Fields with defaults have their default values (duh). EXPECT_EQ( 41 , message.GetExtension(unittest::default_int32_extension_lite )); EXPECT_EQ( 42 , message.GetExtension(unittest::default_int64_extension_lite )); EXPECT_EQ( 43 , message.GetExtension(unittest::default_uint32_extension_lite )); EXPECT_EQ( 44 , message.GetExtension(unittest::default_uint64_extension_lite )); EXPECT_EQ(-45 , message.GetExtension(unittest::default_sint32_extension_lite )); EXPECT_EQ( 46 , message.GetExtension(unittest::default_sint64_extension_lite )); EXPECT_EQ( 47 , message.GetExtension(unittest::default_fixed32_extension_lite )); EXPECT_EQ( 48 , message.GetExtension(unittest::default_fixed64_extension_lite )); EXPECT_EQ( 49 , message.GetExtension(unittest::default_sfixed32_extension_lite)); EXPECT_EQ(-50 , message.GetExtension(unittest::default_sfixed64_extension_lite)); EXPECT_EQ( 51.5 , message.GetExtension(unittest::default_float_extension_lite )); EXPECT_EQ( 52e3 , message.GetExtension(unittest::default_double_extension_lite )); EXPECT_EQ(true , message.GetExtension(unittest::default_bool_extension_lite )); EXPECT_EQ("hello", message.GetExtension(unittest::default_string_extension_lite )); EXPECT_EQ("world", message.GetExtension(unittest::default_bytes_extension_lite )); EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::default_nested_enum_extension_lite )); EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.GetExtension(unittest::default_foreign_enum_extension_lite)); EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::default_import_enum_extension_lite )); EXPECT_FALSE(message.HasExtension(unittest::oneof_uint32_extension_lite)); EXPECT_FALSE(message.GetExtension(unittest::oneof_nested_message_extension_lite).has_bb()); EXPECT_FALSE(message.HasExtension(unittest::oneof_string_extension_lite)); EXPECT_FALSE(message.HasExtension(unittest::oneof_bytes_extension_lite)); } // ------------------------------------------------------------------- void TestUtilLite::ExpectRepeatedExtensionsModified( const unittest::TestAllExtensionsLite& message) { // 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. ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite)); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_lazy_message_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension_lite )); EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension_lite , 0)); EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension_lite , 0)); EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension_lite , 0)); EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension_lite , 0)); EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension_lite , 0)); EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension_lite , 0)); EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension_lite , 0)); EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension_lite , 0)); EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 0)); EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 0)); EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension_lite , 0)); EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension_lite , 0)); EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite , 0)); EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension_lite , 0)); EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension_lite , 0)); EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension_lite , 0).a()); EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension_lite , 0).bb()); EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 0).c()); EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension_lite , 0).d()); EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension_lite , 0).bb()); EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 0)); EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 0)); EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::repeated_import_enum_extension_lite , 0)); // Actually verify the second (modified) elements now. EXPECT_EQ(501 , message.GetExtension(unittest::repeated_int32_extension_lite , 1)); EXPECT_EQ(502 , message.GetExtension(unittest::repeated_int64_extension_lite , 1)); EXPECT_EQ(503 , message.GetExtension(unittest::repeated_uint32_extension_lite , 1)); EXPECT_EQ(504 , message.GetExtension(unittest::repeated_uint64_extension_lite , 1)); EXPECT_EQ(505 , message.GetExtension(unittest::repeated_sint32_extension_lite , 1)); EXPECT_EQ(506 , message.GetExtension(unittest::repeated_sint64_extension_lite , 1)); EXPECT_EQ(507 , message.GetExtension(unittest::repeated_fixed32_extension_lite , 1)); EXPECT_EQ(508 , message.GetExtension(unittest::repeated_fixed64_extension_lite , 1)); EXPECT_EQ(509 , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 1)); EXPECT_EQ(510 , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 1)); EXPECT_EQ(511 , message.GetExtension(unittest::repeated_float_extension_lite , 1)); EXPECT_EQ(512 , message.GetExtension(unittest::repeated_double_extension_lite , 1)); EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite , 1)); EXPECT_EQ("515", message.GetExtension(unittest::repeated_string_extension_lite , 1)); EXPECT_EQ("516", message.GetExtension(unittest::repeated_bytes_extension_lite , 1)); EXPECT_EQ(517, message.GetExtension(unittest::repeatedgroup_extension_lite , 1).a()); EXPECT_EQ(518, message.GetExtension(unittest::repeated_nested_message_extension_lite , 1).bb()); EXPECT_EQ(519, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 1).c()); EXPECT_EQ(520, message.GetExtension(unittest::repeated_import_message_extension_lite , 1).d()); EXPECT_EQ(527, message.GetExtension(unittest::repeated_lazy_message_extension_lite , 1).bb()); EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 1)); EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 1)); EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::repeated_import_enum_extension_lite , 1)); } // ------------------------------------------------------------------- void TestUtilLite::SetPackedExtensions( unittest::TestPackedExtensionsLite* message) { message->AddExtension(unittest::packed_int32_extension_lite , 601); message->AddExtension(unittest::packed_int64_extension_lite , 602); message->AddExtension(unittest::packed_uint32_extension_lite , 603); message->AddExtension(unittest::packed_uint64_extension_lite , 604); message->AddExtension(unittest::packed_sint32_extension_lite , 605); message->AddExtension(unittest::packed_sint64_extension_lite , 606); message->AddExtension(unittest::packed_fixed32_extension_lite , 607); message->AddExtension(unittest::packed_fixed64_extension_lite , 608); message->AddExtension(unittest::packed_sfixed32_extension_lite, 609); message->AddExtension(unittest::packed_sfixed64_extension_lite, 610); message->AddExtension(unittest::packed_float_extension_lite , 611); message->AddExtension(unittest::packed_double_extension_lite , 612); message->AddExtension(unittest::packed_bool_extension_lite , true); message->AddExtension(unittest::packed_enum_extension_lite, unittest::FOREIGN_LITE_BAR); // add a second one of each field message->AddExtension(unittest::packed_int32_extension_lite , 701); message->AddExtension(unittest::packed_int64_extension_lite , 702); message->AddExtension(unittest::packed_uint32_extension_lite , 703); message->AddExtension(unittest::packed_uint64_extension_lite , 704); message->AddExtension(unittest::packed_sint32_extension_lite , 705); message->AddExtension(unittest::packed_sint64_extension_lite , 706); message->AddExtension(unittest::packed_fixed32_extension_lite , 707); message->AddExtension(unittest::packed_fixed64_extension_lite , 708); message->AddExtension(unittest::packed_sfixed32_extension_lite, 709); message->AddExtension(unittest::packed_sfixed64_extension_lite, 710); message->AddExtension(unittest::packed_float_extension_lite , 711); message->AddExtension(unittest::packed_double_extension_lite , 712); message->AddExtension(unittest::packed_bool_extension_lite , false); message->AddExtension(unittest::packed_enum_extension_lite, unittest::FOREIGN_LITE_BAZ); } // ------------------------------------------------------------------- void TestUtilLite::ModifyPackedExtensions( unittest::TestPackedExtensionsLite* message) { message->SetExtension(unittest::packed_int32_extension_lite , 1, 801); message->SetExtension(unittest::packed_int64_extension_lite , 1, 802); message->SetExtension(unittest::packed_uint32_extension_lite , 1, 803); message->SetExtension(unittest::packed_uint64_extension_lite , 1, 804); message->SetExtension(unittest::packed_sint32_extension_lite , 1, 805); message->SetExtension(unittest::packed_sint64_extension_lite , 1, 806); message->SetExtension(unittest::packed_fixed32_extension_lite , 1, 807); message->SetExtension(unittest::packed_fixed64_extension_lite , 1, 808); message->SetExtension(unittest::packed_sfixed32_extension_lite, 1, 809); message->SetExtension(unittest::packed_sfixed64_extension_lite, 1, 810); message->SetExtension(unittest::packed_float_extension_lite , 1, 811); message->SetExtension(unittest::packed_double_extension_lite , 1, 812); message->SetExtension(unittest::packed_bool_extension_lite , 1, true); message->SetExtension(unittest::packed_enum_extension_lite , 1, unittest::FOREIGN_LITE_FOO); } // ------------------------------------------------------------------- void TestUtilLite::ExpectPackedExtensionsSet( const unittest::TestPackedExtensionsLite& message) { ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension_lite)); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension_lite)); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension_lite )); EXPECT_EQ(601 , message.GetExtension(unittest::packed_int32_extension_lite , 0)); EXPECT_EQ(602 , message.GetExtension(unittest::packed_int64_extension_lite , 0)); EXPECT_EQ(603 , message.GetExtension(unittest::packed_uint32_extension_lite , 0)); EXPECT_EQ(604 , message.GetExtension(unittest::packed_uint64_extension_lite , 0)); EXPECT_EQ(605 , message.GetExtension(unittest::packed_sint32_extension_lite , 0)); EXPECT_EQ(606 , message.GetExtension(unittest::packed_sint64_extension_lite , 0)); EXPECT_EQ(607 , message.GetExtension(unittest::packed_fixed32_extension_lite , 0)); EXPECT_EQ(608 , message.GetExtension(unittest::packed_fixed64_extension_lite , 0)); EXPECT_EQ(609 , message.GetExtension(unittest::packed_sfixed32_extension_lite, 0)); EXPECT_EQ(610 , message.GetExtension(unittest::packed_sfixed64_extension_lite, 0)); EXPECT_EQ(611 , message.GetExtension(unittest::packed_float_extension_lite , 0)); EXPECT_EQ(612 , message.GetExtension(unittest::packed_double_extension_lite , 0)); EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite , 0)); EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.GetExtension(unittest::packed_enum_extension_lite, 0)); EXPECT_EQ(701 , message.GetExtension(unittest::packed_int32_extension_lite , 1)); EXPECT_EQ(702 , message.GetExtension(unittest::packed_int64_extension_lite , 1)); EXPECT_EQ(703 , message.GetExtension(unittest::packed_uint32_extension_lite , 1)); EXPECT_EQ(704 , message.GetExtension(unittest::packed_uint64_extension_lite , 1)); EXPECT_EQ(705 , message.GetExtension(unittest::packed_sint32_extension_lite , 1)); EXPECT_EQ(706 , message.GetExtension(unittest::packed_sint64_extension_lite , 1)); EXPECT_EQ(707 , message.GetExtension(unittest::packed_fixed32_extension_lite , 1)); EXPECT_EQ(708 , message.GetExtension(unittest::packed_fixed64_extension_lite , 1)); EXPECT_EQ(709 , message.GetExtension(unittest::packed_sfixed32_extension_lite, 1)); EXPECT_EQ(710 , message.GetExtension(unittest::packed_sfixed64_extension_lite, 1)); EXPECT_EQ(711 , 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_EQ(unittest::FOREIGN_LITE_BAZ, message.GetExtension(unittest::packed_enum_extension_lite, 1)); } // ------------------------------------------------------------------- void TestUtilLite::ExpectPackedExtensionsClear( const unittest::TestPackedExtensionsLite& message) { EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int32_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int64_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint32_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint64_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint32_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint64_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed32_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed64_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed32_extension_lite)); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed64_extension_lite)); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_float_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_double_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_bool_extension_lite )); EXPECT_EQ(0, message.ExtensionSize(unittest::packed_enum_extension_lite )); } // ------------------------------------------------------------------- void TestUtilLite::ExpectPackedExtensionsModified( const unittest::TestPackedExtensionsLite& message) { ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension_lite)); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension_lite)); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension_lite )); ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension_lite )); EXPECT_EQ(601 , message.GetExtension(unittest::packed_int32_extension_lite , 0)); EXPECT_EQ(602 , message.GetExtension(unittest::packed_int64_extension_lite , 0)); EXPECT_EQ(603 , message.GetExtension(unittest::packed_uint32_extension_lite , 0)); EXPECT_EQ(604 , message.GetExtension(unittest::packed_uint64_extension_lite , 0)); EXPECT_EQ(605 , message.GetExtension(unittest::packed_sint32_extension_lite , 0)); EXPECT_EQ(606 , message.GetExtension(unittest::packed_sint64_extension_lite , 0)); EXPECT_EQ(607 , message.GetExtension(unittest::packed_fixed32_extension_lite , 0)); EXPECT_EQ(608 , message.GetExtension(unittest::packed_fixed64_extension_lite , 0)); EXPECT_EQ(609 , message.GetExtension(unittest::packed_sfixed32_extension_lite, 0)); EXPECT_EQ(610 , message.GetExtension(unittest::packed_sfixed64_extension_lite, 0)); EXPECT_EQ(611 , message.GetExtension(unittest::packed_float_extension_lite , 0)); EXPECT_EQ(612 , message.GetExtension(unittest::packed_double_extension_lite , 0)); EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite , 0)); EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.GetExtension(unittest::packed_enum_extension_lite, 0)); // Actually verify the second (modified) elements now. EXPECT_EQ(801 , message.GetExtension(unittest::packed_int32_extension_lite , 1)); EXPECT_EQ(802 , message.GetExtension(unittest::packed_int64_extension_lite , 1)); EXPECT_EQ(803 , message.GetExtension(unittest::packed_uint32_extension_lite , 1)); EXPECT_EQ(804 , message.GetExtension(unittest::packed_uint64_extension_lite , 1)); EXPECT_EQ(805 , message.GetExtension(unittest::packed_sint32_extension_lite , 1)); EXPECT_EQ(806 , message.GetExtension(unittest::packed_sint64_extension_lite , 1)); EXPECT_EQ(807 , message.GetExtension(unittest::packed_fixed32_extension_lite , 1)); EXPECT_EQ(808 , message.GetExtension(unittest::packed_fixed64_extension_lite , 1)); EXPECT_EQ(809 , message.GetExtension(unittest::packed_sfixed32_extension_lite, 1)); EXPECT_EQ(810 , message.GetExtension(unittest::packed_sfixed64_extension_lite, 1)); EXPECT_EQ(811 , message.GetExtension(unittest::packed_float_extension_lite , 1)); EXPECT_EQ(812 , message.GetExtension(unittest::packed_double_extension_lite , 1)); EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite , 1)); EXPECT_EQ(unittest::FOREIGN_LITE_FOO, message.GetExtension(unittest::packed_enum_extension_lite, 1)); } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/test_util_lite.h000066400000000000000000000106411334102242000304750ustar00rootroot00000000000000// 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. #ifndef GOOGLE_PROTOBUF_TEST_UTIL_LITE_H__ #define GOOGLE_PROTOBUF_TEST_UTIL_LITE_H__ #include namespace google { namespace protobuf { namespace unittest = protobuf_unittest; namespace unittest_import = protobuf_unittest_import; class TestUtilLite { public: // Set every field in the message to a unique value. static void SetAllFields(unittest::TestAllTypesLite* message); static void SetAllExtensions(unittest::TestAllExtensionsLite* message); static void SetPackedFields(unittest::TestPackedTypesLite* message); static void SetPackedExtensions(unittest::TestPackedExtensionsLite* message); // Use the repeated versions of the set_*() accessors to modify all the // repeated fields of the message (which should already have been // initialized with Set*Fields()). Set*Fields() itself only tests // the add_*() accessors. static void ModifyRepeatedFields(unittest::TestAllTypesLite* message); static void ModifyRepeatedExtensions( unittest::TestAllExtensionsLite* message); static void ModifyPackedFields(unittest::TestPackedTypesLite* message); static void ModifyPackedExtensions( unittest::TestPackedExtensionsLite* message); // Check that all fields have the values that they should have after // Set*Fields() is called. static void ExpectAllFieldsSet(const unittest::TestAllTypesLite& message); static void ExpectAllExtensionsSet( const unittest::TestAllExtensionsLite& message); static void ExpectPackedFieldsSet( const unittest::TestPackedTypesLite& message); static void ExpectPackedExtensionsSet( const unittest::TestPackedExtensionsLite& message); // Expect that the message is modified as would be expected from // Modify*Fields(). static void ExpectRepeatedFieldsModified( const unittest::TestAllTypesLite& message); static void ExpectRepeatedExtensionsModified( const unittest::TestAllExtensionsLite& message); static void ExpectPackedFieldsModified( const unittest::TestPackedTypesLite& message); static void ExpectPackedExtensionsModified( const unittest::TestPackedExtensionsLite& message); // Check that all fields have their default values. static void ExpectClear(const unittest::TestAllTypesLite& message); static void ExpectExtensionsClear( const unittest::TestAllExtensionsLite& message); static void ExpectPackedClear(const unittest::TestPackedTypesLite& message); static void ExpectPackedExtensionsClear( const unittest::TestPackedExtensionsLite& message); private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TestUtilLite); }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_TEST_UTIL_LITE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdata/000077500000000000000000000000001334102242000271025ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdata/bad_utf8_string000066400000000000000000000000031334102242000321000ustar00rootroot00000000000000rÿpython-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdata/golden_message000066400000000000000000000010231334102242000317750ustar00rootroot00000000000000efg h(Ò0Ô=kAlMmQn]ÞBa\@hr115z116ƒˆu„’všw¢x¨°¸ Â124Ê125Ò~ÚøÉø­€Ê€®ˆËˆ¯Ì°˜š˜â œ ä­Ï­3±б4½ѽ5ÁÒÁ6ÍSCÍ€›CÑ€j@Ñ€s@ØØâ215â315ê216ê316óøÙôóø½ô‚Ú‚¾ŠÛŠ¿’Ü’À˜˜  ¨¨ ²224²324º225º325ÊãÊÇè‘ð’ø“€”ˆª¬—¡˜­™±š½€ÍCÁÀy@ÈÒ415Ú416ˆ˜¢424ª425øÙ‚ÚŠ603’604python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdata/golden_message_maps000066400000000000000000000324631334102242000330310ustar00rootroot00000000000000 1áÕäøÿÿÿÿ$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ   +Àšþ¤ùÿÿÿÿ ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿ +ĈÇÎùÿÿÿÿ ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿ 1ûŸ„Þùÿÿÿÿ$ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ   +žåÈŽúÿÿÿÿ ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿ +¸ÿÍúÿÿÿÿ ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿ 1¾ÊÔÜúÿÿÿÿ$ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ   1ç¹¼ûÿÿÿÿ$ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ   1톖Ìûÿÿÿÿ$ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ   +¯âÓ—ýÿÿÿÿ ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿ +뻨´þÿÿÿÿ ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿ 1ÞÖåòþÿÿÿÿ$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ     ¸þÿÿÿÿÿÿÿ    ›ºñ@ ¸þÿÿÿÿÿÿÿ ›ºñ@ 'Øû¶ ¸þÿÿÿÿÿÿÿ  Øû¶   !¿à–ë ¸þÿÿÿÿÿÿÿ ¿à–ë !üÖ¿ ¸þÿÿÿÿÿÿÿ  üÖ¿ !Þí°Þ ¸þÿÿÿÿÿÿÿ Þí°Þ !£ú–Ê ¸þÿÿÿÿÿÿÿ £ú–Ê !úÄÁ… ¸þÿÿÿÿÿÿÿ  úÄÁ… '»†·— ¸þÿÿÿÿÿÿÿ »†·—   !ª…­š ¸þÿÿÿÿÿÿÿ  ª…­š !Þ³³Ñ ¸þÿÿÿÿÿÿÿ Þ³³Ñ '³èíø ¸þÿÿÿÿÿÿÿ ³èíø   !†µÝô ¸þÿÿÿÿÿÿÿ †µÝô%›ºñÀ‡¢‡… ¸þÿÿÿÿÿÿÿ ›ºñ@&üÖ¿¢ÃÈõ” ¸þÿÿÿÿÿÿÿ  üÖ¿1¾ÊÔÜŠˆ ˜$ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ  +žåÈŽÊÀ亚 ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿ1ûŸ„Þ¹ÄèС$ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ  +¯âÓ—í¯÷À¤ ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿ&†µÝôב¡³¨ ¸þÿÿÿÿÿÿÿ †µÝô,»†·—ôºþˆ± ¸þÿÿÿÿÿÿÿ »†·—  &úÄÁ…äíåŠÐ ¸þÿÿÿÿÿÿÿ  úÄÁ…&¿à–ë±´·‚Þ ¸þÿÿÿÿÿÿÿ ¿à–ë+ĈÇÎÙ‡î´Þ ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿ&ª…­š´­­Žæ ¸þÿÿÿÿÿÿÿ  ª…­š,³èíø†Ô¥ë ¸þÿÿÿÿÿÿÿ ³èíø  &£ú–ʃ¶Éßÿ ¸þÿÿÿÿÿÿÿ £ú–Ê  ¸þÿÿÿÿÿÿÿ   ,ç¹¼[$ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ  )Àšþ¤‰êé ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿ%Þ³³Ñö¦úÿ ¸þÿÿÿÿÿÿÿ Þ³³Ñ*뻨´Ž½Ü¨% ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿ+Øû¶±’™¾2 ¸þÿÿÿÿÿÿÿ  Øû¶  0áÕ䍸ÓÓE$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ  0톖̻«ÝÛ`$ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ  %Þí°Þ¢ËÏ£m ¸þÿÿÿÿÿÿÿ Þí°Þ*¸ÿͺéÚx ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿ0ÞÖåòîææ£|$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ  !‡¿2 ¸þÿÿÿÿÿÿÿ   $Þëy ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿ&ý§½ ¸þÿÿÿÿÿÿÿ ³èíø  ,㜂Ñ$ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ  !‚¬œñ ¸þÿÿÿÿÿÿÿ Þ³³Ñ!¦¶»£ ¸þÿÿÿÿÿÿÿ  úÄÁ…!ÔȺ ¸þÿÿÿÿÿÿÿ £ú–Ê&ü·—ì ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿ'¨×ó ¸þÿÿÿÿÿÿÿ  Øû¶  &Å›± ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿ,¢Áܧ$ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ   •£é ¸þÿÿÿÿÿÿÿ ›ºñ@&Â’²‚ ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿ,¯”ì§$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ  !±Ùö˜ ¸þÿÿÿÿÿÿÿ ¿à–ë'õÚØÅ ¸þÿÿÿÿÿÿÿ »†·—  ,‚¹¸æ$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ  &À¸£ ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿ!ö›•ß ¸þÿÿÿÿÿÿÿ  ª…­š!Ä·ÕÈ  ¸þÿÿÿÿÿÿÿ  üÖ¿!ÚïÀÖ  ¸þÿÿÿÿÿÿÿ †µÝô&Á•ÌÔ  ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿ,µÙãí $ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ  !‚’¢ ¸þÿÿÿÿÿÿÿ Þí°Þ,‰Åé¿$ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ  "!óf ¸þÿÿÿÿÿÿÿ   "/ïÿÖÁÛä•$ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ  "%ª¦ÅƬ ¸þÿÿÿÿÿÿÿ  úÄÁ…"%œ²ïÝ •¦ ¸þÿÿÿÿÿÿÿ  üÖ¿"0™ïâ·ÿÂÔ$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ  "+Û³’ýº—Ôƒ ¸þÿÿÿÿÿÿÿ ³èíø  "*À¦‹ýï³ÀŠ1 ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿ"%ÚµúŸõ˜äD ¸þÿÿÿÿÿÿÿ  ª…­š"0îС¹©ÁúG$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ  "+£®ÒĕγJ ¸þÿÿÿÿÿÿÿ »†·—  "%‡…æ™ú»²V ¸þÿÿÿÿÿÿÿ ¿à–ë"*®ü¾»ÂíïôV ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿ"0㊙¹½¯öäW$ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ  "0Îçÿ€î•›Í[$ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ  "%î þ¹œÇâÃg ¸þÿÿÿÿÿÿÿ Þí°Þ"%Ö™ôÖª×ôÊn ¸þÿÿÿÿÿÿÿ †µÝô"+²ÃÚ¬Èì劆 ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿ"+ÓÏöé¯óÖˆ ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿ"+¤‚” âׂ¿› ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿ"&˾⳸ü›à¡ ¸þÿÿÿÿÿÿÿ £ú–Ê"%ƒÃíÒýëÒ½¦ ¸þÿÿÿÿÿÿÿ ›ºñ@",˜òèËщ¬Š¯ ¸þÿÿÿÿÿÿÿ  Øû¶  "+÷ÿÍýý ©µ ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿ"1Åñþ”Á®ØÀ$ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ  "&䜧±ðÍ ¸þÿÿÿÿÿÿÿ Þ³³Ñ*,½Ô¶ä$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ  *&ÿʃ¶  ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿ*&÷îñâ  ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿ*,‰À÷à $ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ  *&õîâ  ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿ*&ûŽä  ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿ*,ƒëÖÆ $ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ  *,±Œå‡ $ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ  *,¥òÓç$ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ  *&¡»ØÐ ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿ*&©ˆ¯— ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿ*,ÃÒ´š$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ  * ¸þÿÿÿÿÿÿÿ   * ¶ôâ ¸þÿÿÿÿÿÿÿ ›ºñ@*'°÷Ÿì ¸þÿÿÿÿÿÿÿ  Øû¶  *!þÀ­Ö ¸þÿÿÿÿÿÿÿ ¿à–ë*!øŸ¬ÿ ¸þÿÿÿÿÿÿÿ  üÖ¿*!¼Ûá¼ ¸þÿÿÿÿÿÿÿ Þí°Þ*!Æô­” ¸þÿÿÿÿÿÿÿ £ú–Ê*!ô‰ƒ‹ ¸þÿÿÿÿÿÿÿ  úÄÁ…*'öŒî® ¸þÿÿÿÿÿÿÿ »†·—  *!ÔŠÚ´ ¸þÿÿÿÿÿÿÿ  ª…­š*!¼çæ¢  ¸þÿÿÿÿÿÿÿ Þ³³Ñ*'æÐÛñ  ¸þÿÿÿÿÿÿÿ ³èíø  *!Œêºé ¸þÿÿÿÿÿÿÿ †µÝô2%É‹þÞñ»ñõ ¸þÿÿÿÿÿÿÿ ›ºñ@2&‡àÓ€»ùî”Ö ¸þÿÿÿÿÿÿÿ  üÖ¿21ƒëÖÆêïå¿Ï$ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ  2+õîâëþ¶ŠË ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿ21‰À÷ÃŒ÷®Þ¼$ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ  2+¡»ØÐ¥ ‘þ¶ ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿ2&ó•Å–Ðܽ™¯ ¸þÿÿÿÿÿÿÿ †µÝô2,‰ó‘Ñ—Šƒî ¸þÿÿÿÿÿÿÿ »†·—  2%‹öüô·¤´ê_ ¸þÿÿÿÿÿÿÿ  úÄÁ…2%¿Ò©œ—‘ûC ¸þÿÿÿÿÿÿÿ ¿à–ë2*÷îñâÌð£–C ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿ2%«õ¥Ë—¥¥ã3 ¸þÿÿÿÿÿÿÿ  ª…­š2+™¯¤Žòå×´) ¸þÿÿÿÿÿÿÿ ³èíø  2$¹‹Òëø“í@ ¸þÿÿÿÿÿÿÿ £ú–Ê2 ¸þÿÿÿÿÿÿÿ   2-Îóšø¶$ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ  2)€µüÉ’ÔÓ! ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿ2%¼çæ¢íÍôÿ  ¸þÿÿÿÿÿÿÿ Þ³³Ñ2*Ö÷Ðèœú¸ÑJ ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿ2+°÷Ÿì⤲üd ¸þÿÿÿÿÿÿÿ  Øû¶  21«ɛÐð§§‹$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ  21Ú¬˜÷Öº·Á$ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ  2&¼Ûá¼Å–ŸÇÚ ¸þÿÿÿÿÿÿÿ Þí°Þ2+„ñþ›õÒµŸð ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿ21¼­ËåÝÍÍÇø$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ  :" ‡Ÿ  ¸þÿÿÿÿÿÿÿ   :% Þu ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿ:& ýS ¸þÿÿÿÿÿÿÿ ³èíø  :+ cŽ $ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ  : ' ¸þÿÿÿÿÿÿÿ Þ³³Ñ: &Ûn$ ¸þÿÿÿÿÿÿÿ  úÄÁ…: *R' ¸þÿÿÿÿÿÿÿ £ú–Ê:% üÛ…- ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿ:& ¨Çu. ¸þÿÿÿÿÿÿÿ  Øû¶  :% ÅM 2 ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿ:+ ¢ ÷4$ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ  : •Q:@ ¸þÿÿÿÿÿÿÿ ›ºñ@:% B‰L@ ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿ:+ / ûD$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ  : ±¬S ¸þÿÿÿÿÿÿÿ ¿à–ë:& u-¶X ¸þÿÿÿÿÿÿÿ »†·—  :+ ‚Î\$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ  :% Ànt ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿ: öMå{ ¸þÿÿÿÿÿÿÿ  ª…­š: Ä[© ¸þÿÿÿÿÿÿÿ  üÖ¿: Ú7Ъ ¸þÿÿÿÿÿÿÿ †µÝô:% Á “Ú ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿ:+ µì¸Ý$ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ  : ‰èñ ¸þÿÿÿÿÿÿÿ Þí°Þ:+ ‰bú÷$ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ  B& ¹ ¸þÿÿÿÿÿÿÿ   B/ ï¿5¸%W$ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ  B$ *ˆ©hdA ¸þÿÿÿÿÿÿÿ  úÄÁ…B$ Ù»ûUL ¸þÿÿÿÿÿÿÿ  üÖ¿B/ ™w@|û ©$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ  B* Û™¤¯»P ¸þÿÿÿÿÿÿÿ ³èíø  B) @Ó¢ÿž1 ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿB$ Úš¾ˆ«cÈD ¸þÿÿÿÿÿÿÿ  ª…­šB/ î4”KõG$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ  B* £ŽKJ¬8gJ ¸þÿÿÿÿÿÿÿ »†·—  B$ ‡BÀœÑïdV ¸þÿÿÿÿÿÿÿ ¿à–ëB) .¾o'l¿éV ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿB/ cE&×{ÙÉW$ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ  B/ Îóà®lš[$ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ  B$ n?Ç9Їg ¸þÿÿÿÿÿÿÿ Þí°ÞB$ Ö ÝªºÒ•n ¸þÿÿÿÿÿÿÿ †µÝôB) ²¡–…d—† ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿB) Ó§=ýš[ˆ ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿB) $$¾ ~› ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿB$ KŸx†ãoÀ¡ ¸þÿÿÿÿÿÿÿ £ú–ÊB# ƒa[Ú_K{¦ ¸þÿÿÿÿÿÿÿ ›ºñ@B* 9zM°¯ ¸þÿÿÿÿÿÿÿ  Øû¶  B) ÷³ß5Rµ ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿB/ Å8ÄO º°À$ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ  B$ n[†Ì9ÅàÍ ¸þÿÿÿÿÿÿÿ Þ³³ÑJ+ á*¹$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ  J% @Ÿ” ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿJ% DÄÑ™ ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿJ+ ûÁ›$ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ  J% ž2Ò¡ ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿJ% BÜ¿© ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿJ+ >%•«$ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ  J+ ç\ƒ·$ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ  J+ mƒ…¹$ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ  J% /ñôÒ ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿJ% ëŠæ ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿJ+ ^kYî$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ  J"  ¸þÿÿÿÿÿÿÿ   J ] ¸þÿÿÿÿÿÿÿ ›ºñ@J& Øýà ¸þÿÿÿÿÿÿÿ  Øû¶  J ?°e ¸þÿÿÿÿÿÿÿ ¿à–ëJ ü‡õ' ¸þÿÿÿÿÿÿÿ  üÖ¿J Þ6Ì+ ¸þÿÿÿÿÿÿÿ Þí°ÞJ #½E9 ¸þÿÿÿÿÿÿÿ £ú–ÊJ zb°@ ¸þÿÿÿÿÿÿÿ  úÄÁ…J& ;ÃíB ¸þÿÿÿÿÿÿÿ »†·—  J ªBKC ¸þÿÿÿÿÿÿÿ  ª…­šJ ÞÙ,j ¸þÿÿÿÿÿÿÿ Þ³³ÑJ& 3to ¸þÿÿÿÿÿÿÿ ³èíø  J †Z—~ ¸þÿÿÿÿÿÿÿ †µÝôR# ]9ˆ… ¸þÿÿÿÿÿÿÿ ›ºñ@R$ ü‡õ'"ë” ¸þÿÿÿÿÿÿÿ  üÖ¿R/ >%•«@4@˜$ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ  R) ž2Ò¡’uš ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿR/ ûÁ›#¢¡¡$ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ  R) /ñôÒ~ݤ ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿR$ †Z—~„f¨ ¸þÿÿÿÿÿÿÿ †µÝôR* ;ÃíB×ù± ¸þÿÿÿÿÿÿÿ »†·—  R$ zb°@n—Ð ¸þÿÿÿÿÿÿÿ  úÄÁ…R$ ?°e£ÝÞ ¸þÿÿÿÿÿÿÿ ¿à–ëR) DÄÑ™=¸iÞ ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿR$ ªBKCkµæ ¸þÿÿÿÿÿÿÿ  ª…­šR* 3tohPKë ¸þÿÿÿÿÿÿÿ ³èíø  R$ #½E9°%¿ÿ ¸þÿÿÿÿÿÿÿ £ú–ÊR&  ¸þÿÿÿÿÿÿÿ   R/ ç\ƒ·$ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ  R) @Ÿ”P§! ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿR$ ÞÙ,j7éÿ ¸þÿÿÿÿÿÿÿ Þ³³ÑR) ëŠæèqQ% ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿR* ØýÓd|2 ¸þÿÿÿÿÿÿÿ  Øû¶  R/ á*¹ÂO§E$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ  R/ mƒ…¹[u·`$ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ  R$ Þ6Ì+Z>Gm ¸þÿÿÿÿÿÿÿ Þí°ÞR) BÜ¿©Kkx ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿR/ ^kYî6›G|$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ  Z" ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿZ ¸þÿÿÿÿÿÿÿ Þí°Þb$ aA ¸þÿÿÿÿÿÿÿ  üÖ¿b, aA ¸þÿÿÿÿÿÿÿ  üÖ¿b/ gN4$ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ  b1 gN4$ ¸þÿÿÿÿÿÿÿ ¾ÊÔÜúÿÿÿÿ  b) pF ¸þÿÿÿÿÿÿÿ »†·—  b1 pF ¸þÿÿÿÿÿÿÿ »†·—  b  ¸þÿÿÿÿÿÿÿ  úÄÁ…b!  ¸þÿÿÿÿÿÿÿ  úÄÁ…b! A ¸þÿÿÿÿÿÿÿ ¿à–ëb¢ „A ¸þÿÿÿÿÿÿÿ ¿à–ëb/ "Ab$ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ  b° ‡"Ab$ ¸þÿÿÿÿÿÿÿ 톖Ìûÿÿÿÿ  b* +$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ  b2 +$ ¸þÿÿÿÿÿÿÿ ÞÖåòþÿÿÿÿ  b/ Ja$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ  b? Ja$ ¸þÿÿÿÿÿÿÿ áÕäøÿÿÿÿ  b# Q ¸þÿÿÿÿÿÿÿ ›ºñ@b¤ ‡Q ¸þÿÿÿÿÿÿÿ ›ºñ@b) Sw ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿb* Sw ¸þÿÿÿÿÿÿÿ ¸ÿÍúÿÿÿÿb# kq ¸þÿÿÿÿÿÿÿ †µÝôb+ kq ¸þÿÿÿÿÿÿÿ †µÝôb0 sUp$ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ  bp HsUp$ ¸þÿÿÿÿÿÿÿ ûŸ„Þùÿÿÿÿ  b) )H ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿb9 )H ¸þÿÿÿÿÿÿÿ žåÈŽúÿÿÿÿb) bQ ¸þÿÿÿÿÿÿÿ  Øû¶  b- bQ ¸þÿÿÿÿÿÿÿ  Øû¶  b%  ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿb&  ¸þÿÿÿÿÿÿÿ 뻨´þÿÿÿÿb#  NH ¸þÿÿÿÿÿÿÿ Þí°Þb+  NH ¸þÿÿÿÿÿÿÿ Þí°Þb'  9[ ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿb7  9[ ¸þÿÿÿÿÿÿÿ  ¯âÓ—ýÿÿÿÿb!   ¸þÿÿÿÿÿÿÿ £ú–Êb%   ¸þÿÿÿÿÿÿÿ £ú–Êb3 24553676007$ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ  bs K24553676007$ ¸þÿÿÿÿÿÿÿ ç¹¼ûÿÿÿÿ  b$ 4@ ¸þÿÿÿÿÿÿÿ Þ³³Ñbd G4@ ¸þÿÿÿÿÿÿÿ Þ³³Ñb 9 ¸þÿÿÿÿÿÿÿ   b# 9 ¸þÿÿÿÿÿÿÿ  ª…­šb+ 9 ¸þÿÿÿÿÿÿÿ  ª…­šb! 9 ¸þÿÿÿÿÿÿÿ   b2 9472638764158272 ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿbB 9472638764158272 ¸þÿÿÿÿÿÿÿ Àšþ¤ùÿÿÿÿb* g] ¸þÿÿÿÿÿÿÿ ³èíø  b: g] ¸þÿÿÿÿÿÿÿ ³èíø  b) hRA ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿbª ‡hRA ¸þÿÿÿÿÿÿÿ ĈÇÎùÿÿÿÿgolden_message_oneof_implemented000066400000000000000000000010031334102242000354650ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdataefg h(Ò0Ô=kAlMmQn]ÞBa\@hr115z116ƒˆu„’všw¢x¨°¸ Â124Ê125Ò~ÚøÉø­€Ê€®ˆËˆ¯Ì°˜š˜â œ ä­Ï­3±б4½ѽ5ÁÒÁ6ÍSCÍ€›CÑ€j@Ñ€s@ØØâ215â315ê216ê316óøÙôóø½ô‚Ú‚¾ŠÛŠ¿’Ü’À˜˜  ¨¨ ²224²324º225º325ÊãÊÇè‘ð’ø“€”ˆª¬—¡˜­™±š½€ÍCÁÀy@ÈÒ415Ú416ˆ˜¢424ª425’604python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdata/golden_message_proto3000066400000000000000000000003701334102242000333070ustar00rootroot00000000000000úe­‚Ê®ŠË¯’̰ššâ¢œäªÏ3²Ð4ºÑ5ÂÒ6ÊSC€›CÒ€j@€s@Úâ215â315ê216ê316‚Ú‚¾ŠÛŠ¿’Ü’Àš¢²224²324º225º325ÊãÊÇ’604golden_packed_fields_message000066400000000000000000000002161334102242000345560ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdataÒÙ½ÚÚ¾âÛ¿êÜÀòº ‚ ú¼ „ ‚_Ê`Ä’aÅšbÆ¢ÀDÀ1Dª ƒ@@†@²ºpython-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdata/map_test_data.txt000066400000000000000000000027441334102242000324570ustar00rootroot00000000000000map_int32_int32 { key: 0 value: 0 } map_int32_int32 { key: 1 value: 1 } map_int64_int64 { key: 0 value: 0 } map_int64_int64 { key: 1 value: 1 } map_uint32_uint32 { key: 0 value: 0 } map_uint32_uint32 { key: 1 value: 1 } map_uint64_uint64 { key: 0 value: 0 } map_uint64_uint64 { key: 1 value: 1 } map_sint32_sint32 { key: 0 value: 0 } map_sint32_sint32 { key: 1 value: 1 } map_sint64_sint64 { key: 0 value: 0 } map_sint64_sint64 { key: 1 value: 1 } map_fixed32_fixed32 { key: 0 value: 0 } map_fixed32_fixed32 { key: 1 value: 1 } map_fixed64_fixed64 { key: 0 value: 0 } map_fixed64_fixed64 { key: 1 value: 1 } map_sfixed32_sfixed32 { key: 0 value: 0 } map_sfixed32_sfixed32 { key: 1 value: 1 } map_sfixed64_sfixed64 { key: 0 value: 0 } map_sfixed64_sfixed64 { key: 1 value: 1 } map_int32_float { key: 0 value: 0 } map_int32_float { key: 1 value: 1 } map_int32_double { key: 0 value: 0 } map_int32_double { key: 1 value: 1 } map_bool_bool { key: false value: false } map_bool_bool { key: true value: true } map_string_string { key: "0" value: "0" } map_string_string { key: "1" value: "1" } map_int32_bytes { key: 0 value: "0" } map_int32_bytes { key: 1 value: "1" } map_int32_enum { key: 0 value: MAP_ENUM_BAR } map_int32_enum { key: 1 value: MAP_ENUM_BAZ } map_int32_foreign_message { key: 0 value { c: 0 } } map_int32_foreign_message { key: 1 value { c: 1 } } text_format_unittest_data.txt000066400000000000000000000047061334102242000350570ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdataoptional_int32: 101 optional_int64: 102 optional_uint32: 103 optional_uint64: 104 optional_sint32: 105 optional_sint64: 106 optional_fixed32: 107 optional_fixed64: 108 optional_sfixed32: 109 optional_sfixed64: 110 optional_float: 111 optional_double: 112 optional_bool: true optional_string: "115" optional_bytes: "116" OptionalGroup { a: 117 } optional_nested_message { bb: 118 } optional_foreign_message { c: 119 } optional_import_message { d: 120 } optional_nested_enum: BAZ optional_foreign_enum: FOREIGN_BAZ optional_import_enum: IMPORT_BAZ optional_string_piece: "124" optional_cord: "125" optional_public_import_message { e: 126 } optional_lazy_message { bb: 127 } repeated_int32: 201 repeated_int32: 301 repeated_int64: 202 repeated_int64: 302 repeated_uint32: 203 repeated_uint32: 303 repeated_uint64: 204 repeated_uint64: 304 repeated_sint32: 205 repeated_sint32: 305 repeated_sint64: 206 repeated_sint64: 306 repeated_fixed32: 207 repeated_fixed32: 307 repeated_fixed64: 208 repeated_fixed64: 308 repeated_sfixed32: 209 repeated_sfixed32: 309 repeated_sfixed64: 210 repeated_sfixed64: 310 repeated_float: 211 repeated_float: 311 repeated_double: 212 repeated_double: 312 repeated_bool: true repeated_bool: false repeated_string: "215" repeated_string: "315" repeated_bytes: "216" repeated_bytes: "316" RepeatedGroup { a: 217 } RepeatedGroup { a: 317 } repeated_nested_message { bb: 218 } repeated_nested_message { bb: 318 } repeated_foreign_message { c: 219 } repeated_foreign_message { c: 319 } repeated_import_message { d: 220 } repeated_import_message { d: 320 } repeated_nested_enum: BAR repeated_nested_enum: BAZ repeated_foreign_enum: FOREIGN_BAR repeated_foreign_enum: FOREIGN_BAZ repeated_import_enum: IMPORT_BAR repeated_import_enum: IMPORT_BAZ repeated_string_piece: "224" repeated_string_piece: "324" repeated_cord: "225" repeated_cord: "325" repeated_lazy_message { bb: 227 } repeated_lazy_message { bb: 327 } default_int32: 401 default_int64: 402 default_uint32: 403 default_uint64: 404 default_sint32: 405 default_sint64: 406 default_fixed32: 407 default_fixed64: 408 default_sfixed32: 409 default_sfixed64: 410 default_float: 411 default_double: 412 default_bool: false default_string: "415" default_bytes: "416" default_nested_enum: FOO default_foreign_enum: FOREIGN_FOO default_import_enum: IMPORT_FOO default_string_piece: "424" default_cord: "425" oneof_uint32: 601 oneof_nested_message { bb: 602 } oneof_string: "603" oneof_bytes: "604" text_format_unittest_data_oneof_implemented.txt000066400000000000000000000045751334102242000406340ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdataoptional_int32: 101 optional_int64: 102 optional_uint32: 103 optional_uint64: 104 optional_sint32: 105 optional_sint64: 106 optional_fixed32: 107 optional_fixed64: 108 optional_sfixed32: 109 optional_sfixed64: 110 optional_float: 111 optional_double: 112 optional_bool: true optional_string: "115" optional_bytes: "116" OptionalGroup { a: 117 } optional_nested_message { bb: 118 } optional_foreign_message { c: 119 } optional_import_message { d: 120 } optional_nested_enum: BAZ optional_foreign_enum: FOREIGN_BAZ optional_import_enum: IMPORT_BAZ optional_string_piece: "124" optional_cord: "125" optional_public_import_message { e: 126 } optional_lazy_message { bb: 127 } repeated_int32: 201 repeated_int32: 301 repeated_int64: 202 repeated_int64: 302 repeated_uint32: 203 repeated_uint32: 303 repeated_uint64: 204 repeated_uint64: 304 repeated_sint32: 205 repeated_sint32: 305 repeated_sint64: 206 repeated_sint64: 306 repeated_fixed32: 207 repeated_fixed32: 307 repeated_fixed64: 208 repeated_fixed64: 308 repeated_sfixed32: 209 repeated_sfixed32: 309 repeated_sfixed64: 210 repeated_sfixed64: 310 repeated_float: 211 repeated_float: 311 repeated_double: 212 repeated_double: 312 repeated_bool: true repeated_bool: false repeated_string: "215" repeated_string: "315" repeated_bytes: "216" repeated_bytes: "316" RepeatedGroup { a: 217 } RepeatedGroup { a: 317 } repeated_nested_message { bb: 218 } repeated_nested_message { bb: 318 } repeated_foreign_message { c: 219 } repeated_foreign_message { c: 319 } repeated_import_message { d: 220 } repeated_import_message { d: 320 } repeated_nested_enum: BAR repeated_nested_enum: BAZ repeated_foreign_enum: FOREIGN_BAR repeated_foreign_enum: FOREIGN_BAZ repeated_import_enum: IMPORT_BAR repeated_import_enum: IMPORT_BAZ repeated_string_piece: "224" repeated_string_piece: "324" repeated_cord: "225" repeated_cord: "325" repeated_lazy_message { bb: 227 } repeated_lazy_message { bb: 327 } default_int32: 401 default_int64: 402 default_uint32: 403 default_uint64: 404 default_sint32: 405 default_sint64: 406 default_fixed32: 407 default_fixed64: 408 default_sfixed32: 409 default_sfixed64: 410 default_float: 411 default_double: 412 default_bool: false default_string: "415" default_bytes: "416" default_nested_enum: FOO default_foreign_enum: FOREIGN_FOO default_import_enum: IMPORT_FOO default_string_piece: "424" default_cord: "425" oneof_bytes: "604" text_format_unittest_data_pointy.txt000066400000000000000000000047061334102242000364610ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdataoptional_int32: 101 optional_int64: 102 optional_uint32: 103 optional_uint64: 104 optional_sint32: 105 optional_sint64: 106 optional_fixed32: 107 optional_fixed64: 108 optional_sfixed32: 109 optional_sfixed64: 110 optional_float: 111 optional_double: 112 optional_bool: true optional_string: "115" optional_bytes: "116" OptionalGroup < a: 117 > optional_nested_message < bb: 118 > optional_foreign_message < c: 119 > optional_import_message < d: 120 > optional_nested_enum: BAZ optional_foreign_enum: FOREIGN_BAZ optional_import_enum: IMPORT_BAZ optional_string_piece: "124" optional_cord: "125" optional_public_import_message < e: 126 > optional_lazy_message < bb: 127 > repeated_int32: 201 repeated_int32: 301 repeated_int64: 202 repeated_int64: 302 repeated_uint32: 203 repeated_uint32: 303 repeated_uint64: 204 repeated_uint64: 304 repeated_sint32: 205 repeated_sint32: 305 repeated_sint64: 206 repeated_sint64: 306 repeated_fixed32: 207 repeated_fixed32: 307 repeated_fixed64: 208 repeated_fixed64: 308 repeated_sfixed32: 209 repeated_sfixed32: 309 repeated_sfixed64: 210 repeated_sfixed64: 310 repeated_float: 211 repeated_float: 311 repeated_double: 212 repeated_double: 312 repeated_bool: true repeated_bool: false repeated_string: "215" repeated_string: "315" repeated_bytes: "216" repeated_bytes: "316" RepeatedGroup < a: 217 > RepeatedGroup < a: 317 > repeated_nested_message < bb: 218 > repeated_nested_message < bb: 318 > repeated_foreign_message < c: 219 > repeated_foreign_message < c: 319 > repeated_import_message < d: 220 > repeated_import_message < d: 320 > repeated_nested_enum: BAR repeated_nested_enum: BAZ repeated_foreign_enum: FOREIGN_BAR repeated_foreign_enum: FOREIGN_BAZ repeated_import_enum: IMPORT_BAR repeated_import_enum: IMPORT_BAZ repeated_string_piece: "224" repeated_string_piece: "324" repeated_cord: "225" repeated_cord: "325" repeated_lazy_message < bb: 227 > repeated_lazy_message < bb: 327 > default_int32: 401 default_int64: 402 default_uint32: 403 default_uint64: 404 default_sint32: 405 default_sint64: 406 default_fixed32: 407 default_fixed64: 408 default_sfixed32: 409 default_sfixed64: 410 default_float: 411 default_double: 412 default_bool: false default_string: "415" default_bytes: "416" default_nested_enum: FOO default_foreign_enum: FOREIGN_FOO default_import_enum: IMPORT_FOO default_string_piece: "424" default_cord: "425" oneof_uint32: 601 oneof_nested_message < bb: 602 > oneof_string: "603" oneof_bytes: "604" text_format_unittest_data_pointy_oneof.txt000066400000000000000000000045751334102242000376530ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdataoptional_int32: 101 optional_int64: 102 optional_uint32: 103 optional_uint64: 104 optional_sint32: 105 optional_sint64: 106 optional_fixed32: 107 optional_fixed64: 108 optional_sfixed32: 109 optional_sfixed64: 110 optional_float: 111 optional_double: 112 optional_bool: true optional_string: "115" optional_bytes: "116" OptionalGroup < a: 117 > optional_nested_message < bb: 118 > optional_foreign_message < c: 119 > optional_import_message < d: 120 > optional_nested_enum: BAZ optional_foreign_enum: FOREIGN_BAZ optional_import_enum: IMPORT_BAZ optional_string_piece: "124" optional_cord: "125" optional_public_import_message < e: 126 > optional_lazy_message < bb: 127 > repeated_int32: 201 repeated_int32: 301 repeated_int64: 202 repeated_int64: 302 repeated_uint32: 203 repeated_uint32: 303 repeated_uint64: 204 repeated_uint64: 304 repeated_sint32: 205 repeated_sint32: 305 repeated_sint64: 206 repeated_sint64: 306 repeated_fixed32: 207 repeated_fixed32: 307 repeated_fixed64: 208 repeated_fixed64: 308 repeated_sfixed32: 209 repeated_sfixed32: 309 repeated_sfixed64: 210 repeated_sfixed64: 310 repeated_float: 211 repeated_float: 311 repeated_double: 212 repeated_double: 312 repeated_bool: true repeated_bool: false repeated_string: "215" repeated_string: "315" repeated_bytes: "216" repeated_bytes: "316" RepeatedGroup < a: 217 > RepeatedGroup < a: 317 > repeated_nested_message < bb: 218 > repeated_nested_message < bb: 318 > repeated_foreign_message < c: 219 > repeated_foreign_message < c: 319 > repeated_import_message < d: 220 > repeated_import_message < d: 320 > repeated_nested_enum: BAR repeated_nested_enum: BAZ repeated_foreign_enum: FOREIGN_BAR repeated_foreign_enum: FOREIGN_BAZ repeated_import_enum: IMPORT_BAR repeated_import_enum: IMPORT_BAZ repeated_string_piece: "224" repeated_string_piece: "324" repeated_cord: "225" repeated_cord: "325" repeated_lazy_message < bb: 227 > repeated_lazy_message < bb: 327 > default_int32: 401 default_int64: 402 default_uint32: 403 default_uint64: 404 default_sint32: 405 default_sint64: 406 default_fixed32: 407 default_fixed64: 408 default_sfixed32: 409 default_sfixed64: 410 default_float: 411 default_double: 412 default_bool: false default_string: "415" default_bytes: "416" default_nested_enum: FOO default_foreign_enum: FOREIGN_FOO default_import_enum: IMPORT_FOO default_string_piece: "424" default_cord: "425" oneof_bytes: "604" text_format_unittest_extensions_data.txt000066400000000000000000000125761334102242000373420ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdata[protobuf_unittest.optional_int32_extension]: 101 [protobuf_unittest.optional_int64_extension]: 102 [protobuf_unittest.optional_uint32_extension]: 103 [protobuf_unittest.optional_uint64_extension]: 104 [protobuf_unittest.optional_sint32_extension]: 105 [protobuf_unittest.optional_sint64_extension]: 106 [protobuf_unittest.optional_fixed32_extension]: 107 [protobuf_unittest.optional_fixed64_extension]: 108 [protobuf_unittest.optional_sfixed32_extension]: 109 [protobuf_unittest.optional_sfixed64_extension]: 110 [protobuf_unittest.optional_float_extension]: 111 [protobuf_unittest.optional_double_extension]: 112 [protobuf_unittest.optional_bool_extension]: true [protobuf_unittest.optional_string_extension]: "115" [protobuf_unittest.optional_bytes_extension]: "116" [protobuf_unittest.optionalgroup_extension] { a: 117 } [protobuf_unittest.optional_nested_message_extension] { bb: 118 } [protobuf_unittest.optional_foreign_message_extension] { c: 119 } [protobuf_unittest.optional_import_message_extension] { d: 120 } [protobuf_unittest.optional_nested_enum_extension]: BAZ [protobuf_unittest.optional_foreign_enum_extension]: FOREIGN_BAZ [protobuf_unittest.optional_import_enum_extension]: IMPORT_BAZ [protobuf_unittest.optional_string_piece_extension]: "124" [protobuf_unittest.optional_cord_extension]: "125" [protobuf_unittest.optional_public_import_message_extension] { e: 126 } [protobuf_unittest.optional_lazy_message_extension] { bb: 127 } [protobuf_unittest.repeated_int32_extension]: 201 [protobuf_unittest.repeated_int32_extension]: 301 [protobuf_unittest.repeated_int64_extension]: 202 [protobuf_unittest.repeated_int64_extension]: 302 [protobuf_unittest.repeated_uint32_extension]: 203 [protobuf_unittest.repeated_uint32_extension]: 303 [protobuf_unittest.repeated_uint64_extension]: 204 [protobuf_unittest.repeated_uint64_extension]: 304 [protobuf_unittest.repeated_sint32_extension]: 205 [protobuf_unittest.repeated_sint32_extension]: 305 [protobuf_unittest.repeated_sint64_extension]: 206 [protobuf_unittest.repeated_sint64_extension]: 306 [protobuf_unittest.repeated_fixed32_extension]: 207 [protobuf_unittest.repeated_fixed32_extension]: 307 [protobuf_unittest.repeated_fixed64_extension]: 208 [protobuf_unittest.repeated_fixed64_extension]: 308 [protobuf_unittest.repeated_sfixed32_extension]: 209 [protobuf_unittest.repeated_sfixed32_extension]: 309 [protobuf_unittest.repeated_sfixed64_extension]: 210 [protobuf_unittest.repeated_sfixed64_extension]: 310 [protobuf_unittest.repeated_float_extension]: 211 [protobuf_unittest.repeated_float_extension]: 311 [protobuf_unittest.repeated_double_extension]: 212 [protobuf_unittest.repeated_double_extension]: 312 [protobuf_unittest.repeated_bool_extension]: true [protobuf_unittest.repeated_bool_extension]: false [protobuf_unittest.repeated_string_extension]: "215" [protobuf_unittest.repeated_string_extension]: "315" [protobuf_unittest.repeated_bytes_extension]: "216" [protobuf_unittest.repeated_bytes_extension]: "316" [protobuf_unittest.repeatedgroup_extension] { a: 217 } [protobuf_unittest.repeatedgroup_extension] { a: 317 } [protobuf_unittest.repeated_nested_message_extension] { bb: 218 } [protobuf_unittest.repeated_nested_message_extension] { bb: 318 } [protobuf_unittest.repeated_foreign_message_extension] { c: 219 } [protobuf_unittest.repeated_foreign_message_extension] { c: 319 } [protobuf_unittest.repeated_import_message_extension] { d: 220 } [protobuf_unittest.repeated_import_message_extension] { d: 320 } [protobuf_unittest.repeated_nested_enum_extension]: BAR [protobuf_unittest.repeated_nested_enum_extension]: BAZ [protobuf_unittest.repeated_foreign_enum_extension]: FOREIGN_BAR [protobuf_unittest.repeated_foreign_enum_extension]: FOREIGN_BAZ [protobuf_unittest.repeated_import_enum_extension]: IMPORT_BAR [protobuf_unittest.repeated_import_enum_extension]: IMPORT_BAZ [protobuf_unittest.repeated_string_piece_extension]: "224" [protobuf_unittest.repeated_string_piece_extension]: "324" [protobuf_unittest.repeated_cord_extension]: "225" [protobuf_unittest.repeated_cord_extension]: "325" [protobuf_unittest.repeated_lazy_message_extension] { bb: 227 } [protobuf_unittest.repeated_lazy_message_extension] { bb: 327 } [protobuf_unittest.default_int32_extension]: 401 [protobuf_unittest.default_int64_extension]: 402 [protobuf_unittest.default_uint32_extension]: 403 [protobuf_unittest.default_uint64_extension]: 404 [protobuf_unittest.default_sint32_extension]: 405 [protobuf_unittest.default_sint64_extension]: 406 [protobuf_unittest.default_fixed32_extension]: 407 [protobuf_unittest.default_fixed64_extension]: 408 [protobuf_unittest.default_sfixed32_extension]: 409 [protobuf_unittest.default_sfixed64_extension]: 410 [protobuf_unittest.default_float_extension]: 411 [protobuf_unittest.default_double_extension]: 412 [protobuf_unittest.default_bool_extension]: false [protobuf_unittest.default_string_extension]: "415" [protobuf_unittest.default_bytes_extension]: "416" [protobuf_unittest.default_nested_enum_extension]: FOO [protobuf_unittest.default_foreign_enum_extension]: FOREIGN_FOO [protobuf_unittest.default_import_enum_extension]: IMPORT_FOO [protobuf_unittest.default_string_piece_extension]: "424" [protobuf_unittest.default_cord_extension]: "425" [protobuf_unittest.oneof_uint32_extension]: 601 [protobuf_unittest.oneof_nested_message_extension] { bb: 602 } [protobuf_unittest.oneof_string_extension]: "603" [protobuf_unittest.oneof_bytes_extension]: "604" text_format_unittest_extensions_data_pointy.txt000066400000000000000000000125761334102242000407440ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testdata[protobuf_unittest.optional_int32_extension]: 101 [protobuf_unittest.optional_int64_extension]: 102 [protobuf_unittest.optional_uint32_extension]: 103 [protobuf_unittest.optional_uint64_extension]: 104 [protobuf_unittest.optional_sint32_extension]: 105 [protobuf_unittest.optional_sint64_extension]: 106 [protobuf_unittest.optional_fixed32_extension]: 107 [protobuf_unittest.optional_fixed64_extension]: 108 [protobuf_unittest.optional_sfixed32_extension]: 109 [protobuf_unittest.optional_sfixed64_extension]: 110 [protobuf_unittest.optional_float_extension]: 111 [protobuf_unittest.optional_double_extension]: 112 [protobuf_unittest.optional_bool_extension]: true [protobuf_unittest.optional_string_extension]: "115" [protobuf_unittest.optional_bytes_extension]: "116" [protobuf_unittest.optionalgroup_extension] < a: 117 > [protobuf_unittest.optional_nested_message_extension] < bb: 118 > [protobuf_unittest.optional_foreign_message_extension] < c: 119 > [protobuf_unittest.optional_import_message_extension] < d: 120 > [protobuf_unittest.optional_nested_enum_extension]: BAZ [protobuf_unittest.optional_foreign_enum_extension]: FOREIGN_BAZ [protobuf_unittest.optional_import_enum_extension]: IMPORT_BAZ [protobuf_unittest.optional_string_piece_extension]: "124" [protobuf_unittest.optional_cord_extension]: "125" [protobuf_unittest.optional_public_import_message_extension] < e: 126 > [protobuf_unittest.optional_lazy_message_extension] < bb: 127 > [protobuf_unittest.repeated_int32_extension]: 201 [protobuf_unittest.repeated_int32_extension]: 301 [protobuf_unittest.repeated_int64_extension]: 202 [protobuf_unittest.repeated_int64_extension]: 302 [protobuf_unittest.repeated_uint32_extension]: 203 [protobuf_unittest.repeated_uint32_extension]: 303 [protobuf_unittest.repeated_uint64_extension]: 204 [protobuf_unittest.repeated_uint64_extension]: 304 [protobuf_unittest.repeated_sint32_extension]: 205 [protobuf_unittest.repeated_sint32_extension]: 305 [protobuf_unittest.repeated_sint64_extension]: 206 [protobuf_unittest.repeated_sint64_extension]: 306 [protobuf_unittest.repeated_fixed32_extension]: 207 [protobuf_unittest.repeated_fixed32_extension]: 307 [protobuf_unittest.repeated_fixed64_extension]: 208 [protobuf_unittest.repeated_fixed64_extension]: 308 [protobuf_unittest.repeated_sfixed32_extension]: 209 [protobuf_unittest.repeated_sfixed32_extension]: 309 [protobuf_unittest.repeated_sfixed64_extension]: 210 [protobuf_unittest.repeated_sfixed64_extension]: 310 [protobuf_unittest.repeated_float_extension]: 211 [protobuf_unittest.repeated_float_extension]: 311 [protobuf_unittest.repeated_double_extension]: 212 [protobuf_unittest.repeated_double_extension]: 312 [protobuf_unittest.repeated_bool_extension]: true [protobuf_unittest.repeated_bool_extension]: false [protobuf_unittest.repeated_string_extension]: "215" [protobuf_unittest.repeated_string_extension]: "315" [protobuf_unittest.repeated_bytes_extension]: "216" [protobuf_unittest.repeated_bytes_extension]: "316" [protobuf_unittest.repeatedgroup_extension] < a: 217 > [protobuf_unittest.repeatedgroup_extension] < a: 317 > [protobuf_unittest.repeated_nested_message_extension] < bb: 218 > [protobuf_unittest.repeated_nested_message_extension] < bb: 318 > [protobuf_unittest.repeated_foreign_message_extension] < c: 219 > [protobuf_unittest.repeated_foreign_message_extension] < c: 319 > [protobuf_unittest.repeated_import_message_extension] < d: 220 > [protobuf_unittest.repeated_import_message_extension] < d: 320 > [protobuf_unittest.repeated_nested_enum_extension]: BAR [protobuf_unittest.repeated_nested_enum_extension]: BAZ [protobuf_unittest.repeated_foreign_enum_extension]: FOREIGN_BAR [protobuf_unittest.repeated_foreign_enum_extension]: FOREIGN_BAZ [protobuf_unittest.repeated_import_enum_extension]: IMPORT_BAR [protobuf_unittest.repeated_import_enum_extension]: IMPORT_BAZ [protobuf_unittest.repeated_string_piece_extension]: "224" [protobuf_unittest.repeated_string_piece_extension]: "324" [protobuf_unittest.repeated_cord_extension]: "225" [protobuf_unittest.repeated_cord_extension]: "325" [protobuf_unittest.repeated_lazy_message_extension] < bb: 227 > [protobuf_unittest.repeated_lazy_message_extension] < bb: 327 > [protobuf_unittest.default_int32_extension]: 401 [protobuf_unittest.default_int64_extension]: 402 [protobuf_unittest.default_uint32_extension]: 403 [protobuf_unittest.default_uint64_extension]: 404 [protobuf_unittest.default_sint32_extension]: 405 [protobuf_unittest.default_sint64_extension]: 406 [protobuf_unittest.default_fixed32_extension]: 407 [protobuf_unittest.default_fixed64_extension]: 408 [protobuf_unittest.default_sfixed32_extension]: 409 [protobuf_unittest.default_sfixed64_extension]: 410 [protobuf_unittest.default_float_extension]: 411 [protobuf_unittest.default_double_extension]: 412 [protobuf_unittest.default_bool_extension]: false [protobuf_unittest.default_string_extension]: "415" [protobuf_unittest.default_bytes_extension]: "416" [protobuf_unittest.default_nested_enum_extension]: FOO [protobuf_unittest.default_foreign_enum_extension]: FOREIGN_FOO [protobuf_unittest.default_import_enum_extension]: IMPORT_FOO [protobuf_unittest.default_string_piece_extension]: "424" [protobuf_unittest.default_cord_extension]: "425" [protobuf_unittest.oneof_uint32_extension]: 601 [protobuf_unittest.oneof_nested_message_extension] < bb: 602 > [protobuf_unittest.oneof_string_extension]: "603" [protobuf_unittest.oneof_bytes_extension]: "604" python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testing/000077500000000000000000000000001334102242000267465ustar00rootroot00000000000000python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testing/file.cc000066400000000000000000000150231334102242000301750ustar00rootroot00000000000000// 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) // emulates google3/file/base/file.cc #include #include #include #include #ifdef _MSC_VER #define WIN32_LEAN_AND_MEAN // yeah, right #include // Find*File(). :( // #include #else #include #include #endif #include #include namespace google { namespace protobuf { #ifdef _WIN32 // Windows doesn't have symbolic links. #define lstat stat // DO NOT include , instead create functions in io_win32.{h,cc} and import // them like we do below. #endif #ifdef _WIN32 using google::protobuf::internal::win32::access; using google::protobuf::internal::win32::chdir; using google::protobuf::internal::win32::fopen; using google::protobuf::internal::win32::mkdir; using google::protobuf::internal::win32::stat; #endif bool File::Exists(const string& name) { return access(name.c_str(), F_OK) == 0; } bool File::ReadFileToString(const string& name, string* output) { char buffer[1024]; FILE* file = fopen(name.c_str(), "rb"); if (file == NULL) return false; while (true) { size_t n = fread(buffer, 1, sizeof(buffer), file); if (n <= 0) break; output->append(buffer, n); } int error = ferror(file); if (fclose(file) != 0) return false; return error == 0; } void File::ReadFileToStringOrDie(const string& name, string* output) { GOOGLE_CHECK(ReadFileToString(name, output)) << "Could not read: " << name; } bool File::WriteStringToFile(const string& contents, const string& name) { FILE* file = fopen(name.c_str(), "wb"); if (file == NULL) { GOOGLE_LOG(ERROR) << "fopen(" << name << ", \"wb\"): " << strerror(errno); return false; } if (fwrite(contents.data(), 1, contents.size(), file) != contents.size()) { GOOGLE_LOG(ERROR) << "fwrite(" << name << "): " << strerror(errno); fclose(file); return false; } if (fclose(file) != 0) { return false; } return true; } void File::WriteStringToFileOrDie(const string& contents, const string& name) { FILE* file = fopen(name.c_str(), "wb"); GOOGLE_CHECK(file != NULL) << "fopen(" << name << ", \"wb\"): " << strerror(errno); GOOGLE_CHECK_EQ(fwrite(contents.data(), 1, contents.size(), file), contents.size()) << "fwrite(" << name << "): " << strerror(errno); GOOGLE_CHECK(fclose(file) == 0) << "fclose(" << name << "): " << strerror(errno); } bool File::CreateDir(const string& name, int mode) { if (!name.empty()) { GOOGLE_CHECK_OK(name[name.size() - 1] != '.'); } return mkdir(name.c_str(), mode) == 0; } bool File::RecursivelyCreateDir(const string& path, int mode) { if (CreateDir(path, mode)) return true; if (Exists(path)) return false; // Try creating the parent. string::size_type slashpos = path.find_last_of('/'); if (slashpos == string::npos) { // No parent given. return false; } return RecursivelyCreateDir(path.substr(0, slashpos), mode) && CreateDir(path, mode); } void File::DeleteRecursively(const string& name, void* dummy1, void* dummy2) { if (name.empty()) return; // We don't care too much about error checking here since this is only used // in tests to delete temporary directories that are under /tmp anyway. #ifdef _MSC_VER // This interface is so weird. WIN32_FIND_DATAA find_data; HANDLE find_handle = FindFirstFileA((name + "/*").c_str(), &find_data); if (find_handle == INVALID_HANDLE_VALUE) { // Just delete it, whatever it is. DeleteFileA(name.c_str()); RemoveDirectoryA(name.c_str()); return; } do { string entry_name = find_data.cFileName; if (entry_name != "." && entry_name != "..") { string path = name + "/" + entry_name; if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { DeleteRecursively(path, NULL, NULL); RemoveDirectoryA(path.c_str()); } else { DeleteFileA(path.c_str()); } } } while(FindNextFileA(find_handle, &find_data)); FindClose(find_handle); RemoveDirectoryA(name.c_str()); #else // Use opendir()! Yay! // lstat = Don't follow symbolic links. struct stat stats; if (lstat(name.c_str(), &stats) != 0) return; if (S_ISDIR(stats.st_mode)) { DIR* dir = opendir(name.c_str()); if (dir != NULL) { while (true) { struct dirent* entry = readdir(dir); if (entry == NULL) break; string entry_name = entry->d_name; if (entry_name != "." && entry_name != "..") { DeleteRecursively(name + "/" + entry_name, NULL, NULL); } } } closedir(dir); rmdir(name.c_str()); } else if (S_ISREG(stats.st_mode)) { remove(name.c_str()); } #endif } bool File::ChangeWorkingDirectory(const string& new_working_directory) { return chdir(new_working_directory.c_str()) == 0; } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testing/file.h000066400000000000000000000075731334102242000300520ustar00rootroot00000000000000// 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) // emulates google3/file/base/file.h #ifndef GOOGLE_PROTOBUF_TESTING_FILE_H__ #define GOOGLE_PROTOBUF_TESTING_FILE_H__ #include namespace google { namespace protobuf { const int DEFAULT_FILE_MODE = 0777; // Protocol buffer code only uses a couple static methods of File, and only // in tests. class File { public: // Check if the file exists. static bool Exists(const string& name); // Read an entire file to a string. Return true if successful, false // otherwise. static bool ReadFileToString(const string& name, string* output); // Same as above, but crash on failure. static void ReadFileToStringOrDie(const string& name, string* output); // Create a file and write a string to it. static bool WriteStringToFile(const string& contents, const string& name); // Same as above, but crash on failure. static void WriteStringToFileOrDie(const string& contents, const string& name); // Create a directory. static bool CreateDir(const string& name, int mode); // Create a directory and all parent directories if necessary. static bool RecursivelyCreateDir(const string& path, int mode); // If "name" is a file, we delete it. If it is a directory, we // call DeleteRecursively() for each file or directory (other than // dot and double-dot) within it, and then delete the directory itself. // The "dummy" parameters have a meaning in the original version of this // method but they are not used anywhere in protocol buffers. static void DeleteRecursively(const string& name, void* dummy1, void* dummy2); // Change working directory to given directory. static bool ChangeWorkingDirectory(const string& new_working_directory); static bool GetContents( const string& name, string* output, bool /*is_default*/) { return ReadFileToString(name, output); } static bool SetContents( const string& name, const string& contents, bool /*is_default*/) { return WriteStringToFile(contents, name); } private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(File); }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_TESTING_FILE_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testing/googletest.cc000066400000000000000000000224061334102242000314350ustar00rootroot00000000000000// 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) // emulates google3/testing/base/public/googletest.cc #include #include #include #include #include #include #include #include #ifdef _MSC_VER // #include #else #include #endif #include #include #include #include namespace google { namespace protobuf { #ifdef _WIN32 // DO NOT include , instead create functions in io_win32.{h,cc} and import // them like we do below. using google::protobuf::internal::win32::close; using google::protobuf::internal::win32::dup2; using google::protobuf::internal::win32::dup; using google::protobuf::internal::win32::mkdir; using google::protobuf::internal::win32::open; #endif #ifndef O_BINARY #ifdef _O_BINARY #define O_BINARY _O_BINARY #else #define O_BINARY 0 // If this isn't defined, the platform doesn't need it. #endif #endif string TestSourceDir() { #ifndef GOOGLE_THIRD_PARTY_PROTOBUF #ifdef GOOGLE_PROTOBUF_TEST_SOURCE_PATH return GOOGLE_PROTOBUF_TEST_SOURCE_PATH; #else #ifndef _MSC_VER // automake sets the "srcdir" environment variable. char* result = getenv("srcdir"); if (result != NULL) { return result; } #endif // _MSC_VER // Look for the "src" directory. string prefix = "."; while (!File::Exists(prefix + "/src/google/protobuf")) { if (!File::Exists(prefix)) { GOOGLE_LOG(FATAL) << "Could not find protobuf source code. Please run tests from " "somewhere within the protobuf source package."; } prefix += "/.."; } return prefix + "/src"; #endif // GOOGLE_PROTOBUF_TEST_SOURCE_PATH #else return "third_party/protobuf/src"; #endif // GOOGLE_THIRD_PARTY_PROTOBUF } namespace { string GetTemporaryDirectoryName() { // Tests run under Bazel "should not" use /tmp. Bazel sets this environment // variable for tests to use instead. char *from_environment = getenv("TEST_TMPDIR"); if (from_environment != NULL && from_environment[0] != '\0') { return string(from_environment) + "/protobuf_tmpdir"; } // tmpnam() is generally not considered safe but we're only using it for // testing. We cannot use tmpfile() or mkstemp() since we're creating a // directory. char b[L_tmpnam + 1]; // HPUX multithread return 0 if s is 0 string result = tmpnam(b); #ifdef _WIN32 // Avoid a trailing dot by changing it to an underscore. On Win32 the names of // files and directories can, but should not, end with dot. // // In MS-DOS and FAT16 filesystem the filenames were 8dot3 style so it didn't // make sense to have a name ending in dot without an extension, so the shell // silently ignored trailing dots. To this day the Win32 API still maintains // this behavior and silently ignores trailing dots in path arguments of // functions such as CreateFile{A,W}. Even POSIX API function implementations // seem to wrap the Win32 API functions (e.g. CreateDirectoryA) and behave // this way. // It's possible to avoid this behavior and create files / directories with // trailing dots (using CreateFileW / CreateDirectoryW and prefixing the path // with "\\?\") but these will be degenerate in the sense that you cannot // chdir into such directories (or navigate into them with Windows Explorer) // nor can you open such files with some programs (e.g. Notepad). if (result[result.size() - 1] == '.') { result[result.size() - 1] = '_'; } // On Win32, tmpnam() returns a file prefixed with '\', but which is supposed // to be used in the current working directory. WTF? if (HasPrefixString(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); #endif // _WIN32 return result; } // Creates a temporary directory on demand and deletes it when the process // quits. class TempDirDeleter { public: TempDirDeleter() {} ~TempDirDeleter() { if (!name_.empty()) { File::DeleteRecursively(name_, NULL, NULL); } } string GetTempDir() { if (name_.empty()) { name_ = GetTemporaryDirectoryName(); GOOGLE_CHECK(mkdir(name_.c_str(), 0777) == 0) << strerror(errno); // Stick a file in the directory that tells people what this is, in case // we abort and don't get a chance to delete it. File::WriteStringToFileOrDie("", name_ + "/TEMP_DIR_FOR_PROTOBUF_TESTS"); } return name_; } private: string name_; }; TempDirDeleter temp_dir_deleter_; } // namespace string TestTempDir() { return temp_dir_deleter_.GetTempDir(); } // TODO(kenton): Share duplicated code below. Too busy/lazy for now. static string stdout_capture_filename_; static string stderr_capture_filename_; static int original_stdout_ = -1; static int original_stderr_ = -1; void CaptureTestStdout() { GOOGLE_CHECK_EQ(original_stdout_, -1) << "Already capturing."; stdout_capture_filename_ = TestTempDir() + "/captured_stdout"; int fd = open(stdout_capture_filename_.c_str(), O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0777); GOOGLE_CHECK(fd >= 0) << "open: " << strerror(errno); original_stdout_ = dup(1); close(1); dup2(fd, 1); close(fd); } void CaptureTestStderr() { GOOGLE_CHECK_EQ(original_stderr_, -1) << "Already capturing."; stderr_capture_filename_ = TestTempDir() + "/captured_stderr"; int fd = open(stderr_capture_filename_.c_str(), O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0777); GOOGLE_CHECK(fd >= 0) << "open: " << strerror(errno); original_stderr_ = dup(2); close(2); dup2(fd, 2); close(fd); } string GetCapturedTestStdout() { GOOGLE_CHECK_NE(original_stdout_, -1) << "Not capturing."; close(1); dup2(original_stdout_, 1); original_stdout_ = -1; string result; File::ReadFileToStringOrDie(stdout_capture_filename_, &result); remove(stdout_capture_filename_.c_str()); return result; } string GetCapturedTestStderr() { GOOGLE_CHECK_NE(original_stderr_, -1) << "Not capturing."; close(2); dup2(original_stderr_, 2); original_stderr_ = -1; string result; File::ReadFileToStringOrDie(stderr_capture_filename_, &result); remove(stderr_capture_filename_.c_str()); return result; } ScopedMemoryLog* ScopedMemoryLog::active_log_ = NULL; ScopedMemoryLog::ScopedMemoryLog() { GOOGLE_CHECK(active_log_ == NULL); active_log_ = this; old_handler_ = SetLogHandler(&HandleLog); } ScopedMemoryLog::~ScopedMemoryLog() { SetLogHandler(old_handler_); active_log_ = NULL; } const vector& ScopedMemoryLog::GetMessages(LogLevel level) { GOOGLE_CHECK(level == ERROR || level == WARNING); return messages_[level]; } void ScopedMemoryLog::HandleLog(LogLevel level, const char* filename, int line, const string& message) { GOOGLE_CHECK(active_log_ != NULL); if (level == ERROR || level == WARNING) { active_log_->messages_[level].push_back(message); } } namespace { // Force shutdown at process exit so that we can test for memory leaks. To // actually check for leaks, I suggest using the heap checker included with // google-perftools. Set it to "draconian" mode to ensure that every last // call to malloc() has a corresponding free(). struct ForceShutdown { ~ForceShutdown() { ShutdownProtobufLibrary(); // Test to shutdown the library twice, which should succeed. ShutdownProtobufLibrary(); } } force_shutdown; } // namespace } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testing/googletest.h000066400000000000000000000075741334102242000313100ustar00rootroot00000000000000// 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) // emulates google3/testing/base/public/googletest.h #ifndef GOOGLE_PROTOBUF_GOOGLETEST_H__ #define GOOGLE_PROTOBUF_GOOGLETEST_H__ #include #include #include #include // Disable death tests if we use exceptions in CHECK(). #if !PROTOBUF_USE_EXCEPTIONS && defined(GTEST_HAS_DEATH_TEST) && \ !GTEST_OS_WINDOWS #define PROTOBUF_HAS_DEATH_TEST #endif namespace google { namespace protobuf { // When running unittests, get the directory containing the source code. string TestSourceDir(); // When running unittests, get a directory where temporary files may be // placed. string TestTempDir(); // Capture all text written to stdout or stderr. void CaptureTestStdout(); void CaptureTestStderr(); // Stop capturing stdout or stderr and return the text captured. string GetCapturedTestStdout(); string GetCapturedTestStderr(); // For use with ScopedMemoryLog::GetMessages(). Inside Google the LogLevel // constants don't have the LOGLEVEL_ prefix, so the code that used // ScopedMemoryLog refers to LOGLEVEL_ERROR as just ERROR. #undef ERROR // defend against promiscuous windows.h static const LogLevel ERROR = LOGLEVEL_ERROR; static const LogLevel WARNING = LOGLEVEL_WARNING; // Receives copies of all LOG(ERROR) messages while in scope. Sample usage: // { // ScopedMemoryLog log; // constructor registers object as a log sink // SomeRoutineThatMayLogMessages(); // const vector& warnings = log.GetMessages(ERROR); // } // destructor unregisters object as a log sink // This is a dummy implementation which covers only what is used by protocol // buffer unit tests. class ScopedMemoryLog { public: ScopedMemoryLog(); virtual ~ScopedMemoryLog(); // Fetches all messages with the given severity level. const vector& GetMessages(LogLevel error); private: std::map > messages_; LogHandler* old_handler_; static void HandleLog(LogLevel level, const char* filename, int line, const string& message); static ScopedMemoryLog* active_log_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ScopedMemoryLog); }; } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_GOOGLETEST_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testing/zcgunzip.cc000066400000000000000000000054721334102242000311360ustar00rootroot00000000000000// Protocol Buffers - Google's data interchange format // Copyright 2009 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: brianolson@google.com (Brian Olson) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. // // Test program to verify that GzipInputStream is compatible with command line // gunzip or java.util.zip.GzipInputStream // // Reads gzip stream on standard input and writes decompressed data to standard // output. #include #include #include #include #ifdef _WIN32 #ifndef STDIN_FILENO #define STDIN_FILENO 0 #endif #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif #endif #include #include using google::protobuf::io::FileInputStream; using google::protobuf::io::GzipInputStream; int main(int argc, const char** argv) { FileInputStream fin(STDIN_FILENO); GzipInputStream in(&fin); while (true) { const void* inptr; int inlen; bool ok; ok = in.Next(&inptr, &inlen); if (!ok) { break; } if (inlen > 0) { int err = write(STDOUT_FILENO, inptr, inlen); if (err != inlen) { fprintf(stderr, "write unexpectedly returned %d.\n", err); return 1; } } } return 0; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/testing/zcgzip.cc000066400000000000000000000055351334102242000305730ustar00rootroot00000000000000// Protocol Buffers - Google's data interchange format // Copyright 2009 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: brianolson@google.com (Brian Olson) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. // // Test program to verify that GzipOutputStream is compatible with command line // gzip or java.util.zip.GzipOutputStream // // Reads data on standard input and writes compressed gzip stream to standard // output. #include #include #include #ifdef _WIN32 #ifndef STDIN_FILENO #define STDIN_FILENO 0 #endif #ifndef STDOUT_FILENO #define STDOUT_FILENO 1 #endif #endif #include #include using google::protobuf::io::FileOutputStream; using google::protobuf::io::GzipOutputStream; int main(int argc, const char** argv) { FileOutputStream fout(STDOUT_FILENO); GzipOutputStream out(&fout); int readlen; while (true) { void* outptr; int outlen; bool ok; do { ok = out.Next(&outptr, &outlen); if (!ok) { break; } } while (outlen <= 0); readlen = read(STDIN_FILENO, outptr, outlen); if (readlen <= 0) { out.BackUp(outlen); break; } if (readlen < outlen) { out.BackUp(outlen - readlen); } } return 0; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/text_format.cc000066400000000000000000002250711334102242000301430ustar00rootroot00000000000000// 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: jschorr@google.com (Joseph Schorr) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { namespace { inline bool IsHexNumber(const string& str) { return (str.length() >= 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X')); } inline bool IsOctNumber(const string& str) { return (str.length() >= 2 && str[0] == '0' && (str[1] >= '0' && str[1] < '8')); } } // namespace string Message::DebugString() const { string debug_string; TextFormat::Printer printer; printer.SetExpandAny(true); printer.PrintToString(*this, &debug_string); return debug_string; } string Message::ShortDebugString() const { string debug_string; TextFormat::Printer printer; printer.SetSingleLineMode(true); printer.SetExpandAny(true); printer.PrintToString(*this, &debug_string); // Single line mode currently might have an extra space at the end. if (debug_string.size() > 0 && debug_string[debug_string.size() - 1] == ' ') { debug_string.resize(debug_string.size() - 1); } return debug_string; } string Message::Utf8DebugString() const { string debug_string; TextFormat::Printer printer; printer.SetUseUtf8StringEscaping(true); printer.SetExpandAny(true); printer.PrintToString(*this, &debug_string); return debug_string; } void Message::PrintDebugString() const { printf("%s", DebugString().c_str()); } // =========================================================================== // Implementation of the parse information tree class. TextFormat::ParseInfoTree::ParseInfoTree() { } TextFormat::ParseInfoTree::~ParseInfoTree() { // Remove any nested information trees, as they are owned by this tree. for (NestedMap::iterator it = nested_.begin(); it != nested_.end(); ++it) { STLDeleteElements(&(it->second)); } } void TextFormat::ParseInfoTree::RecordLocation( const FieldDescriptor* field, TextFormat::ParseLocation location) { locations_[field].push_back(location); } TextFormat::ParseInfoTree* TextFormat::ParseInfoTree::CreateNested( const FieldDescriptor* field) { // Owned by us in the map. TextFormat::ParseInfoTree* instance = new TextFormat::ParseInfoTree(); std::vector* trees = &nested_[field]; GOOGLE_CHECK(trees); trees->push_back(instance); return instance; } void CheckFieldIndex(const FieldDescriptor* field, int index) { if (field == NULL) { return; } if (field->is_repeated() && index == -1) { GOOGLE_LOG(DFATAL) << "Index must be in range of repeated field values. " << "Field: " << field->name(); } else if (!field->is_repeated() && index != -1) { GOOGLE_LOG(DFATAL) << "Index must be -1 for singular fields." << "Field: " << field->name(); } } TextFormat::ParseLocation TextFormat::ParseInfoTree::GetLocation( const FieldDescriptor* field, int index) const { CheckFieldIndex(field, index); if (index == -1) { index = 0; } const std::vector* locations = FindOrNull(locations_, field); if (locations == NULL || index >= locations->size()) { return TextFormat::ParseLocation(); } return (*locations)[index]; } TextFormat::ParseInfoTree* TextFormat::ParseInfoTree::GetTreeForNested( const FieldDescriptor* field, int index) const { CheckFieldIndex(field, index); if (index == -1) { index = 0; } const std::vector* trees = FindOrNull(nested_, field); if (trees == NULL || index >= trees->size()) { return NULL; } return (*trees)[index]; } // =========================================================================== // Internal class for parsing an ASCII representation of a Protocol Message. // This class makes use of the Protocol Message compiler's tokenizer found // in //google/protobuf/io/tokenizer.h. Note that class's Parse // method is *not* thread-safe and should only be used in a single thread at // a time. // Makes code slightly more readable. The meaning of "DO(foo)" is // "Execute foo and fail if it fails.", where failure is indicated by // returning false. Borrowed from parser.cc (Thanks Kenton!). #define DO(STATEMENT) if (STATEMENT) {} else return false class TextFormat::Parser::ParserImpl { public: // Determines if repeated values for non-repeated fields and // oneofs are permitted, e.g., the string "foo: 1 foo: 2" for a // required/optional field named "foo", or "baz: 1 qux: 2" // where "baz" and "qux" are members of the same oneof. enum SingularOverwritePolicy { ALLOW_SINGULAR_OVERWRITES = 0, // the last value is retained FORBID_SINGULAR_OVERWRITES = 1, // an error is issued }; ParserImpl(const Descriptor* root_message_type, io::ZeroCopyInputStream* input_stream, io::ErrorCollector* error_collector, TextFormat::Finder* finder, ParseInfoTree* parse_info_tree, SingularOverwritePolicy singular_overwrite_policy, bool allow_case_insensitive_field, bool allow_unknown_field, bool allow_unknown_enum, bool allow_field_number, bool allow_relaxed_whitespace, bool allow_partial) : error_collector_(error_collector), finder_(finder), parse_info_tree_(parse_info_tree), tokenizer_error_collector_(this), tokenizer_(input_stream, &tokenizer_error_collector_), root_message_type_(root_message_type), singular_overwrite_policy_(singular_overwrite_policy), allow_case_insensitive_field_(allow_case_insensitive_field), allow_unknown_field_(allow_unknown_field), allow_unknown_enum_(allow_unknown_enum), allow_field_number_(allow_field_number), allow_partial_(allow_partial), had_errors_(false) { // For backwards-compatibility with proto1, we need to allow the 'f' suffix // for floats. tokenizer_.set_allow_f_after_float(true); // '#' starts a comment. tokenizer_.set_comment_style(io::Tokenizer::SH_COMMENT_STYLE); if (allow_relaxed_whitespace) { tokenizer_.set_require_space_after_number(false); tokenizer_.set_allow_multiline_strings(true); } // Consume the starting token. tokenizer_.Next(); } ~ParserImpl() { } // Parses the ASCII representation specified in input and saves the // information into the output pointer (a Message). Returns // false if an error occurs (an error will also be logged to // GOOGLE_LOG(ERROR)). bool Parse(Message* output) { // Consume fields until we cannot do so anymore. while (true) { if (LookingAtType(io::Tokenizer::TYPE_END)) { return !had_errors_; } DO(ConsumeField(output)); } } bool ParseField(const FieldDescriptor* field, Message* output) { bool suc; if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { suc = ConsumeFieldMessage(output, output->GetReflection(), field); } else { suc = ConsumeFieldValue(output, output->GetReflection(), field); } return suc && LookingAtType(io::Tokenizer::TYPE_END); } void ReportError(int line, int col, const string& message) { had_errors_ = true; if (error_collector_ == NULL) { if (line >= 0) { GOOGLE_LOG(ERROR) << "Error parsing text-format " << root_message_type_->full_name() << ": " << (line + 1) << ":" << (col + 1) << ": " << message; } else { GOOGLE_LOG(ERROR) << "Error parsing text-format " << root_message_type_->full_name() << ": " << message; } } else { error_collector_->AddError(line, col, message); } } void ReportWarning(int line, int col, const string& message) { if (error_collector_ == NULL) { if (line >= 0) { GOOGLE_LOG(WARNING) << "Warning parsing text-format " << root_message_type_->full_name() << ": " << (line + 1) << ":" << (col + 1) << ": " << message; } else { GOOGLE_LOG(WARNING) << "Warning parsing text-format " << root_message_type_->full_name() << ": " << message; } } else { error_collector_->AddWarning(line, col, message); } } private: 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 string& message) { ReportError(tokenizer_.current().line, tokenizer_.current().column, message); } // Reports a warning with the given message with information indicating // the position (as derived from the current token). void ReportWarning(const string& message) { ReportWarning(tokenizer_.current().line, tokenizer_.current().column, message); } // Consumes the specified message with the given starting delimiter. // This method checks to see that the end delimiter at the conclusion of // the consumption matches the starting delimiter passed in here. bool ConsumeMessage(Message* message, const string delimiter) { while (!LookingAt(">") && !LookingAt("}")) { DO(ConsumeField(message)); } // Confirm that we have a valid ending delimiter. DO(Consume(delimiter)); return true; } // Consume either "<" or "{". bool ConsumeMessageDelimiter(string* delimiter) { if (TryConsume("<")) { *delimiter = ">"; } else { DO(Consume("{")); *delimiter = "}"; } return true; } // Consumes the current field (as returned by the tokenizer) on the // passed in message. bool ConsumeField(Message* message) { const Reflection* reflection = message->GetReflection(); const Descriptor* descriptor = message->GetDescriptor(); string field_name; bool reserved_field = false; const FieldDescriptor* field = NULL; int start_line = tokenizer_.current().line; int start_column = tokenizer_.current().column; const FieldDescriptor* any_type_url_field; const FieldDescriptor* any_value_field; if (internal::GetAnyFieldDescriptors(*message, &any_type_url_field, &any_value_field) && TryConsume("[")) { string full_type_name, prefix; DO(ConsumeAnyTypeUrl(&full_type_name, &prefix)); DO(Consume("]")); TryConsume(":"); // ':' is optional between message labels and values. string serialized_value; DO(ConsumeAnyValue(full_type_name, message->GetDescriptor()->file()->pool(), &serialized_value)); if (singular_overwrite_policy_ == FORBID_SINGULAR_OVERWRITES) { // Fail if any_type_url_field has already been specified. if ((!any_type_url_field->is_repeated() && reflection->HasField(*message, any_type_url_field)) || (!any_value_field->is_repeated() && reflection->HasField(*message, any_value_field))) { ReportError("Non-repeated Any specified multiple times."); return false; } } reflection->SetString( message, any_type_url_field, string(prefix + full_type_name)); reflection->SetString(message, any_value_field, serialized_value); return true; } if (TryConsume("[")) { // Extension. DO(ConsumeFullTypeName(&field_name)); DO(Consume("]")); field = (finder_ != NULL ? finder_->FindExtension(message, field_name) : reflection->FindKnownExtensionByName(field_name)); if (field == NULL) { if (!allow_unknown_field_) { ReportError("Extension \"" + field_name + "\" is not defined or " "is not an extension of \"" + descriptor->full_name() + "\"."); return false; } else { ReportWarning("Extension \"" + field_name + "\" is not defined or " "is not an extension of \"" + descriptor->full_name() + "\"."); } } } else { DO(ConsumeIdentifier(&field_name)); int32 field_number; if (allow_field_number_ && safe_strto32(field_name, &field_number)) { if (descriptor->IsExtensionNumber(field_number)) { field = reflection->FindKnownExtensionByNumber(field_number); } else if (descriptor->IsReservedNumber(field_number)) { reserved_field = true; } else { field = descriptor->FindFieldByNumber(field_number); } } else { field = descriptor->FindFieldByName(field_name); // Group names are expected to be capitalized as they appear in the // .proto file, which actually matches their type names, not their // field names. if (field == NULL) { string lower_field_name = field_name; LowerString(&lower_field_name); field = descriptor->FindFieldByName(lower_field_name); // If the case-insensitive match worked but the field is NOT a group, if (field != NULL && field->type() != FieldDescriptor::TYPE_GROUP) { field = NULL; } } // Again, special-case group names as described above. if (field != NULL && field->type() == FieldDescriptor::TYPE_GROUP && field->message_type()->name() != field_name) { field = NULL; } if (field == NULL && allow_case_insensitive_field_) { string lower_field_name = field_name; LowerString(&lower_field_name); field = descriptor->FindFieldByLowercaseName(lower_field_name); } if (field == NULL) { reserved_field = descriptor->IsReservedName(field_name); } } if (field == NULL && !reserved_field) { if (!allow_unknown_field_) { ReportError("Message type \"" + descriptor->full_name() + "\" has no field named \"" + field_name + "\"."); return false; } else { ReportWarning("Message type \"" + descriptor->full_name() + "\" has no field named \"" + field_name + "\"."); } } } // Skips unknown or reserved fields. if (field == NULL) { GOOGLE_CHECK(allow_unknown_field_ || reserved_field); // 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 (TryConsume(":") && !LookingAt("{") && !LookingAt("<")) { return SkipFieldValue(); } else { return SkipFieldMessage(); } } if (singular_overwrite_policy_ == FORBID_SINGULAR_OVERWRITES) { // Fail if the field is not repeated and it has already been specified. if (!field->is_repeated() && reflection->HasField(*message, field)) { ReportError("Non-repeated field \"" + field_name + "\" is specified multiple times."); return false; } // Fail if the field is a member of a oneof and another member has already // been specified. const OneofDescriptor* oneof = field->containing_oneof(); if (oneof != NULL && reflection->HasOneof(*message, oneof)) { const FieldDescriptor* other_field = reflection->GetOneofFieldDescriptor(*message, oneof); ReportError("Field \"" + field_name + "\" is specified along with " "field \"" + other_field->name() + "\", another member " "of oneof \"" + oneof->name() + "\"."); return false; } } // Perform special handling for embedded message types. if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { // ':' is optional here. bool consumed_semicolon = TryConsume(":"); if (consumed_semicolon && field->options().weak() && LookingAtType(io::Tokenizer::TYPE_STRING)) { // we are getting a bytes string for a weak field. string tmp; DO(ConsumeString(&tmp)); reflection->MutableMessage(message, field)->ParseFromString(tmp); goto label_skip_parsing; } } else { // ':' is required here. DO(Consume(":")); } if (field->is_repeated() && TryConsume("[")) { // Short repeated format, e.g. "foo: [1, 2, 3]". if (!TryConsume("]")) { // "foo: []" is treated as empty. while (true) { if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { // Perform special handling for embedded message types. DO(ConsumeFieldMessage(message, reflection, field)); } else { DO(ConsumeFieldValue(message, reflection, field)); } if (TryConsume("]")) { break; } DO(Consume(",")); } } } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { DO(ConsumeFieldMessage(message, reflection, field)); } else { DO(ConsumeFieldValue(message, reflection, field)); } label_skip_parsing: // For historical reasons, fields may optionally be separated by commas or // semicolons. TryConsume(";") || TryConsume(","); if (field->options().deprecated()) { ReportWarning("text format contains deprecated field \"" + field_name + "\""); } // If a parse info tree exists, add the location for the parsed // field. if (parse_info_tree_ != NULL) { RecordLocation(parse_info_tree_, field, ParseLocation(start_line, start_column)); } return true; } // Skips the next field including the field's name and value. bool SkipField() { string field_name; if (TryConsume("[")) { // Extension name. DO(ConsumeFullTypeName(&field_name)); DO(Consume("]")); } else { DO(ConsumeIdentifier(&field_name)); } // 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 (TryConsume(":") && !LookingAt("{") && !LookingAt("<")) { DO(SkipFieldValue()); } else { DO(SkipFieldMessage()); } // For historical reasons, fields may optionally be separated by commas or // semicolons. TryConsume(";") || TryConsume(","); return true; } bool ConsumeFieldMessage(Message* message, const Reflection* reflection, const FieldDescriptor* field) { // If the parse information tree is not NULL, create a nested one // for the nested message. ParseInfoTree* parent = parse_info_tree_; if (parent != NULL) { parse_info_tree_ = CreateNested(parent, field); } string delimiter; DO(ConsumeMessageDelimiter(&delimiter)); if (field->is_repeated()) { DO(ConsumeMessage(reflection->AddMessage(message, field), delimiter)); } else { DO(ConsumeMessage(reflection->MutableMessage(message, field), delimiter)); } // Reset the parse information tree. parse_info_tree_ = parent; return true; } // Skips the whole body of a message including the beginning delimiter and // the ending delimiter. bool SkipFieldMessage() { string delimiter; DO(ConsumeMessageDelimiter(&delimiter)); while (!LookingAt(">") && !LookingAt("}")) { DO(SkipField()); } DO(Consume(delimiter)); return true; } bool ConsumeFieldValue(Message* message, const Reflection* reflection, const FieldDescriptor* field) { // Define an easy to use macro for setting fields. This macro checks // to see if the field is repeated (in which case we need to use the Add // methods or not (in which case we need to use the Set methods). #define SET_FIELD(CPPTYPE, VALUE) \ if (field->is_repeated()) { \ reflection->Add##CPPTYPE(message, field, VALUE); \ } else { \ reflection->Set##CPPTYPE(message, field, VALUE); \ } \ switch(field->cpp_type()) { case FieldDescriptor::CPPTYPE_INT32: { int64 value; DO(ConsumeSignedInteger(&value, kint32max)); SET_FIELD(Int32, static_cast(value)); break; } case FieldDescriptor::CPPTYPE_UINT32: { uint64 value; DO(ConsumeUnsignedInteger(&value, kuint32max)); SET_FIELD(UInt32, static_cast(value)); break; } case FieldDescriptor::CPPTYPE_INT64: { int64 value; DO(ConsumeSignedInteger(&value, kint64max)); SET_FIELD(Int64, value); break; } case FieldDescriptor::CPPTYPE_UINT64: { uint64 value; DO(ConsumeUnsignedInteger(&value, kuint64max)); SET_FIELD(UInt64, value); break; } case FieldDescriptor::CPPTYPE_FLOAT: { double value; DO(ConsumeDouble(&value)); SET_FIELD(Float, io::SafeDoubleToFloat(value)); break; } case FieldDescriptor::CPPTYPE_DOUBLE: { double value; DO(ConsumeDouble(&value)); SET_FIELD(Double, value); break; } case FieldDescriptor::CPPTYPE_STRING: { string value; DO(ConsumeString(&value)); SET_FIELD(String, value); break; } case FieldDescriptor::CPPTYPE_BOOL: { if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { uint64 value; DO(ConsumeUnsignedInteger(&value, 1)); SET_FIELD(Bool, value); } else { string value; DO(ConsumeIdentifier(&value)); if (value == "true" || value == "True" || value == "t") { SET_FIELD(Bool, true); } else if (value == "false" || value == "False" || value == "f") { SET_FIELD(Bool, false); } else { ReportError("Invalid value for boolean field \"" + field->name() + "\". Value: \"" + value + "\"."); return false; } } break; } case FieldDescriptor::CPPTYPE_ENUM: { string value; const EnumDescriptor* enum_type = field->enum_type(); const EnumValueDescriptor* enum_value = NULL; if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { DO(ConsumeIdentifier(&value)); // Find the enumeration value. enum_value = enum_type->FindValueByName(value); } else if (LookingAt("-") || LookingAtType(io::Tokenizer::TYPE_INTEGER)) { int64 int_value; DO(ConsumeSignedInteger(&int_value, kint32max)); value = SimpleItoa(int_value); // for error reporting enum_value = enum_type->FindValueByNumber(int_value); } else { ReportError("Expected integer or identifier, got: " + tokenizer_.current().text); return false; } if (enum_value == NULL) { if (!allow_unknown_enum_) { ReportError("Unknown enumeration value of \"" + value + "\" for " "field \"" + field->name() + "\"."); return false; } else { ReportWarning("Unknown enumeration value of \"" + value + "\" for " "field \"" + field->name() + "\"."); return true; } } SET_FIELD(Enum, enum_value); break; } case FieldDescriptor::CPPTYPE_MESSAGE: { // We should never get here. Put here instead of a default // so that if new types are added, we get a nice compiler warning. GOOGLE_LOG(FATAL) << "Reached an unintended state: CPPTYPE_MESSAGE"; break; } } #undef SET_FIELD return true; } bool SkipFieldValue() { if (LookingAtType(io::Tokenizer::TYPE_STRING)) { while (LookingAtType(io::Tokenizer::TYPE_STRING)) { tokenizer_.Next(); } return true; } if (TryConsume("[")) { while (true) { if (!LookingAt("{") && !LookingAt("<")) { DO(SkipFieldValue()); } else { DO(SkipFieldMessage()); } if (TryConsume("]")) { break; } DO(Consume(",")); } return true; } // Possible field values other than string: // 12345 => TYPE_INTEGER // -12345 => TYPE_SYMBOL + TYPE_INTEGER // 1.2345 => TYPE_FLOAT // -1.2345 => TYPE_SYMBOL + TYPE_FLOAT // inf => TYPE_IDENTIFIER // -inf => TYPE_SYMBOL + TYPE_IDENTIFIER // TYPE_INTEGER => TYPE_IDENTIFIER // Divides them into two group, one with TYPE_SYMBOL // and the other without: // Group one: // 12345 => TYPE_INTEGER // 1.2345 => TYPE_FLOAT // inf => TYPE_IDENTIFIER // TYPE_INTEGER => TYPE_IDENTIFIER // Group two: // -12345 => TYPE_SYMBOL + TYPE_INTEGER // -1.2345 => TYPE_SYMBOL + TYPE_FLOAT // -inf => TYPE_SYMBOL + TYPE_IDENTIFIER // As we can see, the field value consists of an optional '-' and one of // TYPE_INTEGER, TYPE_FLOAT and TYPE_IDENTIFIER. bool has_minus = TryConsume("-"); if (!LookingAtType(io::Tokenizer::TYPE_INTEGER) && !LookingAtType(io::Tokenizer::TYPE_FLOAT) && !LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { return false; } // Combination of '-' and TYPE_IDENTIFIER may result in an invalid field // value while other combinations all generate valid values. // We check if the value of this combination is valid here. // TYPE_IDENTIFIER after a '-' should be one of the float values listed // below: // inf, inff, infinity, nan if (has_minus && LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { string text = tokenizer_.current().text; LowerString(&text); if (text != "inf" && text != "infinity" && text != "nan") { ReportError("Invalid float number: " + text); return false; } } tokenizer_.Next(); return true; } // Returns true if the current token's text is equal to that specified. bool LookingAt(const string& text) { return tokenizer_.current().text == text; } // Returns true if the current token's type is equal to that specified. bool LookingAtType(io::Tokenizer::TokenType token_type) { return tokenizer_.current().type == token_type; } // Consumes an identifier and saves its value in the identifier parameter. // Returns false if the token is not of type IDENTFIER. bool ConsumeIdentifier(string* identifier) { if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { *identifier = tokenizer_.current().text; tokenizer_.Next(); return true; } // If allow_field_numer_ or allow_unknown_field_ is true, we should able // to parse integer identifiers. if ((allow_field_number_ || allow_unknown_field_) && LookingAtType(io::Tokenizer::TYPE_INTEGER)) { *identifier = tokenizer_.current().text; tokenizer_.Next(); return true; } ReportError("Expected identifier, got: " + tokenizer_.current().text); return false; } // Consume a string of form ".....". bool ConsumeFullTypeName(string* name) { DO(ConsumeIdentifier(name)); while (TryConsume(".")) { string part; DO(ConsumeIdentifier(&part)); *name += "."; *name += part; } return true; } // Consumes a string and saves its value in the text parameter. // Returns false if the token is not of type STRING. bool ConsumeString(string* text) { if (!LookingAtType(io::Tokenizer::TYPE_STRING)) { ReportError("Expected string, got: " + tokenizer_.current().text); return false; } text->clear(); while (LookingAtType(io::Tokenizer::TYPE_STRING)) { io::Tokenizer::ParseStringAppend(tokenizer_.current().text, text); tokenizer_.Next(); } return true; } // Consumes a uint64 and saves its value in the value parameter. // Returns false if the token is not of type INTEGER. bool ConsumeUnsignedInteger(uint64* value, uint64 max_value) { if (!LookingAtType(io::Tokenizer::TYPE_INTEGER)) { ReportError("Expected integer, got: " + tokenizer_.current().text); return false; } if (!io::Tokenizer::ParseInteger(tokenizer_.current().text, max_value, value)) { ReportError("Integer out of range (" + tokenizer_.current().text + ")"); return false; } tokenizer_.Next(); return true; } // Consumes an int64 and saves its value in the value parameter. // Note that since the tokenizer does not support negative numbers, // we actually may consume an additional token (for the minus sign) in this // method. Returns false if the token is not an integer // (signed or otherwise). bool ConsumeSignedInteger(int64* value, uint64 max_value) { bool negative = false; if (TryConsume("-")) { negative = true; // Two's complement always allows one more negative integer than // positive. ++max_value; } uint64 unsigned_value; DO(ConsumeUnsignedInteger(&unsigned_value, max_value)); if (negative) { if ((static_cast(kint64max) + 1) == unsigned_value) { *value = kint64min; } else { *value = -static_cast(unsigned_value); } } else { *value = static_cast(unsigned_value); } return true; } // Consumes a uint64 and saves its value in the value parameter. // Accepts decimal numbers only, rejects hex or oct numbers. bool ConsumeUnsignedDecimalInteger(uint64* value, uint64 max_value) { if (!LookingAtType(io::Tokenizer::TYPE_INTEGER)) { ReportError("Expected integer, got: " + tokenizer_.current().text); return false; } const string& text = tokenizer_.current().text; if (IsHexNumber(text) || IsOctNumber(text)) { ReportError("Expect a decimal number, got: " + text); return false; } if (!io::Tokenizer::ParseInteger(text, max_value, value)) { ReportError("Integer out of range (" + text + ")"); return false; } tokenizer_.Next(); return true; } // Consumes a double and saves its value in the value parameter. // Note that since the tokenizer does not support negative numbers, // we actually may consume an additional token (for the minus sign) in this // method. Returns false if the token is not a double // (signed or otherwise). bool ConsumeDouble(double* value) { bool negative = false; if (TryConsume("-")) { negative = true; } // A double can actually be an integer, according to the tokenizer. // Therefore, we must check both cases here. if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { // We have found an integer value for the double. uint64 integer_value; DO(ConsumeUnsignedDecimalInteger(&integer_value, kuint64max)); *value = static_cast(integer_value); } else if (LookingAtType(io::Tokenizer::TYPE_FLOAT)) { // We have found a float value for the double. *value = io::Tokenizer::ParseFloat(tokenizer_.current().text); // Mark the current token as consumed. tokenizer_.Next(); } else if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { string text = tokenizer_.current().text; LowerString(&text); if (text == "inf" || text == "infinity") { *value = std::numeric_limits::infinity(); tokenizer_.Next(); } else if (text == "nan") { *value = std::numeric_limits::quiet_NaN(); tokenizer_.Next(); } else { ReportError("Expected double, got: " + text); return false; } } else { ReportError("Expected double, got: " + tokenizer_.current().text); return false; } if (negative) { *value = -*value; } return true; } // Consumes Any::type_url value, of form "type.googleapis.com/full.type.Name" // or "type.googleprod.com/full.type.Name" bool ConsumeAnyTypeUrl(string* full_type_name, string* prefix) { // TODO(saito) Extend Consume() to consume multiple tokens at once, so that // this code can be written as just DO(Consume(kGoogleApisTypePrefix)). string url1, url2, url3; DO(ConsumeIdentifier(&url1)); // type DO(Consume(".")); DO(ConsumeIdentifier(&url2)); // googleapis DO(Consume(".")); DO(ConsumeIdentifier(&url3)); // com DO(Consume("/")); DO(ConsumeFullTypeName(full_type_name)); *prefix = url1 + "." + url2 + "." + url3 + "/"; if (*prefix != internal::kTypeGoogleApisComPrefix && *prefix != internal::kTypeGoogleProdComPrefix) { ReportError("TextFormat::Parser for Any supports only " "type.googleapis.com and type.googleprod.com, " "but found \"" + *prefix + "\""); return false; } return true; } // A helper function for reconstructing Any::value. Consumes a text of // full_type_name, then serializes it into serialized_value. "pool" is used to // look up and create a temporary object with full_type_name. bool ConsumeAnyValue(const string& full_type_name, const DescriptorPool* pool, string* serialized_value) { const Descriptor* value_descriptor = pool->FindMessageTypeByName(full_type_name); if (value_descriptor == NULL) { ReportError("Could not find type \"" + full_type_name + "\" stored in google.protobuf.Any."); return false; } DynamicMessageFactory factory; const Message* value_prototype = factory.GetPrototype(value_descriptor); if (value_prototype == NULL) { return false; } google::protobuf::scoped_ptr value(value_prototype->New()); string sub_delimiter; DO(ConsumeMessageDelimiter(&sub_delimiter)); DO(ConsumeMessage(value.get(), sub_delimiter)); if (allow_partial_) { value->AppendPartialToString(serialized_value); } else { if (!value->IsInitialized()) { ReportError( "Value of type \"" + full_type_name + "\" stored in google.protobuf.Any has missing required fields"); return false; } value->AppendToString(serialized_value); } return true; } // Consumes a token and confirms that it matches that specified in the // value parameter. Returns false if the token found does not match that // which was specified. bool Consume(const string& value) { const string& current_value = tokenizer_.current().text; if (current_value != value) { ReportError("Expected \"" + value + "\", found \"" + current_value + "\"."); return false; } tokenizer_.Next(); return true; } // Attempts to consume the supplied value. Returns false if a the // token found does not match the value specified. bool TryConsume(const string& value) { if (tokenizer_.current().text == value) { tokenizer_.Next(); return true; } else { return false; } } // An internal instance of the Tokenizer's error collector, used to // collect any base-level parse errors and feed them to the ParserImpl. class ParserErrorCollector : public io::ErrorCollector { public: explicit ParserErrorCollector(TextFormat::Parser::ParserImpl* parser) : parser_(parser) { } virtual ~ParserErrorCollector() { } virtual void AddError(int line, int column, const string& message) { parser_->ReportError(line, column, message); } virtual void AddWarning(int line, int column, const string& message) { parser_->ReportWarning(line, column, message); } private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParserErrorCollector); TextFormat::Parser::ParserImpl* parser_; }; io::ErrorCollector* error_collector_; TextFormat::Finder* finder_; ParseInfoTree* parse_info_tree_; ParserErrorCollector tokenizer_error_collector_; io::Tokenizer tokenizer_; const Descriptor* root_message_type_; SingularOverwritePolicy singular_overwrite_policy_; const bool allow_case_insensitive_field_; const bool allow_unknown_field_; const bool allow_unknown_enum_; const bool allow_field_number_; const bool allow_partial_; bool had_errors_; }; #undef DO // =========================================================================== // Internal class for writing text to the io::ZeroCopyOutputStream. Adapted // from the Printer found in //google/protobuf/io/printer.h class TextFormat::Printer::TextGenerator : public TextFormat::BaseTextGenerator { public: explicit TextGenerator(io::ZeroCopyOutputStream* output, int initial_indent_level) : output_(output), buffer_(NULL), buffer_size_(0), at_start_of_line_(true), failed_(false), indent_level_(initial_indent_level), initial_indent_level_(initial_indent_level) { } ~TextGenerator() { // Only BackUp() if we're sure we've successfully called Next() at least // once. if (!failed_ && buffer_size_ > 0) { output_->BackUp(buffer_size_); } } // 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() { ++indent_level_; } // Reduces the current indent level by two spaces, or crashes if the indent // level is zero. void Outdent() { if (indent_level_ == 0 || indent_level_ < initial_indent_level_) { GOOGLE_LOG(DFATAL) << " Outdent() without matching Indent()."; return; } --indent_level_; } // Print text to the output stream. void Print(const char* text, size_t size) { if (indent_level_ > 0) { size_t pos = 0; // The number of bytes we've written so far. for (size_t 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'. Write(text + pos, i - pos + 1); pos = i + 1; // Setting this true will cause the next Write() to insert an indent // first. at_start_of_line_ = true; } } // Write the rest. Write(text + pos, size - pos); } else { Write(text, size); if (size > 0 && text[size - 1] == '\n') { at_start_of_line_ = 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_; } private: GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextGenerator); void Write(const char* data, size_t size) { if (failed_) return; if (size == 0) return; if (at_start_of_line_) { // Insert an indent. at_start_of_line_ = false; WriteIndent(); if (failed_) 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_); data += buffer_size_; size -= buffer_size_; } void* void_buffer = NULL; failed_ = !output_->Next(&void_buffer, &buffer_size_); if (failed_) return; buffer_ = reinterpret_cast(void_buffer); } // Buffer is big enough to receive the data; copy it. memcpy(buffer_, data, size); buffer_ += size; buffer_size_ -= size; } void WriteIndent() { if (indent_level_ == 0) { return; } GOOGLE_DCHECK(!failed_); int size = 2 * indent_level_; while (size > buffer_size_) { // Data exceeds space in the buffer. Write what we can and request a new // buffer. memset(buffer_, ' ', buffer_size_); size -= buffer_size_; void* void_buffer; failed_ = !output_->Next(&void_buffer, &buffer_size_); if (failed_) return; buffer_ = reinterpret_cast(void_buffer); } // Buffer is big enough to receive the data; copy it. memset(buffer_, ' ', size); buffer_ += size; buffer_size_ -= size; } io::ZeroCopyOutputStream* const output_; char* buffer_; int buffer_size_; bool at_start_of_line_; bool failed_; int indent_level_; int initial_indent_level_; }; // =========================================================================== TextFormat::Finder::~Finder() { } TextFormat::Parser::Parser() : error_collector_(NULL), finder_(NULL), parse_info_tree_(NULL), allow_partial_(false), allow_case_insensitive_field_(false), allow_unknown_field_(false), allow_unknown_enum_(false), allow_field_number_(false), allow_relaxed_whitespace_(false), allow_singular_overwrites_(false) { } TextFormat::Parser::~Parser() {} bool TextFormat::Parser::Parse(io::ZeroCopyInputStream* input, Message* output) { output->Clear(); ParserImpl::SingularOverwritePolicy overwrites_policy = allow_singular_overwrites_ ? ParserImpl::ALLOW_SINGULAR_OVERWRITES : ParserImpl::FORBID_SINGULAR_OVERWRITES; ParserImpl parser(output->GetDescriptor(), input, error_collector_, finder_, parse_info_tree_, overwrites_policy, allow_case_insensitive_field_, allow_unknown_field_, allow_unknown_enum_, allow_field_number_, allow_relaxed_whitespace_, allow_partial_); return MergeUsingImpl(input, output, &parser); } bool TextFormat::Parser::ParseFromString(const string& input, Message* output) { io::ArrayInputStream input_stream(input.data(), input.size()); return Parse(&input_stream, output); } bool TextFormat::Parser::Merge(io::ZeroCopyInputStream* input, Message* output) { ParserImpl parser(output->GetDescriptor(), input, error_collector_, finder_, parse_info_tree_, ParserImpl::ALLOW_SINGULAR_OVERWRITES, allow_case_insensitive_field_, allow_unknown_field_, allow_unknown_enum_, allow_field_number_, allow_relaxed_whitespace_, allow_partial_); return MergeUsingImpl(input, output, &parser); } bool TextFormat::Parser::MergeFromString(const string& input, Message* output) { io::ArrayInputStream input_stream(input.data(), input.size()); return Merge(&input_stream, output); } bool TextFormat::Parser::MergeUsingImpl(io::ZeroCopyInputStream* /* input */, Message* output, ParserImpl* parser_impl) { if (!parser_impl->Parse(output)) return false; if (!allow_partial_ && !output->IsInitialized()) { std::vector missing_fields; output->FindInitializationErrors(&missing_fields); parser_impl->ReportError(-1, 0, "Message missing required fields: " + Join(missing_fields, ", ")); return false; } return true; } bool TextFormat::Parser::ParseFieldValueFromString( const string& input, const FieldDescriptor* field, Message* output) { io::ArrayInputStream input_stream(input.data(), input.size()); ParserImpl parser(output->GetDescriptor(), &input_stream, error_collector_, finder_, parse_info_tree_, ParserImpl::ALLOW_SINGULAR_OVERWRITES, allow_case_insensitive_field_, allow_unknown_field_, allow_unknown_enum_, allow_field_number_, allow_relaxed_whitespace_, allow_partial_); return parser.ParseField(field, output); } /* static */ bool TextFormat::Parse(io::ZeroCopyInputStream* input, Message* output) { return Parser().Parse(input, output); } /* static */ bool TextFormat::Merge(io::ZeroCopyInputStream* input, Message* output) { return Parser().Merge(input, output); } /* static */ bool TextFormat::ParseFromString(const string& input, Message* output) { return Parser().ParseFromString(input, output); } /* static */ bool TextFormat::MergeFromString(const string& input, Message* output) { return Parser().MergeFromString(input, output); } // =========================================================================== TextFormat::BaseTextGenerator::~BaseTextGenerator() {} namespace { // A BaseTextGenerator that writes to a string. class StringBaseTextGenerator : public TextFormat::BaseTextGenerator { public: void Print(const char* text, size_t size) { output_.append(text, size); } // Some compilers do not support ref-qualifiers even in C++11 mode. // Disable the optimization for now and revisit it later. #if 0 // LANG_CXX11 string Consume() && { return std::move(output_); } #else // !LANG_CXX11 const string& Get() { return output_; } #endif // LANG_CXX11 private: string output_; }; } // namespace // The default implementation for FieldValuePrinter. We just delegate the // implementation to the default FastFieldValuePrinter to avoid duplicating the // logic. TextFormat::FieldValuePrinter::FieldValuePrinter() {} TextFormat::FieldValuePrinter::~FieldValuePrinter() {} #if 0 // LANG_CXX11 #define FORWARD_IMPL(fn, ...) \ StringBaseTextGenerator generator; \ delegate_.fn(__VA_ARGS__, &generator); \ return std::move(generator).Consume() #else // !LANG_CXX11 #define FORWARD_IMPL(fn, ...) \ StringBaseTextGenerator generator; \ delegate_.fn(__VA_ARGS__, &generator); \ return generator.Get() #endif // LANG_CXX11 string TextFormat::FieldValuePrinter::PrintBool(bool val) const { FORWARD_IMPL(PrintBool, val); } string TextFormat::FieldValuePrinter::PrintInt32(int32 val) const { FORWARD_IMPL(PrintInt32, val); } string TextFormat::FieldValuePrinter::PrintUInt32(uint32 val) const { FORWARD_IMPL(PrintUInt32, val); } string TextFormat::FieldValuePrinter::PrintInt64(int64 val) const { FORWARD_IMPL(PrintInt64, val); } string TextFormat::FieldValuePrinter::PrintUInt64(uint64 val) const { FORWARD_IMPL(PrintUInt64, val); } string TextFormat::FieldValuePrinter::PrintFloat(float val) const { FORWARD_IMPL(PrintFloat, val); } string TextFormat::FieldValuePrinter::PrintDouble(double val) const { FORWARD_IMPL(PrintDouble, val); } string TextFormat::FieldValuePrinter::PrintString(const string& val) const { FORWARD_IMPL(PrintString, val); } string TextFormat::FieldValuePrinter::PrintBytes(const string& val) const { return PrintString(val); } string TextFormat::FieldValuePrinter::PrintEnum(int32 val, const string& name) const { FORWARD_IMPL(PrintEnum, val, name); } string TextFormat::FieldValuePrinter::PrintFieldName( const Message& message, const Reflection* reflection, const FieldDescriptor* field) const { FORWARD_IMPL(PrintFieldName, message, reflection, field); } string TextFormat::FieldValuePrinter::PrintMessageStart( const Message& message, int field_index, int field_count, bool single_line_mode) const { FORWARD_IMPL(PrintMessageStart, message, field_index, field_count, single_line_mode); } string TextFormat::FieldValuePrinter::PrintMessageEnd( const Message& message, int field_index, int field_count, bool single_line_mode) const { FORWARD_IMPL(PrintMessageEnd, message, field_index, field_count, single_line_mode); } #undef FORWARD_IMPL TextFormat::FastFieldValuePrinter::FastFieldValuePrinter() {} TextFormat::FastFieldValuePrinter::~FastFieldValuePrinter() {} void TextFormat::FastFieldValuePrinter::PrintBool( bool val, BaseTextGenerator* generator) const { if (val) { generator->PrintLiteral("true"); } else { generator->PrintLiteral("false"); } } void TextFormat::FastFieldValuePrinter::PrintInt32( int32 val, BaseTextGenerator* generator) const { generator->PrintString(SimpleItoa(val)); } void TextFormat::FastFieldValuePrinter::PrintUInt32( uint32 val, BaseTextGenerator* generator) const { generator->PrintString(SimpleItoa(val)); } void TextFormat::FastFieldValuePrinter::PrintInt64( int64 val, BaseTextGenerator* generator) const { generator->PrintString(SimpleItoa(val)); } void TextFormat::FastFieldValuePrinter::PrintUInt64( uint64 val, BaseTextGenerator* generator) const { generator->PrintString(SimpleItoa(val)); } void TextFormat::FastFieldValuePrinter::PrintFloat( float val, BaseTextGenerator* generator) const { generator->PrintString(SimpleFtoa(val)); } void TextFormat::FastFieldValuePrinter::PrintDouble( double val, BaseTextGenerator* generator) const { generator->PrintString(SimpleDtoa(val)); } void TextFormat::FastFieldValuePrinter::PrintEnum( int32 val, const string& name, BaseTextGenerator* generator) const { generator->PrintString(name); } void TextFormat::FastFieldValuePrinter::PrintString( const string& val, BaseTextGenerator* generator) const { generator->PrintLiteral("\""); generator->PrintString(CEscape(val)); generator->PrintLiteral("\""); } void TextFormat::FastFieldValuePrinter::PrintBytes( const string& val, BaseTextGenerator* generator) const { PrintString(val, generator); } void TextFormat::FastFieldValuePrinter::PrintFieldName( const Message& message, const Reflection* reflection, const FieldDescriptor* field, BaseTextGenerator* generator) const { if (field->is_extension()) { generator->PrintLiteral("["); // We special-case MessageSet elements for compatibility with proto1. if (field->containing_type()->options().message_set_wire_format() && field->type() == FieldDescriptor::TYPE_MESSAGE && field->is_optional() && field->extension_scope() == field->message_type()) { generator->PrintString(field->message_type()->full_name()); } else { generator->PrintString(field->full_name()); } generator->PrintLiteral("]"); } else if (field->type() == FieldDescriptor::TYPE_GROUP) { // Groups must be serialized with their original capitalization. generator->PrintString(field->message_type()->name()); } else { generator->PrintString(field->name()); } } void TextFormat::FastFieldValuePrinter::PrintMessageStart( const Message& message, int field_index, int field_count, bool single_line_mode, BaseTextGenerator* generator) const { if (single_line_mode) { generator->PrintLiteral(" { "); } else { generator->PrintLiteral(" {\n"); } } void TextFormat::FastFieldValuePrinter::PrintMessageEnd( const Message& message, int field_index, int field_count, bool single_line_mode, BaseTextGenerator* generator) const { if (single_line_mode) { generator->PrintLiteral("} "); } else { generator->PrintLiteral("}\n"); } } namespace { // A legacy compatibility wrapper. Takes ownership of the delegate. class FieldValuePrinterWrapper : public TextFormat::FastFieldValuePrinter { public: explicit FieldValuePrinterWrapper( const TextFormat::FieldValuePrinter* delegate) : delegate_(delegate) {} void SetDelegate(const TextFormat::FieldValuePrinter* delegate) { delegate_.reset(delegate); } void PrintBool(bool val, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintBool(val)); } void PrintInt32(int32 val, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintInt32(val)); } void PrintUInt32(uint32 val, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintUInt32(val)); } void PrintInt64(int64 val, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintInt64(val)); } void PrintUInt64(uint64 val, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintUInt64(val)); } void PrintFloat(float val, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintFloat(val)); } void PrintDouble(double val, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintDouble(val)); } void PrintString(const string& val, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintString(val)); } void PrintBytes(const string& val, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintBytes(val)); } void PrintEnum(int32 val, const string& name, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintEnum(val, name)); } void PrintFieldName(const Message& message, const Reflection* reflection, const FieldDescriptor* field, TextFormat::BaseTextGenerator* generator) const { generator->PrintString( delegate_->PrintFieldName(message, reflection, field)); } void PrintMessageStart(const Message& message, int field_index, int field_count, bool single_line_mode, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintMessageStart( message, field_index, field_count, single_line_mode)); } void PrintMessageEnd(const Message& message, int field_index, int field_count, bool single_line_mode, TextFormat::BaseTextGenerator* generator) const { generator->PrintString(delegate_->PrintMessageEnd( message, field_index, field_count, single_line_mode)); } private: google::protobuf::scoped_ptr delegate_; }; // Our own specialization: for UTF8 escaped strings. class FastFieldValuePrinterUtf8Escaping : public TextFormat::FastFieldValuePrinter { public: void PrintString(const string& val, TextFormat::BaseTextGenerator* generator) const { generator->PrintLiteral("\""); generator->PrintString(strings::Utf8SafeCEscape(val)); generator->PrintLiteral("\""); } void PrintBytes(const string& val, TextFormat::BaseTextGenerator* generator) const { return FastFieldValuePrinter::PrintString(val, generator); } }; } // namespace TextFormat::Printer::Printer() : initial_indent_level_(0), single_line_mode_(false), use_field_number_(false), use_short_repeated_primitives_(false), hide_unknown_fields_(false), print_message_fields_in_index_order_(false), expand_any_(false), truncate_string_field_longer_than_(0LL) { SetUseUtf8StringEscaping(false); } TextFormat::Printer::~Printer() { STLDeleteValues(&custom_printers_); } void TextFormat::Printer::SetUseUtf8StringEscaping(bool as_utf8) { SetDefaultFieldValuePrinter(as_utf8 ? new FastFieldValuePrinterUtf8Escaping() : new FastFieldValuePrinter()); } void TextFormat::Printer::SetDefaultFieldValuePrinter( const FieldValuePrinter* printer) { default_field_value_printer_.reset(new FieldValuePrinterWrapper(printer)); } void TextFormat::Printer::SetDefaultFieldValuePrinter( const FastFieldValuePrinter* printer) { default_field_value_printer_.reset(printer); } bool TextFormat::Printer::RegisterFieldValuePrinter( const FieldDescriptor* field, const FieldValuePrinter* printer) { if (field == NULL || printer == NULL) { return false; } FieldValuePrinterWrapper* const wrapper = new FieldValuePrinterWrapper(NULL); if (custom_printers_.insert(std::make_pair(field, wrapper)).second) { wrapper->SetDelegate(printer); return true; } else { delete wrapper; return false; } } bool TextFormat::Printer::RegisterFieldValuePrinter( const FieldDescriptor* field, const FastFieldValuePrinter* printer) { return field != NULL && printer != NULL && custom_printers_.insert(std::make_pair(field, printer)).second; } bool TextFormat::Printer::PrintToString(const Message& message, string* output) const { GOOGLE_DCHECK(output) << "output specified is NULL"; output->clear(); io::StringOutputStream output_stream(output); return Print(message, &output_stream); } bool TextFormat::Printer::PrintUnknownFieldsToString( const UnknownFieldSet& unknown_fields, string* output) const { GOOGLE_DCHECK(output) << "output specified is NULL"; output->clear(); io::StringOutputStream output_stream(output); return PrintUnknownFields(unknown_fields, &output_stream); } bool TextFormat::Printer::Print(const Message& message, io::ZeroCopyOutputStream* output) const { TextGenerator generator(output, initial_indent_level_); Print(message, &generator); // Output false if the generator failed internally. return !generator.failed(); } bool TextFormat::Printer::PrintUnknownFields( const UnknownFieldSet& unknown_fields, io::ZeroCopyOutputStream* output) const { TextGenerator generator(output, initial_indent_level_); PrintUnknownFields(unknown_fields, &generator); // Output false if the generator failed internally. return !generator.failed(); } namespace { // Comparison functor for sorting FieldDescriptors by field index. struct FieldIndexSorter { bool operator()(const FieldDescriptor* left, const FieldDescriptor* right) const { return left->index() < right->index(); } }; } // namespace bool TextFormat::Printer::PrintAny(const Message& message, TextGenerator* generator) const { const FieldDescriptor* type_url_field; const FieldDescriptor* value_field; if (!internal::GetAnyFieldDescriptors(message, &type_url_field, &value_field)) { return false; } const Reflection* reflection = message.GetReflection(); // Extract the full type name from the type_url field. const string& type_url = reflection->GetString(message, type_url_field); string full_type_name; if (!internal::ParseAnyTypeUrl(type_url, &full_type_name)) { return false; } // Print the "value" in text. const google::protobuf::Descriptor* value_descriptor = message.GetDescriptor()->file()->pool()->FindMessageTypeByName( full_type_name); if (value_descriptor == NULL) { GOOGLE_LOG(WARNING) << "Proto type " << type_url << " not found"; return false; } DynamicMessageFactory factory; google::protobuf::scoped_ptr value_message( factory.GetPrototype(value_descriptor)->New()); string serialized_value = reflection->GetString(message, value_field); if (!value_message->ParseFromString(serialized_value)) { GOOGLE_LOG(WARNING) << type_url << ": failed to parse contents"; return false; } generator->PrintLiteral("["); generator->PrintString(type_url); generator->PrintLiteral("]"); const FastFieldValuePrinter* printer = FindWithDefault( custom_printers_, value_field, default_field_value_printer_.get()); printer->PrintMessageStart(message, -1, 0, single_line_mode_, generator); generator->Indent(); Print(*value_message, generator); generator->Outdent(); printer->PrintMessageEnd(message, -1, 0, single_line_mode_, generator); return true; } void TextFormat::Printer::Print(const Message& message, TextGenerator* generator) const { const Descriptor* descriptor = message.GetDescriptor(); const Reflection* reflection = message.GetReflection(); if (descriptor->full_name() == internal::kAnyFullTypeName && expand_any_ && PrintAny(message, generator)) { return; } std::vector fields; reflection->ListFields(message, &fields); if (print_message_fields_in_index_order_) { std::sort(fields.begin(), fields.end(), FieldIndexSorter()); } for (int i = 0; i < fields.size(); i++) { PrintField(message, reflection, fields[i], generator); } if (!hide_unknown_fields_) { PrintUnknownFields(reflection->GetUnknownFields(message), generator); } } void TextFormat::Printer::PrintFieldValueToString( const Message& message, const FieldDescriptor* field, int index, string* output) const { GOOGLE_DCHECK(output) << "output specified is NULL"; output->clear(); io::StringOutputStream output_stream(output); TextGenerator generator(&output_stream, initial_indent_level_); PrintFieldValue(message, message.GetReflection(), field, index, &generator); } void TextFormat::Printer::PrintField(const Message& message, const Reflection* reflection, const FieldDescriptor* field, TextGenerator* generator) const { if (use_short_repeated_primitives_ && field->is_repeated() && field->cpp_type() != FieldDescriptor::CPPTYPE_STRING && field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { PrintShortRepeatedField(message, reflection, field, generator); return; } int count = 0; if (field->is_repeated()) { count = reflection->FieldSize(message, field); } else if (reflection->HasField(message, field)) { count = 1; } std::vector map_entries; const bool is_map = field->is_map(); if (is_map) { map_entries = DynamicMapSorter::Sort(message, count, reflection, field); } for (int j = 0; j < count; ++j) { const int field_index = field->is_repeated() ? j : -1; PrintFieldName(message, reflection, field, generator); if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { const FastFieldValuePrinter* printer = FindWithDefault( custom_printers_, field, default_field_value_printer_.get()); const Message& sub_message = field->is_repeated() ? (is_map ? *map_entries[j] : reflection->GetRepeatedMessage(message, field, j)) : reflection->GetMessage(message, field); printer->PrintMessageStart(sub_message, field_index, count, single_line_mode_, generator); generator->Indent(); Print(sub_message, generator); generator->Outdent(); printer->PrintMessageEnd(sub_message, field_index, count, single_line_mode_, generator); } else { generator->PrintLiteral(": "); // Write the field value. PrintFieldValue(message, reflection, field, field_index, generator); if (single_line_mode_) { generator->PrintLiteral(" "); } else { generator->PrintLiteral("\n"); } } } } void TextFormat::Printer::PrintShortRepeatedField( const Message& message, const Reflection* reflection, const FieldDescriptor* field, TextGenerator* generator) const { // Print primitive repeated field in short form. PrintFieldName(message, reflection, field, generator); int size = reflection->FieldSize(message, field); generator->PrintLiteral(": ["); for (int i = 0; i < size; i++) { if (i > 0) generator->PrintLiteral(", "); PrintFieldValue(message, reflection, field, i, generator); } if (single_line_mode_) { generator->PrintLiteral("] "); } else { generator->PrintLiteral("]\n"); } } void TextFormat::Printer::PrintFieldName(const Message& message, const Reflection* reflection, const FieldDescriptor* field, TextGenerator* generator) const { // if use_field_number_ is true, prints field number instead // of field name. if (use_field_number_) { generator->PrintString(SimpleItoa(field->number())); return; } const FastFieldValuePrinter* printer = FindWithDefault( custom_printers_, field, default_field_value_printer_.get()); printer->PrintFieldName(message, reflection, field, generator); } void TextFormat::Printer::PrintFieldValue(const Message& message, const Reflection* reflection, const FieldDescriptor* field, int index, TextGenerator* generator) const { GOOGLE_DCHECK(field->is_repeated() || (index == -1)) << "Index must be -1 for non-repeated fields"; const FastFieldValuePrinter* printer = FindWithDefault( custom_printers_, field, default_field_value_printer_.get()); switch (field->cpp_type()) { #define OUTPUT_FIELD(CPPTYPE, METHOD) \ case FieldDescriptor::CPPTYPE_##CPPTYPE: \ printer->Print##METHOD( \ field->is_repeated() \ ? reflection->GetRepeated##METHOD(message, field, index) \ : reflection->Get##METHOD(message, field), \ generator); \ break OUTPUT_FIELD( INT32, Int32); OUTPUT_FIELD( INT64, Int64); OUTPUT_FIELD(UINT32, UInt32); OUTPUT_FIELD(UINT64, UInt64); OUTPUT_FIELD( FLOAT, Float); OUTPUT_FIELD(DOUBLE, Double); OUTPUT_FIELD( BOOL, Bool); #undef OUTPUT_FIELD case FieldDescriptor::CPPTYPE_STRING: { string scratch; const string& value = field->is_repeated() ? reflection->GetRepeatedStringReference( message, field, index, &scratch) : reflection->GetStringReference(message, field, &scratch); const string* value_to_print = &value; string truncated_value; if (truncate_string_field_longer_than_ > 0 && truncate_string_field_longer_than_ < value.size()) { truncated_value = value.substr(0, truncate_string_field_longer_than_) + "......"; value_to_print = &truncated_value; } if (field->type() == FieldDescriptor::TYPE_STRING) { printer->PrintString(*value_to_print, generator); } else { GOOGLE_DCHECK_EQ(field->type(), FieldDescriptor::TYPE_BYTES); printer->PrintBytes(*value_to_print, generator); } break; } case FieldDescriptor::CPPTYPE_ENUM: { int enum_value = field->is_repeated() ? reflection->GetRepeatedEnumValue(message, field, index) : reflection->GetEnumValue(message, field); const EnumValueDescriptor* enum_desc = field->enum_type()->FindValueByNumber(enum_value); if (enum_desc != NULL) { printer->PrintEnum(enum_value, enum_desc->name(), generator); } else { // Ordinarily, enum_desc should not be null, because proto2 has the // invariant that set enum field values must be in-range, but with the // new integer-based API for enums (or the RepeatedField loophole), // 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, StringPrintf("%d", enum_value), generator); } break; } case FieldDescriptor::CPPTYPE_MESSAGE: Print(field->is_repeated() ? reflection->GetRepeatedMessage(message, field, index) : reflection->GetMessage(message, field), generator); break; } } /* static */ bool TextFormat::Print(const Message& message, io::ZeroCopyOutputStream* output) { return Printer().Print(message, output); } /* static */ bool TextFormat::PrintUnknownFields( const UnknownFieldSet& unknown_fields, io::ZeroCopyOutputStream* output) { return Printer().PrintUnknownFields(unknown_fields, output); } /* static */ bool TextFormat::PrintToString( const Message& message, string* output) { return Printer().PrintToString(message, output); } /* static */ bool TextFormat::PrintUnknownFieldsToString( const UnknownFieldSet& unknown_fields, string* output) { return Printer().PrintUnknownFieldsToString(unknown_fields, output); } /* static */ void TextFormat::PrintFieldValueToString( const Message& message, const FieldDescriptor* field, int index, string* output) { return Printer().PrintFieldValueToString(message, field, index, output); } /* static */ bool TextFormat::ParseFieldValueFromString( const string& input, const FieldDescriptor* field, Message* message) { return Parser().ParseFieldValueFromString(input, field, message); } // Prints an integer as hex with a fixed number of digits dependent on the // integer type. template static string PaddedHex(IntType value) { string result; result.reserve(sizeof(value) * 2); for (int i = sizeof(value) * 2 - 1; i >= 0; i--) { result.push_back(int_to_hex_digit(value >> (i*4) & 0x0F)); } return result; } void TextFormat::Printer::PrintUnknownFields( const UnknownFieldSet& unknown_fields, TextGenerator* generator) const { for (int i = 0; i < unknown_fields.field_count(); i++) { const UnknownField& field = unknown_fields.field(i); string field_number = SimpleItoa(field.number()); switch (field.type()) { case UnknownField::TYPE_VARINT: generator->PrintString(field_number); generator->PrintLiteral(": "); generator->PrintString(SimpleItoa(field.varint())); if (single_line_mode_) { generator->PrintLiteral(" "); } else { generator->PrintLiteral("\n"); } break; case UnknownField::TYPE_FIXED32: { generator->PrintString(field_number); generator->PrintLiteral(": 0x"); generator->PrintString( StrCat(strings::Hex(field.fixed32(), strings::ZERO_PAD_8))); if (single_line_mode_) { generator->PrintLiteral(" "); } else { generator->PrintLiteral("\n"); } break; } case UnknownField::TYPE_FIXED64: { generator->PrintString(field_number); generator->PrintLiteral(": 0x"); generator->PrintString( StrCat(strings::Hex(field.fixed64(), strings::ZERO_PAD_16))); if (single_line_mode_) { generator->PrintLiteral(" "); } else { generator->PrintLiteral("\n"); } break; } case UnknownField::TYPE_LENGTH_DELIMITED: { generator->PrintString(field_number); const string& value = field.length_delimited(); UnknownFieldSet embedded_unknown_fields; if (!value.empty() && embedded_unknown_fields.ParseFromString(value)) { // This field is parseable as a Message. // So it is probably an embedded message. if (single_line_mode_) { generator->PrintLiteral(" { "); } else { generator->PrintLiteral(" {\n"); generator->Indent(); } PrintUnknownFields(embedded_unknown_fields, generator); if (single_line_mode_) { generator->PrintLiteral("} "); } else { generator->Outdent(); generator->PrintLiteral("}\n"); } } else { // This field is not parseable as a Message. // So it is probably just a plain string. generator->PrintLiteral(": \""); generator->PrintString(CEscape(value)); if (single_line_mode_) { generator->PrintLiteral("\" "); } else { generator->PrintLiteral("\"\n"); } } break; } case UnknownField::TYPE_GROUP: generator->PrintString(field_number); if (single_line_mode_) { generator->PrintLiteral(" { "); } else { generator->PrintLiteral(" {\n"); generator->Indent(); } PrintUnknownFields(field.group(), generator); if (single_line_mode_) { generator->PrintLiteral("} "); } else { generator->Outdent(); generator->PrintLiteral("}\n"); } break; } } } } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/text_format.h000066400000000000000000000567631334102242000300170ustar00rootroot00000000000000// 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: jschorr@google.com (Joseph Schorr) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. // // Utilities for printing and parsing protocol messages in a human-readable, // text-based format. #ifndef GOOGLE_PROTOBUF_TEXT_FORMAT_H__ #define GOOGLE_PROTOBUF_TEXT_FORMAT_H__ #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include namespace google { namespace protobuf { namespace io { class ErrorCollector; // tokenizer.h } // This class implements protocol buffer text format. Printing and parsing // protocol messages in text format is useful for debugging and human editing // of messages. // // This class is really a namespace that contains only static methods. class LIBPROTOBUF_EXPORT TextFormat { public: // 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); // Print the fields in an UnknownFieldSet. They are printed by tag number // only. Embedded messages are heuristically identified by attempting to // parse them. Returns false if printing fails. static bool PrintUnknownFields(const UnknownFieldSet& unknown_fields, io::ZeroCopyOutputStream* output); // Like Print(), but outputs directly to a string. // Note: output will be cleared prior to printing, and will be left empty // even if printing fails. Returns false if printing fails. static bool PrintToString(const Message& message, string* output); // Like PrintUnknownFields(), but outputs directly to a string. Returns false // if printing fails. static bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields, string* output); // Outputs a textual representation of the value of the field supplied on // the message supplied. For non-repeated fields, an index of -1 must // be supplied. Note that this method will print the default value for a // field if it is not set. static void PrintFieldValueToString(const Message& message, const FieldDescriptor* field, int index, string* output); class LIBPROTOBUF_EXPORT BaseTextGenerator { public: virtual ~BaseTextGenerator(); // Print text to the output stream. virtual void Print(const char* text, size_t size) = 0; void PrintString(const string& str) { Print(str.data(), str.size()); } template void PrintLiteral(const char (&text)[n]) { Print(text, n - 1); // n includes the terminating zero character. } }; // The default printer that converts scalar values from fields into their // string representation. // You can derive from this FastFieldValuePrinter if you want to have fields // to be printed in a different way and register it at the Printer. class LIBPROTOBUF_EXPORT FastFieldValuePrinter { public: FastFieldValuePrinter(); virtual ~FastFieldValuePrinter(); virtual void PrintBool(bool val, BaseTextGenerator* generator) const; virtual void PrintInt32(int32 val, BaseTextGenerator* generator) const; virtual void PrintUInt32(uint32 val, BaseTextGenerator* generator) const; virtual void PrintInt64(int64 val, BaseTextGenerator* generator) const; virtual void PrintUInt64(uint64 val, BaseTextGenerator* generator) const; virtual void PrintFloat(float val, BaseTextGenerator* generator) const; virtual void PrintDouble(double val, BaseTextGenerator* generator) const; virtual void PrintString(const string& val, BaseTextGenerator* generator) const; virtual void PrintBytes(const string& val, BaseTextGenerator* generator) const; virtual void PrintEnum(int32 val, const string& name, BaseTextGenerator* generator) const; virtual void PrintFieldName(const Message& message, const Reflection* reflection, const FieldDescriptor* field, BaseTextGenerator* generator) const; virtual void PrintMessageStart(const Message& message, int field_index, int field_count, bool single_line_mode, BaseTextGenerator* generator) const; 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); }; class LIBPROTOBUF_EXPORT PROTOBUF_RUNTIME_DEPRECATED("Please use FastFieldValuePrinter") FieldValuePrinter { public: FieldValuePrinter(); virtual ~FieldValuePrinter(); virtual string PrintBool(bool val) const; virtual string PrintInt32(int32 val) const; virtual string PrintUInt32(uint32 val) const; virtual string PrintInt64(int64 val) const; virtual string PrintUInt64(uint64 val) const; virtual string PrintFloat(float val) const; virtual string PrintDouble(double val) const; virtual string PrintString(const string& val) const; virtual string PrintBytes(const string& val) const; virtual string PrintEnum(int32 val, const string& name) const; virtual string PrintFieldName(const Message& message, const Reflection* reflection, const FieldDescriptor* field) const; virtual string PrintMessageStart(const Message& message, int field_index, int field_count, bool single_line_mode) const; virtual string PrintMessageEnd(const Message& message, int field_index, int field_count, bool single_line_mode) const; private: FastFieldValuePrinter delegate_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldValuePrinter); }; // Class for those users which require more fine-grained control over how // a protobuffer message is printed out. class LIBPROTOBUF_EXPORT Printer { public: Printer(); ~Printer(); // Like TextFormat::Print bool Print(const Message& message, io::ZeroCopyOutputStream* output) const; // Like TextFormat::PrintUnknownFields bool PrintUnknownFields(const UnknownFieldSet& unknown_fields, io::ZeroCopyOutputStream* output) const; // Like TextFormat::PrintToString bool PrintToString(const Message& message, string* output) const; // Like TextFormat::PrintUnknownFieldsToString bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields, string* output) const; // Like TextFormat::PrintFieldValueToString void PrintFieldValueToString(const Message& message, const FieldDescriptor* field, int index, string* output) const; // Adjust the initial indent level of all output. Each indent level is // equal to two spaces. void SetInitialIndentLevel(int indent_level) { initial_indent_level_ = indent_level; } // If printing in single line mode, then the entire message will be output // on a single line with no line breaks. void SetSingleLineMode(bool single_line_mode) { single_line_mode_ = single_line_mode; } bool IsInSingleLineMode() const { return single_line_mode_; } // If use_field_number is true, uses field number instead of field name. void SetUseFieldNumber(bool use_field_number) { use_field_number_ = use_field_number; } // Set true to print repeated primitives in a format like: // field_name: [1, 2, 3, 4] // instead of printing each value on its own line. Short format applies // only to primitive values -- i.e. everything except strings and // sub-messages/groups. void SetUseShortRepeatedPrimitives(bool use_short_repeated_primitives) { use_short_repeated_primitives_ = use_short_repeated_primitives; } // Set true to output UTF-8 instead of ASCII. The only difference // is that bytes >= 0x80 in string fields will not be escaped, // because they are assumed to be part of UTF-8 multi-byte // sequences. This will change the default FastFieldValuePrinter. void SetUseUtf8StringEscaping(bool as_utf8); // Set the default (Fast)FieldValuePrinter that is used for all fields that // don't have a field-specific printer registered. // Takes ownership of the printer. void SetDefaultFieldValuePrinter(const FastFieldValuePrinter* printer); void SetDefaultFieldValuePrinter(const FieldValuePrinter* printer); // Sets whether we want to hide unknown fields or not. // Usually unknown fields are printed in a generic way that includes the // tag number of the field instead of field name. However, sometimes it // is useful to be able to print the message without unknown fields (e.g. // for the python protobuf version to maintain consistency between its pure // python and c++ implementations). void SetHideUnknownFields(bool hide) { hide_unknown_fields_ = hide; } // If print_message_fields_in_index_order is true, print fields of a proto // message using the order defined in source code instead of the field // number. By default, use the field number order. void SetPrintMessageFieldsInIndexOrder( bool print_message_fields_in_index_order) { print_message_fields_in_index_order_ = print_message_fields_in_index_order; } // If expand==true, expand google.protobuf.Any payloads. The output // will be of form // [type_url] { } // // If expand==false, print Any using the default printer. The output will // look like // type_url: "" value: "serialized_content" void SetExpandAny(bool expand) { expand_any_ = expand; } // If non-zero, we truncate all string fields that are longer than this // threshold. This is useful when the proto message has very long strings, // e.g., dump of encoded image file. // // NOTE(hfgong): Setting a non-zero value breaks round-trip safe // property of TextFormat::Printer. That is, from the printed message, we // cannot fully recover the original string field any more. void SetTruncateStringFieldLongerThan( const int64 truncate_string_field_longer_than) { truncate_string_field_longer_than_ = truncate_string_field_longer_than; } // Register a custom field-specific (Fast)FieldValuePrinter for fields // with a particular FieldDescriptor. // Returns "true" if the registration succeeded, or "false", if there is // already a printer for that FieldDescriptor. // Takes ownership of the printer on successful registration. bool RegisterFieldValuePrinter(const FieldDescriptor* field, const FieldValuePrinter* printer); bool RegisterFieldValuePrinter(const FieldDescriptor* field, const FastFieldValuePrinter* printer); private: // Forward declaration of an internal class used to print the text // output to the OutputStream (see text_format.cc for implementation). class TextGenerator; // Internal Print method, used for writing to the OutputStream via // the TextGenerator class. void Print(const Message& message, TextGenerator* generator) const; // Print a single field. void PrintField(const Message& message, const Reflection* reflection, const FieldDescriptor* field, TextGenerator* generator) const; // Print a repeated primitive field in short form. void PrintShortRepeatedField(const Message& message, const Reflection* reflection, const FieldDescriptor* field, TextGenerator* generator) const; // Print the name of a field -- i.e. everything that comes before the // ':' for a single name/value pair. void PrintFieldName(const Message& message, const Reflection* reflection, const FieldDescriptor* field, TextGenerator* generator) const; // Outputs a textual representation of the value of the field supplied on // the message supplied or the default value if not set. void PrintFieldValue(const Message& message, const Reflection* reflection, const FieldDescriptor* field, int index, TextGenerator* generator) const; // Print the fields in an UnknownFieldSet. They are printed by tag number // only. Embedded messages are heuristically identified by attempting to // parse them. void PrintUnknownFields(const UnknownFieldSet& unknown_fields, TextGenerator* generator) const; bool PrintAny(const Message& message, TextGenerator* generator) const; int initial_indent_level_; bool single_line_mode_; bool use_field_number_; bool use_short_repeated_primitives_; bool hide_unknown_fields_; bool print_message_fields_in_index_order_; bool expand_any_; int64 truncate_string_field_longer_than_; google::protobuf::scoped_ptr default_field_value_printer_; typedef std::map CustomPrinterMap; CustomPrinterMap custom_printers_; }; // Parses a text-format protocol message from the given input stream to // the given message object. This function parses the human-readable format // written by Print(). Returns true on success. The message is cleared first, // even if the function fails -- See Merge() to avoid this behavior. // // Example input: "user {\n id: 123 extra { gender: MALE language: 'en' }\n}" // // One use for this function is parsing handwritten strings in test code. // Another use is to parse the output from google::protobuf::Message::DebugString() // (or ShortDebugString()), because these functions output using // google::protobuf::TextFormat::Print(). // // If you would like to read a protocol buffer serialized in the // (non-human-readable) binary wire format, see // google::protobuf::MessageLite::ParseFromString(). static bool Parse(io::ZeroCopyInputStream* input, Message* output); // Like Parse(), but reads directly from a string. static bool ParseFromString(const string& 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(const string& 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, // the new value will be added to the end static bool ParseFieldValueFromString(const string& input, const FieldDescriptor* field, Message* message); // Interface that TextFormat::Parser can use to find extensions. // This class may be extended in the future to find more information // like fields, etc. class LIBPROTOBUF_EXPORT Finder { public: virtual ~Finder(); // Try to find an extension of *message by fully-qualified field // name. Returns NULL if no extension is known for this name or number. virtual const FieldDescriptor* FindExtension( Message* message, const string& name) const = 0; }; // A location in the parsed text. struct ParseLocation { int line; int column; ParseLocation() : line(-1), column(-1) {} ParseLocation(int line_param, int column_param) : line(line_param), column(column_param) {} }; // Data structure which is populated with the locations of each field // value parsed from the text. class LIBPROTOBUF_EXPORT ParseInfoTree { public: ParseInfoTree(); ~ParseInfoTree(); // Returns the parse location for index-th value of the field in the parsed // text. If none exists, returns a location with line = -1. Index should be // -1 for not-repeated fields. ParseLocation GetLocation(const FieldDescriptor* field, int index) const; // Returns the parse info tree for the given field, which must be a message // type. The nested information tree is owned by the root tree and will be // deleted when it is deleted. ParseInfoTree* GetTreeForNested(const FieldDescriptor* field, int index) const; private: // Allow the text format parser to record information into the tree. friend class TextFormat; // Records the starting location of a single value for a field. void RecordLocation(const FieldDescriptor* field, ParseLocation location); // Create and records a nested tree for a nested message field. ParseInfoTree* CreateNested(const FieldDescriptor* field); // Defines the map from the index-th field descriptor to its parse location. typedef std::map > LocationMap; // Defines the map from the index-th field descriptor to the nested parse // info tree. typedef std::map > NestedMap; LocationMap locations_; NestedMap nested_; GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParseInfoTree); }; // For more control over parsing, use this class. class LIBPROTOBUF_EXPORT Parser { public: Parser(); ~Parser(); // Like TextFormat::Parse(). bool Parse(io::ZeroCopyInputStream* input, Message* output); // Like TextFormat::ParseFromString(). bool ParseFromString(const string& input, Message* output); // Like TextFormat::Merge(). bool Merge(io::ZeroCopyInputStream* input, Message* output); // Like TextFormat::MergeFromString(). bool MergeFromString(const string& input, Message* output); // Set where to report parse errors. If NULL (the default), errors will // be printed to stderr. void RecordErrorsTo(io::ErrorCollector* error_collector) { error_collector_ = error_collector; } // Set how parser finds extensions. If NULL (the default), the // parser will use the standard Reflection object associated with // the message being parsed. void SetFinder(Finder* finder) { finder_ = finder; } // Sets where location information about the parse will be written. If NULL // (the default), then no location will be written. void WriteLocationsTo(ParseInfoTree* tree) { parse_info_tree_ = tree; } // Normally parsing fails if, after parsing, output->IsInitialized() // returns false. Call AllowPartialMessage(true) to skip this check. void AllowPartialMessage(bool allow) { allow_partial_ = allow; } // Allow field names to be matched case-insensitively. // This is not advisable if there are fields that only differ in case, or // if you want to enforce writing in the canonical form. // This is 'false' by default. void AllowCaseInsensitiveField(bool allow) { allow_case_insensitive_field_ = allow; } // Like TextFormat::ParseFieldValueFromString bool ParseFieldValueFromString(const string& input, const FieldDescriptor* field, Message* output); void AllowFieldNumber(bool allow) { allow_field_number_ = allow; } private: // Forward declaration of an internal class used to parse text // representations (see text_format.cc for implementation). class ParserImpl; // Like TextFormat::Merge(). The provided implementation is used // to do the parsing. bool MergeUsingImpl(io::ZeroCopyInputStream* input, Message* output, ParserImpl* parser_impl); io::ErrorCollector* error_collector_; Finder* finder_; ParseInfoTree* parse_info_tree_; bool allow_partial_; bool allow_case_insensitive_field_; bool allow_unknown_field_; bool allow_unknown_enum_; bool allow_field_number_; bool allow_relaxed_whitespace_; bool allow_singular_overwrites_; }; private: // Hack: ParseInfoTree declares TextFormat as a friend which should extend // the friendship to TextFormat::Parser::ParserImpl, but unfortunately some // old compilers (e.g. GCC 3.4.6) don't implement this correctly. We provide // helpers for ParserImpl to call methods of ParseInfoTree. static inline void RecordLocation(ParseInfoTree* info_tree, const FieldDescriptor* field, ParseLocation location); static inline ParseInfoTree* CreateNested(ParseInfoTree* info_tree, const FieldDescriptor* field); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat); }; inline void TextFormat::RecordLocation(ParseInfoTree* info_tree, const FieldDescriptor* field, ParseLocation location) { info_tree->RecordLocation(field, location); } inline TextFormat::ParseInfoTree* TextFormat::CreateNested( ParseInfoTree* info_tree, const FieldDescriptor* field) { return info_tree->CreateNested(field); } } // namespace protobuf } // namespace google #endif // GOOGLE_PROTOBUF_TEXT_FORMAT_H__ python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/text_format_unittest.cc000066400000000000000000001625101334102242000321000ustar00rootroot00000000000000// 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: jschorr@google.com (Joseph Schorr) // Based on original Protocol Buffers design by // Sanjay Ghemawat, Jeff Dean, and others. #include #include #include #include #include #ifndef _SHARED_PTR_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace google { namespace protobuf { // Can't use an anonymous namespace here due to brokenness of Tru64 compiler. namespace text_format_unittest { // A basic string with different escapable characters for testing. const string kEscapeTestString = "\"A string with ' characters \n and \r newlines and \t tabs and \001 " "slashes \\ and multiple spaces"; // A representation of the above string with all the characters escaped. const string kEscapeTestStringEscaped = "\"\\\"A string with \\' characters \\n and \\r newlines " "and \\t tabs and \\001 slashes \\\\ and multiple spaces\""; class TextFormatTest : public testing::Test { public: static void SetUpTestCase() { GOOGLE_CHECK_OK(File::GetContents( TestSourceDir() + "/google/protobuf/" "testdata/text_format_unittest_data_oneof_implemented.txt", &static_proto_debug_string_, true)); } TextFormatTest() : proto_debug_string_(static_proto_debug_string_) {} protected: // Debug string read from text_format_unittest_data.txt. const string proto_debug_string_; unittest::TestAllTypes proto_; private: static string static_proto_debug_string_; }; string TextFormatTest::static_proto_debug_string_; class TextFormatExtensionsTest : public testing::Test { public: static void SetUpTestCase() { GOOGLE_CHECK_OK(File::GetContents(TestSourceDir() + "/google/protobuf/testdata/" "text_format_unittest_extensions_data.txt", &static_proto_debug_string_, true)); } TextFormatExtensionsTest() : proto_debug_string_(static_proto_debug_string_) {} protected: // Debug string read from text_format_unittest_data.txt. const string proto_debug_string_; unittest::TestAllExtensions proto_; private: static string static_proto_debug_string_; }; string TextFormatExtensionsTest::static_proto_debug_string_; TEST_F(TextFormatTest, Basic) { TestUtil::SetAllFields(&proto_); EXPECT_EQ(proto_debug_string_, proto_.DebugString()); } TEST_F(TextFormatExtensionsTest, Extensions) { TestUtil::SetAllExtensions(&proto_); EXPECT_EQ(proto_debug_string_, proto_.DebugString()); } TEST_F(TextFormatTest, ShortDebugString) { proto_.set_optional_int32(1); proto_.set_optional_string("hello"); proto_.mutable_optional_nested_message()->set_bb(2); proto_.mutable_optional_foreign_message(); EXPECT_EQ("optional_int32: 1 optional_string: \"hello\" " "optional_nested_message { bb: 2 } " "optional_foreign_message { }", proto_.ShortDebugString()); } TEST_F(TextFormatTest, ShortPrimitiveRepeateds) { proto_.set_optional_int32(123); proto_.add_repeated_int32(456); proto_.add_repeated_int32(789); proto_.add_repeated_string("foo"); proto_.add_repeated_string("bar"); proto_.add_repeated_nested_message()->set_bb(2); proto_.add_repeated_nested_message()->set_bb(3); proto_.add_repeated_nested_enum(unittest::TestAllTypes::FOO); proto_.add_repeated_nested_enum(unittest::TestAllTypes::BAR); TextFormat::Printer printer; printer.SetUseShortRepeatedPrimitives(true); string text; EXPECT_TRUE(printer.PrintToString(proto_, &text)); EXPECT_EQ("optional_int32: 123\n" "repeated_int32: [456, 789]\n" "repeated_string: \"foo\"\n" "repeated_string: \"bar\"\n" "repeated_nested_message {\n bb: 2\n}\n" "repeated_nested_message {\n bb: 3\n}\n" "repeated_nested_enum: [FOO, BAR]\n", text); // Verify that any existing data in the string is cleared when // PrintToString() is called. text = "just some data here...\n\nblah blah"; EXPECT_TRUE(printer.PrintToString(proto_, &text)); EXPECT_EQ("optional_int32: 123\n" "repeated_int32: [456, 789]\n" "repeated_string: \"foo\"\n" "repeated_string: \"bar\"\n" "repeated_nested_message {\n bb: 2\n}\n" "repeated_nested_message {\n bb: 3\n}\n" "repeated_nested_enum: [FOO, BAR]\n", text); // Try in single-line mode. printer.SetSingleLineMode(true); EXPECT_TRUE(printer.PrintToString(proto_, &text)); EXPECT_EQ("optional_int32: 123 " "repeated_int32: [456, 789] " "repeated_string: \"foo\" " "repeated_string: \"bar\" " "repeated_nested_message { bb: 2 } " "repeated_nested_message { bb: 3 } " "repeated_nested_enum: [FOO, BAR] ", text); } TEST_F(TextFormatTest, StringEscape) { // Set the string value to test. proto_.set_optional_string(kEscapeTestString); // Get the DebugString from the proto. string debug_string = proto_.DebugString(); string utf8_debug_string = proto_.Utf8DebugString(); // Hardcode a correct value to test against. string correct_string = "optional_string: " + kEscapeTestStringEscaped + "\n"; // Compare. EXPECT_EQ(correct_string, debug_string); // UTF-8 string is the same as non-UTF-8 because // the protocol buffer contains no UTF-8 text. EXPECT_EQ(correct_string, utf8_debug_string); string expected_short_debug_string = "optional_string: " + kEscapeTestStringEscaped; EXPECT_EQ(expected_short_debug_string, proto_.ShortDebugString()); } TEST_F(TextFormatTest, Utf8DebugString) { // Set the string value to test. proto_.set_optional_string("\350\260\267\346\255\214"); proto_.set_optional_bytes("\350\260\267\346\255\214"); // Get the DebugString from the proto. string debug_string = proto_.DebugString(); string utf8_debug_string = proto_.Utf8DebugString(); // Hardcode a correct value to test against. string correct_utf8_string = "optional_string: " "\"\350\260\267\346\255\214\"" "\n" "optional_bytes: " "\"\\350\\260\\267\\346\\255\\214\"" "\n"; string correct_string = "optional_string: " "\"\\350\\260\\267\\346\\255\\214\"" "\n" "optional_bytes: " "\"\\350\\260\\267\\346\\255\\214\"" "\n"; // Compare. EXPECT_EQ(correct_utf8_string, utf8_debug_string); EXPECT_EQ(correct_string, debug_string); } TEST_F(TextFormatTest, PrintUnknownFields) { // Test printing of unknown fields in a message. unittest::TestEmptyMessage message; UnknownFieldSet* unknown_fields = message.mutable_unknown_fields(); unknown_fields->AddVarint(5, 1); unknown_fields->AddFixed32(5, 2); unknown_fields->AddFixed64(5, 3); unknown_fields->AddLengthDelimited(5, "4"); unknown_fields->AddGroup(5)->AddVarint(10, 5); unknown_fields->AddVarint(8, 1); unknown_fields->AddVarint(8, 2); unknown_fields->AddVarint(8, 3); EXPECT_EQ( "5: 1\n" "5: 0x00000002\n" "5: 0x0000000000000003\n" "5: \"4\"\n" "5 {\n" " 10: 5\n" "}\n" "8: 1\n" "8: 2\n" "8: 3\n", message.DebugString()); } TEST_F(TextFormatTest, PrintUnknownFieldsHidden) { // Test printing of unknown fields in a message when suppressed. unittest::OneString message; message.set_data("data"); UnknownFieldSet* unknown_fields = message.mutable_unknown_fields(); unknown_fields->AddVarint(5, 1); unknown_fields->AddFixed32(5, 2); unknown_fields->AddFixed64(5, 3); unknown_fields->AddLengthDelimited(5, "4"); unknown_fields->AddGroup(5)->AddVarint(10, 5); unknown_fields->AddVarint(8, 1); unknown_fields->AddVarint(8, 2); unknown_fields->AddVarint(8, 3); TextFormat::Printer printer; printer.SetHideUnknownFields(true); string output; printer.PrintToString(message, &output); EXPECT_EQ("data: \"data\"\n", output); } TEST_F(TextFormatTest, PrintUnknownMessage) { // Test heuristic printing of messages in an UnknownFieldSet. protobuf_unittest::TestAllTypes message; // Cases which should not be interpreted as sub-messages. // 'a' is a valid FIXED64 tag, so for the string to be parseable as a message // it should be followed by 8 bytes. Since this string only has two // subsequent bytes, it should be treated as a string. message.add_repeated_string("abc"); // 'd' happens to be a valid ENDGROUP tag. So, // UnknownFieldSet::MergeFromCodedStream() will successfully parse "def", but // the ConsumedEntireMessage() check should fail. message.add_repeated_string("def"); // A zero-length string should never be interpreted as a message even though // it is technically valid as one. message.add_repeated_string(""); // Case which should be interpreted as a sub-message. // An actual nested message with content should always be interpreted as a // nested message. message.add_repeated_nested_message()->set_bb(123); string data; message.SerializeToString(&data); string text; UnknownFieldSet unknown_fields; EXPECT_TRUE(unknown_fields.ParseFromString(data)); EXPECT_TRUE(TextFormat::PrintUnknownFieldsToString(unknown_fields, &text)); EXPECT_EQ( "44: \"abc\"\n" "44: \"def\"\n" "44: \"\"\n" "48 {\n" " 1: 123\n" "}\n", text); } TEST_F(TextFormatTest, PrintMessageWithIndent) { // Test adding an initial indent to printing. protobuf_unittest::TestAllTypes message; message.add_repeated_string("abc"); message.add_repeated_string("def"); message.add_repeated_nested_message()->set_bb(123); string text; TextFormat::Printer printer; printer.SetInitialIndentLevel(1); EXPECT_TRUE(printer.PrintToString(message, &text)); EXPECT_EQ( " repeated_string: \"abc\"\n" " repeated_string: \"def\"\n" " repeated_nested_message {\n" " bb: 123\n" " }\n", text); } TEST_F(TextFormatTest, PrintMessageSingleLine) { // Test printing a message on a single line. protobuf_unittest::TestAllTypes message; message.add_repeated_string("abc"); message.add_repeated_string("def"); message.add_repeated_nested_message()->set_bb(123); string text; TextFormat::Printer printer; printer.SetInitialIndentLevel(1); printer.SetSingleLineMode(true); EXPECT_TRUE(printer.PrintToString(message, &text)); EXPECT_EQ( " repeated_string: \"abc\" repeated_string: \"def\" " "repeated_nested_message { bb: 123 } ", text); } TEST_F(TextFormatTest, PrintBufferTooSmall) { // Test printing a message to a buffer that is too small. protobuf_unittest::TestAllTypes message; message.add_repeated_string("abc"); message.add_repeated_string("def"); char buffer[1] = ""; io::ArrayOutputStream output_stream(buffer, 1); EXPECT_FALSE(TextFormat::Print(message, &output_stream)); EXPECT_EQ(buffer[0], 'r'); EXPECT_EQ(output_stream.ByteCount(), 1); } // A printer that appends 'u' to all unsigned int32. class CustomUInt32FieldValuePrinter : public TextFormat::FieldValuePrinter { public: virtual string PrintUInt32(uint32 val) const { return StrCat(FieldValuePrinter::PrintUInt32(val), "u"); } }; TEST_F(TextFormatTest, DefaultCustomFieldPrinter) { protobuf_unittest::TestAllTypes message; message.set_optional_uint32(42); message.add_repeated_uint32(1); message.add_repeated_uint32(2); message.add_repeated_uint32(3); TextFormat::Printer printer; printer.SetDefaultFieldValuePrinter(new CustomUInt32FieldValuePrinter()); // Let's see if that works well together with the repeated primitives: printer.SetUseShortRepeatedPrimitives(true); string text; printer.PrintToString(message, &text); EXPECT_EQ("optional_uint32: 42u\nrepeated_uint32: [1u, 2u, 3u]\n", text); } class CustomInt32FieldValuePrinter : public TextFormat::FieldValuePrinter { public: virtual string PrintInt32(int32 val) const { return StrCat("value-is(", FieldValuePrinter::PrintInt32(val), ")"); } }; TEST_F(TextFormatTest, FieldSpecificCustomPrinter) { protobuf_unittest::TestAllTypes message; message.set_optional_int32(42); // This will be handled by our Printer. message.add_repeated_int32(42); // This will be printed as number. TextFormat::Printer printer; EXPECT_TRUE(printer.RegisterFieldValuePrinter( message.GetDescriptor()->FindFieldByName("optional_int32"), new CustomInt32FieldValuePrinter())); string text; printer.PrintToString(message, &text); EXPECT_EQ("optional_int32: value-is(42)\nrepeated_int32: 42\n", text); } TEST_F(TextFormatTest, FieldSpecificCustomPrinterRegisterSameFieldTwice) { protobuf_unittest::TestAllTypes message; TextFormat::Printer printer; const FieldDescriptor* const field = message.GetDescriptor()->FindFieldByName("optional_int32"); ASSERT_TRUE(printer.RegisterFieldValuePrinter( field, new CustomInt32FieldValuePrinter())); const TextFormat::FieldValuePrinter* const rejected = new CustomInt32FieldValuePrinter(); ASSERT_FALSE(printer.RegisterFieldValuePrinter(field, rejected)); delete rejected; } TEST_F(TextFormatTest, ErrorCasesRegisteringFieldValuePrinterShouldFail) { protobuf_unittest::TestAllTypes message; TextFormat::Printer printer; // NULL printer. EXPECT_FALSE(printer.RegisterFieldValuePrinter( message.GetDescriptor()->FindFieldByName("optional_int32"), static_cast(NULL))); EXPECT_FALSE(printer.RegisterFieldValuePrinter( message.GetDescriptor()->FindFieldByName("optional_int32"), static_cast(NULL))); // Because registration fails, the ownership of this printer is never taken. TextFormat::FieldValuePrinter my_field_printer; // NULL field EXPECT_FALSE(printer.RegisterFieldValuePrinter(NULL, &my_field_printer)); } class CustomMessageFieldValuePrinter : public TextFormat::FieldValuePrinter { public: virtual string PrintInt32(int32 v) const { return StrCat(FieldValuePrinter::PrintInt32(v), " # x", strings::Hex(v)); } virtual string PrintMessageStart(const Message& message, int field_index, int field_count, bool single_line_mode) const { if (single_line_mode) { return " { "; } return StrCat( " { # ", message.GetDescriptor()->name(), ": ", field_index, "\n"); } }; TEST_F(TextFormatTest, CustomPrinterForComments) { protobuf_unittest::TestAllTypes message; message.mutable_optional_nested_message(); message.mutable_optional_import_message()->set_d(42); message.add_repeated_nested_message(); message.add_repeated_nested_message(); message.add_repeated_import_message()->set_d(43); message.add_repeated_import_message()->set_d(44); TextFormat::Printer printer; CustomMessageFieldValuePrinter my_field_printer; printer.SetDefaultFieldValuePrinter(new CustomMessageFieldValuePrinter()); string text; printer.PrintToString(message, &text); EXPECT_EQ( "optional_nested_message { # NestedMessage: -1\n" "}\n" "optional_import_message { # ImportMessage: -1\n" " d: 42 # x2a\n" "}\n" "repeated_nested_message { # NestedMessage: 0\n" "}\n" "repeated_nested_message { # NestedMessage: 1\n" "}\n" "repeated_import_message { # ImportMessage: 0\n" " d: 43 # x2b\n" "}\n" "repeated_import_message { # ImportMessage: 1\n" " d: 44 # x2c\n" "}\n", text); } class CustomMultilineCommentPrinter : public TextFormat::FieldValuePrinter { public: virtual string PrintMessageStart(const Message& message, int field_index, int field_count, bool single_line_comment) const { return StrCat(" { # 1\n", " # 2\n"); } }; TEST_F(TextFormatTest, CustomPrinterForMultilineComments) { protobuf_unittest::TestAllTypes message; message.mutable_optional_nested_message(); message.mutable_optional_import_message()->set_d(42); TextFormat::Printer printer; CustomMessageFieldValuePrinter my_field_printer; printer.SetDefaultFieldValuePrinter(new CustomMultilineCommentPrinter()); string text; printer.PrintToString(message, &text); EXPECT_EQ( "optional_nested_message { # 1\n" " # 2\n" "}\n" "optional_import_message { # 1\n" " # 2\n" " d: 42\n" "}\n", text); } TEST_F(TextFormatTest, ParseBasic) { io::ArrayInputStream input_stream(proto_debug_string_.data(), proto_debug_string_.size()); TextFormat::Parse(&input_stream, &proto_); TestUtil::ExpectAllFieldsSet(proto_); } TEST_F(TextFormatExtensionsTest, ParseExtensions) { io::ArrayInputStream input_stream(proto_debug_string_.data(), proto_debug_string_.size()); TextFormat::Parse(&input_stream, &proto_); TestUtil::ExpectAllExtensionsSet(proto_); } TEST_F(TextFormatTest, ParseEnumFieldFromNumber) { // Create a parse string with a numerical value for an enum field. string parse_string = strings::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()); } TEST_F(TextFormatTest, ParseEnumFieldFromNegativeNumber) { ASSERT_LT(unittest::SPARSE_E, 0); string parse_string = strings::Substitute("sparse_enum: $0", unittest::SPARSE_E); unittest::SparseEnumMessage proto; EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto)); EXPECT_TRUE(proto.has_sparse_enum()); EXPECT_EQ(unittest::SPARSE_E, proto.sparse_enum()); } TEST_F(TextFormatTest, ParseStringEscape) { // Create a parse string with escpaed characters in it. string parse_string = "optional_string: " + kEscapeTestStringEscaped + "\n"; io::ArrayInputStream input_stream(parse_string.data(), parse_string.size()); TextFormat::Parse(&input_stream, &proto_); // Compare. EXPECT_EQ(kEscapeTestString, proto_.optional_string()); } TEST_F(TextFormatTest, ParseConcatenatedString) { // Create a parse string with multiple parts on one line. string parse_string = "optional_string: \"foo\" \"bar\"\n"; io::ArrayInputStream input_stream1(parse_string.data(), parse_string.size()); TextFormat::Parse(&input_stream1, &proto_); // Compare. EXPECT_EQ("foobar", proto_.optional_string()); // Create a parse string with multiple parts on separate lines. parse_string = "optional_string: \"foo\"\n" "\"bar\"\n"; io::ArrayInputStream input_stream2(parse_string.data(), parse_string.size()); TextFormat::Parse(&input_stream2, &proto_); // Compare. EXPECT_EQ("foobar", proto_.optional_string()); } TEST_F(TextFormatTest, ParseFloatWithSuffix) { // Test that we can parse a floating-point value with 'f' appended to the // end. This is needed for backwards-compatibility with proto1. // Have it parse a float with the 'f' suffix. string parse_string = "optional_float: 1.0f\n"; io::ArrayInputStream input_stream(parse_string.data(), parse_string.size()); TextFormat::Parse(&input_stream, &proto_); // Compare. EXPECT_EQ(1.0, proto_.optional_float()); } TEST_F(TextFormatTest, ParseShortRepeatedForm) { string parse_string = // Mixed short-form and long-form are simply concatenated. "repeated_int32: 1\n" "repeated_int32: [456, 789]\n" "repeated_nested_enum: [ FOO ,BAR, # comment\n" " 3]\n" // Note that while the printer won't print repeated strings in short-form, // the parser will accept them. "repeated_string: [ \"foo\", 'bar' ]\n" // Repeated message "repeated_nested_message: [ { bb: 1 }, { bb : 2 }]\n" // Repeated group "RepeatedGroup [{ a: 3 },{ a: 4 }]\n"; ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto_)); ASSERT_EQ(3, proto_.repeated_int32_size()); EXPECT_EQ(1, proto_.repeated_int32(0)); EXPECT_EQ(456, proto_.repeated_int32(1)); EXPECT_EQ(789, proto_.repeated_int32(2)); ASSERT_EQ(3, proto_.repeated_nested_enum_size()); EXPECT_EQ(unittest::TestAllTypes::FOO, proto_.repeated_nested_enum(0)); EXPECT_EQ(unittest::TestAllTypes::BAR, proto_.repeated_nested_enum(1)); EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.repeated_nested_enum(2)); ASSERT_EQ(2, proto_.repeated_string_size()); EXPECT_EQ("foo", proto_.repeated_string(0)); EXPECT_EQ("bar", proto_.repeated_string(1)); ASSERT_EQ(2, proto_.repeated_nested_message_size()); EXPECT_EQ(1, proto_.repeated_nested_message(0).bb()); EXPECT_EQ(2, proto_.repeated_nested_message(1).bb()); ASSERT_EQ(2, proto_.repeatedgroup_size()); EXPECT_EQ(3, proto_.repeatedgroup(0).a()); EXPECT_EQ(4, proto_.repeatedgroup(1).a()); } TEST_F(TextFormatTest, ParseShortRepeatedWithTrailingComma) { string parse_string = "repeated_int32: [456,]\n"; ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_)); parse_string = "repeated_nested_enum: [ FOO , ]"; ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_)); parse_string = "repeated_string: [ \"foo\", ]"; ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_)); parse_string = "repeated_nested_message: [ { bb: 1 }, ]"; ASSERT_FALSE(TextFormat::ParseFromString(parse_string, &proto_)); parse_string = "RepeatedGroup [{ a: 3 },]\n"; } TEST_F(TextFormatTest, ParseShortRepeatedEmpty) { string parse_string = "repeated_int32: []\n" "repeated_nested_enum: []\n" "repeated_string: []\n" "repeated_nested_message: []\n" "RepeatedGroup []\n"; ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto_)); EXPECT_EQ(0, proto_.repeated_int32_size()); EXPECT_EQ(0, proto_.repeated_nested_enum_size()); EXPECT_EQ(0, proto_.repeated_string_size()); EXPECT_EQ(0, proto_.repeated_nested_message_size()); EXPECT_EQ(0, proto_.repeatedgroup_size()); } TEST_F(TextFormatTest, ParseShortRepeatedConcatenatedWithEmpty) { string parse_string = // Starting with empty [] should have no impact. "repeated_int32: []\n" "repeated_nested_enum: []\n" "repeated_string: []\n" "repeated_nested_message: []\n" "RepeatedGroup []\n" // Mixed short-form and long-form are simply concatenated. "repeated_int32: 1\n" "repeated_int32: [456, 789]\n" "repeated_nested_enum: [ FOO ,BAR, # comment\n" " 3]\n" // Note that while the printer won't print repeated strings in short-form, // the parser will accept them. "repeated_string: [ \"foo\", 'bar' ]\n" // Repeated message "repeated_nested_message: [ { bb: 1 }, { bb : 2 }]\n" // Repeated group "RepeatedGroup [{ a: 3 },{ a: 4 }]\n" // Adding empty [] should have no impact. "repeated_int32: []\n" "repeated_nested_enum: []\n" "repeated_string: []\n" "repeated_nested_message: []\n" "RepeatedGroup []\n"; ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto_)); ASSERT_EQ(3, proto_.repeated_int32_size()); EXPECT_EQ(1, proto_.repeated_int32(0)); EXPECT_EQ(456, proto_.repeated_int32(1)); EXPECT_EQ(789, proto_.repeated_int32(2)); ASSERT_EQ(3, proto_.repeated_nested_enum_size()); EXPECT_EQ(unittest::TestAllTypes::FOO, proto_.repeated_nested_enum(0)); EXPECT_EQ(unittest::TestAllTypes::BAR, proto_.repeated_nested_enum(1)); EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.repeated_nested_enum(2)); ASSERT_EQ(2, proto_.repeated_string_size()); EXPECT_EQ("foo", proto_.repeated_string(0)); EXPECT_EQ("bar", proto_.repeated_string(1)); ASSERT_EQ(2, proto_.repeated_nested_message_size()); EXPECT_EQ(1, proto_.repeated_nested_message(0).bb()); EXPECT_EQ(2, proto_.repeated_nested_message(1).bb()); ASSERT_EQ(2, proto_.repeatedgroup_size()); EXPECT_EQ(3, proto_.repeatedgroup(0).a()); EXPECT_EQ(4, proto_.repeatedgroup(1).a()); } TEST_F(TextFormatTest, Comments) { // Test that comments are ignored. string parse_string = "optional_int32: 1 # a comment\n" "optional_int64: 2 # another comment"; io::ArrayInputStream input_stream(parse_string.data(), parse_string.size()); TextFormat::Parse(&input_stream, &proto_); // Compare. EXPECT_EQ(1, proto_.optional_int32()); EXPECT_EQ(2, proto_.optional_int64()); } TEST_F(TextFormatTest, OptionalColon) { // Test that we can place a ':' after the field name of a nested message, // even though we don't have to. string parse_string = "optional_nested_message: { bb: 1}\n"; io::ArrayInputStream input_stream(parse_string.data(), parse_string.size()); TextFormat::Parse(&input_stream, &proto_); // Compare. EXPECT_TRUE(proto_.has_optional_nested_message()); EXPECT_EQ(1, proto_.optional_nested_message().bb()); } // Some platforms (e.g. Windows) insist on padding the exponent to three // digits when one or two would be just fine. static string RemoveRedundantZeros(string text) { text = StringReplace(text, "e+0", "e+", true); text = StringReplace(text, "e-0", "e-", true); return text; } TEST_F(TextFormatTest, PrintExotic) { unittest::TestAllTypes message; // Note: In C, a negative integer literal is actually the unary negation // operator being applied to a positive integer literal, and // 9223372036854775808 is outside the range of int64. However, it is not // outside the range of uint64. Confusingly, this means that everything // works if we make the literal unsigned, even though we are negating it. message.add_repeated_int64(-GOOGLE_ULONGLONG(9223372036854775808)); message.add_repeated_uint64(GOOGLE_ULONGLONG(18446744073709551615)); message.add_repeated_double(123.456); message.add_repeated_double(1.23e21); message.add_repeated_double(1.23e-18); message.add_repeated_double(std::numeric_limits::infinity()); message.add_repeated_double(-std::numeric_limits::infinity()); message.add_repeated_double(std::numeric_limits::quiet_NaN()); message.add_repeated_string(string("\000\001\a\b\f\n\r\t\v\\\'\"", 12)); // Fun story: We used to use 1.23e22 instead of 1.23e21 above, but this // seemed to trigger an odd case on MinGW/GCC 3.4.5 where GCC's parsing of // the value differed from strtod()'s parsing. That is to say, the // following assertion fails on MinGW: // assert(1.23e22 == strtod("1.23e22", NULL)); // As a result, SimpleDtoa() would print the value as // "1.2300000000000001e+22" to make sure strtod() produce the exact same // result. Our goal is to test runtime parsing, not compile-time parsing, // so this wasn't our problem. It was found that using 1.23e21 did not // have this problem, so we switched to that instead. EXPECT_EQ( "repeated_int64: -9223372036854775808\n" "repeated_uint64: 18446744073709551615\n" "repeated_double: 123.456\n" "repeated_double: 1.23e+21\n" "repeated_double: 1.23e-18\n" "repeated_double: inf\n" "repeated_double: -inf\n" "repeated_double: nan\n" "repeated_string: \"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\'\\\"\"\n", RemoveRedundantZeros(message.DebugString())); } TEST_F(TextFormatTest, PrintFloatPrecision) { unittest::TestAllTypes message; message.add_repeated_float(1.2); message.add_repeated_float(1.23); message.add_repeated_float(1.234); message.add_repeated_float(1.2345); message.add_repeated_float(1.23456); message.add_repeated_float(1.2e10); message.add_repeated_float(1.23e10); message.add_repeated_float(1.234e10); message.add_repeated_float(1.2345e10); message.add_repeated_float(1.23456e10); message.add_repeated_double(1.2); message.add_repeated_double(1.23); message.add_repeated_double(1.234); message.add_repeated_double(1.2345); message.add_repeated_double(1.23456); message.add_repeated_double(1.234567); message.add_repeated_double(1.2345678); message.add_repeated_double(1.23456789); message.add_repeated_double(1.234567898); message.add_repeated_double(1.2345678987); message.add_repeated_double(1.23456789876); message.add_repeated_double(1.234567898765); message.add_repeated_double(1.2345678987654); message.add_repeated_double(1.23456789876543); message.add_repeated_double(1.2e100); message.add_repeated_double(1.23e100); message.add_repeated_double(1.234e100); message.add_repeated_double(1.2345e100); message.add_repeated_double(1.23456e100); message.add_repeated_double(1.234567e100); message.add_repeated_double(1.2345678e100); message.add_repeated_double(1.23456789e100); message.add_repeated_double(1.234567898e100); message.add_repeated_double(1.2345678987e100); message.add_repeated_double(1.23456789876e100); message.add_repeated_double(1.234567898765e100); message.add_repeated_double(1.2345678987654e100); message.add_repeated_double(1.23456789876543e100); EXPECT_EQ( "repeated_float: 1.2\n" "repeated_float: 1.23\n" "repeated_float: 1.234\n" "repeated_float: 1.2345\n" "repeated_float: 1.23456\n" "repeated_float: 1.2e+10\n" "repeated_float: 1.23e+10\n" "repeated_float: 1.234e+10\n" "repeated_float: 1.2345e+10\n" "repeated_float: 1.23456e+10\n" "repeated_double: 1.2\n" "repeated_double: 1.23\n" "repeated_double: 1.234\n" "repeated_double: 1.2345\n" "repeated_double: 1.23456\n" "repeated_double: 1.234567\n" "repeated_double: 1.2345678\n" "repeated_double: 1.23456789\n" "repeated_double: 1.234567898\n" "repeated_double: 1.2345678987\n" "repeated_double: 1.23456789876\n" "repeated_double: 1.234567898765\n" "repeated_double: 1.2345678987654\n" "repeated_double: 1.23456789876543\n" "repeated_double: 1.2e+100\n" "repeated_double: 1.23e+100\n" "repeated_double: 1.234e+100\n" "repeated_double: 1.2345e+100\n" "repeated_double: 1.23456e+100\n" "repeated_double: 1.234567e+100\n" "repeated_double: 1.2345678e+100\n" "repeated_double: 1.23456789e+100\n" "repeated_double: 1.234567898e+100\n" "repeated_double: 1.2345678987e+100\n" "repeated_double: 1.23456789876e+100\n" "repeated_double: 1.234567898765e+100\n" "repeated_double: 1.2345678987654e+100\n" "repeated_double: 1.23456789876543e+100\n", RemoveRedundantZeros(message.DebugString())); } TEST_F(TextFormatTest, AllowPartial) { unittest::TestRequired message; TextFormat::Parser parser; parser.AllowPartialMessage(true); EXPECT_TRUE(parser.ParseFromString("a: 1", &message)); EXPECT_EQ(1, message.a()); EXPECT_FALSE(message.has_b()); EXPECT_FALSE(message.has_c()); } TEST_F(TextFormatTest, ParseExotic) { unittest::TestAllTypes message; ASSERT_TRUE(TextFormat::ParseFromString( "repeated_int32: -1\n" "repeated_int32: -2147483648\n" "repeated_int64: -1\n" "repeated_int64: -9223372036854775808\n" "repeated_uint32: 4294967295\n" "repeated_uint32: 2147483648\n" "repeated_uint64: 18446744073709551615\n" "repeated_uint64: 9223372036854775808\n" "repeated_double: 123.0\n" "repeated_double: 123.5\n" "repeated_double: 0.125\n" "repeated_double: 1.23E17\n" "repeated_double: 1.235E+22\n" "repeated_double: 1.235e-18\n" "repeated_double: 123.456789\n" "repeated_double: inf\n" "repeated_double: Infinity\n" "repeated_double: -inf\n" "repeated_double: -Infinity\n" "repeated_double: nan\n" "repeated_double: NaN\n" "repeated_string: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\"\n", &message)); ASSERT_EQ(2, message.repeated_int32_size()); EXPECT_EQ(-1, message.repeated_int32(0)); // Note: In C, a negative integer literal is actually the unary negation // operator being applied to a positive integer literal, and 2147483648 is // outside the range of int32. However, it is not outside the range of // uint32. Confusingly, this means that everything works if we make the // literal unsigned, even though we are negating it. EXPECT_EQ(-2147483648u, message.repeated_int32(1)); ASSERT_EQ(2, message.repeated_int64_size()); EXPECT_EQ(-1, message.repeated_int64(0)); // Note: In C, a negative integer literal is actually the unary negation // operator being applied to a positive integer literal, and // 9223372036854775808 is outside the range of int64. However, it is not // outside the range of uint64. Confusingly, this means that everything // works if we make the literal unsigned, even though we are negating it. EXPECT_EQ(-GOOGLE_ULONGLONG(9223372036854775808), message.repeated_int64(1)); ASSERT_EQ(2, message.repeated_uint32_size()); EXPECT_EQ(4294967295u, message.repeated_uint32(0)); EXPECT_EQ(2147483648u, message.repeated_uint32(1)); ASSERT_EQ(2, message.repeated_uint64_size()); EXPECT_EQ(GOOGLE_ULONGLONG(18446744073709551615), message.repeated_uint64(0)); EXPECT_EQ(GOOGLE_ULONGLONG(9223372036854775808), message.repeated_uint64(1)); ASSERT_EQ(13, message.repeated_double_size()); EXPECT_EQ(123.0 , message.repeated_double(0)); EXPECT_EQ(123.5 , message.repeated_double(1)); EXPECT_EQ(0.125 , message.repeated_double(2)); EXPECT_EQ(1.23E17 , message.repeated_double(3)); EXPECT_EQ(1.235E22 , message.repeated_double(4)); EXPECT_EQ(1.235E-18 , message.repeated_double(5)); EXPECT_EQ(123.456789, message.repeated_double(6)); EXPECT_EQ(message.repeated_double(7), std::numeric_limits::infinity()); EXPECT_EQ(message.repeated_double(8), std::numeric_limits::infinity()); EXPECT_EQ(message.repeated_double(9), -std::numeric_limits::infinity()); EXPECT_EQ(message.repeated_double(10), -std::numeric_limits::infinity()); EXPECT_TRUE(MathLimits::IsNaN(message.repeated_double(11))); EXPECT_TRUE(MathLimits::IsNaN(message.repeated_double(12))); // Note: Since these string literals have \0's in them, we must explicitly // pass their sizes to string's constructor. ASSERT_EQ(1, message.repeated_string_size()); EXPECT_EQ(string("\000\001\a\b\f\n\r\t\v\\\'\"", 12), message.repeated_string(0)); } TEST_F(TextFormatTest, PrintFieldsInIndexOrder) { protobuf_unittest::TestFieldOrderings message; // Fields are listed in index order instead of field number. message.set_my_string("Test String"); // Field number 11 message.set_my_int(12345); // Field number 1 message.set_my_float(0.999); // Field number 101 TextFormat::Printer printer; string text; // By default, print in field number order. printer.PrintToString(message, &text); EXPECT_EQ("my_int: 12345\nmy_string: \"Test String\"\nmy_float: 0.999\n", text); // Print in index order. printer.SetPrintMessageFieldsInIndexOrder(true); printer.PrintToString(message, &text); EXPECT_EQ("my_string: \"Test String\"\nmy_int: 12345\nmy_float: 0.999\n", text); } class TextFormatParserTest : public testing::Test { protected: void ExpectFailure(const string& input, const string& message, int line, int col) { google::protobuf::scoped_ptr proto(new unittest::TestAllTypes); ExpectFailure(input, message, line, col, proto.get()); } void ExpectFailure(const string& input, const string& message, int line, int col, Message* proto) { ExpectMessage(input, message, line, col, proto, false); } void ExpectMessage(const string& input, const string& message, int line, int col, Message* proto, bool expected_result) { TextFormat::Parser parser; MockErrorCollector error_collector; parser.RecordErrorsTo(&error_collector); EXPECT_EQ(expected_result, parser.ParseFromString(input, proto)) << input << " -> " << proto->DebugString(); EXPECT_EQ(SimpleItoa(line) + ":" + SimpleItoa(col) + ": " + message + "\n", error_collector.text_); } void ExpectSuccessAndTree(const string& input, Message* proto, TextFormat::ParseInfoTree* info_tree) { TextFormat::Parser parser; MockErrorCollector error_collector; parser.RecordErrorsTo(&error_collector); parser.WriteLocationsTo(info_tree); EXPECT_TRUE(parser.ParseFromString(input, proto)); } void ExpectLocation(TextFormat::ParseInfoTree* tree, const Descriptor* d, const string& field_name, int index, int line, int column) { TextFormat::ParseLocation location = tree->GetLocation( d->FindFieldByName(field_name), index); EXPECT_EQ(line, location.line); EXPECT_EQ(column, location.column); } // An error collector which simply concatenates all its errors into a big // block of text which can be checked. class MockErrorCollector : public io::ErrorCollector { public: MockErrorCollector() {} ~MockErrorCollector() {} string text_; // implements ErrorCollector ------------------------------------- void AddError(int line, int column, const string& message) { strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", line + 1, column + 1, message); } void AddWarning(int line, int column, const string& message) { AddError(line, column, "WARNING:" + message); } }; }; TEST_F(TextFormatParserTest, ParseInfoTreeBuilding) { google::protobuf::scoped_ptr message(new unittest::TestAllTypes); const Descriptor* d = message->GetDescriptor(); string stringData = "optional_int32: 1\n" "optional_int64: 2\n" " optional_double: 2.4\n" "repeated_int32: 5\n" "repeated_int32: 10\n" "optional_nested_message <\n" " bb: 78\n" ">\n" "repeated_nested_message <\n" " bb: 79\n" ">\n" "repeated_nested_message <\n" " bb: 80\n" ">"; TextFormat::ParseInfoTree tree; ExpectSuccessAndTree(stringData, message.get(), &tree); // Verify that the tree has the correct positions. ExpectLocation(&tree, d, "optional_int32", -1, 0, 0); ExpectLocation(&tree, d, "optional_int64", -1, 1, 0); ExpectLocation(&tree, d, "optional_double", -1, 2, 2); ExpectLocation(&tree, d, "repeated_int32", 0, 3, 0); ExpectLocation(&tree, d, "repeated_int32", 1, 4, 0); ExpectLocation(&tree, d, "optional_nested_message", -1, 5, 0); ExpectLocation(&tree, d, "repeated_nested_message", 0, 8, 0); ExpectLocation(&tree, d, "repeated_nested_message", 1, 11, 0); // Check for fields not set. For an invalid field, the location returned // should be -1, -1. ExpectLocation(&tree, d, "repeated_int64", 0, -1, -1); ExpectLocation(&tree, d, "repeated_int32", 6, -1, -1); ExpectLocation(&tree, d, "some_unknown_field", -1, -1, -1); // Verify inside the nested message. const FieldDescriptor* nested_field = d->FindFieldByName("optional_nested_message"); TextFormat::ParseInfoTree* nested_tree = tree.GetTreeForNested(nested_field, -1); ExpectLocation(nested_tree, nested_field->message_type(), "bb", -1, 6, 2); // Verify inside another nested message. nested_field = d->FindFieldByName("repeated_nested_message"); nested_tree = tree.GetTreeForNested(nested_field, 0); ExpectLocation(nested_tree, nested_field->message_type(), "bb", -1, 9, 2); nested_tree = tree.GetTreeForNested(nested_field, 1); ExpectLocation(nested_tree, nested_field->message_type(), "bb", -1, 12, 2); // Verify a NULL tree for an unknown nested field. TextFormat::ParseInfoTree* unknown_nested_tree = tree.GetTreeForNested(nested_field, 2); EXPECT_EQ(NULL, unknown_nested_tree); } TEST_F(TextFormatParserTest, ParseFieldValueFromString) { google::protobuf::scoped_ptr message(new unittest::TestAllTypes); const Descriptor* d = message->GetDescriptor(); #define EXPECT_FIELD(name, value, valuestring) \ EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \ valuestring, d->FindFieldByName("optional_" #name), message.get())); \ EXPECT_EQ(value, message->optional_##name()); \ EXPECT_TRUE(message->has_optional_##name()); #define EXPECT_BOOL_FIELD(name, value, valuestring) \ EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \ valuestring, d->FindFieldByName("optional_" #name), message.get())); \ EXPECT_TRUE(message->optional_##name() == value); \ EXPECT_TRUE(message->has_optional_##name()); #define EXPECT_FLOAT_FIELD(name, value, valuestring) \ EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \ valuestring, d->FindFieldByName("optional_" #name), message.get())); \ EXPECT_FLOAT_EQ(value, message->optional_##name()); \ EXPECT_TRUE(message->has_optional_##name()); #define EXPECT_DOUBLE_FIELD(name, value, valuestring) \ EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \ valuestring, d->FindFieldByName("optional_" #name), message.get())); \ EXPECT_DOUBLE_EQ(value, message->optional_##name()); \ EXPECT_TRUE(message->has_optional_##name()); #define EXPECT_INVALID(name, valuestring) \ EXPECT_FALSE(TextFormat::ParseFieldValueFromString( \ valuestring, d->FindFieldByName("optional_" #name), message.get())); // int32 EXPECT_FIELD(int32, 1, "1"); EXPECT_FIELD(int32, -1, "-1"); EXPECT_FIELD(int32, 0x1234, "0x1234"); EXPECT_INVALID(int32, "a"); EXPECT_INVALID(int32, "999999999999999999999999999999999999"); EXPECT_INVALID(int32, "1,2"); // int64 EXPECT_FIELD(int64, 1, "1"); EXPECT_FIELD(int64, -1, "-1"); EXPECT_FIELD(int64, 0x1234567812345678LL, "0x1234567812345678"); EXPECT_INVALID(int64, "a"); EXPECT_INVALID(int64, "999999999999999999999999999999999999"); EXPECT_INVALID(int64, "1,2"); // uint64 EXPECT_FIELD(uint64, 1, "1"); EXPECT_FIELD(uint64, 0xf234567812345678ULL, "0xf234567812345678"); EXPECT_INVALID(uint64, "-1"); EXPECT_INVALID(uint64, "a"); EXPECT_INVALID(uint64, "999999999999999999999999999999999999"); EXPECT_INVALID(uint64, "1,2"); // fixed32 EXPECT_FIELD(fixed32, 1, "1"); EXPECT_FIELD(fixed32, 0x12345678, "0x12345678"); EXPECT_INVALID(fixed32, "-1"); EXPECT_INVALID(fixed32, "a"); EXPECT_INVALID(fixed32, "999999999999999999999999999999999999"); EXPECT_INVALID(fixed32, "1,2"); // fixed64 EXPECT_FIELD(fixed64, 1, "1"); EXPECT_FIELD(fixed64, 0x1234567812345678ULL, "0x1234567812345678"); EXPECT_INVALID(fixed64, "-1"); EXPECT_INVALID(fixed64, "a"); EXPECT_INVALID(fixed64, "999999999999999999999999999999999999"); EXPECT_INVALID(fixed64, "1,2"); // bool EXPECT_BOOL_FIELD(bool, true, "true"); EXPECT_BOOL_FIELD(bool, false, "false"); EXPECT_BOOL_FIELD(bool, true, "1"); EXPECT_BOOL_FIELD(bool, true, "t"); EXPECT_BOOL_FIELD(bool, false, "0"); EXPECT_BOOL_FIELD(bool, false, "f"); EXPECT_FIELD(bool, true, "True"); EXPECT_FIELD(bool, false, "False"); EXPECT_INVALID(bool, "tRue"); EXPECT_INVALID(bool, "faLse"); EXPECT_INVALID(bool, "2"); EXPECT_INVALID(bool, "-0"); EXPECT_INVALID(bool, "on"); EXPECT_INVALID(bool, "a"); // float EXPECT_FIELD(float, 1, "1"); EXPECT_FLOAT_FIELD(float, 1.5, "1.5"); EXPECT_FLOAT_FIELD(float, 1.5e3, "1.5e3"); EXPECT_FLOAT_FIELD(float, -4.55, "-4.55"); EXPECT_INVALID(float, "a"); EXPECT_INVALID(float, "1,2"); // double EXPECT_FIELD(double, 1, "1"); EXPECT_FIELD(double, -1, "-1"); EXPECT_DOUBLE_FIELD(double, 2.3, "2.3"); EXPECT_DOUBLE_FIELD(double, 3e5, "3e5"); EXPECT_INVALID(double, "a"); EXPECT_INVALID(double, "1,2"); // Rejects hex and oct numbers for a double field. EXPECT_INVALID(double, "0xf"); EXPECT_INVALID(double, "012"); // string EXPECT_FIELD(string, "hello", "\"hello\""); EXPECT_FIELD(string, "-1.87", "'-1.87'"); EXPECT_INVALID(string, "hello"); // without quote for value // enum EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAR, "BAR"); EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAZ, SimpleItoa(unittest::TestAllTypes::BAZ)); EXPECT_INVALID(nested_enum, "FOOBAR"); // message EXPECT_TRUE(TextFormat::ParseFieldValueFromString( "", d->FindFieldByName("optional_nested_message"), message.get())); EXPECT_EQ(12, message->optional_nested_message().bb()); \ EXPECT_TRUE(message->has_optional_nested_message()); EXPECT_INVALID(nested_message, "any"); #undef EXPECT_FIELD #undef EXPECT_BOOL_FIELD #undef EXPECT_FLOAT_FIELD #undef EXPECT_DOUBLE_FIELD #undef EXPECT_INVALID } TEST_F(TextFormatParserTest, InvalidToken) { ExpectFailure("optional_bool: true\n-5\n", "Expected identifier, got: -", 2, 1); ExpectFailure("optional_bool: true!\n", "Expected identifier, got: !", 1, 20); ExpectFailure("\"some string\"", "Expected identifier, got: \"some string\"", 1, 1); } TEST_F(TextFormatParserTest, InvalidFieldName) { ExpectFailure( "invalid_field: somevalue\n", "Message type \"protobuf_unittest.TestAllTypes\" has no field named " "\"invalid_field\".", 1, 14); } TEST_F(TextFormatParserTest, InvalidCapitalization) { // We require that group names be exactly as they appear in the .proto. ExpectFailure( "optionalgroup {\na: 15\n}\n", "Message type \"protobuf_unittest.TestAllTypes\" has no field named " "\"optionalgroup\".", 1, 15); ExpectFailure( "OPTIONALgroup {\na: 15\n}\n", "Message type \"protobuf_unittest.TestAllTypes\" has no field named " "\"OPTIONALgroup\".", 1, 15); ExpectFailure( "Optional_Double: 10.0\n", "Message type \"protobuf_unittest.TestAllTypes\" has no field named " "\"Optional_Double\".", 1, 16); } TEST_F(TextFormatParserTest, AllowIgnoreCapitalizationError) { TextFormat::Parser parser; protobuf_unittest::TestAllTypes proto; // These fields have a mismatching case. EXPECT_FALSE(parser.ParseFromString("Optional_Double: 10.0", &proto)); EXPECT_FALSE(parser.ParseFromString("oPtIoNaLgRoUp { a: 15 }", &proto)); // ... but are parsed correctly if we match case insensitive. parser.AllowCaseInsensitiveField(true); EXPECT_TRUE(parser.ParseFromString("Optional_Double: 10.0", &proto)); EXPECT_EQ(10.0, proto.optional_double()); EXPECT_TRUE(parser.ParseFromString("oPtIoNaLgRoUp { a: 15 }", &proto)); EXPECT_EQ(15, proto.optionalgroup().a()); } TEST_F(TextFormatParserTest, InvalidFieldValues) { // Invalid values for a double/float field. ExpectFailure("optional_double: \"hello\"\n", "Expected double, got: \"hello\"", 1, 18); ExpectFailure("optional_double: true\n", "Expected double, got: true", 1, 18); ExpectFailure("optional_double: !\n", "Expected double, got: !", 1, 18); ExpectFailure("optional_double {\n \n}\n", "Expected \":\", found \"{\".", 1, 17); // Invalid values for a signed integer field. ExpectFailure("optional_int32: \"hello\"\n", "Expected integer, got: \"hello\"", 1, 17); ExpectFailure("optional_int32: true\n", "Expected integer, got: true", 1, 17); ExpectFailure("optional_int32: 4.5\n", "Expected integer, got: 4.5", 1, 17); ExpectFailure("optional_int32: !\n", "Expected integer, got: !", 1, 17); ExpectFailure("optional_int32 {\n \n}\n", "Expected \":\", found \"{\".", 1, 16); ExpectFailure("optional_int32: 0x80000000\n", "Integer out of range (0x80000000)", 1, 17); ExpectFailure("optional_int64: 0x8000000000000000\n", "Integer out of range (0x8000000000000000)", 1, 17); ExpectFailure("optional_int32: -0x80000001\n", "Integer out of range (0x80000001)", 1, 18); ExpectFailure("optional_int64: -0x8000000000000001\n", "Integer out of range (0x8000000000000001)", 1, 18); // Invalid values for an unsigned integer field. ExpectFailure("optional_uint64: \"hello\"\n", "Expected integer, got: \"hello\"", 1, 18); ExpectFailure("optional_uint64: true\n", "Expected integer, got: true", 1, 18); ExpectFailure("optional_uint64: 4.5\n", "Expected integer, got: 4.5", 1, 18); ExpectFailure("optional_uint64: -5\n", "Expected integer, got: -", 1, 18); ExpectFailure("optional_uint64: !\n", "Expected integer, got: !", 1, 18); ExpectFailure("optional_uint64 {\n \n}\n", "Expected \":\", found \"{\".", 1, 17); ExpectFailure("optional_uint32: 0x100000000\n", "Integer out of range (0x100000000)", 1, 18); ExpectFailure("optional_uint64: 0x10000000000000000\n", "Integer out of range (0x10000000000000000)", 1, 18); // Invalid values for a boolean field. ExpectFailure("optional_bool: \"hello\"\n", "Expected identifier, got: \"hello\"", 1, 16); ExpectFailure("optional_bool: 5\n", "Integer out of range (5)", 1, 16); ExpectFailure("optional_bool: -7.5\n", "Expected identifier, got: -", 1, 16); ExpectFailure("optional_bool: !\n", "Expected identifier, got: !", 1, 16); ExpectFailure( "optional_bool: meh\n", "Invalid value for boolean field \"optional_bool\". Value: \"meh\".", 2, 1); ExpectFailure("optional_bool {\n \n}\n", "Expected \":\", found \"{\".", 1, 15); // Invalid values for a string field. ExpectFailure("optional_string: true\n", "Expected string, got: true", 1, 18); ExpectFailure("optional_string: 5\n", "Expected string, got: 5", 1, 18); ExpectFailure("optional_string: -7.5\n", "Expected string, got: -", 1, 18); ExpectFailure("optional_string: !\n", "Expected string, got: !", 1, 18); ExpectFailure("optional_string {\n \n}\n", "Expected \":\", found \"{\".", 1, 17); // Invalid values for an enumeration field. ExpectFailure("optional_nested_enum: \"hello\"\n", "Expected integer or identifier, got: \"hello\"", 1, 23); // Valid token, but enum value is not defined. ExpectFailure("optional_nested_enum: 5\n", "Unknown enumeration value of \"5\" for field " "\"optional_nested_enum\".", 2, 1); // We consume the negative sign, so the error position starts one character // later. ExpectFailure("optional_nested_enum: -7.5\n", "Expected integer, got: 7.5", 1, 24); ExpectFailure("optional_nested_enum: !\n", "Expected integer or identifier, got: !", 1, 23); ExpectFailure( "optional_nested_enum: grah\n", "Unknown enumeration value of \"grah\" for field " "\"optional_nested_enum\".", 2, 1); ExpectFailure( "optional_nested_enum {\n \n}\n", "Expected \":\", found \"{\".", 1, 22); } TEST_F(TextFormatParserTest, MessageDelimiters) { // Non-matching delimiters. ExpectFailure("OptionalGroup <\n \n}\n", "Expected \">\", found \"}\".", 3, 1); // Invalid delimiters. ExpectFailure("OptionalGroup [\n \n]\n", "Expected \"{\", found \"[\".", 1, 15); // Unending message. ExpectFailure("optional_nested_message {\n \nbb: 118\n", "Expected identifier, got: ", 4, 1); } TEST_F(TextFormatParserTest, UnknownExtension) { // Non-matching delimiters. ExpectFailure("[blahblah]: 123", "Extension \"blahblah\" is not defined or is not an " "extension of \"protobuf_unittest.TestAllTypes\".", 1, 11); } TEST_F(TextFormatParserTest, MissingRequired) { unittest::TestRequired message; ExpectFailure("a: 1", "Message missing required fields: b, c", 0, 1, &message); } TEST_F(TextFormatParserTest, ParseDuplicateRequired) { unittest::TestRequired message; ExpectFailure("a: 1 b: 2 c: 3 a: 1", "Non-repeated field \"a\" is specified multiple times.", 1, 17, &message); } TEST_F(TextFormatParserTest, ParseDuplicateOptional) { unittest::ForeignMessage message; ExpectFailure("c: 1 c: 2", "Non-repeated field \"c\" is specified multiple times.", 1, 7, &message); } TEST_F(TextFormatParserTest, MergeDuplicateRequired) { unittest::TestRequired message; TextFormat::Parser parser; EXPECT_TRUE(parser.MergeFromString("a: 1 b: 2 c: 3 a: 4", &message)); EXPECT_EQ(4, message.a()); } TEST_F(TextFormatParserTest, MergeDuplicateOptional) { unittest::ForeignMessage message; TextFormat::Parser parser; EXPECT_TRUE(parser.MergeFromString("c: 1 c: 2", &message)); EXPECT_EQ(2, message.c()); } TEST_F(TextFormatParserTest, ExplicitDelimiters) { unittest::TestRequired message; EXPECT_TRUE(TextFormat::ParseFromString("a:1,b:2;c:3", &message)); EXPECT_EQ(1, message.a()); EXPECT_EQ(2, message.b()); EXPECT_EQ(3, message.c()); } TEST_F(TextFormatParserTest, PrintErrorsToStderr) { std::vector errors; { ScopedMemoryLog log; unittest::TestAllTypes proto; EXPECT_FALSE(TextFormat::ParseFromString("no_such_field: 1", &proto)); errors = log.GetMessages(ERROR); } ASSERT_EQ(1, errors.size()); EXPECT_EQ("Error parsing text-format protobuf_unittest.TestAllTypes: " "1:14: Message type \"protobuf_unittest.TestAllTypes\" has no field " "named \"no_such_field\".", errors[0]); } TEST_F(TextFormatParserTest, FailsOnTokenizationError) { std::vector errors; { ScopedMemoryLog log; unittest::TestAllTypes proto; EXPECT_FALSE(TextFormat::ParseFromString("\020", &proto)); errors = log.GetMessages(ERROR); } ASSERT_EQ(1, errors.size()); EXPECT_EQ("Error parsing text-format protobuf_unittest.TestAllTypes: " "1:1: Invalid control characters encountered in text.", errors[0]); } TEST_F(TextFormatParserTest, ParseDeprecatedField) { unittest::TestDeprecatedFields message; ExpectMessage("deprecated_int32: 42", "WARNING:text format contains deprecated field " "\"deprecated_int32\"", 1, 21, &message, true); } class TextFormatMessageSetTest : public testing::Test { protected: static const char proto_debug_string_[]; }; const char TextFormatMessageSetTest::proto_debug_string_[] = "message_set {\n" " [protobuf_unittest.TestMessageSetExtension1] {\n" " i: 23\n" " }\n" " [protobuf_unittest.TestMessageSetExtension2] {\n" " str: \"foo\"\n" " }\n" "}\n"; TEST_F(TextFormatMessageSetTest, Serialize) { protobuf_unittest::TestMessageSetContainer proto; protobuf_unittest::TestMessageSetExtension1* item_a = proto.mutable_message_set()->MutableExtension( protobuf_unittest::TestMessageSetExtension1::message_set_extension); item_a->set_i(23); protobuf_unittest::TestMessageSetExtension2* item_b = proto.mutable_message_set()->MutableExtension( protobuf_unittest::TestMessageSetExtension2::message_set_extension); item_b->set_str("foo"); EXPECT_EQ(proto_debug_string_, proto.DebugString()); } TEST_F(TextFormatMessageSetTest, Deserialize) { protobuf_unittest::TestMessageSetContainer proto; ASSERT_TRUE(TextFormat::ParseFromString(proto_debug_string_, &proto)); EXPECT_EQ(23, proto.message_set().GetExtension( protobuf_unittest::TestMessageSetExtension1::message_set_extension).i()); EXPECT_EQ("foo", proto.message_set().GetExtension( protobuf_unittest::TestMessageSetExtension2::message_set_extension).str()); // Ensure that these are the only entries present. std::vector descriptors; proto.message_set().GetReflection()->ListFields( proto.message_set(), &descriptors); EXPECT_EQ(2, descriptors.size()); } } // namespace text_format_unittest } // namespace protobuf } // namespace google python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/timestamp.pb.cc000066400000000000000000000362371334102242000302160ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/timestamp.proto #include #include #include #include #include #include #include #include #include #include #include // This is a temporary google only hack #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS #include "third_party/protobuf/version.h" #endif // @@protoc_insertion_point(includes) namespace google { namespace protobuf { class TimestampDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Timestamp_default_instance_; } // namespace protobuf } // namespace google namespace protobuf_google_2fprotobuf_2ftimestamp_2eproto { void InitDefaultsTimestampImpl() { GOOGLE_PROTOBUF_VERIFY_VERSION; #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS ::google::protobuf::internal::InitProtobufDefaultsForceUnique(); #else ::google::protobuf::internal::InitProtobufDefaults(); #endif // GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS { void* ptr = &::google::protobuf::_Timestamp_default_instance_; new (ptr) ::google::protobuf::Timestamp(); ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); } ::google::protobuf::Timestamp::InitAsDefaultInstance(); } void InitDefaultsTimestamp() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &InitDefaultsTimestampImpl); } ::google::protobuf::Metadata file_level_metadata[1]; const ::google::protobuf::uint32 TableStruct::offsets[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { ~0u, // no _has_bits_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Timestamp, _internal_metadata_), ~0u, // no _extensions_ ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Timestamp, seconds_), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(::google::protobuf::Timestamp, nanos_), }; static const ::google::protobuf::internal::MigrationSchema schemas[] GOOGLE_PROTOBUF_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { { 0, -1, sizeof(::google::protobuf::Timestamp)}, }; static ::google::protobuf::Message const * const file_default_instances[] = { reinterpret_cast(&::google::protobuf::_Timestamp_default_instance_), }; void protobuf_AssignDescriptors() { AddDescriptors(); ::google::protobuf::MessageFactory* factory = NULL; AssignDescriptors( "google/protobuf/timestamp.proto", schemas, file_default_instances, TableStruct::offsets, factory, file_level_metadata, NULL, NULL); } void protobuf_AssignDescriptorsOnce() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &protobuf_AssignDescriptors); } void protobuf_RegisterTypes(const ::std::string&) GOOGLE_PROTOBUF_ATTRIBUTE_COLD; void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); ::google::protobuf::internal::RegisterAllTypes(file_level_metadata, 1); } void AddDescriptorsImpl() { InitDefaults(); static const char descriptor[] GOOGLE_PROTOBUF_ATTRIBUTE_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~\n\023com.google.protobufB\016" "TimestampProtoP\001Z+github.com/golang/prot" "obuf/ptypes/timestamp\370\001\001\242\002\003GPB\252\002\036Google." "Protobuf.WellKnownTypesb\006proto3" }; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( descriptor, 231); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "google/protobuf/timestamp.proto", &protobuf_RegisterTypes); } void AddDescriptors() { static GOOGLE_PROTOBUF_DECLARE_ONCE(once); ::google::protobuf::GoogleOnceInit(&once, &AddDescriptorsImpl); } // Force AddDescriptors() to be called at dynamic initialization time. struct StaticDescriptorInitializer { StaticDescriptorInitializer() { AddDescriptors(); } } static_descriptor_initializer; } // namespace protobuf_google_2fprotobuf_2ftimestamp_2eproto namespace google { namespace protobuf { // =================================================================== void Timestamp::InitAsDefaultInstance() { } #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int Timestamp::kSecondsFieldNumber; const int Timestamp::kNanosFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 Timestamp::Timestamp() : ::google::protobuf::Message(), _internal_metadata_(NULL) { if (GOOGLE_PREDICT_TRUE(this != internal_default_instance())) { ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::InitDefaultsTimestamp(); } SharedCtor(); // @@protoc_insertion_point(constructor:google.protobuf.Timestamp) } Timestamp::Timestamp(::google::protobuf::Arena* arena) : ::google::protobuf::Message(), _internal_metadata_(arena) { ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::InitDefaultsTimestamp(); SharedCtor(); RegisterArenaDtor(arena); // @@protoc_insertion_point(arena_constructor:google.protobuf.Timestamp) } Timestamp::Timestamp(const Timestamp& from) : ::google::protobuf::Message(), _internal_metadata_(NULL), _cached_size_(0) { _internal_metadata_.MergeFrom(from._internal_metadata_); ::memcpy(&seconds_, &from.seconds_, static_cast(reinterpret_cast(&nanos_) - reinterpret_cast(&seconds_)) + sizeof(nanos_)); // @@protoc_insertion_point(copy_constructor:google.protobuf.Timestamp) } void Timestamp::SharedCtor() { ::memset(&seconds_, 0, static_cast( reinterpret_cast(&nanos_) - reinterpret_cast(&seconds_)) + sizeof(nanos_)); _cached_size_ = 0; } Timestamp::~Timestamp() { // @@protoc_insertion_point(destructor:google.protobuf.Timestamp) SharedDtor(); } void Timestamp::SharedDtor() { GOOGLE_DCHECK(GetArenaNoVirtual() == NULL); } void Timestamp::ArenaDtor(void* object) { Timestamp* _this = reinterpret_cast< Timestamp* >(object); (void)_this; } void Timestamp::RegisterArenaDtor(::google::protobuf::Arena* arena) { } void Timestamp::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* Timestamp::descriptor() { ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::file_level_metadata[kIndexInFileMessages].descriptor; } const Timestamp& Timestamp::default_instance() { ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::InitDefaultsTimestamp(); return *internal_default_instance(); } Timestamp* Timestamp::New(::google::protobuf::Arena* arena) const { return ::google::protobuf::Arena::CreateMessage(arena); } void Timestamp::Clear() { // @@protoc_insertion_point(message_clear_start:google.protobuf.Timestamp) ::google::protobuf::uint32 cached_has_bits = 0; // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; ::memset(&seconds_, 0, static_cast( reinterpret_cast(&nanos_) - reinterpret_cast(&seconds_)) + sizeof(nanos_)); _internal_metadata_.Clear(); } bool Timestamp::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure ::google::protobuf::uint32 tag; // @@protoc_insertion_point(parse_start:google.protobuf.Timestamp) for (;;) { ::std::pair< ::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); tag = p.first; if (!p.second) goto handle_unusual; switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // int64 seconds = 1; case 1: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(8u /* 8 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( input, &seconds_))); } else { goto handle_unusual; } break; } // int32 nanos = 2; case 2: { if (static_cast< ::google::protobuf::uint8>(tag) == static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( input, &nanos_))); } else { goto handle_unusual; } break; } default: { handle_unusual: if (tag == 0) { goto success; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, _internal_metadata_.mutable_unknown_fields())); break; } } } success: // @@protoc_insertion_point(parse_success:google.protobuf.Timestamp) return true; failure: // @@protoc_insertion_point(parse_failure:google.protobuf.Timestamp) return false; #undef DO_ } void Timestamp::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // @@protoc_insertion_point(serialize_start:google.protobuf.Timestamp) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // int64 seconds = 1; if (this->seconds() != 0) { ::google::protobuf::internal::WireFormatLite::WriteInt64(1, this->seconds(), output); } // int32 nanos = 2; if (this->nanos() != 0) { ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->nanos(), output); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), output); } // @@protoc_insertion_point(serialize_end:google.protobuf.Timestamp) } ::google::protobuf::uint8* Timestamp::InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const { (void)deterministic; // Unused // @@protoc_insertion_point(serialize_to_array_start:google.protobuf.Timestamp) ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; // int64 seconds = 1; if (this->seconds() != 0) { target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(1, this->seconds(), target); } // int32 nanos = 2; if (this->nanos() != 0) { target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->nanos(), target); } if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()), target); } // @@protoc_insertion_point(serialize_to_array_end:google.protobuf.Timestamp) return target; } size_t Timestamp::ByteSizeLong() const { // @@protoc_insertion_point(message_byte_size_start:google.protobuf.Timestamp) size_t total_size = 0; if ((_internal_metadata_.have_unknown_fields() && ::google::protobuf::internal::GetProto3PreserveUnknownsDefault())) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance())); } // int64 seconds = 1; if (this->seconds() != 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int64Size( this->seconds()); } // int32 nanos = 2; if (this->nanos() != 0) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::Int32Size( this->nanos()); } int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = cached_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void Timestamp::MergeFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_merge_from_start:google.protobuf.Timestamp) GOOGLE_DCHECK_NE(&from, this); const Timestamp* source = ::google::protobuf::internal::DynamicCastToGenerated( &from); if (source == NULL) { // @@protoc_insertion_point(generalized_merge_from_cast_fail:google.protobuf.Timestamp) ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { // @@protoc_insertion_point(generalized_merge_from_cast_success:google.protobuf.Timestamp) MergeFrom(*source); } } void Timestamp::MergeFrom(const Timestamp& from) { // @@protoc_insertion_point(class_specific_merge_from_start:google.protobuf.Timestamp) GOOGLE_DCHECK_NE(&from, this); _internal_metadata_.MergeFrom(from._internal_metadata_); ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; if (from.seconds() != 0) { set_seconds(from.seconds()); } if (from.nanos() != 0) { set_nanos(from.nanos()); } } void Timestamp::CopyFrom(const ::google::protobuf::Message& from) { // @@protoc_insertion_point(generalized_copy_from_start:google.protobuf.Timestamp) if (&from == this) return; Clear(); MergeFrom(from); } void Timestamp::CopyFrom(const Timestamp& from) { // @@protoc_insertion_point(class_specific_copy_from_start:google.protobuf.Timestamp) if (&from == this) return; Clear(); MergeFrom(from); } bool Timestamp::IsInitialized() const { return true; } void Timestamp::Swap(Timestamp* other) { if (other == this) return; if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) { InternalSwap(other); } else { Timestamp* temp = New(GetArenaNoVirtual()); temp->MergeFrom(*other); other->CopyFrom(*this); InternalSwap(temp); if (GetArenaNoVirtual() == NULL) { delete temp; } } } void Timestamp::UnsafeArenaSwap(Timestamp* other) { if (other == this) return; GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual()); InternalSwap(other); } void Timestamp::InternalSwap(Timestamp* other) { using std::swap; swap(seconds_, other->seconds_); swap(nanos_, other->nanos_); _internal_metadata_.Swap(&other->_internal_metadata_); swap(_cached_size_, other->_cached_size_); } ::google::protobuf::Metadata Timestamp::GetMetadata() const { protobuf_google_2fprotobuf_2ftimestamp_2eproto::protobuf_AssignDescriptorsOnce(); return ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::file_level_metadata[kIndexInFileMessages]; } // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/timestamp.pb.h000066400000000000000000000175451334102242000300610ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/timestamp.proto #ifndef PROTOBUF_google_2fprotobuf_2ftimestamp_2eproto__INCLUDED #define PROTOBUF_google_2fprotobuf_2ftimestamp_2eproto__INCLUDED #include #include #if GOOGLE_PROTOBUF_VERSION < 3005000 #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 3005001 < GOOGLE_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 #include #include #include #include #include #include #include #include // IWYU pragma: export #include // IWYU pragma: export #include // @@protoc_insertion_point(includes) namespace protobuf_google_2fprotobuf_2ftimestamp_2eproto { // Internal implementation detail -- do not use these members. struct LIBPROTOBUF_EXPORT TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; static const ::google::protobuf::internal::ParseTable schema[1]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; }; void LIBPROTOBUF_EXPORT AddDescriptors(); void LIBPROTOBUF_EXPORT InitDefaultsTimestampImpl(); void LIBPROTOBUF_EXPORT InitDefaultsTimestamp(); inline void LIBPROTOBUF_EXPORT InitDefaults() { InitDefaultsTimestamp(); } } // namespace protobuf_google_2fprotobuf_2ftimestamp_2eproto namespace google { namespace protobuf { class Timestamp; class TimestampDefaultTypeInternal; LIBPROTOBUF_EXPORT extern TimestampDefaultTypeInternal _Timestamp_default_instance_; } // namespace protobuf } // namespace google namespace google { namespace protobuf { // =================================================================== class LIBPROTOBUF_EXPORT Timestamp : public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:google.protobuf.Timestamp) */ { public: Timestamp(); virtual ~Timestamp(); Timestamp(const Timestamp& from); inline Timestamp& operator=(const Timestamp& from) { CopyFrom(from); return *this; } #if LANG_CXX11 Timestamp(Timestamp&& from) noexcept : Timestamp() { *this = ::std::move(from); } inline Timestamp& operator=(Timestamp&& from) noexcept { if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { if (this != &from) InternalSwap(&from); } else { CopyFrom(from); } return *this; } #endif inline ::google::protobuf::Arena* GetArena() const PROTOBUF_FINAL { return GetArenaNoVirtual(); } inline void* GetMaybeArenaPointer() const PROTOBUF_FINAL { return MaybeArenaPtr(); } static const ::google::protobuf::Descriptor* descriptor(); static const Timestamp& default_instance(); static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY static inline const Timestamp* internal_default_instance() { return reinterpret_cast( &_Timestamp_default_instance_); } static PROTOBUF_CONSTEXPR int const kIndexInFileMessages = 0; void UnsafeArenaSwap(Timestamp* other); void Swap(Timestamp* other); friend void swap(Timestamp& a, Timestamp& b) { a.Swap(&b); } // implements Message ---------------------------------------------- inline Timestamp* New() const PROTOBUF_FINAL { return New(NULL); } Timestamp* New(::google::protobuf::Arena* arena) const PROTOBUF_FINAL; void CopyFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void MergeFrom(const ::google::protobuf::Message& from) PROTOBUF_FINAL; void CopyFrom(const Timestamp& from); void MergeFrom(const Timestamp& from); void Clear() PROTOBUF_FINAL; bool IsInitialized() const PROTOBUF_FINAL; size_t ByteSizeLong() const PROTOBUF_FINAL; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) PROTOBUF_FINAL; void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const PROTOBUF_FINAL; ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray( bool deterministic, ::google::protobuf::uint8* target) const PROTOBUF_FINAL; int GetCachedSize() const PROTOBUF_FINAL { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const PROTOBUF_FINAL; void InternalSwap(Timestamp* other); protected: explicit Timestamp(::google::protobuf::Arena* arena); private: static void ArenaDtor(void* object); inline void RegisterArenaDtor(::google::protobuf::Arena* arena); private: inline ::google::protobuf::Arena* GetArenaNoVirtual() const { return _internal_metadata_.arena(); } inline void* MaybeArenaPtr() const { return _internal_metadata_.raw_arena_ptr(); } public: ::google::protobuf::Metadata GetMetadata() const PROTOBUF_FINAL; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // int64 seconds = 1; void clear_seconds(); static const int kSecondsFieldNumber = 1; ::google::protobuf::int64 seconds() const; void set_seconds(::google::protobuf::int64 value); // int32 nanos = 2; void clear_nanos(); static const int kNanosFieldNumber = 2; ::google::protobuf::int32 nanos() const; void set_nanos(::google::protobuf::int32 value); // @@protoc_insertion_point(class_scope:google.protobuf.Timestamp) private: ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_; template friend class ::google::protobuf::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; ::google::protobuf::int64 seconds_; ::google::protobuf::int32 nanos_; mutable int _cached_size_; friend struct ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::TableStruct; friend void ::protobuf_google_2fprotobuf_2ftimestamp_2eproto::InitDefaultsTimestampImpl(); }; // =================================================================== // =================================================================== #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" #endif // __GNUC__ // Timestamp // int64 seconds = 1; inline void Timestamp::clear_seconds() { seconds_ = GOOGLE_LONGLONG(0); } inline ::google::protobuf::int64 Timestamp::seconds() const { // @@protoc_insertion_point(field_get:google.protobuf.Timestamp.seconds) return seconds_; } inline void Timestamp::set_seconds(::google::protobuf::int64 value) { seconds_ = value; // @@protoc_insertion_point(field_set:google.protobuf.Timestamp.seconds) } // int32 nanos = 2; inline void Timestamp::clear_nanos() { nanos_ = 0; } inline ::google::protobuf::int32 Timestamp::nanos() const { // @@protoc_insertion_point(field_get:google.protobuf.Timestamp.nanos) return nanos_; } inline void Timestamp::set_nanos(::google::protobuf::int32 value) { nanos_ = value; // @@protoc_insertion_point(field_set:google.protobuf.Timestamp.nanos) } #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ // @@protoc_insertion_point(namespace_scope) } // namespace protobuf } // namespace google // @@protoc_insertion_point(global_scope) #endif // PROTOBUF_google_2fprotobuf_2ftimestamp_2eproto__INCLUDED python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/timestamp.proto000066400000000000000000000135271334102242000303710ustar00rootroot00000000000000// 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 google.protobuf; option csharp_namespace = "Google.Protobuf.WellKnownTypes"; option cc_enable_arenas = true; option go_package = "github.com/golang/protobuf/ptypes/timestamp"; option java_package = "com.google.protobuf"; option java_outer_classname = "TimestampProto"; option java_multiple_files = true; option objc_class_prefix = "GPB"; // A Timestamp represents a point in time independent of any time zone // or calendar, represented as seconds and fractions of seconds at // nanosecond resolution in UTC Epoch time. It is encoded using the // Proleptic Gregorian Calendar which extends the Gregorian calendar // backwards to year one. It is encoded assuming all minutes are 60 // seconds long, i.e. leap seconds are "smeared" so that no leap second // table is needed for interpretation. Range is from // 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. // By restricting to that range, we ensure that we can convert to // and from RFC 3339 date strings. // See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). // // # Examples // // Example 1: Compute Timestamp from POSIX `time()`. // // Timestamp timestamp; // timestamp.set_seconds(time(NULL)); // timestamp.set_nanos(0); // // Example 2: Compute Timestamp from POSIX `gettimeofday()`. // // struct timeval tv; // gettimeofday(&tv, NULL); // // Timestamp timestamp; // timestamp.set_seconds(tv.tv_sec); // timestamp.set_nanos(tv.tv_usec * 1000); // // Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. // // FILETIME ft; // GetSystemTimeAsFileTime(&ft); // UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; // // // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z // // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. // Timestamp timestamp; // timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); // timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); // // Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. // // long millis = System.currentTimeMillis(); // // Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) // .setNanos((int) ((millis % 1000) * 1000000)).build(); // // // Example 5: Compute Timestamp from current time in Python. // // timestamp = Timestamp() // timestamp.GetCurrentTime() // // # JSON Mapping // // In JSON format, the Timestamp type is encoded as a string in the // [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the // format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" // where {year} is always expressed using four digits while {month}, {day}, // {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional // seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), // are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone // is required, though only UTC (as indicated by "Z") is presently supported. // // For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past // 01:30 UTC on January 15, 2017. // // In JavaScript, one can convert a Date object to this format using the // standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] // method. In Python, a standard `datetime.datetime` object can be converted // to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) // with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one // can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( // http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--) // to obtain a formatter capable of generating timestamps in this format. // // message Timestamp { // Represents seconds of UTC time since Unix epoch // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to // 9999-12-31T23:59:59Z inclusive. int64 seconds = 1; // Non-negative fractions of a second at nanosecond resolution. Negative // second values with fractions must still have non-negative nanos values // that count forward in time. Must be from 0 to 999,999,999 // inclusive. int32 nanos = 2; } python-grpc-tools-1.14.1/third_party/protobuf/src/google/protobuf/type.pb.cc000066400000000000000000003147471334102242000272010ustar00rootroot00000000000000// Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/protobuf/type.proto #include #include #include #include #include #include #include #include #include #include #include // This is a temporary google only hack #ifdef GOOGLE_PROTOBUF_ENFORCE_UNIQUENESS #include "third_party/protobuf/version.h" #endif // @@protoc_insertion_point(includes) namespace google { namespace protobuf { class TypeDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Type_default_instance_; class FieldDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Field_default_instance_; class EnumDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _Enum_default_instance_; class EnumValueDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed _instance; } _EnumValue_default_instance_; class OptionDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed